{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":31254,"databundleVersionId":3103714,"sourceType":"competition"}],"dockerImageVersionId":30822,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"#Haifa version finale\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nimport os","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:31:40.627512Z","iopub.execute_input":"2025-01-24T11:31:40.627942Z","iopub.status.idle":"2025-01-24T11:31:40.633189Z","shell.execute_reply.started":"2025-01-24T11:31:40.627901Z","shell.execute_reply":"2025-01-24T11:31:40.63174Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Importation des données**\n","metadata":{}},{"cell_type":"code","source":"df_a = pd.read_csv('/kaggle/input/h-and-m-personalized-fashion-recommendations/articles.csv')\ndf_c = pd.read_csv('/kaggle/input/h-and-m-personalized-fashion-recommendations/customers.csv')\npf_s = pd.read_csv('/kaggle/input/h-and-m-personalized-fashion-recommendations/sample_submission.csv')\npf_t = pd.read_csv('/kaggle/input/h-and-m-personalized-fashion-recommendations/transactions_train.csv')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:31:44.626717Z","iopub.execute_input":"2025-01-24T11:31:44.62716Z","iopub.status.idle":"2025-01-24T11:33:12.008578Z","shell.execute_reply.started":"2025-01-24T11:31:44.627096Z","shell.execute_reply":"2025-01-24T11:33:12.007467Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"\n\n**Exploration des données**\n","metadata":{}},{"cell_type":"code","source":"#Information sur les données des articles\nprint(df_a.info())\n# Calculer le nombre de lignes des articles\nnombre_de_lignes = len(df_a) \nprint(\"Nombre de lignes :\", nombre_de_lignes)\nprint(df_a.describe())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T17:54:55.687179Z","iopub.execute_input":"2025-01-15T17:54:55.687481Z","iopub.status.idle":"2025-01-15T17:54:55.773277Z","shell.execute_reply.started":"2025-01-15T17:54:55.687456Z","shell.execute_reply":"2025-01-15T17:54:55.771962Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(df_a.head(5))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T17:54:55.860121Z","iopub.execute_input":"2025-01-15T17:54:55.860395Z","iopub.status.idle":"2025-01-15T17:54:55.87329Z","shell.execute_reply.started":"2025-01-15T17:54:55.86037Z","shell.execute_reply":"2025-01-15T17:54:55.872062Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Information sur les données des clients\ndf_c.info()\nprint(df_c.describe())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T17:54:55.876453Z","iopub.execute_input":"2025-01-15T17:54:55.876854Z","iopub.status.idle":"2025-01-15T17:54:56.193451Z","shell.execute_reply.started":"2025-01-15T17:54:55.876797Z","shell.execute_reply":"2025-01-15T17:54:56.192331Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_c.head(10)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T17:54:56.482351Z","iopub.execute_input":"2025-01-15T17:54:56.482703Z","iopub.status.idle":"2025-01-15T17:54:56.497404Z","shell.execute_reply.started":"2025-01-15T17:54:56.482672Z","shell.execute_reply":"2025-01-15T17:54:56.496262Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\npf_s.info()\npf_s.head(5)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T17:54:56.498549Z","iopub.execute_input":"2025-01-15T17:54:56.499018Z","iopub.status.idle":"2025-01-15T17:54:56.660231Z","shell.execute_reply.started":"2025-01-15T17:54:56.498979Z","shell.execute_reply":"2025-01-15T17:54:56.658911Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#Information sur les données des transactions\npf_t.info()\npf_t.head(5)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T17:54:56.661378Z","iopub.execute_input":"2025-01-15T17:54:56.66171Z","iopub.status.idle":"2025-01-15T17:54:56.678203Z","shell.execute_reply.started":"2025-01-15T17:54:56.661677Z","shell.execute_reply":"2025-01-15T17:54:56.676776Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Les valeurs manquantes et l'imputation**\n","metadata":{}},{"cell_type":"code","source":"# Trouver les colonnes contenant des valeurs nulles dans dataframe des articles\ncols_with_nulls = df_a.columns[df_a.isnull().any()] \n# Afficher les colonnes avec des valeurs nulles \nprint(\"Colonnes contenant des valeurs nulles dans df_a :\") \nprint(cols_with_nulls)\n# On a remplacé les valeurs nulles par une chaîne de caractères,  'Valeur Manquante'\ndf_a['detail_desc'].fillna('Valeur Manquante', inplace=True)\n# Afficher le DataFrame après le remplacement\nprint(\"DataFrame après remplacement des valeurs nulles :\")\nprint(df_a.head(10))\n# Trouver les colonnes contenant des valeurs nulles dans la dataframe des clients\ncols_with_nulls = df_c.columns[df_c.isnull().any()] \n# Afficher les colonnes avec des valeurs nulles \nprint(\"Colonnes contenant des valeurs nulles dans customers :\") \nprint(cols_with_nulls)\nvaleurs_distinctes = df_c['FN'].unique() \nprint(\"Valeurs distinctes dans la colonne 'fn' :\") \nprint(valeurs_distinctes)\n#remplacer les valeur null par 0 , colonne FN\ndf_c['FN'].fillna(0, inplace=True)\nvaleurs_dis_active= df_c['Active'].unique()\nprint(valeurs_dis_active)\ndf_c['Active'] = 1\nvaleurs_dis_club= df_c['club_member_status'].unique()\nprint(valeurs_dis_club)\nvaleurs_dis_club_counts = df_c['club_member_status'].value_counts() \n# Afficher les valeurs distinctes et leur nombre \nprint(\"Nombre de chaque valeur distincte dans la colonne 'club_member_status' :\") \nprint(valeurs_dis_club_counts)\ndf_c['club_member_status'].fillna('PRE-CREATE', inplace=True)\ndf_c.head(10)\nvaleurs_dis_fashion_counts = df_c['fashion_news_frequency'].value_counts() \n# Afficher les valeurs distinctes et leur nombre \nprint(\"Nombre de chaque valeur distincte dans la colonne 'fashion_news_frequency' :\") \nprint(valeurs_dis_fashion_counts)\ndf_c['fashion_news_frequency'].fillna('NONE', inplace=True)\ndf_c.head(10)\n# Calculer la moyenne des âges, en ignorant les valeurs nulles\nmoyenne_age = df_c['age'].mean() \n# Remplacer les valeurs nulles dans la colonne 'age' par la moyenne calculée \ndf_c['age'].fillna(moyenne_age, inplace=True)\n# Trouver les colonnes contenant des valeurs nulles dans la dataframe des transactions\ncols_with_nulls = pf_t.columns[pf_t.isnull().any()] \n# Afficher les colonnes avec des valeurs nulles \nprint(\"Colonnes contenant des valeurs nulles dans transactions_train :\") \nprint(cols_with_nulls)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:33:23.331781Z","iopub.execute_input":"2025-01-24T11:33:23.332173Z","iopub.status.idle":"2025-01-24T11:33:27.215395Z","shell.execute_reply.started":"2025-01-24T11:33:23.332143Z","shell.execute_reply":"2025-01-24T11:33:27.214251Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#suppression de l'index 0\npf_t = pf_t.drop(index=0)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:05:53.764906Z","iopub.execute_input":"2025-01-24T11:05:53.765319Z","iopub.status.idle":"2025-01-24T11:05:57.245224Z","shell.execute_reply.started":"2025-01-24T11:05:53.765284Z","shell.execute_reply":"2025-01-24T11:05:57.244084Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Visualisation** \n","metadata":{}},{"cell_type":"markdown","source":"**La majorité de la clientéle est entre 20 et 29**","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n#  les tranches d'âge\ndef tranche_age(age):\n    if age < 20:\n        return 'Moins de 20 ans'\n    elif 20 <= age < 30:\n        return '20-29 ans'\n    elif 30 <= age < 40:\n        return '30-39 ans'\n    elif 40 <= age < 50:\n        return '40-49 ans'\n    elif 50 <= age < 60:\n        return '50-59 ans'\n    else:\n        return '60 ans et plus'\n\ndf_c['tranche_age'] = df_c['age'].apply(tranche_age)\n\n# Compter le nombre d'achats par tranche d'âge\nachats_par_tranche = df_c['tranche_age'].value_counts()\n\n# Afficher les résultats\nprint(\"Nombre d'achats par tranche d'âge :\")\nprint(achats_par_tranche)\n\n# Visualiser les résultats\nachats_par_tranche.plot(kind='bar', color='pink', title='Nombre d\\'achats par tranche d\\'âge')\nplt.xlabel('Tranche d\\'âge')\nplt.ylabel('Nombre d\\'achats')\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T09:22:32.880613Z","iopub.execute_input":"2025-01-24T09:22:32.881026Z","iopub.status.idle":"2025-01-24T09:22:33.85185Z","shell.execute_reply.started":"2025-01-24T09:22:32.880997Z","shell.execute_reply":"2025-01-24T09:22:33.850313Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import seaborn as sns\nimport matplotlib.pyplot as plt","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:06:59.837537Z","iopub.execute_input":"2025-01-24T11:06:59.83802Z","iopub.status.idle":"2025-01-24T11:06:59.844583Z","shell.execute_reply.started":"2025-01-24T11:06:59.837979Z","shell.execute_reply":"2025-01-24T11:06:59.843391Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\npf_t['t_dat'] = pd.to_datetime(pf_t['t_dat'])\n\n# Créer une nouvelle colonne 'mois' contenant le mois et l'année au format 'YYYY-MM'\npf_t['mois'] = pf_t['t_dat'].dt.strftime('%Y-%m')\n\n# Afficher le DataFrame après l'ajout de la nouvelle colonne\nprint(\"DataFrame après l'ajout de la colonne 'mois' :\")\nprint(pf_t.head(5))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:07:03.303955Z","iopub.execute_input":"2025-01-24T11:07:03.304357Z","iopub.status.idle":"2025-01-24T11:09:32.623061Z","shell.execute_reply.started":"2025-01-24T11:07:03.304326Z","shell.execute_reply":"2025-01-24T11:09:32.621446Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Visualisation des transactions : Il est évident qu'elle est non stationnaire.\nimport matplotlib.pyplot as plt\n\n# Grouper les données par 'mois' et calculer la moyenne des prix pour chaque mois\nmoyenne_prix_par_mois = pf_t.groupby('mois')['price'].mean()\n\n# Visualiser la saisonnalité des prix\nplt.figure(figsize=(10, 6))\nplt.plot(moyenne_prix_par_mois, marker='o', linestyle='-', color='g')\nplt.title('Saisonnalité des Prix')\nplt.xlabel('Mois')\nplt.ylabel('Prix Moyen')\nplt.grid(True)\nplt.xticks(rotation=45)\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:09:32.624633Z","iopub.execute_input":"2025-01-24T11:09:32.624996Z","iopub.status.idle":"2025-01-24T11:09:37.679947Z","shell.execute_reply.started":"2025-01-24T11:09:32.624957Z","shell.execute_reply":"2025-01-24T11:09:37.678572Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Analyse des achats en fonction des jours de la semaine**","metadata":{}},{"cell_type":"code","source":"# Extraire le jour de la semaine (0 = Lundi, 6 = Dimanche)\npf_t['day_of_week'] = pf_t['t_dat'].dt.dayofweek\n\n# Comptage des achats par jour de la semaine\nday_of_week_purchase_counts = pf_t['day_of_week'].value_counts().sort_index()\n\n# Visualisation des achats par jour de la semaine\nplt.figure(figsize=(10, 6))\nsns.barplot(x=day_of_week_purchase_counts.index, y=day_of_week_purchase_counts.values, palette='magma')\nplt.title('Répartition des achats par jour de la semaine')\nplt.xlabel('Jour de la semaine')\nplt.ylabel('Nombre d\\'achats')\nplt.xticks([0, 1, 2, 3, 4, 5, 6], ['Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam', 'Dim'])\nplt.show()\n\n# Conclusion : Afficher les jours de la semaine les plus actifs\nprint(\"Répartition des achats par jour de la semaine :\")\nprint(day_of_week_purchase_counts)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:16:32.837478Z","iopub.execute_input":"2025-01-24T11:16:32.837944Z","iopub.status.idle":"2025-01-24T11:16:34.414818Z","shell.execute_reply.started":"2025-01-24T11:16:32.837909Z","shell.execute_reply":"2025-01-24T11:16:34.413671Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Top 10 des consommateurs par total des dépenses**","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n# Grouper les données par 'id_consumer' et calculer la somme des 'price'\ntotal_spending = pf_t.groupby('customer_id')['price'].sum()\n\n# Trier par ordre décroissant des totaux dépensés\ntotal_spending_sorted = total_spending.sort_values(ascending=False)\n\n# Sélectionner les 10 meilleurs consommateurs\ntop_10_consumers = total_spending_sorted.head(10)\n\n# Afficher le résultat\nprint(\"Top 10 des consommateurs par total des dépenses :\")\nprint(top_10_consumers)\n# Visualiser les top 10 consommateurs dans un diagramme en barres\nplt.figure(figsize=(10, 6))\ntop_10_consumers.plot(kind='bar', color='pink')\nplt.title('Top 10 des Consommateurs par Total des Dépenses')\nplt.xlabel('ID du Consommateur')\nplt.ylabel('Total des Dépenses')\nplt.grid(True)\nplt.xticks(rotation=45)\nplt.tight_layout()\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T09:26:16.96899Z","iopub.execute_input":"2025-01-24T09:26:16.969395Z","iopub.status.idle":"2025-01-24T09:26:29.25417Z","shell.execute_reply.started":"2025-01-24T09:26:16.96936Z","shell.execute_reply":"2025-01-24T09:26:29.252988Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":" **Analyse de la répartition des achats par type de client (nouveaux vs clients réguliers)**","metadata":{}},{"cell_type":"code","source":"# Identifier les nouveaux clients\nfirst_purchase_date = pf_t.groupby('customer_id')['t_dat'].min()\nrecent_date = pf_t['t_dat'].max()\nnew_customers = first_purchase_date[first_purchase_date == recent_date].index\n\n# Créer un indicateur pour les pf_t réguliers et nouveaux\npf_t['customer_type'] = pf_t['customer_id'].apply(lambda x: 'New' if x in new_customers else 'Regular')\n\n# Nombre d'achats par type de client\ncustomer_type_purchase_counts = pf_t['customer_type'].value_counts()\n\n# Visualisation des achats par type de client\nplt.figure(figsize=(10, 6))\nsns.barplot(x=customer_type_purchase_counts.index, y=customer_type_purchase_counts.values, palette='pastel')\nplt.title('Répartition des achats par type de client')\nplt.xlabel('Type de client')\nplt.ylabel('Nombre d\\'achats')\nplt.show()\n\n# Conclusion : Afficher la répartition des achats entre clients nouveaux et réguliers\nprint(\"Répartition des achats par type de client :\")\nprint(customer_type_purchase_counts)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T09:26:51.499397Z","iopub.execute_input":"2025-01-24T09:26:51.499756Z","iopub.status.idle":"2025-01-24T09:27:43.402823Z","shell.execute_reply.started":"2025-01-24T09:26:51.499719Z","shell.execute_reply":"2025-01-24T09:27:43.401677Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Analyse des clients ayant fait des achats récents**","metadata":{}},{"cell_type":"code","source":"# Convertir la date de transaction en format datetime\npf_t['t_dat'] = pd.to_datetime(pf_t['t_dat'])\n\n# Trouver la date la plus récente dans les transactions\nrecent_date = pf_t['t_dat'].max()\n\n# Calculer le nombre de clients ayant effectué un achat après une certaine période\nrecent_transactions = pf_t[pf_t['t_dat'] == recent_date]\nrecent_customers = recent_transactions['customer_id'].nunique()\n\nprint(f\"Nombre de clients ayant effectué des achats récemment ({recent_date}): {recent_customers}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T09:28:16.458001Z","iopub.execute_input":"2025-01-24T09:28:16.458372Z","iopub.status.idle":"2025-01-24T09:28:17.405178Z","shell.execute_reply.started":"2025-01-24T09:28:16.458343Z","shell.execute_reply":"2025-01-24T09:28:17.404086Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Client par zone/ code postal**","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nfrom sklearn.cluster import KMeans\nimport matplotlib.pyplot as plt\n\n\n# Créer une colonne avec des codes postaux uniques\nunique_postal_codes = {code: idx for idx, code in enumerate(df_c['postal_code'].unique())}\ndf_c['postal_code_int'] = df_c['postal_code'].map(unique_postal_codes)\n\n# Vérifier le DataFrame après ajout de la nouvelle colonne\nprint(\"DataFrame avec colonne 'postal_code_int' :\")\ndf_c.head(10)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T09:28:29.244015Z","iopub.execute_input":"2025-01-24T09:28:29.244413Z","iopub.status.idle":"2025-01-24T09:28:31.281767Z","shell.execute_reply.started":"2025-01-24T09:28:29.244381Z","shell.execute_reply":"2025-01-24T09:28:31.280798Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"valeurs_uniques = df_c['postal_code_int'].unique() \nprint(\"Valeurs distinctes de la colonne 'postal_code_int' :\") \nprint(valeurs_uniques)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T09:28:38.56152Z","iopub.execute_input":"2025-01-24T09:28:38.561915Z","iopub.status.idle":"2025-01-24T09:28:38.592305Z","shell.execute_reply.started":"2025-01-24T09:28:38.561884Z","shell.execute_reply":"2025-01-24T09:28:38.591254Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"compte_postal_code_int = df_c['postal_code_int'].value_counts() >100\nprint(\"Nombre de lignes pour chaque 'postal_code_int' :\") \nprint(compte_postal_code_int)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T09:28:42.415436Z","iopub.execute_input":"2025-01-24T09:28:42.415779Z","iopub.status.idle":"2025-01-24T09:28:42.477629Z","shell.execute_reply.started":"2025-01-24T09:28:42.415753Z","shell.execute_reply":"2025-01-24T09:28:42.476709Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nfrom sklearn.cluster import KMeans\nimport matplotlib.pyplot as plt\n\n# Compter le nombre de lignes pour chaque 'postal_code_int'\ncompte_postal_code_int = df_c['postal_code_int'].value_counts()\n\n# Filtrer les 'postal_code_int' qui se répètent plus de 1000 fois\npostal_codes_frequent = compte_postal_code_int[compte_postal_code_int > 100].index\n\n# Filtrer le DataFrame pour ne conserver que les lignes avec 'postal_code_int' fréquent\ndf_filtered = df_c[df_c['postal_code_int'].isin(postal_codes_frequent)]\n\n# Vérifier le DataFrame filtré\nprint(\"DataFrame filtré :\")\n#print(df_filtered)\n\n# Appliquer K-Means clustering sur les données filtrées\nkmeans = KMeans(n_clusters=5, random_state=0)  #  5 clusters\ndf_filtered['cluster'] = kmeans.fit_predict(df_filtered[['postal_code_int']])\n\n# Afficher le résultat du clustering\nprint(\"Cluster assigné à chaque client (pour les 'postal_code_int' fréquents) :\")\nprint(df_filtered[['postal_code_int', 'cluster']].head(10))\n\n# Visualiser les clusters\nplt.figure(figsize=(10, 6))\nplt.scatter(df_filtered['postal_code_int'], df_filtered['cluster'], c=df_filtered['cluster'], cmap='viridis', marker='o')\nplt.title('Clusters de Clients par Code Postal Int Fréquent')\nplt.xlabel('Code Postal (Int)')\nplt.ylabel('Cluster')\nplt.grid(True)\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T09:28:54.002972Z","iopub.execute_input":"2025-01-24T09:28:54.003393Z","iopub.status.idle":"2025-01-24T09:28:56.678762Z","shell.execute_reply.started":"2025-01-24T09:28:54.003358Z","shell.execute_reply":"2025-01-24T09:28:56.677784Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Les articles les plus vendus **","metadata":{}},{"cell_type":"code","source":"# Comptage des articles les plus populaires\narticle_counts = pf_t['article_id'].value_counts()\n\n# Visualisation des 10 articles les plus populaires\ntop_articles = article_counts.head(10)\n\nplt.figure(figsize=(10,6))\nsns.barplot(x=top_articles.index, y=top_articles.values, palette='plasma')\nplt.title(\"Top 10 des articles les plus populaires\")\nplt.xlabel('Article ID')\nplt.ylabel('Nombre d\\'achats')\nplt.show()\n\n# Conclusion: Afficher les IDs des 10 articles les plus populaires\nprint(\"Les 10 articles les plus populaires sont :\")\nprint(top_articles)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T09:29:17.761686Z","iopub.execute_input":"2025-01-24T09:29:17.76204Z","iopub.status.idle":"2025-01-24T09:29:19.488478Z","shell.execute_reply.started":"2025-01-24T09:29:17.762009Z","shell.execute_reply":"2025-01-24T09:29:19.487375Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Les articles les plus vendus par couleur**","metadata":{}},{"cell_type":"code","source":"\n# Jointure des DataFrames sur la colonne 'article_id'\ndf_merged = pd.merge(pf_t, df_a, on='article_id')\n\n# Compter les occurrences de chaque 'colour_group_name'\ncolour_counts = df_merged['colour_group_name'].value_counts()\n\n# Afficher les résultats triés\nprint(\"Les 'colour_group_name' les plus vendus :\")\nprint(colour_counts)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T09:29:40.708888Z","iopub.execute_input":"2025-01-24T09:29:40.709267Z","iopub.status.idle":"2025-01-24T09:30:46.890302Z","shell.execute_reply.started":"2025-01-24T09:29:40.709238Z","shell.execute_reply":"2025-01-24T09:30:46.888604Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Analyse de la répartition des achats par catégories d'articles**","metadata":{}},{"cell_type":"code","source":"# Comptage des articles par catégorie dans le magasin\ncategory_counts = df_a['product_group_name'].value_counts()\n\n# Visualisation des catégories d'articles les plus populaires\nplt.figure(figsize=(10, 6))\nsns.barplot(x=category_counts.index, y=category_counts.values, palette='viridis')\nplt.title('Répartition des articles par catégorie')\nplt.xlabel('Catégorie d\\'article')\nplt.ylabel('Nombre d\\'articles')\nplt.xticks(rotation=45)\nplt.show()\n\n# Conclusion : Afficher les catégories d'articles les plus populaires\nprint(\"Les 5 catégories d'articles les plus populaires sont :\")\nprint(category_counts.head(5))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T09:31:05.683089Z","iopub.execute_input":"2025-01-24T09:31:05.683477Z","iopub.status.idle":"2025-01-24T09:31:06.037091Z","shell.execute_reply.started":"2025-01-24T09:31:05.683448Z","shell.execute_reply":"2025-01-24T09:31:06.036008Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Les articles les plus vendus par:  couleur et par produit**","metadata":{}},{"cell_type":"code","source":"\n# Compter les occurrences de chaque combinaison 'colour_group_name' et 'product_type_name'\nclassification_counts = df_merged.groupby(['colour_group_name', 'product_type_name']).size().reset_index(name='counts')\n\n# Trier les résultats par nombre d'occurrences\nclassification_counts = classification_counts.sort_values(by='counts', ascending=False)\n\n# Afficher les résultats triés\nprint(\"Classification par 'colour_group_name' et 'product_type_name' :\")\nprint(classification_counts)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T09:31:21.459853Z","iopub.execute_input":"2025-01-24T09:31:21.46028Z","iopub.status.idle":"2025-01-24T09:31:27.294144Z","shell.execute_reply.started":"2025-01-24T09:31:21.460245Z","shell.execute_reply":"2025-01-24T09:31:27.293138Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Les 100 articles les plus vendus par:  couleur et par produit**","metadata":{}},{"cell_type":"code","source":"#######################Les PlUS Vendu\nimport matplotlib.pyplot as plt\n# Jointure des DataFrames sur la colonne 'article_id' \ndf_merged = pd.merge(pf_t, df_a, on='article_id') \n# Compter les occurrences de chaque combinaison 'colour_group_name' et 'product_type_name' \nclassification_counts = df_merged.groupby(['colour_group_name', 'product_type_name']).size().reset_index(name='counts') \n# Trier les résultats par nombre d'occurrences \nclassification_counts = classification_counts.sort_values(by='counts', ascending=False) \n# Filtrer pour les 100 articles les plus vendus \ntop_100_classification_counts = classification_counts.head(50) \n# Afficher les résultats triés \nprint(\"Classification par 'colour_group_name' et 'product_type_name' (Top 100) :\") \nprint(top_100_classification_counts) \n# Visualiser les résultats avec un graphique en barres \nplt.figure(figsize=(12, 6)) \nplt.barh(top_100_classification_counts['colour_group_name'] + ' - ' + top_100_classification_counts['product_type_name'], top_100_classification_counts['counts'], color='skyblue') \nplt.xlabel('Nombre de Ventes') \nplt.ylabel('Couleur - Type de Produit') \nplt.title('Classement des Couleurs et Types de Produits les Plus Vendus (Top 100)') \nplt.gca().invert_yaxis() \n# Inverser l'axe y pour que les plus vendus soient en haut \nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T09:31:37.392277Z","iopub.execute_input":"2025-01-24T09:31:37.392661Z","iopub.status.idle":"2025-01-24T09:32:52.576069Z","shell.execute_reply.started":"2025-01-24T09:31:37.392632Z","shell.execute_reply":"2025-01-24T09:32:52.574888Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Les articles les Moins vendus par:  couleur et par produit**","metadata":{}},{"cell_type":"code","source":"####################\"\"Les MOINS Vendu\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\n\n# Jointure des DataFrames sur la colonne 'article_id'\ndf_merged = pd.merge(pf_t, df_a, on='article_id')\n\n# Compter les occurrences de chaque combinaison 'colour_group_name' et 'product_type_name'\nclassification_counts = df_merged.groupby(['colour_group_name', 'product_type_name']).size().reset_index(name='counts')\n\n# Trier les résultats par nombre d'occurrences\nclassification_counts = classification_counts.sort_values(by='counts', ascending=True)  # Trier par ordre croissant\n\n# Filtrer pour les 50 articles les moins vendus\nbottom_50_classification_counts = classification_counts.head(10)\n\n# Afficher les résultats triés\nprint(\"Classification par 'colour_group_name' et 'product_type_name' (Les 10 moins vendus) :\")\nprint(bottom_50_classification_counts)\n\n# Visualiser les résultats avec un graphique en barres\nplt.figure(figsize=(12, 6))\nplt.barh(bottom_50_classification_counts['colour_group_name'] + ' - ' + bottom_50_classification_counts['product_type_name'], bottom_50_classification_counts['counts'], color='skyblue')\nplt.xlabel('Nombre de Ventes')\nplt.ylabel('Couleur - Type de Produit')\nplt.title('Classement des Couleurs et Types de Produits les Moins Vendus (Top 50)')\nplt.gca().invert_yaxis()  # Inverser l'axe y pour que les moins vendus soient en haut\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T09:33:13.79506Z","iopub.execute_input":"2025-01-24T09:33:13.795449Z","iopub.status.idle":"2025-01-24T09:34:22.922265Z","shell.execute_reply.started":"2025-01-24T09:33:13.795419Z","shell.execute_reply":"2025-01-24T09:34:22.921222Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Distribution des valeurs dans certaines colonnes**","metadata":{}},{"cell_type":"code","source":"# Histogramme de la distribution des prix des articles\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nplt.figure(figsize=(10, 6))\nsns.histplot(pf_t['price'], kde=True, bins=50)\nplt.title('Distribution des prix des articles')\nplt.xlabel('Prix')\nplt.ylabel('Fréquence')\nplt.show()\n\n# Histogramme du nombre d'articles achetés par transaction\nplt.figure(figsize=(10, 6))\nsns.histplot(pf_t.groupby('customer_id')['article_id'].count(), kde=True, bins=50)\nplt.title('Distribution du nombre d\\'articles achetés par transaction')\nplt.xlabel('Nombre d\\'articles achetés')\nplt.ylabel('Fréquence')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T09:34:33.483832Z","iopub.execute_input":"2025-01-24T09:34:33.484213Z","iopub.status.idle":"2025-01-24T09:37:05.782894Z","shell.execute_reply.started":"2025-01-24T09:34:33.484183Z","shell.execute_reply":"2025-01-24T09:37:05.781839Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Analyse du nombre total de transactions**","metadata":{}},{"cell_type":"code","source":"total_transactions = pf_t.shape[0]\nprint(f\"Nombre total de transactions: {total_transactions}\")\n\n# Nombre d'articles uniques dans les transactions\nunique_articles = pf_t['article_id'].nunique()\nprint(f\"Nombre d'articles uniques dans les transactions: {unique_articles}\")\n\n# Nombre de clients uniques\nunique_customers = pf_t['customer_id'].nunique()\nprint(f\"Nombre de clients uniques: {unique_customers}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T09:39:40.633029Z","iopub.execute_input":"2025-01-24T09:39:40.634528Z","iopub.status.idle":"2025-01-24T09:39:48.944496Z","shell.execute_reply.started":"2025-01-24T09:39:40.634467Z","shell.execute_reply":"2025-01-24T09:39:48.943228Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"#### Trop de donnnées \nimport pandas as pd\nfrom sklearn.metrics.pairwise import cosine_similarity\n\n# Créer une matrice utilisateur-article\nuser_article_matrix = pf_t.pivot_table(index='customer_id', columns='article_id', values='price').fillna(0)\n\n# Calculer la similarité cosinus entre les articles\narticle_similarity = cosine_similarity(user_article_matrix.T)\n\n# Convertir en DataFrame pour lisibilité\narticle_similarity_df = pd.DataFrame(article_similarity, index=user_article_matrix.columns, columns=user_article_matrix.columns)\n\n# Afficher la matrice de similarité des articles\nprint(\"Matrice de Similarité des Articles :\")\nprint(article_similarity_df)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-15T18:23:54.646181Z","iopub.execute_input":"2025-01-15T18:23:54.647241Z","iopub.status.idle":"2025-01-15T18:23:56.067533Z","shell.execute_reply.started":"2025-01-15T18:23:54.647158Z","shell.execute_reply":"2025-01-15T18:23:56.065867Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Calcul et affichage de la similarité cosinus entre des articles dans un échantillon (100) de transactions par prix.**","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.metrics.pairwise import cosine_similarity\n\n# Prenons un échantillon aléatoire de 100 lignes de pf_t\npf_t_sample = pf_t.sample(n=20, random_state=42)\n\n# Créer une matrice utilisateur-article pour l'échantillon\nuser_article_matrix_sample = pf_t_sample.pivot_table(index='customer_id', columns='article_id', values='price').fillna(0)\n\n# Calculer la similarité cosinus entre les articles pour l'échantillon\narticle_similarity_sample = cosine_similarity(user_article_matrix_sample.T)\n\n# Convertir en DataFrame pour lisibilité\narticle_similarity_df_sample = pd.DataFrame(article_similarity_sample, index=user_article_matrix_sample.columns, columns=user_article_matrix_sample.columns)\n\n# Visualiser la matrice de similarité des articles avec une heatmap\nplt.figure(figsize=(12, 10))\nsns.heatmap(article_similarity_df_sample, cmap='coolwarm', xticklabels=True, yticklabels=True)\nplt.title(\"Matrice de Similarité des Articles (Échantillon)\")\nplt.xlabel(\"Article ID\")\nplt.ylabel(\"Article ID\")\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T10:21:32.957211Z","iopub.execute_input":"2025-01-24T10:21:32.957629Z","iopub.status.idle":"2025-01-24T10:21:35.240304Z","shell.execute_reply.started":"2025-01-24T10:21:32.957594Z","shell.execute_reply":"2025-01-24T10:21:35.239095Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Calcul et affichage de la similarité cosinus entre des articles dans un échantillon (100) de transactions par detail_desc**","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom sklearn.feature_extraction.text import TfidfVectorizer\nfrom sklearn.metrics.pairwise import cosine_similarity\n\n# Jointure des DataFrames sur article_id\nmerged_df = pd.merge(pf_t, df_a, on='article_id')\n\n# Échantillonner les données\npf_t_sample = merged_df.sample(n=100, random_state=42)\n\n# Créer le vecteur TF-IDF pour les descriptions\nvectorizer = TfidfVectorizer(stop_words='english')\ntfidf_matrix = vectorizer.fit_transform(pf_t_sample['detail_desc'])\n\n# Calculer la similarité cosinus entre les descriptions\narticle_similarity_sample = cosine_similarity(tfidf_matrix)\n\n# Convertir en DataFrame pour lisibilité\narticle_similarity_df_sample = pd.DataFrame(article_similarity_sample, index=pf_t_sample['article_id'], columns=pf_t_sample['article_id'])\n\n# Visualiser la matrice de similarité des descriptions avec une heatmap\nplt.figure(figsize=(12, 10))\nsns.heatmap(article_similarity_df_sample, cmap='coolwarm', xticklabels=False, yticklabels=False)\nplt.title(\"Matrice de Similarité des Descriptions (Échantillon)\")\nplt.xlabel(\"Article ID\")\nplt.ylabel(\"Article ID\")\nplt.show()\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T10:04:12.895424Z","iopub.execute_input":"2025-01-24T10:04:12.895922Z","iopub.status.idle":"2025-01-24T10:05:28.941904Z","shell.execute_reply.started":"2025-01-24T10:04:12.895883Z","shell.execute_reply":"2025-01-24T10:05:28.940478Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"***Recommandation des produits***\n","metadata":{}},{"cell_type":"markdown","source":"***Filtrage Collaboratif**","metadata":{}},{"cell_type":"code","source":"pip install scikit-surprise\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:36:12.120816Z","iopub.execute_input":"2025-01-24T11:36:12.12131Z","iopub.status.idle":"2025-01-24T11:36:18.166219Z","shell.execute_reply.started":"2025-01-24T11:36:12.121274Z","shell.execute_reply":"2025-01-24T11:36:18.16499Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Appliquer un embedding**","metadata":{}},{"cell_type":"code","source":"import pandas as pd\n# Fusion des DataFrames sur la colonne 'article_id'\npf_ta = pd.merge(pf_t, df_a, on='article_id')\n\nfrom sklearn.preprocessing import LabelEncoder\n\n# Transformation des colonnes catégorielles en numériques\nfor column in ['prod_name', 'product_type_name', 'product_group_name', 'colour_group_name', 'department_name', 'index_name']:\n    label_encoder = LabelEncoder()\n    pf_ta[column] = label_encoder.fit_transform(pf_ta[column])\n\npf_ta.head(2)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:36:18.168499Z","iopub.execute_input":"2025-01-24T11:36:18.168874Z","iopub.status.idle":"2025-01-24T11:37:33.01247Z","shell.execute_reply.started":"2025-01-24T11:36:18.168841Z","shell.execute_reply":"2025-01-24T11:37:33.011434Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.feature_extraction.text import TfidfVectorizer\nfrom sklearn.metrics.pairwise import cosine_similarity\n\n# Transformation des colonnes catégorielles en numériques\nfor column in ['prod_name', 'product_type_name', 'product_group_name', 'colour_group_name', 'department_name', 'index_name']:\n    label_encoder = LabelEncoder()\n    pf_ta[column] = label_encoder.fit_transform(pf_ta[column])\n\n# Échantillonner 1000 lignes de pf_ta\npf_t_sample = pf_ta.sample(n=1000, random_state=42)\n\n# Transformer les descriptions en vecteurs TF-IDF\nvectorizer = TfidfVectorizer(stop_words='english')\ntfidf_matrix = vectorizer.fit_transform(pf_t_sample['detail_desc'])\n\n# Calculer la similarité cosinus entre les descriptions\narticle_similarity = cosine_similarity(tfidf_matrix)\n\n# Convertir en DataFrame pour lisibilité\narticle_similarity_df = pd.DataFrame(article_similarity, index=pf_t_sample['article_id'], columns=pf_t_sample['article_id'])\n\n# Fonction pour recommander des articles similaires\ndef recommend_articles(article_id, article_similarity_df, top_n=5):\n    # Obtenir les indices des articles les plus similaires\n    similar_indices = article_similarity_df[article_id].sort_values(ascending=False).index[1:top_n+1]\n    \n    # Obtenir les scores de similarité\n    similar_scores = article_similarity_df[article_id].sort_values(ascending=False)[1:top_n+1]\n    \n    return list(zip(similar_indices, similar_scores))\n\n# Vérifier les IDs valides\nprint(\"IDs valides :\")\nprint(article_similarity_df.index)\n\n# Exemple d'utilisation avec un ID valide\nvalid_article_id = article_similarity_df.index[0]  # Utiliser le premier ID valide\nrecommended_articles = recommend_articles(article_id=valid_article_id, article_similarity_df=article_similarity_df, top_n=5)\nprint(\"Articles recommandés :\")\nprint(recommended_articles)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T10:14:18.787714Z","iopub.execute_input":"2025-01-24T10:14:18.788067Z","iopub.status.idle":"2025-01-24T10:14:30.980764Z","shell.execute_reply.started":"2025-01-24T10:14:18.788041Z","shell.execute_reply":"2025-01-24T10:14:30.979439Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"**Affichage**","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.feature_extraction.text import TfidfVectorizer\nfrom sklearn.metrics.pairwise import cosine_similarity\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Transformation des colonnes catégorielles en numériques\nfor column in ['prod_name', 'product_type_name', 'product_group_name', 'colour_group_name', 'department_name', 'index_name']:\n    label_encoder = LabelEncoder()\n    pf_ta[column] = label_encoder.fit_transform(pf_ta[column])\n\n# Échantillonner 100 lignes de pf_ta\npf_t_sample = pf_ta.sample(n=100, random_state=42)\n\n# Remplir les valeurs manquantes dans detail_desc avec des chaînes vides et convertir en chaînes de caractères\npf_t_sample['detail_desc'] = pf_t_sample['detail_desc'].astype(str).fillna('')\n\n# Transformer les descriptions en vecteurs TF-IDF\nvectorizer = TfidfVectorizer(stop_words='english')\ntfidf_matrix = vectorizer.fit_transform(pf_t_sample['detail_desc'])\n\n# Calculer la similarité cosinus entre les descriptions\narticle_similarity = cosine_similarity(tfidf_matrix)\n\n# Convertir en DataFrame pour lisibilité\narticle_similarity_df = pd.DataFrame(article_similarity, index=pf_t_sample['article_id'], columns=pf_t_sample['article_id'])\n\n# Visualiser la matrice de similarité des descriptions avec une heatmap\nplt.figure(figsize=(12, 10))\nsns.heatmap(article_similarity_df, cmap='coolwarm', xticklabels=False, yticklabels=False)\nplt.title(\"Matrice de Similarité des Descriptions (Échantillon)\")\nplt.xlabel(\"Article ID\")\nplt.ylabel(\"Article ID\")\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T10:14:49.991257Z","iopub.execute_input":"2025-01-24T10:14:49.991723Z","iopub.status.idle":"2025-01-24T10:15:02.551012Z","shell.execute_reply.started":"2025-01-24T10:14:49.991683Z","shell.execute_reply":"2025-01-24T10:15:02.549255Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.feature_extraction.text import TfidfVectorizer\nfrom sklearn.metrics.pairwise import cosine_similarity\nimport matplotlib.pyplot as plt\nimport seaborn as sns\n\n# Transformation des colonnes catégorielles en numériques\nfor column in ['prod_name', 'product_type_name', 'product_group_name', 'colour_group_name', 'department_name', 'index_name']:\n    label_encoder = LabelEncoder()\n    pf_ta[column] = label_encoder.fit_transform(pf_ta[column])\n\n# Échantillonner 100 lignes de pf_ta\npf_t_sample = pf_ta.sample(n=100, random_state=42)\n\n# Remplir les valeurs manquantes dans detail_desc avec des chaînes vides et convertir en chaînes de caractères\npf_t_sample['department_name'] = pf_t_sample['department_name'].astype(str).fillna('')\n\n# Transformer les descriptions en vecteurs TF-IDF\nvectorizer = TfidfVectorizer(stop_words='english')\ntfidf_matrix = vectorizer.fit_transform(pf_t_sample['department_name'])\n\n# Calculer la similarité cosinus entre les descriptions\narticle_similarity = cosine_similarity(tfidf_matrix)\n\n# Convertir en DataFrame pour lisibilité\narticle_similarity_df = pd.DataFrame(article_similarity, index=pf_t_sample['article_id'], columns=pf_t_sample['article_id'])\n\n# Fonction pour recommander des articles similaires\ndef recommend_articles(article_id, article_similarity_df, top_n=5):\n    # Obtenir les indices des articles les plus similaires\n    similar_indices = article_similarity_df[article_id].sort_values(ascending=False).index[1:top_n+1]\n    \n    # Obtenir les scores de similarité\n    similar_scores = article_similarity_df[article_id].sort_values(ascending=False)[1:top_n+1]\n    \n    return list(zip(similar_indices, similar_scores))\n\n# Vérifier les IDs valides\nprint(\"IDs valides :\")\nprint(article_similarity_df.index)\n\n# Exemple d'utilisation avec un ID valide\nvalid_article_id = article_similarity_df.index[0]  # Utiliser le premier ID valide\nrecommended_articles = recommend_articles(article_id=valid_article_id, article_similarity_df=article_similarity_df, top_n=5)\nprint(\"Articles recommandés :\")\nprint(recommended_articles)\n\n# Visualiser la matrice de similarité des descriptions avec une heatmap\nplt.figure(figsize=(12, 10))\nsns.heatmap(article_similarity_df, cmap='coolwarm', xticklabels=False, yticklabels=False)\nplt.title(\"Matrice de Similarité des Descriptions (Échantillon)\")\nplt.xlabel(\"Article ID\")\nplt.ylabel(\"Article ID\")\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T11:39:51.000307Z","iopub.execute_input":"2025-01-24T11:39:51.001Z","iopub.status.idle":"2025-01-24T11:40:03.907045Z","shell.execute_reply.started":"2025-01-24T11:39:51.000965Z","shell.execute_reply":"2025-01-24T11:40:03.905705Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# Fusionner les dataframes sur 'article_id'\ndf = pd.merge(pf_t, df_a, on='article_id')\n\n# Convertir 't_dat' en datetime\ndf['t_dat'] = pd.to_datetime(df['t_dat'])\n\n# Définir les saisons\ndef get_season(date):\n    if date.month in [12, 1, 2]:\n        return 'Hiver'\n    elif date.month in [3, 4, 5]:\n        return 'Printemps'\n    elif date.month in [6, 7, 8]:\n        return 'Été'\n    else:\n        return 'Automne'\n\n# Ajouter une colonne 'saison'\ndf['saison'] = df['t_dat'].apply(get_season)\n\n# Calculer les ventes par produit pour chaque saison\nseason_sales = df.groupby(['saison', 'prod_name']).size().reset_index(name='ventes')\n\n# Trouver le produit le plus vendu par saison\ntop_products = season_sales.loc[season_sales.groupby('saison')['ventes'].idxmax()]\n\nprint(top_products)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-01-24T10:16:02.515458Z","iopub.execute_input":"2025-01-24T10:16:02.515935Z","iopub.status.idle":"2025-01-24T10:17:39.533015Z","shell.execute_reply.started":"2025-01-24T10:16:02.515868Z","shell.execute_reply":"2025-01-24T10:17:39.531605Z"}},"outputs":[],"execution_count":null}]}