From 4b19aa8ee0adf8a8a7f787ef5e8123973dc0527d Mon Sep 17 00:00:00 2001 From: dathomasss Date: Sun, 8 Dec 2024 19:24:59 +0100 Subject: [PATCH 1/2] week2 lab3.1 done --- lab-dw-data-structuring-and-combining.ipynb | 845 +++++++++++++++++++- 1 file changed, 838 insertions(+), 7 deletions(-) diff --git a/lab-dw-data-structuring-and-combining.ipynb b/lab-dw-data-structuring-and-combining.ipynb index ec4e3f9..c88a264 100644 --- a/lab-dw-data-structuring-and-combining.ipynb +++ b/lab-dw-data-structuring-and-combining.ipynb @@ -36,14 +36,363 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 167, "id": "492d06e3-92c7-4105-ac72-536db98d3244", "metadata": { "id": "492d06e3-92c7-4105-ac72-536db98d3244" }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
customerstategendereducationcustomer_lifetime_valueincomemonthly_premium_autonumber_of_open_complaintspolicy_typevehicle_classtotal_claim_amount
0RB50392Washingtonno identifiateMaster0.000000e+000.01000.01Personal AutoFour-Door Car2.704934
1QZ44356ArizonafBachelor6.979536e+050.094.01Personal AutoFour-Door Car1131.464935
2AI49188NevadafBachelor1.288743e+0648767.0108.01Personal AutoTwo-Door Car566.472247
3WW63253CaliforniamBachelor7.645862e+050.0106.01Corporate AutoSUV529.881344
4GA49547WashingtonmHigh School or Below5.363077e+0536357.068.01Personal AutoFour-Door Car17.269323
....................................
7065LA72316CaliforniaMBachelor2.340599e+0471941.073.00Personal AutoFour-Door Car198.234764
7066PK87824CaliforniaFCollege3.096511e+0321604.079.00Corporate AutoFour-Door Car379.200000
7067TD14365CaliforniaMBachelor8.163890e+030.085.03Corporate AutoFour-Door Car790.784983
7068UP19263CaliforniaMCollege7.524442e+0321941.096.00Personal AutoFour-Door Car691.200000
7069Y167826CaliforniaMCollege2.611837e+030.077.00Corporate AutoTwo-Door Car369.600000
\n", + "

9134 rows × 11 columns

\n", + "
" + ], + "text/plain": [ + " customer state gender education \\\n", + "0 RB50392 Washington no identifiate Master \n", + "1 QZ44356 Arizona f Bachelor \n", + "2 AI49188 Nevada f Bachelor \n", + "3 WW63253 California m Bachelor \n", + "4 GA49547 Washington m High School or Below \n", + "... ... ... ... ... \n", + "7065 LA72316 California M Bachelor \n", + "7066 PK87824 California F College \n", + "7067 TD14365 California M Bachelor \n", + "7068 UP19263 California M College \n", + "7069 Y167826 California M College \n", + "\n", + " customer_lifetime_value income monthly_premium_auto \\\n", + "0 0.000000e+00 0.0 1000.0 \n", + "1 6.979536e+05 0.0 94.0 \n", + "2 1.288743e+06 48767.0 108.0 \n", + "3 7.645862e+05 0.0 106.0 \n", + "4 5.363077e+05 36357.0 68.0 \n", + "... ... ... ... \n", + "7065 2.340599e+04 71941.0 73.0 \n", + "7066 3.096511e+03 21604.0 79.0 \n", + "7067 8.163890e+03 0.0 85.0 \n", + "7068 7.524442e+03 21941.0 96.0 \n", + "7069 2.611837e+03 0.0 77.0 \n", + "\n", + " number_of_open_complaints policy_type vehicle_class \\\n", + "0 1 Personal Auto Four-Door Car \n", + "1 1 Personal Auto Four-Door Car \n", + "2 1 Personal Auto Two-Door Car \n", + "3 1 Corporate Auto SUV \n", + "4 1 Personal Auto Four-Door Car \n", + "... ... ... ... \n", + "7065 0 Personal Auto Four-Door Car \n", + "7066 0 Corporate Auto Four-Door Car \n", + "7067 3 Corporate Auto Four-Door Car \n", + "7068 0 Personal Auto Four-Door Car \n", + "7069 0 Corporate Auto Two-Door Car \n", + "\n", + " total_claim_amount \n", + "0 2.704934 \n", + "1 1131.464935 \n", + "2 566.472247 \n", + "3 529.881344 \n", + "4 17.269323 \n", + "... ... \n", + "7065 198.234764 \n", + "7066 379.200000 \n", + "7067 790.784983 \n", + "7068 691.200000 \n", + "7069 369.600000 \n", + "\n", + "[9134 rows x 11 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "# Your code goes here" + "import pandas as pd\n", + "\n", + "url = 'https://raw.githubusercontent.com/data-bootcamp-v4/data/main/file1.csv'\n", + "df = pd.read_csv(url)\n", + "\n", + "df.columns = [column.lower() for column in df.columns]\n", + "df.columns = [column.replace(r' ','_') for column in df.columns]\n", + "df = df.rename(columns={'st':'state'})\n", + "\n", + "df['gender'] = df['gender'].replace({\n", + " 'F': 'f',\n", + " 'M': 'm',\n", + " 'Male': 'm',\n", + " 'female': 'f',\n", + " 'Femal': 'f'\n", + "})\n", + "df['state'] = df['state'].replace({\n", + " 'WA' : 'Washington',\n", + " 'AZ' : 'Arizona'})\n", + "df['education'] = df['education'].replace({\n", + " 'Bachelors' : 'Bachelor'})\n", + "df['customer_lifetime_value'] = df['customer_lifetime_value'].replace(r'%','',regex=True)\n", + "\n", + "df['vehicle_class'] = df['vehicle_class'].replace({\n", + " 'Luxury SUV' : 'Luxury',\n", + " 'Luxury Car' : 'Luxury'})\n", + "\n", + "df['customer_lifetime_value'] = df['customer_lifetime_value'].astype(float)\n", + "df['number_of_open_complaints'] = df['number_of_open_complaints'].astype(str)\n", + "df['number_of_open_complaints'] = df['number_of_open_complaints'].apply(lambda x : x.split('/')[0])\n", + "\n", + "df['gender'] = df['gender'].fillna('no identifiate') #All the null value in gender are now = non identifiate\n", + "df.dropna(axis=0, thresh=2, inplace=True)\n", + "df['customer_lifetime_value'] = df['customer_lifetime_value'].fillna(0)\n", + "\n", + "df.drop_duplicates(subset=['state','gender','customer_lifetime_value','income','vehicle_class'],keep='first',inplace=True) \n", + "\n", + "\n", + "url2 = \"https://raw.githubusercontent.com/data-bootcamp-v4/data/main/file2.csv\"\n", + "dr = pd.read_csv(url2)\n", + "\n", + "#corriger colonne\n", + "\n", + "dr.columns = [column.lower() for column in dr.columns]\n", + "dr.columns = [column.replace(' ','_') for column in dr.columns]\n", + "dr = dr.rename(columns={'st':'state'})\n", + "\n", + "#corriger valeur\n", + "\n", + "dr['state'] = dr['state'].replace({'AZ' : 'Arizona'})\n", + "dr['gender'] = dr['gender'].replace({\n", + " 'female' : 'F',\n", + " 'Male' : 'M'})\n", + "dr['education'] = dr['education'].replace({'Bachelors' : 'Bachelor'})\n", + "dr['vehicle_class'] = dr['vehicle_class'].replace({\n", + " 'Luxury Car' : 'Luxury',\n", + " 'Luxury SUV' : 'Luxury'})\n", + "\n", + "dr['customer_lifetime_value'] = dr['customer_lifetime_value'].astype(str)\n", + "dr['customer_lifetime_value'] = dr['customer_lifetime_value'].apply(lambda x : x.split('%')[0])\n", + "dr['customer_lifetime_value'] = dr['customer_lifetime_value'].astype(float)\n", + "\n", + "dr['number_of_open_complaints'] = dr['number_of_open_complaints'].apply(lambda x : x.split('/')[1])\n", + "\n", + "#gérer valeur nulle\n", + "\n", + "dr['gender'] = dr['gender'].fillna('None identifiate')\n", + "dr['customer_lifetime_value'] = dr['customer_lifetime_value'].fillna(dr['customer_lifetime_value'].mean())\n", + "\n", + "#pas de valeur dupliquée\n", + "dup_val = dr.duplicated(subset='customer').sum()\n", + "\n", + "\n", + "url3 = \"https://raw.githubusercontent.com/data-bootcamp-v4/data/main/file3.csv\"\n", + "dd = pd.read_csv(url3)\n", + "#corriger colonne\n", + "\n", + "dd.columns = [column.lower() for column in dd.columns]\n", + "dd.columns = [column.replace(' ','_') for column in dd.columns]\n", + "\n", + "\n", + "#corriger valeur\n", + "dd['vehicle_class'] = dd['vehicle_class'].replace({\n", + " 'Luxury Car' : 'Luxury',\n", + " 'Luxury SUV' : 'Luxury'})\n", + "\n", + "#gérer les valeurs nulles\n", + "#pas de valeure nulle\n", + "\n", + "\n", + "#jointure\n", + "df_concat_outer = pd.concat([df, dr, dd], axis=0, join='outer')\n", + "display(df_concat_outer)\n", + "#display(df)\n", + "#display(dr)\n", + "#display(dd)" ] }, { @@ -72,14 +421,496 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "id": "aa10d9b0-1c27-4d3f-a8e4-db6ab73bfd26", "metadata": { "id": "aa10d9b0-1c27-4d3f-a8e4-db6ab73bfd26" }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sales_channel Agent Branch Call Center Web\n", + "month \n", + "1 838799.471652 625598.134269 410003.453809 316313.671081\n", + "2 733850.277001 518927.178392 373860.023028 280337.834750\n", + "\n", + " total_claim_amount\n", + "month sales_channel \n", + "1 Agent 838799.471652\n", + " Branch 625598.134269\n", + " Call Center 410003.453809\n", + " Web 316313.671081\n", + "2 Agent 733850.277001\n", + " Branch 518927.178392\n", + " Call Center 373860.023028\n", + " Web 280337.834750\n", + "\n", + "education Bachelor College Doctor High School or Below \\\n", + "gender \n", + "F 8011.620310 7776.830147 7548.973667 8593.901714 \n", + "M 7796.123886 8082.364145 7592.708725 8187.410031 \n", + "\n", + "education Master \n", + "gender \n", + "F 8288.020834 \n", + "M 8264.288938 \n", + "\n", + " customer_lifetime_value\n", + "gender education \n", + "F Bachelor 8011.620310\n", + " College 7776.830147\n", + " Doctor 7548.973667\n", + " High School or Below 8593.901714\n", + " Master 8288.020834\n", + "M Bachelor 7796.123886\n", + " College 8082.364145\n", + " Doctor 7592.708725\n", + " High School or Below 8187.410031\n", + " Master 8264.288938\n", + "\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
customerstatecustomer_lifetime_valueresponsecoverageeducationeffective_to_dateemployment_statusgenderincome...number_of_policiespolicy_typepolicyrenew_offer_typesales_channeltotal_claim_amountvehicle_classvehicle_sizevehicle_typemonth
0DK49336Arizona4809.216960NoBasicCollege2011-02-18EmployedM48029...9Corporate AutoCorporate L3Offer3Agent292.800000Four-Door CarMedsizeA2
1KX64629California2228.525238NoBasicCollege2011-01-18UnemployedF0...1Personal AutoPersonal L3Offer4Call Center744.924331Four-Door CarMedsizeA1
2LZ68649Washington14947.917300NoBasicBachelor2011-02-10EmployedM22139...2Personal AutoPersonal L3Offer3Call Center480.000000SUVMedsizeA2
3XL78013Oregon22332.439460YesExtendedCollege2011-01-11EmployedM49078...2Corporate AutoCorporate L3Offer2Branch484.013411Four-Door CarMedsizeA1
4QA50777Oregon9025.067525NoPremiumBachelor2011-01-17Medical LeaveF23675...7Personal AutoPersonal L2Offer1Branch707.925645Four-Door CarMedsizeA1
..................................................................
10903SU71163Arizona2771.663013NoBasicCollege2011-01-07EmployedM59855...1Personal AutoPersonal L2Offer2Branch355.200000Two-Door CarMedsizeA1
10904QI63521Nevada19228.463620NoBasicHigh School or Below2011-02-24UnemployedM0...2Personal AutoPersonal L2Offer1Branch897.600000LuxuryMedsizeA2
10906KX53892Oregon5259.444853NoBasicCollege2011-01-06EmployedF61146...6Personal AutoPersonal L3Offer2Branch273.018929Four-Door CarMedsizeA1
10907TL39050Arizona23893.304100NoExtendedBachelor2011-02-06EmployedF39837...2Corporate AutoCorporate L3Offer1Web381.306996LuxuryMedsizeA2
10908WA60547California11971.977650NoPremiumCollege2011-02-13EmployedF64195...6Personal AutoPersonal L1Offer1Branch618.288849SUVMedsizeA2
\n", + "

9386 rows × 26 columns

\n", + "
" + ], + "text/plain": [ + " customer state customer_lifetime_value response coverage \\\n", + "0 DK49336 Arizona 4809.216960 No Basic \n", + "1 KX64629 California 2228.525238 No Basic \n", + "2 LZ68649 Washington 14947.917300 No Basic \n", + "3 XL78013 Oregon 22332.439460 Yes Extended \n", + "4 QA50777 Oregon 9025.067525 No Premium \n", + "... ... ... ... ... ... \n", + "10903 SU71163 Arizona 2771.663013 No Basic \n", + "10904 QI63521 Nevada 19228.463620 No Basic \n", + "10906 KX53892 Oregon 5259.444853 No Basic \n", + "10907 TL39050 Arizona 23893.304100 No Extended \n", + "10908 WA60547 California 11971.977650 No Premium \n", + "\n", + " education effective_to_date employment_status gender \\\n", + "0 College 2011-02-18 Employed M \n", + "1 College 2011-01-18 Unemployed F \n", + "2 Bachelor 2011-02-10 Employed M \n", + "3 College 2011-01-11 Employed M \n", + "4 Bachelor 2011-01-17 Medical Leave F \n", + "... ... ... ... ... \n", + "10903 College 2011-01-07 Employed M \n", + "10904 High School or Below 2011-02-24 Unemployed M \n", + "10906 College 2011-01-06 Employed F \n", + "10907 Bachelor 2011-02-06 Employed F \n", + "10908 College 2011-02-13 Employed F \n", + "\n", + " income ... number_of_policies policy_type policy \\\n", + "0 48029 ... 9 Corporate Auto Corporate L3 \n", + "1 0 ... 1 Personal Auto Personal L3 \n", + "2 22139 ... 2 Personal Auto Personal L3 \n", + "3 49078 ... 2 Corporate Auto Corporate L3 \n", + "4 23675 ... 7 Personal Auto Personal L2 \n", + "... ... ... ... ... ... \n", + "10903 59855 ... 1 Personal Auto Personal L2 \n", + "10904 0 ... 2 Personal Auto Personal L2 \n", + "10906 61146 ... 6 Personal Auto Personal L3 \n", + "10907 39837 ... 2 Corporate Auto Corporate L3 \n", + "10908 64195 ... 6 Personal Auto Personal L1 \n", + "\n", + " renew_offer_type sales_channel total_claim_amount vehicle_class \\\n", + "0 Offer3 Agent 292.800000 Four-Door Car \n", + "1 Offer4 Call Center 744.924331 Four-Door Car \n", + "2 Offer3 Call Center 480.000000 SUV \n", + "3 Offer2 Branch 484.013411 Four-Door Car \n", + "4 Offer1 Branch 707.925645 Four-Door Car \n", + "... ... ... ... ... \n", + "10903 Offer2 Branch 355.200000 Two-Door Car \n", + "10904 Offer1 Branch 897.600000 Luxury \n", + "10906 Offer2 Branch 273.018929 Four-Door Car \n", + "10907 Offer1 Web 381.306996 Luxury \n", + "10908 Offer1 Branch 618.288849 SUV \n", + "\n", + " vehicle_size vehicle_type month \n", + "0 Medsize A 2 \n", + "1 Medsize A 1 \n", + "2 Medsize A 2 \n", + "3 Medsize A 1 \n", + "4 Medsize A 1 \n", + "... ... ... ... \n", + "10903 Medsize A 1 \n", + "10904 Medsize A 2 \n", + "10906 Medsize A 1 \n", + "10907 Medsize A 2 \n", + "10908 Medsize A 2 \n", + "\n", + "[9386 rows x 26 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "# Your code goes here" + "import pandas as pd\n", + "\n", + "df = pd.read_csv(\"https://raw.githubusercontent.com/data-bootcamp-v4/data/main/marketing_customer_analysis_clean.csv\")\n", + "\n", + "df = df.drop(columns=['unnamed:_0'])\n", + "\n", + "\n", + "#invisble column :\n", + "#marital_status object\n", + "#monthly_premium_auto int64\n", + "#months_since_last_claim float64\n", + "#months_since_policy_inception int64\n", + "#number_of_open_complaints float64\n", + "\n", + "#rename column\n", + "df = df.rename(columns={'employmentstatus':'employment_status'})\n", + "\n", + "#rename val\n", + "df['vehicle_class'] = df['vehicle_class'].replace({\n", + " 'Luxury Car' : 'Luxury',\n", + " 'Luxury SUV' : 'Luxury'})\n", + "\n", + "#check value : good\n", + "#check vall null : good\n", + "\n", + "#check duplicate val \n", + "df.drop_duplicates(subset=['customer','effective_to_date','vehicle_class'],keep='first',inplace=True)\n", + "df.reset_index(drop = True)\n", + "\n", + "#le chiffre d'affaires total pour chaque canal de vente (agence, centre d'appels, Web et courrier)\n", + "#branch, call center, web, and mail).\n", + "grouped = df.groupby(['month','sales_channel']).agg({\n", + " 'total_claim_amount' : 'sum'})\n", + " \n", + "df_pivot = df.pivot_table(index='month', columns='sales_channel', values='total_claim_amount', aggfunc='sum')\n", + "\n", + "#2. Create a pivot table that shows the average customer lifetime value per gender and education level. Analyze the resulting table to draw insights.\n", + "\n", + "df_pivot2 = df.pivot_table(index='gender', columns='education', values='customer_lifetime_value', aggfunc='mean')\n", + "df_pivot_grouped = df.groupby(['gender', 'education']).agg({'customer_lifetime_value':'mean'})\n", + "\n", + "print(df_pivot)\n", + "print()\n", + "print(grouped)\n", + "print()\n", + "print(df_pivot2)\n", + "print()\n", + "print(df_pivot_grouped)\n", + "print()\n", + "display(df)\n", + "\n" ] }, { @@ -160,7 +991,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.13" + "version": "3.12.7" } }, "nbformat": 4, From 4ac7d6c75eb3753ea6c97da110dcc6011d3353d2 Mon Sep 17 00:00:00 2001 From: dathomasss Date: Wed, 18 Dec 2024 16:35:00 +0100 Subject: [PATCH 2/2] week2 lab3.1 done.2 --- lab-dw-data-structuring-and-combining.ipynb | 73 +++++++++++++++++++-- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/lab-dw-data-structuring-and-combining.ipynb b/lab-dw-data-structuring-and-combining.ipynb index c88a264..ac9d6d4 100644 --- a/lab-dw-data-structuring-and-combining.ipynb +++ b/lab-dw-data-structuring-and-combining.ipynb @@ -421,7 +421,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 44, "id": "aa10d9b0-1c27-4d3f-a8e4-db6ab73bfd26", "metadata": { "id": "aa10d9b0-1c27-4d3f-a8e4-db6ab73bfd26" @@ -961,14 +961,79 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 153, "id": "3a069e0b-b400-470e-904d-d17582191be4", "metadata": { "id": "3a069e0b-b400-470e-904d-d17582191be4" }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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AkAWLFigTO/bt6/Y2toazQNAPvvsszzLyl0rw1gqVaokI0eOlE2bNsnkyZPF3NxcevXqJfXr15cvvvhCoqKiZMyYMQJApk+frsyfkJAgAMTDw0OaNGkiv/76q/z888/y8ssvi1qtlpiYGKXv0aNHRavVSq1atWTp0qWyadMmGTlypJiZmcmECRPyrK+7u7u8+eabsm7dOtmwYYPcuHHDZH3u3bsntWvXFltbW5k2bZps2rRJxo8fLxYWFtKhQwcREbl//77s3r1b6tWrJ5UrV1bqrtfrTS5z5cqVAkDmzJmT788lp6SkJHF3d5cKFSrI3LlzJTIyUoYMGSIA5IMPPshTLy8vL+nYsaNs2LBBli9fLq6urlKlShUJCQmRd955R/7880+ZO3eu2NnZSceOHfP8DN3d3cXT01MWLlwoGzdulN69ewsAmTp1ap7XWrRokdIWHR0tI0eOlF9++UWio6MlIiJCOnfuLNbW1nLixImHzvvZZ58JAKlatap8+umnEhUVJTNmzBCNRiNvv/220m/37t1ibW0tHTp0UOp89OhREREZOHCg2NjYyIwZM2Tbtm2yYcMG+eqrr+S77757aH0N26mHh4dSn3nz5omLi4t4eHhIcnKyiIhcvXpVNBqNjBs3zmj+GzduiLW1tYwePfqhr2NYx2vXrhm1f/jhhwJANm3aVKDtzSD3+81UXePj48XOzk68vb1l7ty5smXLFlm+fLl0795dUlJSRESkS5cu4unpKZmZmUbL79atm+h0OsnIyHjoehkY6hgbGysiImlpaeLm5ia9e/c26peRkSE6nU66deumtBn2lTqdTr799lv566+/ZNiwYQJABg8erPTLysqSdu3aia2trUycOFGioqLkxx9/FHd3d6lRo4bcvXu3QGN93jAUkUmGN+3DHo8KRaNHjxaVSqXsiA3atm1rMhQBkL179xr1rVGjhrRt21Z5Hh4eLmZmZsrOxOCXX34RALJx40YREZk2bZoAkFu3buW7jrGxsXl2jA+TMxSJiDRp0kReeOEFuXfvnogUTygaOnSoUb/OnTsLAJkxY4ZRe926daV+/frKc8NOXqfTKeMREUlJSREnJydp1aqV0ta2bVt54YUX8gSRIUOGiJWVldy8edNofZs1a/ao0oiIyNy5cwWA/PTTT0btkydPVj7IDAICAqRmzZqPXOZXX30lACQy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YfTo0fjrr78AAH5+flCr1YiKilLmu3LlCo4cOQJ/f38AQOPGjaHX67Fv3z6lz969e6HX65U+RERERCV691lqairOnDmjPE9ISEB8fDycnJzg6ekJZ2dno/5qtRpubm7KHWNarRb9+/fHyJEj4ezsDCcnJ4waNQq1atVS7karXr062rVrhwEDBuCHH34AALz33nsIDAzknWdERESkKNFQtH//frRo0UJ5PmLECABA3759sXjx4gIt4+uvv4aFhQW6d++Oe/fuoWXLlli8eDHMzc2VPitWrMCwYcOUu9SCgoIe+d1IRERE9HxRiYiU9CDKgpSUFGi1Wuj1el5fRGVaIe9beGZwT0f0fCrM53epvaaIiIiI6GliKCIiIiICQxERERERAIYiIiIiIgAMRUREREQAGIqIiIiIADAUEREREQFgKCIiIiICwFBEREREBIChiIiIiAgAQxERERERAIYiIiIiIgAMRUREREQAGIqIiIiIADAUEREREQFgKCIiIiICwFBEREREBIChiIiIiAgAQxERERERAIYiIiIiIgAMRUREREQAGIqIiIiIADAUEREREQFgKCIiIiICwFBEREREBIChiIiIiAgAQxERERERAIYiIiIiIgAMRUREREQAGIqIiIiIADAUEREREQFgKCIiIiICwFBEREREBIChiIiIiAgAQxERERERAMCipAdARFQWqFQlPYKSIVLSIyB6ekr0SNGOHTvQsWNH6HQ6qFQqrF27VpmWkZGBMWPGoFatWrC1tYVOp0OfPn1w+fJlo2WkpaVh6NChKF++PGxtbREUFISLFy8a9UlOTkZISAi0Wi20Wi1CQkJw69atp7CGREREVFaUaCi6c+cO6tSpg1mzZuWZdvfuXRw4cADjx4/HgQMH8Ntvv+HUqVMICgoy6hcaGoqIiAisXr0au3btQmpqKgIDA5GVlaX0CQ4ORnx8PCIjIxEZGYn4+HiEhIQ88fUjIiKiskMlUjoOjqpUKkRERKBz58759omNjcUrr7yCc+fOwdPTE3q9HhUqVMCyZcvQo0cPAMDly5fh4eGBjRs3om3btjh+/Dhq1KiBPXv2oGHDhgCAPXv2oHHjxjhx4gSqVq1aoPGlpKRAq9VCr9fDwcHhsdeXqKTwNFDRsG5EZVNhPr/L1IXWer0eKpUKjo6OAIC4uDhkZGSgTZs2Sh+dTgdfX1/E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g+DgYACAVqtF//79MXLkSDg7O8PJyQmjRo1CrVq10KpVq5JcPSIiIipFSnUoevnllxEREYGxY8di0qRJqFSpEmbOnInevXsrfT766CPcu3cPgwYNQnJyMho2bIhNmzbB3t5e6fP111/DwsIC3bt3x71799CyZUssXrwY5ubmJbFaREREVAqV6u8pKk34PUX0rOD37RQN60ZUNj0z31NERERE9LQwFBERERGBoYiIiIgIAEMREREREQCGIiIiIiIADEVEREREABiKiIiIiAAwFBEREREBYCgiIiIiAsBQRERERASAoYiIiIgIAEMREREREQCGIiIiIiIADEVEREREABiKiIiIiAAwFBEREREBYCgiIiIiAsBQRERERASAoYiIiIgIAEMREREREQCGIiIiIiIADEVEREREABiKiIiIiAAwFBEREREBYCgiIiIiAsBQRERERASAoYiIiIgIAEMREREREQCGIiIiIiIADEVEREREABiKiIiIiAAwFBEREREBYCgiIiIiAsBQRERERASAoYiIiIgIAEMREREREYAyForCw8OhUqkQGhqqtIkIJkyYAJ1OB2trazRv3hxHjx41mi8tLQ1Dhw5F+fLlYWtri6CgIFy8ePEpj56IiIhKszITimJjYzFv3jzUrl3bqH3KlCmYMWMGZs2ahdjYWLi5uaF169a4ffu20ic0NBQRERFYvXo1du3ahdTUVAQGBiIrK+tprwYRERGVUmUiFKWmpqJ3796YP38+ypUrp7SLCGbOnIlx48aha9eu8PX1xZIlS3D37l2sXLkSAKDX67FgwQJMnz4drVq1Qr169bB8+XIcPnwYmzdvLqlVIiIiolKmTISiwYMH4/XXX0erVq2M2hMSEpCYmIg2bdoobRqNBgEBAYiJiQEAxMXFISMjw6iPTqeDr6+v0seUtLQ0pKSkGD2IiIjo2WVR0gN4lNWrV+PAgQOIjY3NMy0xMREA4OrqatTu6uqKc+fOKX0sLS2NjjAZ+hjmNyU8PBwTJ0583OETERFRGVGqjxRduHABw4cPx/Lly2FlZZVvP5VKZfRcRPK05faoPmPHjoVer1ceFy5cKNzgiYiIqEwp1aEoLi4OSUlJ8PPzg4WFBSwsLBAdHY1vv/0WFhYWyhGi3Ed8kpKSlGlubm5IT09HcnJyvn1M0Wg0cHBwMHoQERHRs6tUh6KWLVvi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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ - "# Your code goes here" + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "\n", + "df = pd.read_csv(\"https://raw.githubusercontent.com/data-bootcamp-v4/data/main/marketing_customer_analysis_clean.csv\")\n", + "\n", + "df = df.drop(columns=['unnamed:_0'])\n", + "\n", + "\n", + "#invisble column :\n", + "#marital_status object\n", + "#monthly_premium_auto int64\n", + "#months_since_last_claim float64\n", + "#months_since_policy_inception int64\n", + "#number_of_open_complaints float64\n", + "\n", + "#rename column\n", + "df = df.rename(columns={'employmentstatus':'employment_status'})\n", + "\n", + "#rename val\n", + "df['vehicle_class'] = df['vehicle_class'].replace({\n", + " 'Luxury Car' : 'Luxury',\n", + " 'Luxury SUV' : 'Luxury'})\n", + "\n", + "#check value : good\n", + "#check vall null : good\n", + "\n", + "#check duplicate val \n", + "df.drop_duplicates(subset=['customer','effective_to_date','vehicle_class'],keep='first',inplace=True)\n", + "df.reset_index(drop = True)\n", + "\n", + "#month best number complaint by policy type\n", + "#number_of_open_complaints\n", + "#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n", + "#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n", + "####### !!!!!!!!!!!!!!!!!!!!!!!!!! A REVOIR A PARTIR D'ICI !!!!!!!!!!!!!!!!!\n", + "#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n", + "#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n", + "\n", + "df[\"number_of_open_complaints\"] = round(df[\"number_of_open_complaints\"], 2)\n", + "df[\"number_of_open_complaints\"] \n", + "\n", + "\n", + "filtred_df = df[[\"month\", \"policy_type\", \"number_of_open_complaints\", \"number_of_policies\"]]\n", + "\n", + "bmn = filtred_df.groupby([\"policy_type\", \"month\"])[\"number_of_open_complaints\"].sum()\n", + "bmn = bmn.reset_index()\n", + "\n", + "\n", + "plt.bar(bmn[\"month\"].astype(str) + \" - \" + bmn[\"policy_type\"], bmn[\"number_of_open_complaints\"], color=\"blue\")\n", + "plt.xlabel(\"P.type\")\n", + "plt.ylabel(\"Nbre\")\n", + "plt.title(\"Highest Number of Complaints by Policy Type\")\n", + "plt.show()\n", + "#r = bmn.reset_index().loc[bmn.reset_index().groupby(\"policy_type\")[\"number_of_open_complaints\"].idxmax()]\n", + "\n" ] } ],