Đâ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
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ư
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_pageBạn sẽ thấy phần sau trong Notebook của mình sau khi chạy đoạn mã trên
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)
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)5Bâ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
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