Python-使用DB中的图表创建pdf报告的过程是什么?

ozo*_*ozo 14 python matplotlib jinja2 pandas plotly

我有一个由调查生成的数据库,用于评估大学教授。我想要的是一个python脚本,该脚本从该数据库中获取信息,为每个用户生成一个图形表,为每个用户创建图形,然后将其呈现在模板中以将其导出为pdf。

数据库是什么样的?

User    Professor_evaluated  Category       Question    Answer
_________________________________________________________________
Mike    Professor Criss       respect           1         3
Mike    Professor Criss       respect           2         4
Mike    Professor Criss       wisdom            3         5
Mike    Professor Criss       wisdom            4         3
Charles Professor Criss       respect           1         3
Charles Professor Criss       respect           2         4
Charles Professor Criss       wisdom            3         5
Charles Professor Criss       wisdom            4         3
Run Code Online (Sandbox Code Playgroud)

每个老师都有几个要评估的类别(尊重,智慧等),每个类别又有相关的问题。换句话说,一个类别有几个问题。数据库的每一行都是学生评估老师的问题的答案

我需要什么?

我需要创建一个脚本来自动生成pdf报告,并通过图表来汇总这些信息,例如,一张图表列出每位老师的总成绩,另一张图表列出每位老师的分数,另一张图表列出每位学生的平均值,等等。最后,每个老师都会有一份报告。我想要这样的报告例

我有什么问题

我的问题是我需要执行哪个python软件包和模块。这样做的一般过程是什么。我不需要代码,因为我知道答案很笼统,但是知道如何实现。

例如:您首先需要使用熊猫处理信息,创建一个汇总要绘制的信息的表格,然后将其绘制出来,然后使用XYZ模块创建报告模板,然后使用XYZ模块将其导出为pdf。 。

pat*_*ng1 17

有很多在python中创建pdf的选项。其中一些选项是ReportLab,pydf2,pdfdocument和FPDF。

FPDF库相当易于使用,这就是我在此示例中使用的库。可以在这里找到FPDF文档。

考虑一下可能要使用哪些python模块来创建图形和表格也可能是一件好事。在我的示例中,我使用matplotlib(指向docs的链接),也使用Pandas使用创建数据框pandas.dataframe()

我在下面使用pandas,matplotlib和fpdf发布了一个相当冗长但完全可复制的示例。数据是问题中OP提供的内容的子集。我在示例中遍历数据框以创建表,但是有替代方法,也许还有更有效的方法。

import pandas as pd
import matplotlib
from pylab import title, figure, xlabel, ylabel, xticks, bar, legend, axis, savefig
from fpdf import FPDF


df = pd.DataFrame()
df['Question'] = ["Q1", "Q2", "Q3", "Q4"]
df['Charles'] = [3, 4, 5, 3]
df['Mike'] = [3, 3, 4, 4]

title("Professor Criss's Ratings by Users")
xlabel('Question Number')
ylabel('Score')

c = [2.0, 4.0, 6.0, 8.0]
m = [x - 0.5 for x in c]

xticks(c, df['Question'])

bar(m, df['Mike'], width=0.5, color="#91eb87", label="Mike")
bar(c, df['Charles'], width=0.5, color="#eb879c", label="Charles")

legend()
axis([0, 10, 0, 8])
savefig('barchart.png')

pdf = FPDF()
pdf.add_page()
pdf.set_xy(0, 0)
pdf.set_font('arial', 'B', 12)
pdf.cell(60)
pdf.cell(75, 10, "A Tabular and Graphical Report of Professor Criss's Ratings by Users Charles and Mike", 0, 2, 'C')
pdf.cell(90, 10, " ", 0, 2, 'C')
pdf.cell(-40)
pdf.cell(50, 10, 'Question', 1, 0, 'C')
pdf.cell(40, 10, 'Charles', 1, 0, 'C')
pdf.cell(40, 10, 'Mike', 1, 2, 'C')
pdf.cell(-90)
pdf.set_font('arial', '', 12)
for i in range(0, len(df)):
    pdf.cell(50, 10, '%s' % (df['Question'].ix[i]), 1, 0, 'C')
    pdf.cell(40, 10, '%s' % (str(df.Mike.ix[i])), 1, 0, 'C')
    pdf.cell(40, 10, '%s' % (str(df.Charles.ix[i])), 1, 2, 'C')
    pdf.cell(-90)
pdf.cell(90, 10, " ", 0, 2, 'C')
pdf.cell(-30)
pdf.image('barchart.png', x = None, y = None, w = 0, h = 0, type = '', link = '')
pdf.output('test.pdf', 'F')
Run Code Online (Sandbox Code Playgroud)

预期测试.pdf:

预期测试.pdf

  • “pip install fpdf”有效。但是,使用 conda 安装不起作用。您的示例适用于 Windows。谢谢。 (2认同)
  • 通过 iloc 更改 ix,ix 已弃用。例如: df['Question'].iloc[i] 而不是 df['Question'].ix[i] (2认同)

dsz*_*dsz 9

一个有点异端的答案:RMarkdown(在 RStudio 中),带有 Python 代码块,通过reticulate(现在的默认方式)为您提供一个长期的 Python“会话”,就像在 Jypiter 笔记本中一样。然后,RMarkdown 文档可以“编织”成 PDF、html、Word、html 幻灯片,甚至 PowerPoint。

说实话,R 世界在这一领域遥遥领先。


Nic*_*7as 9

我同意 @drz 关于 RMarkdown 创建这样一份报告的观点。学术著作应该明确地使用这一点。不管怎样,还有stitch,它使用起来非常简单,并且在很多情况下可能就足够了。fpf 的许多优点:

  • 分页被管理
  • 标记语法可用
  • matplotlib和pandas图直接输出
  • 可以生成html或pdf

这是缝合中的@patrickjlong​​1示例:

# Stich is simple and great

## Usefull markup language

You can use markdown syntax, such as **bold**, _italic_, ~~Strikethrough~~

## display dataframes

Direct output from python will be nicelly output.

```{python, echo=False}

import pandas as pd

df = pd.DataFrame()
df['Question'] = ["Q1", "Q2", "Q3", "Q4"]
df['Charles'] = [3, 4, 5, 3]
df['Mike'] = [3, 3, 4, 4]
df = df.set_index('Question')
df.style
df

```

## display graphics

Direct matplotlib output, without rendering to file.

```{python, echo=False}
#%matplotlib inline
df.plot.bar(title="Professor Criss's Ratings by Users")
None
```

## Symbolic expressions

You may also want to work with sympy :

```{python, echo=False}

import sympy
sympy.init_printing()
x=sympy.symbol.Symbol('x')
sympy.integrate(sympy.sqrt(1/sympy.sin(x**2)))

```
Run Code Online (Sandbox Code Playgroud)

安装后,将使用以下命令创建 PDF:

stitch test2.stich -o output.pdf
Run Code Online (Sandbox Code Playgroud)

输出将如下所示:

PDF 中的 stich 输出

  • 谢谢,有趣的工具!我认为您所指的针迹的链接是这样的:https://pystitch.github.io/? (2认同)