diff --git a/Spectacle/Stat_desc.ipynb b/Spectacle/Stat_desc.ipynb index 8abf0c9..d5d4a08 100644 --- a/Spectacle/Stat_desc.ipynb +++ b/Spectacle/Stat_desc.ipynb @@ -18,7 +18,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 26, "id": "aa915888-cede-4eb0-8a26-7df573d29a3e", "metadata": {}, "outputs": [], @@ -30,13 +30,14 @@ "from datetime import date, timedelta, datetime\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", + "import matplotlib.dates as mdates \n", "import re\n", "import io" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "id": "17949e81-c30b-4fdf-9872-d7dc2b22ba9e", "metadata": {}, "outputs": [], @@ -48,7 +49,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 3, "id": "9c1737a2-bad8-4266-8dec-452085d8cfe7", "metadata": {}, "outputs": [ @@ -61,7 +62,7 @@ " 'projet-bdc2324-team1/0_Input/Company_10/target_information.csv']" ] }, - "execution_count": 8, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -93,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "40b705eb-fd18-436b-b150-61611a3c6a84", "metadata": {}, "outputs": [], @@ -618,7 +619,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 5, "id": "afd044b8-ac83-4a35-b959-700cae0b3b41", "metadata": {}, "outputs": [ @@ -633,7 +634,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n" ] }, @@ -648,7 +649,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n" ] }, @@ -663,7 +664,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n" ] }, @@ -678,7 +679,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n", ":28: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", @@ -691,21 +692,7 @@ "output_type": "stream", "text": [ "Tables imported for tenant 10\n", - "File path : projet-bdc2324-team1/0_Input/Company_11/customerplus_cleaned.csv\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", - " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "File path : projet-bdc2324-team1/0_Input/Company_11/customerplus_cleaned.csv\n", "File path : projet-bdc2324-team1/0_Input/Company_11/campaigns_information.csv\n" ] }, @@ -713,7 +700,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n" ] }, @@ -728,7 +717,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n" ] }, @@ -743,7 +732,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n", ":28: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", @@ -763,7 +752,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n" ] }, @@ -778,7 +767,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n" ] }, @@ -793,9 +782,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n", - "/tmp/ipykernel_436/3170175140.py:10: DtypeWarning: Columns (4,8,10) have mixed types. Specify dtype option on import or set low_memory=False.\n", + "/tmp/ipykernel_465/3170175140.py:10: DtypeWarning: Columns (4,8,10) have mixed types. Specify dtype option on import or set low_memory=False.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n" ] }, @@ -810,7 +799,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n", ":28: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", @@ -830,7 +819,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n" ] }, @@ -845,7 +834,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n" ] }, @@ -860,7 +849,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n" ] }, @@ -875,7 +864,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n", ":28: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", @@ -895,7 +884,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n" ] }, @@ -910,7 +899,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n" ] }, @@ -925,9 +914,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n", - "/tmp/ipykernel_436/3170175140.py:10: DtypeWarning: Columns (8,9) have mixed types. Specify dtype option on import or set low_memory=False.\n", + "/tmp/ipykernel_465/3170175140.py:10: DtypeWarning: Columns (8,9) have mixed types. Specify dtype option on import or set low_memory=False.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n" ] }, @@ -942,7 +931,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n", ":28: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", @@ -1236,7 +1225,7 @@ }, { "cell_type": "code", - "execution_count": 119, + "execution_count": 6, "id": "3a1fdd6b-ac43-4e90-9a31-4f522bcc44bb", "metadata": {}, "outputs": [ @@ -1244,7 +1233,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/tmp/ipykernel_436/3450421856.py:9: DtypeWarning: Columns (38) have mixed types. Specify dtype option on import or set low_memory=False.\n", + "/tmp/ipykernel_465/3450421856.py:9: DtypeWarning: Columns (38) have mixed types. Specify dtype option on import or set low_memory=False.\n", " train_set_spectacle = pd.read_csv(file_in, sep=\",\")\n" ] } @@ -1263,7 +1252,7 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 7, "id": "3a4c1ff4-2861-4e86-99df-26eea0370dc3", "metadata": {}, "outputs": [ @@ -1476,7 +1465,7 @@ "[5 rows x 40 columns]" ] }, - "execution_count": 120, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -1487,7 +1476,7 @@ }, { "cell_type": "code", - "execution_count": 121, + "execution_count": 8, "id": "4632384d-2a06-445d-9fdb-b0c91b37ebaf", "metadata": {}, "outputs": [ @@ -1497,7 +1486,7 @@ "array([0., 1.])" ] }, - "execution_count": 121, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -1510,7 +1499,7 @@ }, { "cell_type": "code", - "execution_count": 122, + "execution_count": 9, "id": "5fd56696-b479-46c7-8a59-fb8137db5fb5", "metadata": {}, "outputs": [ @@ -1520,7 +1509,7 @@ "array([10, 11, 12, 13, 14])" ] }, - "execution_count": 122, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -1534,7 +1523,7 @@ }, { "cell_type": "code", - "execution_count": 123, + "execution_count": 10, "id": "91c6e047-43d2-456c-81f1-087026eef4f0", "metadata": {}, "outputs": [ @@ -1754,7 +1743,7 @@ "[5 rows x 41 columns]" ] }, - "execution_count": 123, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -1781,7 +1770,7 @@ }, { "cell_type": "code", - "execution_count": 132, + "execution_count": 11, "id": "5b460061-f8b5-4a6b-ba59-539446d8487f", "metadata": {}, "outputs": [], @@ -1822,7 +1811,7 @@ }, { "cell_type": "code", - "execution_count": 208, + "execution_count": 12, "id": "cccee90c-67d1-4e14-8410-1210a5ef97d9", "metadata": {}, "outputs": [], @@ -2189,22 +2178,9 @@ ] }, { - "cell_type": "code", - "execution_count": 64, - "id": "9717dfd5-c39c-41eb-858d-5baf3ab71554", + "cell_type": "markdown", + "id": "41cbc46d-5649-46a2-884c-dd291fb0f217", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "10 19521\n", - "11 36\n", - "12 1706757\n", - "13 8422\n" - ] - } - ], "source": [ "for tenant_number, customer_id in outliers_musique_dico.items() :\n", "\n", @@ -2328,6 +2304,849 @@ "train_set_spectacle[train_set_spectacle[\"customer_id\"].isin(outliers_train_set_musique)] # OK" ] }, + { + "cell_type": "markdown", + "id": "0884e326-c87c-4ac1-8525-68a63411dfb0", + "metadata": {}, + "source": [ + "### 0.1 Evolution des commandes" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "c5c713ab-a1a6-478a-b707-4da68be0d63a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "File path : projet-bdc2324-team1/0_Input/Company_13/campaigns_information.csv\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_465/3170175140.py:10: FutureWarning: The argument 'date_parser' is deprecated and will be removed in a future version. Please use 'date_format' instead, or read your data in as 'object' dtype and then call 'to_datetime'.\n", + " df = pd.read_csv(file_in, sep=\",\", parse_dates = datetime_col, date_parser=custom_date_parser)\n" + ] + } + ], + "source": [ + "# Importation - Chargement des données temporaires - on prend compagnie 13 car c'est elle qui a le + de données\n", + "company_number = \"13\"\n", + "nom_dataframe = 'df'+ company_number +'_tickets'\n", + "\n", + "purchases = display_databases(company_number, file_name = 'products_purchased_reduced' , datetime_col = ['purchase_date'])\n", + "campaigns = display_databases(company_number,'campaigns_information', ['sent_at'])" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "9940f219-cee8-4ac3-8691-dedf6fb927e2", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ticket_idcustomer_idpurchase_idevent_type_idsupplier_namepurchase_dateamountis_full_pricename_event_typesname_facilitiesname_categoriesname_eventsname_seasonsstart_date_timeend_date_timeopen
03194287708131112internet2016-05-29 11:04:08.767000+00:00-110.0Falseles nuits de l'orangerie 2016jardins de l'orangeriecarré orblanche neige - ballet preljocajsaison 2015-20162016-06-17 21:00:00+02:001901-01-01 00:09:21+00:09True
13506812673570132internet2016-08-08 08:00:41.723000+00:0085.0Falseopéra royal 2016-2017opéra royalcatégorie 3cecilia bartoli : la cenerentolasaison 2016-20172017-02-24 20:00:00+01:001901-01-01 00:09:21+00:09True
23506912673570132internet2016-08-08 08:00:41.723000+00:0085.0Falseopéra royal 2016-2017opéra royalcatégorie 3cecilia bartoli : la cenerentolasaison 2016-20172017-02-24 20:00:00+01:001901-01-01 00:09:21+00:09True
33507012673570132internet2016-08-08 08:00:41.723000+00:00-85.0Falseopéra royal 2016-2017opéra royalcatégorie 3cecilia bartoli : la cenerentolasaison 2016-20172017-02-24 20:00:00+01:001901-01-01 00:09:21+00:09True
43507128486070142internet2016-11-29 10:39:12.600000+00:00100.0Falseopéra royal 2016-2017opéra royalcatégorie 3cecilia bartoli : la cenerentolasaison 2016-20172017-02-24 20:00:00+01:001901-01-01 00:09:21+00:09True
...................................................
70242223932999310021603108353867305internet2023-08-25 19:28:38.553000+00:0034.0Falseles grandes eaux de versailles 2023jardinsentrée simplenocturnes electro 23/09/2023saison 2023-20242023-09-23 20:30:00+02:001901-01-01 00:09:21+00:09True
70242233932999410021603108353867305internet2023-08-25 19:28:38.553000+00:0034.0Falseles grandes eaux de versailles 2023jardinsentrée simplenocturnes electro 23/09/2023saison 2023-20242023-09-23 20:30:00+02:001901-01-01 00:09:21+00:09True
7024224394338808422108637947305guérites jardins2023-08-29 08:46:23.107000+00:009.0Falseles grandes eaux de versailles 2023jardinsentrée simpleles jardins musicaux 2023saison 2023-20242023-08-29 09:00:00+02:001901-01-01 00:09:21+00:09True
7024225394338798422108637937305guérites jardins2023-08-29 08:09:54.207000+00:0010.0Falseles grandes eaux de versailles 2023jardinsentrée simpleles jardins musicaux 2023saison 2023-20242023-08-29 09:00:00+02:001901-01-01 00:09:21+00:09True
7024226394338788422108637937305guérites jardins2023-08-29 08:09:54.207000+00:009.0Falseles grandes eaux de versailles 2023jardinsentrée simpleles jardins musicaux 2023saison 2023-20242023-08-29 09:00:00+02:001901-01-01 00:09:21+00:09True
\n", + "

7024227 rows × 16 columns

\n", + "
" + ], + "text/plain": [ + " ticket_id customer_id purchase_id event_type_id supplier_name \\\n", + "0 3194 287708 1311 12 internet \n", + "1 35068 126735 7013 2 internet \n", + "2 35069 126735 7013 2 internet \n", + "3 35070 126735 7013 2 internet \n", + "4 35071 284860 7014 2 internet \n", + "... ... ... ... ... ... \n", + "7024222 39329993 10021603 10835386 7305 internet \n", + "7024223 39329994 10021603 10835386 7305 internet \n", + "7024224 39433880 8422 10863794 7305 guérites jardins \n", + "7024225 39433879 8422 10863793 7305 guérites jardins \n", + "7024226 39433878 8422 10863793 7305 guérites jardins \n", + "\n", + " purchase_date amount is_full_price \\\n", + "0 2016-05-29 11:04:08.767000+00:00 -110.0 False \n", + "1 2016-08-08 08:00:41.723000+00:00 85.0 False \n", + "2 2016-08-08 08:00:41.723000+00:00 85.0 False \n", + "3 2016-08-08 08:00:41.723000+00:00 -85.0 False \n", + "4 2016-11-29 10:39:12.600000+00:00 100.0 False \n", + "... ... ... ... \n", + "7024222 2023-08-25 19:28:38.553000+00:00 34.0 False \n", + "7024223 2023-08-25 19:28:38.553000+00:00 34.0 False \n", + "7024224 2023-08-29 08:46:23.107000+00:00 9.0 False \n", + "7024225 2023-08-29 08:09:54.207000+00:00 10.0 False \n", + "7024226 2023-08-29 08:09:54.207000+00:00 9.0 False \n", + "\n", + " name_event_types name_facilities \\\n", + "0 les nuits de l'orangerie 2016 jardins de l'orangerie \n", + "1 opéra royal 2016-2017 opéra royal \n", + "2 opéra royal 2016-2017 opéra royal \n", + "3 opéra royal 2016-2017 opéra royal \n", + "4 opéra royal 2016-2017 opéra royal \n", + "... ... ... \n", + "7024222 les grandes eaux de versailles 2023 jardins \n", + "7024223 les grandes eaux de versailles 2023 jardins \n", + "7024224 les grandes eaux de versailles 2023 jardins \n", + "7024225 les grandes eaux de versailles 2023 jardins \n", + "7024226 les grandes eaux de versailles 2023 jardins \n", + "\n", + " name_categories name_events name_seasons \\\n", + "0 carré or blanche neige - ballet preljocaj saison 2015-2016 \n", + "1 catégorie 3 cecilia bartoli : la cenerentola saison 2016-2017 \n", + "2 catégorie 3 cecilia bartoli : la cenerentola saison 2016-2017 \n", + "3 catégorie 3 cecilia bartoli : la cenerentola saison 2016-2017 \n", + "4 catégorie 3 cecilia bartoli : la cenerentola saison 2016-2017 \n", + "... ... ... ... \n", + "7024222 entrée simple nocturnes electro 23/09/2023 saison 2023-2024 \n", + "7024223 entrée simple nocturnes electro 23/09/2023 saison 2023-2024 \n", + "7024224 entrée simple les jardins musicaux 2023 saison 2023-2024 \n", + "7024225 entrée simple les jardins musicaux 2023 saison 2023-2024 \n", + "7024226 entrée simple les jardins musicaux 2023 saison 2023-2024 \n", + "\n", + " start_date_time end_date_time open \n", + "0 2016-06-17 21:00:00+02:00 1901-01-01 00:09:21+00:09 True \n", + "1 2017-02-24 20:00:00+01:00 1901-01-01 00:09:21+00:09 True \n", + "2 2017-02-24 20:00:00+01:00 1901-01-01 00:09:21+00:09 True \n", + "3 2017-02-24 20:00:00+01:00 1901-01-01 00:09:21+00:09 True \n", + "4 2017-02-24 20:00:00+01:00 1901-01-01 00:09:21+00:09 True \n", + "... ... ... ... \n", + "7024222 2023-09-23 20:30:00+02:00 1901-01-01 00:09:21+00:09 True \n", + "7024223 2023-09-23 20:30:00+02:00 1901-01-01 00:09:21+00:09 True \n", + "7024224 2023-08-29 09:00:00+02:00 1901-01-01 00:09:21+00:09 True \n", + "7024225 2023-08-29 09:00:00+02:00 1901-01-01 00:09:21+00:09 True \n", + "7024226 2023-08-29 09:00:00+02:00 1901-01-01 00:09:21+00:09 True \n", + "\n", + "[7024227 rows x 16 columns]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "purchases" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "d634c10c-b8f2-4f70-854d-d1e00e1f2ddc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idcustomer_idopened_atsent_atdelivered_atcampaign_namecampaign_service_idcampaign_sent_at
011245682021-05-17 13:52:32+02:00NaTNaNFLASH129 - CD Cadmus et Hermione5212021-05-12 00:00:00+02:00
121611442021-05-17 13:54:25+02:00NaTNaNIND154 - Reouverture OR5172021-04-30 00:00:00+02:00
232660972021-05-17 13:54:28+02:00NaTNaNIND155 - MEV Bicentenaire de Napoléon5202021-05-07 00:00:00+02:00
342257492021-05-17 13:58:12+02:00NaTNaNIND157 - reprise des spectacles5292021-05-14 00:00:00+02:00
45586682021-05-17 13:59:34+02:00NaTNaNIND157 - reprise des spectacles5292021-05-14 00:00:00+02:00
...........................
321856413614761377752022-04-02 15:35:54+02:002022-03-31 05:08:18+00:002022-03-31 07:08:23+02:00IND187 - GEM/JM8652022-03-30 00:00:00+02:00
3218565129948721532252022-04-02 15:20:25+02:002022-03-30 17:38:14+00:002022-03-30 19:38:19+02:00IND187 - GEM/JM8652022-03-30 00:00:00+02:00
3218566129912621420622022-04-02 15:15:37+02:002022-03-30 17:36:58+00:002022-03-30 19:37:01+02:00IND187 - GEM/JM8652022-03-30 00:00:00+02:00
32185676110191859492022-04-02 15:40:42+02:002021-11-09 17:57:13+00:002021-11-09 18:57:14+01:00IND173 - tout public automne6712021-11-09 00:00:00+01:00
32185681262689669952022-04-02 15:26:10+02:002022-03-10 20:50:44+00:002022-03-10 21:50:48+01:00FLASH172 - Campagne Concert Chefs d'état8282022-03-10 00:00:00+01:00
\n", + "

3218569 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + " id customer_id opened_at \\\n", + "0 1 124568 2021-05-17 13:52:32+02:00 \n", + "1 2 161144 2021-05-17 13:54:25+02:00 \n", + "2 3 266097 2021-05-17 13:54:28+02:00 \n", + "3 4 225749 2021-05-17 13:58:12+02:00 \n", + "4 5 58668 2021-05-17 13:59:34+02:00 \n", + "... ... ... ... \n", + "3218564 1361476 137775 2022-04-02 15:35:54+02:00 \n", + "3218565 1299487 2153225 2022-04-02 15:20:25+02:00 \n", + "3218566 1299126 2142062 2022-04-02 15:15:37+02:00 \n", + "3218567 611019 185949 2022-04-02 15:40:42+02:00 \n", + "3218568 1262689 66995 2022-04-02 15:26:10+02:00 \n", + "\n", + " sent_at delivered_at \\\n", + "0 NaT NaN \n", + "1 NaT NaN \n", + "2 NaT NaN \n", + "3 NaT NaN \n", + "4 NaT NaN \n", + "... ... ... \n", + "3218564 2022-03-31 05:08:18+00:00 2022-03-31 07:08:23+02:00 \n", + "3218565 2022-03-30 17:38:14+00:00 2022-03-30 19:38:19+02:00 \n", + "3218566 2022-03-30 17:36:58+00:00 2022-03-30 19:37:01+02:00 \n", + "3218567 2021-11-09 17:57:13+00:00 2021-11-09 18:57:14+01:00 \n", + "3218568 2022-03-10 20:50:44+00:00 2022-03-10 21:50:48+01:00 \n", + "\n", + " campaign_name campaign_service_id \\\n", + "0 FLASH129 - CD Cadmus et Hermione 521 \n", + "1 IND154 - Reouverture OR 517 \n", + "2 IND155 - MEV Bicentenaire de Napoléon 520 \n", + "3 IND157 - reprise des spectacles 529 \n", + "4 IND157 - reprise des spectacles 529 \n", + "... ... ... \n", + "3218564 IND187 - GEM/JM 865 \n", + "3218565 IND187 - GEM/JM 865 \n", + "3218566 IND187 - GEM/JM 865 \n", + "3218567 IND173 - tout public automne 671 \n", + "3218568 FLASH172 - Campagne Concert Chefs d'état 828 \n", + "\n", + " campaign_sent_at \n", + "0 2021-05-12 00:00:00+02:00 \n", + "1 2021-04-30 00:00:00+02:00 \n", + "2 2021-05-07 00:00:00+02:00 \n", + "3 2021-05-14 00:00:00+02:00 \n", + "4 2021-05-14 00:00:00+02:00 \n", + "... ... \n", + "3218564 2022-03-30 00:00:00+02:00 \n", + "3218565 2022-03-30 00:00:00+02:00 \n", + "3218566 2022-03-30 00:00:00+02:00 \n", + "3218567 2021-11-09 00:00:00+01:00 \n", + "3218568 2022-03-10 00:00:00+01:00 \n", + "\n", + "[3218569 rows x 8 columns]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "campaigns" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "a8654575-d6c2-4d7e-baee-fa573c8c8e1e", + "metadata": {}, + "outputs": [], + "source": [ + "# Mois du premier achat\n", + "purchase_min = purchases.groupby(['customer_id'])['purchase_date'].min().reset_index()\n", + "purchase_min.rename(columns = {'purchase_date' : 'first_purchase_event'}, inplace = True)\n", + "purchase_min['first_purchase_event'] = pd.to_datetime(purchase_min['first_purchase_event'])\n", + "purchase_min['first_purchase_month'] = pd.to_datetime(purchase_min['first_purchase_event'].dt.strftime('%Y-%m'))\n", + "\n", + "# Mois du premier mails\n", + "first_mail_received = campaigns.groupby('customer_id')['sent_at'].min().reset_index()\n", + "first_mail_received.rename(columns = {'sent_at' : 'first_email_reception'}, inplace = True)\n", + "first_mail_received['first_email_reception'] = pd.to_datetime(first_mail_received['first_email_reception'])\n", + "first_mail_received['first_email_month'] = pd.to_datetime(first_mail_received['first_email_reception'].dt.strftime('%Y-%m'))\n", + "\n", + "# Fusion \n", + "known_customer = pd.merge(purchase_min[['customer_id', 'first_purchase_month']], \n", + " first_mail_received[['customer_id', 'first_email_month']], on = 'customer_id', how = 'outer')\n", + "\n", + "# Mois à partir duquel le client est considere comme connu\n", + "known_customer['known_date'] = pd.to_datetime(known_customer[['first_email_month', 'first_purchase_month']].min(axis = 1), utc = True, format = 'ISO8601')" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "39e265f9-aa7c-4fc8-bda2-fb40774b92b7", + "metadata": {}, + "outputs": [], + "source": [ + "# Nombre de commande par mois\n", + "purchases_count = pd.merge(purchases[['customer_id', 'purchase_id', 'purchase_date']].drop_duplicates(), known_customer[['customer_id', 'known_date']], on = ['customer_id'], how = 'inner')\n", + "purchases_count['is_customer_known'] = purchases_count['purchase_date'] > purchases_count['known_date'] + pd.DateOffset(months=1)\n", + "purchases_count['purchase_date_month'] = pd.to_datetime(purchases_count['purchase_date'].dt.strftime('%Y-%m'))\n", + "purchases_count = purchases_count[purchases_count['customer_id'] != 1]\n", + "\n", + "# Nombre de commande par mois par type de client\n", + "nb_purchases_graph = purchases_count.groupby(['purchase_date_month', 'is_customer_known'])['purchase_id'].count().reset_index()\n", + "nb_purchases_graph.rename(columns = {'purchase_id' : 'nb_purchases'}, inplace = True)\n", + "\n", + "nb_purchases_graph_2 = purchases_count.groupby(['purchase_date_month', 'is_customer_known'])['customer_id'].nunique().reset_index()\n", + "nb_purchases_graph_2.rename(columns = {'customer_id' : 'nb_new_customer'}, inplace = True)" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "f4931879-826c-4a12-8d7a-37386df5f98f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
purchase_date_monthis_customer_knownnb_purchases
02010-07-01False1
12010-08-01False17
22010-09-01False34
32010-10-01False18
42010-11-01False26
............
2312023-09-01True37251
2322023-10-01False2903
2332023-10-01True30905
2342023-11-01False372
2352023-11-01True549
\n", + "

236 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " purchase_date_month is_customer_known nb_purchases\n", + "0 2010-07-01 False 1\n", + "1 2010-08-01 False 17\n", + "2 2010-09-01 False 34\n", + "3 2010-10-01 False 18\n", + "4 2010-11-01 False 26\n", + ".. ... ... ...\n", + "231 2023-09-01 True 37251\n", + "232 2023-10-01 False 2903\n", + "233 2023-10-01 True 30905\n", + "234 2023-11-01 False 372\n", + "235 2023-11-01 True 549\n", + "\n", + "[236 rows x 3 columns]" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "purchases_graph" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "a4aec3a1-2dbe-477c-9364-dd19a498cdce", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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H/7+/liyZMkz+CSIiIhI08mEEKKhk2gs8vPzoVAokJeXx9EposaiqhsNhubV33r0/HqWx0p1N8DksVknqv7+bvDHqBARERE9D1g0EREREamARRMRERGRClg0EREREamARRMRERGRClg0EREREamARRMRERGRClg0EREREamARRMRERGRClg0EREREamARRMRERGRClg0EREREamARRMRERGRClg0EREREamARRMRERGRClg0EREREamARRMRERGRClg0EREREamARRMRERGRClg0EREREamARRMRERGRClg0EREREamARRMRERGRClg0EREREamARRMRERGRClg0EREREamARRMRERGRClg0EREREamARRMRERGRClg0EREREamARRMRERGRClg0EREREamARRMRERGRClg0EREREamARRMRERGRClg0EREREamARRMRERGRClg0EREREalAu6ETICIi0iihiira8p59HqRxGnSkKTQ0FDKZTOllZWUlLRdCIDQ0FNbW1tDX14enpycuXryotI2ioiJMmzYN5ubmMDQ0xMCBA3Hz5k2lmNzcXAQEBEChUEChUCAgIAB3795VisnIyMCAAQNgaGgIc3NzBAcHo7i4uN76TkRERM+XBj8917FjR2RmZkqvCxcuSMvCw8OxbNkyREREICkpCVZWVujbty/u3bsnxUyfPh179+5FVFQUEhIScP/+ffj5+aG0tFSK8ff3R0pKCqKjoxEdHY2UlBQEBARIy0tLS+Hr64uCggIkJCQgKioKu3fvxsyZM5/Nh0BEREQar8FPz2lrayuNLpUTQmDFihWYM2cOhg4dCgCIjIyEpaUltm/fjsmTJyMvLw8bNmzAli1b0KdPHwDA1q1bYWNjg8OHD8PHxwdpaWmIjo7GyZMn4erqCgBYv3493NzccPnyZdjb2yMmJgaXLl3CjRs3YG1tDQBYunQpxo4diwULFsDY2PgZfRpERESkqRp8pOnKlSuwtrZG69atMWLECPzxxx8AgPT0dGRlZcHb21uK1dXVhYeHBxITEwEAycnJKCkpUYqxtraGo6OjFHPixAkoFAqpYAKA7t27Q6FQKMU4OjpKBRMA+Pj4oKioCMnJydXmXlRUhPz8fKUXERERNU4NWjS5urri22+/xaFDh7B+/XpkZWWhR48e+Pvvv5GVlQUAsLS0VFrH0tJSWpaVlQW5XA4TE5MaYywsLCrt28LCQimm4n5MTEwgl8ulmKosXLhQmielUChgY2NTy0+AiIiInhcNWjT1798fw4YNg5OTE/r06YODBw8CeHwarpxMJlNaRwhRqa2iijFVxdclpqLZs2cjLy9Pet24caPGvIiIiOj51eCn555kaGgIJycnXLlyRZrnVHGkJzs7WxoVsrKyQnFxMXJzc2uMuX37dqV93blzRymm4n5yc3NRUlJSaQTqSbq6ujA2NlZ6ERERUeOkUUVTUVER0tLS0KJFC7Ru3RpWVlaIjY2VlhcXFyM+Ph49evQAALi4uEBHR0cpJjMzE6mpqVKMm5sb8vLycPr0aSnm1KlTyMvLU4pJTU1FZmamFBMTEwNdXV24uLjUa5+JiIjo+dCgV8+FhIRgwIABsLW1RXZ2NubPn4/8/HyMGTMGMpkM06dPR1hYGNq1a4d27dohLCwMBgYG8Pf3BwAoFApMmDABM2fOhJmZGUxNTRESEiKd7gOADh06oF+/fggMDMTatWsBAJMmTYKfnx/s7e0BAN7e3nBwcEBAQAAWL16MnJwchISEIDAwkKNHREREBKCBi6abN29i5MiR+Ouvv9C8eXN0794dJ0+eRKtWrQAAs2bNQmFhIYKCgpCbmwtXV1fExMTAyMhI2sby5cuhra2N4cOHo7CwEF5eXti8eTO0tLSkmG3btiE4OFi6ym7gwIGIiIiQlmtpaeHgwYMICgqCu7s79PX14e/vjyVLljyjT4KIiIg0nUwIIWqzQmRkJMzNzeHr6wvgcWGzbt06ODg4YMeOHVLB8yLKz8+HQqFAXl4eR6iIGou6PlKDj+J4fj3r77wu61W1Tn3ur5FT9fd3rec0hYWFQV9fH8Dj+xtFREQgPDwc5ubm+OCDD+qeMREREZEGq/XpuRs3bqBt27YAgH379uGtt97CpEmT4O7uDk9PT3XnR0RERKQRaj3S1LRpU/z9998AHl9hVj7hWk9PD4WFherNjoiIiEhD1HqkqW/fvpg4cSK6dOmC3377TZrbdPHiRdjZ2ak7PyIiIiKNUOuRpq+++gpubm64c+cOdu/eDTMzMwCPnwM3cuRItSdIREREpAlqPdKUn5+PL7/8Ek2aKNdboaGhfIwIERERNVq1Lppat26NzMzMSg/BzcnJQevWrVFaWqq25IiI1IaXWRPRP1Tr03PV3dbp/v370NPT+8cJEREREWkilUeaZsyYAQCQyWT49NNPYWBgIC0rLS3FqVOn0LlzZ7UnSERERKQJVC6afvnlFwCPR5ouXLgAuVwuLZPL5ejUqRNCQkLUnyERERGRBlC5aDp27BgAYNy4cVi5ciUfE0JEREQvlFpPBN+0aVN95EFERESk0WpdNAFAUlISdu3ahYyMDBQXFyst27Nnj1oSIyIiItIktS6aoqKiMHr0aHh7eyM2Nhbe3t64cuUKsrKyMGTIkPrIkYiIiBoab9tR+1sOhIWFYfny5Thw4ADkcjlWrlyJtLQ0DB8+HLa2tvWRIxEREVGDq3XRdPXqVel5c7q6uigoKIBMJsMHH3yAdevWqT1BIiIiIk1Q66LJ1NQU9+7dAwC0bNkSqampAIC7d+/iwYMH6s2OiIiISEPUek5Tz549ERsbCycnJwwfPhzvv/8+jh49itjYWHh5edVHjkREREQNrtZFU0REBB4+fAgAmD17NnR0dJCQkIChQ4di7ty5ak+QiIiISBPUumgyNTWV/t2kSRPMmjULs2bNUmtSRERERJqmTvdpKisrw++//47s7GyUlZUpLXvjjTfUkhgRERGRJql10XTy5En4+/vj+vXrEEIoLZPJZCgtLVVbckRERESaotZF07vvvotu3brh4MGDaNGiBWQyWX3kRURERKRRal00XblyBf/973/Rtm3b+siHqHaqukMt8MLdpZaIiOpfre/T5Orqit9//70+ciEiIiLSWCqNNJ0/f17697Rp0zBz5kxkZWXByckJOjo6SrHOzs7qzZCIiIhIA6hUNHXu3BkymUxp4vf48eOlf5cv40RwIqp3fGgoETUQlYqm9PT0+s6DiIiISKOpVDS1atWqvvMgIiIi0mi1ngi+cOFCbNy4sVL7xo0bsWjRIrUkRURERKRpal00rV27Fq+88kql9o4dO2LNmjVqSYqIiIhI09S6aMrKykKLFi0qtTdv3hyZmZlqSYqIiIhI09S6aLKxscHx48crtR8/fhzW1tZqSYqIiIhI09T6juATJ07E9OnTUVJSgt69ewMAjhw5glmzZmHmzJlqT5CIGinezZ2InjO1LppmzZqFnJwcBAUFobi4GACgp6eHDz/8ELNnz1Z7gkRERESaoNZFk0wmw6JFizB37lykpaVBX18f7dq1g66ubn3kR0RERKQRal00lWvatCle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l5enFJOamorMzEwpJiYmBrq6unBxcVF/54mIiOi50qBXz02ZMgXbt2/H//73PxgZGUkjPQqFAvr6+pDJZJg+fTrCwsLQrl07tGvXDmFhYTAwMIC/v78UO2HCBMycORNmZmYwNTVFSEgInJycpKvpOnTogH79+iEwMBBr164FAEyaNAl+fn6wt7cHAHh7e8PBwQEBAQFYvHgxcnJyEBISgsDAQI4gERFRvbF7uL1S27VnnwapoEGLptWrVwMAPD09ldo3bdqEsWPHAgBmzZqFwsJCBAUFITc3F66uroiJiYGRkZEUv3z5cmhra2P48OEoLCyEl5cXNm/eDC0tLSlm27ZtCA4Olq6yGzhwICIiIqTlWlpaOHjwIIKCguDu7g59fX34+/tjyZIl9dR7IiIiep40aNEkhHhqjEwmQ2hoKEJDQ6uN0dPTw6pVq7Bq1apqY0xNTbF169Ya92Vra4sDBw48NSciIiJ68WjERHAiIiIiTceiiYiIiEgFLJqIiIiIVMCiiYiIiEgFDToRnIhI0/FycCIqx5EmIiIiIhWwaCIiIiJSAYsmIiIiIhWwaCIiIiJSAYsmIiIiIhWwaCIiIiJSAYsmIiIiIhWwaCIiIiJSAYsmIiIiIhXwjuBERETPmaruVA/wbvX1jSNNRERERCpg0URERESkAhZNRERERCpg0URERESkAhZNRERERCrg1XNERPWgqqubrj37NIhIjTjSRERERKQCFk1EREREKmDRRERERKQCFk1EREREKuBEcCIiohcIL1KoO440EREREamAI01ERERqwBGcxo8jTUREREQqYNFEREREpAIWTUREREQqYNFEREREpAIWTUREREQqYNFEREREpALecoCea1Vd4gvwMl8iIlI/jjQRERERqYBFExEREZEKWDQRERERqYBFExEREZEKGrRo+umnnzBgwABYW1tDJpNh3759SsuFEAgNDYW1tTX09fXh6emJixcvKsUUFRVh2rRpMDc3h6GhIQYOHIibN28qxeTm5iIgIAAKhQIKhQIBAQG4e/euUkxGRgYGDBgAQ0NDmJubIzg4GMXFxfXRbSJqAHYPt1d6ERHVRoMWTQUFBejUqRMiIiKqXB4eHo5ly5YhIiICSUlJsLKyQt++fXHv3j0pZvr06di7dy+ioqKQkJCA+/fvw8/PD6WlpVKMv78/UlJSEB0djejo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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Graphique en nombre de commande\n", + "purchases_graph = nb_purchases_graph\n", + "\n", + "purchases_graph_used = purchases_graph[purchases_graph[\"purchase_date_month\"] >= datetime(2021,3,1)]\n", + "purchases_graph_used_0 = purchases_graph_used[purchases_graph_used[\"is_customer_known\"]==False]\n", + "purchases_graph_used_1 = purchases_graph_used[purchases_graph_used[\"is_customer_known\"]==True]\n", + "\n", + "\n", + "# Création du barplot\n", + "plt.bar(purchases_graph_used_0[\"purchase_date_month\"], purchases_graph_used_0[\"nb_purchases\"], width=12, label = \"Nouveau client\")\n", + "plt.bar(purchases_graph_used_0[\"purchase_date_month\"], purchases_graph_used_1[\"nb_purchases\"], \n", + " bottom = purchases_graph_used_0[\"nb_purchases\"], width=12, label = \"Ancien client\")\n", + "\n", + "\n", + "# commande pr afficher slt\n", + "plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%b%y'))\n", + "\n", + "# date_form = DateFormatter(\"%m-%d\")\n", + "# plt.xaxis.set_major_formatter(date_form)\n", + "\n", + "\n", + "# Ajout de titres et d'étiquettes\n", + "plt.xlabel('Mois')\n", + "plt.ylabel(\"Nombre d'achats\")\n", + "plt.title(\"Nombre d'achats - compagnie 13\")\n", + "plt.legend()\n", + "\n", + "# save graphic - export to S3 bucket\n", + "\"\"\"\n", + "FILE_PATH = \"projet-bdc2324-team1/graphics/music/\"\n", + "FILE_NAME = \"sales_trend_music.png\"\n", + "FILE_PATH_OUT_S3 = FILE_PATH + FILE_NAME\n", + "\n", + "with fs.open(FILE_PATH_OUT_S3, 'wb') as file_out:\n", + " plt.savefig(file_out)\n", + "\"\"\"\n", + "\n", + "# Affichage du barplot\n", + "plt.show()" + ] + }, { "cell_type": "markdown", "id": "42f8171c-e80d-4faa-b278-21fcbe3b242c", @@ -5005,7 +5824,9 @@ { "cell_type": "markdown", "id": "ecfd112e-270a-4223-b80f-7e95e57d199d", - "metadata": {}, + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, "source": [ "### 2. campaigns_information" ] @@ -8176,7 +8997,9 @@ { "cell_type": "markdown", "id": "b9e84af4-a02b-4f83-81ae-b7a73475d060", - "metadata": {}, + "metadata": { + "jp-MarkdownHeadingCollapsed": true + }, "source": [ "### 4. target_information" ]