diff --git a/0_4_Generate_stat_desc.py b/0_4_Generate_stat_desc.py index 3957cba..c0821e0 100644 --- a/0_4_Generate_stat_desc.py +++ b/0_4_Generate_stat_desc.py @@ -17,7 +17,7 @@ S3_ENDPOINT_URL = "https://" + os.environ["AWS_S3_ENDPOINT"] fs = s3fs.S3FileSystem(client_kwargs={'endpoint_url': S3_ENDPOINT_URL}) companies = {'musee' : ['1', '2', '3', '4'], # , '101' - 'sport': ['5'],#, '6', '7', '8', '9'], + 'sport': ['5', '6', '7', '8', '9'], 'musique' : ['10', '11', '12', '13', '14']} @@ -59,10 +59,12 @@ country_bar(customer, type_of_activity) lazy_customer_plot(campaigns_kpi, type_of_activity) -#campaigns_effectiveness(customer, type_of_activity) +campaigns_effectiveness(customer, type_of_activity) sale_dynamics(products, campaigns_brut, type_of_activity) tickets_internet(tickets, type_of_activity) +already_bought_online(tickets, type_of_activity) + box_plot_price_tickets(tickets, type_of_activity) \ No newline at end of file diff --git a/Notebook_AR.ipynb b/Notebook_AR.ipynb index 0ad1826..0f59f90 100644 --- a/Notebook_AR.ipynb +++ b/Notebook_AR.ipynb @@ -1,8361 +1,216 @@ { "cells": [ - { - "cell_type": "markdown", - "id": "455cc769-1b3b-4fef-b395-e74a988ceed3", - "metadata": {}, - "source": [ - "## Notebook Alexis" - ] - }, { "cell_type": "code", - "execution_count": 274, - "id": "20eeb149-6618-4ef2-9cfd-ff062950f36c", - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import os\n", - "import s3fs" - ] - }, - { - "cell_type": "code", - "execution_count": 275, - "id": "30494c5e-9649-4fff-8708-617544188b20", + "execution_count": 2, + "id": "0c48e17e-3dd5-43ef-be44-a11a3cbeacfe", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "['bdc2324-data/1',\n", - " 'bdc2324-data/10',\n", - " 'bdc2324-data/101',\n", - " 'bdc2324-data/11',\n", - " 'bdc2324-data/12',\n", - " 'bdc2324-data/13',\n", - " 'bdc2324-data/14',\n", - " 'bdc2324-data/2',\n", - " 'bdc2324-data/3',\n", - " 'bdc2324-data/4',\n", - " 'bdc2324-data/5',\n", - " 'bdc2324-data/6',\n", - " 'bdc2324-data/7',\n", - " 'bdc2324-data/8',\n", - " 'bdc2324-data/9']" - ] - }, - "execution_count": 275, - "metadata": {}, - "output_type": "execute_result" + "name": "stdin", + "output_type": "stream", + "text": [ + "Choisissez le type de compagnie : sport ? musique ? musee ? sport\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "File path : projet-bdc2324-team1/0_Input/Company_5/customerplus_cleaned.csv\n" + ] + }, + { + "ename": "PermissionError", + "evalue": "Forbidden", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mClientError\u001b[0m Traceback (most recent call last)", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/s3fs/core.py:529\u001b[0m, in \u001b[0;36mS3FileSystem.info\u001b[0;34m(self, path, version_id, refresh)\u001b[0m\n\u001b[1;32m 528\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m--> 529\u001b[0m out \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_s3\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43ms3\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mhead_object\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mBucket\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbucket\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 530\u001b[0m \u001b[43m \u001b[49m\u001b[43mKey\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mversion_id_kw\u001b[49m\u001b[43m(\u001b[49m\u001b[43mversion_id\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreq_kw\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 531\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m {\n\u001b[1;32m 532\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mETag\u001b[39m\u001b[38;5;124m'\u001b[39m: out[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mETag\u001b[39m\u001b[38;5;124m'\u001b[39m],\n\u001b[1;32m 533\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mKey\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124m/\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mjoin([bucket, key]),\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 540\u001b[0m \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mVersionId\u001b[39m\u001b[38;5;124m'\u001b[39m: out\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mVersionId\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 541\u001b[0m }\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/s3fs/core.py:200\u001b[0m, in \u001b[0;36mS3FileSystem._call_s3\u001b[0;34m(self, method, *akwarglist, **kwargs)\u001b[0m\n\u001b[1;32m 198\u001b[0m additional_kwargs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_s3_method_kwargs(method, \u001b[38;5;241m*\u001b[39makwarglist,\n\u001b[1;32m 199\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m--> 200\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43madditional_kwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/botocore/client.py:553\u001b[0m, in \u001b[0;36mClientCreator._create_api_method.._api_call\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 552\u001b[0m \u001b[38;5;66;03m# The \"self\" in this scope is referring to the BaseClient.\u001b[39;00m\n\u001b[0;32m--> 553\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_api_call\u001b[49m\u001b[43m(\u001b[49m\u001b[43moperation_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/botocore/client.py:1009\u001b[0m, in \u001b[0;36mBaseClient._make_api_call\u001b[0;34m(self, operation_name, api_params)\u001b[0m\n\u001b[1;32m 1008\u001b[0m error_class \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexceptions\u001b[38;5;241m.\u001b[39mfrom_code(error_code)\n\u001b[0;32m-> 1009\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m error_class(parsed_response, operation_name)\n\u001b[1;32m 1010\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "\u001b[0;31mClientError\u001b[0m: An error occurred (403) when calling the HeadObject operation: Forbidden", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mPermissionError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[2], line 28\u001b[0m\n\u001b[1;32m 25\u001b[0m list_of_comp \u001b[38;5;241m=\u001b[39m companies[type_of_activity] \n\u001b[1;32m 27\u001b[0m \u001b[38;5;66;03m# Load files\u001b[39;00m\n\u001b[0;32m---> 28\u001b[0m customer, campaigns_kpi, campaigns_brut, tickets, products \u001b[38;5;241m=\u001b[39m \u001b[43mload_files\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlist_of_comp\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 30\u001b[0m \u001b[38;5;66;03m# Identify anonymous customer for each company and remove them from our datasets\u001b[39;00m\n\u001b[1;32m 31\u001b[0m outlier_list \u001b[38;5;241m=\u001b[39m outlier_detection(tickets, list_of_comp)\n", + "File \u001b[0;32m:22\u001b[0m, in \u001b[0;36mload_files\u001b[0;34m(nb_compagnie)\u001b[0m\n", + "File \u001b[0;32m:12\u001b[0m, in \u001b[0;36mdisplay_input_databases\u001b[0;34m(directory_path, file_name, datetime_col)\u001b[0m\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/fsspec/spec.py:1295\u001b[0m, in \u001b[0;36mAbstractFileSystem.open\u001b[0;34m(self, path, mode, block_size, cache_options, compression, **kwargs)\u001b[0m\n\u001b[1;32m 1293\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1294\u001b[0m ac \u001b[38;5;241m=\u001b[39m kwargs\u001b[38;5;241m.\u001b[39mpop(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mautocommit\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_intrans)\n\u001b[0;32m-> 1295\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_open\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1296\u001b[0m \u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1297\u001b[0m \u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1298\u001b[0m \u001b[43m \u001b[49m\u001b[43mblock_size\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mblock_size\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1299\u001b[0m \u001b[43m \u001b[49m\u001b[43mautocommit\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mac\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1300\u001b[0m \u001b[43m \u001b[49m\u001b[43mcache_options\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcache_options\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1301\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1302\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1303\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m compression \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1304\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mfsspec\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcompression\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m compr\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/s3fs/core.py:375\u001b[0m, in \u001b[0;36mS3FileSystem._open\u001b[0;34m(self, path, mode, block_size, acl, version_id, fill_cache, cache_type, autocommit, requester_pays, **kwargs)\u001b[0m\n\u001b[1;32m 372\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m cache_type \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 373\u001b[0m cache_type \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdefault_cache_type\n\u001b[0;32m--> 375\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mS3File\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mblock_size\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mblock_size\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43macl\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43macl\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 376\u001b[0m \u001b[43m \u001b[49m\u001b[43mversion_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mversion_id\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfill_cache\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfill_cache\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 377\u001b[0m \u001b[43m \u001b[49m\u001b[43ms3_additional_kwargs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkw\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcache_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcache_type\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 378\u001b[0m \u001b[43m \u001b[49m\u001b[43mautocommit\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mautocommit\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mrequester_pays\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrequester_pays\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/s3fs/core.py:1096\u001b[0m, in \u001b[0;36mS3File.__init__\u001b[0;34m(self, s3, path, mode, block_size, acl, version_id, fill_cache, s3_additional_kwargs, autocommit, cache_type, requester_pays)\u001b[0m\n\u001b[1;32m 1094\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39ms3_additional_kwargs \u001b[38;5;241m=\u001b[39m s3_additional_kwargs \u001b[38;5;129;01mor\u001b[39;00m {}\n\u001b[1;32m 1095\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mreq_kw \u001b[38;5;241m=\u001b[39m {\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mRequestPayer\u001b[39m\u001b[38;5;124m'\u001b[39m: \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mrequester\u001b[39m\u001b[38;5;124m'\u001b[39m} \u001b[38;5;28;01mif\u001b[39;00m requester_pays \u001b[38;5;28;01melse\u001b[39;00m {}\n\u001b[0;32m-> 1096\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[38;5;21;43m__init__\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43ms3\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mpath\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mblock_size\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mautocommit\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mautocommit\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1097\u001b[0m \u001b[43m \u001b[49m\u001b[43mcache_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcache_type\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1098\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39ms3 \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfs \u001b[38;5;66;03m# compatibility\u001b[39;00m\n\u001b[1;32m 1099\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mwritable():\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/fsspec/spec.py:1651\u001b[0m, in \u001b[0;36mAbstractBufferedFile.__init__\u001b[0;34m(self, fs, path, mode, block_size, autocommit, cache_type, cache_options, size, **kwargs)\u001b[0m\n\u001b[1;32m 1649\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m=\u001b[39m size\n\u001b[1;32m 1650\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1651\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msize \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdetails\u001b[49m[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msize\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m 1652\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcache \u001b[38;5;241m=\u001b[39m caches[cache_type](\n\u001b[1;32m 1653\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mblocksize, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_fetch_range, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39msize, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mcache_options\n\u001b[1;32m 1654\u001b[0m )\n\u001b[1;32m 1655\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/fsspec/spec.py:1664\u001b[0m, in \u001b[0;36mAbstractBufferedFile.details\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1661\u001b[0m \u001b[38;5;129m@property\u001b[39m\n\u001b[1;32m 1662\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdetails\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 1663\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_details \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1664\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_details \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43minfo\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpath\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1665\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_details\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/s3fs/core.py:548\u001b[0m, in \u001b[0;36mS3FileSystem.info\u001b[0;34m(self, path, version_id, refresh)\u001b[0m\n\u001b[1;32m 546\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28msuper\u001b[39m(S3FileSystem, \u001b[38;5;28mself\u001b[39m)\u001b[38;5;241m.\u001b[39minfo(path)\n\u001b[1;32m 547\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 548\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m ee\n\u001b[1;32m 549\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m ParamValidationError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 550\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mFailed to head path \u001b[39m\u001b[38;5;132;01m%r\u001b[39;00m\u001b[38;5;124m: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m'\u001b[39m \u001b[38;5;241m%\u001b[39m (path, e))\n", + "\u001b[0;31mPermissionError\u001b[0m: Forbidden" + ] } ], "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import os\n", + "import io\n", + "import s3fs\n", + "import re\n", + "import warnings\n", + "\n", + "# Ignore warning\n", + "warnings.filterwarnings('ignore')\n", + "\n", + "exec(open('0_KPI_functions.py').read())\n", + "exec(open('utils_stat_desc.py').read())\n", + "\n", "# Create filesystem object\n", "S3_ENDPOINT_URL = \"https://\" + os.environ[\"AWS_S3_ENDPOINT\"]\n", "fs = s3fs.S3FileSystem(client_kwargs={'endpoint_url': S3_ENDPOINT_URL})\n", "\n", - "BUCKET = \"bdc2324-data\"\n", - "fs.ls(BUCKET)" - ] - }, - { - "cell_type": "markdown", - "id": "2feffee9-9f23-4caa-8a01-9e4a93abbf5d", - "metadata": {}, - "source": [ - "### I. Analyse fichier 8" - ] - }, - { - "cell_type": "markdown", - "id": "f54ba449-2051-4acd-939d-d30abd5452fe", - "metadata": {}, - "source": [ - "This section describes the databases associated with company 8. " + "companies = {'musee' : ['1', '2', '3', '4'], # , '101'\n", + " 'sport': ['5', '6', '7', '8', '9'],\n", + " 'musique' : ['10', '11', '12', '13', '14']}\n", + "\n", + "\n", + "type_of_activity = input('Choisissez le type de compagnie : sport ? musique ? musee ?')\n", + "list_of_comp = companies[type_of_activity] \n", + "\n", + "# Load files\n", + "customer, campaigns_kpi, campaigns_brut, tickets, products = load_files(list_of_comp)\n", + "\n", + "# Identify anonymous customer for each company and remove them from our datasets\n", + "outlier_list = outlier_detection(tickets, list_of_comp)\n", + "\n", + "# Identify valid customer (customer who bought tickets after starting date or received mails after starting date)\n", + "customer_valid_list = valid_customer_detection(products, campaigns_brut)\n", + "\n", + "databases = [customer, campaigns_kpi, campaigns_brut, tickets, products]\n", + "\n", + "for dataset in databases:\n", + " dataset['customer_id'] = dataset['customer_id'].apply(lambda x: remove_elements(x, outlier_list))# remove outlier\n", + " dataset = dataset[dataset['customer_id'].isin(customer_valid_list)] # keep only valid customer\n", + " #print(f'shape of {dataset} : ', dataset.shape)\n", + "\n", + "# Identify customer who bought during the period of y\n", + "customer_target_period = identify_purchase_during_target_periode(products)\n", + "customer['has_purchased_target_period'] = np.where(customer['customer_id'].isin(customer_target_period), 1, 0)" ] }, { "cell_type": "code", - "execution_count": 276, - "id": "f1cce705-46e1-42de-8e93-2ee15312d288", + "execution_count": null, + "id": "e15380a0-76b8-4914-a927-303ab46a636e", "metadata": {}, "outputs": [], "source": [ - "directory_path = '8'" + "customer.head()" ] }, { "cell_type": "code", - "execution_count": 277, - "id": "82d4db0e-0cd5-49af-a4d3-f17f54b1c03c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "bdc2324-data/8/8campaign_stats.csv\n", - "bdc2324-data/8/8campaigns.csv\n", - "bdc2324-data/8/8categories.csv\n", - "bdc2324-data/8/8countries.csv\n", - "bdc2324-data/8/8currencies.csv\n", - "bdc2324-data/8/8customer_target_mappings.csv\n", - "bdc2324-data/8/8customersplus.csv\n", - "bdc2324-data/8/8event_types.csv\n", - "bdc2324-data/8/8events.csv\n", - "bdc2324-data/8/8facilities.csv\n", - "bdc2324-data/8/8link_stats.csv\n", - "bdc2324-data/8/8pricing_formulas.csv\n", - "bdc2324-data/8/8product_packs.csv\n", - "bdc2324-data/8/8products.csv\n", - "bdc2324-data/8/8products_groups.csv\n", - "bdc2324-data/8/8purchases.csv\n", - "bdc2324-data/8/8representation_category_capacities.csv\n", - "bdc2324-data/8/8representations.csv\n", - "bdc2324-data/8/8seasons.csv\n", - "bdc2324-data/8/8suppliers.csv\n", - "bdc2324-data/8/8target_types.csv\n", - "bdc2324-data/8/8targets.csv\n", - "bdc2324-data/8/8tickets.csv\n", - "bdc2324-data/8/8type_of_categories.csv\n", - "bdc2324-data/8/8type_of_pricing_formulas.csv\n", - "bdc2324-data/8/8type_ofs.csv\n" - ] - } - ], - "source": [ - "# check the files in the directory\n", - "\n", - "objects = fs.ls(f'{BUCKET}/{directory_path}')\n", - "\n", - "for file in objects:\n", - " print(file)" - ] - }, - { - "cell_type": "code", - "execution_count": 278, - "id": "65cb38ad-52ae-4266-85d8-c47d81b00283", + "execution_count": null, + "id": "bf475e2b-fa82-40f0-bcbe-7ef40a13caae", "metadata": {}, "outputs": [], "source": [ - "def display_databases(file_name):\n", - " \"\"\"\n", - " This function returns the file from s3 storage\n", - " \"\"\"\n", - " file_path = BUCKET + \"/\" + directory_path + \"/\" + file_name\n", - " print(\"File path : \", file_path)\n", - " with fs.open(file_path, mode=\"rb\") as file_in:\n", - " df = pd.read_csv(file_in, sep=\",\")\n", - " \n", - " print(\"Shape : \", df.shape)\n", - " return df\n", - " " - ] - }, - { - "cell_type": "markdown", - "id": "ddd545ef-7e9f-4696-962a-115294991641", - "metadata": {}, - "source": [ - "#### Lookt at campaigns files" - ] - }, - { - "cell_type": "code", - "execution_count": 279, - "id": "0214d30d-5f83-498f-867f-e67b5793b731", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/8/8campaigns.csv\n", - "Shape : (1689, 11)\n" - ] - }, - { - "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", - "
idnameservice_idcreated_atupdated_atprocess_idreport_urlcategoryto_be_syncedidentifiersent_at
01#LOUSFP RELANCE P'TITS LOU14362022-02-01 15:22:53.564432+01:002022-02-01 15:22:53.564432+01:00NaNNaN0Falseeaa32c96f620053cf442ad32258076b92022-01-31 00:00:00+01:00
12#LOUSFP BRASSERIE ACHETEURS14352022-02-01 15:22:53.572592+01:002022-02-01 15:22:53.572592+01:00NaNNaN0False1f3202d820180a39f736f20fce790de82022-01-31 00:00:00+01:00
23PRESSE. LOU/SF Paris - RDV et protocole14332022-02-01 15:22:53.578426+01:002022-02-01 15:22:53.578426+01:00NaNNaN0Falseb069b3415151fa7217e870017374de7c2022-01-31 00:00:00+01:00
34#LOUSFP ÉTUDIANTS14322022-02-01 15:22:53.584235+01:002022-02-01 15:22:53.584235+01:00NaNNaN0False56468d5607a5aaf1604ff5e15593b0032022-01-27 00:00:00+01:00
45#LOUSFP P'TITS LOU14312022-02-01 15:22:53.590187+01:002022-02-01 15:22:53.590187+01:00NaNNaN0Falsee11943a6031a0e6114ae69c2576179802022-01-27 00:00:00+01:00
\n", - "
" - ], - "text/plain": [ - " id name service_id \\\n", - "0 1 #LOUSFP RELANCE P'TITS LOU 1436 \n", - "1 2 #LOUSFP BRASSERIE ACHETEURS 1435 \n", - "2 3 PRESSE. LOU/SF Paris - RDV et protocole 1433 \n", - "3 4 #LOUSFP ÉTUDIANTS 1432 \n", - "4 5 #LOUSFP P'TITS LOU 1431 \n", - "\n", - " created_at updated_at \\\n", - "0 2022-02-01 15:22:53.564432+01:00 2022-02-01 15:22:53.564432+01:00 \n", - "1 2022-02-01 15:22:53.572592+01:00 2022-02-01 15:22:53.572592+01:00 \n", - "2 2022-02-01 15:22:53.578426+01:00 2022-02-01 15:22:53.578426+01:00 \n", - "3 2022-02-01 15:22:53.584235+01:00 2022-02-01 15:22:53.584235+01:00 \n", - "4 2022-02-01 15:22:53.590187+01:00 2022-02-01 15:22:53.590187+01:00 \n", - "\n", - " process_id report_url category to_be_synced \\\n", - "0 NaN NaN 0 False \n", - "1 NaN NaN 0 False \n", - "2 NaN NaN 0 False \n", - "3 NaN NaN 0 False \n", - "4 NaN NaN 0 False \n", - "\n", - " identifier sent_at \n", - "0 eaa32c96f620053cf442ad32258076b9 2022-01-31 00:00:00+01:00 \n", - "1 1f3202d820180a39f736f20fce790de8 2022-01-31 00:00:00+01:00 \n", - "2 b069b3415151fa7217e870017374de7c 2022-01-31 00:00:00+01:00 \n", - "3 56468d5607a5aaf1604ff5e15593b003 2022-01-27 00:00:00+01:00 \n", - "4 e11943a6031a0e6114ae69c257617980 2022-01-27 00:00:00+01:00 " - ] - }, - "execution_count": 279, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "campaigns = display_databases(\"8campaigns.csv\")\n", - "campaigns.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 280, - "id": "e7982be4-2c42-4a91-be5a-329a999644cc", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/8/8campaign_stats.csv\n", - "Shape : (2527083, 8)\n" - ] - }, - { - "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", - "
idcampaign_idcustomer_idopened_atsent_atdelivered_atcreated_atupdated_at
0151614102022-02-02 18:16:07+01:00NaNNaN2022-02-02 17:16:08.616899+01:002022-02-02 17:16:08.623098+01:00
121542282022-02-02 18:18:11+01:00NaNNaN2022-02-02 17:18:12.030260+01:002022-02-02 17:18:12.036606+01:00
2361207942022-02-02 18:18:58+01:00NaNNaN2022-02-02 17:19:00.129697+01:002022-02-02 17:19:00.134704+01:00
3434670252022-02-02 18:19:33+01:00NaNNaN2022-02-02 17:19:34.023492+01:002022-02-02 17:19:34.027570+01:00
4521421062022-02-02 18:19:35+01:00NaNNaN2022-02-02 17:19:36.553321+01:002022-02-02 17:19:36.557473+01:00
\n", - "
" - ], - "text/plain": [ - " id campaign_id customer_id opened_at sent_at \\\n", - "0 1 5 161410 2022-02-02 18:16:07+01:00 NaN \n", - "1 2 1 54228 2022-02-02 18:18:11+01:00 NaN \n", - "2 3 6 120794 2022-02-02 18:18:58+01:00 NaN \n", - "3 4 3 467025 2022-02-02 18:19:33+01:00 NaN \n", - "4 5 2 142106 2022-02-02 18:19:35+01:00 NaN \n", - "\n", - " delivered_at created_at \\\n", - "0 NaN 2022-02-02 17:16:08.616899+01:00 \n", - "1 NaN 2022-02-02 17:18:12.030260+01:00 \n", - "2 NaN 2022-02-02 17:19:00.129697+01:00 \n", - "3 NaN 2022-02-02 17:19:34.023492+01:00 \n", - "4 NaN 2022-02-02 17:19:36.553321+01:00 \n", - "\n", - " updated_at \n", - "0 2022-02-02 17:16:08.623098+01:00 \n", - "1 2022-02-02 17:18:12.036606+01:00 \n", - "2 2022-02-02 17:19:00.134704+01:00 \n", - "3 2022-02-02 17:19:34.027570+01:00 \n", - "4 2022-02-02 17:19:36.557473+01:00 " - ] - }, - "execution_count": 280, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "campaign_stats = display_databases(\"8campaign_stats.csv\")\n", - "campaign_stats.head()" - ] - }, - { - "cell_type": "markdown", - "id": "e6512bc9-91f5-4fe4-a637-a4e84dc497a9", - "metadata": {}, - "source": [ - "#### Look at links files" - ] - }, - { - "cell_type": "markdown", - "id": "28e7c1fe-470f-4d84-87b8-a711a973500b", - "metadata": {}, - "source": [ - "There is no links file for these company. Only the link_stats file" - ] - }, - { - "cell_type": "code", - "execution_count": 281, - "id": "e973575b-4ed6-4b23-8024-f383ac82e87c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/8/8link_stats.csv\n", - "Shape : (108461, 6)\n" - ] - }, - { - "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", - "
idclicked_atlink_idcustomer_idcreated_atupdated_at
012022-02-02 18:33:17+01:001621372022-02-02 17:33:19.237759+01:002022-02-02 17:33:19.237759+01:00
122022-02-02 18:33:26+01:0015560482022-02-02 17:33:28.101943+01:002022-02-02 17:33:28.101943+01:00
232022-02-02 18:33:49+01:0021944562022-02-02 17:33:50.595125+01:002022-02-02 17:33:50.595125+01:00
342022-02-02 18:34:19+01:0011944562022-02-02 17:34:20.493986+01:002022-02-02 17:34:20.493986+01:00
452022-02-02 18:34:21+01:002215712022-02-02 17:34:22.300427+01:002022-02-02 17:34:22.300427+01:00
\n", - "
" - ], - "text/plain": [ - " id clicked_at link_id customer_id \\\n", - "0 1 2022-02-02 18:33:17+01:00 1 62137 \n", - "1 2 2022-02-02 18:33:26+01:00 1 556048 \n", - "2 3 2022-02-02 18:33:49+01:00 2 194456 \n", - "3 4 2022-02-02 18:34:19+01:00 1 194456 \n", - "4 5 2022-02-02 18:34:21+01:00 2 21571 \n", - "\n", - " created_at updated_at \n", - "0 2022-02-02 17:33:19.237759+01:00 2022-02-02 17:33:19.237759+01:00 \n", - "1 2022-02-02 17:33:28.101943+01:00 2022-02-02 17:33:28.101943+01:00 \n", - "2 2022-02-02 17:33:50.595125+01:00 2022-02-02 17:33:50.595125+01:00 \n", - "3 2022-02-02 17:34:20.493986+01:00 2022-02-02 17:34:20.493986+01:00 \n", - "4 2022-02-02 17:34:22.300427+01:00 2022-02-02 17:34:22.300427+01:00 " - ] - }, - "execution_count": 281, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "links_stats = display_databases(\"8link_stats.csv\")\n", - "links_stats.head()" - ] - }, - { - "cell_type": "markdown", - "id": "8dfcca1f-1323-413f-aa8d-3ee5ce2610a8", - "metadata": {}, - "source": [ - "#### Analyse Customersplus file" - ] - }, - { - "cell_type": "code", - "execution_count": 282, - "id": "3b523575-c779-451c-a12e-a36fb4ad232c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "bdc2324-data/8/8customersplus.csv\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/tmp/ipykernel_548/2210053343.py:5: DtypeWarning: Columns (20) have mixed types. Specify dtype option on import or set low_memory=False.\n", - " customersplus = pd.read_csv(file_in, sep=\",\")\n" - ] - }, - { - "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", - "
idlastnamefirstnamebirthdateemailstreet_idcreated_atupdated_atcivilityis_partner...preferred_categorypreferred_supplierpreferred_formulapurchase_countfirst_buying_datelast_visiting_datezipcodecountryagetenant_id
01411166NaNNaNNaNemail141116612022-12-19 15:03:39.419371+01:002022-12-19 15:03:39.419371+01:00NaNFalse...NaNNaNNaN0NaNNaNNaNfrNaN1594
1478498lastname478498firstname478498NaNemail4784983391672021-09-17 18:58:30.259053+02:002023-06-28 15:25:24.146689+02:00NaNFalse...NaNNaNNaN0NaNNaNNaNNaNNaN1594
2473678NaNNaNNaNemail4736783391672021-09-17 18:44:04.119713+02:002021-09-17 18:44:04.124204+02:00NaNFalse...NaNNaNNaN0NaNNaNNaNNaNNaN1594
3475026NaNNaNNaNemail4750263391672021-09-17 18:47:28.789618+02:002021-09-17 18:47:28.793958+02:00NaNFalse...NaNNaNNaN0NaNNaNNaNNaNNaN1594
4487146NaNNaNNaNemail4871463391672021-09-17 19:10:24.070460+02:002021-09-17 19:10:24.076033+02:00NaNFalse...NaNNaNNaN0NaNNaNNaNNaNNaN1594
\n", - "

5 rows × 43 columns

\n", - "
" - ], - "text/plain": [ - " id lastname firstname birthdate email \\\n", - "0 1411166 NaN NaN NaN email1411166 \n", - "1 478498 lastname478498 firstname478498 NaN email478498 \n", - "2 473678 NaN NaN NaN email473678 \n", - "3 475026 NaN NaN NaN email475026 \n", - "4 487146 NaN NaN NaN email487146 \n", - "\n", - " street_id created_at \\\n", - "0 1 2022-12-19 15:03:39.419371+01:00 \n", - "1 339167 2021-09-17 18:58:30.259053+02:00 \n", - "2 339167 2021-09-17 18:44:04.119713+02:00 \n", - "3 339167 2021-09-17 18:47:28.789618+02:00 \n", - "4 339167 2021-09-17 19:10:24.070460+02:00 \n", - "\n", - " updated_at civility is_partner ... \\\n", - "0 2022-12-19 15:03:39.419371+01:00 NaN False ... \n", - "1 2023-06-28 15:25:24.146689+02:00 NaN False ... \n", - "2 2021-09-17 18:44:04.124204+02:00 NaN False ... \n", - "3 2021-09-17 18:47:28.793958+02:00 NaN False ... \n", - "4 2021-09-17 19:10:24.076033+02:00 NaN False ... \n", - "\n", - " preferred_category preferred_supplier preferred_formula purchase_count \\\n", - "0 NaN NaN NaN 0 \n", - "1 NaN NaN NaN 0 \n", - "2 NaN NaN NaN 0 \n", - "3 NaN NaN NaN 0 \n", - "4 NaN NaN NaN 0 \n", - "\n", - " first_buying_date last_visiting_date zipcode country age tenant_id \n", - "0 NaN NaN NaN fr NaN 1594 \n", - "1 NaN NaN NaN NaN NaN 1594 \n", - "2 NaN NaN NaN NaN NaN 1594 \n", - "3 NaN NaN NaN NaN NaN 1594 \n", - "4 NaN NaN NaN NaN NaN 1594 \n", - "\n", - "[5 rows x 43 columns]" - ] - }, - "execution_count": 282, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "file_name = \"8customersplus.csv\"\n", - "file_path = BUCKET + \"/\" + directory_path + \"/\" + file_name\n", - "print(file_path)\n", - "with fs.open(file_path, mode=\"rb\") as file_in:\n", - " customersplus = pd.read_csv(file_in, sep=\",\")\n", - "\n", - "customersplus.head()" - ] - }, - { - "cell_type": "markdown", - "id": "fe56785a-ed3c-4322-aafa-a630f97b836f", - "metadata": {}, - "source": [ - "#### Analyse Structures files" - ] - }, - { - "cell_type": "code", - "execution_count": 283, - "id": "87d801fc-d19a-4c45-9b21-9b6d7a8451fd", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "bdc2324-data/8/8structures.csv\n", - "No structures database\n" - ] - } - ], - "source": [ - "file_name = \"8structures.csv\"\n", - "file_path = BUCKET + \"/\" + directory_path + \"/\" + file_name\n", - "print(file_path)\n", - "try:\n", - " with fs.open(file_path, mode=\"rb\") as file_in:\n", - " structures = pd.read_csv(file_in, sep=\",\")\n", - "except:\n", - " print(\"No structures database\")" - ] - }, - { - "cell_type": "markdown", - "id": "b8452558-2d32-459b-91e7-f6042345e465", - "metadata": {}, - "source": [ - "For Stade Français, there is no structures, tags and structure_tag_mapping databases" - ] - }, - { - "cell_type": "markdown", - "id": "285b1422-9ca9-4afd-b752-777a54aaa677", - "metadata": {}, - "source": [ - "#### Analyze Target databases" - ] - }, - { - "cell_type": "code", - "execution_count": 284, - "id": "b6e4c3ea-5ccf-4aec-bd2d-79a5a1194178", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "bdc2324-data/8/8customer_target_mappings.csv\n", - "Shape : (1449147, 7)\n" - ] - }, - { - "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", - "
idcustomer_idtarget_idcreated_atupdated_atnameextra_field
01460062682021-09-17 20:20:24.562734+02:002021-09-17 20:20:24.562734+02:00NaNNaN
12460056682021-09-17 20:20:24.610139+02:002021-09-17 20:20:24.610139+02:00NaNNaN
23460051652021-09-17 20:20:24.641381+02:002021-09-17 20:20:24.641381+02:00NaNNaN
34460051662021-09-17 20:20:24.672238+02:002021-09-17 20:20:24.672238+02:00NaNNaN
45460049712021-09-17 20:20:24.703110+02:002021-09-17 20:20:24.703110+02:00NaNNaN
\n", - "
" - ], - "text/plain": [ - " id customer_id target_id created_at \\\n", - "0 1 460062 68 2021-09-17 20:20:24.562734+02:00 \n", - "1 2 460056 68 2021-09-17 20:20:24.610139+02:00 \n", - "2 3 460051 65 2021-09-17 20:20:24.641381+02:00 \n", - "3 4 460051 66 2021-09-17 20:20:24.672238+02:00 \n", - "4 5 460049 71 2021-09-17 20:20:24.703110+02:00 \n", - "\n", - " updated_at name extra_field \n", - "0 2021-09-17 20:20:24.562734+02:00 NaN NaN \n", - "1 2021-09-17 20:20:24.610139+02:00 NaN NaN \n", - "2 2021-09-17 20:20:24.641381+02:00 NaN NaN \n", - "3 2021-09-17 20:20:24.672238+02:00 NaN NaN \n", - "4 2021-09-17 20:20:24.703110+02:00 NaN NaN " - ] - }, - "execution_count": 284, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "file_name = \"8customer_target_mappings.csv\"\n", - "file_path = BUCKET + \"/\" + directory_path + \"/\" + file_name\n", - "print(file_path)\n", - "try:\n", - " with fs.open(file_path, mode=\"rb\") as file_in:\n", - " customer_targets = pd.read_csv(file_in, sep=\",\")\n", - " \n", - "except:\n", - " print(\"No such database in s3\")\n", - "\n", - "print(\"Shape : \", customer_targets.shape)\n", - "customer_targets.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 285, - "id": "6e81a35c-3c6f-403d-9ebd-e8399ecd4263", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "bdc2324-data/8/8targets.csv\n", - "Shape : (331, 5)\n" - ] - }, - { - "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", - "
idtarget_type_idnamecreated_atupdated_at
011ÉTUDIANTS (OPÉ PANIERS) 21-222021-09-17 18:10:40.879995+02:002021-09-17 18:10:40.879995+02:00
121EFFECTIF + STAFF 21-222021-09-17 18:10:40.894758+02:002021-09-17 18:10:40.894758+02:00
231Acheteurs LOU / USAP2021-09-17 18:10:40.911969+02:002021-09-17 18:10:40.911969+02:00
341Liste Compensation 21-222021-09-17 18:10:40.928796+02:002021-09-17 18:10:40.928796+02:00
451Partenaires 21-222021-09-17 18:10:40.945476+02:002021-09-17 18:10:40.945476+02:00
\n", - "
" - ], - "text/plain": [ - " id target_type_id name \\\n", - "0 1 1 ÉTUDIANTS (OPÉ PANIERS) 21-22 \n", - "1 2 1 EFFECTIF + STAFF 21-22 \n", - "2 3 1 Acheteurs LOU / USAP \n", - "3 4 1 Liste Compensation 21-22 \n", - "4 5 1 Partenaires 21-22 \n", - "\n", - " created_at updated_at \n", - "0 2021-09-17 18:10:40.879995+02:00 2021-09-17 18:10:40.879995+02:00 \n", - "1 2021-09-17 18:10:40.894758+02:00 2021-09-17 18:10:40.894758+02:00 \n", - "2 2021-09-17 18:10:40.911969+02:00 2021-09-17 18:10:40.911969+02:00 \n", - "3 2021-09-17 18:10:40.928796+02:00 2021-09-17 18:10:40.928796+02:00 \n", - "4 2021-09-17 18:10:40.945476+02:00 2021-09-17 18:10:40.945476+02:00 " - ] - }, - "execution_count": 285, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "file_name = \"8targets.csv\"\n", - "file_path = BUCKET + \"/\" + directory_path + \"/\" + file_name\n", - "print(file_path)\n", - "try:\n", - " with fs.open(file_path, mode=\"rb\") as file_in:\n", - " targets = pd.read_csv(file_in, sep=\",\")\n", - " \n", - "except:\n", - " print(\"No such database in s3\")\n", - "\n", - "print(\"Shape : \", targets.shape)\n", - "targets.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 286, - "id": "85696d74-3b2f-4368-9045-44db5322b60d", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "bdc2324-data/8/8target_types.csv\n", - "Shape : (4, 6)\n" - ] - }, - { - "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", - "
idis_importnamecreated_atupdated_atidentifier
01NaNmanual_static_filter2021-09-17 18:10:40.864320+02:002021-09-17 18:10:40.864320+02:00e34e3aa838a6eb4c41df6ed4444b796a
12Falsemanual_dynamic_filter2022-03-09 14:41:45.695407+01:002022-03-09 14:41:45.695407+01:00e0f4b8693184850fefd6d2a38f10584e
23Falsemanual_static_filter2022-04-01 17:02:49.588910+02:002022-04-01 17:02:49.588910+02:00fb27e81baa4debc6a4e1a8639c20e808
34Truemanual_import2022-05-06 14:26:01.923160+02:002022-05-06 14:26:01.923160+02:0012213df2ce68a624e4c0070521437bac
\n", - "
" - ], - "text/plain": [ - " id is_import name created_at \\\n", - "0 1 NaN manual_static_filter 2021-09-17 18:10:40.864320+02:00 \n", - "1 2 False manual_dynamic_filter 2022-03-09 14:41:45.695407+01:00 \n", - "2 3 False manual_static_filter 2022-04-01 17:02:49.588910+02:00 \n", - "3 4 True manual_import 2022-05-06 14:26:01.923160+02:00 \n", - "\n", - " updated_at identifier \n", - "0 2021-09-17 18:10:40.864320+02:00 e34e3aa838a6eb4c41df6ed4444b796a \n", - "1 2022-03-09 14:41:45.695407+01:00 e0f4b8693184850fefd6d2a38f10584e \n", - "2 2022-04-01 17:02:49.588910+02:00 fb27e81baa4debc6a4e1a8639c20e808 \n", - "3 2022-05-06 14:26:01.923160+02:00 12213df2ce68a624e4c0070521437bac " - ] - }, - "execution_count": 286, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "file_name = \"8target_types.csv\"\n", - "file_path = BUCKET + \"/\" + directory_path + \"/\" + file_name\n", - "print(file_path)\n", - "try:\n", - " with fs.open(file_path, mode=\"rb\") as file_in:\n", - " target_types = pd.read_csv(file_in, sep=\",\")\n", - " \n", - "except:\n", - " print(\"No such database in s3\")\n", - "\n", - "print(\"Shape : \", target_types.shape)\n", - "target_types.head()" - ] - }, - { - "cell_type": "markdown", - "id": "cdc6416b-3deb-446c-8957-435745b93533", - "metadata": {}, - "source": [ - "#### Analyze consumption files" - ] - }, - { - "cell_type": "markdown", - "id": "f8622bd5-a5ab-403f-ab01-758aec879ee4", - "metadata": {}, - "source": [ - "Meaning consumptions.csv, suppliers.csv, tickets.csv and purchases.csv\n", - "\n", - "However, there is no consumptions.csv file" - ] - }, - { - "cell_type": "code", - "execution_count": 287, - "id": "7c57529b-2ffb-4039-9795-b27c6fbd54a4", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/8/8purchases.csv\n", - "Shape : (975703, 7)\n" - ] - }, - { - "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", - "
idpurchase_datecustomer_idcreated_atupdated_atnumberidentifier
01196092017-09-09 15:39:45.913000+02:0011492021-06-29 21:52:21.816195+02:002021-06-29 21:52:21.816195+02:00193416f2956e2d53321317e7c15c1cb992156c
11196102017-09-09 15:39:46.033000+02:0011492021-06-29 21:52:21.817846+02:002021-06-29 21:52:21.817846+02:00193416faabab441b2668a85bb484490b2166c3
254642017-07-24 19:44:11.923000+02:0012512021-06-29 21:33:45.604224+02:002021-06-29 21:33:45.604224+02:00184354f63c69fa585ce4f91681f0d9ebeb770f
31196132017-09-10 11:25:45.820000+02:00125582021-06-29 21:52:21.822033+02:002021-06-29 21:52:21.822033+02:00193462ffce5fd8d2348eb6885d0ee9c7bd017c
414228602018-10-08 10:30:42.980000+02:00179352021-07-16 04:20:55.347369+02:002021-07-16 04:20:55.347369+02:00247459193e41eae8ee078537107a569c0426ef
\n", - "
" - ], - "text/plain": [ - " id purchase_date customer_id \\\n", - "0 119609 2017-09-09 15:39:45.913000+02:00 1149 \n", - "1 119610 2017-09-09 15:39:46.033000+02:00 1149 \n", - "2 5464 2017-07-24 19:44:11.923000+02:00 1251 \n", - "3 119613 2017-09-10 11:25:45.820000+02:00 12558 \n", - "4 1422860 2018-10-08 10:30:42.980000+02:00 17935 \n", - "\n", - " created_at updated_at number \\\n", - "0 2021-06-29 21:52:21.816195+02:00 2021-06-29 21:52:21.816195+02:00 193416 \n", - "1 2021-06-29 21:52:21.817846+02:00 2021-06-29 21:52:21.817846+02:00 193416 \n", - "2 2021-06-29 21:33:45.604224+02:00 2021-06-29 21:33:45.604224+02:00 184354 \n", - "3 2021-06-29 21:52:21.822033+02:00 2021-06-29 21:52:21.822033+02:00 193462 \n", - "4 2021-07-16 04:20:55.347369+02:00 2021-07-16 04:20:55.347369+02:00 247459 \n", - "\n", - " identifier \n", - "0 f2956e2d53321317e7c15c1cb992156c \n", - "1 faabab441b2668a85bb484490b2166c3 \n", - "2 f63c69fa585ce4f91681f0d9ebeb770f \n", - "3 ffce5fd8d2348eb6885d0ee9c7bd017c \n", - "4 193e41eae8ee078537107a569c0426ef " - ] - }, - "execution_count": 287, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "purchases = display_databases(\"8purchases.csv\")\n", - "purchases.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 288, - "id": "903321fb-99f8-475d-b4a6-c70ec2efe190", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/8/8tickets.csv\n", - "Shape : (2370152, 11)\n" - ] - }, - { - "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", - "
idnumbercreated_atupdated_atpurchase_idproduct_idis_from_subscriptiontype_ofsupplier_idbarcodeidentifier
0254164193416_763837_650_688_3262122021-06-29 21:53:14.951871+02:002021-06-29 21:53:14.951871+02:001196093334False12NaN9ec3b5617fc54512acf131aa5fa26870
1254165193416_763838_650_688_3262362021-06-29 21:53:14.953717+02:002021-06-29 21:53:14.953717+02:001196103334False12NaNb227c664e2574a919672683f5cc4c98e
2254168193462_763921_649_687_3056762021-06-29 21:53:14.958207+02:002021-06-29 21:53:14.958207+02:001196133432False12NaN28ac507ad84a30993bdfc0996fd2476b
3254169193462_763922_649_687_3056532021-06-29 21:53:14.959681+02:002021-06-29 21:53:14.959681+02:001196143268False12NaN131dbaeef23f5ac2271bf0266ce35476
4254170193462_763923_649_687_3056302021-06-29 21:53:14.961157+02:002021-06-29 21:53:14.961157+02:001196153268False12NaN1a6342ad2c213b626aa55e5374cd661a
\n", - "
" - ], - "text/plain": [ - " id number created_at \\\n", - "0 254164 193416_763837_650_688_326212 2021-06-29 21:53:14.951871+02:00 \n", - "1 254165 193416_763838_650_688_326236 2021-06-29 21:53:14.953717+02:00 \n", - "2 254168 193462_763921_649_687_305676 2021-06-29 21:53:14.958207+02:00 \n", - "3 254169 193462_763922_649_687_305653 2021-06-29 21:53:14.959681+02:00 \n", - "4 254170 193462_763923_649_687_305630 2021-06-29 21:53:14.961157+02:00 \n", - "\n", - " updated_at purchase_id product_id \\\n", - "0 2021-06-29 21:53:14.951871+02:00 119609 3334 \n", - "1 2021-06-29 21:53:14.953717+02:00 119610 3334 \n", - "2 2021-06-29 21:53:14.958207+02:00 119613 3432 \n", - "3 2021-06-29 21:53:14.959681+02:00 119614 3268 \n", - "4 2021-06-29 21:53:14.961157+02:00 119615 3268 \n", - "\n", - " is_from_subscription type_of supplier_id barcode \\\n", - "0 False 1 2 NaN \n", - "1 False 1 2 NaN \n", - "2 False 1 2 NaN \n", - "3 False 1 2 NaN \n", - "4 False 1 2 NaN \n", - "\n", - " identifier \n", - "0 9ec3b5617fc54512acf131aa5fa26870 \n", - "1 b227c664e2574a919672683f5cc4c98e \n", - "2 28ac507ad84a30993bdfc0996fd2476b \n", - "3 131dbaeef23f5ac2271bf0266ce35476 \n", - "4 1a6342ad2c213b626aa55e5374cd661a " - ] - }, - "execution_count": 288, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tickets = display_databases(\"8tickets.csv\")\n", "tickets.head()" ] }, { "cell_type": "code", - "execution_count": 289, - "id": "243e6942-0233-4cd5-b32b-e005457131d2", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/8/8suppliers.csv\n", - "Shape : (16, 9)\n" - ] - }, - { - "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", - "
idnamemanually_addedlabelitrupdated_atcreated_atcommissionidentifier
0152plateformecewebFalseNaNNaN2021-07-16 00:02:17.805193+02:002021-07-16 00:02:17.805193+02:00NaN0fc934f49bfa9f1f4e6ab7e2593b6839
16accreditation annuelleFalseNaNNaN2021-06-29 21:33:14.138349+02:002021-06-29 21:33:14.138349+02:00NaNfe13238540e0ff293ec8aad29aeae6c3
268abonnement parkingFalseNaNNaN2021-06-29 22:10:31.167367+02:002021-06-29 22:10:31.167367+02:00NaN0f7defc52a97cdca533af74f4e6e5b1e
39accreditation matchFalseNaNNaN2021-06-29 21:33:14.142084+02:002021-06-29 21:33:14.142084+02:00NaN40e19a7c4824eaad298e0107ed7e3691
4154web lnr-louFalseNaNNaN2021-07-16 00:02:17.806521+02:002021-07-16 00:02:17.806521+02:00NaNb144dd617807b02e0d9002fac6c61768
\n", - "
" - ], - "text/plain": [ - " id name manually_added label itr \\\n", - "0 152 plateformeceweb False NaN NaN \n", - "1 6 accreditation annuelle False NaN NaN \n", - "2 68 abonnement parking False NaN NaN \n", - "3 9 accreditation match False NaN NaN \n", - "4 154 web lnr-lou False NaN NaN \n", - "\n", - " updated_at created_at \\\n", - "0 2021-07-16 00:02:17.805193+02:00 2021-07-16 00:02:17.805193+02:00 \n", - "1 2021-06-29 21:33:14.138349+02:00 2021-06-29 21:33:14.138349+02:00 \n", - "2 2021-06-29 22:10:31.167367+02:00 2021-06-29 22:10:31.167367+02:00 \n", - "3 2021-06-29 21:33:14.142084+02:00 2021-06-29 21:33:14.142084+02:00 \n", - "4 2021-07-16 00:02:17.806521+02:00 2021-07-16 00:02:17.806521+02:00 \n", - "\n", - " commission identifier \n", - "0 NaN 0fc934f49bfa9f1f4e6ab7e2593b6839 \n", - "1 NaN fe13238540e0ff293ec8aad29aeae6c3 \n", - "2 NaN 0f7defc52a97cdca533af74f4e6e5b1e \n", - "3 NaN 40e19a7c4824eaad298e0107ed7e3691 \n", - "4 NaN b144dd617807b02e0d9002fac6c61768 " - ] - }, - "execution_count": 289, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "suppliers = display_databases(\"8suppliers.csv\")\n", - "suppliers.head()" - ] - }, - { - "cell_type": "markdown", - "id": "fd8c876a-f0c5-4123-a422-c267af5f29b1", - "metadata": {}, - "source": [ - "#### Analyse product file" - ] - }, - { - "cell_type": "code", - "execution_count": 290, - "id": "6b82efce-1dee-4d89-8585-28c4ad477eef", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/8/8products.csv\n", - "Shape : (45411, 14)\n" - ] - }, - { - "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", - "
idamountis_full_pricerepresentation_idpricing_formula_idcreated_atupdated_atcategory_idapply_priceproducts_group_idproduct_pack_idextra_fieldamount_consumptionidentifier
0900130.0False19619122021-07-16 04:56:05.797551+02:002021-07-16 04:56:05.797551+02:00340.0879171NaNNaN476e111175b1660688b7c13dade2b57e
16620.0False11292021-06-29 21:33:17.389201+02:002021-06-29 21:33:17.389201+02:00160.06401NaNNaN2c765698e9bedd48e8a3fd27dc8dbc97
26460.0False46102021-06-29 21:33:17.366742+02:002021-06-29 21:33:17.366742+02:00150.06241NaNNaN4e719148651fd7f175e3fb51bdb5d31b
357035.0False71882021-06-29 21:52:09.374365+02:002021-06-29 21:52:09.374365+02:0040.055401NaNNaNe4d7beeb0a631e2e51e61951623ba9b1
46480.0False49102021-06-29 21:33:17.369471+02:002021-06-29 21:33:17.369471+02:00150.06261NaNNaN07a5dd9e125345b9458651ab73605255
\n", - "
" - ], - "text/plain": [ - " id amount is_full_price representation_id pricing_formula_id \\\n", - "0 90013 0.0 False 1961 912 \n", - "1 662 0.0 False 11 29 \n", - "2 646 0.0 False 46 10 \n", - "3 5703 5.0 False 7 188 \n", - "4 648 0.0 False 49 10 \n", - "\n", - " created_at updated_at \\\n", - "0 2021-07-16 04:56:05.797551+02:00 2021-07-16 04:56:05.797551+02:00 \n", - "1 2021-06-29 21:33:17.389201+02:00 2021-06-29 21:33:17.389201+02:00 \n", - "2 2021-06-29 21:33:17.366742+02:00 2021-06-29 21:33:17.366742+02:00 \n", - "3 2021-06-29 21:52:09.374365+02:00 2021-06-29 21:52:09.374365+02:00 \n", - "4 2021-06-29 21:33:17.369471+02:00 2021-06-29 21:33:17.369471+02:00 \n", - "\n", - " category_id apply_price products_group_id product_pack_id extra_field \\\n", - "0 34 0.0 87917 1 NaN \n", - "1 16 0.0 640 1 NaN \n", - "2 15 0.0 624 1 NaN \n", - "3 4 0.0 5540 1 NaN \n", - "4 15 0.0 626 1 NaN \n", - "\n", - " amount_consumption identifier \n", - "0 NaN 476e111175b1660688b7c13dade2b57e \n", - "1 NaN 2c765698e9bedd48e8a3fd27dc8dbc97 \n", - "2 NaN 4e719148651fd7f175e3fb51bdb5d31b \n", - "3 NaN e4d7beeb0a631e2e51e61951623ba9b1 \n", - "4 NaN 07a5dd9e125345b9458651ab73605255 " - ] - }, - "execution_count": 290, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "products = display_databases(\"8products.csv\")\n", - "products.head()" - ] - }, - { - "cell_type": "markdown", - "id": "8ad143b2-2869-4bd2-982e-688498b98727", - "metadata": {}, - "source": [ - "#### Analyze pricing files" - ] - }, - { - "cell_type": "markdown", - "id": "9a54e9a5-801d-4000-9e76-e792edbf7e41", - "metadata": {}, - "source": [ - "Meaning pricing_formulas.csv and type_of_pricing_formulas" - ] - }, - { - "cell_type": "code", - "execution_count": 291, - "id": "daf37bff-a26d-4ff5-ad50-c90f917164bd", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/8/8pricing_formulas.csv\n", - "Shape : (516, 6)\n" - ] - }, - { - "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", - "
idnamecreated_atupdated_atextra_fieldidentifier
07visite stade enfant2021-06-29 21:33:14.160728+02:002021-06-29 21:33:14.160728+02:00NaNbbc80e5761a0ea325f6f6a5411752659
13229tarif bloc etudiants2021-07-16 04:20:46.684601+02:002021-09-03 16:44:46.096785+02:00NaN205122cc7e96d559330972b0ec0cf35a
242invitation eiffage2021-06-29 21:33:14.204483+02:002021-06-29 21:33:14.204483+02:00NaNe4e6365c02e2a7b01ebe2ce8ace624f2
34379invitation offre speciale2021-07-16 05:21:44.984893+02:002021-07-16 05:21:44.984893+02:00NaN307817b6205535a35915a64027ee161e
42641prevente reabo enfant2021-07-16 03:47:40.896805+02:002021-09-03 16:08:35.304298+02:00NaN478eb63c71ba35d8d3d64c8637dafdee
\n", - "
" - ], - "text/plain": [ - " id name created_at \\\n", - "0 7 visite stade enfant 2021-06-29 21:33:14.160728+02:00 \n", - "1 3229 tarif bloc etudiants 2021-07-16 04:20:46.684601+02:00 \n", - "2 42 invitation eiffage 2021-06-29 21:33:14.204483+02:00 \n", - "3 4379 invitation offre speciale 2021-07-16 05:21:44.984893+02:00 \n", - "4 2641 prevente reabo enfant 2021-07-16 03:47:40.896805+02:00 \n", - "\n", - " updated_at extra_field \\\n", - "0 2021-06-29 21:33:14.160728+02:00 NaN \n", - "1 2021-09-03 16:44:46.096785+02:00 NaN \n", - "2 2021-06-29 21:33:14.204483+02:00 NaN \n", - "3 2021-07-16 05:21:44.984893+02:00 NaN \n", - "4 2021-09-03 16:08:35.304298+02:00 NaN \n", - "\n", - " identifier \n", - "0 bbc80e5761a0ea325f6f6a5411752659 \n", - "1 205122cc7e96d559330972b0ec0cf35a \n", - "2 e4e6365c02e2a7b01ebe2ce8ace624f2 \n", - "3 307817b6205535a35915a64027ee161e \n", - "4 478eb63c71ba35d8d3d64c8637dafdee " - ] - }, - "execution_count": 291, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pricing_formulas = display_databases(\"8pricing_formulas.csv\")\n", - "pricing_formulas.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 292, - "id": "cdb14488-b093-4b39-84fa-1c2b4576208f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/8/8type_of_pricing_formulas.csv\n", - "Shape : (103, 6)\n" - ] - }, - { - "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", - "
idtype_of_idpricing_formula_idcreated_atupdated_atidentifier
01710212021-09-03 14:17:19.816110+02:002021-09-03 14:17:19.816110+02:0041047fbeb7cd3e1cb2713c608d2f786d
12743052021-09-03 14:17:19.848088+02:002021-09-03 14:17:19.848088+02:00a62a4dad7d62738129244bbb5ede0747
23743062021-09-03 14:17:19.864067+02:002021-09-03 14:17:19.864067+02:00c3770373e09f55412068c447736d9da3
347292021-09-03 14:17:19.880078+02:002021-09-03 14:17:19.880078+02:007b7b1242ae7a8c9eb66d35d8a4348ccd
458102021-09-03 14:18:03.616081+02:002021-09-03 14:18:03.616081+02:000a2b941c46b31258c03b316aa064e86a
\n", - "
" - ], - "text/plain": [ - " id type_of_id pricing_formula_id created_at \\\n", - "0 1 7 1021 2021-09-03 14:17:19.816110+02:00 \n", - "1 2 7 4305 2021-09-03 14:17:19.848088+02:00 \n", - "2 3 7 4306 2021-09-03 14:17:19.864067+02:00 \n", - "3 4 7 29 2021-09-03 14:17:19.880078+02:00 \n", - "4 5 8 10 2021-09-03 14:18:03.616081+02:00 \n", - "\n", - " updated_at identifier \n", - "0 2021-09-03 14:17:19.816110+02:00 41047fbeb7cd3e1cb2713c608d2f786d \n", - "1 2021-09-03 14:17:19.848088+02:00 a62a4dad7d62738129244bbb5ede0747 \n", - "2 2021-09-03 14:17:19.864067+02:00 c3770373e09f55412068c447736d9da3 \n", - "3 2021-09-03 14:17:19.880078+02:00 7b7b1242ae7a8c9eb66d35d8a4348ccd \n", - "4 2021-09-03 14:18:03.616081+02:00 0a2b941c46b31258c03b316aa064e86a " - ] - }, - "execution_count": 292, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type_pricing_formulas = display_databases(\"8type_of_pricing_formulas.csv\")\n", - "type_pricing_formulas.head()" - ] - }, - { - "cell_type": "markdown", - "id": "a084297a-4fd7-4cda-b513-7704f4244a5c", - "metadata": {}, - "source": [ - "#### Analyze type of products" - ] - }, - { - "cell_type": "markdown", - "id": "76a67ea7-8720-441e-8973-23e5d105370e", - "metadata": {}, - "source": [ - "Meaning categories.csv, type_of_categories.csv" - ] - }, - { - "cell_type": "code", - "execution_count": 293, - "id": "6582694d-5339-4f33-a943-c73033121a90", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/8/8categories.csv\n", - "Shape : (148, 7)\n" - ] - }, - { - "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", - "
idnamecreated_atupdated_atextra_fieldquotaidentifier
0653acces village implid2021-07-16 00:04:37.181331+02:002021-07-16 00:04:37.181331+02:00NaNNaNc447d053646a6503d3cd84d4798bf5b7
1805parking organisation2021-07-16 01:54:15.822407+02:002021-07-16 01:54:15.822407+02:00NaNNaN02bf9871964345f505ad305080daec36
2809rose rouge orange2021-07-16 01:54:15.825345+02:002021-07-16 01:54:15.825345+02:00NaNNaN31fb5b57bc1a2bcd5c155fb0d9e7c0dd
321832eme catégorie j.b. centrale2021-07-16 04:37:25.446835+02:002021-07-16 04:37:25.446835+02:00NaNNaNc9eb6651caaed42b809b3f4407a847c9
4621acces brasserie2021-07-16 00:02:17.249701+02:002021-07-16 00:02:17.249701+02:00NaNNaN349e6a59585d78d80d46acbc6a520c50
\n", - "
" - ], - "text/plain": [ - " id name created_at \\\n", - "0 653 acces village implid 2021-07-16 00:04:37.181331+02:00 \n", - "1 805 parking organisation 2021-07-16 01:54:15.822407+02:00 \n", - "2 809 rose rouge orange 2021-07-16 01:54:15.825345+02:00 \n", - "3 2183 2eme catégorie j.b. centrale 2021-07-16 04:37:25.446835+02:00 \n", - "4 621 acces brasserie 2021-07-16 00:02:17.249701+02:00 \n", - "\n", - " updated_at extra_field quota \\\n", - "0 2021-07-16 00:04:37.181331+02:00 NaN NaN \n", - "1 2021-07-16 01:54:15.822407+02:00 NaN NaN \n", - "2 2021-07-16 01:54:15.825345+02:00 NaN NaN \n", - "3 2021-07-16 04:37:25.446835+02:00 NaN NaN \n", - "4 2021-07-16 00:02:17.249701+02:00 NaN NaN \n", - "\n", - " identifier \n", - "0 c447d053646a6503d3cd84d4798bf5b7 \n", - "1 02bf9871964345f505ad305080daec36 \n", - "2 31fb5b57bc1a2bcd5c155fb0d9e7c0dd \n", - "3 c9eb6651caaed42b809b3f4407a847c9 \n", - "4 349e6a59585d78d80d46acbc6a520c50 " - ] - }, - "execution_count": 293, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "categories = display_databases(\"8categories.csv\")\n", - "categories.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 294, - "id": "589076df-1958-42de-9941-1aff9fa8536f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/8/8type_of_categories.csv\n", - "Shape : (6, 6)\n" - ] - }, - { - "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", - "
idtype_of_idcategory_idcreated_atupdated_atidentifier
01122021-08-20 15:22:05.558209+02:002021-08-20 15:22:05.558209+02:00af8fa6d57f6b19a7600a69e7771c7c3a
12212021-09-02 17:29:32.582002+02:002021-09-02 17:29:32.582002+02:0063718e7ad306912427758ddf988ad34f
23332021-09-02 17:32:38.299733+02:002021-09-02 17:32:38.299733+02:005e147d4d90888df14c4584f5c6887c96
34442021-09-02 17:35:04.748993+02:002021-09-02 17:35:04.748993+02:00a9dfdc3f40b41e3018933c6167fc38a5
455172021-09-02 17:35:37.396740+02:002021-09-02 17:35:37.396740+02:00c05b0061d2a875adbc35d3dfa6a50a12
\n", - "
" - ], - "text/plain": [ - " id type_of_id category_id created_at \\\n", - "0 1 1 2 2021-08-20 15:22:05.558209+02:00 \n", - "1 2 2 1 2021-09-02 17:29:32.582002+02:00 \n", - "2 3 3 3 2021-09-02 17:32:38.299733+02:00 \n", - "3 4 4 4 2021-09-02 17:35:04.748993+02:00 \n", - "4 5 5 17 2021-09-02 17:35:37.396740+02:00 \n", - "\n", - " updated_at identifier \n", - "0 2021-08-20 15:22:05.558209+02:00 af8fa6d57f6b19a7600a69e7771c7c3a \n", - "1 2021-09-02 17:29:32.582002+02:00 63718e7ad306912427758ddf988ad34f \n", - "2 2021-09-02 17:32:38.299733+02:00 5e147d4d90888df14c4584f5c6887c96 \n", - "3 2021-09-02 17:35:04.748993+02:00 a9dfdc3f40b41e3018933c6167fc38a5 \n", - "4 2021-09-02 17:35:37.396740+02:00 c05b0061d2a875adbc35d3dfa6a50a12 " - ] - }, - "execution_count": 294, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type_categories = display_databases(\"8type_of_categories.csv\")\n", - "type_categories.head()" - ] - }, - { - "cell_type": "markdown", - "id": "3427b681-4c05-4e4e-9c2b-867ee789f98c", - "metadata": {}, - "source": [ - "#### Analyze type of representations" - ] - }, - { - "cell_type": "markdown", - "id": "9381e36b-090a-44c5-a29d-3ac4c9a4431e", - "metadata": {}, - "source": [ - "Meaning representation_category_capacities.csv, representations.csv, representations_types.csv\n", - "\n", - "however there is no representation_types database" - ] - }, - { - "cell_type": "code", - "execution_count": 295, - "id": "6f06d72a-5725-4eee-8e4c-e9ef5820f346", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/8/8representation_category_capacities.csv\n", - "Shape : (7378, 7)\n" - ] - }, - { - "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", - "
idcreated_atupdated_atrepresentation_idcategory_idexpected_fillingmax_filling
05612021-06-29 21:33:14.096827+02:002021-06-29 21:33:14.096827+02:001737NaNNaN
15712021-06-29 21:33:14.110047+02:002021-06-29 21:33:14.110047+02:001439NaNNaN
296652021-07-16 00:02:17.736387+02:002021-07-16 00:02:17.736387+02:0018878NaNNaN
33839062023-03-04 02:55:01.585418+01:002023-03-04 02:55:01.585418+01:0052729476NaNNaN
43932021-06-29 21:33:13.876766+02:002021-06-29 21:33:13.876766+02:00923NaNNaN
\n", - "
" - ], - "text/plain": [ - " id created_at updated_at \\\n", - "0 561 2021-06-29 21:33:14.096827+02:00 2021-06-29 21:33:14.096827+02:00 \n", - "1 571 2021-06-29 21:33:14.110047+02:00 2021-06-29 21:33:14.110047+02:00 \n", - "2 9665 2021-07-16 00:02:17.736387+02:00 2021-07-16 00:02:17.736387+02:00 \n", - "3 383906 2023-03-04 02:55:01.585418+01:00 2023-03-04 02:55:01.585418+01:00 \n", - "4 393 2021-06-29 21:33:13.876766+02:00 2021-06-29 21:33:13.876766+02:00 \n", - "\n", - " representation_id category_id expected_filling max_filling \n", - "0 17 37 NaN NaN \n", - "1 14 39 NaN NaN \n", - "2 1887 8 NaN NaN \n", - "3 52729 476 NaN NaN \n", - "4 9 23 NaN NaN " - ] - }, - "execution_count": 295, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "representation_category_capacities = display_databases(\"8representation_category_capacities.csv\")\n", - "representation_category_capacities.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 296, - "id": "bd405913-033d-4f15-a5b9-103d577baaff", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/8/8representations.csv\n", - "Shape : (1015, 16)\n" - ] - }, - { - "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", - "
idserialevent_idcreated_atupdated_atstart_date_timeopensatisfactionend_date_timenameis_displayrepresentation_type_idexpected_fillingmax_fillingextra_fieldidentifier
05903NaN58362021-07-16 05:16:57.419565+02:002021-07-16 05:16:57.419565+02:002019-08-24 18:00:00+02:00TrueNaN1901-01-01 00:09:21+00:09NaNTrueNaNNaNNaNNaN8009c34cae4e79e3781f16f3ceeab244
167133NaN656522023-09-27 02:21:36.573001+02:002023-09-27 02:21:36.573001+02:002023-10-04 10:30:00+02:00TrueNaN1901-01-01 00:09:21+00:09NaNTrueNaNNaNNaNNaN4e9d3fc8d1f7bf563dc586548fe6390e
21874NaN18262021-07-16 00:02:17.390274+02:002021-07-16 00:02:17.390274+02:002019-09-14 18:00:00+02:00TrueNaN1901-01-01 00:09:21+00:09NaNTrueNaNNaNNaNNaN19f666370c1fc781dff638c20ae04c8a
35904NaN58372021-07-16 05:16:57.420302+02:002021-07-16 05:16:57.420302+02:002019-09-01 17:05:00+02:00TrueNaN1901-01-01 00:09:21+00:09NaNTrueNaNNaNNaNNaN4221acd3f49179f5d0b292c15d1ab8e4
44165NaN41062021-07-16 03:53:05.929713+02:002021-07-16 03:53:05.929713+02:002018-10-14 14:00:00+02:00TrueNaN1901-01-01 00:09:21+00:09NaNTrueNaNNaNNaNNaN733104286519c0614b2d45470eb180a1
\n", - "
" - ], - "text/plain": [ - " id serial event_id created_at \\\n", - "0 5903 NaN 5836 2021-07-16 05:16:57.419565+02:00 \n", - "1 67133 NaN 65652 2023-09-27 02:21:36.573001+02:00 \n", - "2 1874 NaN 1826 2021-07-16 00:02:17.390274+02:00 \n", - "3 5904 NaN 5837 2021-07-16 05:16:57.420302+02:00 \n", - "4 4165 NaN 4106 2021-07-16 03:53:05.929713+02:00 \n", - "\n", - " updated_at start_date_time open \\\n", - "0 2021-07-16 05:16:57.419565+02:00 2019-08-24 18:00:00+02:00 True \n", - "1 2023-09-27 02:21:36.573001+02:00 2023-10-04 10:30:00+02:00 True \n", - "2 2021-07-16 00:02:17.390274+02:00 2019-09-14 18:00:00+02:00 True \n", - "3 2021-07-16 05:16:57.420302+02:00 2019-09-01 17:05:00+02:00 True \n", - "4 2021-07-16 03:53:05.929713+02:00 2018-10-14 14:00:00+02:00 True \n", - "\n", - " satisfaction end_date_time name is_display \\\n", - "0 NaN 1901-01-01 00:09:21+00:09 NaN True \n", - "1 NaN 1901-01-01 00:09:21+00:09 NaN True \n", - "2 NaN 1901-01-01 00:09:21+00:09 NaN True \n", - "3 NaN 1901-01-01 00:09:21+00:09 NaN True \n", - "4 NaN 1901-01-01 00:09:21+00:09 NaN True \n", - "\n", - " representation_type_id expected_filling max_filling extra_field \\\n", - "0 NaN NaN NaN NaN \n", - "1 NaN NaN NaN NaN \n", - "2 NaN NaN NaN NaN \n", - "3 NaN NaN NaN NaN \n", - "4 NaN NaN NaN NaN \n", - "\n", - " identifier \n", - "0 8009c34cae4e79e3781f16f3ceeab244 \n", - "1 4e9d3fc8d1f7bf563dc586548fe6390e \n", - "2 19f666370c1fc781dff638c20ae04c8a \n", - "3 4221acd3f49179f5d0b292c15d1ab8e4 \n", - "4 733104286519c0614b2d45470eb180a1 " - ] - }, - "execution_count": 296, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "representations = display_databases(\"8representations.csv\")\n", - "representations.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 297, - "id": "0f2c7ea3-6964-48fd-9411-17547b2c3a3f", + "execution_count": null, + "id": "171cf427-18bf-4c0b-9698-3cec5cd61073", "metadata": {}, "outputs": [], "source": [ - "#representation_type = display_databases(\"8representation_types.csv\")" - ] - }, - { - "cell_type": "markdown", - "id": "a9b02406-2a69-4431-8d49-3c6bd6a5e1c7", - "metadata": {}, - "source": [ - "#### Analyze type of events" - ] - }, - { - "cell_type": "markdown", - "id": "1d554266-282c-4f64-9a0f-ddcf591ec912", - "metadata": {}, - "source": [ - "Meaning events.csv, event_types.csv, seasons.csv and facilities.csv" + "tickets.groupby('number_company')['achat_internet'].sum()" ] }, { "cell_type": "code", - "execution_count": 298, - "id": "cba22ee2-338d-4ce1-a1e8-829a11a94bcf", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/8/8events.csv\n", - "Shape : (922, 12)\n" - ] - }, - { - "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", - "
idcreated_atupdated_atseason_idfacility_idnameevent_type_idmanual_addedis_displayevent_type_key_idfacility_key_ididentifier
0415422022-10-29 02:54:32.756920+02:002022-10-29 02:57:35.511792+02:00521match lou feminin - lons5588FalseTrue5588140cc5a346b1af4ee7108ac28b144fb77
1210682021-12-17 03:43:53.166446+01:002021-12-17 03:46:40.346096+01:00511repas brasserie lou-racing2310FalseTrue23101500b670b79aa592ecb06f4957800a752
2598122023-05-26 01:45:54.321665+02:002023-05-26 01:46:01.571397+02:0015012parking match 210185FalseTrue101852d5f62ed879867b8b51ed7b85f1fc3ab0
334242021-07-16 03:13:06.988358+02:002021-07-16 05:33:31.321933+02:0011rugby + hockey sur glace5FalseTrue51822b47176c355a647aa2dbdf8dfbc594
4213792021-12-23 02:37:22.948114+01:002021-12-23 02:38:20.726329+01:00511bloc des etudiants lou-racing2562FalseTrue2562117b91f19c71ff6287ffc1f44af952576
\n", - "
" - ], - "text/plain": [ - " id created_at updated_at \\\n", - "0 41542 2022-10-29 02:54:32.756920+02:00 2022-10-29 02:57:35.511792+02:00 \n", - "1 21068 2021-12-17 03:43:53.166446+01:00 2021-12-17 03:46:40.346096+01:00 \n", - "2 59812 2023-05-26 01:45:54.321665+02:00 2023-05-26 01:46:01.571397+02:00 \n", - "3 3424 2021-07-16 03:13:06.988358+02:00 2021-07-16 05:33:31.321933+02:00 \n", - "4 21379 2021-12-23 02:37:22.948114+01:00 2021-12-23 02:38:20.726329+01:00 \n", - "\n", - " season_id facility_id name event_type_id \\\n", - "0 52 1 match lou feminin - lons 5588 \n", - "1 51 1 repas brasserie lou-racing 2310 \n", - "2 1501 2 parking match 2 10185 \n", - "3 1 1 rugby + hockey sur glace 5 \n", - "4 51 1 bloc des etudiants lou-racing 2562 \n", - "\n", - " manual_added is_display event_type_key_id facility_key_id \\\n", - "0 False True 5588 1 \n", - "1 False True 2310 1 \n", - "2 False True 10185 2 \n", - "3 False True 5 1 \n", - "4 False True 2562 1 \n", - "\n", - " identifier \n", - "0 40cc5a346b1af4ee7108ac28b144fb77 \n", - "1 500b670b79aa592ecb06f4957800a752 \n", - "2 d5f62ed879867b8b51ed7b85f1fc3ab0 \n", - "3 822b47176c355a647aa2dbdf8dfbc594 \n", - "4 17b91f19c71ff6287ffc1f44af952576 " - ] - }, - "execution_count": 298, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "events = display_databases(\"8events.csv\")\n", - "events.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 299, - "id": "3db00b9d-2187-4cb6-980d-8ac6ab9eb460", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/8/8event_types.csv\n", - "Shape : (73, 6)\n" - ] - }, - { - "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", - "
idnamecreated_atupdated_atfidelity_delayidentifier
01standard2021-06-29 13:52:10.434850+02:002021-06-29 13:52:10.434850+02:0036c00f0c4675b91fb8b918e4079a0b1bac
111ptit lou2021-06-29 21:33:13.000743+02:002021-06-29 21:33:13.000743+02:0036dedd3579bc13b3ed7a90277247d9944b
2274parking 19-202021-07-16 00:02:17.225410+02:002021-07-16 00:02:17.225410+02:00360d348caeec0b66f9d4987dfbe30e1e8b
3129events 2018-20192021-06-30 01:35:18.110429+02:002021-06-30 01:35:18.110429+02:003665eb39ddf8f79d28d93c2f2c53118f50
410accreditations 2017-20182021-06-29 21:33:12.999510+02:002021-06-29 21:33:12.999510+02:0036732cfdcf2065fa0005faf42793ddd76c
\n", - "
" - ], - "text/plain": [ - " id name created_at \\\n", - "0 1 standard 2021-06-29 13:52:10.434850+02:00 \n", - "1 11 ptit lou 2021-06-29 21:33:13.000743+02:00 \n", - "2 274 parking 19-20 2021-07-16 00:02:17.225410+02:00 \n", - "3 129 events 2018-2019 2021-06-30 01:35:18.110429+02:00 \n", - "4 10 accreditations 2017-2018 2021-06-29 21:33:12.999510+02:00 \n", - "\n", - " updated_at fidelity_delay \\\n", - "0 2021-06-29 13:52:10.434850+02:00 36 \n", - "1 2021-06-29 21:33:13.000743+02:00 36 \n", - "2 2021-07-16 00:02:17.225410+02:00 36 \n", - "3 2021-06-30 01:35:18.110429+02:00 36 \n", - "4 2021-06-29 21:33:12.999510+02:00 36 \n", - "\n", - " identifier \n", - "0 c00f0c4675b91fb8b918e4079a0b1bac \n", - "1 dedd3579bc13b3ed7a90277247d9944b \n", - "2 0d348caeec0b66f9d4987dfbe30e1e8b \n", - "3 65eb39ddf8f79d28d93c2f2c53118f50 \n", - "4 732cfdcf2065fa0005faf42793ddd76c " - ] - }, - "execution_count": 299, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "event_types = display_databases(\"8event_types.csv\")\n", - "event_types.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 300, - "id": "cba0ee58-6280-45fe-99b3-0be09db5922b", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/8/8seasons.csv\n", - "Shape : (16, 6)\n" - ] - }, - { - "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", - "
idnamecreated_atupdated_atstart_date_timeidentifier
01501saison 2023-20242022-06-25 03:07:31.209270+02:002022-06-25 03:07:31.209270+02:00NaN71f5c069ce45c5e933dcc37c22507fbf
11194saison 2049-20502022-02-17 03:24:23.942691+01:002022-02-17 03:24:23.942691+01:00NaN44e20620bbc5926db2e295d38b606afd
22saison 2016-20172021-06-29 21:33:00.702563+02:002021-06-29 21:33:00.702563+02:00NaNf9cf989d4f49300220df67ef93aa2294
347saison 2018-20192021-06-30 01:35:15.156097+02:002021-06-30 01:35:15.156097+02:00NaNeec50c35fbf8593b364ced287335d90c
4100saison 2010-20112021-07-16 00:23:27.607648+02:002021-07-16 00:23:27.607648+02:00NaN7ccc51049a85e0df9b80662e45b6ddb8
\n", - "
" - ], - "text/plain": [ - " id name created_at \\\n", - "0 1501 saison 2023-2024 2022-06-25 03:07:31.209270+02:00 \n", - "1 1194 saison 2049-2050 2022-02-17 03:24:23.942691+01:00 \n", - "2 2 saison 2016-2017 2021-06-29 21:33:00.702563+02:00 \n", - "3 47 saison 2018-2019 2021-06-30 01:35:15.156097+02:00 \n", - "4 100 saison 2010-2011 2021-07-16 00:23:27.607648+02:00 \n", - "\n", - " updated_at start_date_time \\\n", - "0 2022-06-25 03:07:31.209270+02:00 NaN \n", - "1 2022-02-17 03:24:23.942691+01:00 NaN \n", - "2 2021-06-29 21:33:00.702563+02:00 NaN \n", - "3 2021-06-30 01:35:15.156097+02:00 NaN \n", - "4 2021-07-16 00:23:27.607648+02:00 NaN \n", - "\n", - " identifier \n", - "0 71f5c069ce45c5e933dcc37c22507fbf \n", - "1 44e20620bbc5926db2e295d38b606afd \n", - "2 f9cf989d4f49300220df67ef93aa2294 \n", - "3 eec50c35fbf8593b364ced287335d90c \n", - "4 7ccc51049a85e0df9b80662e45b6ddb8 " - ] - }, - "execution_count": 300, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "seasons = display_databases(\"8seasons.csv\")\n", - "seasons.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 301, - "id": "6fa82fd7-d6d3-4857-af24-ea573b1129d0", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/8/8facilities.csv\n", - "Shape : (5, 7)\n" - ] - }, - { - "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", - "
idnamecreated_atupdated_atstreet_idfixed_capacityidentifier
074plan pour campagne d'abo 2011/20122021-07-16 00:23:30.337698+02:002021-07-16 00:23:30.337698+02:001NaN2e1d25d5f7e46e23c734fe0e4951390e
13accreditation2021-06-29 21:33:13.018552+02:002021-06-29 21:33:13.018552+02:001NaNda37a04e592cbd344142730ce05a6887
24organisation match exterieur2021-06-29 21:33:13.019878+02:002021-06-29 21:33:13.019878+02:001NaN8f9ee8c2e954585f7c68096d7f1cf4f1
32parking matmut stadium2021-06-29 21:33:13.017165+02:002021-06-29 21:33:13.017165+02:001NaNaeab282982ea738674dbf5c3763a0be0
41matmut stadium2021-06-29 21:33:13.004560+02:002021-06-29 21:33:13.004560+02:001NaN89feffd283ebdabdc3b81fb62ea4f6f0
\n", - "
" - ], - "text/plain": [ - " id name created_at \\\n", - "0 74 plan pour campagne d'abo 2011/2012 2021-07-16 00:23:30.337698+02:00 \n", - "1 3 accreditation 2021-06-29 21:33:13.018552+02:00 \n", - "2 4 organisation match exterieur 2021-06-29 21:33:13.019878+02:00 \n", - "3 2 parking matmut stadium 2021-06-29 21:33:13.017165+02:00 \n", - "4 1 matmut stadium 2021-06-29 21:33:13.004560+02:00 \n", - "\n", - " updated_at street_id fixed_capacity \\\n", - "0 2021-07-16 00:23:30.337698+02:00 1 NaN \n", - "1 2021-06-29 21:33:13.018552+02:00 1 NaN \n", - "2 2021-06-29 21:33:13.019878+02:00 1 NaN \n", - "3 2021-06-29 21:33:13.017165+02:00 1 NaN \n", - "4 2021-06-29 21:33:13.004560+02:00 1 NaN \n", - "\n", - " identifier \n", - "0 2e1d25d5f7e46e23c734fe0e4951390e \n", - "1 da37a04e592cbd344142730ce05a6887 \n", - "2 8f9ee8c2e954585f7c68096d7f1cf4f1 \n", - "3 aeab282982ea738674dbf5c3763a0be0 \n", - "4 89feffd283ebdabdc3b81fb62ea4f6f0 " - ] - }, - "execution_count": 301, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "facilities = display_databases(\"8facilities.csv\")\n", - "facilities.head()" - ] - }, - { - "cell_type": "markdown", - "id": "c7467d41-0ded-465d-bb08-15be914a166b", - "metadata": {}, - "source": [ - "#### Analyze annexe databases" - ] - }, - { - "cell_type": "markdown", - "id": "17e9e334-0ae4-48d8-bed5-b50b4af49d5b", - "metadata": {}, - "source": [ - "Meaning contributions.csv, contribution_sites.csv, currencies.csv, countries.csv and type_ofs.csc" - ] - }, - { - "cell_type": "markdown", - "id": "d3ec1040-48b2-40bb-8947-920ddb4589f3", - "metadata": {}, - "source": [ - "## II. Identify Commons Datasets" - ] - }, - { - "cell_type": "markdown", - "id": "ec528a8a-df38-48e2-a1be-4a1459a80a1e", - "metadata": {}, - "source": [ - "From the analyze of the 8th company, we notice that some databases does not exist. Therefore, in order to construct a uniform database for all companies, we should first identify the common databases between all companies" - ] - }, - { - "cell_type": "code", - "execution_count": 302, - "id": "c240b811-48a6-4501-9e70-bc51d69e3ac4", + "execution_count": null, + "id": "c430185e-7995-4287-8621-95c6410be9df", "metadata": {}, "outputs": [], "source": [ - "## We first construct a dictionary reporting all the datasets for each companies\n", - "\n", - "companies = fs.ls(BUCKET)\n", - "companies_database = {}\n", - "\n", - "for company in companies:\n", - " companies_database[company.split('/')[-1]] = [file.split('/')[-1].replace(company.split('/')[-1], '') for file in fs.ls(company)] \n" + "tickets.columns" ] }, { "cell_type": "code", - "execution_count": 303, - "id": "54057367-9df9-42f4-aa07-bf524bb76462", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of databases : 30\n" - ] - } - ], - "source": [ - "# Then we create a list of all database\n", - "\n", - "all_database = companies_database[max(companies_database, key=lambda x: len(companies_database[x]))]\n", - "print(\"Number of databases : \",len(all_database))" - ] - }, - { - "cell_type": "code", - "execution_count": 304, - "id": "63914e20-9efc-4088-877b-edab5f225d00", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "30\n", - "23\n" - ] - } - ], - "source": [ - "## We then create a set of database in common for all companies\n", - "\n", - "data_in_common = set(all_database)\n", - "\n", - "print(len(data_in_common))\n", - "\n", - "for key in companies_database:\n", - " diff_database = data_in_common.symmetric_difference(companies_database[key])\n", - " data_in_common = data_in_common - diff_database\n", - "\n", - "print(len(data_in_common))\n", - " " - ] - }, - { - "cell_type": "markdown", - "id": "676d8536-7d8c-4075-a357-b8d06e501ca8", - "metadata": {}, - "source": [ - "## Create Universal database" - ] - }, - { - "cell_type": "markdown", - "id": "7e460fbe-5067-4998-a1a8-9e3d07401750", - "metadata": {}, - "source": [ - "We will first create a procedure to clean the datasets of a company and then merge them. Hence, we will be able to replicate this procedure for all companies and create a universal database.\n", - "\n", - "Let's first create our procedure for the company 1 and the datasets belongings to the theme producst" - ] - }, - { - "cell_type": "code", - "execution_count": 305, - "id": "590a132a-4f57-4ea3-a282-2ef913e4b753", + "execution_count": null, + "id": "b299c7a4-aa07-4349-bebd-b4f24bda1c8f", "metadata": {}, "outputs": [], "source": [ - "directory_path = '1'" + "customer" ] }, { "cell_type": "code", - "execution_count": 306, - "id": "0fbebfb7-a827-46b1-890b-86c9def7cdbb", + "execution_count": null, + "id": "f6630f7a-96f5-488d-9797-caacb6d6067a", "metadata": {}, "outputs": [], "source": [ - "theme_products = [\"products.csv\" ,\"categories.csv\", \"type_of_categories.csv\"]" + "print(len(tickets['customer_id']))\n", + "print(len(tickets['customer_id'].unique()))" ] }, { "cell_type": "code", - "execution_count": 307, - "id": "b8aa5f8f-845e-4ee5-b80d-38b7061a94a2", + "execution_count": null, + "id": "f4caa95a-7854-4a21-b291-28d779c4c4db", "metadata": {}, "outputs": [], "source": [ - "def remove_horodates(df):\n", - " \"\"\"\n", - " this function remove horodate columns like created_at and updated_at\n", - " \"\"\"\n", - " df = df.drop(columns = [\"created_at\", \"updated_at\"])\n", - " return df" + "has_purchased = customer.groupby('number_company').agg({\n", + " 'has_purchased_target_period' : 'sum',\n", + " 'customer_id' : 'nunique'})\n", + "has_purchased" ] }, { "cell_type": "code", - "execution_count": 308, - "id": "2c478213-09ae-44ef-8c7c-125bcb571642", - "metadata": {}, - "outputs": [], - "source": [ - "def order_columns_id(df):\n", - " \"\"\"\n", - " this function puts all id columns at the beginning in order to read the dataset easier\n", - " \"\"\"\n", - " substring = 'id'\n", - " id_columns = [col for col in df.columns if substring in col]\n", - " remaining_col = [col for col in df.columns if substring not in col]\n", - " new_order = id_columns + remaining_col\n", - " return df[new_order]" - ] - }, - { - "cell_type": "code", - "execution_count": 309, - "id": "327e44b0-eb99-4022-b4ca-79548072f0f0", - "metadata": {}, - "outputs": [], - "source": [ - "def percent_na(df):\n", - " \"\"\"\n", - " this function returns the percentage of na for each column\n", - " \"\"\"\n", - " percent_missing = df.isna().sum() * 100 / len(df)\n", - " return percent_missing" - ] - }, - { - "cell_type": "code", - "execution_count": 310, - "id": "10926def-267f-4e86-b2c9-72e27ff9a9df", - "metadata": {}, - "outputs": [], - "source": [ - "def process_df(df):\n", - " df = remove_horodates(df)\n", - " print(\"Number of columns : \", len(df.columns))\n", - " df = order_columns_id(df)\n", - " print(\"Columns : \", df.columns)\n", - " print(\"Percent of NA for each column : \", percent_na(df))\n", - " return df" - ] - }, - { - "cell_type": "markdown", - "id": "98ac02cb-5295-47ca-99c6-99e622c5f388", - "metadata": {}, - "source": [ - "#### Deep analysis of products.csv" - ] - }, - { - "cell_type": "code", - "execution_count": 311, - "id": "862a7658-0602-4d94-bb58-d23774c00d32", + "execution_count": 35, + "id": "24fda291-764a-4a6f-9cdf-86da49b978e2", "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/1/1products.csv\n", - "Shape : (94803, 14)\n", - "Number of columns : 14\n" - ] + "data": { + "image/png": "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goIC+Pj4QK1WIzY2VppXWFiIw4cPIyQkBADQrVs3WFtb67VJTU3FmTNnpDbBwcHQaDQ4fvy41ObYsWPQaDRSm4oolUrpdgClDyJqOMr2DpViLxGRPFmZcuVvvfUWBg4cCE9PT+Tk5CA6OhqHDh1CTEwMFAoFIiIisGTJErRp0wZt2rTBkiVLYG9vj+HDhwMAVCoVxowZgxkzZsDFxQXOzs6YOXMm/P390adPHwBA+/btMWDAAIwdOxZr164FAIwbNw5hYWHw9fU12bYTkemU9g4poIBA+Z4gBRRYeXolQjxCHnmKnogaBpMGovT0dISHhyM1NRUqlQqdOnVCTEwM+vbtCwCYPXs28vPzMXHiRGRlZSEwMBD79u2Do6OjtIyPP/4YVlZWGDp0KPLz89G7d29s2LABlpaWUputW7di6tSp0tVogwcPxqpVq+p2Y4nIbBTpipCWl1ZhGAIAAYG0vDQU6YpgY2lTx9URkSkoBE+UV4lWq4VKpYJGo+HpM6IGIC0vDXfv3610vrOtM9QO6jqsiIhqQ1WP3ybtISIiMhW1g5qBh4gkZjeomoiIiKiuMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7DEQERERkewxEBEREZHsMRARERGR7Jk0EEVFReHxxx+Ho6MjXF1d8eyzz+LixYt6bUaNGgWFQqH3CAoK0mtTUFCAKVOmoGnTpnBwcMDgwYNx8+ZNvTZZWVkIDw+HSqWCSqVCeHg4srOza3sTiYiIqB4waSA6fPgwJk2ahMTERMTGxqK4uBj9+vVDXl6eXrsBAwYgNTVVeuzevVtvfkREBLZv347o6GjExcUhNzcXYWFhKCkpkdoMHz4cSUlJiImJQUxMDJKSkhAeHl4n20lERETmTSGEEKYuotSdO3fg6uqKw4cP46mnngLwdw9RdnY2duzYUeFrNBoNmjVrhs2bN2PYsGEAgNu3b8PT0xO7d+9G//79cf78eXTo0AGJiYkIDAwEACQmJiI4OBgXLlyAr6/vI2vTarVQqVTQaDRwcnIyzgYTERFRrarq8dusxhBpNBoAgLOzs970Q4cOwdXVFW3btsXYsWORkZEhzTt58iSKiorQr18/aZqHhwf8/PwQHx8PAEhISIBKpZLCEAAEBQVBpVJJbYiIiEi+rExdQCkhBKZPn44nn3wSfn5+0vSBAwfixRdfhLe3N65du4YFCxagV69eOHnyJJRKJdLS0mBjY4MmTZroLc/NzQ1paWkAgLS0NLi6upZbp6urq9SmrIKCAhQUFEjPtVqtMTaTiIiIzJDZBKLJkyfj999/R1xcnN700tNgAODn54eAgAB4e3vjp59+wpAhQypdnhACCoVCev7g/ytr86CoqCgsXLiwuptBRERE9ZBZnDKbMmUKdu7ciYMHD6JFixYPbevu7g5vb29cvnwZAKBWq1FYWIisrCy9dhkZGXBzc5PapKenl1vWnTt3pDZlzZs3DxqNRnqkpKQYsmlERERUD5g0EAkhMHnyZGzbtg0///wzfHx8HvmazMxMpKSkwN3dHQDQrVs3WFtbIzY2VmqTmpqKM2fOICQkBAAQHBwMjUaD48ePS22OHTsGjUYjtSlLqVTCyclJ70FEREQNk0mvMps4cSK+/vpr/PDDD3pXeqlUKtjZ2SE3NxeRkZF4/vnn4e7ujuvXr+Ott95CcnIyzp8/D0dHRwDAhAkT8OOPP2LDhg1wdnbGzJkzkZmZiZMnT8LS0hLA32ORbt++jbVr1wIAxo0bB29vb+zatatKtfIqMyIiovqnqsdvkwaiysbvrF+/HqNGjUJ+fj6effZZnD59GtnZ2XB3d0fPnj3x3nvvwdPTU2p///59zJo1C19//TXy8/PRu3dvrF69Wq/N3bt3MXXqVOzcuRMAMHjwYKxatQqNGzeuUq0MRERERPVPvQhE9QkDERERUf1TL+9DRERERGQKDEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsMRERERCR7DEREREQkewxEREREJHsmDURRUVF4/PHH4ejoCFdXVzz77LO4ePGiXhshBCIjI+Hh4QE7Ozv06NEDZ8+e1WtTUFCAKVOmoGnTpnBwcMDgwYNx8+ZNvTZZWVkIDw+HSqWCSqVCeHg4srOza3sTiYiIqB4waSA6fPgwJk2ahMTERMTGxqK4uBj9+vVDXl6e1GbZsmVYvnw5Vq1ahRMnTkCtVqNv377IycmR2kRERGD79u2Ijo5GXFwccnNzERYWhpKSEqnN8OHDkZSUhJiYGMTExCApKQnh4eF1ur1ERERkpoQZycjIEADE4cOHhRBC6HQ6oVarxdKlS6U29+/fFyqVSqxZs0YIIUR2drawtrYW0dHRUptbt24JCwsLERMTI4QQ4ty5cwKASExMlNokJCQIAOLChQtVqk2j0QgAQqPR1Hg7iYiIqG5U9fhtVmOINBoNAMDZ2RkAcO3aNaSlpaFfv35SG6VSidDQUMTHxwMATp48iaKiIr02Hh4e8PPzk9okJCRApVIhMDBQahMUFASVSiW1ISIiIvmyMnUBpYQQmD59Op588kn4+fkBANLS0gAAbm5uem3d3Nxw48YNqY2NjQ2aNGlSrk3p69PS0uDq6lpuna6urlKbsgoKClBQUCA912q1Bm4ZERERmTuz6SGaPHkyfv/9d3zzzTfl5ikUCr3nQohy08oq26ai9g9bTlRUlDQAW6VSwdPTsyqbQURERPWQWQSiKVOmYOfOnTh48CBatGghTVer1QBQrhcnIyND6jVSq9UoLCxEVlbWQ9ukp6eXW++dO3fK9T6VmjdvHjQajfRISUkxfAOJiIjIrJk0EAkhMHnyZGzbtg0///wzfHx89Ob7+PhArVYjNjZWmlZYWIjDhw8jJCQEANCtWzdYW1vrtUlNTcWZM2ekNsHB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RL3BzYmJidL7evToUXh7e2P+/PnS/KoMEK/I66+/jo8//hi3bt1Cnz599Hq8iIiBiIiqyc7ODkFBQVi6dClatmyJv/76C2+//bbRlp+SkoLp06fjjTfewKlTp7By5UqpR6Rt27Z45ZVXMGLECHz00Ufo2rUr/vrrL/z888/w9/fH008/bdA6IyMjMX78eLi6umLgwIHIycnB0aNHMWXKFPTp0wedOnXCK6+8ghUrVqC4uBgTJ05EaGgoAgICary9//nPfxAQEIAnn3wSW7duxfHjx/Hll18CAB577DEkJycjOjoajz/+OH766Sds377doPW88sormDlzJj7//HNs2rSpxnUTNTS87J6Iqu2rr75CUVERAgIC8Oabb2LRokVGW/aIESOQn5+PJ554ApMmTcKUKVMwbtw4af769esxYsQIzJgxA76+vhg8eDCOHTtWox6PkSNHYsWKFVi9ejU6duyIsLAwXL58GcDfp5927NiBJk2a4KmnnkKfPn3QqlUrfPvttzXeVgBYuHAhoqOj0alTJ2zcuBFbt25Fhw4dAADPPPMMpk2bhsmTJ6NLly6Ij4/HggULDFqPk5MTnn/+eTRq1AjPPvusUWonakgU4sGBAEREVGcUCgW2b99eZwGlb9++aN++PT799NM6WR9RfcJTZkREDdzdu3exb98+/Pzzz1i1apWpyyEySwxERNTgPXgFWll79uwx2gBtc/WPf/wDWVlZeP/99+Hr62vqcojMEk+ZEVGD9+eff1Y6r3nz5o+89J6IGj4GIiIiIpI9XmVGREREssdARERERLLHQERERESyx0BEREREssdARERERLLHQERERESyx0BEREREssdARERERLL3/wE/bFzBgYBosAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" }, { - "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", - "
idamountis_full_pricerepresentation_idpricing_formula_idcreated_atupdated_atcategory_idapply_priceproducts_group_idproduct_pack_idextra_fieldamount_consumptionidentifier
0106829.0False9141142020-09-03 14:09:43.119798+02:002020-09-03 14:09:43.119798+02:00410.0106551NaNNaN35c88f2db8a63d7474e46eb8ca9260e7
14789.5False2731312020-09-03 13:21:22.711773+02:002020-09-03 13:21:22.711773+02:0010.04711NaNNaN8a179671ab198e570e6a104c4451379f
22087311.5False2751372020-09-03 14:46:33.589030+02:002020-09-03 14:46:33.589030+02:0010.0208251NaNNaNee83779ce29e67ad251e40234b426d6a
31571428.0False8251992022-01-28 19:29:23.525722+01:002022-01-28 19:29:23.525722+01:0050.01567731NaNNaNd865383579314b791aa4bcf3fb418f17
413418.5False9932020-09-03 13:29:30.773089+02:002020-09-03 13:29:30.773089+02:0010.011751NaNNaNf1c4689bc47dee6f60b56d74b593dd46
\n", - "
" - ], - "text/plain": [ - " id amount is_full_price representation_id pricing_formula_id \\\n", - "0 10682 9.0 False 914 114 \n", - "1 478 9.5 False 273 131 \n", - "2 20873 11.5 False 275 137 \n", - "3 157142 8.0 False 82519 9 \n", - "4 1341 8.5 False 9 93 \n", - "\n", - " created_at updated_at \\\n", - "0 2020-09-03 14:09:43.119798+02:00 2020-09-03 14:09:43.119798+02:00 \n", - "1 2020-09-03 13:21:22.711773+02:00 2020-09-03 13:21:22.711773+02:00 \n", - "2 2020-09-03 14:46:33.589030+02:00 2020-09-03 14:46:33.589030+02:00 \n", - "3 2022-01-28 19:29:23.525722+01:00 2022-01-28 19:29:23.525722+01:00 \n", - "4 2020-09-03 13:29:30.773089+02:00 2020-09-03 13:29:30.773089+02:00 \n", - "\n", - " category_id apply_price products_group_id product_pack_id extra_field \\\n", - "0 41 0.0 10655 1 NaN \n", - "1 1 0.0 471 1 NaN \n", - "2 1 0.0 20825 1 NaN \n", - "3 5 0.0 156773 1 NaN \n", - "4 1 0.0 1175 1 NaN \n", - "\n", - " amount_consumption identifier \n", - "0 NaN 35c88f2db8a63d7474e46eb8ca9260e7 \n", - "1 NaN 8a179671ab198e570e6a104c4451379f \n", - "2 NaN ee83779ce29e67ad251e40234b426d6a \n", - "3 NaN d865383579314b791aa4bcf3fb418f17 \n", - "4 NaN f1c4689bc47dee6f60b56d74b593dd46 " - ] - }, - "execution_count": 311, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "products = display_databases(\"1products.csv\")\n", - "print(\"Number of columns : \", len(products.columns))\n", - "products.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 312, - "id": "f0db8c51-2792-4d49-9b1a-d98ce0d9ea28", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of columns : 12\n", - "Columns : Index(['id', 'representation_id', 'pricing_formula_id', 'category_id',\n", - " 'products_group_id', 'product_pack_id', 'identifier', 'amount',\n", - " 'is_full_price', 'apply_price', 'extra_field', 'amount_consumption'],\n", - " dtype='object')\n" - ] - }, - { - "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", - "
idrepresentation_idpricing_formula_idcategory_idproducts_group_idproduct_pack_ididentifieramountis_full_priceapply_priceextra_fieldamount_consumption
0106829141144110655135c88f2db8a63d7474e46eb8ca9260e79.0False0.0NaNNaN
1478273131147118a179671ab198e570e6a104c4451379f9.5False0.0NaNNaN
2208732751371208251ee83779ce29e67ad251e40234b426d6a11.5False0.0NaNNaN
315714282519951567731d865383579314b791aa4bcf3fb418f178.0False0.0NaNNaN
41341993111751f1c4689bc47dee6f60b56d74b593dd468.5False0.0NaNNaN
\n", - "
" - ], - "text/plain": [ - " id representation_id pricing_formula_id category_id \\\n", - "0 10682 914 114 41 \n", - "1 478 273 131 1 \n", - "2 20873 275 137 1 \n", - "3 157142 82519 9 5 \n", - "4 1341 9 93 1 \n", - "\n", - " products_group_id product_pack_id identifier \\\n", - "0 10655 1 35c88f2db8a63d7474e46eb8ca9260e7 \n", - "1 471 1 8a179671ab198e570e6a104c4451379f \n", - "2 20825 1 ee83779ce29e67ad251e40234b426d6a \n", - "3 156773 1 d865383579314b791aa4bcf3fb418f17 \n", - "4 1175 1 f1c4689bc47dee6f60b56d74b593dd46 \n", - "\n", - " amount is_full_price apply_price extra_field amount_consumption \n", - "0 9.0 False 0.0 NaN NaN \n", - "1 9.5 False 0.0 NaN NaN \n", - "2 11.5 False 0.0 NaN NaN \n", - "3 8.0 False 0.0 NaN NaN \n", - "4 8.5 False 0.0 NaN NaN " - ] - }, - "execution_count": 312, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "products = remove_horodates(products)\n", - "print(\"Number of columns : \", len(products.columns))\n", - "products = order_columns_id(products)\n", - "print(\"Columns : \", products.columns)\n", - "products.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 313, - "id": "a383474f-7da9-422c-bb69-3f0cc0b7053f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id int64\n", - "representation_id int64\n", - "pricing_formula_id int64\n", - "category_id int64\n", - "products_group_id int64\n", - "product_pack_id int64\n", - "identifier object\n", - "amount float64\n", - "is_full_price bool\n", - "apply_price float64\n", - "extra_field float64\n", - "amount_consumption float64\n", - "dtype: object\n" - ] - } - ], - "source": [ - "print(products.dtypes)" - ] - }, - { - "cell_type": "code", - "execution_count": 314, - "id": "460749ac-aa26-4216-8667-518546f72f72", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "id 0.0\n", - "representation_id 0.0\n", - "pricing_formula_id 0.0\n", - "category_id 0.0\n", - "products_group_id 0.0\n", - "product_pack_id 0.0\n", - "identifier 0.0\n", - "amount 0.0\n", - "is_full_price 0.0\n", - "apply_price 0.0\n", - "extra_field 100.0\n", - "amount_consumption 100.0\n", - "dtype: float64\n" - ] - } - ], - "source": [ - "percent_missing = products.isna().sum() * 100 / len(products)\n", - "print(percent_missing)" - ] - }, - { - "cell_type": "markdown", - "id": "ebcb48ab-adad-42e5-b5d7-7275771cd200", - "metadata": {}, - "source": [ - "#### Deep analysis of categories.csv" - ] - }, - { - "cell_type": "code", - "execution_count": 315, - "id": "3efce2b6-2d2f-4da9-98ed-1aae17da624c", - "metadata": {}, - "outputs": [], - "source": [ - "name_dataset = '1categories.csv'" - ] - }, - { - "cell_type": "code", - "execution_count": 316, - "id": "38aa39fd-58af-4fb8-98f2-4269dbaf35de", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/1/1categories.csv\n", - "Shape : (27, 7)\n", - "Number of columns : 7\n" - ] - }, - { - "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", - "
idnamecreated_atupdated_atextra_fieldquotaidentifier
030en nb entrées gr2020-09-03 13:21:20.019202+02:002020-09-03 13:21:20.019202+02:00NaNNaN849ab2791a14f5fc2bb4d87ab2b78bf6
116indiv activité enfant2020-09-03 13:11:23.306968+02:002020-09-03 13:11:23.306968+02:00NaNNaN425fd2f01984cc4ba030c1be98f42c33
239indiv activité gr2020-09-03 13:21:20.029901+02:002020-09-03 13:21:20.029901+02:00NaNNaN9244dd3738788db0d22a5d0afe687b69
31108groupe forfait adulte2020-09-19 02:06:43.145697+02:002020-09-19 02:06:43.145697+02:00NaNNaN3edda20c877a93b5ff883827238eb711
46groupe forfait entrées tr2020-09-03 13:11:23.264997+02:002020-09-03 13:11:23.264997+02:00NaNNaNff48df4b2dd5a14116bf4d280b31621e
\n", - "
" - ], - "text/plain": [ - " id name created_at \\\n", - "0 30 en nb entrées gr 2020-09-03 13:21:20.019202+02:00 \n", - "1 16 indiv activité enfant 2020-09-03 13:11:23.306968+02:00 \n", - "2 39 indiv activité gr 2020-09-03 13:21:20.029901+02:00 \n", - "3 1108 groupe forfait adulte 2020-09-19 02:06:43.145697+02:00 \n", - "4 6 groupe forfait entrées tr 2020-09-03 13:11:23.264997+02:00 \n", - "\n", - " updated_at extra_field quota \\\n", - "0 2020-09-03 13:21:20.019202+02:00 NaN NaN \n", - "1 2020-09-03 13:11:23.306968+02:00 NaN NaN \n", - "2 2020-09-03 13:21:20.029901+02:00 NaN NaN \n", - "3 2020-09-19 02:06:43.145697+02:00 NaN NaN \n", - "4 2020-09-03 13:11:23.264997+02:00 NaN NaN \n", - "\n", - " identifier \n", - "0 849ab2791a14f5fc2bb4d87ab2b78bf6 \n", - "1 425fd2f01984cc4ba030c1be98f42c33 \n", - "2 9244dd3738788db0d22a5d0afe687b69 \n", - "3 3edda20c877a93b5ff883827238eb711 \n", - "4 ff48df4b2dd5a14116bf4d280b31621e " - ] - }, - "execution_count": 316, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = display_databases(name_dataset)\n", - "print(\"Number of columns : \", len(df.columns))\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 317, - "id": "99eb6d14-8b4b-4d55-8fc7-ddf2726096f4", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of columns : 5\n", - "Columns : Index(['id', 'identifier', 'name', 'extra_field', 'quota'], dtype='object')\n", - "Percent of NA for each column : id 0.000000\n", - "identifier 0.000000\n", - "name 3.703704\n", - "extra_field 100.000000\n", - "quota 100.000000\n", - "dtype: float64\n" - ] - }, - { - "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", - "
ididentifiernameextra_fieldquota
030849ab2791a14f5fc2bb4d87ab2b78bf6en nb entrées grNaNNaN
116425fd2f01984cc4ba030c1be98f42c33indiv activité enfantNaNNaN
2399244dd3738788db0d22a5d0afe687b69indiv activité grNaNNaN
311083edda20c877a93b5ff883827238eb711groupe forfait adulteNaNNaN
46ff48df4b2dd5a14116bf4d280b31621egroupe forfait entrées trNaNNaN
\n", - "
" - ], - "text/plain": [ - " id identifier name \\\n", - "0 30 849ab2791a14f5fc2bb4d87ab2b78bf6 en nb entrées gr \n", - "1 16 425fd2f01984cc4ba030c1be98f42c33 indiv activité enfant \n", - "2 39 9244dd3738788db0d22a5d0afe687b69 indiv activité gr \n", - "3 1108 3edda20c877a93b5ff883827238eb711 groupe forfait adulte \n", - "4 6 ff48df4b2dd5a14116bf4d280b31621e groupe forfait entrées tr \n", - "\n", - " extra_field quota \n", - "0 NaN NaN \n", - "1 NaN NaN \n", - "2 NaN NaN \n", - "3 NaN NaN \n", - "4 NaN NaN " - ] - }, - "execution_count": 317, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = process_df(df)\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 318, - "id": "c5f39cc9-dff8-452c-9a3e-9f7df81a8a19", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "id int64\n", - "identifier object\n", - "name object\n", - "extra_field float64\n", - "quota float64\n", - "dtype: object" - ] - }, - "execution_count": 318, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.dtypes" - ] - }, - { - "cell_type": "markdown", - "id": "c4cb0b37-2262-45c0-97be-b12c503016e3", - "metadata": {}, - "source": [ - "#### Deep analysis of type_of_categories.csv" - ] - }, - { - "cell_type": "markdown", - "id": "3b4a3af9-ed12-43ec-b17e-fd425b238265", - "metadata": {}, - "source": [ - "#### Deep analysis of representation_category_capacities.csv" - ] - }, - { - "cell_type": "markdown", - "id": "135966fb-aab1-48d7-bb4c-39a53ee643ca", - "metadata": {}, - "source": [ - "#### Deep analysis of representations.csv" - ] - }, - { - "cell_type": "markdown", - "id": "b480f39f-d5c7-4ded-8f64-ea8ac31f5db5", - "metadata": {}, - "source": [ - "#### Deep analysis of events.csv" - ] - }, - { - "cell_type": "code", - "execution_count": 319, - "id": "2d52d6da-cca5-4abd-be05-2f00fd3eca8e", - "metadata": {}, - "outputs": [], - "source": [ - "name_dataset = '1events.csv'" - ] - }, - { - "cell_type": "code", - "execution_count": 320, - "id": "6cab507d-8b11-404d-9286-5cc205228af9", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/1/1events.csv\n", - "Shape : (1232, 12)\n", - "Number of columns : 12\n" - ] - }, - { - "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", - "
idcreated_atupdated_atseason_idfacility_idnameevent_type_idmanual_addedis_displayevent_type_key_idfacility_key_ididentifier
01922020-09-03 13:36:42.216991+02:002021-11-02 15:06:40.663219+01:00161frontières4FalseTrue41c1cecd093146068fd57896e254e98170
1303292023-11-04 02:50:34.602462+01:002023-11-04 02:52:26.138154+01:0027671visite guidée une autre histoire du monde (1h00)5FalseTrue51f510a6710878d7aca36e71c54abab525
21612020-09-03 13:29:27.944002+02:002021-11-02 15:06:40.652026+01:00161visite contée les chercheurs d'or indiv2FalseTrue2121177fa9acad1ae2b1f595690fb853d3
359572021-07-31 11:16:42.575583+02:002021-11-02 15:06:40.663219+01:005821we dreamt of utopia and we woke up screaming.4FalseTrue41962601f1eb153d45d49437f8fe839f7f
483372021-08-17 13:40:34.111923+02:002021-11-02 15:06:40.663219+01:005821jeff koons épisodes 44FalseTrue41bfa22f5a2364a2dacfc45cca1c8d3215
\n", - "
" - ], - "text/plain": [ - " id created_at updated_at \\\n", - "0 192 2020-09-03 13:36:42.216991+02:00 2021-11-02 15:06:40.663219+01:00 \n", - "1 30329 2023-11-04 02:50:34.602462+01:00 2023-11-04 02:52:26.138154+01:00 \n", - "2 161 2020-09-03 13:29:27.944002+02:00 2021-11-02 15:06:40.652026+01:00 \n", - "3 5957 2021-07-31 11:16:42.575583+02:00 2021-11-02 15:06:40.663219+01:00 \n", - "4 8337 2021-08-17 13:40:34.111923+02:00 2021-11-02 15:06:40.663219+01:00 \n", - "\n", - " season_id facility_id name \\\n", - "0 16 1 frontières \n", - "1 2767 1 visite guidée une autre histoire du monde (1h00) \n", - "2 16 1 visite contée les chercheurs d'or indiv \n", - "3 582 1 we dreamt of utopia and we woke up screaming. \n", - "4 582 1 jeff koons épisodes 4 \n", - "\n", - " event_type_id manual_added is_display event_type_key_id \\\n", - "0 4 False True 4 \n", - "1 5 False True 5 \n", - "2 2 False True 2 \n", - "3 4 False True 4 \n", - "4 4 False True 4 \n", - "\n", - " facility_key_id identifier \n", - "0 1 c1cecd093146068fd57896e254e98170 \n", - "1 1 f510a6710878d7aca36e71c54abab525 \n", - "2 1 21177fa9acad1ae2b1f595690fb853d3 \n", - "3 1 962601f1eb153d45d49437f8fe839f7f \n", - "4 1 bfa22f5a2364a2dacfc45cca1c8d3215 " - ] - }, - "execution_count": 320, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = display_databases(name_dataset)\n", - "print(\"Number of columns : \", len(df.columns))\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 321, - "id": "9fe57873-8108-44c9-b8a5-f58d3cbb6d17", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of columns : 10\n", - "Columns : Index(['id', 'season_id', 'facility_id', 'event_type_id', 'event_type_key_id',\n", - " 'facility_key_id', 'identifier', 'name', 'manual_added', 'is_display'],\n", - " dtype='object')\n", - "Percent of NA for each column : id 0.000000\n", - "season_id 0.000000\n", - "facility_id 0.000000\n", - "event_type_id 0.000000\n", - "event_type_key_id 0.000000\n", - "facility_key_id 0.000000\n", - "identifier 0.000000\n", - "name 0.974026\n", - "manual_added 0.000000\n", - "is_display 0.000000\n", - "dtype: float64\n" - ] - }, - { - "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", - "
idseason_idfacility_idevent_type_idevent_type_key_idfacility_key_ididentifiernamemanual_addedis_display
0192161441c1cecd093146068fd57896e254e98170frontièresFalseTrue
13032927671551f510a6710878d7aca36e71c54abab525visite guidée une autre histoire du monde (1h00)FalseTrue
216116122121177fa9acad1ae2b1f595690fb853d3visite contée les chercheurs d'or indivFalseTrue
359575821441962601f1eb153d45d49437f8fe839f7fwe dreamt of utopia and we woke up screaming.FalseTrue
483375821441bfa22f5a2364a2dacfc45cca1c8d3215jeff koons épisodes 4FalseTrue
\n", - "
" - ], - "text/plain": [ - " id season_id facility_id event_type_id event_type_key_id \\\n", - "0 192 16 1 4 4 \n", - "1 30329 2767 1 5 5 \n", - "2 161 16 1 2 2 \n", - "3 5957 582 1 4 4 \n", - "4 8337 582 1 4 4 \n", - "\n", - " facility_key_id identifier \\\n", - "0 1 c1cecd093146068fd57896e254e98170 \n", - "1 1 f510a6710878d7aca36e71c54abab525 \n", - "2 1 21177fa9acad1ae2b1f595690fb853d3 \n", - "3 1 962601f1eb153d45d49437f8fe839f7f \n", - "4 1 bfa22f5a2364a2dacfc45cca1c8d3215 \n", - "\n", - " name manual_added is_display \n", - "0 frontières False True \n", - "1 visite guidée une autre histoire du monde (1h00) False True \n", - "2 visite contée les chercheurs d'or indiv False True \n", - "3 we dreamt of utopia and we woke up screaming. False True \n", - "4 jeff koons épisodes 4 False True " - ] - }, - "execution_count": 321, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = process_df(df)\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 322, - "id": "7fd9e5bd-baac-4b3b-9ffb-5a9baa18399b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "id int64\n", - "season_id int64\n", - "facility_id int64\n", - "event_type_id int64\n", - "event_type_key_id int64\n", - "facility_key_id int64\n", - "identifier object\n", - "name object\n", - "manual_added bool\n", - "is_display bool\n", - "dtype: object" - ] - }, - "execution_count": 322, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.dtypes" - ] - }, - { - "cell_type": "markdown", - "id": "24186efa-5908-4b03-bf52-96415fc8bd54", - "metadata": {}, - "source": [ - "#### Deep analysis of event_types.csv" - ] - }, - { - "cell_type": "code", - "execution_count": 323, - "id": "90ab62d4-a086-4469-961c-67eefb375388", - "metadata": {}, - "outputs": [], - "source": [ - "name_dataset = '1event_types.csv'" - ] - }, - { - "cell_type": "code", - "execution_count": 324, - "id": "58db1751-fd56-4c28-b49e-bc8235bb0dc8", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/1/1event_types.csv\n", - "Shape : (9, 6)\n", - "Number of columns : 6\n" - ] - }, - { - "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", - "
idnamecreated_atupdated_atfidelity_delayidentifier
01standard2020-09-03 12:24:22.574262+02:002020-09-03 12:24:22.574262+02:0036c00f0c4675b91fb8b918e4079a0b1bac
166package2020-09-03 14:05:04.648137+02:002020-09-03 14:05:04.648137+02:0036efe90a8e604a7c840e88d03a67f6b7d8
283guide multimédias2020-09-03 14:15:17.252539+02:002020-09-03 14:15:17.252539+02:0036ee14c62b3b9f6c7dd5401685a18e4460
33non défini2020-09-03 13:11:23.117024+02:002020-09-03 13:11:23.117024+02:003652ff3466787b4d538407372e5f7afe0f
42723NaN2021-12-22 09:45:47.715105+01:002021-12-22 09:45:47.715105+01:0036d41d8cd98f00b204e9800998ecf8427e
\n", - "
" - ], - "text/plain": [ - " id name created_at \\\n", - "0 1 standard 2020-09-03 12:24:22.574262+02:00 \n", - "1 66 package 2020-09-03 14:05:04.648137+02:00 \n", - "2 83 guide multimédias 2020-09-03 14:15:17.252539+02:00 \n", - "3 3 non défini 2020-09-03 13:11:23.117024+02:00 \n", - "4 2723 NaN 2021-12-22 09:45:47.715105+01:00 \n", - "\n", - " updated_at fidelity_delay \\\n", - "0 2020-09-03 12:24:22.574262+02:00 36 \n", - "1 2020-09-03 14:05:04.648137+02:00 36 \n", - "2 2020-09-03 14:15:17.252539+02:00 36 \n", - "3 2020-09-03 13:11:23.117024+02:00 36 \n", - "4 2021-12-22 09:45:47.715105+01:00 36 \n", - "\n", - " identifier \n", - "0 c00f0c4675b91fb8b918e4079a0b1bac \n", - "1 efe90a8e604a7c840e88d03a67f6b7d8 \n", - "2 ee14c62b3b9f6c7dd5401685a18e4460 \n", - "3 52ff3466787b4d538407372e5f7afe0f \n", - "4 d41d8cd98f00b204e9800998ecf8427e " - ] - }, - "execution_count": 324, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = display_databases(name_dataset)\n", - "print(\"Number of columns : \", len(df.columns))\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 325, - "id": "ac93382c-0b5f-462d-8021-0dd1e7201b8c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of columns : 4\n", - "Columns : Index(['id', 'fidelity_delay', 'identifier', 'name'], dtype='object')\n", - "Percent of NA for each column : id 0.000000\n", - "fidelity_delay 0.000000\n", - "identifier 0.000000\n", - "name 11.111111\n", - "dtype: float64\n" - ] - }, - { - "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", - "
idfidelity_delayidentifiername
0136c00f0c4675b91fb8b918e4079a0b1bacstandard
16636efe90a8e604a7c840e88d03a67f6b7d8package
28336ee14c62b3b9f6c7dd5401685a18e4460guide multimédias
333652ff3466787b4d538407372e5f7afe0fnon défini
4272336d41d8cd98f00b204e9800998ecf8427eNaN
\n", - "
" - ], - "text/plain": [ - " id fidelity_delay identifier name\n", - "0 1 36 c00f0c4675b91fb8b918e4079a0b1bac standard\n", - "1 66 36 efe90a8e604a7c840e88d03a67f6b7d8 package\n", - "2 83 36 ee14c62b3b9f6c7dd5401685a18e4460 guide multimédias\n", - "3 3 36 52ff3466787b4d538407372e5f7afe0f non défini\n", - "4 2723 36 d41d8cd98f00b204e9800998ecf8427e NaN" - ] - }, - "execution_count": 325, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = process_df(df)\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 326, - "id": "18cbd630-3c7d-49e1-932b-9460badf3758", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "id int64\n", - "fidelity_delay int64\n", - "identifier object\n", - "name object\n", - "dtype: object" - ] - }, - "execution_count": 326, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.dtypes" - ] - }, - { - "cell_type": "markdown", - "id": "5847a441-31b9-4802-a5ae-90d8c6d6e153", - "metadata": {}, - "source": [ - "#### Deep analysis of seasons.csv" - ] - }, - { - "cell_type": "code", - "execution_count": 327, - "id": "ae544dcc-f23d-4216-bb5b-597cc1b3765e", - "metadata": {}, - "outputs": [], - "source": [ - "name_dataset = '1seasons.csv'" - ] - }, - { - "cell_type": "code", - "execution_count": 328, - "id": "1ac97963-9208-4329-be41-d71a5797487f", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/1/1seasons.csv\n", - "Shape : (13, 6)\n", - "Number of columns : 6\n" - ] - }, - { - "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", - "
idnamecreated_atupdated_atstart_date_timeidentifier
094320132021-07-29 08:55:33.282607+02:002021-07-29 08:55:33.282607+02:00NaN8038da89e49ac5eabb489cfc6cea9fc1
112920142020-09-03 15:13:08.105567+02:002020-09-03 15:13:08.105567+02:00NaNcee8d6b7ce52554fd70354e37bbf44a2
2320152020-09-03 13:11:19.405037+02:002020-09-03 13:11:19.405037+02:00NaN65d2ea03425887a717c435081cfc5dbb
3220162020-09-03 13:11:19.401001+02:002020-09-03 13:11:19.401001+02:00NaN95192c98732387165bf8e396c0f2dad2
4420172020-09-03 13:11:19.409005+02:002020-09-03 13:11:19.409005+02:00NaN8d8818c8e140c64c743113f563cf750f
\n", - "
" - ], - "text/plain": [ - " id name created_at \\\n", - "0 943 2013 2021-07-29 08:55:33.282607+02:00 \n", - "1 129 2014 2020-09-03 15:13:08.105567+02:00 \n", - "2 3 2015 2020-09-03 13:11:19.405037+02:00 \n", - "3 2 2016 2020-09-03 13:11:19.401001+02:00 \n", - "4 4 2017 2020-09-03 13:11:19.409005+02:00 \n", - "\n", - " updated_at start_date_time \\\n", - "0 2021-07-29 08:55:33.282607+02:00 NaN \n", - "1 2020-09-03 15:13:08.105567+02:00 NaN \n", - "2 2020-09-03 13:11:19.405037+02:00 NaN \n", - "3 2020-09-03 13:11:19.401001+02:00 NaN \n", - "4 2020-09-03 13:11:19.409005+02:00 NaN \n", - "\n", - " identifier \n", - "0 8038da89e49ac5eabb489cfc6cea9fc1 \n", - "1 cee8d6b7ce52554fd70354e37bbf44a2 \n", - "2 65d2ea03425887a717c435081cfc5dbb \n", - "3 95192c98732387165bf8e396c0f2dad2 \n", - "4 8d8818c8e140c64c743113f563cf750f " - ] - }, - "execution_count": 328, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = display_databases(name_dataset)\n", - "print(\"Number of columns : \", len(df.columns))\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 329, - "id": "b4593d46-105c-47dd-aa71-babd8e63e65b", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of columns : 4\n", - "Columns : Index(['id', 'identifier', 'name', 'start_date_time'], dtype='object')\n", - "Percent of NA for each column : id 0.000000\n", - "identifier 0.000000\n", - "name 7.692308\n", - "start_date_time 100.000000\n", - "dtype: float64\n" - ] - }, - { - "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", - "
ididentifiernamestart_date_time
09438038da89e49ac5eabb489cfc6cea9fc12013NaN
1129cee8d6b7ce52554fd70354e37bbf44a22014NaN
2365d2ea03425887a717c435081cfc5dbb2015NaN
3295192c98732387165bf8e396c0f2dad22016NaN
448d8818c8e140c64c743113f563cf750f2017NaN
\n", - "
" - ], - "text/plain": [ - " id identifier name start_date_time\n", - "0 943 8038da89e49ac5eabb489cfc6cea9fc1 2013 NaN\n", - "1 129 cee8d6b7ce52554fd70354e37bbf44a2 2014 NaN\n", - "2 3 65d2ea03425887a717c435081cfc5dbb 2015 NaN\n", - "3 2 95192c98732387165bf8e396c0f2dad2 2016 NaN\n", - "4 4 8d8818c8e140c64c743113f563cf750f 2017 NaN" - ] - }, - "execution_count": 329, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = process_df(df)\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 330, - "id": "5d3b096d-8e73-4514-94e5-f2dcd4d0a89c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "id int64\n", - "identifier object\n", - "name object\n", - "start_date_time float64\n", - "dtype: object" - ] - }, - "execution_count": 330, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.dtypes" - ] - }, - { - "cell_type": "markdown", - "id": "a7b00bc7-eae6-457c-ac68-a4a55a6d1c8c", - "metadata": {}, - "source": [ - "#### Deep Analysis of facilities.csv" - ] - }, - { - "cell_type": "code", - "execution_count": 331, - "id": "d95ef015-d44c-4353-8761-771b910d21c9", - "metadata": {}, - "outputs": [], - "source": [ - "name_dataset = '1facilities.csv'" - ] - }, - { - "cell_type": "code", - "execution_count": 332, - "id": "ef5fe794-8df7-4f27-8554-ecdc4074ac0b", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/1/1facilities.csv\n", - "Shape : (2, 7)\n", - "Number of columns : 7\n" - ] - }, - { - "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", - "
idnamecreated_atupdated_atstreet_idfixed_capacityidentifier
02non défini2020-09-03 13:16:35.293111+02:002020-09-03 13:16:35.293111+02:002NaN52ff3466787b4d538407372e5f7afe0f
11mucem2020-09-03 13:11:23.133059+02:002020-09-03 13:11:23.133059+02:001NaN702bd76fe3dd5dbcf118a6965a946f54
\n", - "
" - ], - "text/plain": [ - " id name created_at \\\n", - "0 2 non défini 2020-09-03 13:16:35.293111+02:00 \n", - "1 1 mucem 2020-09-03 13:11:23.133059+02:00 \n", - "\n", - " updated_at street_id fixed_capacity \\\n", - "0 2020-09-03 13:16:35.293111+02:00 2 NaN \n", - "1 2020-09-03 13:11:23.133059+02:00 1 NaN \n", - "\n", - " identifier \n", - "0 52ff3466787b4d538407372e5f7afe0f \n", - "1 702bd76fe3dd5dbcf118a6965a946f54 " - ] - }, - "execution_count": 332, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = display_databases(name_dataset)\n", - "print(\"Number of columns : \", len(df.columns))\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 333, - "id": "e3621201-fab9-49fd-95c1-0b9d5da76e50", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of columns : 5\n", - "Columns : Index(['id', 'street_id', 'identifier', 'name', 'fixed_capacity'], dtype='object')\n", - "Percent of NA for each column : id 0.0\n", - "street_id 0.0\n", - "identifier 0.0\n", - "name 0.0\n", - "fixed_capacity 100.0\n", - "dtype: float64\n" - ] - }, - { - "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", - "
idstreet_ididentifiernamefixed_capacity
02252ff3466787b4d538407372e5f7afe0fnon définiNaN
111702bd76fe3dd5dbcf118a6965a946f54mucemNaN
\n", - "
" - ], - "text/plain": [ - " id street_id identifier name fixed_capacity\n", - "0 2 2 52ff3466787b4d538407372e5f7afe0f non défini NaN\n", - "1 1 1 702bd76fe3dd5dbcf118a6965a946f54 mucem NaN" - ] - }, - "execution_count": 333, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df = process_df(df)\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 334, - "id": "1b198b92-8654-4531-a0dd-8f2e01c2e6c1", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "id int64\n", - "street_id int64\n", - "identifier object\n", - "name object\n", - "fixed_capacity float64\n", - "dtype: object" - ] - }, - "execution_count": 334, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.dtypes" - ] - }, - { - "cell_type": "markdown", - "id": "ab5c4c2d-3e04-457d-a183-e173df89b650", - "metadata": {}, - "source": [ - "## Merge" - ] - }, - { - "cell_type": "code", - "execution_count": 335, - "id": "43576244-c8cf-4ca0-b056-7aea1fbf0bc7", - "metadata": {}, - "outputs": [], - "source": [ - "def process_df_2(df):\n", - " df = remove_horodates(df)\n", - " print(\"Number of columns : \", len(df.columns))\n", - " df = order_columns_id(df)\n", - " print(\"Columns : \", df.columns)\n", - " return df" - ] - }, - { - "cell_type": "code", - "execution_count": 336, - "id": "0fad097e-474c-4af7-b1e1-7d8dda3f09ea", - "metadata": {}, - "outputs": [], - "source": [ - "def load_dataset(name):\n", - " df = display_databases(name)\n", - " df = process_df_2(df)\n", - " # drop na :\n", - " #df = df.dropna(axis=1, thresh=len(df))\n", - " # if identifier in table : delete it\n", - " if 'identifier' in df.columns:\n", - " df = df.drop(columns = 'identifier')\n", - " return df" - ] - }, - { - "cell_type": "markdown", - "id": "b60034ef-fdd6-4640-a012-cf74c17b333f", - "metadata": {}, - "source": [ - "### Products Table" - ] - }, - { - "cell_type": "code", - "execution_count": 337, - "id": "6213b1eb-c5f8-49dd-ab69-366542380e80", - "metadata": {}, - "outputs": [], - "source": [ - "def create_products_table():\n", - " # first merge products and categories\n", - " print(\"first merge products and categories\")\n", - " products = load_dataset(\"1products.csv\")\n", - " categories = load_dataset(\"1categories.csv\")\n", - " # Drop useless columns\n", - " products = products.drop(columns = ['apply_price', 'extra_field', 'amount_consumption'])\n", - " categories = categories.drop(columns = ['extra_field', 'quota'])\n", - "\n", - " #Merge\n", - " products_theme = products.merge(categories, how = 'left', left_on = 'category_id',\n", - " right_on = 'id', suffixes=('_products', '_categories'))\n", - " products_theme = products_theme.rename(columns = {\"name\" : \"name_categories\"})\n", - " \n", - " # Second merge products_theme and type of categories\n", - " print(\"Second merge products_theme and type of categories\")\n", - " type_of_categories = load_dataset(\"1type_of_categories.csv\")\n", - " type_of_categories = type_of_categories.drop(columns = 'id')\n", - " products_theme = products_theme.merge(type_of_categories, how = 'left', left_on = 'category_id',\n", - " right_on = 'category_id' )\n", - "\n", - " # Index cleaning\n", - " products_theme = products_theme.drop(columns = ['id_categories'])\n", - " products_theme = order_columns_id(products_theme)\n", - "\n", - " \n", - "\n", - " return products_theme" - ] - }, - { - "cell_type": "code", - "execution_count": 338, - "id": "b853e020-f73d-44e8-b086-e5548ce21011", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "first merge products and categories\n", - "File path : bdc2324-data/1/1products.csv\n", - "Shape : (94803, 14)\n", - "Number of columns : 12\n", - "Columns : Index(['id', 'representation_id', 'pricing_formula_id', 'category_id',\n", - " 'products_group_id', 'product_pack_id', 'identifier', 'amount',\n", - " 'is_full_price', 'apply_price', 'extra_field', 'amount_consumption'],\n", - " dtype='object')\n", - "File path : bdc2324-data/1/1categories.csv\n", - "Shape : (27, 7)\n", - "Number of columns : 5\n", - "Columns : Index(['id', 'identifier', 'name', 'extra_field', 'quota'], dtype='object')\n", - "Second merge products_theme and type of categories\n", - "File path : bdc2324-data/1/1type_of_categories.csv\n", - "Shape : (5, 6)\n", - "Number of columns : 4\n", - "Columns : Index(['id', 'type_of_id', 'category_id', 'identifier'], dtype='object')\n" - ] - }, - { - "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", - "
id_productsrepresentation_idpricing_formula_idcategory_idproducts_group_idproduct_pack_idtype_of_idamountis_full_pricename_categories
01068291411441106551NaN9.0Falseindiv activité tr
14782731311471112.09.5Falseindiv entrées tp
220873275137120825112.011.5Falseindiv entrées tp
315714282519951567731NaN8.0Falseindiv entrées tr
4134199311175112.08.5Falseindiv entrées tp
\n", - "
" - ], - "text/plain": [ - " id_products representation_id pricing_formula_id category_id \\\n", - "0 10682 914 114 41 \n", - "1 478 273 131 1 \n", - "2 20873 275 137 1 \n", - "3 157142 82519 9 5 \n", - "4 1341 9 93 1 \n", - "\n", - " products_group_id product_pack_id type_of_id amount is_full_price \\\n", - "0 10655 1 NaN 9.0 False \n", - "1 471 1 12.0 9.5 False \n", - "2 20825 1 12.0 11.5 False \n", - "3 156773 1 NaN 8.0 False \n", - "4 1175 1 12.0 8.5 False \n", - "\n", - " name_categories \n", - "0 indiv activité tr \n", - "1 indiv entrées tp \n", - "2 indiv entrées tp \n", - "3 indiv entrées tr \n", - "4 indiv entrées tp " - ] - }, - "execution_count": 338, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "products_theme = create_products_table()\n", - "products_theme.head()" - ] - }, - { - "cell_type": "markdown", - "id": "8bd7b7ab-fd04-48d2-898b-48c5815457f3", - "metadata": {}, - "source": [ - "### Events Table" - ] - }, - { - "cell_type": "code", - "execution_count": 339, - "id": "6ed0ad20-8315-4112-9a85-10e5f04ef852", - "metadata": {}, - "outputs": [], - "source": [ - "def create_events_table():\n", - " # first merge events and seasons : \n", - " print(\"first merge events and seasons : \")\n", - " events = load_dataset(\"1events.csv\")\n", - " seasons = load_dataset(\"1seasons.csv\")\n", - "\n", - " # Drop useless columns\n", - " events = events.drop(columns = ['manual_added', 'is_display'])\n", - " seasons = seasons.drop(columns = ['start_date_time'])\n", - " \n", - " events_theme = events.merge(seasons, how = 'left', left_on = 'season_id', right_on = 'id', suffixes=('_events', '_seasons'))\n", - "\n", - " # Secondly merge events_theme and event_types\n", - " print(\"Secondly merge events_theme and event_types : \")\n", - " event_types = load_dataset(\"1event_types.csv\")\n", - " event_types = event_types.drop(columns = ['fidelity_delay'])\n", - " \n", - " events_theme = events_theme.merge(event_types, how = 'left', left_on = 'event_type_id', right_on = 'id', suffixes=('_events', '_event_type'))\n", - " events_theme = events_theme.rename(columns = {\"name\" : \"name_event_types\"})\n", - " events_theme = events_theme.drop(columns = 'id')\n", - "\n", - " # thirdly merge events_theme and facilities\n", - " print(\"thirdly merge events_theme and facilities : \")\n", - " facilities = load_dataset(\"1facilities.csv\")\n", - " facilities = facilities.drop(columns = ['fixed_capacity'])\n", - " \n", - " events_theme = events_theme.merge(facilities, how = 'left', left_on = 'facility_id', right_on = 'id', suffixes=('_events', '_facility'))\n", - " events_theme = events_theme.rename(columns = {\"name\" : \"name_facilities\", \"id_events\" : \"event_id\"})\n", - " events_theme = events_theme.drop(columns = 'id')\n", - "\n", - " # Index cleaning\n", - " events_theme = events_theme.drop(columns = ['id_seasons'])\n", - " events_theme = order_columns_id(events_theme)\n", - " return events_theme" - ] - }, - { - "cell_type": "code", - "execution_count": 340, - "id": "98ef0636-8c45-4a23-a62a-1fbe1544f8ce", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "first merge events and seasons : \n", - "File path : bdc2324-data/1/1events.csv\n", - "Shape : (1232, 12)\n", - "Number of columns : 10\n", - "Columns : Index(['id', 'season_id', 'facility_id', 'event_type_id', 'event_type_key_id',\n", - " 'facility_key_id', 'identifier', 'name', 'manual_added', 'is_display'],\n", - " dtype='object')\n", - "File path : bdc2324-data/1/1seasons.csv\n", - "Shape : (13, 6)\n", - "Number of columns : 4\n", - "Columns : Index(['id', 'identifier', 'name', 'start_date_time'], dtype='object')\n", - "Secondly merge events_theme and event_types : \n", - "File path : bdc2324-data/1/1event_types.csv\n", - "Shape : (9, 6)\n", - "Number of columns : 4\n", - "Columns : Index(['id', 'fidelity_delay', 'identifier', 'name'], dtype='object')\n", - "thirdly merge events_theme and facilities : \n", - "File path : bdc2324-data/1/1facilities.csv\n", - "Shape : (2, 7)\n", - "Number of columns : 5\n", - "Columns : Index(['id', 'street_id', 'identifier', 'name', 'fixed_capacity'], dtype='object')\n" - ] - }, - { - "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", - "
event_idseason_idfacility_idevent_type_idevent_type_key_idfacility_key_idstreet_idname_eventsname_seasonsname_event_typesname_facilities
01921614411frontières2018spectacle vivantmucem
130329276715511visite guidée une autre histoire du monde (1h00)2023offre muséale groupemucem
21611612211visite contée les chercheurs d'or indiv2018offre muséale individuelmucem
3595758214411we dreamt of utopia and we woke up screaming.2021spectacle vivantmucem
4833758214411jeff koons épisodes 42021spectacle vivantmucem
\n", - "
" - ], - "text/plain": [ - " event_id season_id facility_id event_type_id event_type_key_id \\\n", - "0 192 16 1 4 4 \n", - "1 30329 2767 1 5 5 \n", - "2 161 16 1 2 2 \n", - "3 5957 582 1 4 4 \n", - "4 8337 582 1 4 4 \n", - "\n", - " facility_key_id street_id \\\n", - "0 1 1 \n", - "1 1 1 \n", - "2 1 1 \n", - "3 1 1 \n", - "4 1 1 \n", - "\n", - " name_events name_seasons \\\n", - "0 frontières 2018 \n", - "1 visite guidée une autre histoire du monde (1h00) 2023 \n", - "2 visite contée les chercheurs d'or indiv 2018 \n", - "3 we dreamt of utopia and we woke up screaming. 2021 \n", - "4 jeff koons épisodes 4 2021 \n", - "\n", - " name_event_types name_facilities \n", - "0 spectacle vivant mucem \n", - "1 offre muséale groupe mucem \n", - "2 offre muséale individuel mucem \n", - "3 spectacle vivant mucem \n", - "4 spectacle vivant mucem " - ] - }, - "execution_count": 340, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "events_theme= create_events_table()\n", - "events_theme.head()" - ] - }, - { - "cell_type": "markdown", - "id": "4ad5b680-bb27-4f86-a5f3-7ff4fd1be96a", - "metadata": {}, - "source": [ - "## Representations_Table" - ] - }, - { - "cell_type": "code", - "execution_count": 341, - "id": "481dddd6-80a8-4b9e-a05e-ed06fa3ed7a6", - "metadata": {}, - "outputs": [], - "source": [ - "def create_representations_table():\n", - " representations = load_dataset(\"1representations.csv\")\n", - " representations = representations.drop(columns = ['serial', 'open', 'satisfaction', 'is_display', 'expected_filling',\n", - " 'max_filling', 'extra_field', 'start_date_time', 'end_date_time', 'name',\n", - " 'representation_type_id'])\n", - " \n", - " representations_capacity = load_dataset(\"1representation_category_capacities.csv\")\n", - " representations_capacity = representations_capacity.drop(columns = ['expected_filling', 'max_filling'])\n", - "\n", - " representations_theme = representations.merge(representations_capacity, how='left',\n", - " left_on='id', right_on='representation_id',\n", - " suffixes=('_representation', '_representation_cap'))\n", - " # index cleaning\n", - " representations_theme = representations_theme.drop(columns = [\"id_representation\"])\n", - " representations_theme = order_columns_id(representations_theme)\n", - " return representations_theme" - ] - }, - { - "cell_type": "code", - "execution_count": 342, - "id": "677f4ed8-ef58-45f2-9056-ede0898c6a64", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/1/1representations.csv\n", - "Shape : (36095, 16)\n", - "Number of columns : 14\n", - "Columns : Index(['id', 'event_id', 'representation_type_id', 'identifier', 'serial',\n", - " 'start_date_time', 'open', 'satisfaction', 'end_date_time', 'name',\n", - " 'is_display', 'expected_filling', 'max_filling', 'extra_field'],\n", - " dtype='object')\n", - "File path : bdc2324-data/1/1representation_category_capacities.csv\n", - "Shape : (65241, 7)\n", - "Number of columns : 5\n", - "Columns : Index(['id', 'representation_id', 'category_id', 'expected_filling',\n", - " 'max_filling'],\n", - " dtype='object')\n" - ] - }, - { - "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", - "
event_idid_representation_caprepresentation_idcategory_id
012384123058848202
13725142692
2373842695
337251526910
4373832691
\n", - "
" - ], - "text/plain": [ - " event_id id_representation_cap representation_id category_id\n", - "0 12384 123058 84820 2\n", - "1 37 2514 269 2\n", - "2 37 384 269 5\n", - "3 37 2515 269 10\n", - "4 37 383 269 1" - ] - }, - "execution_count": 342, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "representation_theme = create_representations_table()\n", - "representation_theme.head()" - ] - }, - { - "cell_type": "markdown", - "id": "e274e3cc-1b41-43e0-8412-1563166060cb", - "metadata": {}, - "source": [ - "## Price Table" - ] - }, - { - "cell_type": "code", - "execution_count": 343, - "id": "c52621e7-01de-48dc-b572-2974542a8be5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/1/1product_packs.csv\n", - "Shape : (1, 6)\n", - "Number of columns : 4\n", - "Columns : Index(['id', 'identifier', 'name', 'type_of'], dtype='object')\n" - ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idnametype_of
01NaN0
\n", - "
" - ], - "text/plain": [ - " id name type_of\n", - "0 1 NaN 0" - ] - }, - "execution_count": 343, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "product_packs = load_dataset(\"1product_packs.csv\")\n", - "product_packs.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 344, - "id": "9e4f60ab-9a2c-4090-b0c4-f9a1530b2d39", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/1/1pricing_formulas.csv\n", - "Shape : (556, 6)\n", - "Number of columns : 4\n", - "Columns : Index(['id', 'identifier', 'name', 'extra_field'], dtype='object')\n" - ] - }, - { - "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", - "
idnameextra_field
041909visite mécènes 1h30NaN
1502entree mucem tp( expo picasso)NaN
2504nombre de personnes cinemaNaN
3117spectacle tarif e famille trNaN
41496billet nb famille mecene 1aNaN
\n", - "
" - ], - "text/plain": [ - " id name extra_field\n", - "0 41909 visite mécènes 1h30 NaN\n", - "1 502 entree mucem tp( expo picasso) NaN\n", - "2 504 nombre de personnes cinema NaN\n", - "3 117 spectacle tarif e famille tr NaN\n", - "4 1496 billet nb famille mecene 1a NaN" - ] - }, - "execution_count": 344, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pricing_formula = load_dataset(\"1pricing_formulas.csv\")\n", - "pricing_formula.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 345, - "id": "247b5c45-a18a-4cfd-86b4-d3453e157bcd", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/1/1type_of_pricing_formulas.csv\n", - "Shape : (568, 6)\n", - "Number of columns : 4\n", - "Columns : Index(['id', 'type_of_id', 'pricing_formula_id', 'identifier'], dtype='object')\n" - ] - }, - { - "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", - "
idtype_of_idpricing_formula_id
011127
1212425
2312937
34148
4517
\n", - "
" - ], - "text/plain": [ - " id type_of_id pricing_formula_id\n", - "0 1 1 127\n", - "1 2 1 2425\n", - "2 3 1 2937\n", - "3 4 1 48\n", - "4 5 1 7" - ] - }, - "execution_count": 345, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "type_pricing_formula = load_dataset(\"1type_of_pricing_formulas.csv\")\n", - "type_pricing_formula.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 346, - "id": "4b48f7b3-0f06-4ef6-9355-5016af82f49c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/1/1products_groups.csv\n", - "Shape : (92973, 9)\n", - "Number of columns : 7\n", - "Columns : Index(['id', 'category_id', 'pricing_formula_id', 'representation_id',\n", - " 'percent_price', 'max_price', 'min_price'],\n", - " dtype='object')\n" - ] - }, - { - "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", - "
idcategory_idpricing_formula_idrepresentation_idpercent_pricemax_pricemin_price
027358971534100.00.00.0
11567735982519100.00.00.0
21438716798046100.00.00.0
327702371563100.00.00.0
4271791311914192100.00.00.0
\n", - "
" - ], - "text/plain": [ - " id category_id pricing_formula_id representation_id percent_price \\\n", - "0 2735 8 97 1534 100.0 \n", - "1 156773 5 9 82519 100.0 \n", - "2 14387 16 79 8046 100.0 \n", - "3 2770 2 37 1563 100.0 \n", - "4 27179 13 119 14192 100.0 \n", - "\n", - " max_price min_price \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 " - ] - }, - "execution_count": 346, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "product_groups = load_dataset(\"1products_groups.csv\")\n", - "product_groups.head()" - ] - }, - { - "cell_type": "markdown", - "id": "71c26a38-6818-42df-8aee-0135681a5563", - "metadata": {}, - "source": [ - "## Uniform Products theme database" - ] - }, - { - "cell_type": "code", - "execution_count": 347, - "id": "b26f4e7e-134d-4e32-a615-4b0e6bb80b25", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Products theme columns : Index(['id_products', 'representation_id', 'pricing_formula_id', 'category_id',\n", - " 'products_group_id', 'product_pack_id', 'type_of_id', 'amount',\n", - " 'is_full_price', 'name_categories'],\n", - " dtype='object')\n", - "\n", - " Representation theme columns : Index(['event_id', 'id_representation_cap', 'representation_id',\n", - " 'category_id'],\n", - " dtype='object')\n", - "\n", - " Events theme columns : Index(['event_id', 'season_id', 'facility_id', 'event_type_id',\n", - " 'event_type_key_id', 'facility_key_id', 'street_id', 'name_events',\n", - " 'name_seasons', 'name_event_types', 'name_facilities'],\n", - " dtype='object')\n" - ] - } - ], - "source": [ - "print(\"Products theme columns : \", products_theme.columns)\n", - "print(\"\\n Representation theme columns : \", representation_theme.columns)\n", - "print(\"\\n Events theme columns : \", events_theme.columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 348, - "id": "d40b1e3b-b1f3-4915-8ebc-6bb7856da42a", - "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", - "
id_productsrepresentation_idpricing_formula_idcategory_idproducts_group_idproduct_pack_idtype_of_idamountis_full_pricename_categoriesevent_idid_representation_cap
01068291411441106551NaN9.0Falseindiv activité tr1328789
14782731311471112.09.5Falseindiv entrées tp37390
220873275137120825112.011.5Falseindiv entrées tp37395
315714282519951567731NaN8.0Falseindiv entrées tr12365120199
4134199311175112.08.5Falseindiv entrées tp821
\n", - "
" - ], - "text/plain": [ - " id_products representation_id pricing_formula_id category_id \\\n", - "0 10682 914 114 41 \n", - "1 478 273 131 1 \n", - "2 20873 275 137 1 \n", - "3 157142 82519 9 5 \n", - "4 1341 9 93 1 \n", - "\n", - " products_group_id product_pack_id type_of_id amount is_full_price \\\n", - "0 10655 1 NaN 9.0 False \n", - "1 471 1 12.0 9.5 False \n", - "2 20825 1 12.0 11.5 False \n", - "3 156773 1 NaN 8.0 False \n", - "4 1175 1 12.0 8.5 False \n", - "\n", - " name_categories event_id id_representation_cap \n", - "0 indiv activité tr 132 8789 \n", - "1 indiv entrées tp 37 390 \n", - "2 indiv entrées tp 37 395 \n", - "3 indiv entrées tr 12365 120199 \n", - "4 indiv entrées tp 8 21 " - ] - }, - "execution_count": 348, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "products_global = products_theme.merge(representation_theme, how='left',\n", - " on= [\"representation_id\", \"category_id\"])\n", - "\n", - "\n", - "products_global.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 349, - "id": "78d75a08-e959-429c-847a-7d70a2804806", - "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", - "
id_productsrepresentation_idpricing_formula_idcategory_idproducts_group_idproduct_pack_idtype_of_idevent_idid_representation_capseason_id...event_type_key_idfacility_key_idstreet_idamountis_full_pricename_categoriesname_eventsname_seasonsname_event_typesname_facilities
01068291411441106551NaN13287894...5119.0Falseindiv activité trvisite-jeu \"le classico des minots\" (1h30)2017offre muséale individuelmucem
14782731311471112.0373902...2119.5Falseindiv entrées tpbillet mucem picasso2016offre muséale individuelmucem
220873275137120825112.0373952...21111.5Falseindiv entrées tpbillet mucem picasso2016offre muséale individuelmucem
315714282519951567731NaN123651201991754...4118.0Falseindiv entrées trNaNNaNoffre muséale individuelmucem
4134199311175112.08214...6118.5Falseindiv entrées tpnon défini2017non définimucem
\n", - "

5 rows × 22 columns

\n", - "
" - ], - "text/plain": [ - " id_products representation_id pricing_formula_id category_id \\\n", - "0 10682 914 114 41 \n", - "1 478 273 131 1 \n", - "2 20873 275 137 1 \n", - "3 157142 82519 9 5 \n", - "4 1341 9 93 1 \n", - "\n", - " products_group_id product_pack_id type_of_id event_id \\\n", - "0 10655 1 NaN 132 \n", - "1 471 1 12.0 37 \n", - "2 20825 1 12.0 37 \n", - "3 156773 1 NaN 12365 \n", - "4 1175 1 12.0 8 \n", - "\n", - " id_representation_cap season_id ... event_type_key_id facility_key_id \\\n", - "0 8789 4 ... 5 1 \n", - "1 390 2 ... 2 1 \n", - "2 395 2 ... 2 1 \n", - "3 120199 1754 ... 4 1 \n", - "4 21 4 ... 6 1 \n", - "\n", - " street_id amount is_full_price name_categories \\\n", - "0 1 9.0 False indiv activité tr \n", - "1 1 9.5 False indiv entrées tp \n", - "2 1 11.5 False indiv entrées tp \n", - "3 1 8.0 False indiv entrées tr \n", - "4 1 8.5 False indiv entrées tp \n", - "\n", - " name_events name_seasons \\\n", - "0 visite-jeu \"le classico des minots\" (1h30) 2017 \n", - "1 billet mucem picasso 2016 \n", - "2 billet mucem picasso 2016 \n", - "3 NaN NaN \n", - "4 non défini 2017 \n", - "\n", - " name_event_types name_facilities \n", - "0 offre muséale individuel mucem \n", - "1 offre muséale individuel mucem \n", - "2 offre muséale individuel mucem \n", - "3 offre muséale individuel mucem \n", - "4 non défini mucem \n", - "\n", - "[5 rows x 22 columns]" - ] - }, - "execution_count": 349, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "products_global = products_global.merge(events_theme, how='left', on='event_id',\n", - " suffixes = (\"_representation\", \"_event\"))\n", - "products_global = order_columns_id(products_global)\n", - "products_global.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 350, - "id": "4a6950e8-4818-4df2-afa9-562e0921698c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Index(['id_products', 'representation_id', 'pricing_formula_id', 'category_id',\n", - " 'products_group_id', 'product_pack_id', 'type_of_id', 'event_id',\n", - " 'id_representation_cap', 'season_id', 'facility_id', 'event_type_id',\n", - " 'event_type_key_id', 'facility_key_id', 'street_id', 'amount',\n", - " 'is_full_price', 'name_categories', 'name_events', 'name_seasons',\n", - " 'name_event_types', 'name_facilities'],\n", - " dtype='object')" - ] - }, - "execution_count": 350, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "products_global.columns" - ] - }, - { - "cell_type": "code", - "execution_count": 351, - "id": "b18f6428-90e0-4b1b-9b8d-bad995fb6c98", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(94803, 22)" - ] - }, - "execution_count": 351, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "products_global.shape" - ] - }, - { - "cell_type": "markdown", - "id": "c3caf2fd-178e-48e9-b95f-5798bd576f5d", - "metadata": {}, - "source": [ - "## Analysis of Products_global" - ] - }, - { - "cell_type": "code", - "execution_count": 352, - "id": "33ee07a2-d871-4436-9860-9be389bc4902", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "id_products 0\n", - "representation_id 0\n", - "pricing_formula_id 0\n", - "category_id 0\n", - "products_group_id 0\n", - "product_pack_id 0\n", - "type_of_id 67589\n", - "event_id 0\n", - "id_representation_cap 0\n", - "season_id 0\n", - "facility_id 0\n", - "event_type_id 0\n", - "event_type_key_id 0\n", - "facility_key_id 0\n", - "street_id 0\n", - "amount 0\n", - "is_full_price 0\n", - "name_categories 3991\n", - "name_events 46657\n", - "name_seasons 30663\n", - "name_event_types 0\n", - "name_facilities 0\n", - "dtype: int64" - ] - }, - "execution_count": 352, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "products_global.isna().sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 353, - "id": "557fc475-4417-4d9f-8d4e-8c49bc42367f", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array(['offre muséale individuel', 'non défini', 'spectacle vivant',\n", - " 'offre muséale groupe', 'formule adhésion'], dtype=object)" - ] - }, - "execution_count": 353, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# how many event types ?\n", - "\n", - "products_global['name_event_types'].unique()" - ] - }, - { - "cell_type": "code", - "execution_count": 354, - "id": "a9b9a23c-b0de-4685-97e5-d52dd78349f5", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "644" - ] - }, - "execution_count": 354, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# how many events ?\n", - "\n", - "len(products_global['name_events'].unique())" - ] - }, - { - "cell_type": "code", - "execution_count": 355, - "id": "fb374c72-58ca-404d-a86b-e834a2fc4a34", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array(['indiv activité tr', 'indiv entrées tp', 'indiv entrées tr',\n", - " 'indiv prog enfant', 'indiv activité gr', 'indiv prog gr',\n", - " 'indiv activité tp', 'indiv activité enfant', 'indiv entrées gr',\n", - " 'groupe forfait entrées tr', 'groupe autonome adulte',\n", - " 'indiv prog tp', 'indiv prog tr', 'indiv entrées fa',\n", - " 'groupe forfait scolaire', 'en nb entrées tr', 'non défini', nan,\n", - " 'en nb entrées gr', 'groupe autonome entrées gr',\n", - " 'groupe forfait entrées gr', 'groupe autonome entrées tr',\n", - " 'en nb entrées tp', 'groupe autonome gr',\n", - " 'groupe autonome entrées tp', 'groupe forfait adulte',\n", - " 'groupe forfait etudiant'], dtype=object)" - ] - }, - "execution_count": 355, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# how many categories ?\n", - "products_global['name_categories'].unique()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 356, - "id": "11f89771-8d50-4ef4-b34e-53e4f6b419bb", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "27" - ] - }, - "execution_count": 356, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(products_global['category_id'].unique())" - ] - }, - { - "cell_type": "code", - "execution_count": 357, - "id": "8add1ff2-b7e8-4381-90d8-d18d8660ed39", - "metadata": {}, - "outputs": [], - "source": [ - "def uniform_product_df():\n", - " \"\"\"\n", - " This function returns the uniform product dataset\n", - " \"\"\"\n", - " print(\"Products theme columns : \", products_theme.columns)\n", - " print(\"\\n Representation theme columns : \", representation_theme.columns)\n", - " print(\"\\n Events theme columns : \", events_theme.columns)\n", - "\n", - " products_global = products_theme.merge(representation_theme, how='left',\n", - " on= [\"representation_id\", \"category_id\"])\n", - " \n", - " products_global = products_global.merge(events_theme, how='left', on='event_id',\n", - " suffixes = (\"_representation\", \"_event\"))\n", - " \n", - " products_global = order_columns_id(products_global)\n", - "\n", - " # remove useless columns \n", - " products_global = products_global.drop(columns = ['type_of_id', 'name_events', 'name_seasons', 'name_categories'])\n", - " return products_global\n", - " " - ] - }, - { - "cell_type": "markdown", - "id": "b9303d35-4449-4cb6-887b-73a75f3cb868", - "metadata": {}, - "source": [ - "# Investigate Customer Plus" - ] - }, - { - "cell_type": "code", - "execution_count": 358, - "id": "1fd9dcb0-164a-4fd0-90c3-2fd9e7b44016", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "File path : bdc2324-data/1/1customersplus.csv\n", - "Shape : (151866, 43)\n", - "Number of columns : 41\n", - "Columns : Index(['id', 'street_id', 'identifier', 'structure_id', 'mcp_contact_id',\n", - " 'fidelity', 'tenant_id', 'lastname', 'firstname', 'birthdate', 'email',\n", - " 'civility', 'is_partner', 'extra', 'deleted_at', 'reference', 'gender',\n", - " 'is_email_true', 'extra_field', 'opt_in', 'note', 'profession',\n", - " 'language', 'need_reload', 'last_buying_date', 'max_price',\n", - " 'ticket_sum', 'average_price', 'average_purchase_delay',\n", - " 'average_price_basket', 'average_ticket_basket', 'total_price',\n", - " 'preferred_category', 'preferred_supplier', 'preferred_formula',\n", - " 'purchase_count', 'first_buying_date', 'last_visiting_date', 'zipcode',\n", - " 'country', 'age'],\n", - " dtype='object')\n" - ] - }, - { - "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", - "
idstreet_idstructure_idmcp_contact_idfidelitytenant_idlastnamefirstnamebirthdateemail...total_pricepreferred_categorypreferred_supplierpreferred_formulapurchase_countfirst_buying_datelast_visiting_datezipcodecountryage
0127512NaNNaN01311lastname12751firstname12751NaNNaN...NaNNaNNaNNaN0NaNNaNNaNfrNaN
1128252NaNNaN01311lastname12825firstname12825NaNNaN...NaNNaNNaNNaN0NaNNaNNaNfrNaN
2112612NaNNaN01311lastname11261firstname11261NaNNaN...NaNNaNNaNNaN0NaNNaNNaNfrNaN
3130712NaNNaN01311lastname13071NaNNaNNaN...NaNNaNNaNNaN0NaNNaNNaNfrNaN
465306110NaNNaN01311NaNNaNNaNemail653061...NaNNaNNaNNaN0NaNNaNNaNNaNNaN
\n", - "

5 rows × 40 columns

\n", - "
" - ], - "text/plain": [ - " id street_id structure_id mcp_contact_id fidelity tenant_id \\\n", - "0 12751 2 NaN NaN 0 1311 \n", - "1 12825 2 NaN NaN 0 1311 \n", - "2 11261 2 NaN NaN 0 1311 \n", - "3 13071 2 NaN NaN 0 1311 \n", - "4 653061 10 NaN NaN 0 1311 \n", - "\n", - " lastname firstname birthdate email ... total_price \\\n", - "0 lastname12751 firstname12751 NaN NaN ... NaN \n", - "1 lastname12825 firstname12825 NaN NaN ... NaN \n", - "2 lastname11261 firstname11261 NaN NaN ... NaN \n", - "3 lastname13071 NaN NaN NaN ... NaN \n", - "4 NaN NaN NaN email653061 ... NaN \n", - "\n", - " preferred_category preferred_supplier preferred_formula purchase_count \\\n", - "0 NaN NaN NaN 0 \n", - "1 NaN NaN NaN 0 \n", - "2 NaN NaN NaN 0 \n", - "3 NaN NaN NaN 0 \n", - "4 NaN NaN NaN 0 \n", - "\n", - " first_buying_date last_visiting_date zipcode country age \n", - "0 NaN NaN NaN fr NaN \n", - "1 NaN NaN NaN fr NaN \n", - "2 NaN NaN NaN fr NaN \n", - "3 NaN NaN NaN fr NaN \n", - "4 NaN NaN NaN NaN NaN \n", - "\n", - "[5 rows x 40 columns]" - ] - }, - "execution_count": 358, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "customer_plus = load_dataset(\"1customersplus.csv\")\n", - "customer_plus.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 359, - "id": "e4a5f890-d5aa-40d7-a70c-8d8a254a5c9a", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "id 0\n", - "street_id 0\n", - "structure_id 133752\n", - "mcp_contact_id 52965\n", - "fidelity 0\n", - "tenant_id 0\n", - "lastname 66003\n", - "firstname 68333\n", - "birthdate 146429\n", - "email 13094\n", - "civility 151866\n", - "is_partner 0\n", - "extra 151866\n", - "deleted_at 151866\n", - "reference 151866\n", - "gender 0\n", - "is_email_true 0\n", - "extra_field 151866\n", - "opt_in 0\n", - "note 150960\n", - "profession 145660\n", - "language 150774\n", - "need_reload 0\n", - "last_buying_date 78444\n", - "max_price 78444\n", - "ticket_sum 0\n", - "average_price 13120\n", - "average_purchase_delay 78444\n", - "average_price_basket 78444\n", - "average_ticket_basket 78444\n", - "total_price 65324\n", - "preferred_category 151866\n", - "preferred_supplier 151866\n", - "preferred_formula 151866\n", - "purchase_count 0\n", - "first_buying_date 78444\n", - "last_visiting_date 151866\n", - "zipcode 108093\n", - "country 8291\n", - "age 146429\n", - "dtype: int64" - ] - }, - "execution_count": 359, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "customer_plus.isna().sum()" - ] - }, - { - "cell_type": "markdown", - "id": "55ac8ec6-baa2-4199-b29a-d931260a6970", - "metadata": {}, - "source": [ - "# Analysis of Customer Products" - ] - }, - { - "cell_type": "code", - "execution_count": 360, - "id": "de370d66-852e-46a1-8fb4-5c1e5756f5cd", - "metadata": {}, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt" - ] - }, - { - "cell_type": "code", - "execution_count": 361, - "id": "088a1f50-cf5d-4d1a-891d-4e9df7e1c35b", - "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", - "
customer_idbirthdatestreet_idis_partnergenderis_email_trueopt_instructure_idprofessionlanguage...first_buying_datecountryagetenant_idnb_campaignsnb_campaigns_openedtime_to_openevent_type_idnb_ticketsavg_amount
012751NaN2False1TrueTrueNaNNaNNaN...NaNfrNaN1311NaNNaNNaNNaNNaNNaN
112825NaN2False2TrueTrueNaNNaNNaN...NaNfrNaN1311NaNNaNNaNNaNNaNNaN
211261NaN2False1TrueTrueNaNNaNNaN...NaNfrNaN1311NaNNaNNaNNaNNaNNaN
313071NaN2False2TrueTrueNaNNaNNaN...NaNfrNaN1311NaNNaNNaNNaNNaNNaN
4653061NaN10False2TrueFalseNaNNaNNaN...NaNNaNNaN131180.02.00 days 19:53:02.500000NaNNaNNaN
\n", - "

5 rows × 31 columns

\n", - "
" - ], - "text/plain": [ - " customer_id birthdate street_id is_partner gender is_email_true \\\n", - "0 12751 NaN 2 False 1 True \n", - "1 12825 NaN 2 False 2 True \n", - "2 11261 NaN 2 False 1 True \n", - "3 13071 NaN 2 False 2 True \n", - "4 653061 NaN 10 False 2 True \n", - "\n", - " opt_in structure_id profession language ... first_buying_date country \\\n", - "0 True NaN NaN NaN ... NaN fr \n", - "1 True NaN NaN NaN ... NaN fr \n", - "2 True NaN NaN NaN ... NaN fr \n", - "3 True NaN NaN NaN ... NaN fr \n", - "4 False NaN NaN NaN ... NaN NaN \n", - "\n", - " age tenant_id nb_campaigns nb_campaigns_opened time_to_open \\\n", - "0 NaN 1311 NaN NaN NaN \n", - "1 NaN 1311 NaN NaN NaN \n", - "2 NaN 1311 NaN NaN NaN \n", - "3 NaN 1311 NaN NaN NaN \n", - "4 NaN 1311 80.0 2.0 0 days 19:53:02.500000 \n", - "\n", - " event_type_id nb_tickets avg_amount \n", - "0 NaN NaN NaN \n", - "1 NaN NaN NaN \n", - "2 NaN NaN NaN \n", - "3 NaN NaN NaN \n", - "4 NaN NaN NaN \n", - "\n", - "[5 rows x 31 columns]" - ] - }, - "execution_count": 361, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "customer_product = pd.read_csv(\"customer_product.csv\")\n", - "customer_product.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 362, - "id": "bdd582af-0cf1-4e04-90ad-7165b8a36ac8", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(156289, 31)\n", - "Index(['customer_id', 'birthdate', 'street_id', 'is_partner', 'gender',\n", - " 'is_email_true', 'opt_in', 'structure_id', 'profession', 'language',\n", - " 'mcp_contact_id', 'last_buying_date', 'max_price', 'ticket_sum',\n", - " 'average_price', 'fidelity', 'average_purchase_delay',\n", - " 'average_price_basket', 'average_ticket_basket', 'total_price',\n", - " 'purchase_count', 'first_buying_date', 'country', 'age', 'tenant_id',\n", - " 'nb_campaigns', 'nb_campaigns_opened', 'time_to_open', 'event_type_id',\n", - " 'nb_tickets', 'avg_amount'],\n", - " dtype='object')\n" - ] - } - ], - "source": [ - "# Shape :\n", - "print(customer_product.shape)\n", - "# columns : \n", - "print(customer_product.columns)" - ] - }, - { - "cell_type": "code", - "execution_count": 363, - "id": "55fa2361-ebde-4472-b8d2-521a20be766d", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "customer_id 0\n", - "birthdate 149375\n", - "street_id 0\n", - "is_partner 0\n", - "gender 0\n", - "is_email_true 0\n", - "opt_in 0\n", - "structure_id 136867\n", - "profession 150004\n", - "language 155184\n", - "mcp_contact_id 53519\n", - "last_buying_date 78445\n", - "max_price 78445\n", - "ticket_sum 0\n", - "average_price 13120\n", - "fidelity 0\n", - "average_purchase_delay 78445\n", - "average_price_basket 78445\n", - "average_ticket_basket 78445\n", - "total_price 65325\n", - "purchase_count 0\n", - "first_buying_date 78445\n", - "country 8304\n", - "age 149375\n", - "tenant_id 0\n", - "nb_campaigns 21623\n", - "nb_campaigns_opened 21623\n", - "time_to_open 69017\n", - "event_type_id 78355\n", - "nb_tickets 78355\n", - "avg_amount 78355\n", - "dtype: int64" - ] - }, - "execution_count": 363, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# check NA\n", - "\n", - "customer_product.isna().sum()" - ] - }, - { - "cell_type": "code", - "execution_count": 364, - "id": "2e228eb6-8cc7-4fd7-8e17-2b818095cb96", - "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", - "
customer_idgenderis_partneris_email_truenb_campaignsnb_campaigns_openedfidelitynb_ticketsticket_sumaverage_priceavg_amountevent_type_id
0127511FalseTrueNaNNaN0NaN00.0NaNNaN
1128252FalseTrueNaNNaN0NaN00.0NaNNaN
2112611FalseTrueNaNNaN0NaN00.0NaNNaN
3130712FalseTrueNaNNaN0NaN00.0NaNNaN
46530612FalseTrue80.02.00NaN00.0NaNNaN
\n", - "
" - ], - "text/plain": [ - " customer_id gender is_partner is_email_true nb_campaigns \\\n", - "0 12751 1 False True NaN \n", - "1 12825 2 False True NaN \n", - "2 11261 1 False True NaN \n", - "3 13071 2 False True NaN \n", - "4 653061 2 False True 80.0 \n", - "\n", - " nb_campaigns_opened fidelity nb_tickets ticket_sum average_price \\\n", - "0 NaN 0 NaN 0 0.0 \n", - "1 NaN 0 NaN 0 0.0 \n", - "2 NaN 0 NaN 0 0.0 \n", - "3 NaN 0 NaN 0 0.0 \n", - "4 2.0 0 NaN 0 0.0 \n", - "\n", - " avg_amount event_type_id \n", - "0 NaN NaN \n", - "1 NaN NaN \n", - "2 NaN NaN \n", - "3 NaN NaN \n", - "4 NaN NaN " - ] - }, - "execution_count": 364, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "## Investigate a subset of variables\n", - "\n", - "df = customer_product[[\"customer_id\", \"gender\", \"is_partner\", \"is_email_true\",\"nb_campaigns\", \"nb_campaigns_opened\", \"fidelity\",\n", - " \"nb_tickets\", \"ticket_sum\", \"average_price\", \"avg_amount\", \"event_type_id\"]]\n", - "df.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 368, - "id": "80120f51-f91e-4d4d-9578-1dc88cd94754", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "shape : (156289, 12)\n", - "Nombre de customer unique : 151866\n", - "Nombre de ligne où nb_tickets est non nul : 77934\n" - ] - } - ], - "source": [ - "print(\"shape : \", df.shape)\n", - "print(\"Nombre de customer unique : \", len(df[\"customer_id\"].unique()))\n", - "print(\"Nombre de ligne où nb_tickets est non nul : \", df[\"nb_tickets\"].count())" - ] - }, - { - "cell_type": "code", - "execution_count": 370, - "id": "0d56bfa9-c93c-42ee-bec2-96f0598fce2c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Nombre de consommateur unique : 73511\n", - "Nombre de type d'évènement : 4\n" - ] - }, - { - "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", - "
customer_idgenderis_partneris_email_truenb_campaignsnb_campaigns_openedfidelitynb_ticketsticket_sumaverage_priceavg_amountevent_type_id
1623092552FalseTrue2.02.002.000.0000007.7624744.0
19577720FalseTrue133.019.005.052.8000007.7624744.0
1972800090FalseTrue116.032.011.0111.0000007.7624744.0
19915560FalseTrue9.08.012.0323.3333336.1506592.0
20015560FalseTrue9.08.011.0323.3333336.4394636.0
.......................................
1562452937532FalseTrue94.034.011.0111.0000007.7624744.0
1562462937982FalseTrue7.00.022.0212.0000007.7624744.0
1562812952242FalseTrue10.00.0198.0980.0000006.1506592.0
1562872953662FalseTrue5.00.013.0311.0000007.7624744.0
1562882953682FalseTrue5.00.012.0211.0000007.7624744.0
\n", - "

77934 rows × 12 columns

\n", - "
" - ], - "text/plain": [ - " customer_id gender is_partner is_email_true nb_campaigns \\\n", - "162 309255 2 False True 2.0 \n", - "195 7772 0 False True 133.0 \n", - "197 280009 0 False True 116.0 \n", - "199 1556 0 False True 9.0 \n", - "200 1556 0 False True 9.0 \n", - "... ... ... ... ... ... \n", - "156245 293753 2 False True 94.0 \n", - "156246 293798 2 False True 7.0 \n", - "156281 295224 2 False True 10.0 \n", - "156287 295366 2 False True 5.0 \n", - "156288 295368 2 False True 5.0 \n", - "\n", - " nb_campaigns_opened fidelity nb_tickets ticket_sum average_price \\\n", - "162 2.0 0 2.0 0 0.000000 \n", - "195 19.0 0 5.0 5 2.800000 \n", - "197 32.0 1 1.0 1 11.000000 \n", - "199 8.0 1 2.0 3 23.333333 \n", - "200 8.0 1 1.0 3 23.333333 \n", - "... ... ... ... ... ... \n", - "156245 34.0 1 1.0 1 11.000000 \n", - "156246 0.0 2 2.0 2 12.000000 \n", - "156281 0.0 1 98.0 98 0.000000 \n", - "156287 0.0 1 3.0 3 11.000000 \n", - "156288 0.0 1 2.0 2 11.000000 \n", - "\n", - " avg_amount event_type_id \n", - "162 7.762474 4.0 \n", - "195 7.762474 4.0 \n", - "197 7.762474 4.0 \n", - "199 6.150659 2.0 \n", - "200 6.439463 6.0 \n", - "... ... ... \n", - "156245 7.762474 4.0 \n", - "156246 7.762474 4.0 \n", - "156281 6.150659 2.0 \n", - "156287 7.762474 4.0 \n", - "156288 7.762474 4.0 \n", - "\n", - "[77934 rows x 12 columns]" - ] - }, - "execution_count": 370, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Filter only customer that buy tickets\n", - "\n", - "df_purchase = df.dropna(subset= [\"nb_tickets\"])\n", - "print(\"Nombre de consommateur unique : \", len(df_purchase[\"customer_id\"].unique()))\n", - "print(\"Nombre de type d'évènement : \", len(df_purchase[\"event_type_id\"].unique()))\n", - "#print(\"Nombre de type d'évènement (nom) : \", len(df_purchase[\"name_event_types\"].unique()))\n", - "df_purchase" - ] - }, - { - "cell_type": "code", - "execution_count": 371, - "id": "0cc96c4e-f3f3-43d2-94b5-a11719f09607", - "metadata": {}, - "outputs": [ - { - "ename": "KeyError", - "evalue": "'name_event_types'", + "ename": "ClientError", + "evalue": "An error occurred (InvalidAccessKeyId) when calling the PutObject operation: The Access Key Id you provided does not exist in our records.", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[371], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m event_counts \u001b[38;5;241m=\u001b[39m \u001b[43mdf_purchase\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgroupby\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mname_event_types\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m)\u001b[49m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcustomer_id\u001b[39m\u001b[38;5;124m'\u001b[39m]\u001b[38;5;241m.\u001b[39mnunique()\n\u001b[1;32m 3\u001b[0m event_counts\u001b[38;5;241m.\u001b[39mplot(kind\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mbar\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m 4\u001b[0m plt\u001b[38;5;241m.\u001b[39mxlabel(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mType d\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mévènement\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", - "File \u001b[0;32m/opt/mamba/lib/python3.10/site-packages/pandas/core/frame.py:8869\u001b[0m, in \u001b[0;36mDataFrame.groupby\u001b[0;34m(self, by, axis, level, as_index, sort, group_keys, observed, dropna)\u001b[0m\n\u001b[1;32m 8866\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m level \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;129;01mand\u001b[39;00m by \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 8867\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mYou have to supply one of \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mby\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m and \u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mlevel\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m-> 8869\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mDataFrameGroupBy\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 8870\u001b[0m \u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 8871\u001b[0m \u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mby\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 8872\u001b[0m \u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 8873\u001b[0m \u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 8874\u001b[0m \u001b[43m \u001b[49m\u001b[43mas_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mas_index\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 8875\u001b[0m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 8876\u001b[0m \u001b[43m \u001b[49m\u001b[43mgroup_keys\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgroup_keys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 8877\u001b[0m \u001b[43m \u001b[49m\u001b[43mobserved\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mobserved\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 8878\u001b[0m \u001b[43m \u001b[49m\u001b[43mdropna\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdropna\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 8879\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m/opt/mamba/lib/python3.10/site-packages/pandas/core/groupby/groupby.py:1278\u001b[0m, in \u001b[0;36mGroupBy.__init__\u001b[0;34m(self, obj, keys, axis, level, grouper, exclusions, selection, as_index, sort, group_keys, observed, dropna)\u001b[0m\n\u001b[1;32m 1275\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdropna \u001b[38;5;241m=\u001b[39m dropna\n\u001b[1;32m 1277\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m grouper \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[0;32m-> 1278\u001b[0m grouper, exclusions, obj \u001b[38;5;241m=\u001b[39m \u001b[43mget_grouper\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1279\u001b[0m \u001b[43m \u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1280\u001b[0m \u001b[43m \u001b[49m\u001b[43mkeys\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1281\u001b[0m \u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1282\u001b[0m \u001b[43m \u001b[49m\u001b[43mlevel\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlevel\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1283\u001b[0m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1284\u001b[0m \u001b[43m \u001b[49m\u001b[43mobserved\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mif\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mobserved\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01mis\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mlib\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mno_default\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01melse\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mobserved\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1285\u001b[0m \u001b[43m \u001b[49m\u001b[43mdropna\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdropna\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1286\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1288\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m observed \u001b[38;5;129;01mis\u001b[39;00m lib\u001b[38;5;241m.\u001b[39mno_default:\n\u001b[1;32m 1289\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28many\u001b[39m(ping\u001b[38;5;241m.\u001b[39m_passed_categorical \u001b[38;5;28;01mfor\u001b[39;00m ping \u001b[38;5;129;01min\u001b[39;00m grouper\u001b[38;5;241m.\u001b[39mgroupings):\n", - "File \u001b[0;32m/opt/mamba/lib/python3.10/site-packages/pandas/core/groupby/grouper.py:1009\u001b[0m, in \u001b[0;36mget_grouper\u001b[0;34m(obj, key, axis, level, sort, observed, validate, dropna)\u001b[0m\n\u001b[1;32m 1007\u001b[0m in_axis, level, gpr \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m, gpr, \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 1008\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1009\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(gpr)\n\u001b[1;32m 1010\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(gpr, Grouper) \u001b[38;5;129;01mand\u001b[39;00m gpr\u001b[38;5;241m.\u001b[39mkey \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1011\u001b[0m \u001b[38;5;66;03m# Add key to exclusions\u001b[39;00m\n\u001b[1;32m 1012\u001b[0m exclusions\u001b[38;5;241m.\u001b[39madd(gpr\u001b[38;5;241m.\u001b[39mkey)\n", - "\u001b[0;31mKeyError\u001b[0m: 'name_event_types'" - ] - } - ], - "source": [ - "event_counts = df_purchase.groupby('name_event_types')['customer_id'].nunique()\n", - "\n", - "event_counts.plot(kind='bar')\n", - "plt.xlabel(\"Type d'évènement\")\n", - "plt.ylabel('Nombre de consommateurs uniques')\n", - "plt.title(\"Nombre de consommateurs uniques par type d'évènement\")\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e37ad847-7ea5-4afe-9c6d-e07a668d2a27", - "metadata": {}, - "outputs": [], - "source": [ - "average_tickets_by_event = df_purchase.groupby('name_event_types')['nb_tickets'].mean()\n", - "\n", - "average_tickets_by_event.plot(kind='bar', figsize=(8, 5))\n", - "plt.xlabel(\"Type d'évènements\")\n", - "plt.ylabel('Nombre moyen de tickets achetés')\n", - "plt.title(\"Nombre moyen de tickets achetés par Type d'évènements\")\n", - "plt.xticks(rotation=45)\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e02b260a-fcb7-418b-87a8-de2bb4e6eb0a", - "metadata": {}, - "outputs": [], - "source": [ - "df_purchase.isna().sum()" - ] - }, - { - "cell_type": "markdown", - "id": "26fa888d-dd33-4990-89bd-6a9c1391098b", - "metadata": {}, - "source": [ - "## Modelisation K-means" - ] - }, - { - "cell_type": "code", - "execution_count": 242, - "id": "daef46cd-f6a5-4282-ac0a-83fde277edec", - "metadata": {}, - "outputs": [], - "source": [ - "df_purchase = df_purchase.fillna(0)" - ] - }, - { - "cell_type": "code", - "execution_count": 243, - "id": "e34437e6-a57d-4d10-ac62-5c43cdda6892", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/mamba/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " super()._check_params_vs_input(X, default_n_init=10)\n", - "/opt/mamba/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " super()._check_params_vs_input(X, default_n_init=10)\n", - "/opt/mamba/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " super()._check_params_vs_input(X, default_n_init=10)\n", - "/opt/mamba/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " super()._check_params_vs_input(X, default_n_init=10)\n", - "/opt/mamba/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " super()._check_params_vs_input(X, default_n_init=10)\n", - "/opt/mamba/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " super()._check_params_vs_input(X, default_n_init=10)\n", - "/opt/mamba/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " super()._check_params_vs_input(X, default_n_init=10)\n", - "/opt/mamba/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " super()._check_params_vs_input(X, default_n_init=10)\n", - "/opt/mamba/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " super()._check_params_vs_input(X, default_n_init=10)\n", - "/opt/mamba/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " super()._check_params_vs_input(X, default_n_init=10)\n" + "\u001b[0;31mClientError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[35], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m exec(\u001b[38;5;28mopen\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mutils_stat_desc.py\u001b[39m\u001b[38;5;124m'\u001b[39m)\u001b[38;5;241m.\u001b[39mread())\n\u001b[0;32m----> 2\u001b[0m \u001b[43mbox_plot_price_tickets\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtickets\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtype_of_activity\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m:357\u001b[0m, in \u001b[0;36mbox_plot_price_tickets\u001b[0;34m(tickets, type_of_activity)\u001b[0m\n", + "File \u001b[0;32m:62\u001b[0m, in \u001b[0;36msave_file_s3\u001b[0;34m(File_name, type_of_activity)\u001b[0m\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/fsspec/spec.py:1963\u001b[0m, in \u001b[0;36mAbstractBufferedFile.__exit__\u001b[0;34m(self, *args)\u001b[0m\n\u001b[1;32m 1962\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__exit__\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs):\n\u001b[0;32m-> 1963\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mclose\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/fsspec/spec.py:1930\u001b[0m, in \u001b[0;36mAbstractBufferedFile.close\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1928\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1929\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mforced:\n\u001b[0;32m-> 1930\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mflush\u001b[49m\u001b[43m(\u001b[49m\u001b[43mforce\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n\u001b[1;32m 1932\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfs \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 1933\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfs\u001b[38;5;241m.\u001b[39minvalidate_cache(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpath)\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/fsspec/spec.py:1801\u001b[0m, in \u001b[0;36mAbstractBufferedFile.flush\u001b[0;34m(self, force)\u001b[0m\n\u001b[1;32m 1798\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mclosed \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[1;32m 1799\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m\n\u001b[0;32m-> 1801\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_upload_chunk\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfinal\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mforce\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m:\n\u001b[1;32m 1802\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moffset \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuffer\u001b[38;5;241m.\u001b[39mseek(\u001b[38;5;241m0\u001b[39m, \u001b[38;5;241m2\u001b[39m)\n\u001b[1;32m 1803\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuffer \u001b[38;5;241m=\u001b[39m io\u001b[38;5;241m.\u001b[39mBytesIO()\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/s3fs/core.py:1252\u001b[0m, in \u001b[0;36mS3File._upload_chunk\u001b[0;34m(self, final)\u001b[0m\n\u001b[1;32m 1249\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mparts\u001b[38;5;241m.\u001b[39mappend({\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mPartNumber\u001b[39m\u001b[38;5;124m'\u001b[39m: part, \u001b[38;5;124m'\u001b[39m\u001b[38;5;124mETag\u001b[39m\u001b[38;5;124m'\u001b[39m: out[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mETag\u001b[39m\u001b[38;5;124m'\u001b[39m]})\n\u001b[1;32m 1251\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mautocommit \u001b[38;5;129;01mand\u001b[39;00m final:\n\u001b[0;32m-> 1252\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcommit\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1253\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m final\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/s3fs/core.py:1267\u001b[0m, in \u001b[0;36mS3File.commit\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1265\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuffer\u001b[38;5;241m.\u001b[39mseek(\u001b[38;5;241m0\u001b[39m)\n\u001b[1;32m 1266\u001b[0m data \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mbuffer\u001b[38;5;241m.\u001b[39mread()\n\u001b[0;32m-> 1267\u001b[0m write_result \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_s3\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1268\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43ms3\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mput_object\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1269\u001b[0m \u001b[43m \u001b[49m\u001b[43mKey\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkey\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mBucket\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbucket\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mBody\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdata\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mkwargs\u001b[49m\n\u001b[1;32m 1270\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1271\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mfs\u001b[38;5;241m.\u001b[39mversion_aware:\n\u001b[1;32m 1272\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mversion_id \u001b[38;5;241m=\u001b[39m write_result\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mVersionId\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/s3fs/core.py:1130\u001b[0m, in \u001b[0;36mS3File._call_s3\u001b[0;34m(self, method, *kwarglist, **kwargs)\u001b[0m\n\u001b[1;32m 1129\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_call_s3\u001b[39m(\u001b[38;5;28mself\u001b[39m, method, \u001b[38;5;241m*\u001b[39mkwarglist, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m-> 1130\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mfs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_call_s3\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmethod\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43ms3_additional_kwargs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwarglist\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1131\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/s3fs/core.py:200\u001b[0m, in \u001b[0;36mS3FileSystem._call_s3\u001b[0;34m(self, method, *akwarglist, **kwargs)\u001b[0m\n\u001b[1;32m 197\u001b[0m logger\u001b[38;5;241m.\u001b[39mdebug(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCALL: \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m - \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m - \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m (method\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__name__\u001b[39m, akwarglist, kw2))\n\u001b[1;32m 198\u001b[0m additional_kwargs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_s3_method_kwargs(method, \u001b[38;5;241m*\u001b[39makwarglist,\n\u001b[1;32m 199\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m--> 200\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmethod\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43madditional_kwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/botocore/client.py:553\u001b[0m, in \u001b[0;36mClientCreator._create_api_method.._api_call\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 549\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\n\u001b[1;32m 550\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mpy_operation_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m() only accepts keyword arguments.\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 551\u001b[0m )\n\u001b[1;32m 552\u001b[0m \u001b[38;5;66;03m# The \"self\" in this scope is referring to the BaseClient.\u001b[39;00m\n\u001b[0;32m--> 553\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_api_call\u001b[49m\u001b[43m(\u001b[49m\u001b[43moperation_name\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/mamba/lib/python3.11/site-packages/botocore/client.py:1009\u001b[0m, in \u001b[0;36mBaseClient._make_api_call\u001b[0;34m(self, operation_name, api_params)\u001b[0m\n\u001b[1;32m 1005\u001b[0m error_code \u001b[38;5;241m=\u001b[39m error_info\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mQueryErrorCode\u001b[39m\u001b[38;5;124m\"\u001b[39m) \u001b[38;5;129;01mor\u001b[39;00m error_info\u001b[38;5;241m.\u001b[39mget(\n\u001b[1;32m 1006\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCode\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 1007\u001b[0m )\n\u001b[1;32m 1008\u001b[0m error_class \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mexceptions\u001b[38;5;241m.\u001b[39mfrom_code(error_code)\n\u001b[0;32m-> 1009\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m error_class(parsed_response, operation_name)\n\u001b[1;32m 1010\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 1011\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parsed_response\n", + "\u001b[0;31mClientError\u001b[0m: An error occurred (InvalidAccessKeyId) when calling the PutObject operation: The Access Key Id you provided does not exist in our records." ] }, { "data": { - "image/png": "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8R1fREREJEFzc4M33jBvffrAo0dmG7Cwlcl++cXsnztzpnkDyJvXLGq9vc3ld//bKuDSJXNFtKgWjLCC5ReAtW/fnvbt20f53H8L1M2bN8d9IBEREZFEysPD7FMbEACDB8Pdu+ZobVhxe+AAHD9u3qJjGOYIcJcu8M47vPTFZS/L8uVsRURERMQayZJBtWowejTs2wfXr5tTC95999mvMwy4cAG2bYuXmM+kYlZEREREAPDxgTp1oEGDmO0fFBS3eWJCxayIiIiIRPD0RWCxsV9cUjErIiIiIhGUKWN2LYiuH63NBlmzmvtZTcWsiIiIiETg6mq234LIBW3Y4/Hjrb/4C1TMioiIiEgU6tY1229lzhxxe5YsCactFySA1lwiIiIikjDVrWu239q06QmrVx+ievUilC/vliBGZMOomBURERGRaLm6QkCAwb17lwgIKJygClnQNAMRERERcWAqZkVERETEYamYFRERERGHpWJWRERERByWilkRERERcVgqZkVERETEYamYFRERERGHpWJWRERERByWilkRERERcVgqZkVERETEYamYFRERERGHpWJWRERERByWilkRERERcVhuVgeIb4ZhAHD79m2LkyR+wcHB3L9/n9u3b+Pu7m51HIkHOufOSefd+eicO5/4PudhdVpY3fYsTlfM3rlzB4CsWbNanEREREREnuXOnTukTJnymfvYjJiUvIlIaGgoly9fJnny5NhsNqvjJGq3b98ma9asXLhwgRQpUlgdR+KBzrlz0nl3Pjrnzie+z7lhGNy5c4dMmTLh4vLsWbFONzLr4uJClixZrI7hVFKkSKG/7JyMzrlz0nl3Pjrnzic+z/nzRmTD6AIwEREREXFYKmZFRERExGGpmJU44+HhwcCBA/Hw8LA6isQTnXPnpPPufHTOnU9CPudOdwGYiIiIiCQeGpkVEREREYelYlZEREREHJaKWRERERFxWCpmRURERMRhqZiVWDdixAjeeOMNkidPTvr06Xn33Xc5ceKE1bEkHo0YMQKbzUaXLl2sjiJx6NKlSzRt2pQ0adLg7e1NkSJF2L9/v9WxJA49efKEzz77jBw5cuDl5UXOnDkZMmQIoaGhVkeTWLJ161Zq1apFpkyZsNlsLF++PMLzhmEwaNAgMmXKhJeXF+XKlePo0aPWhP1/KmYl1m3ZsoUOHTrwyy+/EBgY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y1K1alU+/fTTSM+5uLhgGEaEbcHBwZH2c3d3j/DYZrNFuS0mFyKF/eo7NDSUWrVqcejQoQi3P/74g7Jly4bvnzRp0uce8+njhjEMw67ODV5eXjHeF2L23Q0aNIijR49Ss2ZNNm7cSL58+Vi2bFm0xwwNDcXV1ZX9+/dH+E6OHz/OhAkTImT972ebNWsWu3btwt/fn8WLF5MnTx5++eWXKN8nTZo02Gy2KC8OzJUrF6+99hozZ86M9oK7v//+m3Tp0kX7OUTEcaiYFRGHMHLkSH766Sd27twZYXu6dOm4cuVKhKIsNvuoPl1MPXnyhP379/Paa68B8Prrr3P06FH8/Px45ZVXItxiWsACpEiRgkyZMkVqF7Vz507y5s0b4+Pkzp0bLy+vGLftSpcuHXfu3OHevXvh26L67vLkyUPXrl1Zt24ddevWZdasWYA5uhoSEhJh36JFixISEsLVq1cjfScZM2Z8bqaiRYvSt29fdu7cSYECBViwYEGU+yVJkoR8+fJx7NixSM+lTZuWjRs3curUKRo2bBipQD916hQPHz6kaNGiz80jIgmfilkRcQgFCxakSZMmkVoqlStXjmvXrjF69GhOnTrFpEmTWL16day976RJk1i2bBm///47HTp04ObNm7Rq1QqADh068Pfff9OoUSP27NnD6dOnWbduHa1atYpU5D1Pz549GTVqFIsXL+bEiRP06dOHQ4cO0blz5xgfw9PTk969e9OrVy/mzp3LqVOn+OWXX5gxY0aU+5coUQJvb28+/fRT/vzzTxYsWMDs2bPDn3/w4AEdO3Zk8+bNnDt3jh07drB3797wAtvPz4+7d++yYcMGrl+/zv3798mTJw9NmjShWbNmLF26lDNnzrB3715GjRrFqlWros1+5swZ+vbty65duzh37hzr1q3j5MmTzyzmq1atGm2/2PTp07Nx40Z+//13GjVqxJMnT8Kf27ZtGzlz5nzmdAkRcRwqZkXEYQwdOjTSr8Xz5s3L5MmTmTRpEoULF2bPnj3RXun/IkaOHMmoUaMoXLgw27Zt43//+x9p06YFIFOmTOzYsYOQkBCqVq1KgQIF6Ny5MylTpowwPzcmOnXqRPfu3enevTsFCxZkzZo1rFixgty5c9t1nP79+9O9e3cGDBhA3rx5adiwYaR5wGF8fHz47rvvWLVqFQULFmThwoURWn65urpy48YNmjVrRp48eWjQoAHVq1dn8ODBAPj7+9OuXTsaNmxIunTpGD16NGBOF2jWrBndu3fn1VdfpXbt2uzevZusWbNGm9vb25vff/+devXqkSdPHj788EM6duzIRx99FO1r2rZty6pVq7h161aUz2fMmJGNGzfy22+/0aRJk/B/YCxcuJC2bds+83sUEcdhM/77fwYREREH0aBBg/CpCTFx5MgRKlasyMmTJ0mZMmUcpxOR+KCRWRERcVhjxoyJsptEdC5fvszcuXNVyIokIhqZFRERERGHpZFZEREREXFYKmZFRERExGGpmBURERERh6ViVkREREQclopZEREREXFYKmZFRERExGGpmBURERERh6ViVkREREQclopZEREREXFY/wfr19eniXWGAwAAAABJRU5ErkJggg==", "text/plain": [ - "
" + "
" ] }, "metadata": {}, @@ -8363,106 +218,8 @@ } ], "source": [ - "from sklearn.cluster import KMeans\n", - "from sklearn.preprocessing import StandardScaler\n", - "\n", - "columns_for_clustering = ['gender', 'is_partner', 'is_email_true', 'nb_campaigns', 'nb_campaigns_opened', 'fidelity', 'nb_tickets', 'ticket_sum', 'average_price', 'amount']\n", - "\n", - "scaler = StandardScaler()\n", - "X = scaler.fit_transform(df_purchase[columns_for_clustering])\n", - "\n", - "inertia = []\n", - "for i in range(1, 11):\n", - " kmeans = KMeans(n_clusters=i, random_state=42)\n", - " kmeans.fit(X)\n", - " inertia.append(kmeans.inertia_)\n", - "\n", - "# Plot the elbow curve to find the optimal k\n", - "plt.figure(figsize=(8, 6))\n", - "plt.plot(range(1, 11), inertia, marker='o', linestyle='-', color='b')\n", - "plt.xlabel('Number of clusters (k)')\n", - "plt.ylabel('Inertia (Within-cluster sum of squares)')\n", - "plt.title('Elbow Method for Optimal k')\n", - "plt.grid()\n", - "plt.show()" - ] - }, - { - "cell_type": "code", - "execution_count": 246, - "id": "4da7d97e-9128-4e4a-a454-1451d2dfee40", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/mamba/lib/python3.10/site-packages/sklearn/cluster/_kmeans.py:1416: FutureWarning: The default value of `n_init` will change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly to suppress the warning\n", - " super()._check_params_vs_input(X, default_n_init=10)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Cluster 1:\n", - "gender 0.893962\n", - "is_partner 0.000000\n", - "is_email_true 1.000000\n", - "nb_campaigns 231.270802\n", - "nb_campaigns_opened 99.261042\n", - "fidelity 30.193383\n", - "nb_tickets 10.965757\n", - "ticket_sum 2604.072622\n", - "average_price 9.781489\n", - "amount 16.114144\n", - "Name: 0, dtype: float64\n", - "Size: 6045\n", - "\n", - "Cluster 2:\n", - "gender 1.999420e+00\n", - "is_partner 0.000000e+00\n", - "is_email_true 9.998067e-01\n", - "nb_campaigns 1.048816e-02\n", - "nb_campaigns_opened 1.159981e-03\n", - "fidelity 3.305112e+05\n", - "nb_tickets 6.141087e+01\n", - "ticket_sum 1.253568e+06\n", - "average_price 7.031328e+00\n", - "amount 6.880643e+00\n", - "Name: 1, dtype: float64\n", - "Size: 20690\n", - "\n", - "Cluster 3:\n", - "gender 1.311996\n", - "is_partner 0.000000\n", - "is_email_true 0.982297\n", - "nb_campaigns 11.520089\n", - "nb_campaigns_opened 2.922872\n", - "fidelity 4.664367\n", - "nb_tickets 4.819549\n", - "ticket_sum 184.855712\n", - "average_price 9.696602\n", - "amount 11.980846\n", - "Name: 2, dtype: float64\n", - "Size: 101623\n", - "\n" - ] - } - ], - "source": [ - "k = 3 \n", - "\n", - "kmeans = KMeans(n_clusters=k, random_state=42)\n", - "df_purchase['cluster'] = kmeans.fit_predict(X)\n", - "\n", - "cluster_means = df_purchase.groupby('cluster')[columns_for_clustering].mean()\n", - "cluster_sizes = df_purchase['cluster'].value_counts()\n", - "\n", - "for cluster in range(k):\n", - " print(f\"Cluster {cluster + 1}:\")\n", - " print(cluster_means.loc[cluster])\n", - " print(f\"Size: {cluster_sizes[cluster]}\\n\")" + "exec(open('utils_stat_desc.py').read())\n", + "box_plot_price_tickets(tickets, type_of_activity)" ] } ], @@ -8482,7 +239,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.13" + "version": "3.11.6" } }, "nbformat": 4, diff --git a/utils_stat_desc.py b/utils_stat_desc.py index e50b9f7..7eedd9c 100644 --- a/utils_stat_desc.py +++ b/utils_stat_desc.py @@ -326,18 +326,33 @@ def tickets_internet(tickets, type_of_activity): plt.bar(nb_tickets_internet["number_company"], nb_tickets_internet["prop_purchases_internet"]) plt.xlabel('Company') - plt.ylabel("Share of Tickets Bought Online") - plt.title(f"Share of Tickets Bought Online for {type_of_activity}") + plt.ylabel("Share of Purchases Bought Online") + plt.title(f"Share of Purchases Bought Online for {type_of_activity}") plt.xticks(nb_tickets_internet["number_company"], ["{}".format(i) for i in nb_tickets_internet["number_company"]]) plt.show() save_file_s3("tickets_internet_", type_of_activity) +def already_bought_online(tickets, type_of_activity): + nb_consumers_online = (tickets.groupby("number_company").agg({'achat_internet' : 'sum', + 'customer_id' : 'nunique'} + ).reset_index()) + nb_consumers_online["Share_consumers_internet"] = nb_consumers_online["achat_internet"]/ nb_consumers_online["customer_id"] + + plt.bar(nb_consumers_online["number_company"], nb_consumers_online["Share_consumers_internet"]) + + plt.xlabel('Company') + plt.ylabel("Share of Customer who Bought Online at least once") + plt.title(f"Share of Customer who Bought Online at least once for {type_of_activity}") + plt.xticks(nb_consumers_online["number_company"], ["{}".format(i) for i in nb_consumers_online["number_company"]]) + plt.show() + save_file_s3("First_buy_internet_", type_of_activity) + + def box_plot_price_tickets(tickets, type_of_activity): price_tickets = tickets[(tickets['total_amount'] > 0)] sns.boxplot(data=price_tickets, y="total_amount", x="number_company", showfliers=False, showmeans=True) plt.title(f"Box plot of price tickets for {type_of_activity}") - plt.xticks(price_tickets["number_company"], ["{}".format(i) for i in price_tickets["number_company"]]) plt.show() save_file_s3("box_plot_price_tickets_", type_of_activity)