Archives de catégorie : BI

Générer un rapport Word mensuel automatiquement avec Python (données, tableau et graphique inclus)

Créer un rapport mensuel structuré ne devrait pas rimer avec copier-coller manuel. Grâce à Python, on peut automatiser la création d’un document Word propre et professionnel à partir d’un fichier de données (comme un export de la Search Console).

Dans cet article, je vous montre comment produire un rapport complet, prêt à être diffusé, en utilisant uniquement Python et un template Word.

🎯 Objectif

Générer un fichier .docx contenant automatiquement :

  • ✅ Les 10 requêtes les plus vues (impressions)
  • ✅ Le mot-clé principal à surveiller
  • ✅ Une liste de recommandations à suivre
  • ✅ Un graphique en camembert des impressions

À partir de deux fichiers :

  • Un template Word professionnel avec des balises de remplacement
  • Un fichier Excel source avec les données de performance

Prérequis techniques

pip install python-docx pandas matplotlib openpyxl

Le script utilise :

  • pandas pour lire et trier les données,
  • matplotlib pour générer un graphique,
  • python-docx pour créer et remplir le fichier Word.

Le template Word

Le template utilise des balises faciles à identifier :
{mois}, {tableau_requetes}, {mot_cle}, {actions}, {graphique}

🧩 Exemple de structure :

Rapport mensuel - {mois}

1. Requêtes principales
{tableau_requetes}

2. Mot-clé à surveiller
{mot_cle}

3. Propositions d’actions
{actions}

4. Graphique – Répartition des impressions
{graphique}


Le script Python

Voici un aperçu du code :

pythonCopierModifierimport pandas as pd
from docx import Document
from docx.shared import Inches
from datetime import datetime
import matplotlib.pyplot as plt

# Chemins
EXCEL_PATH = "donnees_search_console.xlsx"
TEMPLATE_PATH = "template_rapport_professionnel.docx"
OUTPUT_PATH = f"rapport_mensuel_{datetime.today().strftime('%Y-%m')}.docx"
GRAPH_IMAGE_PATH = "graphique_impressions_pie.png"

# Charger les données
df = pd.read_excel(EXCEL_PATH, sheet_name="Requêtes")
df.columns = ["Requête", "Clics", "Impressions", "CTR", "Position"]
top10 = df.sort_values(by="Impressions", ascending=False).head(10)

# Générer le graphique
fig, ax = plt.subplots()
ax.pie(top10["Impressions"], labels=top10["Requête"], autopct="%1.1f%%", startangle=90)
plt.tight_layout()
plt.savefig(GRAPH_IMAGE_PATH)

# Infos dynamiques
mois = datetime.today().strftime("%B %Y")
mot_cle = top10.iloc[0]["Requête"]
actions = [
    "Analyser la concurrence sur ce mot-clé",
    "Optimiser la balise title des pages concernées",
    "Améliorer la vitesse de chargement mobile",
    "Ajouter du contenu multimédia enrichi",
    "Développer une FAQ liée à ce sujet"
]

# Remplir le document Word
doc = Document(TEMPLATE_PATH)

for p in doc.paragraphs:
    if "{mois}" in p.text:
        p.text = p.text.replace("{mois}", mois)
    if "{mot_cle}" in p.text:
        p.text = p.text.replace("{mot_cle}", mot_cle)
    if "{actions}" in p.text:
        p.text = p.text.replace("{actions}", "\\n".join(f"- {a}" for a in actions))
    if "{graphique}" in p.text:
        p.text = ""
        doc.add_picture(GRAPH_IMAGE_PATH, width=Inches(5.5))

# Insertion tableau
for p in doc.paragraphs:
    if "{tableau_requetes}" in p.text:
        p.text = ""
        table = doc.add_table(rows=1, cols=len(top10.columns))
        table.style = "Light List"
        hdr = table.rows[0].cells
        for idx, col in enumerate(top10.columns):
            hdr[idx].text = col
        for _, row in top10.iterrows():
            cells = table.add_row().cells
            for idx, val in enumerate(row):
                cells[idx].text = str(val)
        break

doc.save(OUTPUT_PATH)

Résultat

Le script produit un fichier Word contenant :

  • Le mois en cours
  • Un tableau clair des requêtes principales
  • Un mot-clé à surveiller
  • Des actions concrètes
  • Et un graphique directement intégré

Parfait pour un usage en entreprise, une newsletter mensuelle ou un reporting automatique.

Formatage Excel avec Python & Pandas – Focus sur les requêtes les plus visibles

Lorsqu’on travaille son SEO, l’un des indicateurs clés à suivre est le volume d’impressions dans les résultats de recherche. Plus une requête est visible, plus elle a le potentiel de générer du trafic.

Dans cet article, on va transformer un export brut de la Search Console Google en un rapport Excel professionnel, incluant un graphique dynamique directement éditable dans Excel.


Objectif

À partir de données comme :

RequêteClicsImpressionsCTRPosition
iso 6230402210.00%44.62
logiciel diagnostic medical0720.00%77.72
manipuler excel avec python1541.85%9.56

Nous allons générer un fichier Excel :

✅ avec formatage conditionnel,
✅ des entêtes visuellement clairs,
✅ un classement des 10 requêtes les plus vues,
✅ un diagramme Excel interactif intégré automatiquement.


Étapes du traitement

1. Charger et trier les données par impressions

import pandas as pd

# Charger la feuille "Requêtes"
df = pd.read_excel("marcsauget_Performance-on-Search.xlsx", sheet_name="Requêtes")
df.columns = ["Requête", "Clics", "Impressions", "CTR", "Position"]

# Récupérer les 10 requêtes avec le plus d'impressions
top10 = df.sort_values(by="Impressions", ascending=False).head(10)

2. Exporter en Excel avec en-têtes stylisées

top10.to_excel("top10_impressions.xlsx", index=False, engine="openpyxl")

from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill

# Appliquer le style sur les en-têtes
wb = load_workbook("top10_impressions.xlsx")
ws = wb.active

header_fill = PatternFill(start_color="FFD700", fill_type="solid")
for cell in ws[1]:
cell.font = Font(bold=True)
cell.fill = header_fill

3. Ajouter un graphique Excel (camembert)

from openpyxl.chart import PieChart, Reference

# Préparer les données pour le graphique
labels = Reference(ws, min_col=1, min_row=2, max_row=11) # Requêtes
data = Reference(ws, min_col=3, min_row=1, max_row=11) # Impressions (avec en-tête)

# Créer le graphique Excel
pie = PieChart()
pie.title = "Répartition des impressions"
pie.add_data(data, titles_from_data=True)
pie.set_categories(labels)

# Ajouter à la feuille Excel
ws.add_chart(pie, "G2")

# Sauvegarder
wb.save("top10_impressions_with_chart.xlsx")

Résultat

Tu obtiens un fichier Excel avec :

  • Un tableau clair des 10 requêtes les plus vues,
  • Des valeurs formatées pour faciliter la lecture,
  • Un diagramme interactif permettant de visualiser l’exposition globale.

📈 Ce fichier peut être partagé, personnalisé dans Excel, ou intégré dans un reporting automatique. Le voici en téléchargement.


Conclusion

Pandas et OpenPyXL forment un duo parfait pour transformer vos exports bruts de données SEO en rapports prêts à l’emploi. Et en insérant des graphiques natifs Excel, on combine automatisation et souplesse d’édition.

Python vers Word, un script rapide

Manipuler des données avec Python, c’est rapide. Fournir un fichier Excel, c’est également possible, mais souvent insuffisant pour une diffusion sous forme de livrable.

Voici une version actualisée de cette article : https://marcsauget.fr/2025/04/12/generer-un-rapport-word-mensuel-automatiquement-avec-python-donnees-tableau-et-graphique-inclus/

Voici une version actualisée de cet article : Version 2025

Un résultat sous forme de Word est possible.

Le point de départ, c’est le dataframe. Il s’agit de l’objet produit par Pandas et permettant de manipuler facilement et rapidement vos données.

voici un exemple rapide permettant de créer un tableau de manière dynamique.

import pandas as pd
from docx import Document

# Créer un DataFrame de test
data = {'Nom': ['Alice', 'Bob', 'Charlie'],
        'Age': [25, 30, 35],
        'Ville': ['Paris', 'Londres', 'New York']}
df = pd.DataFrame(data)

# Créer un nouveau document
document = Document()

# Ajouter un titre
document.add_heading('Tableau de test', 0)

# Ajouter un tableau à partir du DataFrame
table = document.add_table(rows=1, cols=len(df.columns))
hdr_cells = table.rows[0].cells
for i, colname in enumerate(df.columns):
    hdr_cells[i].text = colname

for i in range(len(df)):
    row_cells = table.add_row().cells
    for j, val in enumerate(df.iloc[i]):
        row_cells[j].text = str(val)

# Enregistrer le document
document.save('test_table_df.docx')

Et vous arrivez rapidement à ce résultat :

Par la suite, il suffit d’intégrer ces routines dans la gestion de vos templates Word … et vous pouvez produire directement un livrable final à votre équipe. (et pas un fichier devant être manipuler avant de pouvoir être diffuser.

Un modèle de formulaire dynamique en Python / Django

Le concept : Un n-ième outil de création de formulaire

Le sujet n’est pas réellement innovant : il doit exister autant de site de formulaire dynamique que de développeur  … Pourtant, à chaque nouveau développement, il est rare de trouver l’outil, le module, qui va permettre de ne pas développer son modèle de formulaire. Il manque souvent, la fonctionnalité, ou le paramétrage qui va permettre d’avoir le paramétrage ou la personnalisation nécessaire.  Le principe de ce développement ne sera donc pas de faire le module de formulaire le plus complet possible … mais au contraire, de proposer un outil simple, robuste qui pourra être utilisé tel quel … ou étendu pour des besoins spécifiques.

L’innovation : Penser directement pour l’exploitation des résultats

En effet, un formulaire, quel qu’il soit n’est utile que si l’exploitation des résultats est possible.  L’objectif de ce développement sera donc de fournir l’ensemble des outils permettant la conception et l’utilisation d’un formulaire mais également, ceux qui permettent une exploitation ou un export des résultats.

Le mode de distribution

Sur ce point,  je vais essayer d’être le plus complet possible afin que tous puisse y trouver leur compte.  L’objectif sera donc de proposer :

  • Un service en ligne complet et autonome.
  • Une Api, permettant à des solutions de personnaliser complètement une partie de l’interface tout profitant d’un backend et de solution d’export existante.
  • Sous forme de brique logicielle autonome pouvant être déployant directement au sein d’une infrastructure
  • et pour ceux qui veulent aller plus loin dans la personnalisation, directement les sources de la solution (open ou closed source) en fonction de la cible du logiciel.

la stack technique

Pour le moment, rien n’est définitif … Mais le premier jet sera basé sur Python Django + un serveur MariaDB.  L’objectif de cette stack est de permettre d’obtenir un premier résultat rapide. De plus, ce choix permet de jolies évolutions. 

La cerise sur le gâteau est que Python est Le langage a suivre pour le moment. Ce choix est donc à la fois pour l’évolution du produit .. que pour mon évolution. 

Power Bi, Open Data et listing des pharmacies

Voici un petit article présentant comment il est possible d’obtenir un listing dans Power BI présentant une grande majorité des pharmacies.

La première étape est de récupérer un fichier contenant l’ensemble des établissements de santé.
Le choix se fait sur le fichier Fichier Finess:

Le choix est déterminé par la certification du fichier et sa fréquence de sa mise à jour.

Ce dossier du site Open Data contient en fait plusieurs documents distincts dont le détail est visible dans l’aperçu précédent.

Pour ce premier article, nous n’aurons besoin que du fichier contenant les extractions Finess des établissements ainsi que la géolocalisation de ces établissements. En supplément, il est possible de consulter le 1er fichier permettant d’obtenir un descriptif des différentes informations contenus dans le dossier.

Le traitement dans Power Bi sera minimaliste. La première étape consiste à importer les différents fichiers CSV. Après import des fichiers, il faut faire attention au typage automatique des colonnes. En effet, pour se faire, Power BI fait un échantillonnage sur les premières colonnes du fichier. Dans le cas des départements, cela pose problème car le type numérique du début de fichier n’est pas conservé sur son intégralité (2A / 2B pour la corse par exemple). Il est donc recommandé de conserver le type alphanumérique pour toutes valeurs qui n’est pas un nombre exploitable. Ceci se fait très facilement en appliquant changeant le type.

Pour le fichier structure, les étapes sont les suivantes :

  1. Source : import initial
  2. Promoted Headers : permet de sélectionner la première ligne comme entête de la table
  3. Changed Type : permet de passer du type numérique à alphanumérique
  4. Merged Queries : permet de faire une jointure entre le référentiel des types de voie et la table structure.

Un autre point à mentionner est que, dans le fichier fournit, le type de voie est donné sous la forme d’un référentiel qui n’est pas fourni. Pour le construire relativement rapidement, il suffit d’utiliser un tableur et de sélectionner l’ensemble des valeurs distincte de la colonne typvoie. Une fois la sélection obtenue, il est possible de créer son propre référentiel après avoir complété l’ensemble des libellés associés.

 

Nous obtenons donc 3 fichiers qu’il est possible le lier par la suite dans l’écran de modélisation.

Un dernier point de détail concerne le widget utilisé pour la localisation des établissements. Celui fonctionne à l’aide des adresses postales. L’inconvénient est quand le fichier fourni, l’adresse est éclaté dans plusieurs champs. Un moyen simple pour contourner ce problème est d’ajouter une colonne calculée à notre table, regroupant l’ensemble des champs devant être joint. On peut voir dans cette formule l’utilisation du référentiel sur le type de voie et l’ajout, en dur, du pays. Le fichier étant localisé par nature, il ne contient pas la notion de pays.

En conclusion, nous obtenons l’ensemble des établissements de santé, géolocalisées, dans des listes filtrables.