web-dev-qa-db-fra.com

Python - Quel est le processus pour créer des rapports pdf avec des graphiques à partir d'une base de données?

J'ai une base de données générée par une enquête pour évaluer les professeurs d'université. Ce que je veux, c'est un script python qui extrait les informations de cette base de données, génère un tableau graphique pour chaque utilisateur, crée des graphiques pour chaque utilisateur, puis le rend dans un modèle pour l'exporter au format PDF.

A quoi ressemble la base de données?

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

Chaque enseignant a plusieurs catégories à évaluer (respect, sagesse, etc.) et chaque catégorie est associée à des questions. En d'autres termes, une catégorie a plusieurs questions. Chaque ligne de la BD est la réponse à une question d’un élève qui évalue un enseignant

De quoi ai-je besoin?

Je dois créer un script pour générer automatiquement des rapports pdf résumant ces informations sous forme de graphiques, par exemple un graphique avec le score global de chaque enseignant, un autre graphique avec le score de chaque enseignant par catégorie, un autre graphique avec la moyenne de chaque élève, etc..Enfin, chaque enseignant aurait un rapport. Je veux un rapport comme celui-ci  Example

Quelle est ma question?

ma question concerne les paquets et modules Python nécessaires pour cette tâche. Et quel serait le processus général de le faire. Je n'ai pas besoin du code, car je sais que la réponse est très générale, mais je sais comment le faire.

Par exemple: vous devez d’abord traiter les informations avec les pandas, créer un tableau qui récapitule les informations que vous voulez représenter, puis les tracer, puis créer un modèle de rapport avec le module XYZ, puis l’exporter au format pdf avec le module XYZ.

3
Ale

Il y a beaucoup d'options pour créer un pdf en python. ReportLab, pydf2, pdfdocument et FPDF sont quelques-unes de ces options. 

La bibliothèque FPDF est assez difficile à utiliser et est ce que j'ai utilisé dans cet exemple. La documentation de FPDF peut être trouvée ici

Il est peut-être bon aussi de penser aux modules python que vous pourriez utiliser pour créer des graphiques et des tableaux. Dans mon exemple, j'utilise matplotlib ( link to docs ) et j'utilise également Pandas pour créer un cadre de données à l'aide de pandas.dataframe()

J'ai posté ci-dessous un exemple assez long mais parfaitement reproductible, utilisant des pandas, matplotlib et fpdf. Les données sont un sous-ensemble de ce que le PO a fourni dans la question. Je parcours la base de données dans mon exemple pour créer la table, mais il existe des moyens alternatifs et peut-être plus efficaces de le faire.

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 attendu.pdf:

 Expected test.pdf

2
patrickjlong1

Dans mon cas:

  • Connectez-vous à la base de données Oracle et extrayez des données à l'aide de la bibliothèque cx_Oracle
  • Utiliser des Pandas Dataframes pour la manipulation de données
  • Utiliser Matplotlib pour générer des graphiques
  • Utiliser ExcelWriter et ReportLab pour une sortie au format Excel ou au format PDF

J'espère que cela t'aides.

0
Fernando Garcia