{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## slik-wrangler Preprocessing API" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Brief description on how to use the preprocessing module in the slik-wrangler package. This sample notebook explains some very important methods in the preprocessing module" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "dataset_path = 'data/titanic.csv'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using Slik-wrangler load file module you only need to specify your data path. \n", "\n", "Slik-wrangler can infer the file type that was passed and read it as a pandas dataframe.\n", "\n", "`slik-wrangler.loadfile.read_file` function makes use of the same keyword arguments as pandas read functions. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from slik_wrangler import loadfile as lf" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can get a brief summary of the rows and column that was loaded by Slik-wrangler" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[32m\n", "CSV file read sucessfully\n", "\u001b[36m\n", "Data has 891 rows and 12 columns\n" ] } ], "source": [ "train = lf.read_file(dataset_path)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Working with a large csv file and you can not load the whole data to Excel or with pandas, with slik-wrangler you can split a csv into multiple csv files. \n", "\n", "Specify the number of rows that should be present in each csv file" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "lf.split_csv_file(dataset_path,row_limit=200)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass \\\n", "0 1 0 3 \n", "1 2 1 1 \n", "2 3 1 3 \n", "3 4 1 1 \n", "4 5 0 3 \n", "\n", " Name Sex Age SibSp \\\n", "0 Braund, Mr. Owen Harris male 22.0 1 \n", "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", "2 Heikkinen, Miss. Laina female 26.0 0 \n", "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", "4 Allen, Mr. William Henry male 35.0 0 \n", "\n", " Parch Ticket Fare Cabin Embarked \n", "0 0 A/5 21171 7.2500 NaN S \n", "1 0 PC 17599 71.2833 C85 C \n", "2 0 STON/O2. 3101282 7.9250 NaN S \n", "3 0 113803 53.1000 C123 S \n", "4 0 373450 8.0500 NaN S " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before any step in preprocessing your dataset, it is essential to look at the overall state of your dataset. \n", "\n", "Pandas provide a means to achieve this by its `info()` method, which gives us an insight into the missing values, data type, data size, and data memory usage.\n", "\n", "While this is useful, with Slik-wrangler you could quickly get an overview of all you need to adjust to make a balanced dataset. By balanced dataset here, we're implying a dataset void of missing values, duplicate values, and inconsistency in the data type of one or more feature columns.\n", "\n", "Slik-wrangler provides a data quality assessment module (`slik-wrangler.dqa`) for this purpose entirely. " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "from slik_wrangler.dqa import data_cleanness_assessment" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "With the `slik-wrangler.dqa.data_cleanness_assessment` You could get a general overview of how balanced your dataset is." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[36mChecking for missing values\n", "\n", "\u001b[33mDataframe contains missing values that you should address. \n", "\n", "columns=['Age', 'Cabin', 'Embarked']\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", "
missing_countsmissing_percent
features
Age17719.9
Cabin68777.1
Embarked20.2
\n", "
" ], "text/plain": [ " missing_counts missing_percent\n", "features \n", "Age 177 19.9\n", "Cabin 687 77.1\n", "Embarked 2 0.2" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[39m\n", "\n", "\u001b[36mChecking for duplicate variables\n", "\n", "\u001b[32mNo duplicate values in both rows and columns!!!\n", "\u001b[39m\n", "\n", "\u001b[36mChecking for inconsistent values\n", "\n", "\u001b[32mNo inconsistent feature columns values!!!\n", "\u001b[39m\n", "\n" ] } ], "source": [ "data_cleanness_assessment(train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Knowing this, you can proceed to preprocess your dataset using the `slik-wrangler.preprocessing` module." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "from slik_wrangler import preprocessing as pp" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pp.check_datefield(train,'Ticket')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103braund, mr. owen harrismale22.010A/5 211717.2500NaNS
1211cumings, mrs. john bradley (florence briggs th...female38.010PC 1759971.2833C85C
2313heikkinen, miss. lainafemale26.000STON/O2. 31012827.9250NaNS
3411futrelle, mrs. jacques heath (lily may peel)female35.01011380353.1000C123S
4503allen, mr. william henrymale35.0003734508.0500NaNS
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass \\\n", "0 1 0 3 \n", "1 2 1 1 \n", "2 3 1 3 \n", "3 4 1 1 \n", "4 5 0 3 \n", "\n", " Name Sex Age SibSp \\\n", "0 braund, mr. owen harris male 22.0 1 \n", "1 cumings, mrs. john bradley (florence briggs th... female 38.0 1 \n", "2 heikkinen, miss. laina female 26.0 0 \n", "3 futrelle, mrs. jacques heath (lily may peel) female 35.0 1 \n", "4 allen, mr. william henry male 35.0 0 \n", "\n", " Parch Ticket Fare Cabin Embarked \n", "0 0 A/5 21171 7.2500 NaN S \n", "1 0 PC 17599 71.2833 C85 C \n", "2 0 STON/O2. 3101282 7.9250 NaN S \n", "3 0 113803 53.1000 C123 S \n", "4 0 373450 8.0500 NaN S " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pp.change_case(train,'Name','lower').head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "slik-wrangler will identify the data type of each data point, data points with high cardinality and save it in a file. With slik-wrangler, data integrity can be done efficiently to validate downstream data points" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[39m\n", "--------------- Identifying columns present in the data ---------------\n", "\n", "Target column is Survived. Attribute in target column:[0, 1]\n", "\n", "Features with high cardinality:['Name', 'Ticket', 'Cabin']\n", "\n", "{'cat_feat': ['Name', 'Sex', 'Ticket', 'Cabin', 'Embarked'],\n", " 'high_card_feat': ['Name', 'Ticket', 'Cabin'],\n", " 'id_column': 'PassengerId',\n", " 'input_columns': ['Pclass',\n", " 'Name',\n", " 'Sex',\n", " 'Age',\n", " 'SibSp',\n", " 'Parch',\n", " 'Ticket',\n", " 'Fare',\n", " 'Cabin',\n", " 'Embarked'],\n", " 'lower_cat': ['Sex', 'Embarked'],\n", " 'num_feat': ['Pclass', 'Age', 'SibSp', 'Parch', 'Fare'],\n", " 'parse_dates': [],\n", " 'target_column': 'Survived'}\n", "\n", "Attributes are stored in data\\metadata\n", "\n" ] } ], "source": [ "pp.identify_columns(train,'Survived','PassengerId',project_path='./data')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can map your data observations more efficiently with Slik by passing the dictionary of the observation you want to map/rename" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[39m\n", "--------------- Mapping passed column ---------------\n", "\n", "male was mapped to 1\n", "\n", "female was mapped to 0\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", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarkedtransformed_Sex
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS1
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C0
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS0
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S0
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS1
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass \\\n", "0 1 0 3 \n", "1 2 1 1 \n", "2 3 1 3 \n", "3 4 1 1 \n", "4 5 0 3 \n", "\n", " Name Sex Age SibSp \\\n", "0 Braund, Mr. Owen Harris male 22.0 1 \n", "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", "2 Heikkinen, Miss. Laina female 26.0 0 \n", "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", "4 Allen, Mr. William Henry male 35.0 0 \n", "\n", " Parch Ticket Fare Cabin Embarked transformed_Sex \n", "0 0 A/5 21171 7.2500 NaN S 1 \n", "1 0 PC 17599 71.2833 C85 C 0 \n", "2 0 STON/O2. 3101282 7.9250 NaN S 0 \n", "3 0 113803 53.1000 C123 S 0 \n", "4 0 373450 8.0500 NaN S 1 " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pp.map_column(train,column_name='Sex',items={'male':1,'female':0}).head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "slik-wrangler currently relies on the Interquartile range approach to detect outliers present in a data point. slik-wrangler also fixes the outlier present in the data using different methods like replacing an outlier with the mean of the data point. You can also select the numerical features you want to perform the operation on. You can also display a table identifying at least 'n' outliers in a row." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[39m\n", "--------------- Table identifying at least 2 outliers in a row ---------------\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", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
74574601Crosby, Capt. Edward Giffordmale70.011WE/P 573571.00B22S
272801Fortune, Mr. Charles Alexandermale19.03219950263.00C23 C25 C27S
888911Fortune, Miss. Mabel Helenfemale23.03219950263.00C23 C25 C27S
15916003Sage, Master. Thomas HenrymaleNaN82CA. 234369.55NaNS
18018103Sage, Miss. Constance GladysfemaleNaN82CA. 234369.55NaNS
20120203Sage, Mr. FrederickmaleNaN82CA. 234369.55NaNS
32432503Sage, Mr. George John JrmaleNaN82CA. 234369.55NaNS
34134211Fortune, Miss. Alice Elizabethfemale24.03219950263.00C23 C25 C27S
79279303Sage, Miss. Stella AnnafemaleNaN82CA. 234369.55NaNS
84684703Sage, Mr. Douglas BullenmaleNaN82CA. 234369.55NaNS
86386403Sage, Miss. Dorothy Edith \"Dolly\"femaleNaN82CA. 234369.55NaNS
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass Name Sex \\\n", "745 746 0 1 Crosby, Capt. Edward Gifford male \n", "27 28 0 1 Fortune, Mr. Charles Alexander male \n", "88 89 1 1 Fortune, Miss. Mabel Helen female \n", "159 160 0 3 Sage, Master. Thomas Henry male \n", "180 181 0 3 Sage, Miss. Constance Gladys female \n", "201 202 0 3 Sage, Mr. Frederick male \n", "324 325 0 3 Sage, Mr. George John Jr male \n", "341 342 1 1 Fortune, Miss. Alice Elizabeth female \n", "792 793 0 3 Sage, Miss. Stella Anna female \n", "846 847 0 3 Sage, Mr. Douglas Bullen male \n", "863 864 0 3 Sage, Miss. Dorothy Edith \"Dolly\" female \n", "\n", " Age SibSp Parch Ticket Fare Cabin Embarked \n", "745 70.0 1 1 WE/P 5735 71.00 B22 S \n", "27 19.0 3 2 19950 263.00 C23 C25 C27 S \n", "88 23.0 3 2 19950 263.00 C23 C25 C27 S \n", "159 NaN 8 2 CA. 2343 69.55 NaN S \n", "180 NaN 8 2 CA. 2343 69.55 NaN S \n", "201 NaN 8 2 CA. 2343 69.55 NaN S \n", "324 NaN 8 2 CA. 2343 69.55 NaN S \n", "341 24.0 3 2 19950 263.00 C23 C25 C27 S \n", "792 NaN 8 2 CA. 2343 69.55 NaN S \n", "846 NaN 8 2 CA. 2343 69.55 NaN S \n", "863 NaN 8 2 CA. 2343 69.55 NaN S " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "det = pp.detect_fix_outliers(train,target_column='Survived',n=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we have seen with the data quality assessment module, with slik you can also check the mssing values in your data and even plot a percentage distribution to see the top 30 missing values in your dataset" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9gAAAIaCAYAAADbfeV6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAACBWElEQVR4nO3deXSU5dnH8d+smSRsQXYUpSibiiuCIiKgsu+oqIVq3VtttW5UqeJWN9Sq1NpWj1VfWqSKICJuIKsKWHGriiAEiew7mSyzPe8fCVNDEoXhCZNr/H7O6TmS2a47X5Jyz/PMjMdxHEcAAAAAAOCAeNM9AAAAAAAAmYANNgAAAAAALmCDDQAAAACAC9hgAwAAAADgAjbYAAAAAAC4gA02AAAAAAAuYINdQ+LxuJ599lkNHz5cQ4YMUf/+/fXQQw8pEolIksaOHatnnnnmgB5j9+7dGjNmzH7dxo3Hrcptt92m9957z5X7Wrt2ra699lpJUkFBgU444YQDur9Uvk8/xHEcPfroo+rfv7/69++vW265RcXFxZKk4uJi3XDDDerXr5/69Omjd95554AeK9Xv68aNGzVq1KgDeuwDsXjxYg0cOLDGHyeV78+4ceP0+eefS5JGjx6tN954w7V5tm3bpnbt2v3o9ebOnavHHnvMtcf9vokTJx7w3zsAAACkhg12DRk/fryWLVum5557TtOnT9dLL72k1atX67bbbnPtMXbu3KnPPvvMtfs7EPfee69OO+00V+5r3bp1Wr16tSv3Jbn/fXr77be1aNEiTZs2TTNnzlRxcbGef/55SdITTzyhnJwczZo1S88++6zGjx+vDRs2pPxYqX5fmzZtqsmTJ6f8uFak8v1577335DhODU20bz777DPt3LmzRu578eLFisViNXLfAAAA+GH+dA+QidauXasZM2Zo4cKFqlOnjiQpJydHd955p5YtW5a83rJlyzRq1Cht2bJFRx11lB5++GHl5OTopZde0osvvqhoNKqdO3fq8ssv14UXXqipU6fqpZdeUnFxcfJ+S0pKNGTIEE2dOlU+ny953x9++KHuv/9+JRIJSdKVV16pPn36/ODjfvjhh3rwwQdVXFysQCCg6667Tt26dVO3bt304osv6vDDD9ff/vY3/etf/9K7774rSbrkkkt08cUX6+mnn9ZFF12kY445RhdffLF69OihTz75RDt37tT111+v/v37q7i4WHfccYc++eQT1a1bV0ceeaQk6f7770/OHY/HNW7cOG3cuFGXXnqp7rzzTsXjcd1+++367LPPtGvXLt18883JtfzlL3/RW2+9pUQioZYtW+qOO+5Q06ZNK/T4/e9/X+H7tGzZskrrPOOMMzR16lTNnDlTiURCGzduVNOmTXX//fdXur9zzjlHPXv2VCAQUGFhobZt26YGDRpIkt555x1NmDBBktSiRQudfvrpmjVrli655JIK9zF69GgdffTR+uCDD7R161aNGTNGW7du1ZIlS1RcXKw//elPateunUaPHq2LLrpIZ511lu6++2599NFHCgQCOvTQQ3XfffcpKyuryq9v375dgwYN0rJly/TEE0/ou+++0+bNm/Xdd9+pYcOGevTRR9W0aVN9+umnGj9+vKLRqFq1aqV169Zp7Nix6tKlS3LWhQsX6oEHHtCMGTMkSbt27VLv3r31zjvv6KOPPtJf//pXRSIRbdu2TUOHDtV1111XYa1jx47VUUcdpUsvvbTSnzdu3Ki77rpL69evVzQa1YABA3TVVVcpFotVua7c3NxK38cf+3v3fY8++qg2bdqkG2+8UQ8++KAkafbs2Xr66ae1detWnXrqqbrnnnvk9Xr10UcfacKECSouLpbH49G1116rnj17am9vvfWWHn30UWVnZ+uYY45Jfr2oqEjjx49Xfn6+du7cqdzcXE2YMEG7d+/W5MmTFY/HVbduXV155ZVVXu9nP/uZ3nrrLf3lL3+Rx+ORz+fTzTffrM6dO2v37t2699579fXXXysajerUU0/VzTffrBdffFGff/65HnzwQfl8Pp199tmV5gUAAEANcuC6N954wxkxYsQPXueWW25xRo4c6RQVFTmxWMwZNmyY88orrziFhYXOeeed52zbts1xHMdZtmyZc/zxxzuO4zgvv/yy07lzZ2f37t2O4zjO2rVrk5ftbcyYMc5rr73mOI7jfPnll8748eN/8HG3bdvmnHrqqc7HH3/sOI7jfP31184pp5zifPvtt87YsWOdF154wXEcx/n5z3/udOvWzVm1apWza9cup0uXLk5paanz85//3Jk1a5azdu1ap23bts6cOXOS34szzzzTcRzHmTBhgvO73/3Oicfjzu7du51BgwY5t9xyS6XZP/jgA2fAgAHJNbZt29Z54403HMdxnLfeesvp3bu34ziO88orrzjXXXedE41GHcdxnMmTJzuXXXZZpfv7/vfph9b58ssvO8cff7yzatUqx3Ec56GHHnKuvfbaahu+8MILzkknneT079/f2bp1q+M4jnPMMcc4mzZtSl7nkUcecf74xz9Wuu3Pf/5z55prrnEcx3E+/vhjp23bts7s2bMdx3Gce++91xk3blzyerNmzXKWLl3q9O3b10kkEo7jOM6DDz7o/Oc//6n2699f8+OPP+707t07+ffmyiuvdB577DEnGo06Z5xxhjN37lzHcRzn/fffd9q1a+d88MEHFWZNJBJOz549nU8//dRxHMeZNGmSc8MNNziJRML5+c9/7qxevdpxHMfZsGGD06FDB2fr1q0VGt5yyy3O008/nby/7/959OjRyXWXlJQ4o0ePdmbOnFntuqr6Pv7Y37u9fX8tP//5z52rr77aicViTlFRkdOtWzdn6dKlzo4dO5xzzjnHWbt2bXJtZ5xxhvPdd99VuK/Nmzc7J510krNixQrHcRznqaeectq2bes4juPMmjXLufvuu5PX/cMf/uDcddddySZ33nnnj16vd+/ezrJlyxzHcZwFCxY4TzzxhOM4jjN27Fjn+eefdxzHcWKxmHPjjTc6f/vb3yp8TwAAAHDwcQS7Bni93uSR4x9y1llnKTs7W5J01FFHadu2bcrNzdVTTz2lefPmKT8/X1999ZWKioqSt2nXrl3y6PUP6devn+666y7NmTNHp512mn73u9/94ON++umnatWqlY477rjk10888UQtWbJEZ599tiZPnqyhQ4dq06ZNGjhwoN577z3Vr19f3bt3VzAYrPDYgUBAPXr0kCR17NhRO3bskCTNmzdPv//97+X1elWnTh0NGzZMy5cv/9G1BAKB5BHr9u3ba+vWrZKkd999V5999plGjBghSUokEsnXQlfnh9bp8XjUrVs3tW7dWpJ03nnnaciQIdXe189//nNddNFF+tOf/qTf/OY3+r//+78qTz32eqt+Jcaeo4uHHXaYJKl79+6SpFatWmnJkiUVrtu2bVv5fD6de+65Ov3009WnTx916tRJu3btqvLrBQUFFW5/yimnJP/edOzYUTt37tTXX38tSclWXbt21VFHHVVpTo/Ho5EjR+qVV17Rscceq6lTp+qmm26Sx+PRU089pblz5+q1117TN998I8dxfrTBHkVFRVq6dKl27tyZfD1yUVGRvvrqK51++ulVruuHVPf37sf0799fPp9P2dnZOuKII7R161aFw2Ft3rxZv/71ryt8H5YvX64WLVokv/af//xHbdu2TZ6Ncf755+uRRx6RJPXt21eHHXaYXnjhBa1Zs0ZLliyp8v0Efuh6AwYM0DXXXKMePXqoW7duuvzyyyWVvYb7s88+00svvSSp7EwWAAAApB8b7BrQqVMnrVq1SoWFhRU2wxs3btQf/vAHPf7445Ikv/9/336PxyPHcbRhwwadf/75Ou+883TSSSepb9++ydOxpbJTzffFqFGj1LNnTy1atEgLFizQxIkT9eqrr1b7uFU9IeA4jmKxmLp166Zx48Zp3rx56tKli0477TT961//UnZ2dqVTcKWyjc6eTaXH40l+3e/3V9iAVrfxrOr+vj/vHolEQpdddpkuvPBCSVIkEvnR17X+0DoDgUCF0+wTiUSFP+/x1VdfKZFIqGPHjvJ4PDr33HOTr8Fu3ry5Nm/erMaNG0uSNm3apPbt21c5S1VPTFSnXr16mj59uj766CN98MEHuu666zRmzBhdfPHFVX79rLPOqnD7UCiU/O89zX0+X6UnBKparySNGDFCQ4cO1bnnnqvdu3erS5cuKioq0rBhw3TWWWfp5JNP1ogRI/TOO+9Uus89j7dHNBqVVPb9dRxHkydPTj7hs23bNmVlZSk3N7fa9Vanur93P6aqn4d4PK42bdro3//+d/KyjRs3qmHDhj+4tu/f1z//+U9NmTJFF110kQYNGqQGDRpUeuLjx653/fXXa+TIkVq4cKGmTp2qv/3tb5o6daoSiYQee+wxtWnTRlLZafv7s2YAAADUDN7krAY0bdpUgwYN0q233qrCwkJJUmFhocaPH68GDRpU2Ozs7fPPP1fDhg31q1/9St27d09uruPxeKXr+v1+xePxKo+ajho1Sl9++aWGDx+uu+++W7t27frBzedxxx2n1atX69NPP5UkrVixQkuXLtUpp5yirKwsde7cWRMnTlS3bt10yimn6OOPP9aHH36YPOq6L3r06KGXX345eaT5tddeq3JT4PP5kpuwH3L66afrpZdeSn6PH3vsMd18882Vrvf979MPrVOSPvjgA23cuFGSNHny5Cpfc/vVV1/p97//ffJI7bRp09S1a1dJUu/evfXiiy9KkjZs2KAFCxZUeR/7691339XFF1+sE044Qddee62GDh2qr776qtqv74s2bdooGAxq/vz5ksqO7n/99ddVNmnatKmOO+443X777Ro5cqQkac2aNSosLNR1112nXr16acmSJYpEIpWexMjLy0u+a/e2bdv04YcfSpLq1Kmj448/Xs8++6yksk3iBRdcoNmzZx/Qun6Mz+f70TcBO/7447VmzRotXbpUkvTll1+qT58+2rRpU4XrnXzyyVq5cmVytqlTpyYvW7hwoYYNG6Zzzz1XrVu31pw5c5I/x9+fobrrxWIx9erVS0VFRbrgggt0xx136JtvvlEsFtPpp5+uf/zjH3IcR5FIRFdffbX+7//+b5/XBwAAgJrBEewacscdd+jJJ5/UqFGj5PP5FIlEdNZZZyU/fqo63bp100svvaS+ffsqOztbnTp1UsOGDbVmzZpK123cuLE6duyofv366V//+pfy8vKSl91444364x//qD/96U/yer265pprdOihh1b7uA0bNtRjjz2mu+++WyUlJfJ4PLrvvvuSp0ufffbZeuutt9S1a1eFQiG1b99e9evXV1ZW1j5/T6688krdddddGjRokOrWratDDjmkyicbjjrqKPl8Po0cOVKPPvpotfd37rnnauPGjTrvvPPk8XjUvHnzCm+YVt33qbp1Llu2TE2bNtVNN92kzZs368gjj9Rdd91V6f6GDh2qb7/9ViNGjJDP59NRRx2le++9V5J07bXXavz48RowYIDi8bhuuukmtWrVap+/R9U544wzNH/+fA0cOFA5OTmqX7++7r77bjVv3rzKr+8Lv9+vJ554QnfccYceeeQRHXHEEWrUqFG1TwCde+65+u1vf6u//OUvkspernDmmWeqX79+qlevnlq1aqUjjzxSa9asqXB0fvTo0brxxhvVp08fHXroocknMyRpwoQJuvvuuzVo0CBFIhENHDhQgwcPVjweT3ldP+ass87S9ddfr3vuuafa6zRs2FCPP/64HnzwQZWWlspxHD344INq2bJlpetNmDBBN954owKBgDp37py87Je//KVuv/325BsQHn300cnT8k899VRde+21CgQC1V7P7/fr1ltv1Y033ii/3y+Px6M//vGPCgaDuu2223Tvvfdq0KBBikajOu2003TZZZdJknr27KkHHnhA0WhUw4YNc+V7BgAAgH3jcao6/AnUgJkzZ6pOnTrq0aOHEomErr32WnXr1i15ine6TZ06VW+++ab++te/pnuUg+aBBx7QpZdeqkaNGmn9+vUaMmSI3nnnHdWrVy/dowEAAADmcAQbB81RRx2l22+/XY888oii0ai6dOmic889N91j/aS1bNlSF198cfL18ffccw+bawAAACBFHMEGAAAAAMAFvMkZAAAAAAAuYIMNAAAAAIAL2GADAAAAAOAC3uSsBnz33dYKH1MEGyKRCN0MoptdtLOJbjbRzS7a2UQ3m/anW+PGdav8Okewa0AsFk33CEgB3Wyim120s4luNtHNLtrZRDeb3OjGBrsGBINZ6R4BKaCbTXSzi3Y20c0mutlFO5voZpMb3dhg1wCPx5PuEZACutlEN7toZxPdbKKbXbSziW42udGNDXYNKCkpTvcISAHdbKKbXbSziW420c0u2tlEN5vc6MYGGwAAAAAAF7DBBgAAAADABWywa0AolJ3uEZACutlEN7toZxPdbKKbXbSziW42udGNDXYNiMfj6R4BKaCbTXSzi3Y20c0mutlFO5voZpMb3dhg14BEgh8oi+hmE93sop1NdLOJbnbRzia62eRGNzbYNYBnrGyim010s4t2NtHNJrrZRTub6GYTR7ABAAAAAKgl2GDXgEAgmO4RkAK62UQ3u2hnE91soptdtLOJbja50Y0NNgAAAAAALmCDXQM8Hk+6R0AK6GYT3eyinU10s4ludtHOJrrZ5EY3Ntg1IBIpTfcISAHdbKKbXbSziW420c0u2tlEN5vc6MYGGwAAAAAAF7DBrgFeL99Wi+hmE93sop1NdLOJbnbRzia62eRGN8rXAL8/kO4RkAK62UQ3u2hnE91soptdtLOJbja50Y0Ndg3gGSub6GYT3eyinU10s4ludtHOJrrZxBHsWqqkpDjdIyAFdLOJbnbRzia62UQ3u2hnE91scqMbG2wAAAAAAFzgcRzHSfcQmaa4JKrsEK+7AAAAAIB9VVIa0+5d6Tv6Hw4XKje3zj5dt3HjulV+3e/mQCiTHQpo0A3T0z0GAAAAAJgx4+Eh2p3Gxw+Fsg/4PjhFHAAAAADwk5dIJA74PthgAwAAAAB+8mKx6AHfBxtsAAAAAMBPHkewAQAAAACoJdhgAwAAAAB+8oLBrAO+DzbYAAAAAICfPDc+wZoNNgAAAAAALmCDDQAAAAD4yYtGIwd8H2ywAQAAAABwARtsAAAAAMBPns/nO+D78LswR40rLCzUww8/rKVLl8rn86levXoaO3asjj766CqvX1BQoDFjxmjOnDmVLrv88st1zz33qGnTpjU9NgAAAAAgBbNnv6Hly7/4wescemgrDR48stLX8/O/0euvT9cFF1ysvLyG+/yYXu9PYIOdSCR0+eWXq0uXLpo2bZr8fr8++OADXX755Zo5c6by8vL26/7+/ve/19CkAAAAAAA3nHFGb51++plyHEevvvqSmjdvqVNOOU2StHXrFs2Y8bK6dOlW6Xb/+c9iffjhByk95k/iCPbixYu1adMm/eY3v5HXW3ZGe9euXXXfffcpkUho3LhxWrFihbZs2aLWrVtr4sSJkqTS0lL99re/1erVq9WqVSvde++9ql+/vnr16qXnn39eS5Ys0YIFC7Rz506tXbtW3bp10/jx49O4UgAAAACAJAUCAUkB/fe/n6qkpERdu3Yv/5r0/vsLdMwxx6tp0+YVbpNIJPTtt/nq2rW7Fi2au9+PWVJSrNzcOgc0d61/DfYXX3yhY489Nrm53qNHjx5atWqVAoGAXnzxRb399tsqLS3VvHnzJElbt27V6NGj9eqrr6pVq1b685//XOm+ly1bpscff1yvvvqq3n33XS1fvvygrAkAAAAAUFlJSbEikYji8bgKC3fro4+WqGPHsv1gLBbTqlUrtGXLJrVvf7RisZgikYhKS0sVDhequLhI/fsPVf36DSRJxcVFCocLVVQUViwWUzweVzhcmPxfPB5XJBJRSUlx8nqRSESRSETRaDR5veLiIkWj0Qq3r06tP4Lt9Xqr/cDvzp07q0GDBpo0aZJWrVql/Px8FRUVSZJat26tk08+WZI0ePBgjR07ttLtTzjhBNWpU/YMxWGHHaadO3fW0CoAAAAAAD8mFMpO/veezewxxxyXPH177do1atXqCB1ySKMKt8vKykr+954j3dnZOZWOSO/9571PCw8Gg5Xu54duv7dafwT7mGOO0RdffFFpk/3II4/onXfe0Y033qhQKKThw4erc+fOyev5/RWfO9j7z1LFCB6Pp9qNPAAAAADg4Pruu7Vq2LBRhU33d98VqGXLwypcr7S0RPF4/IAf7/uPk6pav8E++eSTdcghh2jixInJb9qCBQs0depULViwQP369dOIESPUqFEjLV26NHmdb775Rl98Ufaucy+99JJOO+20tK0BAAAAALB/Cgt3J0/3/qGvPfPMk/ryy88P+PHcOOBa608R93g8evLJJ3Xfffdp4MCB8vv9ysvL09/+9jf5fD7deOONeuONNxQMBnX88ceroKBAkpKvu/7222/Vtm1bXX/99WleCQAAAABgX51xRu9KX7viimsrfe1Xv/pdhT+3bHlYpa/ti0iktMozn/eHx+G86Box6Ibp6R4BAAAAAMyY8fAQbd68O22PHw4X7vO7iDduXLfKr9f6U8QBAAAAALCADTYAAAAA4CcvKyt0wPfBBhsAAAAA8JOXSCQO+D7YYAMAAAAAfvLceHsyNtgAAAAAgJ+8WCx6wPfBBhsAAAAAABewwQYAAAAA/OT5/YEDvg822AAAAACAnzyPx3PA98EGGwAAAADwk+f1Hvj22OO48VZpqKC4JKrs0IGfXgAAAAAAPxUlpTHt3lWctscPhwuVm1tnn67buHHdKr/ud3MglNm4Ycs+h0HtsT8/UKg96GYX7Wyim010s4t2NtHtp4tTxGuAG+fu4+Cjm010s4t2NtHNJrrZRTub6GYTr8GupYLBrHSPgBTQzSa62UU7m+hmE93sop1NdLPJjW5ssGsAz1jZRDeb6GYX7Wyim010s4t2NtHNJo5g11IlJel7YT5SRzeb6GYX7Wyim010s4t2NtHNJje6scEGAAAAAMAFvIt4DWjarBEf02VQdW+1j9qrpDSmcLgw3WMAAAAAkthg14jsUECDbpie7jGAjDfj4SEKhbLTPQZSRDub6GYT3eyinU10s8mNbpwiDsC0eDye7hGQItrZRDeb6GYX7Wyim01udGODDcC0RIL/A7OKdjbRzSa62UU7m+hmkxvd2GADMI1niO2inU10s4ludtHOJrrZxBFsAAAAAABqCTbYAEwLBILpHgEpop1NdLOJbnbRzia62eRGNzbYAAAAAAC4gA02ANM8Hk+6R0CKaGcT3Wyim120s4luNrnRjQ02ANMikdJ0j4AU0c4mutlEN7toZxPdbHKjGxtsAAAAAABcwAYbgGleL7/GrKKdTXSziW520c4mutnkRreMK//111+rXbt2evPNN9M9CoCDwO8PpHsEpIh2NtHNJrrZRTub6GaTG938LsxRq0ydOlV9+vTR5MmT1adPn3SPA6CG7f1M46effqSFC+fqiit+o127duidd97Q7t07deSR7XT66T3l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2bPfVMeOx6pLl26aP3+OiorC6RsWPNNoFN3sop1NdLOJbnbRzia62XRQjmBX5eSTT9acOXM0a9YsPfvssyopKVFpaanuuecede7cWc8++6xeeeUVeb1ederUSXfddZe++uor3X777YrFYsrKytJ9992nI444QvPnz9fjjz+uWCymQw89VHfffbfy8vLUq1cvDR48WAsXLlRxcbEeeOABHXPMMfr66681duxYxeNxnXzyyZo/f77efvttbdmyRbfffrs2bNggj8ejG264QaeddpqeeOIJffzxx1q/fr0uuuiiCuv44osvdNttt0mS2rdvf8DfzL1t2LBO9es3UKNGjXXooYfro4+WJC/bvn2bSktL1KpVa9WtW09z576tTZs26Igj2rg+BwAAAACg5u33BjsajWrWrFk68cQTNXnyZD311FNq2LChXnrpJT3zzDM64YQT9Ne//lULFiyQz+fTnXfeqY0bN+q5557TJZdcon79+un111/Xxx9/rHr16unhhx/W888/r/r162vy5MmaMGGC7r33XklSgwYN9NJLL+mFF17QX//6Vz3xxBMaO3asfvvb36pHjx76xz/+oXg8Lkm69957NWLECPXu3VubNm3ShRdeqGnTpkmSIpGIXn/9dUn/O0Vckm655Rb9/ve/12mnnaY///nPWrx48YF+P5PC4UKFw2F5vT5FIhH5fF5FIqUKhwsl/e8z1mKxqCKRUklScXGxIpGIHMdRLBaVJPn9AXk8Hnm9XpWWlkiSPB6PgsEseTyeCp/VFgplKx6PK5GIJ78vgUAweZs9j+P1euX3B+T1eivdPpFIKBaLKpFISJKCwazkMznRaERS2Qewe70++Xy+Srd3HEeRSGnyNllZISUSCRNr8ni8isfjGbWmTOy095pisZji8XhGrSkTO1W1plgsplgsllFrysROldcUUzhcmGFrysROFdfk8/mT/wbJlDVlYqeq1hQIBJLtMmVNmdhp7zUFAgFFIpGMWlMmdtp7TbFYTJFIZJ/W1LhxXVVlnzbYmzZt0pAhQySVbVY7deqkG264QX6/X3PmzNHq1au1ZMmS8gf264QTTtDIkSPVu3dvXXTRRWratKl69Oihu+66SwsWLFDPnj3Vp08fzZ8/X+vXr9eYMWMkSYlEQvXr108+bvfu3SVJRx11lN566y3t2LFD3333nXr06CFJGjFi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nHPO0aOPPprm6VCdiRMnasCAARowYIAefPBBSbSz4LHHHlP//v01YMAAPfvss5LoZskDDzygsWPHSpK+/PJLjRgxQn369NFtt92mWCyW5ulQlTFjxmjAgAEaMmSIhgwZok8++YR/pxgwZ84cDR8+XH379tU999wjid+Vtd2///3v5M/ZkCFDdNJJJ+muu+6imwHTp09P/pvygQcekOTS/8c5cMWGDRucnj17Otu3b3fC4bAzaNAgZ8WKFekeC9X4+OOPnYEDBzpHH320s3btWqe4uNjp0aOH8+233zrRaNT55S9/6cydOzfdY2IvixYtcs4//3yntLTUiUQizpgxY5wZM2bQrpZbvHixM2rUKCcajTrFxcVOz549nS+//JJuRrz33ntOly5dnFtuucVxHMcZMGCAs2zZMsdxHOf3v/+9M2nSpDROh6okEgmnW7duTjQaTX6Nf6fUft9++61z+umnO+vXr3cikYhzwQUXOHPnzuV3pSFff/21c/bZZzvr1q2jWy1XVFTkdO7c2dm6dasTjUadkSNHOosWLXLl/+M4gu2S9957T127dlWDBg2Uk5OjPn366I033kj3WKjGlClTdMcdd6hJkyaSpE8//VSHH364DjvsMPn9fg0aNIh+tVDjxo01duxYBYNBBQIBtWnTRvn5+bSr5U455RQ9//zz8vv92rp1q+LxuHbt2kU3A3bs2KFHH31UV111lSTpu+++U0lJiY4//nhJ0vDhw+lWC61atUoej0eXX365Bg8erP/7v//j3ykGvP322+rfv7+aNWumQCCgRx99VNnZ2fyuNGT8+PG6/vrrtXbtWrrVcvF4XIlEQsXFxYrFYorFYvL7/a78fxwbbJds2rRJjRs3Tv65SZMm2rhxYxonwg+59957dfLJJyf/TD8bjjrqqOQvvfz8fL3++uvyeDy0MyAQCOjxxx/XgAEDdOqpp/IzZ8Ttt9+u66+/XvXq1ZNU+Xdl48aN6VYL7dq1S6eeeqr+/Oc/6x//+IcmT56sdevW8TNXy61Zs0bxeFyXXnqpBg8erH/+85/8rjTkvffeU0lJifr160c3A+rUqaPf/va36tevn8444wy1bNlSgUDAlf+PY4PtEsdxKn3N4/GkYRKkgn62rFixQr/85S91yy23qFWrVpUup13t9Jvf/Ebvv/++1q9fr/z8/EqX0612+fe//63mzZvr1FNPTX6N35U2nHDCCXrwwQeVk5Ojhg0bauTIkXr88ccrXY92tUs8Htf777+vhx56SFOmTNFnn32WfJ+Y76Nb7TR58mRdcsklkvhdacFXX32ll19+We+++64WLlwor9erRYsWVbpeKt38bgwIqWnTpvrwww+Tf960aVPy9GPUfk2bNtWWLVuSf6Zf7fWf//xHv/nNb3TrrbdqwIABWrJkCe1quW+++UaRSEQdOnRQdna2zjnnHL3xxhvy+XzJ69Ct9nn99de1efNmDRkyRDt37lRRUZE8Hk+Fn7fNmzfTrRb68MMPFY1Gk0+OOI6jli1b8ruylmvUqJFOPfVUNWzYUJLUu3dvflcaEYlEtHTpUt1///2S+HelBQsXLtSpp56qQw45RFLZ6eDPPPOMK/8fxxFsl5x22ml6//33tW3bNhUXF+utt97SGWecke6xsI+OO+44rV69Onl61muvvUa/Wmj9+vX69a9/rQkTJmjAgAGSaGdBQUGBxo0bp0gkokgkotmzZ2vUqFF0q+WeffZZvfbaa5o+fbp+85vfqFevXrrvvvuUlZWl//znP5KkadOm0a0W2r17tx588EGVlpaqsLBQr7zyih566CH+nVLL9ezZUwsXLtSuXbsUj8e1YMEC9e3bl9+VBixfvlxHHHGEcnJyJPFvEwvat2+v9957T0VFRXIcR3PmzNEpp5ziyv/HcQTbJU2bNtX111+vMWPGKBqNauTIkerUqVO6x8I+ysrK0v33369rr71WpaWl6tGjh/r27ZvusbCXZ555RqWlpclniCVp1KhRtKvlevTooU8++URDhw6Vz+fTOeecowEDBqhhw4Z0M2jChAkaN26cwuGwOnbsqDFjxqR7JOylZ8+eyZ+5RCKhCy+8UCeddBL/TqnljjvuOF122WW68MILFY1G1a1bN11wwQX62c9+xu/KWm7t2rVq1qxZ8s/8u7L2O/300/XFF19o+PDhCgQCOvbYY3XFFVfo7LPPPuD/j/M4Vb1IAAAAAAAA7BdOEQcAAAAAwAVssAEAAAAAcAEbbAAAAAAAXMAGGwAAAAAAF7DBBgAAAADABWywAQAAAABwARtsAAAAAABcwAYbAAAAAAAX/D/+DtZxOJ4+1gAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[39m\n", "--------------- Count and Percentage of missing value ---------------\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", "
featuresmissing_countsmissing_percent
0PassengerId00.0
1Survived00.0
2Pclass00.0
3Name00.0
4Sex00.0
5Age17719.9
6SibSp00.0
7Parch00.0
8Ticket00.0
9Fare00.0
10Cabin68777.1
11Embarked20.2
\n", "
" ], "text/plain": [ " features missing_counts missing_percent\n", "0 PassengerId 0 0.0\n", "1 Survived 0 0.0\n", "2 Pclass 0 0.0\n", "3 Name 0 0.0\n", "4 Sex 0 0.0\n", "5 Age 177 19.9\n", "6 SibSp 0 0.0\n", "7 Parch 0 0.0\n", "8 Ticket 0 0.0\n", "9 Fare 0 0.0\n", "10 Cabin 687 77.1\n", "11 Embarked 2 0.2" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pp.check_nan(train,plot=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "slik-wrangler helps to handle the missing values in your data intelligently and efficiently. You can choose a strategy to handle your numerical features \n", "\n", "and pass a value for fillna params to handle your categorical features or fill it with the mode by default. \n", "\n", "You can also drop missing values across the rows and columns using threshold parameters." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Dropping rows with 75% missing value: Number of records dropped is 0\n", "\n", "Dropping Columns with 50% missing value: ['Cabin']\n", "\n", "New data shape is (891, 11)\n" ] } ], "source": [ "data = pp.handle_nan(dataframe=train,target_name='Survived',strategy='mean',fillna='mode',\n", " drop_outliers=True,thresh_x=75,thresh_y=50,display_inline=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Beyond slik-wrangler preprocessing abilities, you can also engineer new features intelligently. \n", "slik-wrangler can help you bin/discretize your age column intelligently and creating new data points with the transformations" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareEmbarkedbinned_Age
0103Braund, Mr. Owen Harrismale22.0000001.00.000000A/5 211717.250000SYoung Adult
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.0000001.00.000000PC 1759932.204208CMid-Age
2313Heikkinen, Miss. Lainafemale26.0000000.00.000000STON/O2. 31012827.925000SYoung Adult
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.0000001.00.00000011380353.100000SMid-Age
4503Allen, Mr. William Henrymale35.0000000.00.0000003734508.050000SMid-Age
.......................................
88688702Montvila, Rev. Juozasmale27.0000000.00.00000021153613.000000SYoung Adult
88788811Graham, Miss. Margaret Edithfemale19.0000000.00.00000011205330.000000SYoung Adult
88888903Johnston, Miss. Catherine Helen \"Carrie\"female29.0817371.00.381594W./C. 660723.450000SYoung Adult
88989011Behr, Mr. Karl Howellmale26.0000000.00.00000011136930.000000CYoung Adult
89089103Dooley, Mr. Patrickmale32.0000000.00.0000003703767.750000QMid-Age
\n", "

891 rows × 12 columns

\n", "
" ], "text/plain": [ " PassengerId Survived Pclass \\\n", "0 1 0 3 \n", "1 2 1 1 \n", "2 3 1 3 \n", "3 4 1 1 \n", "4 5 0 3 \n", ".. ... ... ... \n", "886 887 0 2 \n", "887 888 1 1 \n", "888 889 0 3 \n", "889 890 1 1 \n", "890 891 0 3 \n", "\n", " Name Sex Age \\\n", "0 Braund, Mr. Owen Harris male 22.000000 \n", "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.000000 \n", "2 Heikkinen, Miss. Laina female 26.000000 \n", "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.000000 \n", "4 Allen, Mr. William Henry male 35.000000 \n", ".. ... ... ... \n", "886 Montvila, Rev. Juozas male 27.000000 \n", "887 Graham, Miss. Margaret Edith female 19.000000 \n", "888 Johnston, Miss. Catherine Helen \"Carrie\" female 29.081737 \n", "889 Behr, Mr. Karl Howell male 26.000000 \n", "890 Dooley, Mr. Patrick male 32.000000 \n", "\n", " SibSp Parch Ticket Fare Embarked binned_Age \n", "0 1.0 0.000000 A/5 21171 7.250000 S Young Adult \n", "1 1.0 0.000000 PC 17599 32.204208 C Mid-Age \n", "2 0.0 0.000000 STON/O2. 3101282 7.925000 S Young Adult \n", "3 1.0 0.000000 113803 53.100000 S Mid-Age \n", "4 0.0 0.000000 373450 8.050000 S Mid-Age \n", ".. ... ... ... ... ... ... \n", "886 0.0 0.000000 211536 13.000000 S Young Adult \n", "887 0.0 0.000000 112053 30.000000 S Young Adult \n", "888 1.0 0.381594 W./C. 6607 23.450000 S Young Adult \n", "889 0.0 0.000000 111369 30.000000 C Young Adult \n", "890 0.0 0.000000 370376 7.750000 Q Mid-Age \n", "\n", "[891 rows x 12 columns]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pp.bin_age(data,'Age')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "with Slik you can infer the schema of your pandas dataframe and save the schema file in a project path you define" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[39m\n", "--------------- Creating Schema file ---------------\n", "\n" ] }, { "data": { "text/plain": [ "{'dtype': {'PassengerId': 'int64',\n", " 'Survived': 'int64',\n", " 'Pclass': 'int64',\n", " 'Name': 'object',\n", " 'Sex': 'object',\n", " 'Age': 'float64',\n", " 'SibSp': 'int64',\n", " 'Parch': 'int64',\n", " 'Ticket': 'object',\n", " 'Fare': 'float64',\n", " 'Cabin': 'object',\n", " 'Embarked': 'object'}}" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# import ,yaml\n", "pp.create_schema_file(train,target_column='Survived',id_column='PassengerId',save=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "with Slik you can also drop uninformative field in your pandas dataframe" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[39m\n", "--------------- Dropping uninformative fields ---------------\n", "\n", "uninformative fields dropped: []\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", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
.......................................
88688702Montvila, Rev. Juozasmale27.00021153613.0000NaNS
88788811Graham, Miss. Margaret Edithfemale19.00011205330.0000B42S
88888903Johnston, Miss. Catherine Helen \"Carrie\"femaleNaN12W./C. 660723.4500NaNS
88989011Behr, Mr. Karl Howellmale26.00011136930.0000C148C
89089103Dooley, Mr. Patrickmale32.0003703767.7500NaNQ
\n", "

891 rows × 12 columns

\n", "
" ], "text/plain": [ " PassengerId Survived Pclass \\\n", "0 1 0 3 \n", "1 2 1 1 \n", "2 3 1 3 \n", "3 4 1 1 \n", "4 5 0 3 \n", ".. ... ... ... \n", "886 887 0 2 \n", "887 888 1 1 \n", "888 889 0 3 \n", "889 890 1 1 \n", "890 891 0 3 \n", "\n", " Name Sex Age SibSp \\\n", "0 Braund, Mr. Owen Harris male 22.0 1 \n", "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", "2 Heikkinen, Miss. Laina female 26.0 0 \n", "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", "4 Allen, Mr. William Henry male 35.0 0 \n", ".. ... ... ... ... \n", "886 Montvila, Rev. Juozas male 27.0 0 \n", "887 Graham, Miss. Margaret Edith female 19.0 0 \n", "888 Johnston, Miss. Catherine Helen \"Carrie\" female NaN 1 \n", "889 Behr, Mr. Karl Howell male 26.0 0 \n", "890 Dooley, Mr. Patrick male 32.0 0 \n", "\n", " Parch Ticket Fare Cabin Embarked \n", "0 0 A/5 21171 7.2500 NaN S \n", "1 0 PC 17599 71.2833 C85 C \n", "2 0 STON/O2. 3101282 7.9250 NaN S \n", "3 0 113803 53.1000 C123 S \n", "4 0 373450 8.0500 NaN S \n", ".. ... ... ... ... ... \n", "886 0 211536 13.0000 NaN S \n", "887 0 112053 30.0000 B42 S \n", "888 2 W./C. 6607 23.4500 NaN S \n", "889 0 111369 30.0000 C148 C \n", "890 0 370376 7.7500 NaN Q \n", "\n", "[891 rows x 12 columns]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pp.drop_uninformative_fields(train,exclude='Parch')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Slik helps you manage your data points better by handling different management operations techniques on pandas dataframe based on columns. \n", "\n", "Operations include selecting of columns, dropping column and dropping duplicates. By selecting the list data points that you need to perform the transformation on and choosing the particular transformation you want " ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[39m\n", "--------------- Dropping duplicates across the columns ---------------\n", "\n", "New datashape is (891, 12)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", "
" ], "text/plain": [ " PassengerId Survived Pclass \\\n", "0 1 0 3 \n", "1 2 1 1 \n", "2 3 1 3 \n", "3 4 1 1 \n", "4 5 0 3 \n", "\n", " Name Sex Age SibSp \\\n", "0 Braund, Mr. Owen Harris male 22.0 1 \n", "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", "2 Heikkinen, Miss. Laina female 26.0 0 \n", "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", "4 Allen, Mr. William Henry male 35.0 0 \n", "\n", " Parch Ticket Fare Cabin Embarked \n", "0 0 A/5 21171 7.2500 NaN S \n", "1 0 PC 17599 71.2833 C85 C \n", "2 0 STON/O2. 3101282 7.9250 NaN S \n", "3 0 113803 53.1000 C123 S \n", "4 0 373450 8.0500 NaN S " ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pp.manage_columns(train,['PassengerId'],drop_duplicates='columns').head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Trim whitespaces from ends of each value across all data points in a pandas dataframe" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
.......................................
88688702Montvila, Rev. Juozasmale27.00021153613.0000NaNS
88788811Graham, Miss. Margaret Edithfemale19.00011205330.0000B42S
88888903Johnston, Miss. Catherine Helen \"Carrie\"femaleNaN12W./C. 660723.4500NaNS
88989011Behr, Mr. Karl Howellmale26.00011136930.0000C148C
89089103Dooley, Mr. Patrickmale32.0003703767.7500NaNQ
\n", "

891 rows × 12 columns

\n", "
" ], "text/plain": [ " PassengerId Survived Pclass \\\n", "0 1 0 3 \n", "1 2 1 1 \n", "2 3 1 3 \n", "3 4 1 1 \n", "4 5 0 3 \n", ".. ... ... ... \n", "886 887 0 2 \n", "887 888 1 1 \n", "888 889 0 3 \n", "889 890 1 1 \n", "890 891 0 3 \n", "\n", " Name Sex Age SibSp \\\n", "0 Braund, Mr. Owen Harris male 22.0 1 \n", "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", "2 Heikkinen, Miss. Laina female 26.0 0 \n", "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", "4 Allen, Mr. William Henry male 35.0 0 \n", ".. ... ... ... ... \n", "886 Montvila, Rev. Juozas male 27.0 0 \n", "887 Graham, Miss. Margaret Edith female 19.0 0 \n", "888 Johnston, Miss. Catherine Helen \"Carrie\" female NaN 1 \n", "889 Behr, Mr. Karl Howell male 26.0 0 \n", "890 Dooley, Mr. Patrick male 32.0 0 \n", "\n", " Parch Ticket Fare Cabin Embarked \n", "0 0 A/5 21171 7.2500 NaN S \n", "1 0 PC 17599 71.2833 C85 C \n", "2 0 STON/O2. 3101282 7.9250 NaN S \n", "3 0 113803 53.1000 C123 S \n", "4 0 373450 8.0500 NaN S \n", ".. ... ... ... ... ... \n", "886 0 211536 13.0000 NaN S \n", "887 0 112053 30.0000 B42 S \n", "888 2 W./C. 6607 23.4500 NaN S \n", "889 0 111369 30.0000 C148 C \n", "890 0 370376 7.7500 NaN Q \n", "\n", "[891 rows x 12 columns]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pp.trim_all_columns(train)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Slik can clean your data in one line of code. The `slik.preprocessing.preprocess` function cleans your data\n", "by removing outliers present in the data, handing missing values, featurizing datetime columns, and mapping relevant columns.\n", "The functions saves the preprocessed file in a project path that you specify." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "The task for preprocessing is classification\n", "\n", "Dropping rows with 75% missing value: Number of records dropped is 0\n", "\n", "Dropping Columns with 75% missing value: ['Cabin']\n", "\n", "New data shape is (891, 11)\n", "\u001b[39m\n", "--------------- Mapping target columns ---------------\n", "\n", "0 was mapped to 0\n", "\n", "1 was mapped to 1\n", "\n", "\u001b[39m\n", "--------------- Bucketize Age columns ---------------\n", "\n", " Inferred age column: [Age]\n", "\u001b[39m\n", "--------------- Mapping passed column ---------------\n", "\n", "male was mapped to 0\n", "\n", "female was mapped to 1\n", "\n", "\u001b[39m\n", "--------------- Dropping uninformative fields ---------------\n", "\n", "uninformative fields dropped: []\n", "\u001b[39m\n", "--------------- Creating Schema file ---------------\n", "\n" ] }, { "data": { "text/plain": [ "{'dtype': {'PassengerId': 'int64',\n", " 'Pclass': 'int64',\n", " 'Name': 'object',\n", " 'Age': 'float64',\n", " 'SibSp': 'float64',\n", " 'Parch': 'float64',\n", " 'Ticket': 'object',\n", " 'Fare': 'float64',\n", " 'Embarked': 'object',\n", " 'transformed_Survived': 'int64',\n", " 'binned_Age': 'object',\n", " 'transformed_Sex': 'int64'}}" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "Schema file stored in Titanic\\data\\metadata\n", "\u001b[39m\n", "--------------- Preview the preprocessed data ---------------\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", "
PassengerIdPclassNameAgeSibSpParchTicketFareEmbarkedtransformed_Survivedbinned_Agetransformed_Sex
013Braund, Mr. Owen Harris22.01.00.0A/5 211717.250000S0Young Adult0
121Cumings, Mrs. John Bradley (Florence Briggs Th...38.01.00.0PC 1759932.204208C1Mid-Age1
233Heikkinen, Miss. Laina26.00.00.0STON/O2. 31012827.925000S1Young Adult1
341Futrelle, Mrs. Jacques Heath (Lily May Peel)35.01.00.011380353.100000S1Mid-Age1
453Allen, Mr. William Henry35.00.00.03734508.050000S0Mid-Age0
\n", "
" ], "text/plain": [ " PassengerId Pclass Name \\\n", "0 1 3 Braund, Mr. Owen Harris \n", "1 2 1 Cumings, Mrs. John Bradley (Florence Briggs Th... \n", "2 3 3 Heikkinen, Miss. Laina \n", "3 4 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) \n", "4 5 3 Allen, Mr. William Henry \n", "\n", " Age SibSp Parch Ticket Fare Embarked \\\n", "0 22.0 1.0 0.0 A/5 21171 7.250000 S \n", "1 38.0 1.0 0.0 PC 17599 32.204208 C \n", "2 26.0 0.0 0.0 STON/O2. 3101282 7.925000 S \n", "3 35.0 1.0 0.0 113803 53.100000 S \n", "4 35.0 0.0 0.0 373450 8.050000 S \n", "\n", " transformed_Survived binned_Age transformed_Sex \n", "0 0 Young Adult 0 \n", "1 1 Mid-Age 1 \n", "2 1 Young Adult 1 \n", "3 1 Mid-Age 1 \n", "4 0 Mid-Age 0 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[39m\n", "--------------- Preprocessed data saved ---------------\n", "\n", "\n", " Input data preprocessed successfully and stored in ./Titanic\\data\\train_data.pkl\n", "\n" ] } ], "source": [ "pp.preprocess(data=train,target_column='Survived',train=True,display_inline=True,project_path='./Titanic',logging='display')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.8.8" } }, "nbformat": 4, "nbformat_minor": 4 }