From acf7621d9abf43c430bfb191d15b43d2d23dc3c6 Mon Sep 17 00:00:00 2001 From: tpique-ensae Date: Wed, 3 Apr 2024 10:36:47 +0000 Subject: [PATCH] fixed forecasting issues --- 7_Sales_Forecast.py | 12 + Sport/Modelization/CA_segment_sport.ipynb | 2134 ++++++++++++++------- utils_sales_forecast.py | 39 +- 3 files changed, 1435 insertions(+), 750 deletions(-) diff --git a/7_Sales_Forecast.py b/7_Sales_Forecast.py index abd80f1..918444b 100644 --- a/7_Sales_Forecast.py +++ b/7_Sales_Forecast.py @@ -69,7 +69,9 @@ save_file_s3_ca("hist_score_adjusted_", type_of_activity) X_test_table_adjusted_scores = (100 * X_test_segment.groupby("quartile")[["score","score_adjusted", "has_purchased"]].mean()).round(2).reset_index() X_test_table_adjusted_scores = X_test_table_adjusted_scores.rename(columns = {col : f"{col} (%)" for col in X_test_table_adjusted_scores.columns if col in ["score","score_adjusted", "has_purchased"]}) +print("Table of scores :\n") print(X_test_table_adjusted_scores) +print("\n") # save table file_name = "table_adjusted_score_" @@ -84,14 +86,24 @@ X_test_segment = project_tickets_CA (X_test_segment, "nb_purchases", "nb_tickets ### 3. table summarizing projections (nb tickets, revenue) +""" X_test_expected_CA = round(summary_expected_CA(df=X_test_segment, segment="quartile", nb_tickets_expected="nb_tickets_expected", total_amount_expected="total_amount_expected", total_amount="total_amount", pace_purchase="pace_purchase"),2) + """ + +X_test_expected_CA = round(summary_expected_CA(df=X_test_segment, segment="quartile", + nb_tickets_expected="nb_tickets_expected", total_amount_expected="total_amount_expected", + total_amount="total_amount_corrected", pace_purchase="pace_purchase"),2) # rename columns mapping_dict = {col: col.replace("perct", "(%)").replace("_", " ") for col in X_test_expected_CA.columns} X_test_expected_CA = X_test_expected_CA.rename(columns=mapping_dict) +print("Summary of forecast :\n") +print(X_test_expected_CA) +print("\n") + # save table file_name = "table_expected_CA_" FILE_PATH_OUT_S3 = PATH + file_name + type_of_activity + ".csv" diff --git a/Sport/Modelization/CA_segment_sport.ipynb b/Sport/Modelization/CA_segment_sport.ipynb index 17b85bc..f2c6f73 100644 --- a/Sport/Modelization/CA_segment_sport.ipynb +++ b/Sport/Modelization/CA_segment_sport.ipynb @@ -75,24 +75,24 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 4, "id": "d6017ed0-6233-4888-85a7-05dec50a255b", "metadata": {}, "outputs": [], "source": [ - "type_of_activity = \"musique\"" + "type_of_activity = \"sport\"" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "id": "0c3a6ddc-9345-4a42-b6bf-a20a95de3028", "metadata": {}, "outputs": [], "source": [ "def load_train_test(type_of_activity):\n", " # BUCKET = f\"projet-bdc2324-team1/Generalization/{type_of_activity}\"\n", - " BUCKET = f\"projet-bdc2324-team1/Generalization_v2/{type_of_activity}\"\n", + " BUCKET = f\"projet-bdc2324-team1/1_Temp/1_0_Modelling_Datasets/{type_of_activity}\"\n", " File_path_train = BUCKET + \"/Train_set.csv\"\n", " File_path_test = BUCKET + \"/Test_set.csv\"\n", " \n", @@ -109,7 +109,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 8, "id": "2831d546-b365-498b-8248-c618bd9c3057", "metadata": {}, "outputs": [ @@ -117,9 +117,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_552/3983721681.py:8: DtypeWarning: Columns (10,19,20,21,24) have mixed types. Specify dtype option on import or set low_memory=False.\n", + "/tmp/ipykernel_427/290017524.py:8: DtypeWarning: Columns (10,24) have mixed types. Specify dtype option on import or set low_memory=False.\n", " dataset_train = pd.read_csv(file_in, sep=\",\")\n", - "/tmp/ipykernel_552/3983721681.py:12: DtypeWarning: Columns (19,20,21,24) have mixed types. Specify dtype option on import or set low_memory=False.\n", + "/tmp/ipykernel_427/290017524.py:12: DtypeWarning: Columns (10,24) have mixed types. Specify dtype option on import or set low_memory=False.\n", " dataset_test = pd.read_csv(file_in, sep=\",\")\n" ] }, @@ -128,19 +128,19 @@ "text/plain": [ "customer_id 0\n", "street_id 0\n", - "structure_id 327020\n", - "mcp_contact_id 135470\n", + "structure_id 222819\n", + "mcp_contact_id 70845\n", "fidelity 0\n", " ... \n", - "purchases_8_2021 113963\n", + "purchases_8_2021 0\n", "purchases_8_2022 0\n", - "purchases_9_2021 113963\n", + "purchases_9_2021 0\n", "purchases_9_2022 0\n", "y_has_purchased 0\n", "Length: 87, dtype: int64" ] }, - "execution_count": 76, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -152,7 +152,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 9, "id": "b8827f7b-b304-4f51-9814-c7a98ed88cf0", "metadata": {}, "outputs": [], @@ -180,7 +180,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 10, "id": "c18195fc-ed40-4e39-a59e-c9ecc5a8e6c3", "metadata": {}, "outputs": [ @@ -188,8 +188,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Shape train : (354365, 87)\n", - "Shape test : (151874, 87)\n" + "Shape train : (224213, 87)\n", + "Shape test : (96096, 87)\n" ] } ], @@ -209,7 +209,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 11, "id": "7c81390e-598c-4f02-bd56-dd03b00dcb33", "metadata": {}, "outputs": [ @@ -260,12 +260,12 @@ " \n", " \n", " 0\n", - " 10_699783\n", - " 139\n", + " 5_4317407\n", + " 969908\n", " NaN\n", - " 186852.0\n", - " 0\n", - " 875\n", + " 6156473.0\n", + " 1\n", + " 1771\n", " False\n", " NaN\n", " True\n", @@ -284,12 +284,12 @@ " \n", " \n", " 1\n", - " 10_38307\n", - " 862\n", + " 5_477635\n", + " 109121\n", " NaN\n", - " 17621.0\n", - " 7\n", - " 875\n", + " 6213652.0\n", + " 2\n", + " 1771\n", " False\n", " NaN\n", " True\n", @@ -308,16 +308,16 @@ " \n", " \n", " 2\n", - " 10_556101\n", - " 1063\n", + " 5_411639\n", + " 92929\n", " NaN\n", - " 136909.0\n", - " 0\n", - " 875\n", + " 6160271.0\n", + " 4\n", + " 1771\n", " False\n", " NaN\n", " True\n", - " 1\n", + " 0\n", " ...\n", " 0.0\n", " 0.0\n", @@ -332,12 +332,12 @@ " \n", " \n", " 3\n", - " 10_686663\n", - " 443226\n", + " 5_326623\n", + " 79862\n", " NaN\n", - " 186611.0\n", + " 6140109.0\n", " 1\n", - " 875\n", + " 1771\n", " False\n", " NaN\n", " True\n", @@ -349,23 +349,23 @@ " 0.0\n", " 0.0\n", " 0.0\n", - " 1.0\n", " 0.0\n", + " 1.0\n", " 0.0\n", " 0.0\n", " \n", " \n", " 4\n", - " 10_91656\n", - " 316684\n", + " 5_383915\n", + " 85421\n", " NaN\n", - " 21559.0\n", + " 6149409.0\n", " 2\n", - " 875\n", + " 1771\n", " False\n", " NaN\n", " True\n", - " 0\n", + " 1\n", " ...\n", " 0.0\n", " 0.0\n", @@ -403,200 +403,200 @@ " ...\n", " \n", " \n", - " 151869\n", - " 14_1843791\n", - " 718883\n", - " 224.0\n", - " 394849.0\n", - " 1\n", - " 862\n", - " False\n", + " 96091\n", + " 9_91205\n", + " 76215\n", " NaN\n", - " True\n", - " 1\n", - " ...\n", - " 0.0\n", - " NaN\n", - " 0.0\n", - " NaN\n", - " 0.0\n", - " NaN\n", - " 0.0\n", - " NaN\n", - " 0.0\n", - " 0.0\n", - " \n", - " \n", - " 151870\n", - " 14_4630858\n", - " 741826\n", - " NaN\n", - " 1555631.0\n", + " 47280.0\n", " 0\n", - " 862\n", + " 1490\n", " False\n", " NaN\n", " True\n", " 1\n", " ...\n", " 0.0\n", - " NaN\n", " 0.0\n", - " NaN\n", " 0.0\n", - " NaN\n", " 0.0\n", - " NaN\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", " 0.0\n", " 0.0\n", " \n", " \n", - " 151871\n", - " 14_4659926\n", - " 871477\n", + " 96092\n", + " 9_369887\n", + " 815891\n", " NaN\n", - " 1542180.0\n", + " 30764537.0\n", + " 4\n", + " 1490\n", + " False\n", + " NaN\n", + " True\n", " 0\n", - " 862\n", - " False\n", - " NaN\n", - " True\n", - " 1\n", " ...\n", " 0.0\n", - " NaN\n", - " 0.0\n", - " NaN\n", - " 0.0\n", - " NaN\n", - " 0.0\n", - " NaN\n", " 0.0\n", " 0.0\n", - " \n", - " \n", - " 151872\n", - " 14_4881492\n", - " 917272\n", - " NaN\n", - " NaN\n", - " 1\n", - " 862\n", - " False\n", - " NaN\n", - " True\n", - " 1\n", - " ...\n", " 0.0\n", - " NaN\n", " 0.0\n", - " NaN\n", " 0.0\n", - " NaN\n", " 0.0\n", - " NaN\n", + " 0.0\n", + " 0.0\n", " 1.0\n", - " 0.0\n", " \n", " \n", - " 151873\n", - " 14_8124\n", - " 2762\n", + " 96093\n", + " 9_1007562\n", + " 1\n", " NaN\n", - " 10077.0\n", - " 2\n", - " 862\n", + " NaN\n", + " 0\n", + " 1490\n", " False\n", " NaN\n", " True\n", " 0\n", " ...\n", " 0.0\n", - " NaN\n", " 0.0\n", - " NaN\n", " 0.0\n", - " NaN\n", " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " \n", + " \n", + " 96094\n", + " 9_15037\n", + " 12992\n", " NaN\n", + " 2213448.0\n", + " 0\n", + " 1490\n", + " False\n", + " NaN\n", + " True\n", + " 1\n", + " ...\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " \n", + " \n", + " 96095\n", + " 9_135370\n", + " 76215\n", + " NaN\n", + " 2164740.0\n", + " 0\n", + " 1490\n", + " False\n", + " NaN\n", + " True\n", + " 1\n", + " ...\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", " 0.0\n", " 0.0\n", " \n", " \n", "\n", - "

151874 rows × 87 columns

\n", + "

96096 rows × 87 columns

\n", "" ], "text/plain": [ - " customer_id street_id structure_id mcp_contact_id fidelity \\\n", - "0 10_699783 139 NaN 186852.0 0 \n", - "1 10_38307 862 NaN 17621.0 7 \n", - "2 10_556101 1063 NaN 136909.0 0 \n", - "3 10_686663 443226 NaN 186611.0 1 \n", - "4 10_91656 316684 NaN 21559.0 2 \n", - "... ... ... ... ... ... \n", - "151869 14_1843791 718883 224.0 394849.0 1 \n", - "151870 14_4630858 741826 NaN 1555631.0 0 \n", - "151871 14_4659926 871477 NaN 1542180.0 0 \n", - "151872 14_4881492 917272 NaN NaN 1 \n", - "151873 14_8124 2762 NaN 10077.0 2 \n", + " customer_id street_id structure_id mcp_contact_id fidelity \\\n", + "0 5_4317407 969908 NaN 6156473.0 1 \n", + "1 5_477635 109121 NaN 6213652.0 2 \n", + "2 5_411639 92929 NaN 6160271.0 4 \n", + "3 5_326623 79862 NaN 6140109.0 1 \n", + "4 5_383915 85421 NaN 6149409.0 2 \n", + "... ... ... ... ... ... \n", + "96091 9_91205 76215 NaN 47280.0 0 \n", + "96092 9_369887 815891 NaN 30764537.0 4 \n", + "96093 9_1007562 1 NaN NaN 0 \n", + "96094 9_15037 12992 NaN 2213448.0 0 \n", + "96095 9_135370 76215 NaN 2164740.0 0 \n", "\n", - " tenant_id is_partner deleted_at is_email_true opt_in ... \\\n", - "0 875 False NaN True 0 ... \n", - "1 875 False NaN True 0 ... \n", - "2 875 False NaN True 1 ... \n", - "3 875 False NaN True 1 ... \n", - "4 875 False NaN True 0 ... \n", - "... ... ... ... ... ... ... \n", - "151869 862 False NaN True 1 ... \n", - "151870 862 False NaN True 1 ... \n", - "151871 862 False NaN True 1 ... \n", - "151872 862 False NaN True 1 ... \n", - "151873 862 False NaN True 0 ... \n", + " tenant_id is_partner deleted_at is_email_true opt_in ... \\\n", + "0 1771 False NaN True 0 ... \n", + "1 1771 False NaN True 0 ... \n", + "2 1771 False NaN True 0 ... \n", + "3 1771 False NaN True 1 ... \n", + "4 1771 False NaN True 1 ... \n", + "... ... ... ... ... ... ... \n", + "96091 1490 False NaN True 1 ... \n", + "96092 1490 False NaN True 0 ... \n", + "96093 1490 False NaN True 0 ... \n", + "96094 1490 False NaN True 1 ... \n", + "96095 1490 False NaN True 1 ... \n", "\n", - " purchases_5_2022 purchases_6_2021 purchases_6_2022 purchases_7_2021 \\\n", - "0 0.0 0.0 0.0 0.0 \n", - "1 0.0 0.0 0.0 0.0 \n", - "2 0.0 0.0 0.0 0.0 \n", - "3 0.0 0.0 0.0 0.0 \n", - "4 0.0 0.0 0.0 0.0 \n", - "... ... ... ... ... \n", - "151869 0.0 NaN 0.0 NaN \n", - "151870 0.0 NaN 0.0 NaN \n", - "151871 0.0 NaN 0.0 NaN \n", - "151872 0.0 NaN 0.0 NaN \n", - "151873 0.0 NaN 0.0 NaN \n", + " purchases_5_2022 purchases_6_2021 purchases_6_2022 purchases_7_2021 \\\n", + "0 0.0 0.0 0.0 0.0 \n", + "1 0.0 0.0 0.0 0.0 \n", + "2 0.0 0.0 0.0 0.0 \n", + "3 0.0 0.0 0.0 0.0 \n", + "4 0.0 0.0 0.0 0.0 \n", + "... ... ... ... ... \n", + "96091 0.0 0.0 0.0 0.0 \n", + "96092 0.0 0.0 0.0 0.0 \n", + "96093 0.0 0.0 0.0 0.0 \n", + "96094 0.0 0.0 0.0 0.0 \n", + "96095 0.0 0.0 0.0 0.0 \n", "\n", - " purchases_7_2022 purchases_8_2021 purchases_8_2022 \\\n", - "0 0.0 0.0 0.0 \n", - "1 0.0 0.0 0.0 \n", - "2 0.0 0.0 0.0 \n", - "3 0.0 0.0 1.0 \n", - "4 0.0 0.0 0.0 \n", - "... ... ... ... \n", - "151869 0.0 NaN 0.0 \n", - "151870 0.0 NaN 0.0 \n", - "151871 0.0 NaN 0.0 \n", - "151872 0.0 NaN 0.0 \n", - "151873 0.0 NaN 0.0 \n", + " purchases_7_2022 purchases_8_2021 purchases_8_2022 purchases_9_2021 \\\n", + "0 0.0 0.0 0.0 0.0 \n", + "1 0.0 0.0 0.0 0.0 \n", + "2 0.0 0.0 0.0 0.0 \n", + "3 0.0 0.0 0.0 1.0 \n", + "4 0.0 0.0 0.0 0.0 \n", + "... ... ... ... ... \n", + "96091 0.0 0.0 0.0 0.0 \n", + "96092 0.0 0.0 0.0 0.0 \n", + "96093 0.0 0.0 0.0 0.0 \n", + "96094 0.0 0.0 0.0 0.0 \n", + "96095 0.0 0.0 0.0 0.0 \n", "\n", - " purchases_9_2021 purchases_9_2022 y_has_purchased \n", - "0 0.0 0.0 0.0 \n", - "1 0.0 0.0 0.0 \n", - "2 0.0 0.0 0.0 \n", - "3 0.0 0.0 0.0 \n", - "4 0.0 0.0 0.0 \n", - "... ... ... ... \n", - "151869 NaN 0.0 0.0 \n", - "151870 NaN 0.0 0.0 \n", - "151871 NaN 0.0 0.0 \n", - "151872 NaN 1.0 0.0 \n", - "151873 NaN 0.0 0.0 \n", + " purchases_9_2022 y_has_purchased \n", + "0 0.0 0.0 \n", + "1 0.0 0.0 \n", + "2 0.0 0.0 \n", + "3 0.0 0.0 \n", + "4 0.0 0.0 \n", + "... ... ... \n", + "96091 0.0 0.0 \n", + "96092 0.0 1.0 \n", + "96093 0.0 0.0 \n", + "96094 0.0 0.0 \n", + "96095 0.0 0.0 \n", "\n", - "[151874 rows x 87 columns]" + "[96096 rows x 87 columns]" ] }, - "execution_count": 78, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -607,7 +607,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 12, "id": "c708f439-bb75-4688-bf4f-4c04e13deaae", "metadata": {}, "outputs": [], @@ -626,14 +626,14 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 13, "id": "5261a803-05b8-41a0-968c-dc7bde48ddd3", "metadata": {}, "outputs": [ { "data": { "text/html": [ - "
Pipeline(steps=[('preprocessor',\n",
+       "
GridSearchCV(cv=3, error_score='raise',\n",
+       "             estimator=Pipeline(steps=[('preprocessor',\n",
+       "                                        ColumnTransformer(transformers=[('num',\n",
+       "                                                                         Pipeline(steps=[('imputer',\n",
+       "                                                                                          SimpleImputer(fill_value=0,\n",
+       "                                                                                                        strategy='constant')),\n",
+       "                                                                                         ('scaler',\n",
+       "                                                                                          StandardScaler())]),\n",
+       "                                                                         ['nb_campaigns',\n",
+       "                                                                          'taux_ouverture_mail',\n",
+       "                                                                          'prop_purchases_internet',\n",
+       "                                                                          'nb_tickets',\n",
+       "                                                                          'nb_purchases',\n",
+       "                                                                          'total_amount',\n",
+       "                                                                          'nb_suppliers',\n",
+       "                                                                          'pu...\n",
+       "       1.562500e-02, 3.125000e-02, 6.250000e-02, 1.250000e-01,\n",
+       "       2.500000e-01, 5.000000e-01, 1.000000e+00, 2.000000e+00,\n",
+       "       4.000000e+00, 8.000000e+00, 1.600000e+01, 3.200000e+01,\n",
+       "       6.400000e+01]),\n",
+       "                         'LogisticRegression_cv__class_weight': ['balanced',\n",
+       "                                                                 {0.0: 0.5834990214856762,\n",
+       "                                                                  1.0: 3.49404706249026}],\n",
+       "                         'LogisticRegression_cv__penalty': ['l1', 'l2']},\n",
+       "             scoring=make_scorer(recall_score, response_method='predict'))
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
['nb_campaigns', 'taux_ouverture_mail', 'prop_purchases_internet', 'nb_tickets', 'nb_purchases', 'total_amount', 'nb_suppliers', 'purchases_10_2021', 'purchases_10_2022', 'purchases_11_2021', 'purchases_12_2021', 'purchases_1_2022', 'purchases_2_2022', 'purchases_3_2022', 'purchases_4_2022', 'purchases_5_2021', 'purchases_5_2022', 'purchases_6_2021', 'purchases_6_2022', 'purchases_7_2021', 'purchases_7_2022', 'purchases_8_2021', 'purchases_8_2022', 'purchases_9_2021', 'purchases_9_2022', 'purchase_date_min', 'purchase_date_max', 'nb_targets', 'time_to_open']
SimpleImputer(fill_value=0, strategy='constant')
StandardScaler()
['gender_female', 'gender_male', 'achat_internet', 'categorie_age_0_10', 'categorie_age_10_20', 'categorie_age_20_30', 'categorie_age_30_40', 'categorie_age_40_50', 'categorie_age_50_60', 'categorie_age_60_70', 'categorie_age_70_80', 'categorie_age_plus_80', 'categorie_age_inconnue', 'country_fr', 'is_profession_known', 'is_zipcode_known', 'opt_in']
SimpleImputer(strategy='most_frequent')
LogisticRegression(max_iter=5000, solver='saga')
" ], "text/plain": [ - "Pipeline(steps=[('preprocessor',\n", - " ColumnTransformer(transformers=[('num',\n", - " Pipeline(steps=[('imputer',\n", - " SimpleImputer(fill_value=0,\n", - " strategy='constant')),\n", - " ('scaler',\n", - " StandardScaler())]),\n", - " ['nb_campaigns',\n", - " 'taux_ouverture_mail',\n", - " 'prop_purchases_internet',\n", - " 'nb_tickets', 'nb_purchases',\n", - " 'total_amount',\n", - " 'nb_suppliers',\n", - " 'purchases_10_2021',\n", - " 'purchases_10_2022',\n", - " 'purchases_...\n", - " 'categorie_age_40_50',\n", - " 'categorie_age_50_60',\n", - " 'categorie_age_60_70',\n", - " 'categorie_age_70_80',\n", - " 'categorie_age_plus_80',\n", - " 'categorie_age_inconnue',\n", - " 'country_fr',\n", - " 'is_profession_known',\n", - " 'is_zipcode_known',\n", - " 'opt_in'])])),\n", - " ('LogisticRegression_Benchmark',\n", - " LogisticRegression(class_weight={0.0: 0.5480249666729557,\n", - " 1.0: 5.705625684291879},\n", - " max_iter=5000, n_jobs=-1, solver='saga'))])" + "GridSearchCV(cv=3, error_score='raise',\n", + " estimator=Pipeline(steps=[('preprocessor',\n", + " ColumnTransformer(transformers=[('num',\n", + " Pipeline(steps=[('imputer',\n", + " SimpleImputer(fill_value=0,\n", + " strategy='constant')),\n", + " ('scaler',\n", + " StandardScaler())]),\n", + " ['nb_campaigns',\n", + " 'taux_ouverture_mail',\n", + " 'prop_purchases_internet',\n", + " 'nb_tickets',\n", + " 'nb_purchases',\n", + " 'total_amount',\n", + " 'nb_suppliers',\n", + " 'pu...\n", + " 1.562500e-02, 3.125000e-02, 6.250000e-02, 1.250000e-01,\n", + " 2.500000e-01, 5.000000e-01, 1.000000e+00, 2.000000e+00,\n", + " 4.000000e+00, 8.000000e+00, 1.600000e+01, 3.200000e+01,\n", + " 6.400000e+01]),\n", + " 'LogisticRegression_cv__class_weight': ['balanced',\n", + " {0.0: 0.5834990214856762,\n", + " 1.0: 3.49404706249026}],\n", + " 'LogisticRegression_cv__penalty': ['l1', 'l2']},\n", + " scoring=make_scorer(recall_score, response_method='predict'))" ] }, - "execution_count": 92, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "model = load_model(type_of_activity, \"LogisticRegression_Benchmark\")\n", + "#model = load_model(type_of_activity, \"LogisticRegression_Benchmark\")\n", "# model = load_model(type_of_activity, \"randomF_cv\")\n", + "model = load_model(type_of_activity, \"LogisticRegression_cv\")\n", "model" ] }, @@ -1174,7 +1189,7 @@ }, { "cell_type": "code", - "execution_count": 93, + "execution_count": 14, "id": "018d8ff4-3436-4eec-8507-d1a265cbabf1", "metadata": {}, "outputs": [], @@ -1185,7 +1200,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": 15, "id": "846f53b9-73c2-4a8b-9d9e-f11bf59ce9ba", "metadata": {}, "outputs": [ @@ -1221,6 +1236,7 @@ " is_email_true\n", " opt_in\n", " ...\n", + " purchases_7_2022\n", " purchases_8_2021\n", " purchases_8_2022\n", " purchases_9_2021\n", @@ -1230,18 +1246,17 @@ " has_purchased_estim\n", " score\n", " quartile\n", - " score_adjusted\n", " \n", " \n", " \n", " \n", " 0\n", - " 10_699783\n", - " 139\n", + " 5_4317407\n", + " 969908\n", " NaN\n", - " 186852.0\n", - " 0\n", - " 875\n", + " 6156473.0\n", + " 1\n", + " 1771\n", " False\n", " NaN\n", " True\n", @@ -1254,18 +1269,18 @@ " 0.0\n", " 0.0\n", " 0.0\n", - " 0.131180\n", - " 1\n", - " 0.017574\n", + " 0.0\n", + " 0.445019\n", + " 2\n", " \n", " \n", " 1\n", - " 10_38307\n", - " 862\n", + " 5_477635\n", + " 109121\n", " NaN\n", - " 17621.0\n", - " 7\n", - " 875\n", + " 6213652.0\n", + " 2\n", + " 1771\n", " False\n", " NaN\n", " True\n", @@ -1278,22 +1293,22 @@ " 0.0\n", " 0.0\n", " 0.0\n", - " 0.321635\n", + " 0.0\n", + " 0.382586\n", " 2\n", - " 0.042466\n", " \n", " \n", " 2\n", - " 10_556101\n", - " 1063\n", + " 5_411639\n", + " 92929\n", " NaN\n", - " 136909.0\n", - " 0\n", - " 875\n", + " 6160271.0\n", + " 4\n", + " 1771\n", " False\n", " NaN\n", " True\n", - " 1\n", + " 0\n", " ...\n", " 0.0\n", " 0.0\n", @@ -1302,46 +1317,46 @@ " 0.0\n", " 0.0\n", " 0.0\n", - " 0.005068\n", - " 1\n", - " 0.000676\n", + " 1.0\n", + " 0.916747\n", + " 4\n", " \n", " \n", " 3\n", - " 10_686663\n", - " 443226\n", + " 5_326623\n", + " 79862\n", " NaN\n", - " 186611.0\n", + " 6140109.0\n", " 1\n", - " 875\n", + " 1771\n", " False\n", " NaN\n", " True\n", " 1\n", " ...\n", " 0.0\n", + " 0.0\n", + " 0.0\n", " 1.0\n", " 0.0\n", " 0.0\n", " 0.0\n", " 0.0\n", - " 0.0\n", - " 0.166979\n", + " 0.090534\n", " 1\n", - " 0.018397\n", " \n", " \n", " 4\n", - " 10_91656\n", - " 316684\n", + " 5_383915\n", + " 85421\n", " NaN\n", - " 21559.0\n", + " 6149409.0\n", " 2\n", - " 875\n", + " 1771\n", " False\n", " NaN\n", " True\n", - " 0\n", + " 1\n", " ...\n", " 0.0\n", " 0.0\n", @@ -1350,46 +1365,46 @@ " 0.0\n", " 0.0\n", " 0.0\n", - " 0.161523\n", - " 1\n", - " 0.018632\n", + " 0.0\n", + " 0.346571\n", + " 2\n", " \n", " \n", " 5\n", - " 10_35956\n", - " 106204\n", - " NaN\n", + " 5_233172\n", + " 141401\n", " NaN\n", + " 3324.0\n", " 1\n", - " 875\n", + " 1771\n", " False\n", " NaN\n", " True\n", - " 0\n", + " 1\n", " ...\n", " 0.0\n", " 0.0\n", " 0.0\n", " 0.0\n", + " 1.0\n", " 0.0\n", " 0.0\n", - " 0.0\n", - " 0.098139\n", - " 1\n", - " 0.010129\n", + " 1.0\n", + " 0.924684\n", + " 4\n", " \n", " \n", " 6\n", - " 10_560058\n", - " 1063\n", + " 5_389999\n", + " 95759\n", " NaN\n", - " 161812.0\n", - " 0\n", - " 875\n", + " 6151025.0\n", + " 1\n", + " 1771\n", " False\n", " NaN\n", " True\n", - " 1\n", + " 0\n", " ...\n", " 0.0\n", " 0.0\n", @@ -1398,18 +1413,18 @@ " 0.0\n", " 0.0\n", " 0.0\n", - " 0.005377\n", - " 1\n", - " 0.000715\n", + " 1.0\n", + " 0.569031\n", + " 3\n", " \n", " \n", " 7\n", - " 10_38603\n", - " 513642\n", - " 1865.0\n", - " 7660.0\n", - " 4\n", - " 875\n", + " 5_4292211\n", + " 78897\n", + " NaN\n", + " 4729841.0\n", + " 1\n", + " 1771\n", " False\n", " NaN\n", " True\n", @@ -1419,21 +1434,21 @@ " 0.0\n", " 0.0\n", " 0.0\n", - " 1.0\n", - " 1.0\n", - " 1.0\n", - " 0.906698\n", - " 4\n", - " 0.461388\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.0\n", + " 0.125622\n", + " 1\n", " \n", " \n", " 8\n", - " 10_563294\n", - " 1063\n", + " 5_353553\n", + " 84189\n", " NaN\n", - " 167549.0\n", - " 0\n", - " 875\n", + " 6146995.0\n", + " 1\n", + " 1771\n", " False\n", " NaN\n", " True\n", @@ -1446,18 +1461,18 @@ " 0.0\n", " 0.0\n", " 0.0\n", - " 0.007399\n", + " 0.0\n", + " 0.229432\n", " 1\n", - " 0.000974\n", " \n", " \n", " 9\n", - " 10_548983\n", - " 268636\n", + " 5_401296\n", + " 3491\n", " NaN\n", - " 173318.0\n", + " 6155457.0\n", " 1\n", - " 875\n", + " 1771\n", " False\n", " NaN\n", " True\n", @@ -1470,68 +1485,68 @@ " 0.0\n", " 0.0\n", " 0.0\n", - " 0.163529\n", - " 1\n", - " 0.022102\n", + " 1.0\n", + " 0.503987\n", + " 3\n", " \n", " \n", "\n", - "

10 rows × 92 columns

\n", + "

10 rows × 91 columns

\n", "" ], "text/plain": [ " customer_id street_id structure_id mcp_contact_id fidelity tenant_id \\\n", - "0 10_699783 139 NaN 186852.0 0 875 \n", - "1 10_38307 862 NaN 17621.0 7 875 \n", - "2 10_556101 1063 NaN 136909.0 0 875 \n", - "3 10_686663 443226 NaN 186611.0 1 875 \n", - "4 10_91656 316684 NaN 21559.0 2 875 \n", - "5 10_35956 106204 NaN NaN 1 875 \n", - "6 10_560058 1063 NaN 161812.0 0 875 \n", - "7 10_38603 513642 1865.0 7660.0 4 875 \n", - "8 10_563294 1063 NaN 167549.0 0 875 \n", - "9 10_548983 268636 NaN 173318.0 1 875 \n", + "0 5_4317407 969908 NaN 6156473.0 1 1771 \n", + "1 5_477635 109121 NaN 6213652.0 2 1771 \n", + "2 5_411639 92929 NaN 6160271.0 4 1771 \n", + "3 5_326623 79862 NaN 6140109.0 1 1771 \n", + "4 5_383915 85421 NaN 6149409.0 2 1771 \n", + "5 5_233172 141401 NaN 3324.0 1 1771 \n", + "6 5_389999 95759 NaN 6151025.0 1 1771 \n", + "7 5_4292211 78897 NaN 4729841.0 1 1771 \n", + "8 5_353553 84189 NaN 6146995.0 1 1771 \n", + "9 5_401296 3491 NaN 6155457.0 1 1771 \n", "\n", - " is_partner deleted_at is_email_true opt_in ... purchases_8_2021 \\\n", + " is_partner deleted_at is_email_true opt_in ... purchases_7_2022 \\\n", "0 False NaN True 0 ... 0.0 \n", "1 False NaN True 0 ... 0.0 \n", - "2 False NaN True 1 ... 0.0 \n", + "2 False NaN True 0 ... 0.0 \n", "3 False NaN True 1 ... 0.0 \n", - "4 False NaN True 0 ... 0.0 \n", - "5 False NaN True 0 ... 0.0 \n", - "6 False NaN True 1 ... 0.0 \n", + "4 False NaN True 1 ... 0.0 \n", + "5 False NaN True 1 ... 0.0 \n", + "6 False NaN True 0 ... 0.0 \n", "7 False NaN True 1 ... 0.0 \n", "8 False NaN True 1 ... 0.0 \n", "9 False NaN True 0 ... 0.0 \n", "\n", - " purchases_8_2022 purchases_9_2021 purchases_9_2022 y_has_purchased \\\n", - "0 0.0 0.0 0.0 0.0 \n", - "1 0.0 0.0 0.0 0.0 \n", - "2 0.0 0.0 0.0 0.0 \n", - "3 1.0 0.0 0.0 0.0 \n", - "4 0.0 0.0 0.0 0.0 \n", - "5 0.0 0.0 0.0 0.0 \n", - "6 0.0 0.0 0.0 0.0 \n", - "7 0.0 0.0 0.0 1.0 \n", - "8 0.0 0.0 0.0 0.0 \n", - "9 0.0 0.0 0.0 0.0 \n", + " purchases_8_2021 purchases_8_2022 purchases_9_2021 purchases_9_2022 \\\n", + "0 0.0 0.0 0.0 0.0 \n", + "1 0.0 0.0 0.0 0.0 \n", + "2 0.0 0.0 0.0 0.0 \n", + "3 0.0 0.0 1.0 0.0 \n", + "4 0.0 0.0 0.0 0.0 \n", + "5 0.0 0.0 0.0 1.0 \n", + "6 0.0 0.0 0.0 0.0 \n", + "7 0.0 0.0 0.0 0.0 \n", + "8 0.0 0.0 0.0 0.0 \n", + "9 0.0 0.0 0.0 0.0 \n", "\n", - " has_purchased has_purchased_estim score quartile score_adjusted \n", - "0 0.0 0.0 0.131180 1 0.017574 \n", - "1 0.0 0.0 0.321635 2 0.042466 \n", - "2 0.0 0.0 0.005068 1 0.000676 \n", - "3 0.0 0.0 0.166979 1 0.018397 \n", - "4 0.0 0.0 0.161523 1 0.018632 \n", - "5 0.0 0.0 0.098139 1 0.010129 \n", - "6 0.0 0.0 0.005377 1 0.000715 \n", - "7 1.0 1.0 0.906698 4 0.461388 \n", - "8 0.0 0.0 0.007399 1 0.000974 \n", - "9 0.0 0.0 0.163529 1 0.022102 \n", + " y_has_purchased has_purchased has_purchased_estim score quartile \n", + "0 0.0 0.0 0.0 0.445019 2 \n", + "1 0.0 0.0 0.0 0.382586 2 \n", + "2 0.0 0.0 1.0 0.916747 4 \n", + "3 0.0 0.0 0.0 0.090534 1 \n", + "4 0.0 0.0 0.0 0.346571 2 \n", + "5 0.0 0.0 1.0 0.924684 4 \n", + "6 0.0 0.0 1.0 0.569031 3 \n", + "7 0.0 0.0 0.0 0.125622 1 \n", + "8 0.0 0.0 0.0 0.229432 1 \n", + "9 0.0 0.0 1.0 0.503987 3 \n", "\n", - "[10 rows x 92 columns]" + "[10 rows x 91 columns]" ] }, - "execution_count": 94, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -1550,7 +1565,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 16, "id": "fb592fe3-ea40-4e83-8fe9-c52b9ee42f2a", "metadata": {}, "outputs": [], @@ -2041,7 +2056,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 17, "id": "f0379536-a6c5-4b16-bde5-d0319ec1b140", "metadata": {}, "outputs": [], @@ -2054,7 +2069,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 18, "id": "32a0dfd0-f49d-4785-a56f-706d381bfe41", "metadata": {}, "outputs": [], @@ -2070,7 +2085,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 19, "id": "2dff1def-02df-413e-afce-b4aeaf7752b6", "metadata": {}, "outputs": [], @@ -2081,7 +2096,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 20, "id": "683d71fc-7442-4028-869c-49c57592d6e9", "metadata": {}, "outputs": [], @@ -2104,7 +2119,7 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": 21, "id": "f17dc6ca-7a48-441b-8c04-11c47b8b9741", "metadata": {}, "outputs": [ @@ -2112,16 +2127,16 @@ "name": "stdout", "output_type": "stream", "text": [ - "0.3000275047453295 0.08797424180570736\n" + "0.31861289893787315 0.14317973692973693\n" ] }, { "data": { "text/plain": [ - "0.08763280798047211" + "0.14310053386734936" ] }, - "execution_count": 95, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -2133,17 +2148,17 @@ }, { "cell_type": "code", - "execution_count": 96, + "execution_count": 22, "id": "781b0d40-c954-4c54-830a-e709c8667328", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "10.698758485840244" + "5.939748066330849" ] }, - "execution_count": 96, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -2159,17 +2174,17 @@ }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 23, "id": "248cb862-418e-4767-9933-70c4885ecf40", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "10.688693734338177" + "6.01952986090399" ] }, - "execution_count": 97, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -2186,7 +2201,7 @@ }, { "cell_type": "code", - "execution_count": 98, + "execution_count": 24, "id": "fff6cbe6-7bb3-4732-9b81-b9ac5383bbcf", "metadata": {}, "outputs": [ @@ -2194,7 +2209,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "betâ test - betâ train = 0.00094118290869078\n" + "betâ test - betâ train = -0.013342440676233564\n" ] } ], @@ -2204,7 +2219,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 25, "id": "f506870d-4a8a-4b2c-8f0b-e0789080b20c", "metadata": {}, "outputs": [ @@ -2212,7 +2227,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "mean absolute erreur 4.674943825828751e-05\n" + "mean absolute erreur 0.0009061459618344602\n" ] } ], @@ -2227,7 +2242,7 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 26, "id": "8213d0e4-063b-49fa-90b7-677fc34f4c01", "metadata": {}, "outputs": [], @@ -2243,7 +2258,7 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 27, "id": "834d3723-2e72-4c65-9c62-e2d595c69461", "metadata": {}, "outputs": [ @@ -2251,10 +2266,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "MSE for score : 0.12309116071575532\n", - "MSE for ajusted score : 0.05482346713233594\n", - "sum of y_has_purchased : 13361.0\n", - "sum of adjusted scores : 13368.100024185826\n" + "MSE for score : 0.11809894130837426\n", + "MSE for ajusted score : 0.07434720017843571\n", + "sum of y_has_purchased : 13759.0\n", + "sum of adjusted scores : 13671.922997651252\n" ] } ], @@ -2272,7 +2287,7 @@ }, { "cell_type": "code", - "execution_count": 102, + "execution_count": 28, "id": "9f30a4dd-a9d8-405a-a7d5-5324ae88cf70", "metadata": {}, "outputs": [ @@ -2280,8 +2295,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "MAE for score : 0.25695361997840177\n", - "MAE for adjusted score : 0.10450649550597542\n" + "MAE for score : 0.24742788848313355\n", + "MAE for adjusted score : 0.14205672428104504\n" ] } ], @@ -2296,7 +2311,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 30, "id": "6f9396db-e213-408c-a596-eaeec3bc79f3", "metadata": {}, "outputs": [], @@ -2340,13 +2355,13 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 31, "id": "b478d40d-9677-4204-87bd-16fb0bc1fe9a", "metadata": {}, "outputs": [ { "data": { - "image/png": "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J+jq6iIoKKjC+7tgwQLcvHkTr732GkxNTWXzxowZg+zsbIwePfq56/niiy/w7rvvwtPTEx06dMAff/yB33//HYaGhmXOxdTUFJs3b8bPP/8MOzs7fPHFF1i2bFm59wkAli9fDhsbG3Tv3h0eHh6YPn069PT0pPkaGhpYvXo1vvnmG1hZWeGtt94CAIwePRojR47EiBEj4OLigqZNm6Jnz57P3V6bNm0QHh6OGzduoFu3bmjfvj3mzp0LS0vLUpd7/fXX8c4772DAgAFwdXWFvb09vv76a2l+RfNp0aIFQkNDcf78eXTq1AlOTk749ddfoaFRtsfpluV4zMvLw8SJE9GqVSv069cPtra2Uu5WVlY4ceIE8vLy4ObmBnt7e0yZMgVKpRJqavwoJCqkEGX94hERVbsePXqgXbt21fZLILXd9u3bMWXKFNy5c4cPTK4CAQEB2L17N399hegVxl8+IaJa7/Hjx4iPj0dgYCDGjRvHopCIqIpw/JyIar0lS5agXbt2MDc3x5w5c2o6HSKilxYvJRMRERERAI4YEhEREVEBFoZEREREBICFIREREREVYGFIRERERABYGBIRERFRARaGRERERASAhSERERERFWBhSEREREQAWBgSERERUYH/AxTvctmi4E3PAAAAAElFTkSuQmCC", + "image/png": "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", "text/plain": [ "
" ] @@ -2414,7 +2429,7 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 32, "id": "90c4c2b5-0ede-4001-889f-749cfbd9df04", "metadata": {}, "outputs": [ @@ -2449,30 +2464,30 @@ " \n", " 0\n", " 1\n", - " 8.80\n", - " 0.94\n", - " 1.02\n", + " 10.20\n", + " 1.94\n", + " 1.19\n", " \n", " \n", " 1\n", " 2\n", - " 36.16\n", - " 5.17\n", - " 4.70\n", + " 37.08\n", + " 9.12\n", + " 10.62\n", " \n", " \n", " 2\n", " 3\n", - " 61.06\n", - " 13.33\n", - " 14.62\n", + " 62.07\n", + " 22.00\n", + " 28.67\n", " \n", " \n", " 3\n", " 4\n", - " 89.86\n", - " 53.74\n", - " 53.19\n", + " 90.35\n", + " 67.16\n", + " 63.09\n", " \n", " \n", "\n", @@ -2480,13 +2495,13 @@ ], "text/plain": [ " quartile score (%) score adjusted (%) has purchased (%)\n", - "0 1 8.80 0.94 1.02\n", - "1 2 36.16 5.17 4.70\n", - "2 3 61.06 13.33 14.62\n", - "3 4 89.86 53.74 53.19" + "0 1 10.20 1.94 1.19\n", + "1 2 37.08 9.12 10.62\n", + "2 3 62.07 22.00 28.67\n", + "3 4 90.35 67.16 63.09" ] }, - "execution_count": 104, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -2535,7 +2550,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 129, "id": "a974589f-7952-4db2-bebf-7b69c6b09372", "metadata": {}, "outputs": [], @@ -2545,9 +2560,36 @@ " duration_ratio = duration_ref/duration_projection\n", "\n", " df_output = df\n", + " \n", + " # project number of tickets : at least 1 ticket purchased if the customer purchased\n", + " df_output.loc[:,\"nb_tickets_projected\"] = df_output.loc[:,nb_tickets].apply(lambda x : max(1, x /duration_ratio))\n", "\n", - " df_output.loc[:,\"nb_tickets_projected\"] = df_output.loc[:,nb_tickets] / duration_ratio\n", - " df_output.loc[:,\"total_amount_projected\"] = df_output.loc[:,total_amount] / duration_ratio\n", + " # project amount : if the customer buys a ticket, we expect the amount to be at least the average price of tickets \n", + " # for customers purchasing exactly one ticket\n", + " if df_output.loc[df_output[nb_tickets]==1].shape[0] > 0 :\n", + " avg_price = df_output.loc[df_output[nb_tickets]==1][total_amount].mean()\n", + " else :\n", + " avg_price = df_output[total_amount].mean()\n", + " # df_output.loc[:,\"total_amount_projected\"] = df_output.loc[:,total_amount] / duration_ratio\n", + " # df_output.loc[:,\"total_amount_projected\"] = df_output.loc[:,total_amount].apply(lambda x : max(avg_ticket_price, x/duration_ratio))\n", + "\n", + " # we compute the avg price of ticket for each customer\n", + " df_output[\"avg_ticket_price\"] = df_output[total_amount]/df_output[nb_tickets]\n", + "\n", + " # correct negatives total amounts\n", + " df_output.loc[:,\"total_amount_corrected\"] = np.where(df_output[total_amount] < 0, \n", + " avg_price * df_output[nb_tickets],\n", + " df_output[total_amount])\n", + " \n", + " df_output.loc[:,\"total_amount_projected\"] = np.where(\n", + " # if no ticket bought in the past, we take the average price\n", + " df_output[nb_tickets]==0, avg_price,\n", + " # if avg prices of tickets are negative, we recompute the expected amount based on the avg price of a ticket\n", + " # observed on the whole population\n", + " np.where(X_test_segment[\"avg_ticket_price\"] < 0, avg_price * df_output.loc[:,\"nb_tickets_projected\"],\n", + " # else, the amount projected is the average price of tickets bought by the customer * nb tickets projected\n", + " df_output[\"avg_ticket_price\"] * df_output.loc[:,\"nb_tickets_projected\"])\n", + " )\n", " \n", " df_output.loc[:,\"nb_tickets_expected\"] = df_output.loc[:,score_adjusted] * df_output.loc[:,\"nb_tickets_projected\"]\n", " df_output.loc[:,\"total_amount_expected\"] = df_output.loc[:,score_adjusted] * df_output.loc[:,\"total_amount_projected\"]\n", @@ -2559,7 +2601,377 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 120, + "id": "87fb8e1c-3567-46df-9e98-197b7ca3becd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([25., 92., 45., ..., 0., 0., 0.])" + ] + }, + "execution_count": 120, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.where(X_test_segment[\"total_amount\"] < 0, avg_price * X_test_segment[\"nb_tickets\"],\n", + " X_test_segment[\"total_amount\"]\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "id": "dc0cdf9c-c55c-4085-80a6-c2131bb22ad4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 25.00\n", + "1 92.00\n", + "2 45.00\n", + "3 10.00\n", + "4 127.00\n", + " ... \n", + "96091 0.00\n", + "96092 100.89\n", + "96093 0.00\n", + "96094 0.00\n", + "96095 0.00\n", + "Name: total_amount, Length: 96096, dtype: float64" + ] + }, + "execution_count": 121, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + " X_test_segment[\"total_amount\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "id": "51455654-e6de-4608-8fbe-594d7fcd5b53", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, 98)" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_test_segment.loc[X_test_segment[\"nb_tickets\"]==-1].shape[0°" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "a0d08a46-93d0-425a-9a56-28cf8bfd93e9", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 4.410500e+04\n", + "mean 4.640310e+02\n", + "std 1.049793e+04\n", + "min -2.064700e+04\n", + "25% 3.000000e+01\n", + "50% 6.900000e+01\n", + "75% 1.339900e+02\n", + "max 1.209751e+06\n", + "Name: total_amount, dtype: float64" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "duration_ratio = 17/12\n", + "X_test_segment.loc[X_test_segment[\"nb_tickets\"]>0][\"total_amount\"].describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "dc7de319-6d22-44f0-9e58-492088b0dd5f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 96096.000000\n", + "mean 183.851977\n", + "std 5021.379770\n", + "min 48.713098\n", + "25% 48.713098\n", + "50% 48.713098\n", + "75% 48.713098\n", + "max 853942.164706\n", + "Name: total_amount, dtype: float64" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "avg_price = X_test_segment.loc[X_test_segment[\"nb_tickets\"]==1][\"total_amount\"].mean()\n", + "X_test_segment[\"total_amount\"].apply(lambda x : max(avg_price, x/duration_ratio)).describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "8aa50962-067b-493a-8766-258547da8bcd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 96096.000000\n", + "mean 150.335598\n", + "std 5022.896337\n", + "min -14574.352941\n", + "25% 0.000000\n", + "50% 0.000000\n", + "75% 42.352941\n", + "max 853942.164706\n", + "Name: total_amount, dtype: float64" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_test_segment[\"total_amount\"].apply(lambda x : x/duration_ratio).describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "f2f04205-7b8b-4978-9b4f-1c83034628fe", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 1.411765\n", + "1 1.411765\n", + "2 2.117647\n", + "3 0.705882\n", + "4 5.647059\n", + " ... \n", + "96091 0.000000\n", + "96092 1.411765\n", + "96093 0.000000\n", + "96094 0.000000\n", + "96095 0.000000\n", + "Name: nb_tickets, Length: 96096, dtype: float64" + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_test_segment.loc[:,\"nb_tickets\"]/duration_ratio" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "140e09b9-f6b8-4075-b380-86851e1596f1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 96096.000000\n", + "mean 176.690937\n", + "std 5022.166115\n", + "min -14574.352941\n", + "25% 48.713098\n", + "50% 48.713098\n", + "75% 48.713098\n", + "max 853942.164706\n", + "dtype: float64" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.Series(np.where(X_test_segment[\"nb_tickets\"]==0, avg_price, X_test_segment[\"nb_tickets_projected\"] * X_test_segment[\"total_amount\"]/X_test_segment[\"nb_tickets\"])).describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "b2c8c7dd-9cd2-40b8-945f-0daf27b3b66b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 162.000000\n", + "mean 51.283951\n", + "std 135.183724\n", + "min 1.000000\n", + "25% 2.000000\n", + "50% 6.000000\n", + "75% 31.500000\n", + "max 1038.000000\n", + "Name: nb_tickets, dtype: float64" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_test_segment[X_test_segment[\"total_amount\"]<0][\"nb_tickets\"].describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "44ce62e3-fae6-4192-b8dd-386fd84fed22", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 44105.000000\n", + "mean 35.661188\n", + "std 71.477667\n", + "min -216.368182\n", + "25% 10.000000\n", + "50% 25.000000\n", + "75% 48.720000\n", + "max 4000.000000\n", + "Name: avg_ticket_price, dtype: float64" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# code pr projet revenue\n", + "\n", + "X_test_segment[\"avg_ticket_price\"] = X_test_segment[\"total_amount\"]/X_test_segment[\"nb_tickets\"]\n", + "X_test_segment[\"avg_ticket_price\"].describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "id": "e1c0671a-2b5f-48bf-b964-6bee8a4223ac", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 96096.000000\n", + "mean 180.394197\n", + "std 5025.591726\n", + "min 0.000000\n", + "25% 48.713098\n", + "50% 48.713098\n", + "75% 48.713098\n", + "max 853942.164706\n", + "dtype: float64" + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pd.Series(\n", + " np.where(X_test_segment[\"nb_tickets\"]==0, avg_price,\n", + " \n", + " np.where(X_test_segment[\"avg_ticket_price\"] < 0, avg_price * X_test_segment[\"nb_tickets\"] / duration_ratio,\n", + " X_test_segment[\"avg_ticket_price\"] * X_test_segment[\"nb_tickets\"] / duration_ratio)\n", + " )\n", + ").describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "id": "6c1e0649-3be1-4754-a86c-24b46a12d523", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 5058.000000\n", + "mean 13.671807\n", + "std 155.341970\n", + "min 1.000000\n", + "25% 1.000000\n", + "50% 2.000000\n", + "75% 4.000000\n", + "max 8250.000000\n", + "Name: nb_tickets, dtype: float64" + ] + }, + "execution_count": 100, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_test_segment[X_test_segment[\"avg_ticket_price\"] == 0][\"nb_tickets\"].describe()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2a4d1b0a-fe16-49e7-9b61-d822d2ed062a", + "metadata": {}, + "outputs": [], + "source": [ + "df['colonne2'] = np.where(df['colonne1'] > seuil2, df['colonne2'] * 2, # Si colonne1 > seuil2\n", + " np.where(df['colonne1'] > seuil1, df['colonne2'] + 1, df['colonne2'])) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa87726a-dee2-4b15-af2d-b22583a9eb53", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 132, "id": "dd8a52e1-d06e-4790-8687-8e58e3e6b84e", "metadata": {}, "outputs": [ @@ -2595,8 +3007,6 @@ " is_email_true\n", " opt_in\n", " ...\n", - " has_purchased\n", - " has_purchased_estim\n", " score\n", " quartile\n", " score_adjusted\n", @@ -2605,128 +3015,130 @@ " nb_tickets_expected\n", " total_amount_expected\n", " pace_purchase\n", + " avg_ticket_price\n", + " total_amount_corrected\n", " \n", " \n", " \n", " \n", " 0\n", - " 1_8191\n", - " 8114\n", + " 5_4317407\n", + " 969908\n", " NaN\n", - " 834.0\n", - " 0\n", - " 1311\n", + " 6156473.0\n", + " 1\n", + " 1771\n", " False\n", " NaN\n", " True\n", - " 1\n", + " 0\n", " ...\n", - " 0.0\n", - " 0.0\n", - " 0.408546\n", + " 0.445019\n", " 2\n", - " 0.027066\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", - " NaN\n", + " 0.117551\n", + " 1.411765\n", + " 17.647059\n", + " 0.165955\n", + " 2.074432\n", + " 17.000000\n", + " 12.500\n", + " 25.00\n", " \n", " \n", " 1\n", - " 1_14792\n", - " 2\n", + " 5_477635\n", + " 109121\n", " NaN\n", - " 251178.0\n", - " 0\n", - " 1311\n", + " 6213652.0\n", + " 2\n", + " 1771\n", " False\n", " NaN\n", " True\n", - " 1\n", + " 0\n", " ...\n", - " 0.0\n", - " 0.0\n", - " 0.027046\n", - " 1\n", - " 0.001118\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", - " NaN\n", + " 0.382586\n", + " 2\n", + " 0.093333\n", + " 1.411765\n", + " 64.941176\n", + " 0.131765\n", + " 6.061181\n", + " 8.500000\n", + " 46.000\n", + " 92.00\n", " \n", " \n", " 2\n", - " 1_30466\n", - " 2\n", + " 5_411639\n", + " 92929\n", " NaN\n", - " 2355.0\n", - " 0\n", - " 1311\n", + " 6160271.0\n", + " 4\n", + " 1771\n", " False\n", " NaN\n", " True\n", - " 1\n", + " 0\n", " ...\n", - " 0.0\n", - " 0.0\n", - " 0.180851\n", - " 1\n", - " 0.008813\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", - " NaN\n", + " 0.916747\n", + " 4\n", + " 0.646556\n", + " 2.117647\n", + " 31.764706\n", + " 1.369178\n", + " 20.537670\n", + " 5.666667\n", + " 15.000\n", + " 45.00\n", " \n", " \n", " 3\n", - " 1_41898\n", - " 20244\n", - " 203714.0\n", - " 97973.0\n", - " 0\n", - " 1311\n", + " 5_326623\n", + " 79862\n", + " NaN\n", + " 6140109.0\n", + " 1\n", + " 1771\n", " False\n", " NaN\n", " True\n", " 1\n", " ...\n", - " 0.0\n", - " 0.0\n", - " 0.220872\n", + " 0.090534\n", " 1\n", - " 0.011288\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", - " NaN\n", + " 0.016268\n", + " 1.000000\n", + " 10.000000\n", + " 0.016268\n", + " 0.162683\n", + " 17.000000\n", + " 10.000\n", + " 10.00\n", " \n", " \n", " 4\n", - " 1_58746\n", - " 2\n", + " 5_383915\n", + " 85421\n", " NaN\n", - " 82026.0\n", - " 1\n", - " 1311\n", + " 6149409.0\n", + " 2\n", + " 1771\n", " False\n", " NaN\n", " True\n", " 1\n", " ...\n", - " 0.0\n", - " 0.0\n", - " 0.100951\n", - " 1\n", - " 0.004502\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", - " NaN\n", + " 0.346571\n", + " 2\n", + " 0.080976\n", + " 5.647059\n", + " 89.647059\n", + " 0.457279\n", + " 7.259298\n", + " 8.500000\n", + " 15.875\n", + " 127.00\n", " \n", " \n", " ...\n", @@ -2753,205 +3165,207 @@ " ...\n", " \n", " \n", - " 186115\n", - " 4_24295\n", - " 103884\n", + " 96091\n", + " 9_91205\n", + " 76215\n", " NaN\n", - " 96913.0\n", + " 47280.0\n", " 0\n", - " 1342\n", + " 1490\n", " False\n", " NaN\n", " True\n", " 1\n", " ...\n", - " 0.0\n", - " 0.0\n", - " 0.466644\n", - " 2\n", - " 0.034037\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", - " NaN\n", - " \n", - " \n", - " 186116\n", - " 4_44443\n", - " 43315\n", - " NaN\n", - " 234734.0\n", - " 0\n", - " 1342\n", - " False\n", - " NaN\n", - " True\n", - " 0\n", - " ...\n", - " 0.0\n", - " 0.0\n", - " 0.427641\n", - " 2\n", - " 0.029211\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", - " NaN\n", - " \n", - " \n", - " 186117\n", - " 4_3343947\n", - " 2\n", - " NaN\n", - " NaN\n", + " 0.014966\n", " 1\n", - " 1342\n", + " 0.002518\n", + " 1.000000\n", + " 48.713098\n", + " 0.002518\n", + " 0.122642\n", + " NaN\n", + " NaN\n", + " 0.00\n", + " \n", + " \n", + " 96092\n", + " 9_369887\n", + " 815891\n", + " NaN\n", + " 30764537.0\n", + " 4\n", + " 1490\n", " False\n", " NaN\n", " True\n", " 0\n", " ...\n", - " 0.0\n", - " 0.0\n", - " 0.468464\n", - " 2\n", - " 0.034278\n", - " 0.705882\n", - " 20.470588\n", - " 0.024196\n", - " 0.701686\n", - " 17.0\n", + " 0.834257\n", + " 4\n", + " 0.455392\n", + " 1.411765\n", + " 71.216471\n", + " 0.642906\n", + " 32.431379\n", + " 8.500000\n", + " 50.445\n", + " 100.89\n", " \n", " \n", - " 186118\n", - " 4_47752\n", - " 46460\n", + " 96093\n", + " 9_1007562\n", + " 1\n", + " NaN\n", " NaN\n", - " 89791.0\n", " 0\n", - " 1342\n", + " 1490\n", + " False\n", + " NaN\n", + " True\n", + " 0\n", + " ...\n", + " 0.062886\n", + " 1\n", + " 0.011025\n", + " 1.000000\n", + " 48.713098\n", + " 0.011025\n", + " 0.537071\n", + " NaN\n", + " NaN\n", + " 0.00\n", + " \n", + " \n", + " 96094\n", + " 9_15037\n", + " 12992\n", + " NaN\n", + " 2213448.0\n", + " 0\n", + " 1490\n", " False\n", " NaN\n", " True\n", " 1\n", " ...\n", - " 0.0\n", - " 0.0\n", - " 0.360100\n", - " 2\n", - " 0.022161\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", + " 0.068998\n", + " 1\n", + " 0.012162\n", + " 1.000000\n", + " 48.713098\n", + " 0.012162\n", + " 0.592451\n", " NaN\n", + " NaN\n", + " 0.00\n", " \n", " \n", - " 186119\n", - " 4_35449\n", - " 34592\n", + " 96095\n", + " 9_135370\n", + " 76215\n", " NaN\n", - " 119197.0\n", + " 2164740.0\n", " 0\n", - " 1342\n", + " 1490\n", " False\n", " NaN\n", " True\n", " 1\n", " ...\n", - " 0.0\n", - " 1.0\n", - " 0.728907\n", - " 3\n", - " 0.097705\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", - " 0.000000\n", + " 0.018486\n", + " 1\n", + " 0.003119\n", + " 1.000000\n", + " 48.713098\n", + " 0.003119\n", + " 0.151938\n", " NaN\n", + " NaN\n", + " 0.00\n", " \n", " \n", "\n", - "

186120 rows × 97 columns

\n", + "

96096 rows × 99 columns

\n", "" ], "text/plain": [ - " customer_id street_id structure_id mcp_contact_id fidelity \\\n", - "0 1_8191 8114 NaN 834.0 0 \n", - "1 1_14792 2 NaN 251178.0 0 \n", - "2 1_30466 2 NaN 2355.0 0 \n", - "3 1_41898 20244 203714.0 97973.0 0 \n", - "4 1_58746 2 NaN 82026.0 1 \n", - "... ... ... ... ... ... \n", - "186115 4_24295 103884 NaN 96913.0 0 \n", - "186116 4_44443 43315 NaN 234734.0 0 \n", - "186117 4_3343947 2 NaN NaN 1 \n", - "186118 4_47752 46460 NaN 89791.0 0 \n", - "186119 4_35449 34592 NaN 119197.0 0 \n", + " customer_id street_id structure_id mcp_contact_id fidelity \\\n", + "0 5_4317407 969908 NaN 6156473.0 1 \n", + "1 5_477635 109121 NaN 6213652.0 2 \n", + "2 5_411639 92929 NaN 6160271.0 4 \n", + "3 5_326623 79862 NaN 6140109.0 1 \n", + "4 5_383915 85421 NaN 6149409.0 2 \n", + "... ... ... ... ... ... \n", + "96091 9_91205 76215 NaN 47280.0 0 \n", + "96092 9_369887 815891 NaN 30764537.0 4 \n", + "96093 9_1007562 1 NaN NaN 0 \n", + "96094 9_15037 12992 NaN 2213448.0 0 \n", + "96095 9_135370 76215 NaN 2164740.0 0 \n", "\n", - " tenant_id is_partner deleted_at is_email_true opt_in ... \\\n", - "0 1311 False NaN True 1 ... \n", - "1 1311 False NaN True 1 ... \n", - "2 1311 False NaN True 1 ... \n", - "3 1311 False NaN True 1 ... \n", - "4 1311 False NaN True 1 ... \n", - "... ... ... ... ... ... ... \n", - "186115 1342 False NaN True 1 ... \n", - "186116 1342 False NaN True 0 ... \n", - "186117 1342 False NaN True 0 ... \n", - "186118 1342 False NaN True 1 ... \n", - "186119 1342 False NaN True 1 ... \n", + " tenant_id is_partner deleted_at is_email_true opt_in ... \\\n", + "0 1771 False NaN True 0 ... \n", + "1 1771 False NaN True 0 ... \n", + "2 1771 False NaN True 0 ... \n", + "3 1771 False NaN True 1 ... \n", + "4 1771 False NaN True 1 ... \n", + "... ... ... ... ... ... ... \n", + "96091 1490 False NaN True 1 ... \n", + "96092 1490 False NaN True 0 ... \n", + "96093 1490 False NaN True 0 ... \n", + "96094 1490 False NaN True 1 ... \n", + "96095 1490 False NaN True 1 ... \n", "\n", - " has_purchased has_purchased_estim score quartile score_adjusted \\\n", - "0 0.0 0.0 0.408546 2 0.027066 \n", - "1 0.0 0.0 0.027046 1 0.001118 \n", - "2 0.0 0.0 0.180851 1 0.008813 \n", - "3 0.0 0.0 0.220872 1 0.011288 \n", - "4 0.0 0.0 0.100951 1 0.004502 \n", - "... ... ... ... ... ... \n", - "186115 0.0 0.0 0.466644 2 0.034037 \n", - "186116 0.0 0.0 0.427641 2 0.029211 \n", - "186117 0.0 0.0 0.468464 2 0.034278 \n", - "186118 0.0 0.0 0.360100 2 0.022161 \n", - "186119 0.0 1.0 0.728907 3 0.097705 \n", + " score quartile score_adjusted nb_tickets_projected \\\n", + "0 0.445019 2 0.117551 1.411765 \n", + "1 0.382586 2 0.093333 1.411765 \n", + "2 0.916747 4 0.646556 2.117647 \n", + "3 0.090534 1 0.016268 1.000000 \n", + "4 0.346571 2 0.080976 5.647059 \n", + "... ... ... ... ... \n", + "96091 0.014966 1 0.002518 1.000000 \n", + "96092 0.834257 4 0.455392 1.411765 \n", + "96093 0.062886 1 0.011025 1.000000 \n", + "96094 0.068998 1 0.012162 1.000000 \n", + "96095 0.018486 1 0.003119 1.000000 \n", "\n", - " nb_tickets_projected total_amount_projected nb_tickets_expected \\\n", - "0 0.000000 0.000000 0.000000 \n", - "1 0.000000 0.000000 0.000000 \n", - "2 0.000000 0.000000 0.000000 \n", - "3 0.000000 0.000000 0.000000 \n", - "4 0.000000 0.000000 0.000000 \n", - "... ... ... ... \n", - "186115 0.000000 0.000000 0.000000 \n", - "186116 0.000000 0.000000 0.000000 \n", - "186117 0.705882 20.470588 0.024196 \n", - "186118 0.000000 0.000000 0.000000 \n", - "186119 0.000000 0.000000 0.000000 \n", + " total_amount_projected nb_tickets_expected total_amount_expected \\\n", + "0 17.647059 0.165955 2.074432 \n", + "1 64.941176 0.131765 6.061181 \n", + "2 31.764706 1.369178 20.537670 \n", + "3 10.000000 0.016268 0.162683 \n", + "4 89.647059 0.457279 7.259298 \n", + "... ... ... ... \n", + "96091 48.713098 0.002518 0.122642 \n", + "96092 71.216471 0.642906 32.431379 \n", + "96093 48.713098 0.011025 0.537071 \n", + "96094 48.713098 0.012162 0.592451 \n", + "96095 48.713098 0.003119 0.151938 \n", "\n", - " total_amount_expected pace_purchase \n", - "0 0.000000 NaN \n", - "1 0.000000 NaN \n", - "2 0.000000 NaN \n", - "3 0.000000 NaN \n", - "4 0.000000 NaN \n", - "... ... ... \n", - "186115 0.000000 NaN \n", - "186116 0.000000 NaN \n", - "186117 0.701686 17.0 \n", - "186118 0.000000 NaN \n", - "186119 0.000000 NaN \n", + " pace_purchase avg_ticket_price total_amount_corrected \n", + "0 17.000000 12.500 25.00 \n", + "1 8.500000 46.000 92.00 \n", + "2 5.666667 15.000 45.00 \n", + "3 17.000000 10.000 10.00 \n", + "4 8.500000 15.875 127.00 \n", + "... ... ... ... \n", + "96091 NaN NaN 0.00 \n", + "96092 8.500000 50.445 100.89 \n", + "96093 NaN NaN 0.00 \n", + "96094 NaN NaN 0.00 \n", + "96095 NaN NaN 0.00 \n", "\n", - "[186120 rows x 97 columns]" + "[96096 rows x 99 columns]" ] }, - "execution_count": 41, + "execution_count": 132, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "# project nb tickets and CA\n", + "\n", "X_test_segment = project_tickets_CA (X_test_segment, \"nb_purchases\", \"nb_tickets\", \"total_amount\", \"score_adjusted\", \n", " duration_ref=17, duration_projection=12)\n", "X_test_segment" @@ -2959,7 +3373,115 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 124, + "id": "22222709-218e-43b5-815f-714dfb776230", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 9.609600e+04\n", + "mean 2.182217e+02\n", + "std 7.120650e+03\n", + "min 0.000000e+00\n", + "25% 0.000000e+00\n", + "50% 0.000000e+00\n", + "75% 6.100000e+01\n", + "max 1.209751e+06\n", + "Name: total_amount_corrected, dtype: float64" + ] + }, + "execution_count": 124, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_test_segment[\"total_amount_corrected\"].describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "id": "73404bdd-e2f2-40e0-8bde-224c460426c5", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 44105.000000\n", + "mean 35.661188\n", + "std 71.477667\n", + "min -216.368182\n", + "25% 10.000000\n", + "50% 25.000000\n", + "75% 48.720000\n", + "max 4000.000000\n", + "Name: avg_ticket_price, dtype: float64" + ] + }, + "execution_count": 111, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_test_segment[\"avg_ticket_price\"].describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "id": "f96536d3-fff7-4ccf-be3d-34e671852cd8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.052634865134865136" + ] + }, + "execution_count": 113, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(X_test_segment[\"total_amount_projected\"]==0).mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "id": "884416e8-edec-4f6b-a40f-1a7c5d653160", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 96096.000000\n", + "mean 4.442483\n", + "std 64.952589\n", + "min 1.000000\n", + "25% 1.000000\n", + "50% 1.000000\n", + "75% 1.411765\n", + "max 11472.000000\n", + "Name: nb_tickets_projected, dtype: float64" + ] + }, + "execution_count": 115, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_test_segment[\"nb_tickets_projected\"].describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 35, "id": "cb66a8ea-65f7-460f-b3fc-ba76a3b91faa", "metadata": {}, "outputs": [ @@ -2967,14 +3489,14 @@ "data": { "text/plain": [ "quartile\n", - "1 16.722853\n", - "2 16.568788\n", - "3 15.765899\n", - "4 13.263500\n", + "1 15.330011\n", + "2 15.314322\n", + "3 14.031588\n", + "4 8.562546\n", "Name: pace_purchase, dtype: float64" ] }, - "execution_count": 42, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -2985,7 +3507,37 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 128, + "id": "8a4eec5c-8a4d-4a2b-9afb-1d49c77f78ea", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 162.000000\n", + "mean 3112.018089\n", + "std 8392.717823\n", + "min 51.843098\n", + "25% 161.889295\n", + "50% 395.635139\n", + "75% 2141.696184\n", + "max 69988.895986\n", + "dtype: float64" + ] + }, + "execution_count": 128, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(X_test[((X_test[\"total_amount_corrected\"] - X_test[\"total_amount\"])>0)][\"total_amount_corrected\"]\n", + " -X_test[((X_test[\"total_amount_corrected\"] - X_test[\"total_amount\"])>0)][\"total_amount\"]) .describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 118, "id": "f58f9151-2f91-45df-abb7-1ddcf0652adc", "metadata": {}, "outputs": [], @@ -3010,6 +3562,9 @@ " df_expected_CA[\"revenue_recovered_perct\"] = 100 * duration_ratio * df_expected_CA[total_amount_expected] / \\\n", " df.groupby(segment)[total_amount].sum().values\n", "\n", + " df_expected_CA[\"share_future_revenue_perct\"] = 100 * duration_ratio * df_expected_CA[total_amount_expected] / \\\n", + " df[total_amount].sum()\n", + "\n", " df_drop_null_pace = df.dropna(subset=[pace_purchase])\n", " df_expected_CA[\"pace_purchase\"] = df_drop_null_pace.groupby(segment)[pace_purchase].mean().values\n", " \n", @@ -3018,7 +3573,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 133, "id": "c8df6c80-43e8-4f00-9cd3-eb9022744313", "metadata": {}, "outputs": [ @@ -3049,6 +3604,7 @@ " nb_tickets_expected\n", " total_amount_expected\n", " revenue_recovered_perct\n", + " share_future_revenue_perct\n", " pace_purchase\n", " \n", " \n", @@ -3056,42 +3612,46 @@ " \n", " 0\n", " 1\n", - " 81622\n", - " 43.85\n", - " 263.12\n", - " 3258.54\n", - " 0.88\n", - " 16.72\n", + " 54123\n", + " 56.32\n", + " 1480.36\n", + " 55345.21\n", + " 11.99\n", + " 0.37\n", + " 15.33\n", " \n", " \n", " 1\n", " 2\n", - " 60811\n", - " 32.67\n", - " 1984.56\n", - " 27052.82\n", - " 2.47\n", - " 16.57\n", + " 18181\n", + " 18.92\n", + " 4381.84\n", + " 130503.26\n", + " 11.65\n", + " 0.88\n", + " 15.31\n", " \n", " \n", " 2\n", " 3\n", - " 28913\n", - " 15.53\n", - " 3476.63\n", - " 43945.79\n", - " 6.34\n", - " 15.77\n", + " 11111\n", + " 11.56\n", + " 8827.97\n", + " 285945.50\n", + " 24.00\n", + " 1.93\n", + " 14.03\n", " \n", " \n", " 3\n", " 4\n", - " 14774\n", - " 7.94\n", - " 58598.68\n", - " 523568.93\n", - " 60.03\n", - " 13.26\n", + " 12681\n", + " 13.20\n", + " 239758.61\n", + " 10313321.91\n", + " 85.74\n", + " 69.67\n", + " 8.56\n", " \n", " \n", "\n", @@ -3099,31 +3659,115 @@ ], "text/plain": [ " quartile size size_perct nb_tickets_expected total_amount_expected \\\n", - "0 1 81622 43.85 263.12 3258.54 \n", - "1 2 60811 32.67 1984.56 27052.82 \n", - "2 3 28913 15.53 3476.63 43945.79 \n", - "3 4 14774 7.94 58598.68 523568.93 \n", + "0 1 54123 56.32 1480.36 55345.21 \n", + "1 2 18181 18.92 4381.84 130503.26 \n", + "2 3 11111 11.56 8827.97 285945.50 \n", + "3 4 12681 13.20 239758.61 10313321.91 \n", "\n", - " revenue_recovered_perct pace_purchase \n", - "0 0.88 16.72 \n", - "1 2.47 16.57 \n", - "2 6.34 15.77 \n", - "3 60.03 13.26 " + " revenue_recovered_perct share_future_revenue_perct pace_purchase \n", + "0 11.99 0.37 15.33 \n", + "1 11.65 0.88 15.31 \n", + "2 24.00 1.93 14.03 \n", + "3 85.74 69.67 8.56 " ] }, - "execution_count": 44, + "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "\"\"\"\n", "X_test_expected_CA = round(summary_expected_CA(df=X_test_segment, segment=\"quartile\", \n", " nb_tickets_expected=\"nb_tickets_expected\", total_amount_expected=\"total_amount_expected\", \n", " total_amount=\"total_amount\", pace_purchase=\"pace_purchase\"),2)\n", - "\n", + " \"\"\"\n", + "X_test_expected_CA = round(summary_expected_CA(df=X_test_segment, segment=\"quartile\", \n", + " nb_tickets_expected=\"nb_tickets_expected\", total_amount_expected=\"total_amount_expected\", \n", + " total_amount=\"total_amount_corrected\", pace_purchase=\"pace_purchase\"),2)\n", "X_test_expected_CA" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "dd25c898-9991-4cc4-8e69-160b61fea0c4", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 116, + "id": "63369c2a-a842-4b03-aa11-230287cb3b69", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "count 96096.000000\n", + "mean 4.442483\n", + "std 64.952589\n", + "min 1.000000\n", + "25% 1.000000\n", + "50% 1.000000\n", + "75% 1.411765\n", + "max 11472.000000\n", + "Name: nb_tickets_projected, dtype: float64\n" + ] + }, + { + "data": { + "text/plain": [ + "count 96096.000000\n", + "mean 2.647860\n", + "std 59.108910\n", + "min 0.001335\n", + "25% 0.015281\n", + "50% 0.044399\n", + "75% 0.230742\n", + "max 11450.589975\n", + "Name: nb_tickets_expected, dtype: float64" + ] + }, + "execution_count": 116, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "print(X_test_segment[\"nb_tickets_projected\"].describe())\n", + "X_test_segment[\"nb_tickets_expected\"].describe()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "id": "72af97dc-8558-4591-adcf-ad404c9cb3f2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "quartile\n", + "1 0.029070\n", + "2 0.074526\n", + "3 0.078737\n", + "4 0.817668\n", + "Name: total_amount, dtype: float64" + ] + }, + "execution_count": 117, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# we can recover share future revenue by multipling the share of amount by quartile * revenue recovered\n", + "X_test_segment.groupby(\"quartile\")[\"total_amount\"].sum()/X_test_segment[\"total_amount\"].sum()" + ] + }, { "cell_type": "code", "execution_count": 64, diff --git a/utils_sales_forecast.py b/utils_sales_forecast.py index 2f8a9c3..dd8d2c8 100644 --- a/utils_sales_forecast.py +++ b/utils_sales_forecast.py @@ -167,7 +167,8 @@ def plot_hist_scores(df, score, score_adjusted, type_of_activity) : # plt.show() -def project_tickets_CA (df, nb_purchases, nb_tickets, total_amount, score_adjusted, duration_ref, duration_projection) : +def project_tickets_CA (df, nb_purchases, nb_tickets, total_amount, score_adjusted, duration_ref, duration_projection) : + """ Project ticket counts and total amount for a given duration and adjust based on a score. @@ -184,13 +185,38 @@ def project_tickets_CA (df, nb_purchases, nb_tickets, total_amount, score_adjust DataFrame: DataFrame with projected ticket counts and total amount adjusted based on the score. duration_ratio = duration_ref/duration_projection """ - + duration_ratio = duration_ref/duration_projection df_output = df + + # project number of tickets : at least 1 ticket purchased if the customer purchased + df_output.loc[:,"nb_tickets_projected"] = df_output.loc[:,nb_tickets].apply(lambda x : max(1, x /duration_ratio)) - df_output.loc[:,"nb_tickets_projected"] = df_output.loc[:,nb_tickets] / duration_ratio - df_output.loc[:,"total_amount_projected"] = df_output.loc[:,total_amount] / duration_ratio + # project amount : if the customer buys a ticket, we expect the amount to be at least the average price of tickets + # for customers purchasing exactly one ticket + if df_output.loc[df_output[nb_tickets]==1].shape[0] > 0 : + avg_price = df_output.loc[df_output[nb_tickets]==1][total_amount].mean() + else : + avg_price = df_output[total_amount].mean() + + # we compute the avg price of ticket for each customer + df_output["avg_ticket_price"] = df_output[total_amount]/df_output[nb_tickets] + + # correct negatives total amounts + df_output.loc[:,"total_amount_corrected"] = np.where(df_output[total_amount] < 0, + avg_price * df_output[nb_tickets], + df_output[total_amount]) + + df_output.loc[:,"total_amount_projected"] = np.where( + # if no ticket bought in the past, we take the average price + df_output[nb_tickets]==0, avg_price, + # if avg prices of tickets are negative, we recompute the expected amount based on the avg price of a ticket + # observed on the whole population + np.where(X_test_segment["avg_ticket_price"] < 0, avg_price * df_output.loc[:,"nb_tickets_projected"], + # else, the amount projected is the average price of tickets bought by the customer * nb tickets projected + df_output["avg_ticket_price"] * df_output.loc[:,"nb_tickets_projected"]) + ) df_output.loc[:,"nb_tickets_expected"] = df_output.loc[:,score_adjusted] * df_output.loc[:,"nb_tickets_projected"] df_output.loc[:,"total_amount_expected"] = df_output.loc[:,score_adjusted] * df_output.loc[:,"total_amount_projected"] @@ -198,7 +224,7 @@ def project_tickets_CA (df, nb_purchases, nb_tickets, total_amount, score_adjust df_output.loc[:,"pace_purchase"] = (duration_ref/df_output.loc[:,nb_purchases]).apply(lambda x : np.nan if x==np.inf else x) return df_output - + def summary_expected_CA(df, segment, nb_tickets_expected, total_amount_expected, total_amount, pace_purchase, duration_ref=17, duration_projection=12) : @@ -231,6 +257,9 @@ def summary_expected_CA(df, segment, nb_tickets_expected, total_amount_expected, df_expected_CA["revenue_recovered_perct"] = 100 * duration_ratio * df_expected_CA[total_amount_expected] / \ df.groupby(segment)[total_amount].sum().values + df_expected_CA["share_future_revenue_perct"] = 100 * duration_ratio * df_expected_CA[total_amount_expected] / \ + df[total_amount].sum() + df_drop_null_pace = df.dropna(subset=[pace_purchase]) df_expected_CA["pace_purchase"] = df_drop_null_pace.groupby(segment)[pace_purchase].mean().values