1769 lines
157 KiB
Plaintext
1769 lines
157 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"source": [
|
|
"# Feature Engineering\n",
|
|
"## Einfuehrung\n",
|
|
"## Exploration\n",
|
|
"## Transformation"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2020-02-20T10:44:50.482748Z",
|
|
"start_time": "2020-02-20T10:44:48.566864Z"
|
|
}
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"## prepare: import libraries and read data\n",
|
|
"import pandas as pd\n",
|
|
"import numpy as np\n",
|
|
"import matplotlib.pyplot as plt\n",
|
|
"import seaborn as sns; sns.set()\n",
|
|
"%matplotlib inline\n",
|
|
"\n",
|
|
"datapath = '../3_data'\n",
|
|
"from os import chdir; chdir(datapath)\n",
|
|
"\n",
|
|
"ori_data = pd.read_csv('bank_data.csv', sep=';')"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"source": [
|
|
"### Data Frame"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"#### Entfernen von Beobachtungen"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"##### Nach Index"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"9868\n",
|
|
"9867\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(data.shape[0])\n",
|
|
"\n",
|
|
"## drop row by index\n",
|
|
"idx = (data.age[data.age == max(data.age)].index[0]).tolist()\n",
|
|
"data.drop(idx, inplace=True)\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print(data.shape[0])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"##### Nach Bedingung"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"(9868, 21)\n",
|
|
"(9867, 21)\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(data.shape)\n",
|
|
"\n",
|
|
"## drop by condition\n",
|
|
"data.drop(data[data.age >= 100].index, inplace=True)\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print(data.shape)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"##### Duplikate"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"7\n",
|
|
"0\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## sandbox\n",
|
|
"data = ori_data.copy() ## sandbox action\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(data.duplicated().sum())\n",
|
|
"\n",
|
|
"## drop duplicats\n",
|
|
"data.drop_duplicates(ignore_index=True, inplace=True)\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print(data.duplicated().sum())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"#### Entfernen von Variablen"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"##### By Index"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"* remove variables by index (e.g. first three)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {
|
|
"scrolled": true
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Index(['age', 'job', 'marital', 'education', 'default', 'housing'], dtype='object')\n",
|
|
"Index(['education', 'default', 'housing', 'loan', 'contact', 'month'], dtype='object')\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## check bevore\n",
|
|
"print(data.columns[:6])\n",
|
|
"\n",
|
|
"## drop variables\n",
|
|
"cols_to_drop = [0, 1, 2]\n",
|
|
"data.drop(data.columns[cols_to_drop], axis=1, inplace=True)\n",
|
|
"\n",
|
|
"## alternatively\n",
|
|
"#data.drop(data.columns[[0, 1, 2]], axis=1, inplace=True)\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print(data.columns[:6])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"##### By Name"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"* remove variables by name (e.g. marital and education)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Index(['age', 'job', 'marital', 'education', 'default', 'housing'], dtype='object')\n",
|
|
"Index(['age', 'job', 'default', 'housing', 'loan', 'contact'], dtype='object')\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## check bevore\n",
|
|
"print(data.columns[:6])\n",
|
|
"\n",
|
|
"cols_to_drop = ['marital', 'education']\n",
|
|
"data.drop(cols_to_drop, axis=1, inplace=True)\n",
|
|
"\n",
|
|
"## alternatively\n",
|
|
"#data.drop(['marital', 'education'], axis=1, inplace=True)\n",
|
|
"\n",
|
|
"print(data.columns[:6])\n",
|
|
"#print(data.head())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"#### Einsetzen von Werten für Missing Values"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"##### Kategoriale Variablen"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"marital\n",
|
|
"married 5747\n",
|
|
"single 3026\n",
|
|
"divorced 1076\n",
|
|
"NaN 19\n",
|
|
"Name: count, dtype: int64\n",
|
|
"marital\n",
|
|
"married 5766\n",
|
|
"single 3026\n",
|
|
"divorced 1076\n",
|
|
"Name: count, dtype: int64\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/var/folders/30/93p10lq141sd2pvx31bfs77w0000gp/T/ipykernel_6119/4269743245.py:8: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
|
|
"The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
|
|
"\n",
|
|
"For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
|
|
"\n",
|
|
"\n",
|
|
" data.marital.fillna(data.marital.mode()[0], inplace=True)\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(data.marital.value_counts(dropna=False))\n",
|
|
"\n",
|
|
"## input mode for NAs\n",
|
|
"data.marital.fillna(data.marital.mode()[0], inplace=True)\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print(data.marital.value_counts(dropna=False))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"#### Numerische Variablen"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"* mean or median"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"123\n",
|
|
"0\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/var/folders/30/93p10lq141sd2pvx31bfs77w0000gp/T/ipykernel_6119/3394876968.py:8: FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment using an inplace method.\n",
|
|
"The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values always behaves as a copy.\n",
|
|
"\n",
|
|
"For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.\n",
|
|
"\n",
|
|
"\n",
|
|
" data.age.fillna(data.age.median(), inplace=True)\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(data.age.isna().sum())\n",
|
|
"\n",
|
|
"## input median for NAs\n",
|
|
"data.age.fillna(data.age.median(), inplace=True)\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print(data.age.isna().sum())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"##### Mehrere Variablen gleichzeitig [EXTRA]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"nas found:\n",
|
|
"age 123\n",
|
|
"job 73\n",
|
|
"marital 19\n",
|
|
"education 463\n",
|
|
"duration 51\n",
|
|
"poutcome 7814\n",
|
|
"emp.var.rate 247\n",
|
|
"cons.price.idx 247\n",
|
|
"cons.conf.idx 247\n",
|
|
"dtype: int64\n",
|
|
"nas found:\n",
|
|
"age 123\n",
|
|
"duration 51\n",
|
|
"emp.var.rate 247\n",
|
|
"cons.price.idx 247\n",
|
|
"cons.conf.idx 247\n",
|
|
"dtype: int64\n",
|
|
"no nas found\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## first define a function for nas overview of a data frame\n",
|
|
"def check_nas(data):\n",
|
|
" s = data.isna().sum()\n",
|
|
" if len(s[s > 0]) == 0:\n",
|
|
" print('no nas found')\n",
|
|
" else:\n",
|
|
" print('nas found:')\n",
|
|
" print(s[s > 0])\n",
|
|
"\n",
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"check_nas(data)\n",
|
|
"\n",
|
|
"## create lists of names of of categorical and numerical variables\n",
|
|
"cat_vars = data.select_dtypes(include='object').columns.tolist()\n",
|
|
"num_vars = data.select_dtypes(exclude='object').columns.tolist()\n",
|
|
"\n",
|
|
"## import SimpleImputer class\n",
|
|
"from sklearn.impute import SimpleImputer\n",
|
|
"\n",
|
|
"## imput for categorical variables\n",
|
|
"imp_mode = SimpleImputer(missing_values=np.nan, strategy='most_frequent')\n",
|
|
"data[cat_vars] = pd.DataFrame(imp_mode.fit_transform(data[cat_vars]), columns=data[cat_vars].columns)\n",
|
|
"\n",
|
|
"## check after 1\n",
|
|
"check_nas(data)\n",
|
|
"\n",
|
|
"## imput for numerical variables\n",
|
|
"imp_median = SimpleImputer(missing_values=np.nan, strategy='median')\n",
|
|
"data[num_vars] = pd.DataFrame(imp_median.fit_transform(data[num_vars]), columns=data[num_vars].columns)\n",
|
|
"\n",
|
|
"## chedk after 2\n",
|
|
"check_nas(data)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"source": [
|
|
"### Kategoriale Variablen"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"#### Reduzieren der Kardinalität"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"education\n",
|
|
"university.degree 3136\n",
|
|
"high.school 2230\n",
|
|
"professional.course 1307\n",
|
|
"basic.9y 1251\n",
|
|
"basic.4y 972\n",
|
|
"basic.6y 503\n",
|
|
"illiterate 6\n",
|
|
"Name: count, dtype: int64\n",
|
|
"\n",
|
|
"education\n",
|
|
"university.degree 3136\n",
|
|
"high.school 2230\n",
|
|
"professional.course 1307\n",
|
|
"basic.9y 1251\n",
|
|
"basic.4y 978\n",
|
|
"basic.6y 503\n",
|
|
"Name: count, dtype: int64\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## education: illiterate -> basic.4y\n",
|
|
"\n",
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(data.education.value_counts()) \n",
|
|
"\n",
|
|
"## education: illiterate -> basic.4y\n",
|
|
"data.education = np.where(\n",
|
|
" data.education == 'illiterate', ## condition\n",
|
|
" 'basic.4y', ## if true\n",
|
|
" data.education) ## if false\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print()\n",
|
|
"print(data.education.value_counts()) "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "raw",
|
|
"metadata": {},
|
|
"source": [
|
|
"## combine more than one category\n",
|
|
"\n",
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## check berore\n",
|
|
"print(data.education.value_counts())\n",
|
|
"\n",
|
|
"data.education = np.where(\n",
|
|
" (data.education == 'illiterate') |\n",
|
|
" (data.education == 'basic.4y') |\n",
|
|
" (data.education == 'basic.6y') |\n",
|
|
" (data.education == 'basic.9y'),\n",
|
|
" 'basic', \n",
|
|
" data.education) \n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print(data.education.value_counts())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"source": [
|
|
"#### Numerisieren"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"##### Faktorisieren"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"job\n",
|
|
"admin. 2630\n",
|
|
"blue collar 1852\n",
|
|
"technician 1626\n",
|
|
"services 856\n",
|
|
"management 688\n",
|
|
"retired 621\n",
|
|
"student 354\n",
|
|
"self-employed 336\n",
|
|
"entrepreneur 294\n",
|
|
"unemployed 271\n",
|
|
"housemaid 267\n",
|
|
"Name: count, dtype: int64\n",
|
|
"job\n",
|
|
" 3 2630\n",
|
|
" 2 1852\n",
|
|
" 1 1626\n",
|
|
" 8 856\n",
|
|
" 7 688\n",
|
|
" 5 621\n",
|
|
" 6 354\n",
|
|
" 0 336\n",
|
|
" 4 294\n",
|
|
" 10 271\n",
|
|
" 9 267\n",
|
|
"-1 73\n",
|
|
"Name: count, dtype: int64\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(data.job.value_counts())\n",
|
|
"\n",
|
|
"## factorize\n",
|
|
"data.job = pd.factorize(data.job)[0]\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print(data.job.value_counts())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"##### Ordinal Encodieren"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2020-02-20T10:44:50.614136Z",
|
|
"start_time": "2020-02-20T10:44:50.571253Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"education\n",
|
|
"university.degree 3136\n",
|
|
"high.school 2230\n",
|
|
"professional.course 1307\n",
|
|
"basic.9y 1251\n",
|
|
"basic.4y 972\n",
|
|
"basic.6y 503\n",
|
|
"illiterate 6\n",
|
|
"Name: count, dtype: int64\n",
|
|
"\n",
|
|
"education\n",
|
|
"6.0 3136\n",
|
|
"5.0 2230\n",
|
|
"4.0 1307\n",
|
|
"3.0 1251\n",
|
|
"1.0 972\n",
|
|
"2.0 503\n",
|
|
"0.0 6\n",
|
|
"Name: count, dtype: int64\n"
|
|
]
|
|
},
|
|
{
|
|
"name": "stderr",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"/var/folders/30/93p10lq141sd2pvx31bfs77w0000gp/T/ipykernel_6119/257735785.py:20: FutureWarning: Downcasting behavior in `replace` is deprecated and will be removed in a future version. To retain the old behavior, explicitly call `result.infer_objects(copy=False)`. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`\n",
|
|
" data.replace(replace_nums, inplace=True)\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(data.education.value_counts())\n",
|
|
"\n",
|
|
"## define encoding\n",
|
|
"replace_nums = { ## a dictionary of dictionaries\n",
|
|
" 'education': {\n",
|
|
" 'illiterate': 0,\n",
|
|
" 'unknown': 0,\n",
|
|
" 'basic.4y': 1,\n",
|
|
" 'basic.6y': 2,\n",
|
|
" 'basic.9y': 3,\n",
|
|
" 'professional.course': 4,\n",
|
|
" 'high.school': 5,\n",
|
|
" 'university.degree': 6\n",
|
|
" }\n",
|
|
"}\n",
|
|
"data.replace(replace_nums, inplace=True)\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print()\n",
|
|
"print(data.education.value_counts())\n",
|
|
"\n",
|
|
"## variants:\n",
|
|
"#print(data.education.value_counts().sort_index())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "raw",
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2020-02-20T10:44:50.645345Z",
|
|
"start_time": "2020-02-20T10:44:50.623210Z"
|
|
}
|
|
},
|
|
"source": [
|
|
"## may be applied on multiple variables simultaneously\n",
|
|
"replace_nums = {\n",
|
|
" 'education': {\n",
|
|
" 'basic.4y': 1,\n",
|
|
" 'basic.6y': 2,\n",
|
|
" 'basic.9y': 3,\n",
|
|
" 'professional.course': 4,\n",
|
|
" 'high.school': 5,\n",
|
|
" 'university.degree': 6\n",
|
|
" },\n",
|
|
" 'day_of_week': {\n",
|
|
" 'mon': 1,\n",
|
|
" 'tue': 2,\n",
|
|
" 'wed': 3,\n",
|
|
" 'thu': 4,\n",
|
|
" 'fri': 5\n",
|
|
" }\n",
|
|
"}"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"0 cellular\n",
|
|
"1 cellular\n",
|
|
"2 cellular\n",
|
|
"3 telephone\n",
|
|
"4 cellular\n",
|
|
"Name: contact, dtype: object\n",
|
|
"0 1\n",
|
|
"1 1\n",
|
|
"2 1\n",
|
|
"3 0\n",
|
|
"4 1\n",
|
|
"Name: contact_cellular, dtype: int64\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## binary encode\n",
|
|
"\n",
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(data.contact.head())\n",
|
|
"\n",
|
|
"## binary encode\n",
|
|
"data['contact'] = np.where(data.contact == 'cellular', 1, 0)\n",
|
|
"data.rename(columns = {'contact' : 'contact_cellular'}, inplace=True) ## optional\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print(data.contact_cellular.head())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"##### Nominal Encodieren"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"9056 single\n",
|
|
"9483 divorced\n",
|
|
"788 single\n",
|
|
"9554 divorced\n",
|
|
"809 divorced\n",
|
|
"4822 married\n",
|
|
"Name: marital, dtype: object\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## sandbox\n",
|
|
"data = ori_data.sample(6, random_state=1234)\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(data.marital)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 15,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
" marital divorced married single\n",
|
|
"9056 single False False True\n",
|
|
"9483 divorced True False False\n",
|
|
"788 single False False True\n",
|
|
"9554 divorced True False False\n",
|
|
"809 divorced True False False\n",
|
|
"4822 married False True False\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## default params\n",
|
|
"new_data = pd.get_dummies(data.marital)\n",
|
|
"print(pd.merge(data.marital, new_data, left_index=True, right_index=True))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 16,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
" marital married single\n",
|
|
"9056 single False True\n",
|
|
"9483 divorced False False\n",
|
|
"788 single False True\n",
|
|
"9554 divorced False False\n",
|
|
"809 divorced False False\n",
|
|
"4822 married True False\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## param drop_first\n",
|
|
"new_data = pd.get_dummies(data.marital, drop_first=True)\n",
|
|
"print(pd.merge(data.marital, new_data, left_index=True, right_index=True))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 17,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
" marital marital_divorced marital_married marital_single\n",
|
|
"9056 single False False True\n",
|
|
"9483 divorced True False False\n",
|
|
"788 single False False True\n",
|
|
"9554 divorced True False False\n",
|
|
"809 divorced True False False\n",
|
|
"4822 married False True False\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## param prefix\n",
|
|
"new_data = pd.get_dummies(data.marital, prefix='marital')\n",
|
|
"print(pd.merge(data.marital, new_data, left_index=True, right_index=True))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 18,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2020-02-20T10:44:50.719576Z",
|
|
"start_time": "2020-02-20T10:44:50.708566Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Index(['age', 'education', 'default', 'housing', 'contact', 'month',\n",
|
|
" 'day_of_week', 'duration', 'campaign', 'pdays', 'previous', 'poutcome',\n",
|
|
" 'emp.var.rate', 'cons.price.idx', 'cons.conf.idx', 'euribor3m',\n",
|
|
" 'nr.employed', 'y', 'job_blue collar', 'job_entrepreneur',\n",
|
|
" 'job_housemaid', 'job_management', 'job_retired', 'job_self-employed',\n",
|
|
" 'job_services', 'job_student', 'job_technician', 'job_unemployed',\n",
|
|
" 'marital_married', 'marital_single', 'loan_unknown', 'loan_yes'],\n",
|
|
" dtype='object')\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## may be applied on more variables simultaneously\n",
|
|
"data = ori_data.copy()\n",
|
|
"data = pd.get_dummies(\n",
|
|
" data,\n",
|
|
" columns=['job', 'marital', 'loan'],\n",
|
|
" drop_first=True)\n",
|
|
"print(data.columns)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 19,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"<class 'pandas.core.frame.DataFrame'>\n",
|
|
"RangeIndex: 9868 entries, 0 to 9867\n",
|
|
"Data columns (total 21 columns):\n",
|
|
" # Column Non-Null Count Dtype \n",
|
|
"--- ------ -------------- ----- \n",
|
|
" 0 age 9745 non-null float64\n",
|
|
" 1 job 9795 non-null object \n",
|
|
" 2 marital 9849 non-null object \n",
|
|
" 3 education 9405 non-null object \n",
|
|
" 4 default 9868 non-null object \n",
|
|
" 5 housing 9868 non-null object \n",
|
|
" 6 loan 9868 non-null object \n",
|
|
" 7 contact 9868 non-null object \n",
|
|
" 8 month 9868 non-null object \n",
|
|
" 9 day_of_week 9868 non-null object \n",
|
|
" 10 duration 9817 non-null float64\n",
|
|
" 11 campaign 9868 non-null int64 \n",
|
|
" 12 pdays 9868 non-null int64 \n",
|
|
" 13 previous 9868 non-null int64 \n",
|
|
" 14 poutcome 2054 non-null object \n",
|
|
" 15 emp.var.rate 9621 non-null float64\n",
|
|
" 16 cons.price.idx 9621 non-null float64\n",
|
|
" 17 cons.conf.idx 9621 non-null float64\n",
|
|
" 18 euribor3m 9868 non-null float64\n",
|
|
" 19 nr.employed 9868 non-null float64\n",
|
|
" 20 y 9868 non-null object \n",
|
|
"dtypes: float64(7), int64(3), object(11)\n",
|
|
"memory usage: 1.6+ MB\n",
|
|
"None\n",
|
|
"<class 'pandas.core.frame.DataFrame'>\n",
|
|
"RangeIndex: 9868 entries, 0 to 9867\n",
|
|
"Data columns (total 49 columns):\n",
|
|
" # Column Non-Null Count Dtype \n",
|
|
"--- ------ -------------- ----- \n",
|
|
" 0 age 9745 non-null float64\n",
|
|
" 1 duration 9817 non-null float64\n",
|
|
" 2 campaign 9868 non-null int64 \n",
|
|
" 3 pdays 9868 non-null int64 \n",
|
|
" 4 previous 9868 non-null int64 \n",
|
|
" 5 emp.var.rate 9621 non-null float64\n",
|
|
" 6 cons.price.idx 9621 non-null float64\n",
|
|
" 7 cons.conf.idx 9621 non-null float64\n",
|
|
" 8 euribor3m 9868 non-null float64\n",
|
|
" 9 nr.employed 9868 non-null float64\n",
|
|
" 10 y 9868 non-null object \n",
|
|
" 11 job_blue collar 9868 non-null bool \n",
|
|
" 12 job_entrepreneur 9868 non-null bool \n",
|
|
" 13 job_housemaid 9868 non-null bool \n",
|
|
" 14 job_management 9868 non-null bool \n",
|
|
" 15 job_retired 9868 non-null bool \n",
|
|
" 16 job_self-employed 9868 non-null bool \n",
|
|
" 17 job_services 9868 non-null bool \n",
|
|
" 18 job_student 9868 non-null bool \n",
|
|
" 19 job_technician 9868 non-null bool \n",
|
|
" 20 job_unemployed 9868 non-null bool \n",
|
|
" 21 marital_married 9868 non-null bool \n",
|
|
" 22 marital_single 9868 non-null bool \n",
|
|
" 23 education_basic.6y 9868 non-null bool \n",
|
|
" 24 education_basic.9y 9868 non-null bool \n",
|
|
" 25 education_high.school 9868 non-null bool \n",
|
|
" 26 education_illiterate 9868 non-null bool \n",
|
|
" 27 education_professional.course 9868 non-null bool \n",
|
|
" 28 education_university.degree 9868 non-null bool \n",
|
|
" 29 default_unknown 9868 non-null bool \n",
|
|
" 30 housing_unknown 9868 non-null bool \n",
|
|
" 31 housing_yes 9868 non-null bool \n",
|
|
" 32 loan_unknown 9868 non-null bool \n",
|
|
" 33 loan_yes 9868 non-null bool \n",
|
|
" 34 contact_telephone 9868 non-null bool \n",
|
|
" 35 month_aug 9868 non-null bool \n",
|
|
" 36 month_dec 9868 non-null bool \n",
|
|
" 37 month_jul 9868 non-null bool \n",
|
|
" 38 month_jun 9868 non-null bool \n",
|
|
" 39 month_mar 9868 non-null bool \n",
|
|
" 40 month_may 9868 non-null bool \n",
|
|
" 41 month_nov 9868 non-null bool \n",
|
|
" 42 month_oct 9868 non-null bool \n",
|
|
" 43 month_sep 9868 non-null bool \n",
|
|
" 44 day_of_week_mon 9868 non-null bool \n",
|
|
" 45 day_of_week_thu 9868 non-null bool \n",
|
|
" 46 day_of_week_tue 9868 non-null bool \n",
|
|
" 47 day_of_week_wed 9868 non-null bool \n",
|
|
" 48 poutcome_success 9868 non-null bool \n",
|
|
"dtypes: bool(38), float64(7), int64(3), object(1)\n",
|
|
"memory usage: 1.2+ MB\n",
|
|
"None\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## apply for all categorical variables except target\n",
|
|
"\n",
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(data.info())\n",
|
|
"\n",
|
|
"## prep var list\n",
|
|
"target = 'y'\n",
|
|
"sel_vars = data.select_dtypes(include=['object']).columns.drop(target)\n",
|
|
"data = pd.get_dummies(data, columns=sel_vars, drop_first=True)\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print(data.info())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"source": [
|
|
"### Numerische Variablen"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"#### Logarithmieren"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "raw",
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2020-02-20T10:44:51.824612Z",
|
|
"start_time": "2020-02-20T10:44:50.771701Z"
|
|
}
|
|
},
|
|
"source": [
|
|
"f, axes = plt.subplots(nrows=2, ncols=1, figsize=(6, 7), sharex=False)\n",
|
|
"ax = sns.histplot(data['duration'], ax=axes[0])\n",
|
|
"ax = sns.histplot(np.log10(data['duration'].dropna() + 1), ax=axes[1])\n",
|
|
"ax.set(xlabel='log10(duration)');"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 20,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"mean 378.159927\n",
|
|
"50% 258.000000\n",
|
|
"Name: duration, dtype: float64\n",
|
|
"mean 2.405733\n",
|
|
"50% 2.413300\n",
|
|
"Name: duration, dtype: float64\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(data.duration.describe()[['mean', '50%']])\n",
|
|
"\n",
|
|
"## logarithme\n",
|
|
"data.duration = np.log10(data.duration - data.duration.min() + 1)\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print(data.duration.describe()[['mean', '50%']])\n",
|
|
"\n",
|
|
"## optionally rename\n",
|
|
"data.rename(columns = {'duration': 'log_duration'}, inplace=True)\n",
|
|
"#data.columns"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "raw",
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2020-02-20T10:44:51.856270Z",
|
|
"start_time": "2020-02-20T10:44:51.830846Z"
|
|
}
|
|
},
|
|
"source": [
|
|
"## die in numpy verfügbaren log funktionen\n",
|
|
"print(np.log(10))\n",
|
|
"print(np.log2(10))\n",
|
|
"print(np.log10(10))\n",
|
|
"print(np.log1p(10))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "raw",
|
|
"metadata": {},
|
|
"source": [
|
|
"## if min(x) < 0: modify as follows\n",
|
|
"\n",
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"data.duration = data.duration - 100\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(data.duration.describe()[['mean', '50%']])\n",
|
|
"\n",
|
|
"## logarithme\n",
|
|
"data.duration = np.log10(data.duration - data.duration.min() + 1)\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print(data.duration.describe()[['mean', '50%']])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "raw",
|
|
"metadata": {},
|
|
"source": [
|
|
"## EXTRA: compare .skew() before and after log transformation\n",
|
|
"num_vars = data.select_dtypes(exclude=['object']).columns\n",
|
|
"skew1 = []\n",
|
|
"skew2 = []\n",
|
|
"skew_prop = []\n",
|
|
"for c in num_vars:\n",
|
|
" skew1.append(abs(data[c].skew()))\n",
|
|
" skew2.append(abs(np.log10(data[c] - min(data[c]) + 1).skew()))\n",
|
|
" skew_prop.append(\n",
|
|
" abs(data[c].skew()) / \n",
|
|
" abs(np.log10(data[c] - min(data[c]) + 1).skew()))\n",
|
|
"\n",
|
|
"res = pd.DataFrame({\n",
|
|
" 'var': num_vars,\n",
|
|
" 'skew1': skew1,\n",
|
|
" 'skew2': skew2,\n",
|
|
" 'skew_prop' : skew_prop\n",
|
|
"}).sort_values(by='skew_prop')\n",
|
|
"print(res)\n",
|
|
"\n",
|
|
"res.plot.barh(x='var', y='skew_prop')\n",
|
|
"plt.axvline(x=1, color='black', linestyle='--') ;"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"#### Skalieren (als Ausblick)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"##### Normalisieren"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 21,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"min 17.0\n",
|
|
"max 116.0\n",
|
|
"Name: age, dtype: float64\n",
|
|
"min 0.0\n",
|
|
"max 1.0\n",
|
|
"Name: age, dtype: float64\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(data.age.describe()[['min', 'max']])\n",
|
|
"\n",
|
|
"## normalize\n",
|
|
"data.age = (data.age - data.age.min()) / \\\n",
|
|
" (data.age.max() - data.age.min())\n",
|
|
" \n",
|
|
"## check after\n",
|
|
"print(data.age.describe()[['min', 'max']])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"##### Standardisieren"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 22,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"mean 40.423191\n",
|
|
"std 11.915715\n",
|
|
"Name: age, dtype: float64\n",
|
|
"mean 4.648240e-18\n",
|
|
"std 1.000000e+00\n",
|
|
"Name: age, dtype: float64\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(data.age.describe()[['mean', 'std']])\n",
|
|
"\n",
|
|
"## standardize\n",
|
|
"data.age = (data.age - data.age.mean()) / \\\n",
|
|
" data.age.std()\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print(data.age.describe()[['mean', 'std']])\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 23,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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wwAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwnAM2L17twwfPlx+/etfm/GRb731Vvnuu++ivVuIEq/XK88++6z07NlTOnToIEOGDJEdO3ZEe7dgAQcPHpRHHnlELrroIunUqZNcd911snHjxmjvFixo27Zt0rFjR1myZEm0dwUWsmzZMrnsssvkvPPOk8svv1zee+89sQPCsMUdO3ZMbrvtNtm3b5+88MILkpWVJbVr15abbrpJcnJyor17iIKZM2ea82D8+PGycOFCE44HDx5szhXYm/7R/OWXX8rTTz8tixcvljZt2pg/nn/88cdo7xos5Pjx4zJixAjJz8+P9q7AQpYvXy6jR4+WG264Qd555x3p16+f/3dKvCMMW5z26nz77bdmKmn9S+3ss882U0nrL7EPP/ww2ruHCNPAO2/ePDOjYq9evaR169YydepU2bNnj6xatSrau4co2r59u6xZs0bGjRsnXbp0kczMTHn44YclIyND3nrrrWjvHixk+vTpUqdOnWjvBiykpKREnnnmGbnxxhtNGG7WrJnccccdcsEFF8jnn38u8c420zHHKg2/s2fPloYNG/qXORwn/obJy8uL4p4hGrZu3SpHjx6VHj16+Je53W5p27atbNiwwfwlD3tKS0szvyv0j2afhIQEc+N3BXz098Rrr71mPg7XP6gBX9nMzp075YorrpDS5s6dK3ZAz7DFNWjQQH7zm98ELHv55ZelsLDQ1BDDXrQHWDVu3Dhgufb++dbBnvSPIv1dUatWLf+ylStXmh5jrS8H9I+ikSNHypgxY076HQJ727Ztm7nXT521tEo7XK699lrbfAJNGI6yn3/+WVq1alXhrWxd8Pvvvy9PPfWU3HzzzWY97KWgoMDclw48KikpSYqKiqK0V7Cif/7znzJq1Cjp06cPPYAwtIRGL5or2/sHHDlyxNw/9NBD5hNGLcfTDrc777xT1q5dK/GOMoko0/KHd999t8L1p512mv/xq6++ai6auvLKK81f97Cf5ORkf+2w77HSIJySkhLFPYOVfPDBB+YCKR1RQq83ALQsQq9BoX4c5UlMTDT32ivcv39/81gvwN28ebP8/e9/DyjNi0eEYQucgC1atDjldnrR3Jw5c2TQoEHmLzetA4T9+D7azM7ONhc4+OjXfFIA9corr8iECROkb9++8sQTT5z0KQLsSUcXOXDgwEmfEowdO9Z0yOj/L7Cvhr9cl9SyZcuA5b/61a/k448/lnhHGI4BviCsIfiWW26J9u4ginT0CL0KfP369f4wrHWA+tf7gAEDor17iDLfkHsDBw40QyTxRzN89BMCvdakNC2h0ZFp9NNG2Ns555xjhm396quvzGg0PjqaVemOl3hFGLY4DT0ahPU/N63z0vGGfVJTU83JC/vQXj4NvfofW3p6ujRp0sT8sdSoUSPzHxvsfQHMxIkT5ZJLLpGhQ4fK/v37/eu0pKZu3bpR3T9EV+kRiUqrX79+hetgH8nJyWa8+ueee86cD+3atTNjDetwjfPnz5d4Rxi2uLfffts/goTeSrv77rvlnnvuidKeIVq0J6e4uNhcEa49PToroQ5/46v5gj3pyBE6mYJeZKu30rQGcNKkSVHbNwDWd+edd5prT3Ts+r1795oSTh2T+vzzz5d4l1CiIy0DAAAANsTQagAAALAtwjAAAABsizAMAAAA2yIMAwAAwLYIwwAAALAtwjAAAABsizAMAAAA2yIMAwDChqHrAcQawjAAICy+++47ue666065nc5q1apVq4jsEwCcCmEYABAWK1askC+//DLauwEAQSEMAwAAwLYIwwBgUYWFhfLUU09Jnz595Nxzz5VOnTrJoEGDZMuWLf5tli5dKpdddpmcd955cuWVV8ratWulbdu2smTJEv82u3btkuHDh0u3bt2kffv2ctNNN8nmzZuD3p9///vfpm3nzp2lY8eOcvPNN8u//vUvf+nDjBkzzGMtgdCvVVFRkfz1r3+VX//616bNqFGjzDIAsIqEEq52AABLGjZsmGzcuNEE2WbNmsn27dvlmWeeEbfbLe+8844sX75cHnroIbn22mvl97//vWzatEnmzJkj+fn5JoBeddVVkpOTI3/4wx8kJSVF7r77bnP/4osvmmD7xhtvSIsWLaq0L0eOHJGLL75YunfvLn/84x/l2LFj8vzzz8v3338vH3/8sRw9etQEYH3O1157TRo1amRu+h4+/fRTuf/+++Wss84y6z755BM5fvy4fPPNNzX+PQSAU3GdcgsAQMRp2NSAOWbMGNPzq7RnV0PppEmTZP/+/SYY//a3v5XHH3/crO/Zs6ckJiaa3mQfDb4HDx6UV199VZo0aWKWXXTRReY5tf2zzz5bpf3R0Jubmys33nij6aFW//M//2PCre6nL/yqDh06+C+oW7lypYwbN85/YZ3u4xVXXGGeDwCsgDIJALCgWrVqydy5c01o3bt3r6xbt04WLlwoH330kVm/bds2U/7Qt2/fgHaXX355wNdaNtGmTRtp2LChFBcXm5vD4TCB+B//+EeV9+fss8+W9PR0uf322+WRRx6R999/X04//XR58MEH/SG4LO3VVr179/Yv09fWXmwAsAp6hgHAorS8YOLEifLjjz9K7dq1pXXr1pKammrWaQ+wql+/fkAbDailaa+wllecc8455b5GQUGBKZ04FX39BQsWmNKI9957z/QIJycny//+7/+a3msN72UdOnTI3KelpQUsb9CgwSlfDwAihTAMABb0n//8R+666y5Tpztr1iw588wzJSEhwQRSDckej8dsd+DAgYB2Zb+uW7euKa8YOXJkua9TXoitiJZFTJ482by21idrzbKWX2g98+DBg0/a3heCtaTjjDPOCAjoAGAVlEkAgAXpBW466sJtt91mwqYGYaVBWGVkZJjlWq5Q2qpVqwK+1iCsJRWZmZlmxAnfTYOsXuzmdDqrPIawXjy3b98+00ZHhtBaYL2YT8s1fCUQpen2vral+Uo9AMAK6BkGAAvSsgaXy2V6Ym+55RZzQZ0Ol6YjN/jKG3SkhhEjRsjYsWPlkksuka1bt8pzzz0XEEx1+DMNvnqvz6O9te+++64sWrTIDHNWVXrRnNfrNb3VGtC1bELLJQ4fPmyGflMajNXbb79thnDT0SP+3//7fzJ16lRTq6y1y7ovjCIBwEoYWg0ALEp7VHXsXi2ZOO2008woDTqaw8CBA+Xhhx+WG264wdTu6oV22jurF7npstGjR5thznwhVdvrCBN6MZ32Njdv3tw8xzXXXBPU/mhphI5Aob3WGsb19fSCOg3iSi/007CsoVyfW3uOtaRCA7r2QmsNsY4moUF/2rRphGIAlkAYBoAYpT2wOsGG1vL6aM/x0KFDTQ+sXnAHAKgcYRgAYpSWK/zwww9y3333SePGjc2oETpusNYSv/zyy1V6Di190NupaMkGAMQjwjAAxCidBEPLH3RGN51pTodV0zF8tZZYa3qrovQ0ypVZvXq1NG3aNAx7DQDWQhgGABvTOt/s7OxTbteqVaughmEDgFhBGAYAAIBtMc4wAAAAbIswDAAAANsiDAMAAMC2CMMAAACwLcIwAAAAbIswDAAAANsiDAMAAMC2CMMAAAAQu/r/Ael4DMISITrXAAAAAElFTkSuQmCC",
|
|
"text/plain": [
|
|
"<Figure size 800x1000 with 3 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"## visual comparison\n",
|
|
"age_norm = (\n",
|
|
" data.age - data.age.min()) / (\n",
|
|
" data.age.max() - data.age.min())\n",
|
|
"age_std = (data.age - data.age.mean()) / data.age.std()\n",
|
|
"\n",
|
|
"f, axes = plt.subplots(nrows=3, ncols=1, figsize=(8, 10), sharex=False)\n",
|
|
"ax = sns.histplot(data.age.dropna(), bins=40, ax=axes[0])\n",
|
|
"ax = sns.histplot(age_norm.dropna(), bins=40, ax=axes[1])\n",
|
|
"ax.set(xlabel='age_norm')\n",
|
|
"ax = sns.histplot(age_std.dropna(), bins=40, ax=axes[2])\n",
|
|
"ax.set(xlabel='age_std');"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"##### Skalieren mit sklearn.preprocessing"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 24,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2020-02-20T10:44:56.016942Z",
|
|
"start_time": "2020-02-20T10:44:55.054421Z"
|
|
},
|
|
"scrolled": true
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
" age duration campaign pdays previous emp.var.rate cons.price.idx \\\n",
|
|
"min 17.0 0.0 1.0 0.0 0.0 -3.4 92.201 \n",
|
|
"max 116.0 4199.0 43.0 999.0 6.0 1.4 94.767 \n",
|
|
"\n",
|
|
" cons.conf.idx euribor3m nr.employed \n",
|
|
"min -50.8 0.634 4963.6 \n",
|
|
"max -26.9 5.045 5228.1 \n",
|
|
" age duration campaign pdays previous emp.var.rate cons.price.idx \\\n",
|
|
"min 0.0 0.0 0.0 0.0 0.0 0.0 0.0 \n",
|
|
"max 1.0 1.0 1.0 1.0 1.0 1.0 1.0 \n",
|
|
"\n",
|
|
" cons.conf.idx euribor3m nr.employed \n",
|
|
"min 0.0 0.0 0.0 \n",
|
|
"max 1.0 1.0 1.0 \n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## using sklearn.preprocessing.MinMaxScaler\n",
|
|
"\n",
|
|
"## sandbox: numerical variables only\n",
|
|
"data = ori_data.select_dtypes(exclude=['object'])\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(data.describe().loc[['min', 'max']])\n",
|
|
"\n",
|
|
"## import scaler class\n",
|
|
"from sklearn.preprocessing import MinMaxScaler\n",
|
|
"\n",
|
|
"## define scaler\n",
|
|
"scaler = MinMaxScaler().set_output(transform='pandas')\n",
|
|
"\n",
|
|
"## apply scaler on data frame\n",
|
|
"data = scaler.fit_transform(data)\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print(data.describe().loc[['min', 'max']])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 25,
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2020-02-20T10:44:56.119153Z",
|
|
"start_time": "2020-02-20T10:44:56.036845Z"
|
|
}
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
" age duration campaign pdays previous emp.var.rate \\\n",
|
|
"mean 40.423191 378.159927 2.387617 895.442136 0.296109 -0.440495 \n",
|
|
"std 11.915715 356.220783 2.512851 303.530529 0.678229 1.717659 \n",
|
|
"\n",
|
|
" cons.price.idx cons.conf.idx euribor3m nr.employed \n",
|
|
"mean 93.488617 -40.227804 3.028964 5138.570075 \n",
|
|
"std 0.629874 5.298546 1.886748 86.254277 \n",
|
|
"\n",
|
|
" age duration campaign pdays previous \\\n",
|
|
"mean 1.358015e-17 -7.310259e-17 3.492230e-17 -5.040332e-18 -4.536298e-17 \n",
|
|
"std 1.000051e+00 1.000051e+00 1.000051e+00 1.000051e+00 1.000051e+00 \n",
|
|
"\n",
|
|
" emp.var.rate cons.price.idx cons.conf.idx euribor3m nr.employed \n",
|
|
"mean -5.538999e-18 -1.219207e-14 1.337484e-15 5.508362e-17 4.723511e-15 \n",
|
|
"std 1.000052e+00 1.000052e+00 1.000052e+00 1.000051e+00 1.000051e+00 \n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## with sklearn.preprocessing.StandardScaler\n",
|
|
"\n",
|
|
"## sandbox: numerical variables only\n",
|
|
"data = ori_data.select_dtypes(exclude=['object'])\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(data.describe().loc[['mean', 'std']])\n",
|
|
"\n",
|
|
"## import scaler\n",
|
|
"from sklearn.preprocessing import StandardScaler\n",
|
|
"\n",
|
|
"## define scaler\n",
|
|
"scaler = StandardScaler().set_output(transform=\"pandas\")\n",
|
|
"\n",
|
|
"## apply scaler\n",
|
|
"data = scaler.fit_transform(data)\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print()\n",
|
|
"print(data.describe().loc[['mean', 'std']])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "raw",
|
|
"metadata": {
|
|
"ExecuteTime": {
|
|
"end_time": "2020-02-20T10:44:56.135131Z",
|
|
"start_time": "2020-02-20T10:44:56.124225Z"
|
|
}
|
|
},
|
|
"source": [
|
|
"## scaler can be stored for later use on new data (see 5.3.1)\n",
|
|
"import pickle \n",
|
|
"## save scaler\n",
|
|
"with open('scaler.pkl', 'wb') as pickle_file:\n",
|
|
" pickle.dump(scaler, pickle_file)\n",
|
|
"## read saved scaler\n",
|
|
"with open('scaler.pkl', 'rb') as pickle_file:\n",
|
|
" scaler = pickle.load(pickle_file)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"#### Binning"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"##### Equlal Binning"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 26,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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adrtsGnTpqZbocvlCmQZAQAAAMB5idekSZPk3XfflbZt23qn1alTRwYMGCALFiyQ6dOnB7KMAAAAAOC8robvvfeePProo3LHHXd4p5UqVUo6d+4s8fHxMmfOHLn//vsDWU4AAAAAcNYRLx2t8IILLsh1XrVq1WT37t2FLRcAAAAAODvx0uTq448/znXep59+KhdeeGFhywUAAAAAzu5qePfdd8ugQYPk4MGDcs0110iZMmXkwIED8tlnn8lHH30kTz/9dOBLCgAAAABOSrx0mPijR4/KlClTZMmSJd7pqamp5hpfDCMPAAAAAIVMvFSHDh3krrvuku3bt5sjXykpKaYLYmxsgXovAgAAAEDUKnDipWJiYkyyBQAAAAAIcOKl53ONGjVKli9fLpmZmeJ2u09LyDZs2FCQRQMAAABA1ClQ4jV8+HAzkMYNN9wgFSpUoHshAAAAAAQ68friiy/k8ccfl9tvv70gLwcAAAAARynQoaqEhIQzXkAZAAAAABCAxOvaa6+V999/vyAvBQAAAADHKVBXwzp16sjEiRNl586dUq9ePSlatOhpg2v07t07UGUEAAAAAGcOrqFWr15tbjmReAEAAABAIROvTZs2Bb4kAAAAABClCj0O/OHDh2Xbtm1y8uRJyc7ODkypAAAAACCKFDjxWrVqldx6663SuHFjufHGG2XLli3y8MMPy+jRowNbQgAAAABwYuK1YsUKue+++8ygGgMGDBC3222m165dW+bMmSMvv/xyvpd18OBB+de//iXNmzeXhg0byp133ilr1qzxe69//vOfZhCPNm3ayAcffOD3+hMnTsiTTz4pTZs2lQYNGpjk78CBA6eV92zLAADAF7EJABAWiZeOaHj11VfLK6+8Ivfcc4838erRo4d07dpV3njjjXwvq3///vLdd9/J+PHjZeHChXLxxRebpO7XX381XRi7d+8uzZo1k0WLFpkjbAMHDjTByuOJJ56Qr776SiZPniyzZ882r+vTp493fn6WAQCAL2ITACAsBtfYuHGjd9RCHcHQ15VXXmmCTH7s2LFDvv76a5k3b55cfvnlZtrQoUPlyy+/lPfee0/2798vtWrVkn79+pl51atXlw0bNsj06dNNK+KePXvk7bfflqlTp8oVV1xhnqNBUlsONWBqK6OW5WzLAADAF7EJABA2R7ySk5Plr7/+ynXerl27zPz8SE1NlWnTpslll13mnaaJnN4yMjJMt46cAahJkyaydu1ac5RN/3umeVStWlXS0tK8w9zntQwAAHwRmwAAYXPES7sZTpgwQWrWrGkupqw0IO3evdu08LVo0SJfy0lJSZGrrrrKb9rHH39sWhsff/xxeeutt6RChQp+88uXLy+ZmZmSnp5uWhU1QCYmJp72HC2L0v9nW0bp0qWloOLjCz0o5BnFxcX6/bexbKeLhHqwuR1ECqfXgdPXPxR1EMmx6WxxKdD1V9jlBbI8wdg2wum7SFkoSySXJ87BZSlQ4qUnCf/www9y2223SdmyZb394TWQVKxY0dwviHXr1sljjz0mrVu3Nsnb8ePHpUiRIn7P8TzW4es1QOWcrzTY6YnNKq9lFFRsbIykphYX21JSkqy/h1NFUt1GUlltcXodOH39Q1kHkRKbghWXwnGbDGZZnLreeaEs4V+WcCtPigPLUqDEq2TJkmYADe3DvnLlSjP6k3Yv7NSpkxmhKSnp3Au/dOlSM0Kijh41duxYb5DKGYA8j/U9dFTF3AKUBjZPGfJaRkG5XG7JyDgmtmjmrRtBRkamZGe7rCzb6WzUbSRtB5HC6XXg9PXPWQfFiycGtZU0kmJTXnEp0Pv+wm6TgSxPML4f4fRdpCyUJZLLExeFZdFl5Cc2FSjx8rTM6REvvRXWq6++KqNGjTInHj/zzDPeVj89erZ3716/5+rjYsWKmURPu2lo0qfByrflUJ+jfenzs4zCyMqyv7HoRhCM93GiSKrbSCqrLU6vA6evvwp2gI7E2BTMbSSctslglsWp650XyhL+ZQm38mQ7sCwFSrz0SFdebr755nwtS0eNGjFihDlaNnjwYL9REnU0qG+//dbv+XqETVseY2NjzWhTLpfLnIzsOUl5+/btpn99o0aN8rUMAAByIjYBAMIi8Ro0aFCu0zUwxcXFmVt+Ei8NRE899ZRce+215nom+/bt887Trhoa8Nq1a2e6d+j/zz//XBYvXmyG21XacnjDDTfIkCFDzHK0e8awYcOkcePGUr9+ffOcvJYBAIAvYhMAIGwSr2XLlp027dixY2Z43Jdeekmef/75fC1HR4k6deqUfPLJJ+bmSwPR6NGjZcqUKTJmzBhzzZPzzz/f3PcdgldbJDWwPfDAA+Zx8+bNTbDzqFGjRp7LAADAg9gEAAibxKtSpUq5TtdAosFKA45208hLjx49zO1sNFjp7Uy0P/zIkSPNraDLAADAg9gEALAh4B3Ja9WqJevXrw/0YgEAAAAgYgU08dIRnN58800pU6ZMIBcLAAAAAM7ratiqVSu/EZ6UjuCUnp5urlPy6KOPBqp8AAAAAODMxEtHZsqZeKkSJUpIy5Yt5f/+7/8CUTYAAAAAcG7ipSM6AQAAAAAsJl5//vnnOT3/vPPOK8jbAAAAAEBUCNg5XmezcePGgrwNAAAAADg38Zo4caIMGzZMLrnkErnpppskLS3NDKzx6aefykcffSQ9e/Y847W+AAAAAMBpCpR4vfPOO2YQjZznel1//fVmKPl169bJAw88EKgyAgAAAIDzruO1YsUKadu2ba7zmjdvLmvXri1suQAAAADA2YlXamqq/PDDD2dMyrTrIQAAAACgEF0Nb7nlFnnhhRckMzPTDLRRunRp2bdvnyxevFhee+01GTp0aEEWCwAAAABRqUCJV69eveTw4cMya9YsmTFjhpnmdrslKSlJ+vXrJ3fccUegywkEXFxcgQ74BoTL5TY3AEB4iI2NMbe8YsbZYgf7dgABT7x0KPlBgwaZBOz777+XQ4cOme6H9evXlxIlShRkkUDQlEpONIExJSUpZGXIznbJwYPHCNAAEAY04SpVqli+GuTOFjvYtwMIeOLloUlW+fLlzX1NurKysgqzOCAoSiQlmCA7du5a+c+ew0F///PTkmVAh8tNGQjOABB6uj/WpKswcYF9OwBriZcOKT9u3Dj566+/zBGwN954QyZPniwJCQlmepEiRQq6aCAoNLhu++NQqIsBAAgTxAUANhXoJJcPP/xQHn30UWnSpImMHz9eXC6XmX7ttdfK559/LlOmTAl0OQEAAADAWUe8pk6dagbQeOKJJyQ7O9s7vX379nLgwAFZsGCB9O3bN5DlBAAAAABnHfHavn27ObqVm3r16smePXsKWy4AAAAAcHbiVaZMGdm2bVuu83S6zgcAAAAAFCLxuv7662XSpEnmgsknT54003SAjZ9//tmc39WmTZuCLBYAAAAAolKBzvHS87c2b95s/sfG/jd369Spkxw7dkyuuOIKeeihhwJdTgAAAABwVuKlQ8VPnz5dvv76a1m5cqUcPHhQkpOTpXHjxnLVVVeZo18AAAAAgEIkXvfdd5907dpVrrzySnMDAAAAAAT4HK9169ZxVAsAAAAAbCZezZo1k3fffVdOnTpVkJcDAAAAgKMUqKthYmKiSbw++ugjqV69uhQrVsxvvh4Nmz17dqDKCAAAAADOS7x2794tDRo08D52u91+83M+BgAAAAAny3fitWTJEmnSpImkpKTIK6+8YqUwL774onz11Vd+yx8yZIi88cYbfs+rVKmSfPrpp+a+y+WS5557zjzn8OHD0qhRI/nXv/4lF1xwgff5GzdulFGjRpnrjJUuXVo6d+4sd999t5V1AABEF2ITACCo53jptbl+++03v2kvvfSS7N+/PyAFmTt3rkycOPG06b/88ov06NHDBD3P7c033/TO1ws2z5s3T0aMGCHz5883wU5HXPRc2Dk9PV26dOkilStXloULF0rv3r1l7Nix5j4AAGdDbAIABD3xytl9MDs7W8aPH2+6HRbGnj17TPDSgFOlSpXT3nPr1q1y6aWXSrly5bw3bRlUGsBmzpwpffr0kRYtWkjt2rVlwoQJpkx6hE4tWLBAEhISZPjw4eZ8tPbt25tWxWnTphWq3ACA6EVsAgCExTlegTyXa/369Sb46GAdzz//vPzxxx/eeb///rscO3ZMqlWrlutrN23aJEePHpWmTZt6p2lXyDp16sjq1aulbdu2smbNGnNh5/j4/62qdpnUriP79u2TsmXLFrjs8fEFGhQyX+LiYv3+21g2Qis/n4PN7SBSOL0OnL7+oaqDSI1NZ4tLga6/wi4vkOWJprJE2n6BsoR/WcKtPHEOLkuhEq9AaNWqlbnlZvPmzea/9qv/4osvJDY2Vpo3by79+vWT5ORk79G2ihUr+r2ufPny3nn6v2bNmqfNV7t27SpwcIuNjZHU1OJiW0pKkvX3QGicy2fLdkAdOH39g10HkRibghWXwnGbdGpZnLreeaEskVGeFAeWJeSJ19locNOApsFo6tSpppXx2WeflS1btpjh6jMzM83zihQpctpw94cOHTL3jx8/nut8deLEiQKXzeVyS0bGMbFFM2/dCDIyMiU722Vl2Qit/Hy2NreDSOH0OnD6+uesg+LFE0PeShqusSmvuBTofX9ht8lAlieayhJp+wXKEv5lCbfyxEVhWXQZ+YlNhU689JpdtvTs2VPuuusuSU1NNY+1dVD70d92223y008/SdGiRb396T33PUErKem/O1Cd7jmZ2Xe+ynn9sXOVlWV/Y9GNIBjvg+A7l8+W7YA6cPr6q1AH6EiITcHcRsJpm3RqWZy63nmhLJFRnmwHluWcEi8ddSlnC52efKz94HMmY0uXLi104bRF0RPYPGrUqOHtpuHpxrF3714zMpSHPq5Vq5a5X6FCBfPYl+dxWlpaocsIAHAWYhMAwGri1a5dOwm2gQMHmkA0a9Ys7zRtTVQXXXSRuR5KiRIlZNWqVd7glpGRIRs2bJCOHTuax3rtFB3KV0dhjIuLM9NWrlwpVatWlTJlygR9nQAAkY3YBACwmng9/fTTEmzXXXed9OrVy1yE8qabbpLt27eboXd1RCgdfldpENPhfnUYX7145ZgxY0xLYuvWrc18HaJ3+vTpMnjwYHMNlR9//NEEyyeffDLo6wMAiHzEJgBA1A2ucfXVV5sLV+p1TfRizTpa1I033ih9+/b1Pkevk5KVlSVDhgwxJytrK+KMGTO83R+15VCD26hRo8xRO+2Hr62VoTiCBwCIfMQmAEDEJ16jR48+bdrf//53czsT7aLxyCOPmNuZ1K1bV15//fWAlRMA4BzEJgBAIIT+ymUAAAAAEOVIvAAAAADAMhIvAAAAALCMxAsAAAAALCPxAgAAAADLSLwAAAAAwDISLwAAAACwjMQLAAAAACwj8QIAAAAAy0i8AAAAAMAyEi8AAAAAsIzECwAAAAAsI/ECAAAAAMtIvAAAAADAMhIvAAAAALCMxAsAAAAALCPxAgAAAADLSLwAAAAAwDISLwAAAACwjMQLAAAAACwj8QIAAAAAy0i8AAAAAMAyEi8AAAAAsIzECwAAAAAsI/ECAAAAAMtIvAAAAADAMhIvAAAAAHBS4vXiiy9Kp06d/KZt3LhROnbsKPXr15dWrVrJnDlz/Oa7XC6ZNGmSNGvWzDynW7dusnPnznNaBgAAZ0JsAgBEVeI1d+5cmThxot+09PR06dKli1SuXFkWLlwovXv3lrFjx5r7HlOmTJF58+bJiBEjZP78+SbYde3aVU6ePJnvZQAAkBtiEwAgUOIlxPbs2SPDhg2TVatWSZUqVfzmLViwQBISEmT48OESHx8v1atXlx07dsi0adOkffv2JoDNnDlTBgwYIC1atDCvmTBhgmlhXLJkibRt2zbPZQAAkBOxCQAQdUe81q9fb4LPu+++K/Xq1fObt2bNGmncuLEJSh5NmjSR3377Tfbt2yebNm2So0ePStOmTb3zU1JSpE6dOrJ69ep8LQMAgJyITQCAqDvipf3a9Zab3bt3S82aNf2mlS9f3vzftWuXma8qVqx42nM88/JaRtmyZQtc9vh4e3lrXFys338by0Zo5edzsLkdRAqn14HT1z9UdRCpselscSnQ9VfY5QWyPNFUlkjbL1CW8C9LuJUnzsFlCXnidTbHjx+XIkWK+E1LTEw0/0+cOCGZmZnmfm7POXToUL6WUVCxsTGSmlpcbEtJSbL+HgiNc/ls2Q6oA6evfzjVQbjGpmDFpXD7PJxcFqeud14oS2SUJ8WBZQnrxKto0aLeE5E9PAGpWLFiZr7S53jue56TlJSUr2UUlMvlloyMY2KLZt66EWRkZEp2tsvKshFa+flsbW4HkcLpdeD09c9ZB8WLJ4a8lTRcY1NecSnQ+/7CbpOBLE80lSXS9guUJfzLEm7liYvCsugy8hObwjrxqlChguzdu9dvmudxWlqaZGVleafpyFC+z6lVq1a+llEYWVn2NxbdCILxPgi+c/ls2Q6oA6evvwp1gI6E2BTMbSSctkmnlsWp650XyhIZ5cl2YFlC37nyLBo1aiRr166V7Oxs77SVK1dK1apVpUyZMlK7dm0pUaKEGXXKIyMjQzZs2GBem59lAABwLohNAICoS7x0SN0jR47I4MGDZevWrbJo0SKZNWuWdO/e3czX/vF68Um99smyZcvMSFL9+vUzLYmtW7fO1zIAADgXxCYAQEGEdVdDbfWbPn26jBo1Stq1ayflypWTgQMHmvseffr0Md06hgwZYk5W1lbEGTNmmGGA87sMAADyi9gEAIj4xGv06NGnTatbt668/vrrZ3xNXFycPPLII+Z2JnktAwCAMyE2AQCivqshAAAAAEQDEi8AAAAAsIzECwAAAAAsI/ECAAAAAMtIvAAAAADAMhIvAAAAALCMxAsAAAAALCPxAgAAAADLSLwAAAAAwDISLwAAAACwjMQLAAAAACwj8QIAAAAAy0i8AAAAAMAyEi8AAAAAsCze9hsgd7GxMeZ2JnFxsX7/A8nGMgEAQHj9RnC53OYGIDyQeIWA7kxLlSqWrwQoJSUpKGUCAADR9RshO9slBw8eI/kCwgSJV4h2qrpDHTt3rfxnz+Ggv3/D2uXl7uvrBP19AQBAcH4jnJ+WLAM6XG6WR+IFhAcSrxDSHeq2Pw4F/X3PL18i6O+J0+WnNdNWl1O6nwBAeAvVb4Sc6PYIBA6JFxBkpZITTfA5l26kge5ySvcTAEBe6PYIBBaJFxBkJZISTDALVVdTup8AAPKDbo9AYJF4AQ7vRgIAwNkQr4DAYFxxAAAAALCMxAsAAAAALCPxAgAAAADLSLwAAAAAwDISLwAAAACwjMQLAAAAACyLiMRrz549UqtWrdNuixYtMvM3btwoHTt2lPr160urVq1kzpw5fq93uVwyadIkadasmXlOt27dZOfOnSFaGwBApCMuAQCi8jpemzZtksTERFm6dKnExMR4pycnJ0t6erp06dLFBLYnn3xSvv/+e/O/ePHi0r59e/O8KVOmyLx582T06NFSoUIFGTNmjHTt2lXee+89KVKkSAjXDAAQiYhLAICoTLw2b94sVapUkfLly582b/bs2ZKQkCDDhw+X+Ph4qV69uuzYsUOmTZtmAtzJkydl5syZMmDAAGnRooV5zYQJE0wr45IlS6Rt27YhWCMAQCQjLgEAorKr4S+//GICV27WrFkjjRs3NsHNo0mTJvLbb7/Jvn37TKvk0aNHpWnTpt75KSkpUqdOHVm9enVQyg8AiC7EJQBA1B7xSk1NlQ4dOsj27dvlwgsvlJ49e0rz5s1l9+7dUrNmTb/ne1ogd+3aZearihUrnvYcz7yCio8vWN4aFxcR+S6iXKRsh55yRkp5A83p6x+udRCJcSnQ9VfY5QWyPJTFzvLCqSyRtq8Ip7KEW3niHFyWsE+8srKy5Ndff5WLLrpIBg0aJCVKlJAPPvhA7r//fnn55Zfl+PHjp/WH13736sSJE5KZmWnu5/acQ4cOFbhcsbExkppavMCvB0ItJSVJIkmklTfQnL7+4VQHxKXw+jwUZYmM8gSrLE5c50gsT4oDyxL2iZd21Vi1apXExcVJ0aJFzbRLL71UtmzZIjNmzDDTtL+8Lw1sqlixYt7X6HM89z3PSUoqeCW7XG7JyDhWoNdqVh1OGxucKSMjU7KzXRLuPN+XSClvoDl9/XPWQfHiiSFvJY3UuBTo2FPYbTKQ5aEsdsoTTmWJtP1lOJUl3MoTF4Vl0WXkJzaFfeKldCSonGrUqCFfffWVGQ1q7969fvM8j9PS0kzLpGda5cqV/Z6jQ/8WRlZW6L9IQEHpDiaStuFIK2+gOX39VagDtC/iUnhtk5QlMsoTrLI4cZ0jsTzZDixL6DtX5kFbEBs2bGhaF339/PPPpptHo0aNZO3atZKdne2dt3LlSqlataqUKVNGateubbqB+L4+IyNDNmzYYF4LAMC5IC4BAKIy8dJRo6pVq2aG5dWRorZt2yZPP/20uS6KnsisQ/MeOXJEBg8eLFu3bjUXr5w1a5Z0797d24deL2I5duxYWbZsmRlNql+/fqZFsnXr1qFePQBAhCEuAQAKIuy7GsbGxsrUqVNl3Lhx0rdvX9MqqEPu6gnMnlGjpk+fLqNGjZJ27dpJuXLlZODAgea+R58+fUzXjiFDhpiTnrVFUfvh63VWAAA4F8QlAEBUJl6qbNmypjXxTOrWrSuvv/76GefrCdCPPPKIuQEAUFjEJQBA1HU1BAAAAIBIR+IFAAAAAJaReAEAAACAZSReAAAAAGAZiRcAAAAAWEbiBQAAAACWkXgBAAAAgGUkXgAAAABgGYkXAAAAAFhG4gUAAAAAlpF4AQAAAIBlJF4AAAAAYBmJFwAAAABYRuIFAAAAAJaReAEAAACAZSReAAAAAGAZiRcAAAAAWEbiBQAAAACWxdt+AwDhKS4udO0uLpfb3AAAyK/Y2Bhzyyuu5RXfiEEIFRIvwGFKJSeagJOSkhSyMmRnu+TgwWMEPgBAvmjCVapUsXw1GuYV34hBCBUSL8BhSiQlmAA2du5a+c+ew0F///PTkmVAh8tNGQh6AID80JihSVdhYxcxCKFE4gU4lAaubX8cCnUxAADIN2IXIhmDawAAAACAZRzxAhDWg3vk92Tpc8GJ1QAAm4N9MNAHckPiBSAiBvcI5GAgnFgNAAjGYB8M9AFfJF4AgorBPQAAkS4Qg30Qj5yHxAtASHCCNAAg0hHLcC4YXAMAAAAALHNM4uVyuWTSpEnSrFkzqV+/vnTr1k127twZ6mIBAByKuAQAzuKYxGvKlCkyb948GTFihMyfP98EvK5du8rJkydDXTQAgAMRlwDAWRyReGkQmzlzpvTp00datGghtWvXlgkTJsju3btlyZIloS4egBDQk6Lj40NzO9Pww3AO4hKAQNK4cra44zu8PbEpdGLcbnfUD6Py448/yq233iqLFy+WqlWreqffeeedUrNmTXnyySfPeZlabQUdgSYmRr8gsXLw8AnJynZJsCUWiZPkYkV4f97fke9fJCHWvH+MfhFDRPcf57Lr1f2FHg2JFucadTz7TK0D/dxC+dlFclwKVOyJj4v9/5eFcJ3zZxno8lAWu+WhLHbLE6iyKE2aCrtvLMxv25zyKkpsPuJaoDKUYJQlv/XviFENtQVRVaxY0W96+fLlvfPOlVZuXFzhNnD9soUS78/7O/n9Q6kgyYMGBqeLpjoIZVwK1HcvUJ9HIMpDWeyWh7JExjZTWIH4bRuJ6x3MsoTPGluUmZlp/hcpUsRvemJiopw4cSJEpQIAOBVxCQCcxxGJV9GiRc3/nCcsa3BLSjr7FcUBAAg04hIAOI8jEi9PV469e/f6TdfHaWlpISoVAMCpiEsA4DyOSLx0tKgSJUrIqlWrvNMyMjJkw4YN0qhRo5CWDQDgPMQlAHAeRwyuoX3oO3bsKGPHjpXSpUtLpUqVZMyYMVKhQgVp3bp1qIsHAHAY4hIAOI8jEi+l10rJysqSIUOGyPHjx02L4owZMyQhISHURQMAOBBxCQCcxRHX8QIAAACAUHLEOV4AAAAAEEokXgAAAABgGYkXAAAAAFhG4gUAAAAAlpF4AQAAAIBlJF4AAAAAYBmJV4gdPHhQ/vWvf0nz5s2lYcOGcuedd8qaNWu881esWCH//Oc/pV69etKmTRv54IMPJJpt375dGjRoIIsWLfJO27hxo7nQaP369aVVq1YyZ84ciUZvv/22XH/99XLZZZfJDTfcIB999JF33n/+8x/p3r272Ub+9re/ycSJEyU7O1uiiV7P6N///re0bNnSbAMdOnSQ77//3hHbwYsvviidOnXym5bX+rpcLpk0aZI0a9bMPKdbt26yc+dOiaY6+PTTT6V9+/Zme9A6eOaZZ8z1rjxOnDghTz75pDRt2tQ85+GHH5YDBw6EoPQAAOSNxCvE+vfvL999952MHz9eFi5cKBdffLHcd9998uuvv8q2bdvMj239YaWJyK233ioDBw40yVg0OnXqlAwYMECOHTvmnZaeni5dunSRypUrm/rp3bu3jB071tyPJu+8844MHjzYJBuaXLdt29a7bWi96Dah5s+fL0888YS89tpr8vzzz0s0eeGFF+SNN96QESNGmCS0atWq0rVrV9m7d29Ubwdz5841ibSv/KzvlClTZN68eaa+dLvQREzr6+TJkyFYi8DXgTZAPfDAA3LttdfKW2+9JcOGDZMPP/zQJFoe+l346quvZPLkyTJ79myz39SLEgMAEJb0AsoIjd9++81ds2ZN95o1a7zTXC6X+5prrnFPnDjRPXToUPctt9zi95r+/fu77733Xnc0GjdunPvuu+82dbJw4UIzberUqe6//e1v7lOnTvk9r3Xr1u5ooZ95y5Yt3aNHj/abrp+zrv97773nvvTSS90HDx70zps/f767YcOG7hMnTrijxU033eR++umnvY8PHz5stoWPP/44KreD3bt3u7t37+6uX7++u02bNu6OHTt65+W1vvq5N2jQwD137lzv/EOHDrnr1q1rtpdoqIOHH37Y3blzZ7/nv/XWW+5LLrnErL++tnbt2u7ly5d75//6669mm1m3bl1Q1yNSbd++3T1p0iT3iBEj3J9//vlp8/U7OGjQoKCU5fjx4+6ffvrJnZmZaR5v2LDB/fjjj7vvu+8+s2/ctWuXO9S6devm3rNnj9up9PuXM+asWLHC1MuNN95ofp9s3bo1aOX5/vvv3S+++KJfWXR/csMNN7h79uzpXr16dVDKob/ZtG7CxV9//eX+5JNP3L///rt5vHHjRnfv3r3dbdu2dT/wwAPuH3/8MajlOXnypKkf/T53797d/LZ56KGHTExbtWqV22k44hVCqampMm3aNNO1zCMmJsbcMjIyTIuvdqHx1aRJE1m7dq0mzBJNVq9eLa+//rqMHj3ab7rWQePGjSU+Pt6vDn777TfZt2+fREv3yj/++ENuvPFGv+kzZswwRzy1Di655BIpWbKkXx0cOXLEdEeLFmXKlJHPPvvMdKvUbpS6PRQpUkRq164dldvB+vXrJSEhQd59913TldhXXuu7adMmOXr0qN/+ISUlRerUqWO+S9FQB/fee688+uijftNiY2PNEWDd9nU/6KkXDz1KmpaWFlF1ECpafzfffLO899578uWXX5p9zUMPPeR3xFS7derRZ9v0SKUe2bzllltMd+tvvvnGdLvXrsbFixeXpUuXyj/+8Q/TC8Q2Xd8z3VatWiXvv/++97HTPPbYY3L48GHvY91u9Mi8/h7RLvDaO0FPjVi3bp31sixevNhsI99++615rLHDU5arrrrK7CfuueceM9027eL9+OOPm14r+tstlH744Qf5+9//bnoLaM+Zzz//3HRZ114U2ntKexTlPKXFJu363a5dO3nqqadk8+bNZp+v3yON8dp7Sz8z7amRmZkZlPLkLJuWR7dXjanB6qb+v6iOoNMfSrqD8PXxxx/Ljh07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",
|
|
"text/plain": [
|
|
"<Figure size 1000x400 with 2 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## transform\n",
|
|
"bins = 10\n",
|
|
"data.age = (pd.cut(\n",
|
|
" data.age, \n",
|
|
" bins = bins,\n",
|
|
" labels = list(range(1, bins + 1))))\n",
|
|
"\n",
|
|
"## check (compare before and after)\n",
|
|
"fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 4))\n",
|
|
"ori_data.age.plot.hist(ax=axes[0])\n",
|
|
"data.age.value_counts().plot.bar(ax=axes[1]);"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"##### Custom Binning (EXTRA)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 27,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAkcAAAGgCAYAAACg6sNQAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAJfdJREFUeJzt3QmY3fO9P/BPZrIiowmy1H6DhF5iS65UEevjIdyietuiqFiKWiK1b+VabmmScoXaqpYUKQ1qvbS9ej0SCcq9TVKl4WqIIKvsmZn/8/31P3O/E2EmycScM/N6Pc95zjm/3+/8fI/vOSfv+W6/drW1tbUBAECh4u93AAAkwhEAQEY4AgDICEcAABnhCAAgIxwBAGSEIwCAjHAEAJBpnz+h6dLamTU1TV8/s6Ki3SodT8tRV+VDXZUX9VU+KlppXaX31a5du0aPE45WU/rQzJq1oEnHtm9fEd26rRvz5i2M5ctr1nrZWH3qqnyoq/KivspH+1ZcV927rxuVlY2HI91qAAAZ4QgAICMcAQBkhCMAgIxwBACQEY4AADLCEQBARjgCAMgIRwAAGeEIACAjHAEAZIQjAICMcAQAkBGOAAAywhEAQKZ9/oSWV1HRrriVm5qa2uIGAOVOOCohKRR96UvrRGVl+TXoVVfXxJw5CwUkAMqecFRi4SgFo+vvezn+9sH8KBeb9Owaw4/apSi/cARAuROOSlAKRm9Nn9vSxQCANqn8+m8AANYi4QgAICMcAQBkhCMAgIxwBACQEY4AADLCEQBARjgCAMgIRwAAGeEIACAjHAEAZIQjAICMcAQAkBGOAAAywhEAQEY4AgDICEcAABnhCAAgIxwBAGSEIwCAjHAEAJARjgAAMsIRAEBGOAIAyAhHAAAZ4QgAICMcAQBkhCMAgIxwBACQEY4AADLCEQBARjgCAMgIRwAAGeEIACAjHAEAZIQjAICMcAQAkBGOAABKKRwtX748fvrTn8bee+8dO+20Uxx11FHxxz/+sX7/lClT4uijj44dd9wx9tlnn7j77rsbvL6mpiZuuOGG2GOPPYpjTjzxxHj33XcbHNPYOQAASiYc3XzzzTF27Ni48sorY9y4cbHlllvG0KFDY+bMmTF79uw4/vjjY7PNNouHHnooTjvttLj++uuLx3VGjx4dY8aMKV5///33F2EpvX7p0qXF/qacAwCgTvtoYc8++2wMGTIkvva1rxXPzz///CIspdajadOmRYcOHeKKK66I9u3bR58+feKdd96JW2+9NY444ogiAN15550xfPjwGDx4cPH6kSNHFq1IzzzzTHHeBx988HPPAQBQUi1HG2ywQfzud7+Lv/3tb1FdXR0PPPBAdOzYMfr16xeTJk2KgQMHFqGmzm677RZvv/12fPTRRzF16tRYsGBBDBo0qH5/VVVVbLfddjFx4sTieWPnAAAoqZajiy66KM4888zYd999o7KyMioqKuLGG28susFmzJgR22yzTYPje/ToUdy///77xf6kd+/enzqmbl9j59hwww1Xu+zt2zctW1ZWVjS4b+y4clXu5V+VuqLlqavyor7KR6W6avlw9Oabb0bXrl3jpptuip49exZdaqmb7N57743FixcXrUi5Tp06FfdLliyJRYsWFY9XdszcuXOLx42dY3VVVLSLbt3WXaXXVFV1idasNb2/1vReWjt1VV7UV/moasN11aLhKLXcnHPOOXHXXXfFrrvuWmzbfvvti8CUWo86d+5cP7C6Tl2gWWeddYr9STqm7nHdMV26/L1SGzvH6qqpqY158xY26diUvtOHbN68RVFdXdPoceWqsfdXDppaV7Q8dVVe1Ff5qGzFdZXeV1NaxFo0HL322muxbNmyIhDl+vfvH88//3x8+ctfLmat5eqep1amtAxA3bbUDZcf07dv3+Jxr169Pvcca2L58lX70KQP2aq+ppy0pvfXmt5La6euyov6Kh/VbbiuWrRDMQWX5M9//nOD7W+88UZsscUWMWDAgHj55ZeLgdp1xo8fX0z3TwO506Dt9dZbLyZMmFC/f968eTF58uTitUlj5wAAKJlwtMMOO8Quu+wS5513XhFY0gyyUaNGxYsvvhgnnXRSMdX+k08+KQZtp662hx9+uOiCO/nkk4vXp7FEaXHHtG7Rc889V8xeO/vss4vQdcABBxTHNHYOAICS6VZLM9PSIpApEF1wwQXFIOo0syyFl9S1ltx+++1x1VVXxWGHHRYbbbRRnHvuucXjOmeccUbRvXbxxRcXg69TS9Edd9xRrG2UpNahxs4BAFCnXW1tbW39M1apL3bWrAVNnvKfZrbNnr3gc/tv6447a8Tv463pf59tVw76bLx+jBo2uNH3Vw6aWle0PHVVXtRX+Wjfiuuqe/d1mzQgu+0uYgAAsBLCEQBARjgCAMgIRwAAGeEIACAjHAEAZIQjAICMcAQAkBGOAAAywhEAQEY4AgDICEcAABnhCAAgIxwBAGSEIwCAjHAEAJARjgAAMsIRAEBGOAIAyAhHAAAZ4QgAICMcAQBkhCMAgIxwBACQEY4AADLCEQBARjgCAMgIRwAAGeEIACAjHAEAZIQjAICMcAQAkBGOAAAywhEAQEY4AgDICEcAABnhCAAgIxwBAGSEIwCAjHAEAJARjgAAMsIRAEBGOAIAyAhHAAAZ4QgAICMcAQBkhCMAgIxwBACQEY4AADLCEQBARjgCAMgIRwAAGeEIACAjHAEAZIQjAICMcAQAkBGOAAAywhEAQEY4AgDICEcAABnhCAAgIxwBAGSEIwCAjHAEAJARjgAASi0cjRs3Lg466KDYfvvt4+CDD44nn3yyft/f/va3OPnkk2PnnXeOr33tazFq1Kiorq5u8Pr77rsv9t1339hhhx3iO9/5TkyePLnB/qacAwCgJMLRI488EhdddFEcddRR8fjjj8eQIUNi2LBh8eqrr8ayZcvihBNOKI67//774/LLL49f/vKXcdNNN9W//te//nX8+Mc/jjPPPDMefvjh2GSTTeL444+PWbNmFfubcg4AgDrtowXV1tbGT3/60/jud79bhKPk+9//fkyaNCleeumlmD59erz33nvx4IMPxvrrrx/bbLNNfPzxx0UYOuWUU6Jjx45xyy23xNFHHx2HHnpo8fqrr7469ttvvxg7dmzRWvT00083eg4AgJIIR9OmTSsC0CGHHNJg+x133FHcp1aer3zlK0WoqbPbbrvFJ598ElOmTClaid5+++0YNGhQ/f727dvHrrvuGhMnTizCUQpan3eO/v37r3b527dvWsNbZWVFg/vGjitX5V7+VakrWp66Ki/qq3xUqquWD0fJwoULi66vNFYoBZ7UerTPPvvEjBkzolevXg1e06NHj+L+/fffL4JQ0rt3708dM3Xq1OJxY+dY3XBUUdEuunVbd5VeU1XVJVqz1vT+WtN7ae3UVXlRX+Wjqg3XVYuGo9R6k5x33nlx+umnx/Dhw4tusFNPPTV+/vOfx+LFi6OqqqrBazp16lTcL1myJBYtWlQ8XrFrLB2T9ieNnWN11dTUxrx5C5t0bErf6UM2b96iqK6uafS4ctXY+ysHTa0rWp66Ki/qq3xUtuK6Su+rKS1iLRqOOnToUNynVqPDDjuseLztttsWLUgpHHXu3DmWLl3a4DV1gWadddYp9icrO6ZLl7+HjMbOsSaWL1+1D036kK3qa8pJa3p/rem9tHbqqryor/JR3YbrqkU7FHv27Fncp0HSua222qqYfp+6w2bOnNlgX93z9Nq67rSVHVN37sbOAQBQMuEoDZRed91147XXXmuw/Y033ojNNtssBgwYULQi1XW/JePHjy9e069fv9hggw1iyy23jAkTJtTvX758eTEIO702aewcAAAlE45Sl9fQoUOLNYd+85vfxP/+7//GzTffHC+88EKxVlGakr/RRhvFWWedVQywfvbZZ2PEiBHxve99r36cUXqcuuDSekdvvvlmXHjhhcU4o2984xvF/qacAwCgJMYcJWnwdRofNHLkyPjggw+iT58+ceONN8Y//dM/Fftvv/32+NGPfhTf/OY3i+n4aQXs9Jo6afv8+fOLVa/nzJkT//iP/1iEpe7du9cPvm7sHAAAddrVppUYWa2BarNmLWjyekhp2v/s2Qs+d3Bb3XFnjfh9vDV9bpSLPhuvH6OGDW70/ZWDptYVLU9dlRf1VT7at+K66t593SbNVmu7KzwBADRXOErjg1acHg8A0GbD0bnnnhu77757cXmP119/vflLBQBQTuHot7/9bTHbK02J/5d/+Zc46KCDiuuhffjhh81fQgCAUg9HaWHFdP2zp556Ku67777iQq+33XZb7L333sWV7p955plivSEAgDY3lX/nnXcubkceeWT8+Mc/jt///vfFbcMNN4xjjz22aGGqrKxsntICAJRyOJo+fXo88sgjxS0t4JhWtR42bFgMHjy4CEhpcce0MOO//du/NV+JAQBKLRyNHTu2CESvvPJKscjigQceGFdddVXRvVYnXS9t9uzZcf/99wtHAEDrDkeXXHJJ9O/fv5itlgZjr7feeis9rm/fvsWAbQCAVh2O0jpHW221VVRXV9ePJ0rXM1u2bFl07dq1/rivf/3rzVdSAIBSna22xRZbxGWXXVZcq6xO6mIbNGhQ0YVWU9O6lhsHANqO1QpHN9xwQzz66KMxZMiQ+m3bbbddDB8+PB588MHiQq8AAG2mW+2xxx6L8847L771rW/Vb/vSl74Uxx13XLRv3z7uvvvuOOmkk5qznAAApdtylGahbbrppivd9w//8A8xY8aMNS0XAED5hKMUgJ5++unPvLTI5ptvvqblAgAon2617373u3H++efHnDlzYr/99osNNtggZs2aFb/73e/iySefjGuuuab5SwoAUKrhKE3RX7BgQYwePbq4jlqdbt26FWsgmcIPALS5y4ccddRR8Z3vfCemTZtWtCBVVVUV3W0VFavVUwcAUP7XVmvXrl0RiAAA2nQ4SuOL0rXU0sVlFy1aFLW1tZ8KTZMnT26uMgIAlHY4uuKKK4rB1wcffHD06tVLVxoA0LbD0fPPPx8XXnihi8oCAK3OajX5dOjQ4TMXgQQAaHPhaP/994/f/OY3zV8aAIBy7FZLF5kdNWpUvPvuu9G/f//o3LnzpwZkn3baac1VRgCA0h+QnUycOLG4rUg4AgDaVDiaOnVq85cEAKAErPEc/Pnz58dbb70VS5cujerq6uYpFQBAuYWjCRMmxJFHHhkDBw6MQw45JP7yl7/EOeecE9dee23zlhAAoNTD0YsvvhgnnHBCMRB7+PDh9Stk9+vXL+6+++74+c9/3tzlBAAo3XCUZqrtu+++cc8998Sxxx5bH45OOeWUGDp0aIwdO7a5ywkAULrhaMqUKXHEEUfUz0zL7b777jF9+vTmKR0AQDmEo65du8aHH3640n3vv/9+sR8AoM2Eo9SlNnLkyPjv//7v+m2pBWnGjBlxyy23xODBg5uzjAAApb3OUZqV9tprr8U3v/nN2HDDDYttw4YNK8JR7969i8cAAG0mHK2//vrFoOtx48bF+PHjY86cOUVX2jHHHBOHH354dOnSpflLCgBQquEo6dixY9FylG4AAG06HKUWo8Z8/etfX51TAwCUXzg6//zzV7o9DcqurKwsbsIRANBmwtFzzz33qW0LFy6MSZMmxW233RY33XRTc5QNAKA8wtHGG2+80u1bb711LFu2LK688soYM2bMmpYNAKB8Ljz7Wfr27Rt/+tOfmvu0AADlF46WLl0av/rVr2KDDTZoztMCAJR2t9o+++zzqWuq1dTUxOzZs2PJkiVx3nnnNVf5AABKPxwNHDjwU+EoWW+99WLvvfeOr371q81RNgCA8ghH1157bfOXBACgXMPRe++9t0rHf/nLX16d/wwAQPmOOfo8U6ZMWZ3/DABAeYSjUaNGxWWXXRZf+cpX4tBDD42ePXsWg7F/+9vfxpNPPhnf//73P3MtJACAVheOHnnkkWLg9Ypjjw466KBiGv8rr7wSp59+enOVEQCgtNc5evHFF2PIkCEr3bfnnnvGyy+/vKblAgAon3DUrVu3eO211z4zOKVuNgCANtOt9o1vfCNuvvnmWLRoUTE4u3v37vHRRx/FU089Fb/85S/jkksuaf6SAgCUajg69dRTY/78+XHXXXfFHXfcUWyrra2NLl26xNlnnx3f+ta3mrucAAClG47SNP7zzz+/CEl//OMfY+7cuUVX24477liskg0A0KbCUZ0UhHr06FE8TsFo+fLlzVUuAIDyCkdpOv9PfvKT+PDDD4uWpLFjx8aNN94YHTp0KLZ37NixeUsKAFCqs9WeeOKJOO+882K33XaLESNGRE1NTbF9//33j//8z/+M0aNHN3c5AQBKt+XolltuKQZdX3755VFdXV2//YgjjohZs2bFgw8+GGeddVZzlhMAoHRbjqZNm1a0Eq1M//7944MPPljTcgEAlE84SpcIeeutt1a6L21P+wEA2kw4StdQu+GGG4pFH5cuXVpsS4Oy/+d//qcYb3TggQc2dzkBAEp3zFEaT/TGG28U9xUVf89XxxxzTCxcuDB23XXXOPPMM5u7nAAApRuO0jT922+/PV544YUYP358zJkzJ7p27RoDBw6Mvfbaq2hFAgBoM91qJ5xwQnGB2d133z3OOeecuPLKK+Pcc8+NwYMHr1EwSgO9d9ppp3j44Yfrt02ZMiWOPvroYpHJdB23u+++u8Fr0jICqYtvjz32KI458cQT4913321wTGPnAABYo3D0yiuvNHvr0LJly2L48OFF11yd2bNnx/HHHx+bbbZZPPTQQ3HaaafF9ddfXzyuk8Y4jRkzpgho999/fxGWhg4dWj8WqinnAABYo3CUWmkeffTRItA0l7S69orXZUvrJaUVt6+44oro06dPsY7ScccdF7feemuxPwWgO++8M84444yi1apfv34xcuTImDFjRjzzzDNNOgcAwBqPOerUqVMRjp588skicKyzzjoN9qdWpV/84hdNPt/EiRPjgQceiHHjxhUhp86kSZOKcUzt2/9fMdOq3D/72c/io48+ivfeey8WLFgQgwYNqt9fVVUV2223XXHOIUOGNHqODTfccHX+FwAArdRqhaPUMpPGBtWpra1tsH/F559n3rx5xXiliy++OHr37v2p/84222zTYFvdhW7ff//9Yn+y4uvSMXX7GjvHmoSj9u2b1vBWWVnR4L6x48pVuZd/VeqKlqeuyov6Kh+V6qrp4Sh1U6UWl9Qyc8899zRbAdIlSFLQOuSQQz61b/HixZ+6gG1qtUqWLFkSixYtKh6v7Ji5c+c26Ryrq6KiXXTrtu4qvaaqqku0Zq3p/bWm99Laqavyor7KR1Ubrqsmh6O0dlHq+tphhx3qt912221x+OGHr/aK2KkbLXV7PfbYYyvd37lz5/qB1XXqAk3qykv7k3RM3eO6Y7p06dKkc6yumpramDfv/waPf56UvtOHbN68RVFdXdPoceWqsfdXDppaV7Q8dVVe1Ff5qGzFdZXeV1NaxJocjlbsKksXnB0xYkR89atfXe1wlGaMffzxxw3GGSWXXXZZPPHEE9GrV6+YOXNmg311z3v27BnLly+v35Zmo+XH9O3bt3jc2DnWxPLlq/ahSR+yVX1NOWlN7681vZfWTl2VF/VVPqrbcF2t1pij1RlbtDJpSn3q9sodcMABxeyzQw89NB555JFien4KYpWVlcX+tOjklltuWQSytPBkmuE2YcKE+nCUxjBNnjy5WNcoGTBgwOeeAwAg16KjrVLLzeabb97glqTQkvalafeffPJJXHTRRfHmm28Wi0PeddddcfLJJxfHpbFEKQSlkPXcc8/F1KlT4+yzzy5ai1LISho7BwBAs7UcrW0pJKXLlFx11VVx2GGHxUYbbVTMbEuP66RWptS9lma7pVao1FJ0xx13FGsbNfUcAADNFo6ae6XsP//5zw2epwHgaSD4Z0ldZT/84Q+L22dp7BwAAKsVjtKlN1acFn/KKafUt9LkgenZZ59dlVMDAJRXONINBQC0BU0OR9dcc83aLQkAQAlou2uDAwCshHAEAJARjgAAMsIRAEBGOAIAyAhHAAAZ4QgAICMcAQBkhCMAgIxwBACQEY4AADLCEQBARjgCAMgIRwAAGeEIACAjHAEAZIQjAICMcAQAkBGOAAAywhEAQEY4AgDICEcAABnhCAAgIxwBAGSEIwCAjHAEAJARjgAAMsIRAEBGOAIAyAhHAAAZ4QgAICMcAQBkhCMAgIxwBACQEY4AADLCEQBARjgCAMgIRwAAGeEIACAjHAEAZIQjAICMcAQAkBGOAAAywhEAQEY4AgDICEcAABnhCAAgIxwBAGSEIwCAjHAEAJARjgAAMsIRAEBGOAIAyAhHAAAZ4QgAICMcAQBkhCMAgIxwBACQEY4AADLCEQBARjgCAMgIRwAApRSO5syZE5deemnsueeesfPOO8e3v/3tmDRpUv3+F198MQ4//PDo379/HHjggfH44483eP2SJUviRz/6UQwaNCh22mmnOOecc2LWrFkNjmnsHAAAJROOhg0bFq+++mqMGDEiHnroodh2223jhBNOiL/+9a/x1ltvxcknnxx77LFHPPzww3HkkUfGueeeW4SdOpdffnn813/9V9x4443xi1/8onjdGWecUb+/KecAAKjTPlrQO++8Ey+88EKMGTMmdtlll2LbJZdcEn/4wx/isccei48//jj69u0bZ599drGvT58+MXny5Lj99tuLlqIPPvggxo0bF7fcckvsuuuuxTEpZKXWoRS4UktSCkyfdw4AgJIJR926dYtbb701tt9++/pt7dq1K27z5s0rutf222+/Bq/Zbbfd4qqrrora2tp4+eWX67fV2XLLLaNnz54xceLEIhw1do7031pd7ds3reGtsrKiwX1jx5Wrci//qtQVLU9dlRf1VT4q1VXLhqOqqqrYa6+9Gmx7+umnixalCy+8MH79619Hr169Guzv0aNHLFq0KGbPnl20HKWA1alTp08dM2PGjOJxuv+8c3Tv3n21yl5R0S66dVt3lV5TVdUlWrPW9P5a03tp7dRVeVFf5aOqDddVi4ajFb3yyitxwQUXxAEHHBCDBw+OxYsXR8eOHRscU/d86dKlRcBZcX+SwlIaqJ00do7VVVNTG/PmLWzSsSl9pw/ZvHmLorq6ptHjylVj768cNLWuaHnqqryor/JR2YrrKr2vprSIlUw4evbZZ2P48OHFjLXrr7++PuSsGGDqnnfp0iU6d+680oCTglHa35RzrInly1ftQ5M+ZKv6mnLSmt5fa3ovrZ26Ki/qq3xUt+G6KokOxXvvvTd+8IMfxN57710Mrq7rJuvdu3fMnDmzwbHp+TrrrBNdu3YtusvSUgArhp90TBp31JRzAACUVDhKM9WuvPLKOOqoo4qZZnkXWJqB9tJLLzU4fvz48UXrUkVFRTHDraampn5gdjJt2rRiLNKAAQOadA4AgFyLpoMUZK6++urYf//9i7WIPvroo/jwww+L2/z58+OYY46J119/vehmS+sV3XnnnfHUU0/F0KFDi9en1qGDDz44Lr744pgwYUJxbFo3aeDAgbHjjjsWxzR2DgCAkhlzlGamLVu2LP7jP/6juOUOO+ywuPbaa2P06NFx3XXXFesVbbLJJsXjfH2i1OqUAtbpp59ePE8rbaewVGfrrbdu9BwAAHXa1abFflitgWqzZi1o8npIadr/7NkLPndwW91xZ434fbw1fW6Uiz4brx+jhg1u9P2Vg6bWFS1PXZUX9VU+2rfiuurefd0mzVYz6AYAICMcAQBkhCMAgIxwBACQEY4AADLCEQBARjgCAMgIRwAAGeEIACAjHAEAZIQjAICMcAQAkBGOAAAywhEAQEY4AgDICEcAABnhCAAgIxwBAGSEIwCAjHAEAJARjgAAMsIRAEBGOAIAyAhHAAAZ4QgAICMcAQBkhCMAgIxwBACQEY4AADLCEQBARjgCAMgIRwAAGeEIACAjHAEAZIQjAICMcAQAkBGOAAAywhEAQEY4AgDICEcAABnhCAAgIxwBAGSEIwCAjHAEAJARjgAAMsIRAEBGOAIAyAhHAAAZ4QgAICMcAQBk2udPYE1UVpZX1q6pqS1uAJATjlhjX+raqQgZVVVdopxUV9fEnDkLBSQAGhCOWGPrdekQFRXt4vr7Xo6/fTA/ysEmPbvG8KN2KcotHAGQE45oNikYvTV9bksXAwDWSHkNEgEAWMuEIwCAjHAEAJARjgAAMsIRAEBGOAIAyAhHAAAZ4QgAICMcAQBkrJBNm7bixXLrnpfqRXRdLBdg7Wsz4aimpib+/d//PcaOHRvz58+PAQMGxKWXXhqbbrppSxeNErxYbqleRNfFcgHWvjYTjkaPHh1jxoyJa6+9Nnr16hXXXXddDB06NB577LHo2LFjSxePL5iL5QLQpsPR0qVL484774zhw4fH4MGDi20jR46MPfbYI5555pkYMmRISxeRFuJiuQC0yXA0derUWLBgQQwaNKh+W1VVVWy33XYxceJE4YiyUqrjob5opT4+7ItmPBo0nzYRjmbMmFHc9+7du8H2Hj161O9bValro3v3dZt0bLt2f79ff/0uUVvb+HGXnzgollfXRLno1LGy7MpdjmXu2KEiams/e5xUqUplblf34V4L1sb/j7Vd5rUhlTndSl36HaQ8rN+CdbW2Psrp3+6maBPhaNGiRcX9imOLOnXqFHPnrl6XSvrhrKxctR/PioqKJg8WLkflWO5yLHO5KbeQUc5lLodyN/V3kJZX0Ybrqk28886dO9ePPcotWbIkunTxVwwA0MbCUV132syZMxtsT8979uzZQqUCAEpRmwhH/fr1i/XWWy8mTJhQv23evHkxefLkYr0jAIA2NeYojTU6+uij4/rrr4/u3bvHxhtvXKxzlNY7OuCAA1q6eABACWkT4Sg544wzYvny5XHxxRfH4sWLixajO+64Izp06NDSRQMASki72nKY+wkA8AVpE2OOAACaSjgCAMgIRwAAGeEIACAjHAEAZIQjAICMcAQAkBGO1qKampq44YYbYo899ogdd9wxTjzxxHj33Xdbulis4Gc/+1kcc8wxDbZNmTKlWFU91ds+++wTd999d4uVr62bM2dOXHrppbHnnnvGzjvvHN/+9rdj0qRJ9ftffPHFOPzww6N///5x4IEHxuOPP96i5W3rPv744/jhD38Yu+22W+y0005x0kknxVtvvVW/33erNE2bNq2or4cffrh+W1uuK+FoLRo9enSMGTMmrrzyyrj//vuLsDR06NBYunRpSxeN/+++++6LUaNGNdg2e/bsOP7442OzzTaLhx56KE477bTi0jPpMV+8YcOGxauvvhojRowo6mDbbbeNE044If76178W/+iefPLJxR8g6Uf9yCOPjHPPPbcITLSM9H1555134tZbb41f/epX0blz5zjuuONi0aJFvlslatmyZTF8+PBYuHBh/bbZbbyu2szlQ75oKQDdeeedxQdu8ODBxbaRI0cWP+LPPPNMDBkypKWL2KZ98MEHcdlllxUXI95iiy0a7HvwwQeLy8pcccUV0b59++jTp0/9j/0RRxzRYmVui9L/9xdeeKH4I2OXXXYptl1yySXxhz/8IR577LGilaJv375x9tlnF/tSXaULSt9+++0xaNCgFi592zN37tzi2pUpsG6zzTbFtlNPPTX++Z//Of7yl78UodV3q/TceOONxcXZcw+28d9BLUdrydSpU2PBggUNfqCrqqpiu+22i4kTJ7Zo2Yj405/+VHzxH3300aI7Jpe6bAYOHFj8INRJXQRvv/12fPTRRy1Q2rarW7duxY/x9ttvX7+tXbt2xW3evHlFXa0YglJdvfzyy+HKSF+89ddfP37yk5/UB6NZs2bFXXfdVVzke6uttvLdKkHp36MHHnggrr322gbbJ7XxuhKO1pIZM2YU9717926wvUePHvX7aDmp/zz9tbTpppt+al+qn/RjvmK9Je+///4XVkb+/gfFXnvtFR07dqzf9vTTTxd/waZW2M+qq7ouHFpOauFLwTWNAbvqqqtinXXW8d0qMekPjNQNnS7IvuK/VTPaeF0JR2tJ+nFO8h/1pFOnTrFkyZIWKhVNsXjx4pXWW6LuWtYrr7wSF1xwQRxwwAFFd/XK6qruubF9LevYY48txqekIQRpvEpqrfXdKi2XX355MQj7kEMO+dS+xW28row5WkvSIMS6H+i6x3Ufqi5durRgyWhMqq8V/2Gt+zFIf/3SMp599tliDF+asZYGhtb9WK9YV3XPfc9aVupGS1Kr0WuvvRb33nuv71YJGTduXNF1lsburUznNl5XWo7WkromypkzZzbYnp737NmzhUpFU6Sm5JXVW6LuWkb6h/UHP/hB7L333nHLLbfU/wWbvmcrq6v04921a9cWKm3blcYYpW605cuX12+rqKgoglKqF9+t0pFa9dKEhtQCm1qP0i1JE1WGDh3a5utKOFpL+vXrV4z+T7Oh8v7dNJNmwIABLVo2Pl+qnzSgt7q6un7b+PHjY8stt4wNNtigRcvWFtUth3HUUUcV0/nzpv5dd901XnrppQbHp7pKrUvpH2W+WGmgblp6IV9KIU0TT797abaT71bpSK2vTzzxRNGCVHdLzjjjjKK1r63XlV+PtST9gKfFs9IH8Lnnnitmr6XpximNp/ESlK40TfWTTz6Jiy66KN58881i/Zw04yZNT+aLX5ju6quvjv3337/4/5/+8f3www+L2/z584vFO19//fXie5bWPErLZzz11FPFX7588dIstbRY57/+678Ws6DeeOONOP/884s/DNNaR75bpSO1/my++eYNbkkKPj179mzzddWu1nzXtSYl7vSXbvpQpcFtKYmnlX432WSTli4amfTjPX369Ljnnnvqt6V/cNNfT+kv3o022ii+973vFWGXL1bqQkvrg63MYYcdVkw/fv755+O6664rphin71bqfjvooIO+8LLydym0pun8aYxYepxa99J3bOutty72+26VrrRm2DXXXFOsON/W60o4AgDI6FYDAMgIRwAAGeEIACAjHAEAZIQjAICMcAQAkBGOAAAywhEAQEY4AgDICEcAABnhCAAg/s//A8bNM5CDGtQgAAAAAElFTkSuQmCC",
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"data.campaign.plot.hist();"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 28,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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2LRpU9x44427XGY6xba26p1mnz4RDQ0Nse6FzbG1tS1qUVNjQ+yzV/98ia62vsOdacv6acdEW9ZPOybasn7asSfasqGhT/RJJ98FTVFjNm7cmJ/79evXaXv//v1j/fr13SozNUZjY9caZFekb1qtS78AJdCW9dOOibasn3ZMtGX9tGNvtWXNffcqvTHbD/bdvHlzDBw4sJdqBQDUqpoLM8OHD8/Pzz77bKft6euhQ4f2Uq0AgFpVc2EmzV7ac889Y+nSpR3bWlpa4uGHH47Ro0f3at0AgNpTc2Nm0liZU089NWbOnBn77rtvvOlNb4ovf/nLMWzYsJgwYUJvVw8AqDE1F2aSdI+ZrVu3xqWXXppnMKUemXnz5kXfvn17u2oAQI2puanZAABFj5kBANgVwgwAUDRhBgAomjADABRNmAEAiibMAABFE2YAgKIJMwBA0YQZivX444/H9ddfH1dddVX86Ec/esX+F198MS6++OJeqVtp0qr0v/jFL/Idt5NHHnkkLrnkkpg0aVJ86UtfitWrV/d2FYvw0EMPxZw5czq+XrJkSXzqU5+KiRMnxqc//el48MEHe7V+pTvzzDNfsQgxr+2OO+6ILVu2dNqWfi5TW5544olxwQUXxMqVK6N07gBMkZYvXx6f/OQnY8iQIdGnT5/43//937x2V1rHK63vlTz33HMxbty4/MHMq/vNb34Tp59+ev6QOPDAA3M4TB+8aV20t7zlLXmR17TY64IFC2LkyJG9Xd2adc8998T5558f73rXu2Lu3Lnxwx/+MLfjcccdl9vxV7/6Vfznf/5nfPWrX433vve9vV3dmv7wfTWXX355nHfeeXndvuQv//Iv38CalemII46IH//4x7Hffvvlr++7774cZP70T/803vrWt8bPf/7z+NnPfhbf+MY34p3vfGeUSpihSB//+MfzL+lll12Wv/7+978fn//85+Ooo46Kr3/969HU1CTMdNFZZ50V/fv3zx+8N910U/zbv/1bnHDCCTF9+vQcFNM6af/wD/8Q69evzx/S7FjqfUmP1BOT/PVf/3W8+93vzh++FTfccEMsXrw4vvOd7/RiTWtb+h2u9BC+1sdT+tn0u71zhx9+eNx///0dYSb93/mOd7wj/05X/OM//mMONekPllLV5EKTu7PTTjst/xJ2xc0339zj9SnV//zP/+RfwIoPfOAD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",
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"## transform\n",
|
|
"data.campaign = np.where(data.campaign <= 5, data.campaign, 6)\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"data.campaign.value_counts().plot.bar();"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 29,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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",
|
|
"text/plain": [
|
|
"<Figure size 640x480 with 1 Axes>"
|
|
]
|
|
},
|
|
"metadata": {},
|
|
"output_type": "display_data"
|
|
}
|
|
],
|
|
"source": [
|
|
"## with different ranges (pandas.cut())\n",
|
|
"\n",
|
|
"## sandbox\n",
|
|
"data = ori_data.copy()\n",
|
|
"\n",
|
|
"## transform\n",
|
|
"data.campaign = pd.cut(\n",
|
|
" data.campaign, \n",
|
|
" bins = [0, 1, 2, 3, 4, 5, 10, 1000], \n",
|
|
" labels = [1, 2, 3, 4, 5, '6-10', '>10'])\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"data.campaign.value_counts(sort=False).plot.bar();"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Bereinigen von Variablennamen"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 30,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"['job_admin.', 'job_blue collar', 'job_entrepreneur', 'job_housemaid', 'job_management', 'job_retired', 'job_self-employed', 'job_services', 'job_student', 'job_technician', 'job_unemployed']\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## sandbox: create dummy variables\n",
|
|
"data = pd.get_dummies(ori_data)\n",
|
|
"\n",
|
|
"## check variablen names beginning with \"job_\"\n",
|
|
"print(data.columns[data.columns.str.contains('job_')].tolist())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 31,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"['emp.var.rate', 'cons.price.idx', 'cons.conf.idx', 'nr.employed', 'job_admin.', 'job_blue collar', 'job_self-employed', 'education_basic.4y', 'education_basic.6y', 'education_basic.9y', 'education_high.school', 'education_professional.course', 'education_university.degree']\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## create a list with dubious names, using regex\n",
|
|
"old_names = data.columns\n",
|
|
"old_names = old_names[old_names.str.contains('[^a-zA-Z0-9_]')]\n",
|
|
"print(old_names.tolist()) ## check"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 32,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"['emp_var_rate', 'cons_price_idx', 'cons_conf_idx', 'nr_employed', 'job_admin_', 'job_blue_collar', 'job_self_employed', 'education_basic_4y', 'education_basic_6y', 'education_basic_9y', 'education_high_school', 'education_professional_course', 'education_university_degree']\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## create new names, using regex\n",
|
|
"new_names = old_names.str.replace('[^a-zA-Z0-9_]', '_', regex=True)\n",
|
|
"print(new_names.tolist()) ## check"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 33,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"['job_admin_', 'job_blue_collar', 'job_entrepreneur', 'job_housemaid', 'job_management', 'job_retired', 'job_self_employed', 'job_services', 'job_student', 'job_technician', 'job_unemployed']\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## rename variables using the lists created above\n",
|
|
"for i in range(len(old_names)):\n",
|
|
" data.rename(columns={old_names[i]:new_names[i]}, inplace=True)\n",
|
|
"\n",
|
|
"## check variablen names beginning with \"job_\"\n",
|
|
"print(data.columns[\n",
|
|
" data.columns.str.contains('job_')\n",
|
|
"].tolist())"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "raw",
|
|
"metadata": {},
|
|
"source": [
|
|
"## shorter version:\n",
|
|
"data.rename(columns=dict(zip(old_names, new_names)), inplace=True)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"### Ändern von Datentypen"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 34,
|
|
"metadata": {
|
|
"scrolled": true,
|
|
"tags": []
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"float64\n",
|
|
"int32\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"## change data type of age from float to int\n",
|
|
"\n",
|
|
"## sandbox\n",
|
|
"## cast on NAs causes now runtime error\n",
|
|
"#data = ori_data.copy()\n",
|
|
"data = ori_data.copy().dropna()\n",
|
|
"\n",
|
|
"## check before\n",
|
|
"print(np.dtype(data.age))\n",
|
|
"\n",
|
|
"## change type\n",
|
|
"data['age'] = np.int32(data['age'])\n",
|
|
"\n",
|
|
"## check after\n",
|
|
"print(np.dtype(data.age))"
|
|
]
|
|
}
|
|
],
|
|
"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.13.0"
|
|
},
|
|
"toc": {
|
|
"base_numbering": "1.3",
|
|
"nav_menu": {},
|
|
"number_sections": true,
|
|
"sideBar": true,
|
|
"skip_h1_title": false,
|
|
"title_cell": "1.3 Feature Engineering - Transformation",
|
|
"title_sidebar": "Contents",
|
|
"toc_cell": true,
|
|
"toc_position": {
|
|
"height": "calc(100% - 180px)",
|
|
"left": "10px",
|
|
"top": "150px",
|
|
"width": "218.6px"
|
|
},
|
|
"toc_section_display": true,
|
|
"toc_window_display": true
|
|
},
|
|
"toc-autonumbering": true,
|
|
"varInspector": {
|
|
"cols": {
|
|
"lenName": 16,
|
|
"lenType": 16,
|
|
"lenVar": 40
|
|
},
|
|
"kernels_config": {
|
|
"python": {
|
|
"delete_cmd_postfix": "",
|
|
"delete_cmd_prefix": "del ",
|
|
"library": "var_list.py",
|
|
"varRefreshCmd": "print(var_dic_list())"
|
|
},
|
|
"r": {
|
|
"delete_cmd_postfix": ") ",
|
|
"delete_cmd_prefix": "rm(",
|
|
"library": "var_list.r",
|
|
"varRefreshCmd": "cat(var_dic_list()) "
|
|
}
|
|
},
|
|
"oldHeight": 217.64999999999998,
|
|
"position": {
|
|
"height": "238.85px",
|
|
"left": "802.2px",
|
|
"right": "20px",
|
|
"top": "116px",
|
|
"width": "326.8px"
|
|
},
|
|
"types_to_exclude": [
|
|
"module",
|
|
"function",
|
|
"builtin_function_or_method",
|
|
"instance",
|
|
"_Feature"
|
|
],
|
|
"varInspector_section_display": "block",
|
|
"window_display": false
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 4
|
|
}
|