Cách in báo cáo bằng Python

Đây là một tình huống mà tôi gặp phải trong công việc thực tế của mình và nó cũng là một trong những công việc thú vị nhất để tạo một báo cáo html đơn giản. Tôi đã viết một cái gì đó phức tạp và tôi được yêu cầu tạo một hàm hơi giống với chức năng in và để xác định xem một

Cách in báo cáo bằng Python
Hình ảnh 1 — Mẫu dữ liệu được tạo (hình ảnh của tác giả)

Và thế là xong — bây giờ bạn có một chức năng tạo dữ liệu bán hàng giả. Hãy xem cách hình dung nó tiếp theo

Trực quan hóa dữ liệu

Nhiệm vụ tiếp theo của bạn là tạo một hàm trực quan hóa tập dữ liệu đã tạo trước đó dưới dạng biểu đồ đường. Đây là loại trực quan hóa phù hợp nhất khi bạn đang xử lý dữ liệu chuỗi thời gian

Đây là chức năng hiển thị dữ liệu và gọi ví dụ

def plot(data: pd.DataFrame, filename: str) -> None:
    plt.figure(figsize=(12, 4))
    plt.grid(color='#F2F2F2', alpha=1, zorder=0)
    plt.plot(data['Date'], data['ItemsSold'], color='#087E8B', lw=3, zorder=5)
    plt.title(f'Sales 2020/{data["Date"].dt.month[0]}', fontsize=17)
    plt.xlabel('Period', fontsize=13)
    plt.xticks(fontsize=9)
    plt.ylabel('Number of items sold', fontsize=13)
    plt.yticks(fontsize=9)
    plt.savefig(filename, dpi=300, bbox_inches='tight', pad_inches=0)
    plt.close()
    return
              
# Test
december = generate_sales_data(month=12)
plot(data=december, filename='december.png')

Tóm lại — bạn đang tạo trực quan hóa dữ liệu, đặt tiêu đề, thử nghiệm với các phông chữ — không có gì đặc biệt. Hình ảnh trực quan không được hiển thị cho người dùng mà thay vào đó được lưu vào máy. Sau này bạn sẽ thấy điều này có thể mạnh mẽ như thế nào

Một cuộc gọi ví dụ sẽ lưu hình ảnh dữ liệu cho tháng 12 năm 2020. Đây là cách nó trông giống như

Cách in báo cáo bằng Python
Hình ảnh 2 — Bán hàng cho lô đất tháng 12/2020 (hình ảnh của tác giả)

Và đó là chức năng trực quan hóa của bạn. Chỉ còn một bước trước khi bạn có thể tạo tài liệu PDF, đó là lưu tất cả các hình ảnh trực quan và xác định cấu trúc trang báo cáo

Tạo cấu trúc trang PDF

Nhiệm vụ bây giờ là tạo một hàm thực hiện như sau

  • Tạo một thư mục cho các biểu đồ — xóa nếu nó tồn tại và tạo lại nó
  • Lưu trực quan hóa dữ liệu cho mỗi tháng trong năm 2020 ngoại trừ tháng 1 — để bạn có thể xem cách làm việc với số lượng phần tử khác nhau trên mỗi trang (vui lòng bao gồm cả tháng 1)
  • Tạo ma trận PDF từ trực quan hóa — ma trận 2 chiều trong đó một hàng đại diện cho một trang trong báo cáo PDF

Đây là đoạn mã cho chức năng

PLOT_DIR = 'plots'

def construct():
    # Delete folder if exists and create it again
    try:
        shutil.rmtree(PLOT_DIR)
        os.mkdir(PLOT_DIR)
    except FileNotFoundError:
        os.mkdir(PLOT_DIR)
        
    # Iterate over all months in 2020 except January
    for i in range(2, 13):
        # Save visualization
        plot(data=generate_sales_data(month=i), filename=f'{PLOT_DIR}/{i}.png')
        
    # Construct data shown in document
    counter = 0
    pages_data = []
    temp = []
    # Get all plots
    files = os.listdir(PLOT_DIR)
    # Sort them by month - a bit tricky because the file names are strings
    files = sorted(os.listdir(PLOT_DIR), key=lambda x: int(x.split('.')[0]))
    # Iterate over all created visualization
    for fname in files:
        # We want 3 per page
        if counter == 3:
            pages_data.append(temp)
            temp = []
            counter = 0

        temp.append(f'{PLOT_DIR}/{fname}')
        counter += 1

    return [*pages_data, temp]

Nó có thể rất nhiều để tiêu hóa, vì vậy hãy xem qua từng dòng. Các ý kiến ​​​​sẽ giúp. Ý tưởng đằng sau việc sắp xếp là lấy biểu diễn số nguyên tháng từ chuỗi — e. g. , 3 từ “3. png” và sử dụng giá trị này để sắp xếp các biểu đồ. Xóa dòng này nếu thứ tự không quan trọng, nhưng đó không phải là trường hợp của tháng

Đây là một cuộc gọi ví dụ của hàm


def generate_sales_data(month: int) -> pd.DataFrame:
    # Date range from first day of month until last
    # Use ```calendar.monthrange(year, month)``` to get the last date
    dates = pd.date_range(
        start=datetime(year=2020, month=month, day=1),
        end=datetime(year=2020, month=month, day=calendar.monthrange(2020, month)[1])
    )
    
    # Sales numbers as a random integer between 1000 and 2000
    sales = np.random.randint(low=1000, high=2000, size=len(dates))
    
    # Combine into a single dataframe
    return pd.DataFrame({
        'Date': dates,
        'ItemsSold': sales
    })

# Test
generate_sales_data(month=3)
0

plots_per_page = construct()
plots_per_page

Bạn sẽ thấy phần sau trong Notebook của mình sau khi chạy đoạn mã trên

Cách in báo cáo bằng Python
Hình ảnh 3 — Hình ảnh trực quan được tạo (hình ảnh của tác giả)

Trong trường hợp bạn đang thắc mắc — đây là giao diện của thư mục


def generate_sales_data(month: int) -> pd.DataFrame:
    # Date range from first day of month until last
    # Use ```calendar.monthrange(year, month)``` to get the last date
    dates = pd.date_range(
        start=datetime(year=2020, month=month, day=1),
        end=datetime(year=2020, month=month, day=calendar.monthrange(2020, month)[1])
    )
    
    # Sales numbers as a random integer between 1000 and 2000
    sales = np.random.randint(low=1000, high=2000, size=len(dates))
    
    # Combine into a single dataframe
    return pd.DataFrame({
        'Date': dates,
        'ItemsSold': sales
    })

# Test
generate_sales_data(month=3)
1 trên máy của tôi (sau khi gọi hàm

def generate_sales_data(month: int) -> pd.DataFrame:
    # Date range from first day of month until last
    # Use ```calendar.monthrange(year, month)``` to get the last date
    dates = pd.date_range(
        start=datetime(year=2020, month=month, day=1),
        end=datetime(year=2020, month=month, day=calendar.monthrange(2020, month)[1])
    )
    
    # Sales numbers as a random integer between 1000 and 2000
    sales = np.random.randint(low=1000, high=2000, size=len(dates))
    
    # Combine into a single dataframe
    return pd.DataFrame({
        'Date': dates,
        'ItemsSold': sales
    })

# Test
generate_sales_data(month=3)
0)

Cách in báo cáo bằng Python
Hình 4 — Ma trận nội dung báo cáo PDF (hình ảnh của tác giả)

Và đó là tất cả những gì bạn cần để tạo báo cáo PDF — bạn sẽ học cách thực hiện điều đó trong phần tiếp theo

Tạo báo cáo PDF

Đây là nơi mọi thứ kết hợp với nhau. Bây giờ, bạn sẽ tạo một lớp


def generate_sales_data(month: int) -> pd.DataFrame:
    # Date range from first day of month until last
    # Use ```calendar.monthrange(year, month)``` to get the last date
    dates = pd.date_range(
        start=datetime(year=2020, month=month, day=1),
        end=datetime(year=2020, month=month, day=calendar.monthrange(2020, month)[1])
    )
    
    # Sales numbers as a random integer between 1000 and 2000
    sales = np.random.randint(low=1000, high=2000, size=len(dates))
    
    # Combine into a single dataframe
    return pd.DataFrame({
        'Date': dates,
        'ItemsSold': sales
    })

# Test
generate_sales_data(month=3)
3 tùy chỉnh kế thừa từ lớp

def generate_sales_data(month: int) -> pd.DataFrame:
    # Date range from first day of month until last
    # Use ```calendar.monthrange(year, month)``` to get the last date
    dates = pd.date_range(
        start=datetime(year=2020, month=month, day=1),
        end=datetime(year=2020, month=month, day=calendar.monthrange(2020, month)[1])
    )
    
    # Sales numbers as a random integer between 1000 and 2000
    sales = np.random.randint(low=1000, high=2000, size=len(dates))
    
    # Combine into a single dataframe
    return pd.DataFrame({
        'Date': dates,
        'ItemsSold': sales
    })

# Test
generate_sales_data(month=3)
7. Bằng cách này, tất cả các thuộc tính và phương thức đều có sẵn trong lớp của chúng ta, nếu bạn không quên gọi

def generate_sales_data(month: int) -> pd.DataFrame:
    # Date range from first day of month until last
    # Use ```calendar.monthrange(year, month)``` to get the last date
    dates = pd.date_range(
        start=datetime(year=2020, month=month, day=1),
        end=datetime(year=2020, month=month, day=calendar.monthrange(2020, month)[1])
    )
    
    # Sales numbers as a random integer between 1000 and 2000
    sales = np.random.randint(low=1000, high=2000, size=len(dates))
    
    # Combine into a single dataframe
    return pd.DataFrame({
        'Date': dates,
        'ItemsSold': sales
    })

# Test
generate_sales_data(month=3)
5 trong hàm tạo. Hàm tạo cũng sẽ giữ các giá trị cho chiều rộng và chiều cao của trang (giấy A4)

Lớp


def generate_sales_data(month: int) -> pd.DataFrame:
    # Date range from first day of month until last
    # Use ```calendar.monthrange(year, month)``` to get the last date
    dates = pd.date_range(
        start=datetime(year=2020, month=month, day=1),
        end=datetime(year=2020, month=month, day=calendar.monthrange(2020, month)[1])
    )
    
    # Sales numbers as a random integer between 1000 and 2000
    sales = np.random.randint(low=1000, high=2000, size=len(dates))
    
    # Combine into a single dataframe
    return pd.DataFrame({
        'Date': dates,
        'ItemsSold': sales
    })

# Test
generate_sales_data(month=3)
3 của bạn sẽ có một số phương thức

  • 
    def generate_sales_data(month: int) -> pd.DataFrame:
        # Date range from first day of month until last
        # Use ```calendar.monthrange(year, month)``` to get the last date
        dates = pd.date_range(
            start=datetime(year=2020, month=month, day=1),
            end=datetime(year=2020, month=month, day=calendar.monthrange(2020, month)[1])
        )
        
        # Sales numbers as a random integer between 1000 and 2000
        sales = np.random.randint(low=1000, high=2000, size=len(dates))
        
        # Combine into a single dataframe
        return pd.DataFrame({
            'Date': dates,
            'ItemsSold': sales
        })
    
    # Test
    generate_sales_data(month=3)
    7 – được sử dụng để xác định tiêu đề tài liệu. Một logo tùy chỉnh được đặt ở bên trái (đảm bảo có một hoặc xóa dòng mã này) và một văn bản mã hóa cứng được đặt ở bên phải
  • 
    def generate_sales_data(month: int) -> pd.DataFrame:
        # Date range from first day of month until last
        # Use ```calendar.monthrange(year, month)``` to get the last date
        dates = pd.date_range(
            start=datetime(year=2020, month=month, day=1),
            end=datetime(year=2020, month=month, day=calendar.monthrange(2020, month)[1])
        )
        
        # Sales numbers as a random integer between 1000 and 2000
        sales = np.random.randint(low=1000, high=2000, size=len(dates))
        
        # Combine into a single dataframe
        return pd.DataFrame({
            'Date': dates,
            'ItemsSold': sales
        })
    
    # Test
    generate_sales_data(month=3)
    8 – được sử dụng để xác định chân tài liệu. Nó sẽ chỉ hiển thị số trang
  • 
    def generate_sales_data(month: int) -> pd.DataFrame:
        # Date range from first day of month until last
        # Use ```calendar.monthrange(year, month)``` to get the last date
        dates = pd.date_range(
            start=datetime(year=2020, month=month, day=1),
            end=datetime(year=2020, month=month, day=calendar.monthrange(2020, month)[1])
        )
        
        # Sales numbers as a random integer between 1000 and 2000
        sales = np.random.randint(low=1000, high=2000, size=len(dates))
        
        # Combine into a single dataframe
        return pd.DataFrame({
            'Date': dates,
            'ItemsSold': sales
        })
    
    # Test
    generate_sales_data(month=3)
    9 – được sử dụng để xác định trang trông như thế nào. Điều này sẽ phụ thuộc vào số lượng trực quan hóa được hiển thị trên mỗi trang, vì vậy các vị trí là lề được đặt tương ứng (vui lòng chơi xung quanh với các giá trị)
  • def plot(data: pd.DataFrame, filename: str) -> None:
        plt.figure(figsize=(12, 4))
        plt.grid(color='#F2F2F2', alpha=1, zorder=0)
        plt.plot(data['Date'], data['ItemsSold'], color='#087E8B', lw=3, zorder=5)
        plt.title(f'Sales 2020/{data["Date"].dt.month[0]}', fontsize=17)
        plt.xlabel('Period', fontsize=13)
        plt.xticks(fontsize=9)
        plt.ylabel('Number of items sold', fontsize=13)
        plt.yticks(fontsize=9)
        plt.savefig(filename, dpi=300, bbox_inches='tight', pad_inches=0)
        plt.close()
        return
                  
    # Test
    december = generate_sales_data(month=12)
    plot(data=december, filename='december.png')
    0 – được sử dụng để thêm một trang trống và điền nội dung vào đó

Đây là toàn bộ đoạn mã cho lớp


def generate_sales_data(month: int) -> pd.DataFrame:
    # Date range from first day of month until last
    # Use ```calendar.monthrange(year, month)``` to get the last date
    dates = pd.date_range(
        start=datetime(year=2020, month=month, day=1),
        end=datetime(year=2020, month=month, day=calendar.monthrange(2020, month)[1])
    )
    
    # Sales numbers as a random integer between 1000 and 2000
    sales = np.random.randint(low=1000, high=2000, size=len(dates))
    
    # Combine into a single dataframe
    return pd.DataFrame({
        'Date': dates,
        'ItemsSold': sales
    })

# Test
generate_sales_data(month=3)
5

Bây giờ là lúc khởi tạo nó và nối các trang từ ma trận nội dung 2 chiều


def generate_sales_data(month: int) -> pd.DataFrame:
    # Date range from first day of month until last
    # Use ```calendar.monthrange(year, month)``` to get the last date
    dates = pd.date_range(
        start=datetime(year=2020, month=month, day=1),
        end=datetime(year=2020, month=month, day=calendar.monthrange(2020, month)[1])
    )
    
    # Sales numbers as a random integer between 1000 and 2000
    sales = np.random.randint(low=1000, high=2000, size=len(dates))
    
    # Combine into a single dataframe
    return pd.DataFrame({
        'Date': dates,
        'ItemsSold': sales
    })

# Test
generate_sales_data(month=3)
6

Ô trên sẽ mất một chút thời gian để thực thi và sẽ trả về một chuỗi trống khi hoàn tất. Điều đó được mong đợi, vì báo cáo của bạn được lưu vào thư mục lưu trữ Sổ ghi chép

Đây là cách trang đầu tiên của báo cáo trông như thế nào

Cách in báo cáo bằng Python
Hình 5 — Trang đầu tiên của báo cáo PDF (hình ảnh của tác giả)

Tất nhiên, sản phẩm của bạn trông sẽ khác do logo khác và do dữ liệu bán hàng hoàn toàn ngẫu nhiên

Và đó là cách bạn tạo các báo cáo PDF hỗ trợ trực quan hóa dữ liệu bằng Python. Hãy kết thúc mọi thứ tiếp theo

Phần kết luận

Hôm nay bạn đã học được nhiều điều — cách tạo dữ liệu giả cho bất kỳ trường hợp nào, cách trực quan hóa dữ liệu đó và cách nhúng trực quan hóa vào một báo cáo PDF. Nhúng trực quan hóa của bạn sẽ yêu cầu thay đổi mã tối thiểu — chủ yếu là để định vị và lề

Hãy cho tôi biết nếu bạn muốn xem hướng dẫn tạo báo cáo tự động dựa trên diễn giải mô hình máy học (SHAP hoặc LIME) hoặc nội dung nào khác liên quan đến khoa học dữ liệu

Python có thể tạo báo cáo không?

Tin vui là Python có thể tạo báo cáo ở tất cả các định dạng này . Vì vậy, bạn có thể chọn bất kỳ định dạng nào trong số này, tùy thuộc vào nhu cầu của người dùng báo cáo. Dưới đây là tóm tắt những gì chúng tôi sẽ trình bày trong hướng dẫn này. Chúng tôi sẽ cần gấu trúc cho tất cả các báo cáo, vì chúng tôi cần thao tác và phân tích dữ liệu khi xây dựng báo cáo.

Làm cách nào để tạo báo cáo HTML bằng Python?

Báo cáo Python HTML bằng Python/v3 .
Bước 1. Tạo 2 biểu đồ và 2 bảng. đồ thị đầu tiên. Dữ liệu chứng khoán Apple năm 2014 với đường trung bình động. Hãy lấy dữ liệu chứng khoán của Apple bằng cách sử dụng mô hình tài chính matplotlib từ năm 2014, sau đó lấy một đường trung bình động với một tích chập gọn gàng. .
Bước 2. Tạo báo cáo HTML. dưới dạng một chuỗi và ghi vào tệp

Python có thể tự động báo cáo không?

Python là một công cụ tuyệt vời để tự động hóa , gần như thần kỳ. Trong bài viết này tôi sẽ hướng dẫn bạn cách xây dựng hệ thống báo cáo tự động với Python. Hệ thống sẽ tạo báo cáo PDF hàng ngày và gửi qua email.

Tạo báo cáo nghĩa là gì?

Tạo Báo cáo được được thiết kế để cho phép bạn lấy dữ liệu báo cáo ở một số định dạng . Các định dạng có sẵn bao gồm báo cáo biểu đồ với báo cáo bảng đồng hành và báo cáo danh sách để biết thông tin chi tiết.