BDC-team-1/Notebook_AR.ipynb
2024-02-06 10:16:42 +00:00

8600 lines
434 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"id": "455cc769-1b3b-4fef-b395-e74a988ceed3",
"metadata": {},
"source": [
"## Notebook Alexis"
]
},
{
"cell_type": "code",
"execution_count": 98,
"id": "20eeb149-6618-4ef2-9cfd-ff062950f36c",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import os\n",
"import s3fs"
]
},
{
"cell_type": "code",
"execution_count": 99,
"id": "30494c5e-9649-4fff-8708-617544188b20",
"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": 99,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 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. "
]
},
{
"cell_type": "code",
"execution_count": 100,
"id": "f1cce705-46e1-42de-8e93-2ee15312d288",
"metadata": {},
"outputs": [],
"source": [
"directory_path = '8'"
]
},
{
"cell_type": "code",
"execution_count": 101,
"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": 102,
"id": "65cb38ad-52ae-4266-85d8-c47d81b00283",
"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": 103,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>name</th>\n",
" <th>service_id</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>process_id</th>\n",
" <th>report_url</th>\n",
" <th>category</th>\n",
" <th>to_be_synced</th>\n",
" <th>identifier</th>\n",
" <th>sent_at</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>#LOUSFP RELANCE P'TITS LOU</td>\n",
" <td>1436</td>\n",
" <td>2022-02-01 15:22:53.564432+01:00</td>\n",
" <td>2022-02-01 15:22:53.564432+01:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>False</td>\n",
" <td>eaa32c96f620053cf442ad32258076b9</td>\n",
" <td>2022-01-31 00:00:00+01:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>#LOUSFP BRASSERIE ACHETEURS</td>\n",
" <td>1435</td>\n",
" <td>2022-02-01 15:22:53.572592+01:00</td>\n",
" <td>2022-02-01 15:22:53.572592+01:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>False</td>\n",
" <td>1f3202d820180a39f736f20fce790de8</td>\n",
" <td>2022-01-31 00:00:00+01:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>PRESSE. LOU/SF Paris - RDV et protocole</td>\n",
" <td>1433</td>\n",
" <td>2022-02-01 15:22:53.578426+01:00</td>\n",
" <td>2022-02-01 15:22:53.578426+01:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>False</td>\n",
" <td>b069b3415151fa7217e870017374de7c</td>\n",
" <td>2022-01-31 00:00:00+01:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>#LOUSFP ÉTUDIANTS</td>\n",
" <td>1432</td>\n",
" <td>2022-02-01 15:22:53.584235+01:00</td>\n",
" <td>2022-02-01 15:22:53.584235+01:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>False</td>\n",
" <td>56468d5607a5aaf1604ff5e15593b003</td>\n",
" <td>2022-01-27 00:00:00+01:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>#LOUSFP P'TITS LOU</td>\n",
" <td>1431</td>\n",
" <td>2022-02-01 15:22:53.590187+01:00</td>\n",
" <td>2022-02-01 15:22:53.590187+01:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>False</td>\n",
" <td>e11943a6031a0e6114ae69c257617980</td>\n",
" <td>2022-01-27 00:00:00+01:00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 103,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"campaigns = display_databases(\"8campaigns.csv\")\n",
"campaigns.head()"
]
},
{
"cell_type": "code",
"execution_count": 104,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>campaign_id</th>\n",
" <th>customer_id</th>\n",
" <th>opened_at</th>\n",
" <th>sent_at</th>\n",
" <th>delivered_at</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>5</td>\n",
" <td>161410</td>\n",
" <td>2022-02-02 18:16:07+01:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2022-02-02 17:16:08.616899+01:00</td>\n",
" <td>2022-02-02 17:16:08.623098+01:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>54228</td>\n",
" <td>2022-02-02 18:18:11+01:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2022-02-02 17:18:12.030260+01:00</td>\n",
" <td>2022-02-02 17:18:12.036606+01:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>6</td>\n",
" <td>120794</td>\n",
" <td>2022-02-02 18:18:58+01:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2022-02-02 17:19:00.129697+01:00</td>\n",
" <td>2022-02-02 17:19:00.134704+01:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>3</td>\n",
" <td>467025</td>\n",
" <td>2022-02-02 18:19:33+01:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2022-02-02 17:19:34.023492+01:00</td>\n",
" <td>2022-02-02 17:19:34.027570+01:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>2</td>\n",
" <td>142106</td>\n",
" <td>2022-02-02 18:19:35+01:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2022-02-02 17:19:36.553321+01:00</td>\n",
" <td>2022-02-02 17:19:36.557473+01:00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 104,
"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": 105,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>clicked_at</th>\n",
" <th>link_id</th>\n",
" <th>customer_id</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>2022-02-02 18:33:17+01:00</td>\n",
" <td>1</td>\n",
" <td>62137</td>\n",
" <td>2022-02-02 17:33:19.237759+01:00</td>\n",
" <td>2022-02-02 17:33:19.237759+01:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>2022-02-02 18:33:26+01:00</td>\n",
" <td>1</td>\n",
" <td>556048</td>\n",
" <td>2022-02-02 17:33:28.101943+01:00</td>\n",
" <td>2022-02-02 17:33:28.101943+01:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>2022-02-02 18:33:49+01:00</td>\n",
" <td>2</td>\n",
" <td>194456</td>\n",
" <td>2022-02-02 17:33:50.595125+01:00</td>\n",
" <td>2022-02-02 17:33:50.595125+01:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>2022-02-02 18:34:19+01:00</td>\n",
" <td>1</td>\n",
" <td>194456</td>\n",
" <td>2022-02-02 17:34:20.493986+01:00</td>\n",
" <td>2022-02-02 17:34:20.493986+01:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>2022-02-02 18:34:21+01:00</td>\n",
" <td>2</td>\n",
" <td>21571</td>\n",
" <td>2022-02-02 17:34:22.300427+01:00</td>\n",
" <td>2022-02-02 17:34:22.300427+01:00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 105,
"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": 106,
"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_703/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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>lastname</th>\n",
" <th>firstname</th>\n",
" <th>birthdate</th>\n",
" <th>email</th>\n",
" <th>street_id</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>civility</th>\n",
" <th>is_partner</th>\n",
" <th>...</th>\n",
" <th>preferred_category</th>\n",
" <th>preferred_supplier</th>\n",
" <th>preferred_formula</th>\n",
" <th>purchase_count</th>\n",
" <th>first_buying_date</th>\n",
" <th>last_visiting_date</th>\n",
" <th>zipcode</th>\n",
" <th>country</th>\n",
" <th>age</th>\n",
" <th>tenant_id</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1411166</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>email1411166</td>\n",
" <td>1</td>\n",
" <td>2022-12-19 15:03:39.419371+01:00</td>\n",
" <td>2022-12-19 15:03:39.419371+01:00</td>\n",
" <td>NaN</td>\n",
" <td>False</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>fr</td>\n",
" <td>NaN</td>\n",
" <td>1594</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>478498</td>\n",
" <td>lastname478498</td>\n",
" <td>firstname478498</td>\n",
" <td>NaN</td>\n",
" <td>email478498</td>\n",
" <td>339167</td>\n",
" <td>2021-09-17 18:58:30.259053+02:00</td>\n",
" <td>2023-06-28 15:25:24.146689+02:00</td>\n",
" <td>NaN</td>\n",
" <td>False</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>1594</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>473678</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>email473678</td>\n",
" <td>339167</td>\n",
" <td>2021-09-17 18:44:04.119713+02:00</td>\n",
" <td>2021-09-17 18:44:04.124204+02:00</td>\n",
" <td>NaN</td>\n",
" <td>False</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>1594</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>475026</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>email475026</td>\n",
" <td>339167</td>\n",
" <td>2021-09-17 18:47:28.789618+02:00</td>\n",
" <td>2021-09-17 18:47:28.793958+02:00</td>\n",
" <td>NaN</td>\n",
" <td>False</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>1594</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>487146</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>email487146</td>\n",
" <td>339167</td>\n",
" <td>2021-09-17 19:10:24.070460+02:00</td>\n",
" <td>2021-09-17 19:10:24.076033+02:00</td>\n",
" <td>NaN</td>\n",
" <td>False</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>1594</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 43 columns</p>\n",
"</div>"
],
"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": 106,
"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": 107,
"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": 108,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>customer_id</th>\n",
" <th>target_id</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>name</th>\n",
" <th>extra_field</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>460062</td>\n",
" <td>68</td>\n",
" <td>2021-09-17 20:20:24.562734+02:00</td>\n",
" <td>2021-09-17 20:20:24.562734+02:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>460056</td>\n",
" <td>68</td>\n",
" <td>2021-09-17 20:20:24.610139+02:00</td>\n",
" <td>2021-09-17 20:20:24.610139+02:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>460051</td>\n",
" <td>65</td>\n",
" <td>2021-09-17 20:20:24.641381+02:00</td>\n",
" <td>2021-09-17 20:20:24.641381+02:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>460051</td>\n",
" <td>66</td>\n",
" <td>2021-09-17 20:20:24.672238+02:00</td>\n",
" <td>2021-09-17 20:20:24.672238+02:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>460049</td>\n",
" <td>71</td>\n",
" <td>2021-09-17 20:20:24.703110+02:00</td>\n",
" <td>2021-09-17 20:20:24.703110+02:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 108,
"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": 109,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>target_type_id</th>\n",
" <th>name</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>ÉTUDIANTS (OPÉ PANIERS) 21-22</td>\n",
" <td>2021-09-17 18:10:40.879995+02:00</td>\n",
" <td>2021-09-17 18:10:40.879995+02:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>EFFECTIF + STAFF 21-22</td>\n",
" <td>2021-09-17 18:10:40.894758+02:00</td>\n",
" <td>2021-09-17 18:10:40.894758+02:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>Acheteurs LOU / USAP</td>\n",
" <td>2021-09-17 18:10:40.911969+02:00</td>\n",
" <td>2021-09-17 18:10:40.911969+02:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>Liste Compensation 21-22</td>\n",
" <td>2021-09-17 18:10:40.928796+02:00</td>\n",
" <td>2021-09-17 18:10:40.928796+02:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>Partenaires 21-22</td>\n",
" <td>2021-09-17 18:10:40.945476+02:00</td>\n",
" <td>2021-09-17 18:10:40.945476+02:00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 109,
"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": 110,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>is_import</th>\n",
" <th>name</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>manual_static_filter</td>\n",
" <td>2021-09-17 18:10:40.864320+02:00</td>\n",
" <td>2021-09-17 18:10:40.864320+02:00</td>\n",
" <td>e34e3aa838a6eb4c41df6ed4444b796a</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>False</td>\n",
" <td>manual_dynamic_filter</td>\n",
" <td>2022-03-09 14:41:45.695407+01:00</td>\n",
" <td>2022-03-09 14:41:45.695407+01:00</td>\n",
" <td>e0f4b8693184850fefd6d2a38f10584e</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>False</td>\n",
" <td>manual_static_filter</td>\n",
" <td>2022-04-01 17:02:49.588910+02:00</td>\n",
" <td>2022-04-01 17:02:49.588910+02:00</td>\n",
" <td>fb27e81baa4debc6a4e1a8639c20e808</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>True</td>\n",
" <td>manual_import</td>\n",
" <td>2022-05-06 14:26:01.923160+02:00</td>\n",
" <td>2022-05-06 14:26:01.923160+02:00</td>\n",
" <td>12213df2ce68a624e4c0070521437bac</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 110,
"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": 111,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>purchase_date</th>\n",
" <th>customer_id</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>number</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>119609</td>\n",
" <td>2017-09-09 15:39:45.913000+02:00</td>\n",
" <td>1149</td>\n",
" <td>2021-06-29 21:52:21.816195+02:00</td>\n",
" <td>2021-06-29 21:52:21.816195+02:00</td>\n",
" <td>193416</td>\n",
" <td>f2956e2d53321317e7c15c1cb992156c</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>119610</td>\n",
" <td>2017-09-09 15:39:46.033000+02:00</td>\n",
" <td>1149</td>\n",
" <td>2021-06-29 21:52:21.817846+02:00</td>\n",
" <td>2021-06-29 21:52:21.817846+02:00</td>\n",
" <td>193416</td>\n",
" <td>faabab441b2668a85bb484490b2166c3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>5464</td>\n",
" <td>2017-07-24 19:44:11.923000+02:00</td>\n",
" <td>1251</td>\n",
" <td>2021-06-29 21:33:45.604224+02:00</td>\n",
" <td>2021-06-29 21:33:45.604224+02:00</td>\n",
" <td>184354</td>\n",
" <td>f63c69fa585ce4f91681f0d9ebeb770f</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>119613</td>\n",
" <td>2017-09-10 11:25:45.820000+02:00</td>\n",
" <td>12558</td>\n",
" <td>2021-06-29 21:52:21.822033+02:00</td>\n",
" <td>2021-06-29 21:52:21.822033+02:00</td>\n",
" <td>193462</td>\n",
" <td>ffce5fd8d2348eb6885d0ee9c7bd017c</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1422860</td>\n",
" <td>2018-10-08 10:30:42.980000+02:00</td>\n",
" <td>17935</td>\n",
" <td>2021-07-16 04:20:55.347369+02:00</td>\n",
" <td>2021-07-16 04:20:55.347369+02:00</td>\n",
" <td>247459</td>\n",
" <td>193e41eae8ee078537107a569c0426ef</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 111,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"purchases = display_databases(\"8purchases.csv\")\n",
"purchases.head()"
]
},
{
"cell_type": "code",
"execution_count": 112,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>number</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>purchase_id</th>\n",
" <th>product_id</th>\n",
" <th>is_from_subscription</th>\n",
" <th>type_of</th>\n",
" <th>supplier_id</th>\n",
" <th>barcode</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>254164</td>\n",
" <td>193416_763837_650_688_326212</td>\n",
" <td>2021-06-29 21:53:14.951871+02:00</td>\n",
" <td>2021-06-29 21:53:14.951871+02:00</td>\n",
" <td>119609</td>\n",
" <td>3334</td>\n",
" <td>False</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>NaN</td>\n",
" <td>9ec3b5617fc54512acf131aa5fa26870</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>254165</td>\n",
" <td>193416_763838_650_688_326236</td>\n",
" <td>2021-06-29 21:53:14.953717+02:00</td>\n",
" <td>2021-06-29 21:53:14.953717+02:00</td>\n",
" <td>119610</td>\n",
" <td>3334</td>\n",
" <td>False</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>NaN</td>\n",
" <td>b227c664e2574a919672683f5cc4c98e</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>254168</td>\n",
" <td>193462_763921_649_687_305676</td>\n",
" <td>2021-06-29 21:53:14.958207+02:00</td>\n",
" <td>2021-06-29 21:53:14.958207+02:00</td>\n",
" <td>119613</td>\n",
" <td>3432</td>\n",
" <td>False</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>NaN</td>\n",
" <td>28ac507ad84a30993bdfc0996fd2476b</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>254169</td>\n",
" <td>193462_763922_649_687_305653</td>\n",
" <td>2021-06-29 21:53:14.959681+02:00</td>\n",
" <td>2021-06-29 21:53:14.959681+02:00</td>\n",
" <td>119614</td>\n",
" <td>3268</td>\n",
" <td>False</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>NaN</td>\n",
" <td>131dbaeef23f5ac2271bf0266ce35476</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>254170</td>\n",
" <td>193462_763923_649_687_305630</td>\n",
" <td>2021-06-29 21:53:14.961157+02:00</td>\n",
" <td>2021-06-29 21:53:14.961157+02:00</td>\n",
" <td>119615</td>\n",
" <td>3268</td>\n",
" <td>False</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>NaN</td>\n",
" <td>1a6342ad2c213b626aa55e5374cd661a</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 112,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"tickets = display_databases(\"8tickets.csv\")\n",
"tickets.head()"
]
},
{
"cell_type": "code",
"execution_count": 113,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>name</th>\n",
" <th>manually_added</th>\n",
" <th>label</th>\n",
" <th>itr</th>\n",
" <th>updated_at</th>\n",
" <th>created_at</th>\n",
" <th>commission</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>152</td>\n",
" <td>plateformeceweb</td>\n",
" <td>False</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2021-07-16 00:02:17.805193+02:00</td>\n",
" <td>2021-07-16 00:02:17.805193+02:00</td>\n",
" <td>NaN</td>\n",
" <td>0fc934f49bfa9f1f4e6ab7e2593b6839</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>6</td>\n",
" <td>accreditation annuelle</td>\n",
" <td>False</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2021-06-29 21:33:14.138349+02:00</td>\n",
" <td>2021-06-29 21:33:14.138349+02:00</td>\n",
" <td>NaN</td>\n",
" <td>fe13238540e0ff293ec8aad29aeae6c3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>68</td>\n",
" <td>abonnement parking</td>\n",
" <td>False</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2021-06-29 22:10:31.167367+02:00</td>\n",
" <td>2021-06-29 22:10:31.167367+02:00</td>\n",
" <td>NaN</td>\n",
" <td>0f7defc52a97cdca533af74f4e6e5b1e</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>9</td>\n",
" <td>accreditation match</td>\n",
" <td>False</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2021-06-29 21:33:14.142084+02:00</td>\n",
" <td>2021-06-29 21:33:14.142084+02:00</td>\n",
" <td>NaN</td>\n",
" <td>40e19a7c4824eaad298e0107ed7e3691</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>154</td>\n",
" <td>web lnr-lou</td>\n",
" <td>False</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2021-07-16 00:02:17.806521+02:00</td>\n",
" <td>2021-07-16 00:02:17.806521+02:00</td>\n",
" <td>NaN</td>\n",
" <td>b144dd617807b02e0d9002fac6c61768</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 113,
"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": 114,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>amount</th>\n",
" <th>is_full_price</th>\n",
" <th>representation_id</th>\n",
" <th>pricing_formula_id</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>category_id</th>\n",
" <th>apply_price</th>\n",
" <th>products_group_id</th>\n",
" <th>product_pack_id</th>\n",
" <th>extra_field</th>\n",
" <th>amount_consumption</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>90013</td>\n",
" <td>0.0</td>\n",
" <td>False</td>\n",
" <td>1961</td>\n",
" <td>912</td>\n",
" <td>2021-07-16 04:56:05.797551+02:00</td>\n",
" <td>2021-07-16 04:56:05.797551+02:00</td>\n",
" <td>34</td>\n",
" <td>0.0</td>\n",
" <td>87917</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>476e111175b1660688b7c13dade2b57e</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>662</td>\n",
" <td>0.0</td>\n",
" <td>False</td>\n",
" <td>11</td>\n",
" <td>29</td>\n",
" <td>2021-06-29 21:33:17.389201+02:00</td>\n",
" <td>2021-06-29 21:33:17.389201+02:00</td>\n",
" <td>16</td>\n",
" <td>0.0</td>\n",
" <td>640</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>2c765698e9bedd48e8a3fd27dc8dbc97</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>646</td>\n",
" <td>0.0</td>\n",
" <td>False</td>\n",
" <td>46</td>\n",
" <td>10</td>\n",
" <td>2021-06-29 21:33:17.366742+02:00</td>\n",
" <td>2021-06-29 21:33:17.366742+02:00</td>\n",
" <td>15</td>\n",
" <td>0.0</td>\n",
" <td>624</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>4e719148651fd7f175e3fb51bdb5d31b</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5703</td>\n",
" <td>5.0</td>\n",
" <td>False</td>\n",
" <td>7</td>\n",
" <td>188</td>\n",
" <td>2021-06-29 21:52:09.374365+02:00</td>\n",
" <td>2021-06-29 21:52:09.374365+02:00</td>\n",
" <td>4</td>\n",
" <td>0.0</td>\n",
" <td>5540</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>e4d7beeb0a631e2e51e61951623ba9b1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>648</td>\n",
" <td>0.0</td>\n",
" <td>False</td>\n",
" <td>49</td>\n",
" <td>10</td>\n",
" <td>2021-06-29 21:33:17.369471+02:00</td>\n",
" <td>2021-06-29 21:33:17.369471+02:00</td>\n",
" <td>15</td>\n",
" <td>0.0</td>\n",
" <td>626</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>07a5dd9e125345b9458651ab73605255</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 114,
"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": 115,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>name</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>extra_field</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>7</td>\n",
" <td>visite stade enfant</td>\n",
" <td>2021-06-29 21:33:14.160728+02:00</td>\n",
" <td>2021-06-29 21:33:14.160728+02:00</td>\n",
" <td>NaN</td>\n",
" <td>bbc80e5761a0ea325f6f6a5411752659</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>3229</td>\n",
" <td>tarif bloc etudiants</td>\n",
" <td>2021-07-16 04:20:46.684601+02:00</td>\n",
" <td>2021-09-03 16:44:46.096785+02:00</td>\n",
" <td>NaN</td>\n",
" <td>205122cc7e96d559330972b0ec0cf35a</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>42</td>\n",
" <td>invitation eiffage</td>\n",
" <td>2021-06-29 21:33:14.204483+02:00</td>\n",
" <td>2021-06-29 21:33:14.204483+02:00</td>\n",
" <td>NaN</td>\n",
" <td>e4e6365c02e2a7b01ebe2ce8ace624f2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4379</td>\n",
" <td>invitation offre speciale</td>\n",
" <td>2021-07-16 05:21:44.984893+02:00</td>\n",
" <td>2021-07-16 05:21:44.984893+02:00</td>\n",
" <td>NaN</td>\n",
" <td>307817b6205535a35915a64027ee161e</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2641</td>\n",
" <td>prevente reabo enfant</td>\n",
" <td>2021-07-16 03:47:40.896805+02:00</td>\n",
" <td>2021-09-03 16:08:35.304298+02:00</td>\n",
" <td>NaN</td>\n",
" <td>478eb63c71ba35d8d3d64c8637dafdee</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 115,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pricing_formulas = display_databases(\"8pricing_formulas.csv\")\n",
"pricing_formulas.head()"
]
},
{
"cell_type": "code",
"execution_count": 116,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>type_of_id</th>\n",
" <th>pricing_formula_id</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>7</td>\n",
" <td>1021</td>\n",
" <td>2021-09-03 14:17:19.816110+02:00</td>\n",
" <td>2021-09-03 14:17:19.816110+02:00</td>\n",
" <td>41047fbeb7cd3e1cb2713c608d2f786d</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>7</td>\n",
" <td>4305</td>\n",
" <td>2021-09-03 14:17:19.848088+02:00</td>\n",
" <td>2021-09-03 14:17:19.848088+02:00</td>\n",
" <td>a62a4dad7d62738129244bbb5ede0747</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>7</td>\n",
" <td>4306</td>\n",
" <td>2021-09-03 14:17:19.864067+02:00</td>\n",
" <td>2021-09-03 14:17:19.864067+02:00</td>\n",
" <td>c3770373e09f55412068c447736d9da3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>7</td>\n",
" <td>29</td>\n",
" <td>2021-09-03 14:17:19.880078+02:00</td>\n",
" <td>2021-09-03 14:17:19.880078+02:00</td>\n",
" <td>7b7b1242ae7a8c9eb66d35d8a4348ccd</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>8</td>\n",
" <td>10</td>\n",
" <td>2021-09-03 14:18:03.616081+02:00</td>\n",
" <td>2021-09-03 14:18:03.616081+02:00</td>\n",
" <td>0a2b941c46b31258c03b316aa064e86a</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 116,
"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": 117,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>name</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>extra_field</th>\n",
" <th>quota</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>653</td>\n",
" <td>acces village implid</td>\n",
" <td>2021-07-16 00:04:37.181331+02:00</td>\n",
" <td>2021-07-16 00:04:37.181331+02:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>c447d053646a6503d3cd84d4798bf5b7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>805</td>\n",
" <td>parking organisation</td>\n",
" <td>2021-07-16 01:54:15.822407+02:00</td>\n",
" <td>2021-07-16 01:54:15.822407+02:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>02bf9871964345f505ad305080daec36</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>809</td>\n",
" <td>rose rouge orange</td>\n",
" <td>2021-07-16 01:54:15.825345+02:00</td>\n",
" <td>2021-07-16 01:54:15.825345+02:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>31fb5b57bc1a2bcd5c155fb0d9e7c0dd</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2183</td>\n",
" <td>2eme catégorie j.b. centrale</td>\n",
" <td>2021-07-16 04:37:25.446835+02:00</td>\n",
" <td>2021-07-16 04:37:25.446835+02:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>c9eb6651caaed42b809b3f4407a847c9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>621</td>\n",
" <td>acces brasserie</td>\n",
" <td>2021-07-16 00:02:17.249701+02:00</td>\n",
" <td>2021-07-16 00:02:17.249701+02:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>349e6a59585d78d80d46acbc6a520c50</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 117,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"categories = display_databases(\"8categories.csv\")\n",
"categories.head()"
]
},
{
"cell_type": "code",
"execution_count": 118,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>type_of_id</th>\n",
" <th>category_id</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>2021-08-20 15:22:05.558209+02:00</td>\n",
" <td>2021-08-20 15:22:05.558209+02:00</td>\n",
" <td>af8fa6d57f6b19a7600a69e7771c7c3a</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>2021-09-02 17:29:32.582002+02:00</td>\n",
" <td>2021-09-02 17:29:32.582002+02:00</td>\n",
" <td>63718e7ad306912427758ddf988ad34f</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>2021-09-02 17:32:38.299733+02:00</td>\n",
" <td>2021-09-02 17:32:38.299733+02:00</td>\n",
" <td>5e147d4d90888df14c4584f5c6887c96</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>2021-09-02 17:35:04.748993+02:00</td>\n",
" <td>2021-09-02 17:35:04.748993+02:00</td>\n",
" <td>a9dfdc3f40b41e3018933c6167fc38a5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" <td>17</td>\n",
" <td>2021-09-02 17:35:37.396740+02:00</td>\n",
" <td>2021-09-02 17:35:37.396740+02:00</td>\n",
" <td>c05b0061d2a875adbc35d3dfa6a50a12</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 118,
"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": 119,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>representation_id</th>\n",
" <th>category_id</th>\n",
" <th>expected_filling</th>\n",
" <th>max_filling</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>561</td>\n",
" <td>2021-06-29 21:33:14.096827+02:00</td>\n",
" <td>2021-06-29 21:33:14.096827+02:00</td>\n",
" <td>17</td>\n",
" <td>37</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>571</td>\n",
" <td>2021-06-29 21:33:14.110047+02:00</td>\n",
" <td>2021-06-29 21:33:14.110047+02:00</td>\n",
" <td>14</td>\n",
" <td>39</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>9665</td>\n",
" <td>2021-07-16 00:02:17.736387+02:00</td>\n",
" <td>2021-07-16 00:02:17.736387+02:00</td>\n",
" <td>1887</td>\n",
" <td>8</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>383906</td>\n",
" <td>2023-03-04 02:55:01.585418+01:00</td>\n",
" <td>2023-03-04 02:55:01.585418+01:00</td>\n",
" <td>52729</td>\n",
" <td>476</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>393</td>\n",
" <td>2021-06-29 21:33:13.876766+02:00</td>\n",
" <td>2021-06-29 21:33:13.876766+02:00</td>\n",
" <td>9</td>\n",
" <td>23</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 119,
"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": 120,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>serial</th>\n",
" <th>event_id</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>start_date_time</th>\n",
" <th>open</th>\n",
" <th>satisfaction</th>\n",
" <th>end_date_time</th>\n",
" <th>name</th>\n",
" <th>is_display</th>\n",
" <th>representation_type_id</th>\n",
" <th>expected_filling</th>\n",
" <th>max_filling</th>\n",
" <th>extra_field</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>5903</td>\n",
" <td>NaN</td>\n",
" <td>5836</td>\n",
" <td>2021-07-16 05:16:57.419565+02:00</td>\n",
" <td>2021-07-16 05:16:57.419565+02:00</td>\n",
" <td>2019-08-24 18:00:00+02:00</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>1901-01-01 00:09:21+00:09</td>\n",
" <td>NaN</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>8009c34cae4e79e3781f16f3ceeab244</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>67133</td>\n",
" <td>NaN</td>\n",
" <td>65652</td>\n",
" <td>2023-09-27 02:21:36.573001+02:00</td>\n",
" <td>2023-09-27 02:21:36.573001+02:00</td>\n",
" <td>2023-10-04 10:30:00+02:00</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>1901-01-01 00:09:21+00:09</td>\n",
" <td>NaN</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>4e9d3fc8d1f7bf563dc586548fe6390e</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1874</td>\n",
" <td>NaN</td>\n",
" <td>1826</td>\n",
" <td>2021-07-16 00:02:17.390274+02:00</td>\n",
" <td>2021-07-16 00:02:17.390274+02:00</td>\n",
" <td>2019-09-14 18:00:00+02:00</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>1901-01-01 00:09:21+00:09</td>\n",
" <td>NaN</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>19f666370c1fc781dff638c20ae04c8a</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5904</td>\n",
" <td>NaN</td>\n",
" <td>5837</td>\n",
" <td>2021-07-16 05:16:57.420302+02:00</td>\n",
" <td>2021-07-16 05:16:57.420302+02:00</td>\n",
" <td>2019-09-01 17:05:00+02:00</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>1901-01-01 00:09:21+00:09</td>\n",
" <td>NaN</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>4221acd3f49179f5d0b292c15d1ab8e4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4165</td>\n",
" <td>NaN</td>\n",
" <td>4106</td>\n",
" <td>2021-07-16 03:53:05.929713+02:00</td>\n",
" <td>2021-07-16 03:53:05.929713+02:00</td>\n",
" <td>2018-10-14 14:00:00+02:00</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>1901-01-01 00:09:21+00:09</td>\n",
" <td>NaN</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>733104286519c0614b2d45470eb180a1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 120,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"representations = display_databases(\"8representations.csv\")\n",
"representations.head()"
]
},
{
"cell_type": "code",
"execution_count": 121,
"id": "0f2c7ea3-6964-48fd-9411-17547b2c3a3f",
"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"
]
},
{
"cell_type": "code",
"execution_count": 122,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>season_id</th>\n",
" <th>facility_id</th>\n",
" <th>name</th>\n",
" <th>event_type_id</th>\n",
" <th>manual_added</th>\n",
" <th>is_display</th>\n",
" <th>event_type_key_id</th>\n",
" <th>facility_key_id</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>41542</td>\n",
" <td>2022-10-29 02:54:32.756920+02:00</td>\n",
" <td>2022-10-29 02:57:35.511792+02:00</td>\n",
" <td>52</td>\n",
" <td>1</td>\n",
" <td>match lou feminin - lons</td>\n",
" <td>5588</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>5588</td>\n",
" <td>1</td>\n",
" <td>40cc5a346b1af4ee7108ac28b144fb77</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>21068</td>\n",
" <td>2021-12-17 03:43:53.166446+01:00</td>\n",
" <td>2021-12-17 03:46:40.346096+01:00</td>\n",
" <td>51</td>\n",
" <td>1</td>\n",
" <td>repas brasserie lou-racing</td>\n",
" <td>2310</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>2310</td>\n",
" <td>1</td>\n",
" <td>500b670b79aa592ecb06f4957800a752</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>59812</td>\n",
" <td>2023-05-26 01:45:54.321665+02:00</td>\n",
" <td>2023-05-26 01:46:01.571397+02:00</td>\n",
" <td>1501</td>\n",
" <td>2</td>\n",
" <td>parking match 2</td>\n",
" <td>10185</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>10185</td>\n",
" <td>2</td>\n",
" <td>d5f62ed879867b8b51ed7b85f1fc3ab0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3424</td>\n",
" <td>2021-07-16 03:13:06.988358+02:00</td>\n",
" <td>2021-07-16 05:33:31.321933+02:00</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>rugby + hockey sur glace</td>\n",
" <td>5</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>822b47176c355a647aa2dbdf8dfbc594</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>21379</td>\n",
" <td>2021-12-23 02:37:22.948114+01:00</td>\n",
" <td>2021-12-23 02:38:20.726329+01:00</td>\n",
" <td>51</td>\n",
" <td>1</td>\n",
" <td>bloc des etudiants lou-racing</td>\n",
" <td>2562</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>2562</td>\n",
" <td>1</td>\n",
" <td>17b91f19c71ff6287ffc1f44af952576</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 122,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"events = display_databases(\"8events.csv\")\n",
"events.head()"
]
},
{
"cell_type": "code",
"execution_count": 123,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>name</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>fidelity_delay</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>standard</td>\n",
" <td>2021-06-29 13:52:10.434850+02:00</td>\n",
" <td>2021-06-29 13:52:10.434850+02:00</td>\n",
" <td>36</td>\n",
" <td>c00f0c4675b91fb8b918e4079a0b1bac</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>11</td>\n",
" <td>ptit lou</td>\n",
" <td>2021-06-29 21:33:13.000743+02:00</td>\n",
" <td>2021-06-29 21:33:13.000743+02:00</td>\n",
" <td>36</td>\n",
" <td>dedd3579bc13b3ed7a90277247d9944b</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>274</td>\n",
" <td>parking 19-20</td>\n",
" <td>2021-07-16 00:02:17.225410+02:00</td>\n",
" <td>2021-07-16 00:02:17.225410+02:00</td>\n",
" <td>36</td>\n",
" <td>0d348caeec0b66f9d4987dfbe30e1e8b</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>129</td>\n",
" <td>events 2018-2019</td>\n",
" <td>2021-06-30 01:35:18.110429+02:00</td>\n",
" <td>2021-06-30 01:35:18.110429+02:00</td>\n",
" <td>36</td>\n",
" <td>65eb39ddf8f79d28d93c2f2c53118f50</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>10</td>\n",
" <td>accreditations 2017-2018</td>\n",
" <td>2021-06-29 21:33:12.999510+02:00</td>\n",
" <td>2021-06-29 21:33:12.999510+02:00</td>\n",
" <td>36</td>\n",
" <td>732cfdcf2065fa0005faf42793ddd76c</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 123,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"event_types = display_databases(\"8event_types.csv\")\n",
"event_types.head()"
]
},
{
"cell_type": "code",
"execution_count": 124,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>name</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>start_date_time</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1501</td>\n",
" <td>saison 2023-2024</td>\n",
" <td>2022-06-25 03:07:31.209270+02:00</td>\n",
" <td>2022-06-25 03:07:31.209270+02:00</td>\n",
" <td>NaN</td>\n",
" <td>71f5c069ce45c5e933dcc37c22507fbf</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1194</td>\n",
" <td>saison 2049-2050</td>\n",
" <td>2022-02-17 03:24:23.942691+01:00</td>\n",
" <td>2022-02-17 03:24:23.942691+01:00</td>\n",
" <td>NaN</td>\n",
" <td>44e20620bbc5926db2e295d38b606afd</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>saison 2016-2017</td>\n",
" <td>2021-06-29 21:33:00.702563+02:00</td>\n",
" <td>2021-06-29 21:33:00.702563+02:00</td>\n",
" <td>NaN</td>\n",
" <td>f9cf989d4f49300220df67ef93aa2294</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>47</td>\n",
" <td>saison 2018-2019</td>\n",
" <td>2021-06-30 01:35:15.156097+02:00</td>\n",
" <td>2021-06-30 01:35:15.156097+02:00</td>\n",
" <td>NaN</td>\n",
" <td>eec50c35fbf8593b364ced287335d90c</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>100</td>\n",
" <td>saison 2010-2011</td>\n",
" <td>2021-07-16 00:23:27.607648+02:00</td>\n",
" <td>2021-07-16 00:23:27.607648+02:00</td>\n",
" <td>NaN</td>\n",
" <td>7ccc51049a85e0df9b80662e45b6ddb8</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 124,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"seasons = display_databases(\"8seasons.csv\")\n",
"seasons.head()"
]
},
{
"cell_type": "code",
"execution_count": 125,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>name</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>street_id</th>\n",
" <th>fixed_capacity</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>74</td>\n",
" <td>plan pour campagne d'abo 2011/2012</td>\n",
" <td>2021-07-16 00:23:30.337698+02:00</td>\n",
" <td>2021-07-16 00:23:30.337698+02:00</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>2e1d25d5f7e46e23c734fe0e4951390e</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>3</td>\n",
" <td>accreditation</td>\n",
" <td>2021-06-29 21:33:13.018552+02:00</td>\n",
" <td>2021-06-29 21:33:13.018552+02:00</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>da37a04e592cbd344142730ce05a6887</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>4</td>\n",
" <td>organisation match exterieur</td>\n",
" <td>2021-06-29 21:33:13.019878+02:00</td>\n",
" <td>2021-06-29 21:33:13.019878+02:00</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>8f9ee8c2e954585f7c68096d7f1cf4f1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2</td>\n",
" <td>parking matmut stadium</td>\n",
" <td>2021-06-29 21:33:13.017165+02:00</td>\n",
" <td>2021-06-29 21:33:13.017165+02:00</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>aeab282982ea738674dbf5c3763a0be0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1</td>\n",
" <td>matmut stadium</td>\n",
" <td>2021-06-29 21:33:13.004560+02:00</td>\n",
" <td>2021-06-29 21:33:13.004560+02:00</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>89feffd283ebdabdc3b81fb62ea4f6f0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 125,
"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": 126,
"id": "c240b811-48a6-4501-9e70-bc51d69e3ac4",
"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"
]
},
{
"cell_type": "code",
"execution_count": 127,
"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": 128,
"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": 129,
"id": "590a132a-4f57-4ea3-a282-2ef913e4b753",
"metadata": {},
"outputs": [],
"source": [
"directory_path = '1'"
]
},
{
"cell_type": "code",
"execution_count": 130,
"id": "0fbebfb7-a827-46b1-890b-86c9def7cdbb",
"metadata": {},
"outputs": [],
"source": [
"theme_products = [\"products.csv\" ,\"categories.csv\", \"type_of_categories.csv\"]"
]
},
{
"cell_type": "code",
"execution_count": 131,
"id": "b8aa5f8f-845e-4ee5-b80d-38b7061a94a2",
"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"
]
},
{
"cell_type": "code",
"execution_count": 132,
"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": 133,
"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": 134,
"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": 135,
"id": "862a7658-0602-4d94-bb58-d23774c00d32",
"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": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>amount</th>\n",
" <th>is_full_price</th>\n",
" <th>representation_id</th>\n",
" <th>pricing_formula_id</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>category_id</th>\n",
" <th>apply_price</th>\n",
" <th>products_group_id</th>\n",
" <th>product_pack_id</th>\n",
" <th>extra_field</th>\n",
" <th>amount_consumption</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>10682</td>\n",
" <td>9.0</td>\n",
" <td>False</td>\n",
" <td>914</td>\n",
" <td>114</td>\n",
" <td>2020-09-03 14:09:43.119798+02:00</td>\n",
" <td>2020-09-03 14:09:43.119798+02:00</td>\n",
" <td>41</td>\n",
" <td>0.0</td>\n",
" <td>10655</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>35c88f2db8a63d7474e46eb8ca9260e7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>478</td>\n",
" <td>9.5</td>\n",
" <td>False</td>\n",
" <td>273</td>\n",
" <td>131</td>\n",
" <td>2020-09-03 13:21:22.711773+02:00</td>\n",
" <td>2020-09-03 13:21:22.711773+02:00</td>\n",
" <td>1</td>\n",
" <td>0.0</td>\n",
" <td>471</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>8a179671ab198e570e6a104c4451379f</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20873</td>\n",
" <td>11.5</td>\n",
" <td>False</td>\n",
" <td>275</td>\n",
" <td>137</td>\n",
" <td>2020-09-03 14:46:33.589030+02:00</td>\n",
" <td>2020-09-03 14:46:33.589030+02:00</td>\n",
" <td>1</td>\n",
" <td>0.0</td>\n",
" <td>20825</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>ee83779ce29e67ad251e40234b426d6a</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>157142</td>\n",
" <td>8.0</td>\n",
" <td>False</td>\n",
" <td>82519</td>\n",
" <td>9</td>\n",
" <td>2022-01-28 19:29:23.525722+01:00</td>\n",
" <td>2022-01-28 19:29:23.525722+01:00</td>\n",
" <td>5</td>\n",
" <td>0.0</td>\n",
" <td>156773</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>d865383579314b791aa4bcf3fb418f17</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1341</td>\n",
" <td>8.5</td>\n",
" <td>False</td>\n",
" <td>9</td>\n",
" <td>93</td>\n",
" <td>2020-09-03 13:29:30.773089+02:00</td>\n",
" <td>2020-09-03 13:29:30.773089+02:00</td>\n",
" <td>1</td>\n",
" <td>0.0</td>\n",
" <td>1175</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>f1c4689bc47dee6f60b56d74b593dd46</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 135,
"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": 136,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>representation_id</th>\n",
" <th>pricing_formula_id</th>\n",
" <th>category_id</th>\n",
" <th>products_group_id</th>\n",
" <th>product_pack_id</th>\n",
" <th>identifier</th>\n",
" <th>amount</th>\n",
" <th>is_full_price</th>\n",
" <th>apply_price</th>\n",
" <th>extra_field</th>\n",
" <th>amount_consumption</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>10682</td>\n",
" <td>914</td>\n",
" <td>114</td>\n",
" <td>41</td>\n",
" <td>10655</td>\n",
" <td>1</td>\n",
" <td>35c88f2db8a63d7474e46eb8ca9260e7</td>\n",
" <td>9.0</td>\n",
" <td>False</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>478</td>\n",
" <td>273</td>\n",
" <td>131</td>\n",
" <td>1</td>\n",
" <td>471</td>\n",
" <td>1</td>\n",
" <td>8a179671ab198e570e6a104c4451379f</td>\n",
" <td>9.5</td>\n",
" <td>False</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20873</td>\n",
" <td>275</td>\n",
" <td>137</td>\n",
" <td>1</td>\n",
" <td>20825</td>\n",
" <td>1</td>\n",
" <td>ee83779ce29e67ad251e40234b426d6a</td>\n",
" <td>11.5</td>\n",
" <td>False</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>157142</td>\n",
" <td>82519</td>\n",
" <td>9</td>\n",
" <td>5</td>\n",
" <td>156773</td>\n",
" <td>1</td>\n",
" <td>d865383579314b791aa4bcf3fb418f17</td>\n",
" <td>8.0</td>\n",
" <td>False</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1341</td>\n",
" <td>9</td>\n",
" <td>93</td>\n",
" <td>1</td>\n",
" <td>1175</td>\n",
" <td>1</td>\n",
" <td>f1c4689bc47dee6f60b56d74b593dd46</td>\n",
" <td>8.5</td>\n",
" <td>False</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 136,
"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": 137,
"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": 138,
"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": 139,
"id": "3efce2b6-2d2f-4da9-98ed-1aae17da624c",
"metadata": {},
"outputs": [],
"source": [
"name_dataset = '1categories.csv'"
]
},
{
"cell_type": "code",
"execution_count": 140,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>name</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>extra_field</th>\n",
" <th>quota</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>30</td>\n",
" <td>en nb entrées gr</td>\n",
" <td>2020-09-03 13:21:20.019202+02:00</td>\n",
" <td>2020-09-03 13:21:20.019202+02:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>849ab2791a14f5fc2bb4d87ab2b78bf6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>16</td>\n",
" <td>indiv activité enfant</td>\n",
" <td>2020-09-03 13:11:23.306968+02:00</td>\n",
" <td>2020-09-03 13:11:23.306968+02:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>425fd2f01984cc4ba030c1be98f42c33</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>39</td>\n",
" <td>indiv activité gr</td>\n",
" <td>2020-09-03 13:21:20.029901+02:00</td>\n",
" <td>2020-09-03 13:21:20.029901+02:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>9244dd3738788db0d22a5d0afe687b69</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1108</td>\n",
" <td>groupe forfait adulte</td>\n",
" <td>2020-09-19 02:06:43.145697+02:00</td>\n",
" <td>2020-09-19 02:06:43.145697+02:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>3edda20c877a93b5ff883827238eb711</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>6</td>\n",
" <td>groupe forfait entrées tr</td>\n",
" <td>2020-09-03 13:11:23.264997+02:00</td>\n",
" <td>2020-09-03 13:11:23.264997+02:00</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>ff48df4b2dd5a14116bf4d280b31621e</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 140,
"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": 141,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>identifier</th>\n",
" <th>name</th>\n",
" <th>extra_field</th>\n",
" <th>quota</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>30</td>\n",
" <td>849ab2791a14f5fc2bb4d87ab2b78bf6</td>\n",
" <td>en nb entrées gr</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>16</td>\n",
" <td>425fd2f01984cc4ba030c1be98f42c33</td>\n",
" <td>indiv activité enfant</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>39</td>\n",
" <td>9244dd3738788db0d22a5d0afe687b69</td>\n",
" <td>indiv activité gr</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1108</td>\n",
" <td>3edda20c877a93b5ff883827238eb711</td>\n",
" <td>groupe forfait adulte</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>6</td>\n",
" <td>ff48df4b2dd5a14116bf4d280b31621e</td>\n",
" <td>groupe forfait entrées tr</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 141,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = process_df(df)\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 142,
"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": 142,
"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": 143,
"id": "2d52d6da-cca5-4abd-be05-2f00fd3eca8e",
"metadata": {},
"outputs": [],
"source": [
"name_dataset = '1events.csv'"
]
},
{
"cell_type": "code",
"execution_count": 144,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>season_id</th>\n",
" <th>facility_id</th>\n",
" <th>name</th>\n",
" <th>event_type_id</th>\n",
" <th>manual_added</th>\n",
" <th>is_display</th>\n",
" <th>event_type_key_id</th>\n",
" <th>facility_key_id</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>192</td>\n",
" <td>2020-09-03 13:36:42.216991+02:00</td>\n",
" <td>2021-11-02 15:06:40.663219+01:00</td>\n",
" <td>16</td>\n",
" <td>1</td>\n",
" <td>frontières</td>\n",
" <td>4</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>c1cecd093146068fd57896e254e98170</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>30329</td>\n",
" <td>2023-11-04 02:50:34.602462+01:00</td>\n",
" <td>2023-11-04 02:52:26.138154+01:00</td>\n",
" <td>2767</td>\n",
" <td>1</td>\n",
" <td>visite guidée une autre histoire du monde (1h00)</td>\n",
" <td>5</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>f510a6710878d7aca36e71c54abab525</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>161</td>\n",
" <td>2020-09-03 13:29:27.944002+02:00</td>\n",
" <td>2021-11-02 15:06:40.652026+01:00</td>\n",
" <td>16</td>\n",
" <td>1</td>\n",
" <td>visite contée les chercheurs d'or indiv</td>\n",
" <td>2</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>21177fa9acad1ae2b1f595690fb853d3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5957</td>\n",
" <td>2021-07-31 11:16:42.575583+02:00</td>\n",
" <td>2021-11-02 15:06:40.663219+01:00</td>\n",
" <td>582</td>\n",
" <td>1</td>\n",
" <td>we dreamt of utopia and we woke up screaming.</td>\n",
" <td>4</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>962601f1eb153d45d49437f8fe839f7f</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>8337</td>\n",
" <td>2021-08-17 13:40:34.111923+02:00</td>\n",
" <td>2021-11-02 15:06:40.663219+01:00</td>\n",
" <td>582</td>\n",
" <td>1</td>\n",
" <td>jeff koons épisodes 4</td>\n",
" <td>4</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>bfa22f5a2364a2dacfc45cca1c8d3215</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 144,
"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": 145,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>season_id</th>\n",
" <th>facility_id</th>\n",
" <th>event_type_id</th>\n",
" <th>event_type_key_id</th>\n",
" <th>facility_key_id</th>\n",
" <th>identifier</th>\n",
" <th>name</th>\n",
" <th>manual_added</th>\n",
" <th>is_display</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>192</td>\n",
" <td>16</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>c1cecd093146068fd57896e254e98170</td>\n",
" <td>frontières</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>30329</td>\n",
" <td>2767</td>\n",
" <td>1</td>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>f510a6710878d7aca36e71c54abab525</td>\n",
" <td>visite guidée une autre histoire du monde (1h00)</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>161</td>\n",
" <td>16</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>21177fa9acad1ae2b1f595690fb853d3</td>\n",
" <td>visite contée les chercheurs d'or indiv</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5957</td>\n",
" <td>582</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>962601f1eb153d45d49437f8fe839f7f</td>\n",
" <td>we dreamt of utopia and we woke up screaming.</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>8337</td>\n",
" <td>582</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>bfa22f5a2364a2dacfc45cca1c8d3215</td>\n",
" <td>jeff koons épisodes 4</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 145,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = process_df(df)\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 146,
"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": 146,
"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": 147,
"id": "90ab62d4-a086-4469-961c-67eefb375388",
"metadata": {},
"outputs": [],
"source": [
"name_dataset = '1event_types.csv'"
]
},
{
"cell_type": "code",
"execution_count": 148,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>name</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>fidelity_delay</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>standard</td>\n",
" <td>2020-09-03 12:24:22.574262+02:00</td>\n",
" <td>2020-09-03 12:24:22.574262+02:00</td>\n",
" <td>36</td>\n",
" <td>c00f0c4675b91fb8b918e4079a0b1bac</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>66</td>\n",
" <td>package</td>\n",
" <td>2020-09-03 14:05:04.648137+02:00</td>\n",
" <td>2020-09-03 14:05:04.648137+02:00</td>\n",
" <td>36</td>\n",
" <td>efe90a8e604a7c840e88d03a67f6b7d8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>83</td>\n",
" <td>guide multimédias</td>\n",
" <td>2020-09-03 14:15:17.252539+02:00</td>\n",
" <td>2020-09-03 14:15:17.252539+02:00</td>\n",
" <td>36</td>\n",
" <td>ee14c62b3b9f6c7dd5401685a18e4460</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>non défini</td>\n",
" <td>2020-09-03 13:11:23.117024+02:00</td>\n",
" <td>2020-09-03 13:11:23.117024+02:00</td>\n",
" <td>36</td>\n",
" <td>52ff3466787b4d538407372e5f7afe0f</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2723</td>\n",
" <td>NaN</td>\n",
" <td>2021-12-22 09:45:47.715105+01:00</td>\n",
" <td>2021-12-22 09:45:47.715105+01:00</td>\n",
" <td>36</td>\n",
" <td>d41d8cd98f00b204e9800998ecf8427e</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 148,
"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": 149,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>fidelity_delay</th>\n",
" <th>identifier</th>\n",
" <th>name</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>36</td>\n",
" <td>c00f0c4675b91fb8b918e4079a0b1bac</td>\n",
" <td>standard</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>66</td>\n",
" <td>36</td>\n",
" <td>efe90a8e604a7c840e88d03a67f6b7d8</td>\n",
" <td>package</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>83</td>\n",
" <td>36</td>\n",
" <td>ee14c62b3b9f6c7dd5401685a18e4460</td>\n",
" <td>guide multimédias</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>36</td>\n",
" <td>52ff3466787b4d538407372e5f7afe0f</td>\n",
" <td>non défini</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2723</td>\n",
" <td>36</td>\n",
" <td>d41d8cd98f00b204e9800998ecf8427e</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 149,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = process_df(df)\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 150,
"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": 150,
"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": 151,
"id": "ae544dcc-f23d-4216-bb5b-597cc1b3765e",
"metadata": {},
"outputs": [],
"source": [
"name_dataset = '1seasons.csv'"
]
},
{
"cell_type": "code",
"execution_count": 152,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>name</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>start_date_time</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>943</td>\n",
" <td>2013</td>\n",
" <td>2021-07-29 08:55:33.282607+02:00</td>\n",
" <td>2021-07-29 08:55:33.282607+02:00</td>\n",
" <td>NaN</td>\n",
" <td>8038da89e49ac5eabb489cfc6cea9fc1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>129</td>\n",
" <td>2014</td>\n",
" <td>2020-09-03 15:13:08.105567+02:00</td>\n",
" <td>2020-09-03 15:13:08.105567+02:00</td>\n",
" <td>NaN</td>\n",
" <td>cee8d6b7ce52554fd70354e37bbf44a2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>2015</td>\n",
" <td>2020-09-03 13:11:19.405037+02:00</td>\n",
" <td>2020-09-03 13:11:19.405037+02:00</td>\n",
" <td>NaN</td>\n",
" <td>65d2ea03425887a717c435081cfc5dbb</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2</td>\n",
" <td>2016</td>\n",
" <td>2020-09-03 13:11:19.401001+02:00</td>\n",
" <td>2020-09-03 13:11:19.401001+02:00</td>\n",
" <td>NaN</td>\n",
" <td>95192c98732387165bf8e396c0f2dad2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>2017</td>\n",
" <td>2020-09-03 13:11:19.409005+02:00</td>\n",
" <td>2020-09-03 13:11:19.409005+02:00</td>\n",
" <td>NaN</td>\n",
" <td>8d8818c8e140c64c743113f563cf750f</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 152,
"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": 153,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>identifier</th>\n",
" <th>name</th>\n",
" <th>start_date_time</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>943</td>\n",
" <td>8038da89e49ac5eabb489cfc6cea9fc1</td>\n",
" <td>2013</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>129</td>\n",
" <td>cee8d6b7ce52554fd70354e37bbf44a2</td>\n",
" <td>2014</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>65d2ea03425887a717c435081cfc5dbb</td>\n",
" <td>2015</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2</td>\n",
" <td>95192c98732387165bf8e396c0f2dad2</td>\n",
" <td>2016</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>8d8818c8e140c64c743113f563cf750f</td>\n",
" <td>2017</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 153,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = process_df(df)\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 154,
"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": 154,
"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": 155,
"id": "d95ef015-d44c-4353-8761-771b910d21c9",
"metadata": {},
"outputs": [],
"source": [
"name_dataset = '1facilities.csv'"
]
},
{
"cell_type": "code",
"execution_count": 156,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>name</th>\n",
" <th>created_at</th>\n",
" <th>updated_at</th>\n",
" <th>street_id</th>\n",
" <th>fixed_capacity</th>\n",
" <th>identifier</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2</td>\n",
" <td>non défini</td>\n",
" <td>2020-09-03 13:16:35.293111+02:00</td>\n",
" <td>2020-09-03 13:16:35.293111+02:00</td>\n",
" <td>2</td>\n",
" <td>NaN</td>\n",
" <td>52ff3466787b4d538407372e5f7afe0f</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>mucem</td>\n",
" <td>2020-09-03 13:11:23.133059+02:00</td>\n",
" <td>2020-09-03 13:11:23.133059+02:00</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>702bd76fe3dd5dbcf118a6965a946f54</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 156,
"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": 157,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>street_id</th>\n",
" <th>identifier</th>\n",
" <th>name</th>\n",
" <th>fixed_capacity</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>52ff3466787b4d538407372e5f7afe0f</td>\n",
" <td>non défini</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>702bd76fe3dd5dbcf118a6965a946f54</td>\n",
" <td>mucem</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 157,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = process_df(df)\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 158,
"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": 158,
"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": 159,
"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": 160,
"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": 161,
"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": 162,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id_products</th>\n",
" <th>representation_id</th>\n",
" <th>pricing_formula_id</th>\n",
" <th>category_id</th>\n",
" <th>products_group_id</th>\n",
" <th>product_pack_id</th>\n",
" <th>type_of_id</th>\n",
" <th>amount</th>\n",
" <th>is_full_price</th>\n",
" <th>name_categories</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>10682</td>\n",
" <td>914</td>\n",
" <td>114</td>\n",
" <td>41</td>\n",
" <td>10655</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>9.0</td>\n",
" <td>False</td>\n",
" <td>indiv activité tr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>478</td>\n",
" <td>273</td>\n",
" <td>131</td>\n",
" <td>1</td>\n",
" <td>471</td>\n",
" <td>1</td>\n",
" <td>12.0</td>\n",
" <td>9.5</td>\n",
" <td>False</td>\n",
" <td>indiv entrées tp</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20873</td>\n",
" <td>275</td>\n",
" <td>137</td>\n",
" <td>1</td>\n",
" <td>20825</td>\n",
" <td>1</td>\n",
" <td>12.0</td>\n",
" <td>11.5</td>\n",
" <td>False</td>\n",
" <td>indiv entrées tp</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>157142</td>\n",
" <td>82519</td>\n",
" <td>9</td>\n",
" <td>5</td>\n",
" <td>156773</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>8.0</td>\n",
" <td>False</td>\n",
" <td>indiv entrées tr</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1341</td>\n",
" <td>9</td>\n",
" <td>93</td>\n",
" <td>1</td>\n",
" <td>1175</td>\n",
" <td>1</td>\n",
" <td>12.0</td>\n",
" <td>8.5</td>\n",
" <td>False</td>\n",
" <td>indiv entrées tp</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 162,
"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": 163,
"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": 164,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>event_id</th>\n",
" <th>season_id</th>\n",
" <th>facility_id</th>\n",
" <th>event_type_id</th>\n",
" <th>event_type_key_id</th>\n",
" <th>facility_key_id</th>\n",
" <th>street_id</th>\n",
" <th>name_events</th>\n",
" <th>name_seasons</th>\n",
" <th>name_event_types</th>\n",
" <th>name_facilities</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>192</td>\n",
" <td>16</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>frontières</td>\n",
" <td>2018</td>\n",
" <td>spectacle vivant</td>\n",
" <td>mucem</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>30329</td>\n",
" <td>2767</td>\n",
" <td>1</td>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>visite guidée une autre histoire du monde (1h00)</td>\n",
" <td>2023</td>\n",
" <td>offre muséale groupe</td>\n",
" <td>mucem</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>161</td>\n",
" <td>16</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>visite contée les chercheurs d'or indiv</td>\n",
" <td>2018</td>\n",
" <td>offre muséale individuel</td>\n",
" <td>mucem</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>5957</td>\n",
" <td>582</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>we dreamt of utopia and we woke up screaming.</td>\n",
" <td>2021</td>\n",
" <td>spectacle vivant</td>\n",
" <td>mucem</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>8337</td>\n",
" <td>582</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>jeff koons épisodes 4</td>\n",
" <td>2021</td>\n",
" <td>spectacle vivant</td>\n",
" <td>mucem</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 164,
"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": 165,
"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": 166,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>event_id</th>\n",
" <th>id_representation_cap</th>\n",
" <th>representation_id</th>\n",
" <th>category_id</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>12384</td>\n",
" <td>123058</td>\n",
" <td>84820</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>37</td>\n",
" <td>2514</td>\n",
" <td>269</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>37</td>\n",
" <td>384</td>\n",
" <td>269</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>37</td>\n",
" <td>2515</td>\n",
" <td>269</td>\n",
" <td>10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>37</td>\n",
" <td>383</td>\n",
" <td>269</td>\n",
" <td>1</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 166,
"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": 167,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>name</th>\n",
" <th>type_of</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id name type_of\n",
"0 1 NaN 0"
]
},
"execution_count": 167,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"product_packs = load_dataset(\"1product_packs.csv\")\n",
"product_packs.head()"
]
},
{
"cell_type": "code",
"execution_count": 168,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>name</th>\n",
" <th>extra_field</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>41909</td>\n",
" <td>visite mécènes 1h30</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>502</td>\n",
" <td>entree mucem tp( expo picasso)</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>504</td>\n",
" <td>nombre de personnes cinema</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>117</td>\n",
" <td>spectacle tarif e famille tr</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1496</td>\n",
" <td>billet nb famille mecene 1a</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 168,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pricing_formula = load_dataset(\"1pricing_formulas.csv\")\n",
"pricing_formula.head()"
]
},
{
"cell_type": "code",
"execution_count": 169,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>type_of_id</th>\n",
" <th>pricing_formula_id</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>127</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>2425</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>2937</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>48</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>7</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 169,
"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": 170,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>category_id</th>\n",
" <th>pricing_formula_id</th>\n",
" <th>representation_id</th>\n",
" <th>percent_price</th>\n",
" <th>max_price</th>\n",
" <th>min_price</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2735</td>\n",
" <td>8</td>\n",
" <td>97</td>\n",
" <td>1534</td>\n",
" <td>100.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>156773</td>\n",
" <td>5</td>\n",
" <td>9</td>\n",
" <td>82519</td>\n",
" <td>100.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>14387</td>\n",
" <td>16</td>\n",
" <td>79</td>\n",
" <td>8046</td>\n",
" <td>100.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2770</td>\n",
" <td>2</td>\n",
" <td>37</td>\n",
" <td>1563</td>\n",
" <td>100.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>27179</td>\n",
" <td>13</td>\n",
" <td>119</td>\n",
" <td>14192</td>\n",
" <td>100.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 170,
"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": 171,
"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": 172,
"id": "d40b1e3b-b1f3-4915-8ebc-6bb7856da42a",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id_products</th>\n",
" <th>representation_id</th>\n",
" <th>pricing_formula_id</th>\n",
" <th>category_id</th>\n",
" <th>products_group_id</th>\n",
" <th>product_pack_id</th>\n",
" <th>type_of_id</th>\n",
" <th>amount</th>\n",
" <th>is_full_price</th>\n",
" <th>name_categories</th>\n",
" <th>event_id</th>\n",
" <th>id_representation_cap</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>10682</td>\n",
" <td>914</td>\n",
" <td>114</td>\n",
" <td>41</td>\n",
" <td>10655</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>9.0</td>\n",
" <td>False</td>\n",
" <td>indiv activité tr</td>\n",
" <td>132</td>\n",
" <td>8789</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>478</td>\n",
" <td>273</td>\n",
" <td>131</td>\n",
" <td>1</td>\n",
" <td>471</td>\n",
" <td>1</td>\n",
" <td>12.0</td>\n",
" <td>9.5</td>\n",
" <td>False</td>\n",
" <td>indiv entrées tp</td>\n",
" <td>37</td>\n",
" <td>390</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20873</td>\n",
" <td>275</td>\n",
" <td>137</td>\n",
" <td>1</td>\n",
" <td>20825</td>\n",
" <td>1</td>\n",
" <td>12.0</td>\n",
" <td>11.5</td>\n",
" <td>False</td>\n",
" <td>indiv entrées tp</td>\n",
" <td>37</td>\n",
" <td>395</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>157142</td>\n",
" <td>82519</td>\n",
" <td>9</td>\n",
" <td>5</td>\n",
" <td>156773</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>8.0</td>\n",
" <td>False</td>\n",
" <td>indiv entrées tr</td>\n",
" <td>12365</td>\n",
" <td>120199</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1341</td>\n",
" <td>9</td>\n",
" <td>93</td>\n",
" <td>1</td>\n",
" <td>1175</td>\n",
" <td>1</td>\n",
" <td>12.0</td>\n",
" <td>8.5</td>\n",
" <td>False</td>\n",
" <td>indiv entrées tp</td>\n",
" <td>8</td>\n",
" <td>21</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": 172,
"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": 173,
"id": "78d75a08-e959-429c-847a-7d70a2804806",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id_products</th>\n",
" <th>representation_id</th>\n",
" <th>pricing_formula_id</th>\n",
" <th>category_id</th>\n",
" <th>products_group_id</th>\n",
" <th>product_pack_id</th>\n",
" <th>type_of_id</th>\n",
" <th>event_id</th>\n",
" <th>id_representation_cap</th>\n",
" <th>season_id</th>\n",
" <th>...</th>\n",
" <th>event_type_key_id</th>\n",
" <th>facility_key_id</th>\n",
" <th>street_id</th>\n",
" <th>amount</th>\n",
" <th>is_full_price</th>\n",
" <th>name_categories</th>\n",
" <th>name_events</th>\n",
" <th>name_seasons</th>\n",
" <th>name_event_types</th>\n",
" <th>name_facilities</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>10682</td>\n",
" <td>914</td>\n",
" <td>114</td>\n",
" <td>41</td>\n",
" <td>10655</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>132</td>\n",
" <td>8789</td>\n",
" <td>4</td>\n",
" <td>...</td>\n",
" <td>5</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>9.0</td>\n",
" <td>False</td>\n",
" <td>indiv activité tr</td>\n",
" <td>visite-jeu \"le classico des minots\" (1h30)</td>\n",
" <td>2017</td>\n",
" <td>offre muséale individuel</td>\n",
" <td>mucem</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>478</td>\n",
" <td>273</td>\n",
" <td>131</td>\n",
" <td>1</td>\n",
" <td>471</td>\n",
" <td>1</td>\n",
" <td>12.0</td>\n",
" <td>37</td>\n",
" <td>390</td>\n",
" <td>2</td>\n",
" <td>...</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>9.5</td>\n",
" <td>False</td>\n",
" <td>indiv entrées tp</td>\n",
" <td>billet mucem picasso</td>\n",
" <td>2016</td>\n",
" <td>offre muséale individuel</td>\n",
" <td>mucem</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>20873</td>\n",
" <td>275</td>\n",
" <td>137</td>\n",
" <td>1</td>\n",
" <td>20825</td>\n",
" <td>1</td>\n",
" <td>12.0</td>\n",
" <td>37</td>\n",
" <td>395</td>\n",
" <td>2</td>\n",
" <td>...</td>\n",
" <td>2</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>11.5</td>\n",
" <td>False</td>\n",
" <td>indiv entrées tp</td>\n",
" <td>billet mucem picasso</td>\n",
" <td>2016</td>\n",
" <td>offre muséale individuel</td>\n",
" <td>mucem</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>157142</td>\n",
" <td>82519</td>\n",
" <td>9</td>\n",
" <td>5</td>\n",
" <td>156773</td>\n",
" <td>1</td>\n",
" <td>NaN</td>\n",
" <td>12365</td>\n",
" <td>120199</td>\n",
" <td>1754</td>\n",
" <td>...</td>\n",
" <td>4</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8.0</td>\n",
" <td>False</td>\n",
" <td>indiv entrées tr</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>offre muséale individuel</td>\n",
" <td>mucem</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1341</td>\n",
" <td>9</td>\n",
" <td>93</td>\n",
" <td>1</td>\n",
" <td>1175</td>\n",
" <td>1</td>\n",
" <td>12.0</td>\n",
" <td>8</td>\n",
" <td>21</td>\n",
" <td>4</td>\n",
" <td>...</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>8.5</td>\n",
" <td>False</td>\n",
" <td>indiv entrées tp</td>\n",
" <td>non défini</td>\n",
" <td>2017</td>\n",
" <td>non défini</td>\n",
" <td>mucem</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 22 columns</p>\n",
"</div>"
],
"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": 173,
"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": 174,
"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": 174,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"products_global.columns"
]
},
{
"cell_type": "code",
"execution_count": 175,
"id": "b18f6428-90e0-4b1b-9b8d-bad995fb6c98",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(94803, 22)"
]
},
"execution_count": 175,
"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": 176,
"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": 176,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"products_global.isna().sum()"
]
},
{
"cell_type": "code",
"execution_count": 177,
"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": 177,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# how many event types ?\n",
"\n",
"products_global['name_event_types'].unique()"
]
},
{
"cell_type": "code",
"execution_count": 178,
"id": "a9b9a23c-b0de-4685-97e5-d52dd78349f5",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"644"
]
},
"execution_count": 178,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# how many events ?\n",
"\n",
"len(products_global['name_events'].unique())"
]
},
{
"cell_type": "code",
"execution_count": 179,
"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": 179,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# how many categories ?\n",
"products_global['name_categories'].unique()\n"
]
},
{
"cell_type": "code",
"execution_count": 180,
"id": "11f89771-8d50-4ef4-b34e-53e4f6b419bb",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"27"
]
},
"execution_count": 180,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(products_global['category_id'].unique())"
]
},
{
"cell_type": "code",
"execution_count": 181,
"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": 182,
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>street_id</th>\n",
" <th>structure_id</th>\n",
" <th>mcp_contact_id</th>\n",
" <th>fidelity</th>\n",
" <th>tenant_id</th>\n",
" <th>lastname</th>\n",
" <th>firstname</th>\n",
" <th>birthdate</th>\n",
" <th>email</th>\n",
" <th>...</th>\n",
" <th>total_price</th>\n",
" <th>preferred_category</th>\n",
" <th>preferred_supplier</th>\n",
" <th>preferred_formula</th>\n",
" <th>purchase_count</th>\n",
" <th>first_buying_date</th>\n",
" <th>last_visiting_date</th>\n",
" <th>zipcode</th>\n",
" <th>country</th>\n",
" <th>age</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>12751</td>\n",
" <td>2</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>1311</td>\n",
" <td>lastname12751</td>\n",
" <td>firstname12751</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>fr</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>12825</td>\n",
" <td>2</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>1311</td>\n",
" <td>lastname12825</td>\n",
" <td>firstname12825</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>fr</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>11261</td>\n",
" <td>2</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>1311</td>\n",
" <td>lastname11261</td>\n",
" <td>firstname11261</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>fr</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>13071</td>\n",
" <td>2</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>1311</td>\n",
" <td>lastname13071</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>fr</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>653061</td>\n",
" <td>10</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>1311</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>email653061</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 40 columns</p>\n",
"</div>"
],
"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": 182,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"customer_plus = load_dataset(\"1customersplus.csv\")\n",
"customer_plus.head()"
]
},
{
"cell_type": "code",
"execution_count": 183,
"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": 183,
"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": 211,
"id": "de370d66-852e-46a1-8fb4-5c1e5756f5cd",
"metadata": {},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "088a1f50-cf5d-4d1a-891d-4e9df7e1c35b",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>customer_id</th>\n",
" <th>birthdate</th>\n",
" <th>street_id_x</th>\n",
" <th>is_partner</th>\n",
" <th>gender</th>\n",
" <th>is_email_true</th>\n",
" <th>opt_in</th>\n",
" <th>structure_id</th>\n",
" <th>profession</th>\n",
" <th>language</th>\n",
" <th>...</th>\n",
" <th>season_id</th>\n",
" <th>facility_id</th>\n",
" <th>event_type_id</th>\n",
" <th>event_type_key_id</th>\n",
" <th>facility_key_id</th>\n",
" <th>street_id_y</th>\n",
" <th>amount</th>\n",
" <th>is_full_price</th>\n",
" <th>name_event_types</th>\n",
" <th>name_facilities</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>12751</td>\n",
" <td>NaN</td>\n",
" <td>2</td>\n",
" <td>False</td>\n",
" <td>1</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>12825</td>\n",
" <td>NaN</td>\n",
" <td>2</td>\n",
" <td>False</td>\n",
" <td>2</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>11261</td>\n",
" <td>NaN</td>\n",
" <td>2</td>\n",
" <td>False</td>\n",
" <td>1</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>13071</td>\n",
" <td>NaN</td>\n",
" <td>2</td>\n",
" <td>False</td>\n",
" <td>2</td>\n",
" <td>True</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>653061</td>\n",
" <td>NaN</td>\n",
" <td>10</td>\n",
" <td>False</td>\n",
" <td>2</td>\n",
" <td>True</td>\n",
" <td>False</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>...</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 52 columns</p>\n",
"</div>"
],
"text/plain": [
" customer_id birthdate street_id_x 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 ... season_id facility_id \\\n",
"0 True NaN NaN NaN ... NaN NaN \n",
"1 True NaN NaN NaN ... NaN NaN \n",
"2 True NaN NaN NaN ... NaN NaN \n",
"3 True NaN NaN NaN ... NaN NaN \n",
"4 False NaN NaN NaN ... NaN NaN \n",
"\n",
" event_type_id event_type_key_id facility_key_id street_id_y amount \\\n",
"0 NaN NaN NaN NaN NaN \n",
"1 NaN NaN NaN NaN NaN \n",
"2 NaN NaN NaN NaN NaN \n",
"3 NaN NaN NaN NaN NaN \n",
"4 NaN NaN NaN NaN NaN \n",
"\n",
" is_full_price name_event_types name_facilities \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 52 columns]"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"customer_product = pd.read_csv(\"customer_product.csv\")\n",
"customer_product.head()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "bdd582af-0cf1-4e04-90ad-7165b8a36ac8",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(206713, 52)\n",
"Index(['customer_id', 'birthdate', 'street_id_x', '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', 'product_id',\n",
" 'nb_tickets', 'nb_suppliers', 'purchase_date_max', 'purchase_date_min',\n",
" 'time_between_purchase', 'id_products', 'representation_id',\n",
" 'pricing_formula_id', 'category_id', 'products_group_id',\n",
" 'product_pack_id', 'event_id', 'id_representation_cap', 'season_id',\n",
" 'facility_id', 'event_type_id', 'event_type_key_id', 'facility_key_id',\n",
" 'street_id_y', 'amount', 'is_full_price', 'name_event_types',\n",
" 'name_facilities'],\n",
" dtype='object')\n"
]
}
],
"source": [
"# Shape :\n",
"print(customer_product.shape)\n",
"# columns : \n",
"print(customer_product.columns)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "55fa2361-ebde-4472-b8d2-521a20be766d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"customer_id 0\n",
"birthdate 195073\n",
"street_id_x 0\n",
"is_partner 0\n",
"gender 0\n",
"is_email_true 0\n",
"opt_in 0\n",
"structure_id 171660\n",
"profession 199762\n",
"language 205574\n",
"mcp_contact_id 81495\n",
"last_buying_date 78450\n",
"max_price 78450\n",
"ticket_sum 0\n",
"average_price 13122\n",
"fidelity 0\n",
"average_purchase_delay 78450\n",
"average_price_basket 78450\n",
"average_ticket_basket 78450\n",
"total_price 65328\n",
"purchase_count 0\n",
"first_buying_date 78450\n",
"country 8490\n",
"age 195073\n",
"tenant_id 0\n",
"nb_campaigns 46315\n",
"nb_campaigns_opened 46315\n",
"time_to_open 100811\n",
"product_id 78355\n",
"nb_tickets 78355\n",
"nb_suppliers 78355\n",
"purchase_date_max 78355\n",
"purchase_date_min 78355\n",
"time_between_purchase 78355\n",
"id_products 78355\n",
"representation_id 78355\n",
"pricing_formula_id 78355\n",
"category_id 78355\n",
"products_group_id 78355\n",
"product_pack_id 78355\n",
"event_id 78355\n",
"id_representation_cap 78355\n",
"season_id 78355\n",
"facility_id 78355\n",
"event_type_id 78355\n",
"event_type_key_id 78355\n",
"facility_key_id 78355\n",
"street_id_y 78355\n",
"amount 78355\n",
"is_full_price 78355\n",
"name_event_types 78355\n",
"name_facilities 78355\n",
"dtype: int64"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# check NA\n",
"\n",
"customer_product.isna().sum()"
]
},
{
"cell_type": "code",
"execution_count": 234,
"id": "76fbd8d5-443c-43b7-976d-b0028cd90d5e",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>customer_id</th>\n",
" <th>gender</th>\n",
" <th>is_partner</th>\n",
" <th>is_email_true</th>\n",
" <th>nb_campaigns</th>\n",
" <th>nb_campaigns_opened</th>\n",
" <th>fidelity</th>\n",
" <th>product_id</th>\n",
" <th>nb_tickets</th>\n",
" <th>ticket_sum</th>\n",
" <th>average_price</th>\n",
" <th>amount</th>\n",
" <th>event_type_id</th>\n",
" <th>name_event_types</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>12751</td>\n",
" <td>1</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>12825</td>\n",
" <td>2</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>11261</td>\n",
" <td>1</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>13071</td>\n",
" <td>2</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>653061</td>\n",
" <td>2</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>80.0</td>\n",
" <td>2.0</td>\n",
" <td>0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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 product_id nb_tickets ticket_sum \\\n",
"0 NaN 0 NaN NaN 0 \n",
"1 NaN 0 NaN NaN 0 \n",
"2 NaN 0 NaN NaN 0 \n",
"3 NaN 0 NaN NaN 0 \n",
"4 2.0 0 NaN NaN 0 \n",
"\n",
" average_price amount event_type_id name_event_types \n",
"0 0.0 NaN NaN NaN \n",
"1 0.0 NaN NaN NaN \n",
"2 0.0 NaN NaN NaN \n",
"3 0.0 NaN NaN NaN \n",
"4 0.0 NaN NaN NaN "
]
},
"execution_count": 234,
"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\", \"product_id\",\n",
" \"nb_tickets\", \"ticket_sum\", \"average_price\", \"amount\", \"event_type_id\", \"name_event_types\"]]\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 235,
"id": "80120f51-f91e-4d4d-9578-1dc88cd94754",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"shape : (206713, 14)\n",
"Nombre de customer unique : 151866\n",
"Nombre de ligne où produit est non nul : 128358\n"
]
}
],
"source": [
"print(\"shape : \", df.shape)\n",
"print(\"Nombre de customer unique : \", len(df[\"customer_id\"].unique()))\n",
"print(\"Nombre de ligne où produit est non nul : \", df[\"product_id\"].count())"
]
},
{
"cell_type": "code",
"execution_count": 236,
"id": "ae277ede-cc97-4303-a2d4-3381ccb98a5c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"78355"
]
},
"execution_count": 236,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"206713-128358"
]
},
{
"cell_type": "code",
"execution_count": 237,
"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",
"Nombre de type d'évènement (nom) : 4\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>customer_id</th>\n",
" <th>gender</th>\n",
" <th>is_partner</th>\n",
" <th>is_email_true</th>\n",
" <th>nb_campaigns</th>\n",
" <th>nb_campaigns_opened</th>\n",
" <th>fidelity</th>\n",
" <th>product_id</th>\n",
" <th>nb_tickets</th>\n",
" <th>ticket_sum</th>\n",
" <th>average_price</th>\n",
" <th>amount</th>\n",
" <th>event_type_id</th>\n",
" <th>name_event_types</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>162</th>\n",
" <td>309255</td>\n",
" <td>2</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>2.0</td>\n",
" <td>2.0</td>\n",
" <td>0</td>\n",
" <td>264371.0</td>\n",
" <td>2.0</td>\n",
" <td>0</td>\n",
" <td>0.0</td>\n",
" <td>11.0</td>\n",
" <td>4.0</td>\n",
" <td>spectacle vivant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>195</th>\n",
" <td>7772</td>\n",
" <td>0</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>133.0</td>\n",
" <td>19.0</td>\n",
" <td>0</td>\n",
" <td>222125.0</td>\n",
" <td>1.0</td>\n",
" <td>5</td>\n",
" <td>2.8</td>\n",
" <td>6.0</td>\n",
" <td>4.0</td>\n",
" <td>spectacle vivant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>196</th>\n",
" <td>7772</td>\n",
" <td>0</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>133.0</td>\n",
" <td>19.0</td>\n",
" <td>0</td>\n",
" <td>222126.0</td>\n",
" <td>2.0</td>\n",
" <td>5</td>\n",
" <td>2.8</td>\n",
" <td>4.0</td>\n",
" <td>4.0</td>\n",
" <td>spectacle vivant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>197</th>\n",
" <td>7772</td>\n",
" <td>0</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>133.0</td>\n",
" <td>19.0</td>\n",
" <td>0</td>\n",
" <td>222571.0</td>\n",
" <td>2.0</td>\n",
" <td>5</td>\n",
" <td>2.8</td>\n",
" <td>0.0</td>\n",
" <td>4.0</td>\n",
" <td>spectacle vivant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>199</th>\n",
" <td>280009</td>\n",
" <td>0</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>116.0</td>\n",
" <td>32.0</td>\n",
" <td>1</td>\n",
" <td>266306.0</td>\n",
" <td>1.0</td>\n",
" <td>1</td>\n",
" <td>11.0</td>\n",
" <td>11.0</td>\n",
" <td>4.0</td>\n",
" <td>spectacle vivant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>206703</th>\n",
" <td>295224</td>\n",
" <td>2</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>10.0</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" <td>340286.0</td>\n",
" <td>3.0</td>\n",
" <td>98</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>offre muséale individuel</td>\n",
" </tr>\n",
" <tr>\n",
" <th>206704</th>\n",
" <td>295224</td>\n",
" <td>2</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>10.0</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" <td>340287.0</td>\n",
" <td>62.0</td>\n",
" <td>98</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>offre muséale individuel</td>\n",
" </tr>\n",
" <tr>\n",
" <th>206705</th>\n",
" <td>295224</td>\n",
" <td>2</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>10.0</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" <td>340288.0</td>\n",
" <td>33.0</td>\n",
" <td>98</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>2.0</td>\n",
" <td>offre muséale individuel</td>\n",
" </tr>\n",
" <tr>\n",
" <th>206711</th>\n",
" <td>295366</td>\n",
" <td>2</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" <td>216060.0</td>\n",
" <td>3.0</td>\n",
" <td>3</td>\n",
" <td>11.0</td>\n",
" <td>11.0</td>\n",
" <td>4.0</td>\n",
" <td>spectacle vivant</td>\n",
" </tr>\n",
" <tr>\n",
" <th>206712</th>\n",
" <td>295368</td>\n",
" <td>2</td>\n",
" <td>False</td>\n",
" <td>True</td>\n",
" <td>5.0</td>\n",
" <td>0.0</td>\n",
" <td>1</td>\n",
" <td>264331.0</td>\n",
" <td>2.0</td>\n",
" <td>2</td>\n",
" <td>11.0</td>\n",
" <td>11.0</td>\n",
" <td>4.0</td>\n",
" <td>spectacle vivant</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>128358 rows × 14 columns</p>\n",
"</div>"
],
"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",
"196 7772 0 False True 133.0 \n",
"197 7772 0 False True 133.0 \n",
"199 280009 0 False True 116.0 \n",
"... ... ... ... ... ... \n",
"206703 295224 2 False True 10.0 \n",
"206704 295224 2 False True 10.0 \n",
"206705 295224 2 False True 10.0 \n",
"206711 295366 2 False True 5.0 \n",
"206712 295368 2 False True 5.0 \n",
"\n",
" nb_campaigns_opened fidelity product_id nb_tickets ticket_sum \\\n",
"162 2.0 0 264371.0 2.0 0 \n",
"195 19.0 0 222125.0 1.0 5 \n",
"196 19.0 0 222126.0 2.0 5 \n",
"197 19.0 0 222571.0 2.0 5 \n",
"199 32.0 1 266306.0 1.0 1 \n",
"... ... ... ... ... ... \n",
"206703 0.0 1 340286.0 3.0 98 \n",
"206704 0.0 1 340287.0 62.0 98 \n",
"206705 0.0 1 340288.0 33.0 98 \n",
"206711 0.0 1 216060.0 3.0 3 \n",
"206712 0.0 1 264331.0 2.0 2 \n",
"\n",
" average_price amount event_type_id name_event_types \n",
"162 0.0 11.0 4.0 spectacle vivant \n",
"195 2.8 6.0 4.0 spectacle vivant \n",
"196 2.8 4.0 4.0 spectacle vivant \n",
"197 2.8 0.0 4.0 spectacle vivant \n",
"199 11.0 11.0 4.0 spectacle vivant \n",
"... ... ... ... ... \n",
"206703 0.0 0.0 2.0 offre muséale individuel \n",
"206704 0.0 0.0 2.0 offre muséale individuel \n",
"206705 0.0 0.0 2.0 offre muséale individuel \n",
"206711 11.0 11.0 4.0 spectacle vivant \n",
"206712 11.0 11.0 4.0 spectacle vivant \n",
"\n",
"[128358 rows x 14 columns]"
]
},
"execution_count": 237,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Filter only customer that buy tickets\n",
"\n",
"df_purchase = df.dropna(subset= [\"product_id\"])\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": 239,
"id": "0cc96c4e-f3f3-43d2-94b5-a11719f09607",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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Sfai6ezZsyhVqhRMTU3xxRdfYMuWLfD29gYAtGrVCqtXr8a+ffswa9YsnDx5Ek2bNkVubi4AIDU1FSYmJrCxsVHZp6OjI1JTU6U+Dg4Oas/r4OCg0sfR0VFlu42NDUxMTKQ+RZk6dao0T0qpVMLV1fX13wgiIiLSa7LOaQIALy8vxMXFITMzE5s2bUJ4eDgOHjwIb29v6ZAbAPj4+KBOnTpwc3PDjh070LFjx5fuUwgBhUIh3X/+32/S50UjR47EkCFDpPvZ2dksnIiIiEoo2UeaTExM4OnpiTp16mDq1KmoXr06fvjhhyL7Ojs7w83NDZcuXQIAODk54cmTJ8jIyFDpl5aWJo0cOTk54fbt22r7unPnjkqfF0eUMjIykJeXpzYC9TxTU1PpzL/CGxEREZVMshdNLxJCSIffXnTv3j0kJyfD2dkZAFC7dm0YGxtj9+7dUp+UlBScO3cOgYGBAICAgABkZWXhxIkTUp/jx48jKytLpc+5c+eQkpIi9YmOjoapqSlq166t89dIRERE7x5ZD8+NGjUKrVq1gqurK+7fv49169bhwIEDiIqKwoMHDzB+/Hh8/PHHcHZ2xtWrVzFq1CjY2dmhQ4cOAAClUolevXph6NChKFOmDGxtbREZGQlfX180b94cAFC1alW0bNkSffr0waJFiwA8W3IgJCQEXl5eAICgoCB4e3sjLCwMM2bMQHp6OiIjI9GnTx+OHhEREREAmYum27dvIywsDCkpKVAqlfDz80NUVBRatGiBR48e4ezZs1ixYgUyMzPh7OyMJk2aYP369bCyspL2MWfOHBgZGaFz58549OgRmjVrhmXLlklrNAHA6tWrERERIZ1l17ZtW/z444/SdkNDQ+zYsQP9+/dH/fr1YW5ujtDQUMycOfPtvRlERESk1/RunaZ3GddpIiIiXeA6TW/XO7dOExEREZE+Y9FEREREpAEWTUREREQaYNFEREREpAEWTUREREQaYNFEREREpAEWTUREREQaYNFEREREpAEWTUREREQaYNFEREREpAEWTUREREQaYNFEREREpAEWTUREREQaYNFEREREpAEWTUREREQaYNFEREREpAEWTUREREQaYNFEREREpAEWTUREREQaYNFEREREpAEWTUREREQaYNFEREREpAEWTUREREQaYNFEREREpAEWTUREREQaYNFEREREpAEW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69evx5o1a1BXV4fCwsJhc27ZsgWLFi3C1KlTkZSUBA8PD5w9exY//PAD3njjDQB3Vl2WL1+O999/HxcuXEBVVZV6vK+vLzIzM7Fx40YoioK5c+eio6MDNTU18Pb2drmQciXHSIzGvEFBQVAUBYcOHcLChQthMBjg4+Mz4kxE/wpaN1UR0T/T3Y3g/ZqamgSA5OTkDHgPgLz33nvyxBNPiE6nk6CgICkuLnYa09bWJlarVSZNmiQ6nU5CQ0Nl9erV6rfWBlNeXi5ms1l0Op3Ex8fL7t2779nEXFFRIRaLRQwGg5hMJomNjZUPP/zQacz58+cFgAQFBTk1mouI9PX1yTvvvCPh4eHi5eUl/v7+kpiYKN9++62IDN5IXV9fLwCkubnZ5RwApLS0VN1ubm4WAFJfX6/uG+xc9zuviIifn58UFBSo29u2bZMpU6aIoijy/PPPD3ktidyFIjKChgAioiEcO3YM8+bNw+XLl9Wm5X6KoqC0tBRLlizRJhwR0V/A23NENCq6u7vR2tqKV199Fc8888yAgomI6J+OTwQnolFRXFyM8PBwXL9+HTk5OVrHISIadbw9R0REROQCrjQRERERuYBFExEREZELWDQRERERuYBFExEREZELWDQRERERuYBFExEREZELWDQRERERuYBFExEREZELWDQRERERueA/rUgL/07s4KUAAAAASUVORK5CYII=",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"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": 238,
"id": "e37ad847-7ea5-4afe-9c6d-e07a668d2a27",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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Ly8vxMXFybcHDx6oOj4RERERqYHax/B+rj///BO3bt2Cn59fjrfV0tJCnTp1PtrDq6enBz09vdxEJCIiIqI8KN/08K5evRq1atVC9erVc7ytEAKXL1+GtbX1F0hGRERERHmZSnp44+PjceLECVSoUAGVKlXK0bYJCQm4c+eOfD8iIgKXL1+GmZkZSpYsKe9/x44d+O2337Ldh4eHB2xtbeHj4wMAmDJlCurXr49y5cohPj4eCxcuxOXLl7FkyRIlHyERERER5VdKFbxdunRB48aNMWTIELx58wa1a9fGvXv3IITAtm3bPjlHbmYXLlxAkyZN5PujRo0CAHh6emLdunUAgG3btkEIgW7dumW7j8jISGhp/ddZHRsbi/79+yM6OhomJiZwcnLCqVOnULduXSUeLRERERHlZ5IQQuR0IysrKxw9ehTVq1fHli1bMHnyZFy5cgXr16/HypUrPzkFWH4QHx8PExMTxMXFoUiRIuqOQ6Q2pcYfVHeEfOferLbqjkBEVCB8br2m1BjeuLg4mJmZAQCOHDkCd3d3GBoaom3bth89MYyIiIiI6GtTquC1s7NDaGgoEhMTceTIEbRs2RIA8PLlS16+l4iIiIjyFKXG8I4YMQI9evSAkZERSpYsCVdXVwDAqVOn4OjoqMp8RERERES5olTBO2jQINStWxcPHjxAixYt5BPGypQpg+nTp6s0IBERERFRbig9LVnt2rVRrVo1REREwMHBAdra2mjblidqEBEREVHeotQY3tevX6Nv374wNDRElSpVEBkZCQAYNmwYZs2apdKARERERES58VkF74oVK3Dx4kX5vpeXF65cuYKTJ08qnKTWvHlzpS79S0RERET0pXxWwVuxYkV06NABAQEBAIDdu3dj8eLF+OabbyBJkrxe5cqVcffu3S+TlIiIiIhICZ9V8Lq4uODUqVPw9vYGADx//hwWFhZZ1ktMTFQogImIiIiI1O2zx/CWLl0awcHBAIA6derg4MH/rr6UUeT+8ccfaNCggYojEhEREREpL0ezNOjo6AAAfHx80Lp1a1y/fh2pqan4/fffER4ejtDQULkoJiIiIiLKC5SapcHZ2RmnT5/G69ev4eDggICAAFhaWiI0NBS1atVSdUYiIiIiIqUpPQ+vo6Mj1q9fr8osREREREQqp1QPb6FChfD06dMs7TExMShUqFCuQxERERERqYpSBa8QItv25ORk6Orq5ioQEREREZEq5WhIw8KFCwG8m5Vh1apVMDIykpelpaXh1KlTqFixomoTEhERERHlQo4K3gULFgB418O7fPlyheELurq6KFWqFJYvX67ahEREREREuZCjgjciIgIA0KRJE/j7+6No0aJfJBQRERERkaooNYY3KCgIRYsWxdu3b3Hr1i2kpqaqOhcRERERkUooNS3ZmzdvMGTIEHlasn/++QdlypTBsGHDYGNjg/Hjx6s0JGVVavzBT69ECu7NaqvuCERERKQGSvXwjh8/HleuXMHJkyehr68vtzdv3hx+fn4qC0dERERElFtK9fDu2bMHfn5+qF+/PiRJktsrV66Mu3fvqiwcEREREVFuKdXD++zZM1hYWGRpT0xMVCiAiYiIiIjUTamCt06dOjh48L8xpBlF7h9//IEGDRqoJhkRERERkQooNaTBx8cHrVu3xvXr15Gamorff/8d4eHhCA0NRXBwsKozEhEREREpTakeXmdnZ5w+fRqvX7+Gg4MDAgICYGlpidDQUNSqVUvVGYmIiIiIlKZUDy8AODo6ytOSERERERHlVUoXvOnp6bhz5w6ePn2K9PR0hWWNGzfOdTAiIiIiIlVQquA9e/Ysunfvjvv370MIobBMkiSkpaWpJBwRERERUW4pVfD+/PPPqF27Ng4ePAhra2tORUZEREREeZZSBe/t27exc+dOlC1bVtV5iIiIiIhUSqlZGurVq4c7d+6oOgsRERERkcp9dg9vWFiY/P+hQ4di9OjRiI6OhqOjI3R0dBTWrVatmuoSEhERERHlwmcXvDVq1IAkSQonqfXp00f+f8YynrRGRERERHnJZw9piIiIwL///ouIiIhsbxnL/v333xwFOHXqFL799lvY2NhAkiTs2bNHYXmvXr0gSZLCrX79+p/c765du1C5cmXo6emhcuXK2L17d45yEREREZFm+OweXnt7+y8SIDExEdWrV0fv3r3h7u6e7TqtW7fG2rVr5fu6urof3WdoaCi6du2KadOmoWPHjti9eze6dOmCkJAQ1KtXT6X5iYiIiChvU2qWBh8fH1haWioMaQCANWvW4NmzZxg3btxn78vNzQ1ubm4fXUdPTw9WVlafvU9fX1+0aNECXl5eAAAvLy8EBwfD19cXW7du/ez9EBEREVH+p9QsDStWrEDFihWztFep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hYVh8+bNuHLlCgwMDNC7d29069YNOjo6qs5IRERERKQ0pQpeAChcuDD69++vyixERERERCr32QXvvn374ObmBh0dHXnmhA9p3759roMREREREalCji4tHB0dDQsLi49eZliSJKSlpakiGxERERFRrn12wZuenp7t/4mIiIiI8jKlpiXbsGEDkpOTs7S/ffsWGzZsyHUoIiIiIiJVUarg7d27t8IcvBlevXqF3r175zoUEREREZGqKFXwCiEgSVKW9ocPH8LExCTXoYiIiIiIVCVH05I5OTlBkiRIkoRmzZopXEY4LS0NERERaN26tcpDEhEREREpK0cFb8bsDJcvX0arVq1gZGQkL9PV1UWpUqXg7u6u0oBERERERLmRo4J38uTJAIBSpUqha9eu0NfX/yKhiIiIiL6UUuMPqjtCvnNvVlt1R8gVpa605unpqeocRERERERfhFInrRERERER5RcseImIiIhIo7HgJSIiIiKNlquC9+3bt7h16xZSU1NVlYeIiIiISKWUKnhfv36Nvn37wtDQEFWqVEFkZCQAYNiwYZg1a5ZKAxIRERER5YZSBa+XlxeuXLmCkydPKkxN1rx5c/j5+aksHBERERFRbik1LdmePXvg5+eH+vXrK1xiuHLlyrh7967KwhERERER5ZZSPbzPnj2DhYVFlvbExESFApiIiIiISN2UKnjr1KmDgwf/u0pJRpH7xx9/oEGDBqpJRkRERESkAkoNafDx8UHr1q1x/fp1pKam4vfff0d4eDhCQ0MRHBys6oxEREREREpTqofX2dkZp0+fxuvXr+Hg4ICAgABYWloiNDQUtWrVUnVGIiIiIiKlKdXDCwCOjo5Yv369KrMQEREREancZxe88fHxn73TIkWKKBWGiIiIiEjVPrvgNTU1/ewZGNLS0pQORERERESkSp9d8AYFBcn/v3fvHsaPH49evXrJszKEhoZi/fr18PHxUX1KIiIiIiIlfXbB6+LiIv9/6tSpmD9/Prp16ya3tW/fHo6Ojli5ciU8PT1Vm5KIiIiISElKzdIQGhqK2rVrZ2mvXbs2/vrrr1yHIiIiIiJSFaUKXjs7OyxfvjxL+4oVK2BnZ5frUEREREREqqLUtGQLFiyAu7s7jh49ivr16wMAzp49i7t372LXrl0qDUhERERElBtK9fC2adMGt2/fRocOHfDixQvExMSg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6yM+Pj5L+61bt2Bubp7rUEREREREqqJUwduhQwdMnToVKSkpAABJkhAZGYnx48fD3d1dpQGJiIiIiHJDqYJ33rx5ePbsGSwsLPDmzRu4uLigbNmyMDY2xowZM1SdkYiIiIhIaUrN0lCkSBGEhITgxIkTuHjxItLT01GzZk00b95c1fmIiIiIiHIlxwVvamoq9PX1cfnyZTRt2hRNmzb9ErmIiIiIiFQix0MatLW1YW9vj7S0tC+Rh4iIiIhIpZQawzthwgSFK6wREREREeVVSo3hXbhwIe7cuQMbGxvY29ujcOHCCssvXryoknBERERERLmlVMH73XffqTgGEREREdGXoVTBO3nyZFXnICIiIiL6IpQqeDNcuHABN27cgCRJqFSpEmrVqqWqXEREREREKqFUwfvw4UN069YNp0+fhqmpKQAgNjYWzs7O2Lp1K+zs7FSZkYiIiIhIaUrN0tCnTx+kpKTgxo0bePHiBV68eIEbN25ACIG+ffuqOiMRERERkdKU6uH9888/cebMGVSoUEFuq1ChAhYtWoSGDRuqLBwRERERUW4p1cNbsmRJpKSkZGlPTU2Fra1trkMREREREamKUgXvnDlzMHToUFy4cAFCCADvTmAbPnw45s2bp9KARERERES58dlDGooWLQpJkuT7iYmJqFevHrS13+0iNTUV2tra6NOnD+fpJSIiIqI847MLXl9f3y8Yg4iIiIjoy/jsgtfT0/NL5iAiIiIi+iJydeGJp0+f4unTp0hPT1dor1atWq5CERERERGpilIF799//w1PT0957t3MJElCWlqaSsIREREREeWWUgVv7969Ub58eaxevRqWlpYKJ7MREREREeUlShW8ERER8Pf3R9myZVWdh4iIiIhIpZSah7dZs2a4cuWKqrMQEREREamcUj28q1atgqenJ65du4aqVatCR0dHYXn79u1VEo6IiIiIKLeUKnjPnDmDkJAQHD58OMsynrRGRERERHmJUkMahg0bhp49eyIqKgrp6ekKNxa7RERERJSXKFXwxsTEYOTIkbC0tFR1HiIiIiIilVKq4P3+++8RFBSk6ixERERERCqn1Bje8uXLw8vLCyEhIXB0dMxy0tqwYcNUEg4AvL29MWXKFIU2S0tLREdHf3Cb4OBgjBo1CuHh4bCxscHYsWPx888/qywTEREREeUfSs/SYGRkhODgYAQHBysskyRJpQUvAFSpUgXHjh2T7xcqVOiD60ZERKBNmzbo168fNm3ahNOnT2PQoEEwNzeHu7u7SnMRERERUd6n9IUnviZtbW1YWVl91rrLly9HyZIl4evrCwCoVKkSLly4gHnz5rHgJSIiIiqAlBrDm5kQAkIIVWT5oNu3b8PGxgalS5fGDz/8gH///feD64aGhqJly5YKba1atcKFCxeQkpLywe2Sk5MRHx+vcCMiIiKi/E/pgnfDhg1wdHSEgYEBDAwMUK1aNWzcuFGV2QAA9erVw4YNG3D06FH88ccfiI6OhrOzM2JiYrJdPzo6OsvsEZaWlkhNTcXz588/+HN8fHxgYmIi3+zs7FT6OIiIiIhIPZQqeOfPn4+BAweiTZs22L59O/z8/NC6dWv8/PPPWLBggUoDurm5wd3dHY6OjmjevDkOHjwIAFi/fv0Ht5EkSeF+Rg/0++2ZeXl5IS4uTr49ePBABemJiIiISN2UGsO7aNEiLFu2DB4eHnJbhw4dUKVKFXh7e2PkyJEqC/i+woULw9HREbdv3852uZWVVZYZHJ4+fQptbW0UK1bsg/vV09ODnp6eSrMSERERkfop1cMbFRUFZ2fnLO3Ozs6IiorKdaiPSU5Oxo0bN2BtbZ3t8gYNGiAwMFChLSAgALVr184yfRoRERERaT6lCt6yZcti+/btWdr9/PxQrly5XIfKbMyYMQgODkZERATOnTuHTp06IT4+Hp6engDeDUXI3NP8888/4/79+xg1ahRu3LiBNWvWYPXq1RgzZoxKcxERERFR/qDUkIYpU6aga9euOHXqFBo2bAhJkhASEoLjx49nWwjnxsOHD9GtWzc8f/4c5ubmqF+/Ps6ePQt7e3sA73qbIyMj5fVLly6NQ4cOYeTIkViyZAlsbGywcOFCTklGREREVEApVfC6u7vj3LlzWLBgAfbs2QMhBCpXroy//voLTk5OKg24bdu2jy5ft25dljYXFxdcvHhRpTmIiIiIKH9SquAFgFq1amHTpk2qzEJEREREpHK5vvAEEREREVFelqMeXi0trY/OZQu8m+s2NTU1V6GIiIiIiFQlRwXv7t27P7jszJkzWLRo0Re/zDARERERUU7kqODt0KFDlrabN2/Cy8sL+/fvR48ePTBt2jSVhSMiIiIiyi2lx/A+fvwY/fr1Q7Vq1ZCamorLly9j/fr1KFmypCrzERERERHlSo4L3ri4OIwbNw5ly5ZFeHg4jh8/jv3796Nq1apfIh8RERERUa7kaEjDnDlzMHv2bFhZWWHr1q3ZDnEgIiIiIspLclTwjh8/HgYGBihbtizWr1+P9evXZ7uev7+/SsIREREREeVWjgpeDw+PT05LRkRERESUl+So4M3uMr5ERERERHkZr7RGRERERBqNBS8RERERaTQWvERERESk0VjwEhEREZFGY8FLRERERBqNBS8RERERaTQWvERERESk0VjwEhEREZFGY8FLRERERBqNBS8RERERaTQWvERERESk0VjwEhEREZFGY8FLRERERBqNBS8RERERaTQWvERERESk0VjwEhEREZFGY8FLRERERBqNBS8RERERaTQWvERERESk0VjwEhEREZFGY8FLRERERBqNBS8RERERaTQWvERERESk0fJ8wevj44M6derA2NgYFhYW+O6773Dr1q2PbnPy5ElIkpTldvPmza+UmoiIiIjyijxf8AYHB2Pw4ME4e/YsAgMDkZqaipYtWyIxMfGT2966dQtRUVHyrVy5cl8hMRERERHlJdrqDvApR44cUbi/du1aWFhY4O+//0bjxo0/uq2FhQVMTU2/YDoiIiIiyuvyfA/v++Li4gAAZmZmn1zXyckJ1tbWaNasGYKCgj66bnJyMuLj4xVuRERERJT/5auCVwiBUaNG4ZtvvkHVqlU/uJ61tTVWrlyJXbt2wd/fHxUqVECzZs1w6tSpD27j4+MDExMT+WZnZ/clHgIRERERfWV5fkhDZkOGDEFYWBhCQkI+ul6FChVQoUIF+X6DBg3w4MEDzJs374PDILy8vDBq1Cj5fnx8PIteIiIiIg2Qb3p4hw4din379iEoKAglSpTI8fb169fH7du3P7hcT08PRYoUUbgRERERUf6X53t4hRAYOnQodu/ejZMnT6J06dJK7efSpUuwtrZWcToiIiIiyuvyfME7ePBgbNmyBXv37oWxsTGio6MBACYmJjAwMADwbjjCo0ePsGHDBgCAr68vSpUqhSpVquDt27fYtGkTdu3ahV27dqntcRARERGReuT5gnfZsmUAAFdXV4X2tWvXolevXgCAqKgoREZGysvevn2LMWPG4NGjRzAwMECVKlVw8OBBtGnT5mvFJiIiIqI8Is8XvEKIT66zbt06hftjx47F2LFjv1AiIiIiIspP8s1Ja0REREREymDBS0REREQajQUvEREREWk0FrxEREREpNFY8BIRERGRRmPBS0REREQajQUvEREREWk0FrxEREREpNFY8BIRERGRRmPBS0REREQajQUvEREREWk0FrxEREREpNFY8BIRERGRRmPBS0REREQajQUvEREREWk0FrxEREREpNFY8BIRERGRRmPBS0REREQajQUvEREREWk0FrxEREREpNFY8BIRERGRRmPBS0REREQajQUvEREREWk0FrxEREREpNFY8BIRERGRRmPBS0REREQajQUvEREREWk0FrxEREREpNFY8BIRERGRRmPBS0REREQajQUvEREREWk0FrxEREREpNFY8BIRERGRRmPBS0REREQaLd8UvEuXLkXp0qWhr6+PWrVq4c8///zo+sHBwahVqxb09fVRpkwZLF++/CslJSIiIqK8JF8UvH5+fhgxYgR+/fVXXLp0CY0aNYKbmxsiIyOzXT8iIgJt2rRBo0aNcOnSJfzyyy8YNmwYdu3a9ZWTExEREZG65YuCd/78+ejbty9++uknVKpUCb6+vrCzs8OyZcuyXX/58uUoWbIkfH19UalSJfz000/o06cP5s2b95WTExEREZG6aas7wKe8ffsWf//9N8aPH6/Q3rJlS5w5cybbbUJDQ9GyZUuFtlatWmH16tVISUmBjo5Olm2Sk5ORnJws34+LiwMAxMfH5/YhfBHpya/VHSHfyauvZV7HYy3neKwph8dazvFYUw6PtZzLq8daRi4hxEfXy/MF7/Pnz5GWlgZLS0uFdktLS0RHR2e7TXR0dLbrp6am4vnz57C2ts6yjY+PD6ZMmZKl3c7OLhfpKS8x8VV3AiooeKzR18Jjjb6WvH6svXr1CiYmJh9cnucL3gySJCncF0JkafvU+tm1Z/Dy8sKoUaPk++np6Xjx4gWKFSv20Z9D/4mPj4ednR0ePHiAIkWKqDsOaTAea/S18Fijr4XHmnKEEHj16hVsbGw+ul6eL3iLFy+OQoUKZenNffr0aZZe3AxWVlbZrq+trY1ixYplu42enh709PQU2kxNTZUPXoAVKVKEb1b6Knis0dfCY42+Fh5rOfexnt0Mef6kNV1dXdSqVQuBgYEK7YGBgXB2ds52mwYNGmRZPyAgALVr1852/C4RERERaa48X/ACwKhRo7Bq1SqsWbMGN27c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",
"text/plain": [
"<Figure size 800x500 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"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": 241,
"id": "e02b260a-fcb7-418b-87a8-de2bb4e6eb0a",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"customer_id 0\n",
"gender 0\n",
"is_partner 0\n",
"is_email_true 0\n",
"nb_campaigns 34417\n",
"nb_campaigns_opened 34417\n",
"fidelity 0\n",
"product_id 0\n",
"nb_tickets 0\n",
"ticket_sum 0\n",
"average_price 22\n",
"amount 0\n",
"event_type_id 0\n",
"name_event_types 0\n",
"dtype: int64"
]
},
"execution_count": 241,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_purchase.isna().sum()"
]
},
{
"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"
]
},
{
"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": [
"<Figure size 800x600 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"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\")"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.13"
}
},
"nbformat": 4,
"nbformat_minor": 5
}