4 votes

Est-il possible de créer des rapports avec Python Pandas ?

J'utilise actuellement MS Access pour produire des rapports, mais je suis quelque peu limité par certains des calculs que je dois effectuer.

J'ai envisagé d'utiliser Python pour exécuter les rapports, c'est-à-dire un rapport par ligne de données qui prend les champs de la colonne et les place dans des zones de texte descendantes, ce qui ressemble à ceci :

Report template

Comment cela serait-il possible avec Python ?

10voto

tuomastik Points 2025

Cela va un peu au-delà de Pandas, mais vous pouvez facilement créer un rapport PDF à partir de chaque ligne de votre DataFrame Pandas à l'aide de la fonction jinja2 (moteur de modèles) et xhtml2pdf (convertit le HTML en PDF).

Tout d'abord, définissez la structure et l'aspect d'un rapport en 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 df.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>

Ensuite, exécutez ce code Python 3, qui convertit chaque ligne de DataFrame en chaîne HTML via jinja2 et convertit ensuite le HTML en PDF via xhtml2pdf :

from datetime import date

import jinja2
import pandas as pd
from xhtml2pdf import pisa

df = pd.DataFrame({
    "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():

    html = jinja2.Environment(  # Pandas DataFrame to HTML
        loader=jinja2.FileSystemLoader(searchpath='')).get_template(
        'report_template.html').render(date=date.today().strftime('%d, %b %Y'),
                                       row_ix=row_ix, df=row)

    # Convert HTML to PDF
    with open('report_row_%s.pdf' % (row_ix+1), "w+b") as out_pdf_file_handle:
        pisa.CreatePDF(
            src=html,  # HTML to convert
            dest=out_pdf_file_handle)  # File handle to receive result

Pour le DataFrame spécifié dans le code Python, 3 PDFs seront produits. Le premier PDF ressemble à ceci (converti en PNG pour pouvoir le montrer ici) : One row of Pandas DataFrame converted to PDF via HTML by using Jinja2 and xhtml2pdf

1voto

P.Tillmann Points 1250

C'est sûrement possible mais je ne pense pas que pandas fournisse une telle fonctionnalité. Vous devriez peut-être jeter un coup d'œil à latex, qui permet de "programmer" et de compiler des documents (ce qui n'a rien à voir avec python). Vous pouvez créer un modèle latex et le remplir dynamiquement de contenu en python, puis compiler un document pdf, mais il vous faudra probablement faire des efforts pour trouver votre chemin dans latex.

1voto

Xukrao Points 1732

Lecture de fichiers CSV avec Pandas : oui, tout à fait possible. Voir : http://pandas.pydata.org/pandas-docs/stable/io.html#io-read-csv-table

Produire des rapports avec Pandas : cela dépend de ce que vous recherchez exactement. Pandas dispose de nombreuses fonctions d'écriture de sortie différentes, mais elles se concentrent sur la production de tableaux, et non sur la production de documents entiers. Ce qui se rapproche le plus d'une sortie de type "document" que vous pouvez obtenir directement de Pandas est probablement la sortie de tableau HTML : http://pandas.pydata.org/pandas-docs/stable/io.html#io-html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X