{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "# Cours 5 — Rappel et introduction aux dictionnaires pour le marketing digital\n",
        "\n",
        "Ce cours fait un pont entre ce qui a deja ete vu (variables, types, listes, boucles, conditions) et une nouvelle structure essentielle : les dictionnaires (`dict`).\n",
        "\n",
        "### Objectifs de la seance\n",
        "- Consolider les bases vues en cours 1 a 4.\n",
        "- Comprendre ce qu est un dictionnaire (cle -> valeur).\n",
        "- Savoir creer, lire, modifier et enrichir un dictionnaire.\n",
        "- Manipuler une liste de dictionnaires pour representer des campagnes marketing.\n",
        "- Produire un mini reporting lisible et utile."
      ],
      "id": "ffd53c65"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 0. Rappel express des notions deja vues\n",
        "\n",
        "Avant de commencer les dictionnaires, verifie que tu es a l aise avec :\n",
        "- Variables (`budget = 500`)\n",
        "- Types (`int`, `float`, `str`, `bool`)\n",
        "- Listes et indices (`clients[0]`, `len(clients)`)\n",
        "- Boucles `for` et `range`\n",
        "- Conditions `if / elif / else`\n",
        "\n",
        "Dans la cellule suivante, on fait un mini recap en une seule execution."
      ],
      "id": "c5cf7328"
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "# Quick recap: variables, list, loop, condition\n",
        "budget = 600\n",
        "clics = 240\n",
        "conversions = 18\n",
        "\n",
        "canaux = [\"Email\", \"Google Ads\", \"LinkedIn\"]\n",
        "\n",
        "cpc = budget / clics\n",
        "taux_conversion = conversions / clics\n",
        "\n",
        "print(f\"CPC: {cpc:.2f} euros\")\n",
        "print(f\"Taux de conversion: {taux_conversion:.2%}\")\n",
        "\n",
        "for canal in canaux:\n",
        "    print(f\"Canal actif: {canal}\")\n",
        "\n",
        "if taux_conversion >= 0.08:\n",
        "    print(\"Performance: tres bonne\")\n",
        "elif taux_conversion >= 0.05:\n",
        "    print(\"Performance: correcte\")\n",
        "else:\n",
        "    print(\"Performance: a optimiser\")"
      ],
      "execution_count": null,
      "outputs": [],
      "id": "ab5b0291"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "### Exercice 0 — Mini rappel\n",
        "\n",
        "1. Cree 3 variables: `impressions`, `clics`, `conversions`.\n",
        "2. Calcule le `ctr` (`clics / impressions`) et le taux de conversion (`conversions / clics`).\n",
        "3. Affiche un message final avec f-string.\n",
        "\n",
        "Objectif: repartir sur des bases solides avant la nouvelle notion."
      ],
      "id": "6b5fd12c"
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "# TODO — Exercise 0 (recap)\n",
        "pass"
      ],
      "execution_count": null,
      "outputs": [],
      "id": "7ac84142"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 1. Introduction aux dictionnaires (`dict`)\n",
        "\n",
        "Un dictionnaire permet de stocker des donnees avec des **cles explicites**.\n",
        "\n",
        "Exemple mental:\n",
        "- Liste: position 0, position 1, position 2\n",
        "- Dictionnaire: `\"nom\"`, `\"budget\"`, `\"clics\"`, `\"conversions\"`\n",
        "\n",
        "C est tres pratique en marketing, car les champs ont un nom metier lisible."
      ],
      "id": "39632aa2"
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "# Example 1: create a dictionary for one campaign\n",
        "campagne = {\n",
        "    \"nom\": \"Launch Produit A\",\n",
        "    \"canal\": \"Google Ads\",\n",
        "    \"budget\": 1200,\n",
        "    \"clics\": 480,\n",
        "    \"conversions\": 36,\n",
        "}\n",
        "\n",
        "print(campagne)\n",
        "print(f\"Nom: {campagne['nom']}\")\n",
        "print(f\"Budget: {campagne['budget']} euros\")"
      ],
      "execution_count": null,
      "outputs": [],
      "id": "8aa6f401"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "### Exercice 1 — Premier dictionnaire\n",
        "\n",
        "Cree un dictionnaire `campagne_meta` avec les cles:\n",
        "- `nom`\n",
        "- `canal`\n",
        "- `budget`\n",
        "- `clics`\n",
        "- `conversions`\n",
        "\n",
        "Puis affiche:\n",
        "- le nom de campagne\n",
        "- le canal\n",
        "- le budget"
      ],
      "id": "ced48b41"
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "# TODO — Exercise 1\n",
        "pass"
      ],
      "execution_count": null,
      "outputs": [],
      "id": "60fd870d"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 2. Lire, modifier et enrichir un dictionnaire\n",
        "\n",
        "Operations de base:\n",
        "- Lire une valeur: `campagne['budget']`\n",
        "- Modifier une valeur: `campagne['budget'] = 1500`\n",
        "- Ajouter une cle: `campagne['objectif'] = 'Leads'`\n",
        "\n",
        "Astuce: tu peux aussi utiliser `.get('cle', valeur_par_defaut)` pour eviter une erreur si la cle n existe pas."
      ],
      "id": "78994c5e"
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "# Example 2: update and extend a dictionary\n",
        "campagne = {\n",
        "    \"nom\": \"Promo Ete\",\n",
        "    \"budget\": 800,\n",
        "    \"clics\": 200,\n",
        "    \"conversions\": 14,\n",
        "}\n",
        "\n",
        "# Update one value\n",
        "campagne[\"budget\"] = 900\n",
        "\n",
        "# Add a new key\n",
        "campagne[\"objectif\"] = \"Ventes\"\n",
        "\n",
        "print(campagne)\n",
        "print(f\"Objectif: {campagne.get('objectif', 'Non defini')}\")"
      ],
      "execution_count": null,
      "outputs": [],
      "id": "b0645a2e"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "### Exercice 2 — Mise a jour de campagne\n",
        "\n",
        "A partir d un dictionnaire, fais les operations suivantes:\n",
        "1. Mets a jour le budget.\n",
        "2. Ajoute la cle `pays`.\n",
        "3. Ajoute la cle `actif` avec la valeur `True`.\n",
        "4. Affiche une phrase finale avec ces informations."
      ],
      "id": "37e90d8e"
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "# TODO — Exercise 2\n",
        "pass"
      ],
      "execution_count": null,
      "outputs": [],
      "id": "b23af533"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 3. Liste de dictionnaires: modele proche du reel\n",
        "\n",
        "En pratique, on manipule rarement une seule campagne.\n",
        "On utilise plutot une **liste de dictionnaires**:\n",
        "- chaque element de la liste = une campagne\n",
        "- chaque campagne = un dictionnaire de champs metier"
      ],
      "id": "66660019"
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "# Example 3: list of dictionaries\n",
        "campagnes = [\n",
        "    {\"nom\": \"Brand FR\", \"budget\": 1000, \"clics\": 400, \"conversions\": 24},\n",
        "    {\"nom\": \"Acquisition UK\", \"budget\": 1500, \"clics\": 500, \"conversions\": 30},\n",
        "    {\"nom\": \"Retargeting ES\", \"budget\": 700, \"clics\": 280, \"conversions\": 21},\n",
        "]\n",
        "\n",
        "for campagne in campagnes:\n",
        "    cpc = campagne[\"budget\"] / campagne[\"clics\"]\n",
        "    taux_conversion = campagne[\"conversions\"] / campagne[\"clics\"]\n",
        "    print(f\"{campagne['nom']} | CPC={cpc:.2f} euros | Taux conv={taux_conversion:.2%}\")"
      ],
      "execution_count": null,
      "outputs": [],
      "id": "7ae457bb"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "### Exercice 3 — Mini reporting avec dict\n",
        "\n",
        "Cree une liste `campagnes` de 3 dictionnaires.\n",
        "Pour chaque campagne, affiche:\n",
        "- nom\n",
        "- budget\n",
        "- clics\n",
        "- conversions\n",
        "- cpc (arrondi a 2 decimales)\n",
        "- taux de conversion (format %)\n",
        "\n",
        "Bonus: ajoute une classification simple:\n",
        "- `A renforcer` si taux conversion >= 8%\n",
        "- `A optimiser` si entre 5% et 8%\n",
        "- `A revoir` sinon"
      ],
      "id": "69bb6e91"
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "# TODO — Exercise 3\n",
        "pass"
      ],
      "execution_count": null,
      "outputs": [],
      "id": "e8952518"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 4. Corrections proposees\n",
        "\n",
        "Compare tes solutions avec ces propositions.\n",
        "Important: il peut exister plusieurs bonnes reponses."
      ],
      "id": "ef7b4005"
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "# Correction — Exercise 0\n",
        "impressions = 10000\n",
        "clics = 420\n",
        "conversions = 21\n",
        "\n",
        "ctr = clics / impressions\n",
        "taux_conversion = conversions / clics\n",
        "\n",
        "print(f\"CTR: {ctr:.2%} | Taux conversion: {taux_conversion:.2%}\")"
      ],
      "execution_count": null,
      "outputs": [],
      "id": "459fb5c6"
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "# Correction — Exercise 1\n",
        "campagne_meta = {\n",
        "    \"nom\": \"Lead Gen Q2\",\n",
        "    \"canal\": \"LinkedIn\",\n",
        "    \"budget\": 950,\n",
        "    \"clics\": 260,\n",
        "    \"conversions\": 19,\n",
        "}\n",
        "\n",
        "print(f\"Nom: {campagne_meta['nom']}\")\n",
        "print(f\"Canal: {campagne_meta['canal']}\")\n",
        "print(f\"Budget: {campagne_meta['budget']} euros\")"
      ],
      "execution_count": null,
      "outputs": [],
      "id": "a1238896"
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "# Correction — Exercise 2\n",
        "campagne_update = {\n",
        "    \"nom\": \"Traffic Spring\",\n",
        "    \"budget\": 1100,\n",
        "    \"clics\": 390,\n",
        "    \"conversions\": 25,\n",
        "}\n",
        "\n",
        "campagne_update[\"budget\"] = 1250\n",
        "campagne_update[\"pays\"] = \"France\"\n",
        "campagne_update[\"actif\"] = True\n",
        "\n",
        "print(\n",
        "    f\"{campagne_update['nom']} | Budget={campagne_update['budget']} euros | \"\n",
        "    f\"Pays={campagne_update['pays']} | Actif={campagne_update['actif']}\"\n",
        ")"
      ],
      "execution_count": null,
      "outputs": [],
      "id": "f089b379"
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "# Correction — Exercise 3\n",
        "campagnes = [\n",
        "    {\"nom\": \"Campagne A\", \"budget\": 900, \"clics\": 300, \"conversions\": 27},\n",
        "    {\"nom\": \"Campagne B\", \"budget\": 1200, \"clics\": 500, \"conversions\": 20},\n",
        "    {\"nom\": \"Campagne C\", \"budget\": 700, \"clics\": 210, \"conversions\": 8},\n",
        "]\n",
        "\n",
        "for campagne in campagnes:\n",
        "    cpc = campagne[\"budget\"] / campagne[\"clics\"]\n",
        "    taux_conversion = campagne[\"conversions\"] / campagne[\"clics\"]\n",
        "\n",
        "    if taux_conversion >= 0.08:\n",
        "        segment = \"A renforcer\"\n",
        "    elif taux_conversion >= 0.05:\n",
        "        segment = \"A optimiser\"\n",
        "    else:\n",
        "        segment = \"A revoir\"\n",
        "\n",
        "    print(\n",
        "        f\"{campagne['nom']} | Budget={campagne['budget']} | Clics={campagne['clics']} | \"\n",
        "        f\"Conversions={campagne['conversions']} | CPC={cpc:.2f} euros | \"\n",
        "        f\"Taux conv={taux_conversion:.2%} | Segment={segment}\"\n",
        "    )"
      ],
      "execution_count": null,
      "outputs": [],
      "id": "885d2d33"
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "## 5. Mini defi de fin de seance\n",
        "\n",
        "Cree une liste de 5 campagnes (dictionnaires) et affiche la meilleure campagne selon le score:\n",
        "\n",
        "`score = (conversions / clics) * 100 - (budget / clics)`\n",
        "\n",
        "Contraintes:\n",
        "- gerer le cas `clics = 0`\n",
        "- afficher le score de chaque campagne\n",
        "- afficher le top 1 final"
      ],
      "id": "0be25340"
    },
    {
      "cell_type": "code",
      "metadata": {},
      "source": [
        "# TODO — Mini challenge\n",
        "pass"
      ],
      "execution_count": null,
      "outputs": [],
      "id": "9ac2bd55"
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3.11"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 5
}