【问题标题】:Is it possible to build reports with Python Pandas?是否可以使用 Python Pandas 构建报告?
【发布时间】:2017-05-16 12:31:09
【问题描述】:

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

我正在考虑使用 Python 来运行报告,即每行数据一个报告,该报告获取列字段并将它们放在向下的文本框中,如下所示:

用 Python 怎么可能?

【问题讨论】:

  • 我不明白你在问什么,你能举一些你想要做什么的例子吗?
  • 对不起,我想读取一个包含大量数据的 CSV(每个参考号很多行),进行大量操作以将其转换为“每个参考号一行”格式......然后我想以报告格式将其导出为 Word 或 PDF,即沿着行并将其放入如上图所示的文本框中,并且每个参考号有一份报告
  • 目前您正在描述一个包含许多单独步骤(打开文件、进行计算、导出)的整个过程,每个步骤您都可以在其他地方找到参考。你有什么具体的问题吗?正如所写的那样,我认为您的问题的答案是“开始尝试,看看你会得到什么。” :)
  • 对不起,我可以做所有的第一部分,即读取和操作它(获取新列等),我想要做的是获取我在 Pandas 中创建的新 CSV 并将其放入像我的图片一样报告结构而不是在 csv 中? :)
  • 我还可以建议您检查 Python 的 reportlab,它对于基于高性能表格、图像、图形和段落的 PDF 生成很有用。这是链接reportlab.com/opensource/installation

标签: python pandas


【解决方案1】:

这超出了 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 代码,它将 DataFrame 的每一行通过jinja2 转换为 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 以便能够在此处显示):

【讨论】:

  • Tuomastik,非常感谢您花时间帮助我解决这个问题。我周一正在研究这个,并试图让我的头脑了解乳胶,并询问一些工作中的人(无济于事),他们可能在攻读博士学位时有过这方面的经验......你的回答是如此简单得多,我完全理解它在做什么。如果我能给你买啤酒,我会的! :).... 谢谢你!我会把你的答案标记为正确的
  • 嘿,再次感谢您。我得到了一切工作。完美的。在我开始变得混乱之前快速提问,但是我将在代码中进行哪些更改以使所有报告进入同一个 PDF,但一个在另一个之下? (对不起,如果这是一个有点厚颜无耻的问题)
  • @ScoutEU 从 Python 代码中删除 for 循环,并将其集成到 HTML 代码中的 for 循环周围。
  • 实用商务Python也有一个blog post关于这个
  • 谢谢,我正在努力获取 html for 循环,请查看该博客文章
【解决方案2】:

使用 Pandas 读取 CSV 文件:是的,绝对有可能。见:http://pandas.pydata.org/pandas-docs/stable/io.html#io-read-csv-table

使用 Pandas 生成报告:取决于您要查找的内容。 Pandas 有许多不同的输出写入函数,但它们的重点是生成表格,而不是生成整个文档。您可以直接从 Pandas 获得的最接近“文档”样式的输出可能是 HTML 表格输出: http://pandas.pydata.org/pandas-docs/stable/io.html#io-html

【讨论】:

  • 嘿,是的,抱歉,我的问题不太清楚,我对使用 Python Pandas 很满意,更多的是把它放到我被困在的报告中:)....我认为P.Tillman 描述的“乳胶”选项可能是我最好的选择,但肯定会查看您的链接。非常感谢
【解决方案3】:

这当然是可能的,但我不认为 pandas 提供了这样的功能。你可能想看看你“编程”和编译文档的乳胶(它本身与python无关)。你可以创建一个 Latex 模板并在 python 中动态填充它的内容,然后编译一个 pdf 文档,但可能需要一些努力才能找到进入 Latex 的方式。

【讨论】:

  • 啊这听起来像我想要的,我现在就去看看 Latex!谢谢
  • 是的,这正是我想要的。谢谢
猜你喜欢
  • 1970-01-01
  • 2018-10-18
  • 2017-09-15
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 2022-08-11
相关资源
最近更新 更多