【问题标题】:Python - What is the process to create pdf reports with charts from a DB?Python - 使用数据库中的图表创建 pdf 报告的过程是什么?
【发布时间】:2019-01-22 16:28:51
【问题描述】:

我有一个由调查生成的数据库,用于评估大学教授。我想要的是一个 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

每位教师都有几个类别需要评估(尊重、智慧等),而每个类别又都有相关的问题。换句话说,一个类别有几个问题。 DB 的每一行都是学生评价老师的问题的答案

我需要什么?

我需要创建一个脚本来自动生成通过图表总结这些信息的 pdf 报告,例如每个老师的总得分图表,每个老师按类别得分的另一个图表,另一个图表的平均值每个学生,等等。最后,每个老师都会有一个报告。我想要这样的报告

我的问题是什么?

我的问题是我需要哪些 python 包和模块来完成这项任务。这样做的一般过程是什么。我不需要代码,因为我知道答案很笼统,但我知道如何做到这一点。

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

【问题讨论】:

标签: python pandas matplotlib jinja2 plotly


【解决方案1】:

就我而言:

  • 连接到 Oracle 数据库并使用 cx_Oracle 库提取数据
  • 使用 Pandas 数据框进行数据操作
  • 使用 Matplotlib 生成图表
  • 使用 ExcelWriter 和 ReportLab 以 Excel 或 PDF 格式输出

希望这会有所帮助。

【讨论】:

    【解决方案2】:

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

    FPDF 库使用起来相当简单,这也是我在本示例中使用的。 FPDF 文档可以在here 找到。

    考虑一下您可能想要使用哪些 python 模块来创建图形和表格也许也很好。在我的示例中,我使用 matplotlib (link to 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'].iloc[i]), 1, 0, 'C')
        pdf.cell(40, 10, '%s' % (str(df.Mike.iloc[i])), 1, 0, 'C')
        pdf.cell(40, 10, '%s' % (str(df.Charles.iloc[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')
    

    预期测试.pdf:

    更新(2020 年 4 月):我在 2020 年 4 月对原始答案进行了编辑,以替换 pandas.DataFrame.ix() 的使用,因为这是 deprecated。在我的示例中,我能够将它的使用替换为 pandas.DataFrame.iloc 并且输出与以前相同。

    【讨论】:

    • @Nguai al 你试过python -m pip install fpdf 来安装 fpdf 库吗?截至今天(2019 年 1 月 25 日),此示例适用于 Windows 10 和 Python 3.6.5。
    • "pip install fpdf" 工作。但是,使用 conda 安装不起作用。您的示例适用于 Windows。谢谢。
    • 有没有办法直接插入绘图还是必须先保存为.png文件?
    • 通过 iloc 更改 ix,不推荐使用 ix。例如:df['Question'].iloc[i] 而不是 df['Question'].ix[i]
    • @dasilvadaniel。好点。感谢您抽出时间发表评论。我已经更新了答案并进行了测试。
    【解决方案3】:

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

    说真的,R 世界在这个领域是遥遥领先的。

    【讨论】:

      【解决方案4】:

      我同意@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)))
      
      ```
      

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

      stitch test2.stich -o output.pdf
      

      输出将如下所示:

      【讨论】:

      • 谢谢,有趣的工具!我认为您所指的针迹的链接是这样的:pystitch.github.io ?
      • @NickO,是的,我的链接错误。更新了答案。谢谢。
      猜你喜欢
      • 2013-01-18
      • 1970-01-01
      • 1970-01-01
      • 2018-05-28
      • 1970-01-01
      • 2019-10-15
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多