Aller au contenu principal

Workflows data avec Code Interpreter

Workflows data avec Code Interpreter

Code Interpreter prend toute sa dimension dans les workflows complets : import de donnees, nettoyage, analyse, visualisation et export. Cette lecon assemble les pieces vues precedemment en pipelines de bout en bout.

Workflow 1 : rapport financier automatise

from openai import OpenAI

client = OpenAI()

# Upload des fichiers sources
fichiers = {}
for nom in ["revenus_2025.xlsx", "depenses_2025.xlsx", "budget_previsionnel.xlsx"]:
    with open(nom, "rb") as f:
        fichier = client.files.create(file=f, purpose="assistants")
        fichiers[nom] = fichier.id

content = [
    {"type": "text", "text": (
        "Genere un rapport financier complet a partir de ces 3 fichiers : "
        "1. SYNTHESE : CA total, marge brute, resultat net "
        "2. ANALYSE MENSUELLE : evolution mois par mois avec variations "
        "3. ECARTS BUDGET : comparaison reel vs previsionnel, ecarts significatifs "
        "4. GRAPHIQUES : "
        "   - Evolution CA et depenses (double axe) "
        "   - Waterfall des ecarts budgetaires "
        "   - Repartition des depenses par categorie "
        "5. EXPORT : fichier Excel avec un onglet par section"
    )}
]
for fid in fichiers.values():
    content.append({"type": "input_file", "file_id": fid})

response = client.responses.create(
    model="gpt-5.3",
    input=[{"role": "user", "content": content}],
    tools=[{"type": "code_interpreter"}],
    instructions=(
        "Produis un rapport professionnel. "
        "Affiche les chiffres avec separateurs de milliers. "
        "Utilise le format europeen (virgule decimale). "
        "Commente chaque ecart significatif (> 5%)."
    )
)

# Recuperer tous les fichiers generes
for item in response.output:
    if item.type == "code_interpreter_call":
        for result in item.results:
            if hasattr(result, "files"):
                for f in result.files:
                    contenu = client.files.content(f.file_id)
                    with open(f"sortie_{f.name}", "wb") as out:
                        out.write(contenu.read())
                    print(f"Genere : {f.name}")

Workflow 2 : analyse de cohortes

with open("utilisateurs.csv", "rb") as f:
    fichier = client.files.create(file=f, purpose="assistants")

response = client.responses.create(
    model="gpt-5.3",
    input=[{
        "role": "user",
        "content": [
            {"type": "text", "text": (
                "Effectue une analyse de cohortes sur ces donnees utilisateurs : "
                "1. Definis les cohortes par mois d'inscription "
                "2. Calcule le taux de retention par cohorte (mois 1, 2, ..., 12) "
                "3. Cree une heatmap de retention "
                "4. Identifie la cohorte avec la meilleure retention "
                "5. Calcule la LTV estimee par cohorte "
                "6. Exporte le tableau de retention en CSV"
            )},
            {"type": "input_file", "file_id": fichier.id}
        ]
    }],
    tools=[{"type": "code_interpreter"}],
    instructions=(
        "Montre le code etape par etape. "
        "Affiche les resultats intermediaires. "
        "Pour la heatmap, utilise une palette verte (sombre = bon, clair = faible). "
        "Annote chaque cellule avec le pourcentage."
    )
)

Workflow 3 : scoring et segmentation

def segmenter_clients(fichier_path: str) -> dict:
    """Segmente les clients avec RFM et clustering."""
    with open(fichier_path, "rb") as f:
        fichier = client.files.create(file=f, purpose="assistants")

    response = client.responses.create(
        model="gpt-5.3",
        input=[{
            "role": "user",
            "content": [
                {"type": "text", "text": (
                    "Realise une segmentation client RFM : "
                    "1. Calcule Recency, Frequency, Monetary pour chaque client "
                    "2. Attribue un score RFM de 1 a 5 pour chaque dimension "
                    "3. Cree des segments : Champions, Loyaux, A risque, Perdus "
                    "4. Applique K-Means (k=4 a 8, choisis le meilleur k avec elbow) "
                    "5. Visualise les segments en 2D (PCA ou t-SNE) "
                    "6. Profil de chaque segment : taille, CA moyen, frequence "
                    "7. Exporte : CSV avec segment par client + rapport PDF-like"
                )},
                {"type": "input_file", "file_id": fichier.id}
            ]
        }],
        tools=[{"type": "code_interpreter"}],
        instructions=(
            "Utilise sklearn pour le clustering. "
            "Normalise les variables avant le clustering. "
            "Affiche le graphique elbow pour justifier le choix de k. "
            "Cree un radar chart par segment."
        )
    )

    fichiers_sortie = []
    for item in response.output:
        if item.type == "code_interpreter_call":
            for result in item.results:
                if hasattr(result, "files"):
                    for f in result.files:
                        contenu = client.files.content(f.file_id)
                        with open(f.name, "wb") as out:
                            out.write(contenu.read())
                        fichiers_sortie.append(f.name)

    return {
        "analyse": response.output_text,
        "fichiers": fichiers_sortie
    }

Workflow 4 : previsions et tendances

response = client.responses.create(
    model="gpt-5.3",
    input=[{
        "role": "user",
        "content": [
            {"type": "text", "text": (
                "A partir de ces donnees de ventes mensuelles : "
                "1. Decompose la serie temporelle (tendance, saisonnalite, residu) "
                "2. Applique un lissage exponentiel (Holt-Winters) "
                "3. Prevois les 6 prochains mois avec intervalle de confiance 95% "
                "4. Compare avec une regression lineaire simple "
                "5. Genere un graphique avec historique + previsions "
                "6. Calcule les metriques d'erreur (MAE, RMSE, MAPE)"
            )},
            {"type": "input_file", "file_id": fichier.id}
        ]
    }],
    tools=[{"type": "code_interpreter"}],
    instructions=(
        "Utilise statsmodels pour la decomposition et les previsions. "
        "Colorie l'intervalle de confiance en bleu transparent. "
        "Marque clairement la separation historique/previsions."
    )
)

Orchestrer un workflow multi-etapes

Pour les workflows complexes, decoupez en etapes avec passage de fichiers :

class WorkflowData:
    def __init__(self):
        self.client = OpenAI()
        self.fichiers_intermediaires = []

    def etape(self, instruction: str, fichiers_ids: list[str] = None) -> str:
        """Execute une etape du workflow."""
        if fichiers_ids is None:
            fichiers_ids = [f for f in self.fichiers_intermediaires[-3:]]

        content = [{"type": "text", "text": instruction}]
        for fid in fichiers_ids:
            content.append({"type": "input_file", "file_id": fid})

        response = self.client.responses.create(
            model="gpt-5.3",
            input=[{"role": "user", "content": content}],
            tools=[{"type": "code_interpreter"}]
        )

        # Capturer les fichiers generes
        for item in response.output:
            if item.type == "code_interpreter_call":
                for result in item.results:
                    if hasattr(result, "files"):
                        for f in result.files:
                            self.fichiers_intermediaires.append(f.file_id)

        return response.output_text

    def telecharger_resultats(self, dossier_sortie: str):
        """Telecharge tous les fichiers generes."""
        import os
        os.makedirs(dossier_sortie, exist_ok=True)
        for fid in self.fichiers_intermediaires:
            try:
                contenu = self.client.files.content(fid)
                chemin = os.path.join(dossier_sortie, f"{fid}.bin")
                with open(chemin, "wb") as out:
                    out.write(contenu.read())
            except Exception:
                pass

# Utilisation
wf = WorkflowData()

# Etape 1 : import et nettoyage
with open("donnees_brutes.csv", "rb") as f:
    fichier = client.files.create(file=f, purpose="assistants")

wf.etape(
    "Nettoie ce CSV : supprime doublons, gere les valeurs manquantes, "
    "normalise les types. Exporte le resultat.",
    [fichier.id]
)

# Etape 2 : analyse
wf.etape("Calcule les KPIs principaux et identifie les tendances.")

# Etape 3 : visualisation
wf.etape("Cree 4 graphiques cles pour un rapport de direction.")

# Etape 4 : export
wf.etape("Compile tout dans un fichier Excel avec onglets et graphiques integres.")

wf.telecharger_resultats("./sortie_workflow/")

Points cles a retenir

  • Decoupez les workflows complexes en etapes avec passage de fichiers
  • Utilisez des instructions detaillees pour chaque etape
  • Le modele gere nativement les analyses statistiques et le machine learning basique
  • Recuperez systematiquement les fichiers intermediaires pour la tracabilite
  • Combinez analyse de donnees et visualisation dans un meme appel pour des rapports complets