python - 是否可以使用 Python Pandas 构建报告?

标签 python pandas

我目前正在使用 MS Access 生成报告,但我需要做的一些计算有些受限。

我正在考虑使用 Python 来运行报告,即每行数据一个报告,它采用列字段并将它们放在向下的文本框中,看起来像:

Report template

这在 Python 中如何实现?

最佳答案

这有点超出 Pandas,但您可以借助以下 Python 库从 Pandas DataFrame(使用 1.2.5 版测试)的每一行创建 PDF 报告:

  • jinja2 : 模板引擎,测试版本 3.0.1
  • xhtml2pdf : 将 HTML 转换为 PDF,测试版本为 0.2.5

首先,在report_template.html 中定义报告的结构和外观:

<html>
    <head>
        <style type="text/css">
            html, body {
                width: 500px;
                font-size: 12px;
                background: #fff;
                padding: 0px;
            }
            #my-custom-table {
                width: 500px;
                border: 0;
                margin-top: 20px;
            }
            #my-custom-table td {
                padding: 5px 0px 1px 5px;
                text-align: left;
            }
        </style>
    </head>
    <body>
        <table cellspacing="0" border="0" style="width:500px; border:0; font-size: 14px;">
            <tr>
                <td style="text-align:left;">
                    <b><span>Title of the PDF report - Row {{ row_ix + 1 }}</span></b>
                </td>
                <td style="text-align:right;">
                    <b><span>{{ date }}</span></b>
                </td>
            </tr>
        </table>
        <table cellspacing="0" border="0" id="my-custom-table">
            {% for variable_name, variable_value in row.iteritems() %}
            {% if loop.index0 == 0 %}
            <tr style="border-top: 1px solid black;
                       border-bottom: 1px solid black;
                       font-weight: bold;">
                <td>Variable name</td>
                <td>Variable value</td>
            </tr>
            {% else %}
            <tr>
                <td>{{ variable_name }}</td>
                <td>{{ variable_value }}</td>
            </tr>
            {% endif %}
            {% endfor %}
        </table>
    </body>
</html>

然后,运行这个 Python 3 代码,它通过 jinja2 将 DataFrame 的每一行转换为 HTML 字符串,然后通过 xhtml2pdf 将 HTML 转换为 PDF:

from datetime import date

import jinja2
import pandas as pd
from xhtml2pdf import pisa

df = pd.DataFrame(
    data={
        "Average Introducer Score": [9, 9.1, 9.2],
        "Reviewer Scores": ["Academic: 6, 6, 6", "Something", "Content"],
        "Average Academic Score": [5.7, 5.8, 5.9],
        "Average User Score": [1.2, 1.3, 1.4],
        "Applied for (RC)": [9.2, 9.3, 9.4],
        "Applied for (FEC)": [5.5, 5.6, 5.7],
        "Duration (Months)": [36, 37, 38],
    }
)

for row_ix, row in df.iterrows():

    # Pandas DataFrame to HTML
    html = (
        jinja2.Environment(loader=jinja2.FileSystemLoader(searchpath=""))
        .get_template(name="report_template.html")
        .render(
            date=date.today().strftime("%d, %b %Y"),
            row_ix=row_ix,
            row=row,
        )
    )

    # Convert HTML to PDF
    with open("report_row_%s.pdf" % (row_ix + 1), "w+b") as out_pdf_file_handle:
        pisa.CreatePDF(
            # HTML to convert
            src=html,
            # File handle to receive the result
            dest=out_pdf_file_handle,
        )

对于Python代码中指定的DataFrame,会输出3个PDF。第一个 PDF 看起来像这样(转换为 PNG 以便能够在此处显示):One row of Pandas DataFrame converted to PDF via HTML by using Jinja2 and xhtml2pdf

关于python - 是否可以使用 Python Pandas 构建报告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44001570/

相关文章:

c++ - 是否有用于 Wireshark 的 API,用于开发与其交互/增强的程序/插件?

python - 有条件地删除组中的最后一行

python - 如何在 PyCharm for Python 项目中获取代码覆盖率报告

Python Pyinstaller - 如何为我构建的程序打补丁?

Python/C-API : Add class to module

list - python : create a pandas data frame from a list

python - 类型错误 : Timestamp subtraction

python - Pandas :如何找到一个群体的百分比?

python - 访问 pandas to_csv 中的 zip 压缩选项

尽管升级到 Python 2.7,Python 仍使用 TLSv1 或 TLSv1.1 请求库