1965 lines
104 KiB
Plaintext
1965 lines
104 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "5bf5c226",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Business Data Challenge - Team 1"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 22,
|
||
"id": "b1a5b9d3",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"import numpy as np\n",
|
||
"import os\n",
|
||
"import s3fs\n",
|
||
"import re\n",
|
||
"import warnings\n",
|
||
"import io\n",
|
||
"import matplotlib.pyplot as plt\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "ecfa2219",
|
||
"metadata": {},
|
||
"source": [
|
||
"Configuration de l'accès aux données"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"id": "1a094277",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"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})"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"id": "30d77451-2df6-4c07-8b15-66e0e990ff03",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Import cleaning and merge functions\n",
|
||
"\n",
|
||
"exec(open('0_Cleaning_and_merge_functions.py').read())\n",
|
||
"\n",
|
||
"exec(open('0_KPI_functions.py').read())\n",
|
||
"\n",
|
||
"# Ignore warning\n",
|
||
"warnings.filterwarnings('ignore')\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 4,
|
||
"id": "f1b44d3e-76bb-4860-b9db-a2840db7cf39",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def load_dataset_2(directory_path, file_name):\n",
|
||
" \"\"\"\n",
|
||
" This function loads csv file\n",
|
||
" \"\"\"\n",
|
||
" file_path = \"bdc2324-data\" + \"/\" + directory_path + \"/\" + directory_path + file_name + \".csv\"\n",
|
||
" with fs.open(file_path, mode=\"rb\") as file_in:\n",
|
||
" df = pd.read_csv(file_in, sep=\",\")\n",
|
||
"\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": "code",
|
||
"execution_count": 5,
|
||
"id": "31ab76f0-fbb1-46f6-b359-97228620c207",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def export_in_temporary(df, output_name):\n",
|
||
" print('Export of dataset :', output_name)\n",
|
||
" FILE_PATH_OUT_S3 = \"ajoubrel-ensae/Temporary\" + \"/\" + output_name + '.csv'\n",
|
||
" with fs.open(FILE_PATH_OUT_S3, 'w') as file_out:\n",
|
||
" df.to_csv(file_out, index = False)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"id": "108fc5ef-c56a-4f03-a867-943d9d6492fd",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def save_file_s3(File_name, type_of_activity):\n",
|
||
" image_buffer = io.BytesIO()\n",
|
||
" plt.savefig(image_buffer, format='png')\n",
|
||
" image_buffer.seek(0)\n",
|
||
" FILE_PATH = f\"projet-bdc2324-team1/stat_desc/{type_of_activity}/\"\n",
|
||
" FILE_PATH_OUT_S3 = FILE_PATH + File_name + type_of_activity + '.png'\n",
|
||
" with fs.open(FILE_PATH_OUT_S3, 'wb') as s3_file:\n",
|
||
" s3_file.write(image_buffer.read())\n",
|
||
" plt.close()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 37,
|
||
"id": "c99b9cb7-00ab-41cf-bde7-38676f5a3d02",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def taux_partner(campany_nb) :\n",
|
||
"\n",
|
||
" is_partner = load_dataset_2(campany_nb, 'customersplus')[['is_partner']].astype(int)\n",
|
||
" percentage_partner = (is_partner['is_partner'].mean()) * 100\n",
|
||
" \n",
|
||
" return percentage_partner\n",
|
||
" \n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 43,
|
||
"id": "6facc27e-f95d-49c5-afe0-8c34b3a0cb94",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"0.0\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"a = 0\n",
|
||
"for nb in [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\", \"13\", \"14\"]:\n",
|
||
" a += taux_partner(nb)\n",
|
||
"\n",
|
||
"print(a/14)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "ccf597b0-b459-4ea5-baf0-5ba8c90915e4",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Cleaning target area and tags"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"id": "fd88e294-e038-4cec-ad94-2bbbc10a4059",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def concatenate_names(names):\n",
|
||
" return ', '.join(names)\n",
|
||
"\n",
|
||
"def targets_KPI(df_target = None):\n",
|
||
" \n",
|
||
" df_target['target_name'] = df_target['target_name'].fillna('').str.lower()\n",
|
||
"\n",
|
||
" # Target name cotegory musees / \n",
|
||
" df_target['target_jeune'] = df_target['target_name'].str.contains('|'.join(['jeune', 'pass_culture', 'etudiant', '12-25 ans', 'student', 'jeunesse']), case=False).astype(int)\n",
|
||
" df_target['target_optin'] = df_target['target_name'].str.contains('|'.join(['optin' ,'opt-in']), case=False).astype(int)\n",
|
||
" df_target['target_optout'] = df_target['target_name'].str.contains('|'.join(['optout', 'unsubscribed']), case=False).astype(int)\n",
|
||
" df_target['target_scolaire'] = df_target['target_name'].str.contains('|'.join(['scolaire' , 'enseignant', 'chercheur', 'schulen', 'école']), case=False).astype(int)\n",
|
||
" df_target['target_entreprise'] = df_target['target_name'].str.contains('|'.join(['b2b', 'btob', 'cse']), case=False).astype(int)\n",
|
||
" df_target['target_famille'] = df_target['target_name'].str.contains('|'.join(['famille', 'enfants', 'family']), case=False).astype(int)\n",
|
||
" df_target['target_newsletter'] = df_target['target_name'].str.contains('|'.join(['nl', 'newsletter']), case=False).astype(int)\n",
|
||
" \n",
|
||
" # Target name category for sport compagnies\n",
|
||
" df_target['target_abonne'] = ((\n",
|
||
" df_target['target_name']\n",
|
||
" .str.contains('|'.join(['abo', 'adh']), case=False)\n",
|
||
" & ~df_target['target_name'].str.contains('|'.join(['hors abo', 'anciens abo']), case=False)\n",
|
||
" ).astype(int))\n",
|
||
" \n",
|
||
" df_target_categorie = df_target.groupby('customer_id')[['target_jeune', 'target_optin', 'target_optout', 'target_scolaire', 'target_entreprise', 'target_famille', 'target_newsletter', 'target_abonne']].max()\n",
|
||
" \n",
|
||
" target_agg = df_target.groupby('customer_id').agg(\n",
|
||
" nb_targets=('target_name', 'nunique') # Utilisation de tuples pour spécifier les noms de colonnes\n",
|
||
" # all_targets=('target_name', concatenate_names),\n",
|
||
" # all_target_types=('target_type_name', concatenate_names)\n",
|
||
" ).reset_index()\n",
|
||
"\n",
|
||
" target_agg['nb_targets'] = (target_agg['nb_targets'] - (target_agg['nb_targets'].mean())) / (target_agg['nb_targets'].std())\n",
|
||
" \n",
|
||
" target_agg = pd.merge(target_agg, df_target_categorie, how='left', on='customer_id')\n",
|
||
" \n",
|
||
" return target_agg"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 15,
|
||
"id": "1b124018-9637-463e-b512-15743ec9480b",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"File path : projet-bdc2324-team1/0_Input/Company_5/target_information.csv\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>nb_targets</th>\n",
|
||
" <th>target_jeune</th>\n",
|
||
" <th>target_optin</th>\n",
|
||
" <th>target_optout</th>\n",
|
||
" <th>target_scolaire</th>\n",
|
||
" <th>target_entreprise</th>\n",
|
||
" <th>target_famille</th>\n",
|
||
" <th>target_newsletter</th>\n",
|
||
" <th>target_abonne</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>160516</td>\n",
|
||
" <td>6.938264</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>160517</td>\n",
|
||
" <td>10.357387</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>160518</td>\n",
|
||
" <td>5.228703</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>160519</td>\n",
|
||
" <td>6.083483</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>160520</td>\n",
|
||
" <td>2.949288</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</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",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>471205</th>\n",
|
||
" <td>6405875</td>\n",
|
||
" <td>-0.754762</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>471206</th>\n",
|
||
" <td>6405905</td>\n",
|
||
" <td>-0.469835</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>471207</th>\n",
|
||
" <td>6405909</td>\n",
|
||
" <td>-0.754762</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>471208</th>\n",
|
||
" <td>6405917</td>\n",
|
||
" <td>-0.754762</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>471209</th>\n",
|
||
" <td>6405963</td>\n",
|
||
" <td>-0.754762</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>1</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>471210 rows × 10 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" customer_id nb_targets target_jeune target_optin target_optout \\\n",
|
||
"0 160516 6.938264 0 1 0 \n",
|
||
"1 160517 10.357387 0 1 1 \n",
|
||
"2 160518 5.228703 0 1 1 \n",
|
||
"3 160519 6.083483 0 1 1 \n",
|
||
"4 160520 2.949288 0 1 0 \n",
|
||
"... ... ... ... ... ... \n",
|
||
"471205 6405875 -0.754762 0 0 1 \n",
|
||
"471206 6405905 -0.469835 0 0 1 \n",
|
||
"471207 6405909 -0.754762 0 0 1 \n",
|
||
"471208 6405917 -0.754762 0 0 1 \n",
|
||
"471209 6405963 -0.754762 0 0 1 \n",
|
||
"\n",
|
||
" target_scolaire target_entreprise target_famille target_newsletter \\\n",
|
||
"0 0 1 0 0 \n",
|
||
"1 0 0 0 0 \n",
|
||
"2 0 0 0 0 \n",
|
||
"3 0 0 1 0 \n",
|
||
"4 0 0 0 0 \n",
|
||
"... ... ... ... ... \n",
|
||
"471205 0 0 0 0 \n",
|
||
"471206 0 0 0 0 \n",
|
||
"471207 0 0 0 0 \n",
|
||
"471208 0 0 0 0 \n",
|
||
"471209 0 0 0 0 \n",
|
||
"\n",
|
||
" target_abonne \n",
|
||
"0 1 \n",
|
||
"1 1 \n",
|
||
"2 1 \n",
|
||
"3 1 \n",
|
||
"4 1 \n",
|
||
"... ... \n",
|
||
"471205 0 \n",
|
||
"471206 0 \n",
|
||
"471207 0 \n",
|
||
"471208 0 \n",
|
||
"471209 0 \n",
|
||
"\n",
|
||
"[471210 rows x 10 columns]"
|
||
]
|
||
},
|
||
"execution_count": 15,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"targets_KPI(display_input_databases('5', file_name = \"target_information\"))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 35,
|
||
"id": "7bbca184-1ec1-43b5-ba50-c5e8343d52e7",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def targets_name_category(df_target=None):\n",
|
||
" if df_target is None:\n",
|
||
" return None\n",
|
||
" \n",
|
||
" df_target['target_name'] = df_target['target_name'].fillna('').str.lower()\n",
|
||
"\n",
|
||
" # Target name category for museums\n",
|
||
" df_target['target_jeune'] = df_target['target_name'].str.contains('|'.join(['jeune', 'pass_culture', 'etudiant', '12-25 ans', 'student', 'jeunesse']), case=False).astype(int)\n",
|
||
" df_target['target_optin'] = df_target['target_name'].str.contains('|'.join(['optin', 'opt-in']), case=False).astype(int)\n",
|
||
" df_target['target_optout'] = df_target['target_name'].str.contains('|'.join(['optout', 'unsubscribed']), case=False).astype(int)\n",
|
||
" df_target['target_scolaire'] = df_target['target_name'].str.contains('|'.join(['scolaire', 'enseignant', 'chercheur', 'schulen', 'école']), case=False).astype(int)\n",
|
||
" df_target['target_entreprise'] = df_target['target_name'].str.contains('|'.join(['b2b', 'btob', 'cse']), case=False).astype(int)\n",
|
||
" df_target['target_famille'] = df_target['target_name'].str.contains('|'.join(['famille', 'enfants', 'family']), case=False).astype(int)\n",
|
||
" df_target['target_newsletter'] = df_target['target_name'].str.contains('|'.join(['nl', 'newsletter']), case=False).astype(int)\n",
|
||
" \n",
|
||
" # Target name category for sport companies\n",
|
||
" df_target['target_abonne'] = ((df_target['target_name']\n",
|
||
" .str.contains('|'.join(['abo', 'adh']), case=False)\n",
|
||
" & ~df_target['target_name'].str.contains('|'.join(['hors abo', 'anciens abo']), case=False))\n",
|
||
" .astype(int))\n",
|
||
"\n",
|
||
" list_target_jeune = df_target[df_target['target_jeune'] == 1]['target_name'].unique()\n",
|
||
" list_target_optin = df_target[df_target['target_optin'] == 1]['target_name'].unique()\n",
|
||
" list_target_optout = df_target[df_target['target_optout'] == 1]['target_name'].unique()\n",
|
||
" list_target_scolaire = df_target[df_target['target_scolaire'] == 1]['target_name'].unique()\n",
|
||
" list_target_entreprise = df_target[df_target['target_entreprise'] == 1]['target_name'].unique()\n",
|
||
" list_target_famille = df_target[df_target['target_famille'] == 1]['target_name'].unique()\n",
|
||
" list_target_newsletter = df_target[df_target['target_newsletter'] == 1]['target_name'].unique()\n",
|
||
" list_target_abonne = df_target[df_target['target_abonne'] == 1]['target_name'].unique()\n",
|
||
"\n",
|
||
" list_all = [list_target_jeune, list_target_optin, list_target_optout, list_target_scolaire,\n",
|
||
" list_target_entreprise, list_target_famille, list_target_newsletter, list_target_abonne]\n",
|
||
"\n",
|
||
" category_name = ['target_jeune', 'target_optin', 'target_optout', 'target_scolaire',\n",
|
||
" 'target_entreprise', 'target_famille', 'target_newsletter', 'target_abonne']\n",
|
||
" \n",
|
||
" liste_category = pd.DataFrame({'category_name': category_name,\n",
|
||
" 'list_target_name': list_all})\n",
|
||
" \n",
|
||
" return liste_category\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 36,
|
||
"id": "fbabcf4d-3ee6-4441-b231-d7ef24b7f160",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"File path : projet-bdc2324-team1/0_Input/Company_7/target_information.csv\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>category_name</th>\n",
|
||
" <th>list_target_name</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>target_jeune</td>\n",
|
||
" <td>[jeunesses vaudoises, etudiant hors ssc 22-23, student supporter club, etudiants hors epfl, student supporter club ehl, etudiants]</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>target_optin</td>\n",
|
||
" <td>[]</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>target_optout</td>\n",
|
||
" <td>[]</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>target_scolaire</td>\n",
|
||
" <td>[]</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>target_entreprise</td>\n",
|
||
" <td>[prospects b2b, prospects survey b2b, b2b à enlever, prospect b2b fc 06.10, prospect b2b rk 06.10]</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>5</th>\n",
|
||
" <td>target_famille</td>\n",
|
||
" <td>[family corner - 20.11.22, family corner - saison 19-20]</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>6</th>\n",
|
||
" <td>target_newsletter</td>\n",
|
||
" <td>[consentements nl lhc, newsletter 2022, b2b à enlever, abonnés newsletter - saison 21-22]</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>7</th>\n",
|
||
" <td>target_abonne</td>\n",
|
||
" <td>[abonnés 23/24, non renouvellement abo 23-24 debout (23.06), résas abos debout - 29.06, abonnés - assis, sondage reconduction abos, sondage nouveaux abos, abonnés b2c - relance 1, abonnés b2c - relance 2, relance abos assis, non renouvellement abo 23-24 assis (23.06), résas abos assis - 29.06, abonnés - playoffs, abonnés - debout, abonnés non vip - saison 22-23, avantage abonné - ticket, paiements abos, campagneabosconcours - abonnés 21-22 en attente, campagneabosconcours - abonnés 22-23, nouveaux abonnés - saison 22-23, abonnements - relance 15.04, abonnements - relance 13.04, abonnements - relance 11.04, abonnements - relance 07.04, abonnés newsletter - saison 21-22, abonnés 1-3 ans, abonnés 1-3 ans - relance, abonnés - non-renouvellement 22-23, abonnés - renoncement playoffs 22, abonnés 5 ans - relance, abonnés - version finale]</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" category_name \\\n",
|
||
"0 target_jeune \n",
|
||
"1 target_optin \n",
|
||
"2 target_optout \n",
|
||
"3 target_scolaire \n",
|
||
"4 target_entreprise \n",
|
||
"5 target_famille \n",
|
||
"6 target_newsletter \n",
|
||
"7 target_abonne \n",
|
||
"\n",
|
||
" list_target_name \n",
|
||
"0 [jeunesses vaudoises, etudiant hors ssc 22-23, student supporter club, etudiants hors epfl, student supporter club ehl, etudiants] \n",
|
||
"1 [] \n",
|
||
"2 [] \n",
|
||
"3 [] \n",
|
||
"4 [prospects b2b, prospects survey b2b, b2b à enlever, prospect b2b fc 06.10, prospect b2b rk 06.10] \n",
|
||
"5 [family corner - 20.11.22, family corner - saison 19-20] \n",
|
||
"6 [consentements nl lhc, newsletter 2022, b2b à enlever, abonnés newsletter - saison 21-22] \n",
|
||
"7 [abonnés 23/24, non renouvellement abo 23-24 debout (23.06), résas abos debout - 29.06, abonnés - assis, sondage reconduction abos, sondage nouveaux abos, abonnés b2c - relance 1, abonnés b2c - relance 2, relance abos assis, non renouvellement abo 23-24 assis (23.06), résas abos assis - 29.06, abonnés - playoffs, abonnés - debout, abonnés non vip - saison 22-23, avantage abonné - ticket, paiements abos, campagneabosconcours - abonnés 21-22 en attente, campagneabosconcours - abonnés 22-23, nouveaux abonnés - saison 22-23, abonnements - relance 15.04, abonnements - relance 13.04, abonnements - relance 11.04, abonnements - relance 07.04, abonnés newsletter - saison 21-22, abonnés 1-3 ans, abonnés 1-3 ans - relance, abonnés - non-renouvellement 22-23, abonnés - renoncement playoffs 22, abonnés 5 ans - relance, abonnés - version finale] "
|
||
]
|
||
},
|
||
"execution_count": 36,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"pd.set_option('display.max_colwidth', None)\n",
|
||
"targets_name_category(display_input_databases('7', file_name = \"target_information\"))"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "c75efea3-b5e8-4a7a-bed4-dd64ae9ff9f2",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"#export_inv_temporary(target_agg, 'Target_kpi_concatenate')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 47,
|
||
"id": "9d224485-3472-4cc7-9825-1a643bc94fef",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"File path : projet-bdc2324-team1/0_Input/Company_10/customerplus_cleaned.csv\n",
|
||
"File path : projet-bdc2324-team1/0_Input/Company_10/target_information.csv\n",
|
||
"File path : projet-bdc2324-team1/0_Input/Company_11/customerplus_cleaned.csv\n",
|
||
"File path : projet-bdc2324-team1/0_Input/Company_11/target_information.csv\n",
|
||
"File path : projet-bdc2324-team1/0_Input/Company_12/customerplus_cleaned.csv\n",
|
||
"File path : projet-bdc2324-team1/0_Input/Company_12/target_information.csv\n",
|
||
"File path : projet-bdc2324-team1/0_Input/Company_13/customerplus_cleaned.csv\n",
|
||
"File path : projet-bdc2324-team1/0_Input/Company_13/target_information.csv\n",
|
||
"File path : projet-bdc2324-team1/0_Input/Company_14/customerplus_cleaned.csv\n",
|
||
"File path : projet-bdc2324-team1/0_Input/Company_14/target_information.csv\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"companies = {'musee' : ['1', '2', '3', '4'], # , '101'\n",
|
||
" 'sport': ['5', '6', '7', '8', '9'],\n",
|
||
" 'musique' : ['10', '11', '12', '13', '14']}\n",
|
||
"\n",
|
||
"nb_compagnie = companies['musique']\n",
|
||
"\n",
|
||
"def load_files(nb_compagnie):\n",
|
||
" targets = pd.DataFrame()\n",
|
||
" \n",
|
||
" # début de la boucle permettant de générer des datasets agrégés pour les 5 compagnies de spectacle\n",
|
||
" for directory_path in nb_compagnie:\n",
|
||
" df_customerplus_clean_0 = display_input_databases(directory_path, file_name = \"customerplus_cleaned\")\n",
|
||
" df_target_information = display_input_databases(directory_path, file_name = \"target_information\")\n",
|
||
" \n",
|
||
" df_target_KPI = targets_KPI(df_target = df_target_information)\n",
|
||
" df_target_KPI = pd.merge(df_customerplus_clean_0[['customer_id']], df_target_KPI, how = 'left', on = 'customer_id')\n",
|
||
"\n",
|
||
" targets_columns = list(df_target_KPI.columns)\n",
|
||
" targets_columns.remove('customer_id')\n",
|
||
" df_target_KPI[targets_columns] = df_target_KPI[targets_columns].fillna(0)\n",
|
||
" \n",
|
||
" # creation de la colonne Number compagnie, qui permettra d'agréger les résultats\n",
|
||
" df_target_KPI[\"number_company\"]=int(directory_path)\n",
|
||
" \n",
|
||
" # Traitement des index\n",
|
||
" df_target_KPI[\"customer_id\"]= directory_path + '_' + df_target_KPI['customer_id'].astype('str')\n",
|
||
" \n",
|
||
" # Concaténation\n",
|
||
" targets = pd.concat([targets, df_target_KPI], ignore_index=True)\n",
|
||
" \n",
|
||
" return targets\n",
|
||
"\n",
|
||
"targets = load_files(nb_compagnie)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 48,
|
||
"id": "3c911274-0ebd-49af-9487-26524ba20e74",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"\n",
|
||
"def target_description(targets, type_of_activity):\n",
|
||
"\n",
|
||
" describe_target = targets.groupby('number_company').agg(\n",
|
||
" prop_target_jeune=('target_jeune', lambda x: (x.sum() / x.count())*100),\n",
|
||
" prop_target_scolaire=('target_scolaire', lambda x: (x.sum() / x.count())*100),\n",
|
||
" prop_target_entreprise=('target_entreprise', lambda x: (x.sum() / x.count())*100),\n",
|
||
" prop_target_famille=('target_famille', lambda x: (x.sum() / x.count())*100),\n",
|
||
" prop_target_optin=('target_optin', lambda x: (x.sum() / x.count())*100),\n",
|
||
" prop_target_optout=('target_optout', lambda x: (x.sum() / x.count())*100),\n",
|
||
" prop_target_newsletter=('target_newsletter', lambda x: (x.sum() / x.count())*100),\n",
|
||
" prop_target_abonne=('target_abonne', lambda x: (x.sum() / x.count())*100))\n",
|
||
"\n",
|
||
" plot = describe_target.plot.bar()\n",
|
||
" \n",
|
||
" # Adding a title\n",
|
||
" plot.set_title(\"Distribution of Targets by Category\")\n",
|
||
" \n",
|
||
" # Adding labels for x and y axes\n",
|
||
" plot.set_xlabel(\"Company Number\")\n",
|
||
" plot.set_ylabel(\"Target Proportion\")\n",
|
||
"\n",
|
||
" plot.set_xticklabels(plot.get_xticklabels(), rotation=0, horizontalalignment='center')\n",
|
||
"\n",
|
||
" \n",
|
||
" # Adding a legend\n",
|
||
" plot.legend([\"Youth\", \"School\", \"Enterprise\", \"Family\", \"Optin\", \"Optout\", \"Newsletter\", \"Subscriber\"], title=\"Target Category\")\n",
|
||
"\n",
|
||
" # save_file_s3(\"target_category_proportion_\", type_of_activity)\n",
|
||
" return plot"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 49,
|
||
"id": "af62ecef-9120-4107-af3e-512588a96800",
|
||
"metadata": {},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/plain": [
|
||
"<Axes: title={'center': 'Distribution of Targets by Category'}, xlabel='Company Number', ylabel='Target Proportion'>"
|
||
]
|
||
},
|
||
"execution_count": 49,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
},
|
||
{
|
||
"data": {
|
||
"image/png": "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",
|
||
"text/plain": [
|
||
"<Figure size 640x480 with 1 Axes>"
|
||
]
|
||
},
|
||
"metadata": {},
|
||
"output_type": "display_data"
|
||
}
|
||
],
|
||
"source": [
|
||
"target_description(targets, 'musique')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "5d91263e-8a97-4cb1-8d94-db8ab0b77cdf",
|
||
"metadata": {
|
||
"jp-MarkdownHeadingCollapsed": true
|
||
},
|
||
"source": [
|
||
"# Brouillon"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "c5e864b1-adad-4267-b956-3f7ef371d677",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"\n",
|
||
"def display_covering_time(df, company, datecover):\n",
|
||
" \"\"\"\n",
|
||
" This function draws the time coverage of each company\n",
|
||
" \"\"\"\n",
|
||
" min_date = df['purchase_date'].min().strftime(\"%Y-%m-%d\")\n",
|
||
" max_date = df['purchase_date'].max().strftime(\"%Y-%m-%d\")\n",
|
||
" datecover[company] = [datetime.strptime(min_date, \"%Y-%m-%d\") + timedelta(days=x) for x in range((datetime.strptime(max_date, \"%Y-%m-%d\") - datetime.strptime(min_date, \"%Y-%m-%d\")).days)]\n",
|
||
" print(f'Couverture Company {company} : {min_date} - {max_date}')\n",
|
||
" return datecover\n",
|
||
"\n",
|
||
"\n",
|
||
"def compute_time_intersection(datecover):\n",
|
||
" \"\"\"\n",
|
||
" This function returns the time coverage for all companies\n",
|
||
" \"\"\"\n",
|
||
" timestamps_sets = [set(timestamps) for timestamps in datecover.values()]\n",
|
||
" intersection = set.intersection(*timestamps_sets)\n",
|
||
" intersection_list = list(intersection)\n",
|
||
" formated_dates = [dt.strftime(\"%Y-%m-%d\") for dt in intersection_list]\n",
|
||
" return sorted(formated_dates)\n",
|
||
"\n",
|
||
"\n",
|
||
"def df_coverage_modelization(sport, coverage_features = 0.7):\n",
|
||
" \"\"\"\n",
|
||
" This function returns start_date, end_of_features and final dates\n",
|
||
" that help to construct train and test datasets\n",
|
||
" \"\"\"\n",
|
||
" datecover = {}\n",
|
||
" for company in sport:\n",
|
||
" df_products_purchased_reduced = display_input_databases(company, file_name = \"products_purchased_reduced\",\n",
|
||
" datetime_col = ['purchase_date'])\n",
|
||
" datecover = display_covering_time(df_products_purchased_reduced, company, datecover)\n",
|
||
" #print(datecover.keys())\n",
|
||
" dt_coverage = compute_time_intersection(datecover)\n",
|
||
" start_date = dt_coverage[0]\n",
|
||
" end_of_features = dt_coverage[int(0.7 * len(dt_coverage))]\n",
|
||
" final_date = dt_coverage[-1]\n",
|
||
" return start_date, end_of_features, final_date\n",
|
||
" "
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "2435097a-95a5-43e1-84d0-7f6b701441ba",
|
||
"metadata": {
|
||
"jp-MarkdownHeadingCollapsed": true
|
||
},
|
||
"source": [
|
||
"# Bases non communes : mise à plat"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "f8f988fb-5aab-4b57-80d1-e242f7e5b384",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"companies = {'musee' : ['1', '2', '3', '4'],\n",
|
||
" 'sport': ['5', '6', '7', '8', '9'],\n",
|
||
" 'musique' : ['10', '11', '12', '13', '14']}\n",
|
||
"\n",
|
||
"all_companies = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14']"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "35ac004f-c191-4f45-a4b1-6d993d9ec38c",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"companies_databases = pd.DataFrame()\n",
|
||
"\n",
|
||
"for i in all_companies:\n",
|
||
" company_databases = pd.DataFrame({'company_number' : [i]})\n",
|
||
"\n",
|
||
" BUCKET = \"bdc2324-data/\"+i\n",
|
||
" for base in fs.ls(BUCKET):\n",
|
||
" match = re.search(r'\\/(\\d+)\\/(\\d+)([a-zA-Z_]+)\\.csv$', base)\n",
|
||
" if match:\n",
|
||
" nom_base = match.group(3)\n",
|
||
" company_databases[nom_base] = 1\n",
|
||
"\n",
|
||
" companies_databases = pd.concat([companies_databases, company_databases])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "8986e477-e6c5-4d6c-83b2-2c90c134b599",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"pd.set_option(\"display.max_columns\", None)\n",
|
||
"companies_databases\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "8fecc3bb-4c03-4144-97c5-615224d9729e",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"pd.reset_option(\"display.max_columns\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "0294ce71-840e-458b-8ffa-cadabbc6da21",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Debut Travail 25/02"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "ca2c8b6a-4965-422e-ba7c-66423a464fc1",
|
||
"metadata": {},
|
||
"source": [
|
||
"## Base communes au types Musée"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "5080f66e-f779-410a-876d-b4fe2795e17e",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"for i in companies['musique']:\n",
|
||
" BUCKET = \"bdc2324-data/\"+i\n",
|
||
" liste_base = []\n",
|
||
" for base in fs.ls(BUCKET):\n",
|
||
" match = re.search(r'\\/(\\d+)\\/(\\d+)([a-zA-Z_]+)\\.csv$', base)\n",
|
||
" if match:\n",
|
||
" nom_base = match.group(3)\n",
|
||
" liste_base.append(nom_base)\n",
|
||
" globals()['base_'+i] = liste_base\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "abd477e1-7479-4c88-a5aa-f987af3f5b79",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Trouver l'intersection entre les cinq listes\n",
|
||
"intersection = set(base_1).intersection(base_2, base_3, base_4, base_101)\n",
|
||
"\n",
|
||
"# Convertir le résultat en liste si nécessaire\n",
|
||
"intersection_liste = list(intersection)\n",
|
||
"\n",
|
||
"print(intersection_liste)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "8d93888f-a511-4ee5-8bc3-d5173a7f119e",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Trouver l'intersection entre les cinq listes\n",
|
||
"intersection = set(base_10).intersection(base_12, base_13, base_14, base_11)\n",
|
||
"\n",
|
||
"# Convertir le résultat en liste si nécessaire\n",
|
||
"intersection_liste = list(intersection)\n",
|
||
"\n",
|
||
"print(intersection_liste)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "10e89669-42bb-4652-a4bc-1a3d1caf4d1a",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"len(intersection_liste)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "7d058b21-a538-4f59-aefb-ef7966f73fdc",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df1_tags = load_dataset_2(\"1\", \"tags\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "aa441f99-733c-4675-8676-bed4682d3324",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df1_structure_tag_mappings = load_dataset_2(\"1\", 'structure_tag_mappings')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "6767a750-14a4-4c05-903e-d2f07170825b",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df1_customersplus = load_dataset_2(\"1\", \"customersplus\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "125e9145-a815-46fd-bdf4-07589508b259",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df1_customersplus.groupby('structure_id')['id'].count().reset_index().sort_values('id', ascending=False).head(20)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "c17a6976-792f-474d-bcff-c89396eddb3f",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df1_customersplus['structure_id'].isna().sum() / len(df1_customersplus['structure_id'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "ecfc155a-cb42-46ec-8da5-33fdcd087355",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"len(df1_structure_tag_mappings)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "071410b8-950d-4fcc-b2b9-57415253c286",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df1_structure_tag_mappings.groupby('tag_id')['structure_id'].count().reset_index().sort_values('structure_id', ascending=False).head(20)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "f48d27a9-14e4-4bb9-a60a-73e9438b58fc",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"?np.sort_values()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "14eaa0ea-02cc-430b-ab9b-38e6637810c3",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def info_colonnes_dataframe(df):\n",
|
||
" # Créer une liste pour stocker les informations sur chaque colonne\n",
|
||
" infos_colonnes = []\n",
|
||
"\n",
|
||
" # Parcourir les colonnes du DataFrame\n",
|
||
" for nom_colonne, serie in df.items(): # Utiliser items() au lieu de iteritems()\n",
|
||
" # Calculer le taux de valeurs manquantes\n",
|
||
" taux_na = serie.isna().mean() * 100\n",
|
||
"\n",
|
||
" # Ajouter les informations à la liste\n",
|
||
" infos_colonnes.append({\n",
|
||
" 'Nom_colonne': nom_colonne,\n",
|
||
" 'Type_colonne': str(serie.dtype),\n",
|
||
" 'Taux_NA': taux_na\n",
|
||
" })\n",
|
||
"\n",
|
||
" # Créer une nouvelle DataFrame à partir de la liste d'informations\n",
|
||
" df_infos_colonnes = pd.DataFrame(infos_colonnes)\n",
|
||
"\n",
|
||
" return df_infos_colonnes"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "6b031c32-d4c8-42a5-9a71-a7810f9bf8d8",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"info_colonnes_dataframe(df1_tags)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "e1a87f27-c4d4-4832-ac20-0c3c54aa4980",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"info_colonnes_dataframe(df1_structure_tag_mappings)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "fa5c65a8-2f74-4f3f-85fc-9ac91e0bb361",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"pd.set_option('display.max_colwidth', None)\n",
|
||
"\n",
|
||
"print(df1_tags['name'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "a59bf932-5b54-4600-81f5-c55ac93ae510",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"pd.set_option('display.max_rows', None)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "a4ab298e-2cae-4865-9f00-4caff5f75ea1",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"print(df1_tags['name'])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "76bffba1-5f7e-4308-9224-437ca66148f8",
|
||
"metadata": {},
|
||
"source": [
|
||
"## KPI sur target_type"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "f6daf22e-6583-4431-a467-660a1dd4e5a4",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": []
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "d91d5895",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"pd.set_option('display.max_colwidth', None)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "c58b17d3",
|
||
"metadata": {},
|
||
"source": [
|
||
"Raisonnement : on prends les target_type qui représente 90% des clients et on fait des catégories dessus."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "6930bff5",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def print_main_target(tenant_id, nb_print = 40):\n",
|
||
" df_target = display_input_databases(tenant_id, \"target_information\")\n",
|
||
"\n",
|
||
" print('Nombre de ciblage : ', len(df_target))\n",
|
||
" nb_customers = df_target['customer_id'].nunique()\n",
|
||
" print('Nombre de client avec étiquette target : ', nb_customers) \n",
|
||
"\n",
|
||
" nb_custumers_per_target = df_target.groupby(\"target_name\")['customer_id'].count().reset_index().sort_values('customer_id', ascending=False)\n",
|
||
" nb_custumers_per_target['cumulative_customers'] = nb_custumers_per_target['customer_id'].cumsum()/len(df_target)\n",
|
||
" nb_custumers_per_target['customer_id'] = nb_custumers_per_target['customer_id']/nb_customers\n",
|
||
"\n",
|
||
" return nb_custumers_per_target.head(nb_print)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "1e7ee1a0",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"pd.set_option(\"max_colwidth\", None)\n",
|
||
"print_main_target('1', 60)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "19f3a2dd-ba3d-4dec-8e10-fed544ab6a53",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"pd.reset_option('display.max_rows')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "b57a28ac",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"print_main_target('2', 25)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "9a65991f",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"print_main_target('3', 70)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "5f34b8bf",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"print_main_target('4', 100)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "52b24d66-92ad-4421-a62b-5cba837f1893",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"pd.set_option('display.max_rows', None)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "40fe3676",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"\n",
|
||
"\n",
|
||
"print_main_target('5', 100)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "820d3600-379b-4245-a977-f1f1fa1f1839",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"print_main_target('6', 100)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "86f64a1b-763a-4e43-9601-a38c80392d47",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"print_main_target('7', 100)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "fbf2ea42-515a-4cdf-a4c1-50f99c379ed9",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"print_main_target('8', 100)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "9684045c-4e25-4952-b099-a559baa5d749",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"print_main_target('9', 100)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "cf8f7816-e7f3-4b7a-a987-8350a76eb140",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"print_main_target('10', 100)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "76c818a5-3c52-4d97-ac81-b7f3f89092bd",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"print_main_target('11', 100)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "603b11e4-5d76-4699-a1b2-e795929edc04",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"print_main_target('12', 100)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "fa93aecd-d117-481e-8507-15e49937ce14",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"print_main_target('13', 100)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "a115ebcf-4488-47f3-9d7e-75a1fca52f0f",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"print_main_target('14', 100)\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "605cced5-052f-4a99-ac26-020c5d2ab633",
|
||
"metadata": {
|
||
"jp-MarkdownHeadingCollapsed": true
|
||
},
|
||
"source": [
|
||
"## KPI sur tags"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "916c3e2b-04d3-4877-b894-8f26f10d926e",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"customersplus = load_dataset_2(\"4\", \"customersplus\")[['id', 'structure_id']]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "46847b24-15a4-464e-969f-f16ed3653f1f",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"structure_tag_mappings = load_dataset_2('4', \"structure_tag_mappings\")[['structure_id', 'tag_id']]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "3c10c69d-735f-453e-96bf-750697d965d0",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"customersplus[customersplus['structure_id'].notna()]['structure_id'].nunique()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "9b0e77b3-5f16-4484-9564-7d3826583418",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"len(customersplus[customersplus['structure_id'].notna()])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "dfa27722-37f9-435a-8221-8aa6f9a4a107",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"structure_tag_mappings['structure_id'].nunique()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "2daabdd5-31e3-4918-9856-9bbc30cde602",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def tags_information(tenant_id, first_tags):\n",
|
||
"\n",
|
||
" customersplus = load_dataset_2(tenant_id, \"customersplus\")[['id', 'structure_id']]\n",
|
||
" customersplus.rename(columns = {'id' : 'customer_id'}, inplace = True)\n",
|
||
" tags = load_dataset_2(tenant_id, \"tags\")[['id', 'name']]\n",
|
||
" tags.rename(columns = {'id' : 'tag_id', 'name' : 'tag_name'}, inplace = True)\n",
|
||
" structure_tag_mappings = load_dataset_2(tenant_id, \"structure_tag_mappings\")[['structure_id', 'tag_id']]\n",
|
||
" \n",
|
||
" customer_tags = pd.merge(customersplus, structure_tag_mappings, on = 'structure_id', how = 'left')\n",
|
||
" customer_tags = pd.merge(customer_tags, tags, on = 'tag_id', how = 'inner')\n",
|
||
" \n",
|
||
" nb_customers_with_tag = customer_tags['customer_id'].nunique()\n",
|
||
" \n",
|
||
" print('Nombre de client avec tag : ', nb_customers_with_tag)\n",
|
||
" print('Proportion de clients avec tags : ', nb_customers_with_tag/len(customersplus))\n",
|
||
" print('Moyenne de tags par client : ', len(customer_tags)/nb_customers_with_tag)\n",
|
||
" \n",
|
||
" info = customer_tags.groupby(['tag_id', 'tag_name'])['customer_id'].count().reset_index().sort_values('customer_id', ascending = False).head(first_tags)\n",
|
||
"\n",
|
||
" return info"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "0b9f5f71-a927-4cc8-bb0c-9538e28d3553",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"tags_information(\"1\", 20)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "bd5bef41-1774-4601-86b5-b7c1aea8f1d2",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"tags_information(\"2\", 20)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "7c2dc3e6-1418-44db-a8c0-4a9d59ec5232",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"load_dataset_2(\"2\", \"tags\")[['id', 'name']]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "c7b2c670-7122-4f67-b1aa-8c80a10f16d8",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"tags_information(\"3\", 20)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "76639995-252d-4a58-83d8-c0c00900c3a9",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"tags_information(\"4\", 20)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "07e91791-d4d4-42b1-ac18-22d3b0b9f7bd",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"tags_information(\"101\", 20)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "87d131cd-ead0-4ef4-a8ee-b09022d08ffa",
|
||
"metadata": {
|
||
"jp-MarkdownHeadingCollapsed": true
|
||
},
|
||
"source": [
|
||
"## KPI product"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "26582be9-cfd1-48ea-a0a7-31101fdeb9d1",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"tenant_id = \"1\"\n",
|
||
"\n",
|
||
"df_product = display_databases(tenant_id, file_name = \"products_purchased_reduced\", datetime_col = ['purchase_date'])\n",
|
||
"\n",
|
||
"df_product.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "533bf499-dd56-4d29-b261-ca1e4928c9c7",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"nb_tickets_per_events = df_product.groupby(['name_event_types', 'name_events'])['ticket_id'].count().reset_index().sort_values('ticket_id', ascending = False)\n",
|
||
"nb_tickets_per_events['prop_tickets'] = round(nb_tickets_per_events['ticket_id']/len(df_product), 3)\n",
|
||
"nb_tickets_per_events"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "1ede9eaa-7f0a-4856-9349-b2747d6a4901",
|
||
"metadata": {
|
||
"jp-MarkdownHeadingCollapsed": true
|
||
},
|
||
"source": [
|
||
"# Fin travail 25/02"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "c437eaec",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Exemple sur Company 1"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "e855f403",
|
||
"metadata": {
|
||
"jp-MarkdownHeadingCollapsed": true
|
||
},
|
||
"source": [
|
||
"## customersplus.csv"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "91a8f8c4",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"a = pd.DataFrame(df1_customersplus.info())"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "2fda171d",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def info_colonnes_dataframe(df):\n",
|
||
" # Créer une liste pour stocker les informations sur chaque colonne\n",
|
||
" infos_colonnes = []\n",
|
||
"\n",
|
||
" # Parcourir les colonnes du DataFrame\n",
|
||
" for nom_colonne, serie in df.items(): # Utiliser items() au lieu de iteritems()\n",
|
||
" # Calculer le taux de valeurs manquantes\n",
|
||
" taux_na = serie.isna().mean() * 100\n",
|
||
"\n",
|
||
" # Ajouter les informations à la liste\n",
|
||
" infos_colonnes.append({\n",
|
||
" 'Nom_colonne': nom_colonne,\n",
|
||
" 'Type_colonne': str(serie.dtype),\n",
|
||
" 'Taux_NA': taux_na\n",
|
||
" })\n",
|
||
"\n",
|
||
" # Créer une nouvelle DataFrame à partir de la liste d'informations\n",
|
||
" df_infos_colonnes = pd.DataFrame(infos_colonnes)\n",
|
||
"\n",
|
||
" return df_infos_colonnes"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "205eeeab",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"def cleaning_date(df, column_name):\n",
|
||
" \"\"\"\n",
|
||
" Nettoie la colonne spécifiée du DataFrame en convertissant les valeurs en datetime avec le format ISO8601.\n",
|
||
"\n",
|
||
" Parameters:\n",
|
||
" - df: DataFrame\n",
|
||
" Le DataFrame contenant la colonne à nettoyer.\n",
|
||
" - column_name: str\n",
|
||
" Le nom de la colonne à nettoyer.\n",
|
||
"\n",
|
||
" Returns:\n",
|
||
" - DataFrame\n",
|
||
" Le DataFrame modifié avec la colonne nettoyée.\n",
|
||
" \"\"\"\n",
|
||
" df[column_name] = pd.to_datetime(df[column_name], utc = True, format = 'ISO8601')\n",
|
||
" return df"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "634282c5",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"a = info_colonnes_dataframe(df1_customersplus)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "0e8d4133",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"a"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "1268ad5a",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"a = pd.DataFrame(df1_customersplus.isna().sum()/len(df1_customersplus)*100)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "bd41dc80",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Selection des variables\n",
|
||
"df1_customersplus_clean = df1_customersplus.copy()\n",
|
||
"\n",
|
||
"cleaning_date(df1_customersplus_clean, 'first_buying_date')\n",
|
||
"cleaning_date(df1_customersplus_clean, 'last_visiting_date')\n",
|
||
"\n",
|
||
"df1_customersplus_clean.drop(['lastname', 'firstname', 'email', 'civility', 'note', 'created_at', 'updated_at', 'deleted_at', 'extra', 'reference', 'extra_field', 'identifier', 'need_reload', 'preferred_category', 'preferred_supplier', 'preferred_formula', 'zipcode', 'last_visiting_date'], axis = 1, inplace=True)\n",
|
||
"df1_customersplus_clean.rename(columns = {'id' : 'customer_id'}, inplace = True)\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "2455d2e1",
|
||
"metadata": {
|
||
"scrolled": true
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"df1_purchases"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "5f9a159d",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df1_purchases.info()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "db201bf7",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Nettoyage purchase_date\n",
|
||
"df1_purchases['purchase_date'] = pd.to_datetime(df1_purchases['purchase_date'], utc = True)\n",
|
||
"df1_purchases['purchase_date'] = pd.to_datetime(df1_purchases['purchase_date'], format = 'ISO8601')"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "bd436fca",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df1_purchases.info()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "83435862",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Selection des variables\n",
|
||
"df1_purchases_clean = df1_purchases[['id', 'purchase_date', 'customer_id']]"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "637bdb72",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Customer information"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"id": "14c52894",
|
||
"metadata": {
|
||
"jp-MarkdownHeadingCollapsed": true
|
||
},
|
||
"source": [
|
||
"## Target area - NLP"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "d83abfbf",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Target.csv cleaning\n",
|
||
"df1_targets_clean = df1_targets[[\"id\", \"target_type_id\", \"name\"]]\n",
|
||
"df1_targets_clean.rename(columns = {'id' : 'target_id' , 'name' : 'target_name'}, inplace = True)\n",
|
||
"\n",
|
||
"# target_type cleaning\n",
|
||
"df1_target_types_clean = df1_target_types[[\"id\",\"is_import\",\"name\"]].add_prefix(\"target_type_\")\n",
|
||
"\n",
|
||
"#customer_target_mappings cleaning\n",
|
||
"df1_customer_target_mappings_clean = df1_customer_target_mappings[[\"id\", \"customer_id\", \"target_id\"]]\n",
|
||
"\n",
|
||
"# Merge target et target_type\n",
|
||
"df1_targets_full = pd.merge(df1_targets_clean, df1_target_types_clean, left_on='target_type_id', right_on='target_type_id', how='inner')\n",
|
||
"df1_targets_full.drop(['target_type_id'], axis = 1, inplace=True)\n",
|
||
"\n",
|
||
"# Merge\n",
|
||
"df1_targets_full = pd.merge(df1_customer_target_mappings_clean, df1_targets_full, left_on='target_id', right_on='target_id', how='inner')\n",
|
||
"df1_targets_full.drop(['target_id'], axis = 1, inplace=True)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "90d71b2c",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df1_targets_test = df1_targets_full[['id', 'customer_id']].groupby(['customer_id']).count()\n",
|
||
"len(df1_targets_test[df1_targets_test['id'] > 1]) / len(df1_targets_test)\n",
|
||
"\n",
|
||
"# 99,6% des 151 000 client visés sont catégorisés plusieurs fois et en moyenne 5 fois... \n",
|
||
"df1_targets_test.mean()\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "2301de1e",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"df1_targets_full.head()"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "75fbc2f7",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Catégorisation des target_name\n",
|
||
"import pandas as pd\n",
|
||
"import nltk\n",
|
||
"from nltk.tokenize import word_tokenize\n",
|
||
"from nltk.corpus import stopwords\n",
|
||
"from nltk.stem import WordNetLemmatizer\n",
|
||
"from nltk.probability import FreqDist\n",
|
||
"\n",
|
||
"# Téléchargement des ressources nécessaires\n",
|
||
"nltk.download('punkt')\n",
|
||
"nltk.download('stopwords')\n",
|
||
"nltk.download('wordnet')\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "55cddf92",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Définition des fonctions de tokenisation, suppression des mots vides et lemmatisation\n",
|
||
"def preprocess_text(texte):\n",
|
||
" # Concaténation des éléments de la liste en une seule chaîne de caractères\n",
|
||
" texte_concat = ' '.join(texte)\n",
|
||
" \n",
|
||
" # Tokenisation des mots\n",
|
||
" tokens = word_tokenize(texte_concat.lower())\n",
|
||
" \n",
|
||
" # Suppression des mots vides (stopwords)\n",
|
||
" stop_words = set(stopwords.words('french'))\n",
|
||
" filtered_tokens = [word for word in tokens if word not in stop_words]\n",
|
||
" \n",
|
||
" # Lemmatisation des mots\n",
|
||
" lemmatizer = WordNetLemmatizer()\n",
|
||
" lemmatized_tokens = [lemmatizer.lemmatize(word) for word in filtered_tokens]\n",
|
||
" \n",
|
||
" return lemmatized_tokens\n",
|
||
"\n",
|
||
"\n",
|
||
"# Appliquer le prétraitement à la colonne de texte\n",
|
||
"df1_targets_full['target_name_tokened'] = df1_targets_full['target_name'].apply(preprocess_text)\n",
|
||
"\n",
|
||
"# Concaténer les listes de mots pour obtenir une liste de tous les mots dans le corpus\n",
|
||
"all_words = [word for tokens in df1_targets_full['target_name_tokened'] for word in tokens]\n",
|
||
"\n",
|
||
"# Calculer la fréquence des mots\n",
|
||
"freq_dist = FreqDist(all_words)\n",
|
||
"\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "7fd98a85",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"# Affichage des mots les plus fréquents\n",
|
||
"print(\"Mots les plus fréquents:\")\n",
|
||
"for mot, freq in freq_dist.most_common(15):\n",
|
||
" print(f\"{mot}: {freq}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"id": "cf94bb1d",
|
||
"metadata": {},
|
||
"outputs": [],
|
||
"source": [
|
||
"import pandas as pd\n",
|
||
"import nltk\n",
|
||
"from nltk.tokenize import word_tokenize\n",
|
||
"from nltk.corpus import stopwords\n",
|
||
"from nltk.stem import WordNetLemmatizer\n",
|
||
"\n",
|
||
"# Téléchargement des ressources nécessaires\n",
|
||
"nltk.download('punkt')\n",
|
||
"nltk.download('stopwords')\n",
|
||
"nltk.download('wordnet')\n",
|
||
"\n",
|
||
"# Création de la DataFrame d'exemple\n",
|
||
"data = {'texte': [\"Le chat noir mange une souris.\", \"Le chien blanc aboie.\"]}\n",
|
||
"df = pd.DataFrame(data)\n",
|
||
"\n",
|
||
"# Fonction pour prétraiter le texte\n",
|
||
"def preprocess_text(texte):\n",
|
||
" # Concaténation des éléments de la liste en une seule chaîne de caractères\n",
|
||
" texte_concat = ' '.join(texte)\n",
|
||
" \n",
|
||
" # Tokenisation des mots\n",
|
||
" tokens = word_tokenize(texte_concat.lower())\n",
|
||
" \n",
|
||
" # Suppression des mots vides (stopwords)\n",
|
||
" stop_words = set(stopwords.words('french'))\n",
|
||
" filtered_tokens = [word for word in tokens if word not in stop_words]\n",
|
||
" \n",
|
||
" # Lemmatisation des mots\n",
|
||
" lemmatizer = WordNetLemmatizer()\n",
|
||
" lemmatized_tokens = [lemmatizer.lemmatize(word) for word in filtered_tokens]\n",
|
||
" \n",
|
||
" return lemmatized_tokens\n",
|
||
"\n",
|
||
"# Appliquer la fonction de prétraitement à la colonne de texte\n",
|
||
"df['texte_preprocessed'] = df['texte'].apply(preprocess_text)\n",
|
||
"\n",
|
||
"# Afficher le résultat\n",
|
||
"print(df)\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.11.6"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 5
|
||
}
|