web-dev-qa-db-ja.com

Python-DBのグラフを使用してPDFレポートを作成するプロセスは何ですか?

大学教授を評価するための調査によって生成されたデータベースがあります。私が欲しいのは、そのデータベースから情報を取得し、各ユーザーのグラフ表を生成し、各ユーザーのグラフを作成し、それをテンプレートにレンダリングしてpdfにエクスポートするpythonスクリプトです。

データベースはどのように見えますか?

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レポートを自動的に生成するスクリプトを作成する必要があります。たとえば、各教師の総合スコアを含むチャート、カテゴリごとの各教師のスコアを含むチャート、各生徒の平均を含む別のチャート、最後に、すべての教師がレポートを持っています。私はこのようなレポートが欲しいです Example

私の質問は何ですか?

私の質問は、このタスクを行うために必要なpythonパッケージとモジュールについてです。そして、そうするための一般的なプロセスは何でしょうか。答えは非常に一般的であることがわかっているので、コードは必要ありませんが、どうすればそれができるかという知識があります。

たとえば、最初にパンダで情報を処理し、グラフ化する情報を要約する表を作成してからプロットし、次にXYZモジュールでレポートのテンプレートを作成してから、 XYZモジュールでPDFにエクスポートします。

11
Ale

PythonでPDFを作成するための多くのオプションがあります。これらのオプションには、ReportLab、pydf2、pdfdocument、FPDFなどがあります。

FPDFライブラリーはかなり使いやすく、この例で使用したものです。 FPDFドキュメントは こちら にあります。

グラフや表を作成するためにどのpythonモジュールを使用したいかについて考えることもおそらく良いでしょう。この例では、matplotlib( ドキュメントへのリンク )を使用し、Pandasを使用してpandas.dataframe()を使用してデータフレームを作成します。

パンダ、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')

予想されるtest.pdf:

Expected test.pdf

15
patrickjlong1

私の場合:

  • Oracle Databaseに接続し、cx_Oracleライブラリを使用してデータを抽出します
  • データ操作にはPandasデータフレームを使用します
  • Matplotlibを使用してグラフを生成する
  • ExcelまたはPDF形式での出力にはExcelWriterとReportLabを使用します

お役に立てれば。

0
Fernando Garcia