Skip to content

Instantly share code, notes, and snippets.

@mikewlange
Created December 3, 2019 18:06
Show Gist options
  • Save mikewlange/1acf37f92de1e828c4113b9f6ab2e0d5 to your computer and use it in GitHub Desktop.
Save mikewlange/1acf37f92de1e828c4113b9f6ab2e0d5 to your computer and use it in GitHub Desktop.
CreditWorkup/Data/Foreclosure Notebook Demo.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "# Forcasting a Foreclosure\n\n### This is absolutly unabridged version of this notebook. \n#### The data munging rtakes up a lot of the space here. It's not that exciting, but allows you to kind of see how I work though an open ended project. \n\n- The goal of this project it so see if we can predict from this data https://www.fanniemae.com/portal/funding-the-market/data/loan-performance-data.html, the borrowers borrowers who are most at risk of defaulting on their mortgage loans. And build a model that's generic enough to work across similar datasets\n\n\n- The data comes in quarterly reports of Aquisitions and Performance on those aquisitions. For brevitys sake, and for a better model, we're going to ignore the performance data other than the foreclosure_date.\n\n\n- We're going to use 2 years of data. That's enough for a decent repesentation of a toy model. \n\n\n- The ppurpose here is two fold, one cen we make such a forcast and two, do I have the ability to write such a model. We'll find out! "
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# Install Requirements\n\n- Just a couple highlishts, the rest you're well aware of. \n- modin https://github.com/modin-project/modin This is a little chunk of code that wraps Pandas in either Dask ro Ray libraries for parallell processing. It's a great tool, and since I'm working with multiple gig's of data, it's nice to not have to batch or limit the size of my datafames. (within reason)\n\n- Interpret https://github.com/interpretml/interpret \n\n- Interpret-community https://github.com/interpretml/interpret-community\n\n- Postgres - this is running id Docker on my local machine. This is to mirror as best as I know the potential toolkit at my new job :) \nNOTE: I worked with both the magics %% and sqlalchemy/psycopg2 and found that psycopg2 is a little more fun. Let's get to work\n"
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:41:37.824028Z",
"end_time": "2019-12-03T17:41:40.156178Z"
},
"trusted": true
},
"cell_type": "code",
"source": "## Scikit goodies\nfrom sklearn.ensemble import RandomForestClassifier, RandomForestRegressor\nfrom sklearn.model_selection import train_test_split\n# sklearn preprocessing for dealing with categorical variables - we may do more but let's see.. \nfrom sklearn.preprocessing import LabelEncoder\n## psql stuff\nfrom sqlalchemy import create_engine\nimport psycopg2\n\n#IO\nimport io\n\n## fast pandas\nimport modin\n\n## Gotta plot\nimport matplotlib.pyplot as plt\n%matplotlib inline \n\n\n# import plotly.offline as py\n# py.init_notebook_mode(connected=True)\n# from plotly.offline import init_notebook_mode, iplot\n# init_notebook_mode(connected=True)\n# import plotly.graph_objs as go\n# import plotly.offline as offline\n# offline.init_notebook_mode()\n\n## Just all around fun\nfrom beakerx import * \n\n# File system manangement\nimport os\n\n#############################\n# os.environ[\"MODIN_ENGINE\"] = \"rey\" # Modin will use Ray - NEED TO DO PERFORMANCE TESTS ON BOTH\nos.environ[\"MODIN_ENGINE\"] = \"dask\" # Let's use Dask.NOTE run this only one per session. \n# If you have to run this code again, restart Kernal. \nimport modin.pandas as pd\n#############################\n\n## math\nimport numpy as np\n\n# featuretools for automated feature engineering\nimport featuretools as ft \n\n# Suppress warnings \nimport warnings\nwarnings.filterwarnings('ignore')\n\n# matplotlib and seaborn for plotting\nimport matplotlib.pyplot as plt\nimport seaborn as sns",
"execution_count": 1,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T17:18:47.866344Z",
"start_time": "2019-12-02T17:18:47.859722Z"
}
},
"cell_type": "markdown",
"source": "### Set up some constants for psql and data directories"
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:41:39.491Z",
"end_time": "2019-12-03T17:41:41.229752Z"
},
"trusted": true
},
"cell_type": "code",
"source": "DATA_DIR = \"Data\"\nhost='0.0.0.0:5432'\ndatabase='postgres'\nusername='postgres'",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### This is a simple function that returns a connection to the store\n\n- This notebook is running in docker and postgres is running in another. I didn't build them in their own network to mock a real word situation. Just an ssh tunnel.\n\n```It's worth nothing that over the weekend I found that Jupyter does not have a \"Open In Colab\" extension. So I build one. First it creates a Gist of your notbook then opens colab which pulls from that gist. It's very handy as when it comes time to tran the models, it's nice to have access to multipe GPU's or TPU's. After we do the exporitory analysis we'll moive to colab. And you can see how to reverse proxy to your loval machine running posgres.```\n\n- For this, only need the GPU. I have a NVIDIA 1080 but the ones on colab are faster and if you set up a couple you can distribure the workload with something like Kraken. I wanted to build all this out in a few days, but I needed some sleep. "
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:41:43.905199Z",
"end_time": "2019-12-03T17:41:43.907790Z"
},
"trusted": true
},
"cell_type": "code",
"source": "# // psql conn\ndef create_connection():\n engine = create_engine(\n \"postgresql+psycopg2://postgres:1234@0.0.0.0:5432/postgres\"\n )\n conn = engine.raw_connection()\n return conn",
"execution_count": 2,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:41:45.010162Z",
"end_time": "2019-12-03T17:41:45.058213Z"
},
"trusted": true
},
"cell_type": "code",
"source": "# test the sucker out\nconnection = create_connection()\ncursor = connection.cursor()\nprint(connection.get_dsn_parameters(), \"\\n\")\ncursor.execute(\"SELECT version();\")\nrecord = cursor.fetchone()\nprint(\"You are connected to - \", record, \"\\n\")\nconnection.close() # IMPORTANT always rember to kill your connections. This particular setup is a memory hog and wiith mulliple connections it's kills ys. ",
"execution_count": 3,
"outputs": [
{
"output_type": "stream",
"text": "{'user': 'postgres', 'dbname': 'postgres', 'host': '0.0.0.0', 'port': '5432', 'tty': '', 'options': '', 'sslmode': 'prefer', 'sslcompression': '0', 'krbsrvname': 'postgres', 'target_session_attrs': 'any'} \n\nYou are connected to - ('PostgreSQL 10.10 (Ubuntu 10.10-0ubuntu0.18.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0, 64-bit',) \n\n",
"name": "stdout"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# 1 - Prepare the Data\n\n-- For this expierement I'm simply mocing the 10 Gig's of txt files into postgres. "
},
{
"metadata": {},
"cell_type": "markdown",
"source": "- Set up the Column Headers\n\n- The txt files to not have them. "
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T18:44:48.236814Z",
"start_time": "2019-12-02T18:44:48.222276Z"
},
"code_folding": [
0,
1
],
"run_control": {
"marked": false
},
"trusted": true
},
"cell_type": "code",
"source": "# All the headers\nHEADERS = {\n \"Acquisition\": [\n \"id\",\n \"channel\",\n \"seller\",\n \"interest_rate\",\n \"balance\",\n \"loan_term\",\n \"origination_date\",\n \"first_payment_date\",\n \"ltv\",\n \"cltv\",\n \"borrower_count\",\n \"dti\",\n \"borrower_credit_score\",\n \"first_time_homebuyer\",\n \"loan_purpose\",\n \"property_type\",\n \"unit_count\",\n \"occupancy_status\",\n \"property_state\",\n \"zip\",\n \"insurance_percentage\",\n \"product_type\",\n \"co_borrower_credit_score\",\n \"mortgage_insurance_type\",\n \"relocation_mortgage_indicator\",\n ],\n \"Performance\": [\n \"id\",\n \"reporting_period\",\n \"servicer_name\",\n \"interest_rate\",\n \"balance\",\n \"loan_age\",\n \"months_to_maturity\",\n \"months_to_legal_maturity\",\n \"maturity_date\",\n \"msa\",\n \"delinquency_status\",\n \"modification_flag\",\n \"zero_balance_code\",\n \"zero_balance_date\",\n \"last_paid_installment_date\",\n \"foreclosure_date\",\n \"disposition_date\",\n \"foreclosure_costs\",\n \"property_repair_costs\",\n \"recovery_costs\",\n \"misc_costs\",\n \"tax_costs\",\n \"sale_proceeds\",\n \"credit_enhancement_proceeds\",\n \"repurchase_proceeds\",\n \"other_foreclosure_proceeds\",\n \"non_interest_bearing_balance\",\n \"principal_forgiveness_balance\",\n \"repurchase_make_whole_proceeds_flag\",\n \"foreclosure_principal_write_off_amount\",\n \"servicing_activity_indicator\",\n ],\n}\n\n## The Label or target of the forcast. \n## Well, kind of. The forcase is a binary option, \n# this just allows you to merge the sets properly so that you'll know which loand faled an dwhich did. \nSELECT = {\n \"Acquisition\": HEADERS[\"Acquisition\"],\n \"Performance\": [\"id\", \"foreclosure_date\"],\n}",
"execution_count": 6,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### the original mess of features\n- this was a pile of code befoere I started to put this notebook together. I split out the dates, built a performance_score and added a label performance_status. BUt that was cheating as it forcasting 100% accuacy. have to back out what the bank did not know.\n\n- That's one of the thinks about notebook stule coding. I love it. but if you're not really cafle in your procedure and orger of ops, it can be a mess. Then when you shift ideas to make the whole things readable, you back out a lot of code. BUt I'm leaving some in here. I don't want to lose you before we actually get to the fun stuff"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T19:56:02.887699Z",
"start_time": "2019-12-02T19:56:02.882577Z"
},
"code_folding": [
0
],
"run_control": {
"marked": false
},
"trusted": true
},
"cell_type": "code",
"source": "## this is the function that loops though the files in the Data dir \n## I should lnk the SO afticle I found on this. But I forgot as it's been afew days\n## and merges them into a single file. Without the parallell processing and out of Modin It won't shit the bed if you;re out of memory\n# def concat_data(prefix=\"Acquisition\"):\n# files = os.listdir(DATA_DIR)\n# full = []\n# for f in files:\n# if not f.startswith(prefix):\n# continue\n\n# data = pd.read_csv(\n# os.path.join(DATA_DIR, f),\n# sep=\"|\",\n# header=None,\n# names=HEADERS[prefix],\n# index_col=False,\n# )\n\n# data = data[SELECT[prefix]]\n# full.append(data)\n\n# full = pd.concat(full, axis=0)\n\n# full.to_csv(\n# os.path.join(OUT, \"{}.txt\".format(prefix)),\n# sep=\"|\",\n# header=SELECT[prefix],\n# index=False,\n# )\n## While were at at let's spit first payment date and origination date. do a little Pre-Feature engineering :)\n## The was part of a larger funtion that created a performance score based on how many months paied. \n## Not going to use it. as the bank would not have this data at time of origination. \n# df['first_payment_month'] = df['first_payment_date'].apply(lambda x: x.split('/')[1].strip()).astype(int)\n# df['first_payment_year'] = df['first_payment_date'].apply(lambda x: x.split('/')[0].strip()).astype(int)\n# df['origination_month'] = df['origination_date'].apply(lambda x: x.split('/')[1].strip()).astype(int)\n# df['origination_year'] = df['origination_date'].apply(lambda x: x.split('/')[0].strip()).astype(int)\n## After splitting I dopped forclosure_dates while writing a foreclosure_status (our Label)\n## I'm not running this now as there is a way easer way to do all this. BUt origially, this was nasty. ",
"execution_count": 15,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# concat_data(\"Acquisition\")",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# concat_data(\"Performance\")",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "- in retrospect I should have dumped them into possgre at this time instead of writing them to as SQC or MD5. And up untill I pull the training cvs out these are one shot runs. "
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "## And so it begins. duh, du da DUN dun d dun.. \n## These are the merged files after that process. \ndf_a = pd.read_csv('Acquisition.txt', sep='|', index_col=False)\ndf_p = pd.read_csv('Performance.txt', sep='|', index_col=False, low_memory=False)",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "## The Performace data have many supolicates as they reptedeach moth or even more. \n## Let's just keep the last one recorded so we get the date or not - \ndf_per.drop_duplicates(subset='id', keep='last', inplace=True)\ndf = pd.merge(df_a, df_p, on='id', how='inner')\n\n\ndf.to_csv(\"train.csv\") # our raw data as a checkpoint. this is where It should be written to postgres",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T20:22:12.508325Z",
"start_time": "2019-12-02T20:22:02.739774Z"
},
"trusted": true
},
"cell_type": "code",
"source": "## Examine the training set we just built and rename our label ro Label. \n## and for habbits sake make it the last column. \ndf_train = pd.read_csv('train.csv')\n## Becuase I always label the label, \"Label\"\ndf_train.rename(index=str, columns={\"foreclosure_status\": 'Label'}, inplace=True)",
"execution_count": 32,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T20:22:14.452010Z",
"start_time": "2019-12-02T20:22:14.431350Z"
},
"trusted": true
},
"cell_type": "code",
"source": "## We're just polling out the column and pushing it to the end. \n## I usually don't work with a DB, just the files directly so I ahve these hacky tricks. \n# befoer I forget, let me kill that performacnce score. it worked liek a charm. but irrelevent. \ndf_train.pop(\"performance_count\")\n\ncols = list(df_train.columns.values) \ncols.pop(cols.index(\"Label\")) \ndf_train = df_train[cols + [\"Label\"]]\n\n## and lets pop the performance count I referenced ealier. ",
"execution_count": 33,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T20:22:18.783824Z",
"start_time": "2019-12-02T20:22:17.570039Z"
},
"trusted": true
},
"cell_type": "code",
"source": "df_train.head(5) ## This is where we should write the new CSV, But doing ir below in logical groupings",
"execution_count": 34,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>id</th>\n <th>channel</th>\n <th>seller</th>\n <th>interest_rate</th>\n <th>balance</th>\n <th>loan_term</th>\n <th>ltv</th>\n <th>cltv</th>\n <th>borrower_count</th>\n <th>dti</th>\n <th>...</th>\n <th>insurance_percentage</th>\n <th>product_type</th>\n <th>co_borrower_credit_score</th>\n <th>mortgage_insurance_type</th>\n <th>relocation_mortgage_indicator</th>\n <th>first_payment_year</th>\n <th>first_payment_month</th>\n <th>origination_year</th>\n <th>origination_month</th>\n <th>Label</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>100000827160</td>\n <td>R</td>\n <td>OTHER</td>\n <td>4.250</td>\n <td>150000</td>\n <td>360</td>\n <td>49</td>\n <td>49</td>\n <td>2</td>\n <td>27.0</td>\n <td>...</td>\n <td>NaN</td>\n <td>FRM</td>\n <td>812.0</td>\n <td>NaN</td>\n <td>N</td>\n <td>2016</td>\n <td>5</td>\n <td>2016</td>\n <td>3</td>\n <td>False</td>\n </tr>\n <tr>\n <th>1</th>\n <td>100002112463</td>\n <td>R</td>\n <td>OTHER</td>\n <td>4.625</td>\n <td>250000</td>\n <td>360</td>\n <td>69</td>\n <td>69</td>\n <td>1</td>\n <td>46.0</td>\n <td>...</td>\n <td>NaN</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>N</td>\n <td>2016</td>\n <td>6</td>\n <td>2016</td>\n <td>4</td>\n <td>False</td>\n </tr>\n <tr>\n <th>2</th>\n <td>100007277669</td>\n <td>R</td>\n <td>OTHER</td>\n <td>3.625</td>\n <td>100000</td>\n <td>360</td>\n <td>95</td>\n <td>103</td>\n <td>1</td>\n <td>40.0</td>\n <td>...</td>\n <td>30.0</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>N</td>\n <td>2016</td>\n <td>6</td>\n <td>2016</td>\n <td>4</td>\n <td>False</td>\n </tr>\n <tr>\n <th>3</th>\n <td>100009404649</td>\n <td>R</td>\n <td>OTHER</td>\n <td>3.500</td>\n <td>149000</td>\n <td>360</td>\n <td>95</td>\n <td>95</td>\n <td>1</td>\n <td>32.0</td>\n <td>...</td>\n <td>30.0</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>N</td>\n <td>2016</td>\n <td>7</td>\n <td>2016</td>\n <td>5</td>\n <td>False</td>\n </tr>\n <tr>\n <th>4</th>\n <td>100013046181</td>\n <td>R</td>\n <td>OTHER</td>\n <td>4.250</td>\n <td>216000</td>\n <td>360</td>\n <td>80</td>\n <td>80</td>\n <td>1</td>\n <td>44.0</td>\n <td>...</td>\n <td>NaN</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>N</td>\n <td>2016</td>\n <td>6</td>\n <td>2016</td>\n <td>4</td>\n <td>False</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows x 28 columns</p>\n</div>",
"text/plain": " id channel seller interest_rate balance loan_term ltv cltv \\\n0 100000827160 R OTHER 4.250 150000 360 49 49 \n1 100002112463 R OTHER 4.625 250000 360 69 69 \n2 100007277669 R OTHER 3.625 100000 360 95 103 \n3 100009404649 R OTHER 3.500 149000 360 95 95 \n4 100013046181 R OTHER 4.250 216000 360 80 80 \n\n borrower_count dti ... insurance_percentage product_type \\\n0 2 27.0 ... NaN FRM \n1 1 46.0 ... NaN FRM \n2 1 40.0 ... 30.0 FRM \n3 1 32.0 ... 30.0 FRM \n4 1 44.0 ... NaN FRM \n\n co_borrower_credit_score mortgage_insurance_type \\\n0 812.0 NaN \n1 NaN NaN \n2 NaN 1.0 \n3 NaN 1.0 \n4 NaN NaN \n\n relocation_mortgage_indicator first_payment_year first_payment_month \\\n0 N 2016 5 \n1 N 2016 6 \n2 N 2016 6 \n3 N 2016 7 \n4 N 2016 6 \n\n origination_year origination_month Label \n0 2016 3 False \n1 2016 4 False \n2 2016 4 False \n3 2016 5 False \n4 2016 4 False \n\n[5 rows x 28 columns]"
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# 2 Dump into Postgres - Take 2\n- you're actually seeing this in reverse. While building this out, I wrote tables for both Performance and Aquisition. Bun since I already merged it ont train.csv I'll just wrote a single table\n"
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:41:53.584249Z",
"end_time": "2019-12-03T17:41:53.587907Z"
},
"trusted": true
},
"cell_type": "code",
"source": "import io # when you're workign with Dask something you have to redo this\n## As you can see I'm being lazy and not using my \ndef create_table(df, table_name):\n engine = create_engine( \"postgresql+psycopg2://postgres:1234@0.0.0.0:5432/postgres\")\n df.head(0).to_sql(table_name, engine, if_exists=\"replace\", index=False)\n\n## https://stackoverflow.com/questions/23103962/how-to-write-dataframe-to-postgres-table ANSWER #2. \n## It looks funny, but it's way faster than answer one.\n## And its almost right. BUt nope. Time waster. Leaving it hear for posterity\n## A simple df_train.to_sql(\"fo_data\", con) took tem min lol\n# def insert_data(df, table_nme):\n# conn = create_connection()\n# cur = conn.cursor()\n# output = io.StringIO()\n# df.to_csv(output, sep=\"\\t\", header=False, index=False)\n# output.seek(0)\n# contents = output.getvalue()\n# cur.copy_from(output, table_nme, null=\"\") \n# conn.commit()",
"execution_count": 4,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T20:39:53.326521Z",
"start_time": "2019-12-02T20:39:53.140593Z"
},
"trusted": true
},
"cell_type": "code",
"source": "## Create our two tables\ncreate_table(df_train,\"fork_data\")",
"execution_count": 45,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T20:39:53.751155Z",
"start_time": "2019-12-02T20:39:53.703826Z"
},
"trusted": true
},
"cell_type": "code",
"source": "## Verify\npd.read_sql_query(\"\"\"SELECT * FROM fork_data LIMIT 5;\"\"\", create_connection())",
"execution_count": 46,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>id</th>\n <th>channel</th>\n <th>seller</th>\n <th>interest_rate</th>\n <th>balance</th>\n <th>loan_term</th>\n <th>ltv</th>\n <th>cltv</th>\n <th>borrower_count</th>\n <th>dti</th>\n <th>...</th>\n <th>insurance_percentage</th>\n <th>product_type</th>\n <th>co_borrower_credit_score</th>\n <th>mortgage_insurance_type</th>\n <th>relocation_mortgage_indicator</th>\n <th>first_payment_year</th>\n <th>first_payment_month</th>\n <th>origination_year</th>\n <th>origination_month</th>\n <th>Label</th>\n </tr>\n </thead>\n <tbody>\n </tbody>\n</table>\n<p>0 rows × 28 columns</p>\n</div>",
"text/plain": "Empty DataFrame\nColumns: [id, channel, seller, interest_rate, balance, loan_term, ltv, cltv, borrower_count, dti, borrower_credit_score, first_time_homebuyer, loan_purpose, property_type, unit_count, occupancy_status, property_state, zip, insurance_percentage, product_type, co_borrower_credit_score, mortgage_insurance_type, relocation_mortgage_indicator, first_payment_year, first_payment_month, origination_year, origination_month, Label]\nIndex: []\n\n[0 rows x 28 columns]"
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T20:39:57.906035Z",
"start_time": "2019-12-02T20:39:57.895336Z"
},
"trusted": true
},
"cell_type": "code",
"source": "df_train.shape",
"execution_count": 47,
"outputs": [
{
"data": {
"text/plain": "(4094777, 28)"
},
"execution_count": 47,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "- so where healing with ~4 million records at the end. \n- The level of unbalance will be staggering. The radio of forclosed to non. But we'll see in a second and what we can dfo about it. . Z"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## This Insert Fails - But Leaving for reference ------------"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T20:51:56.222592Z",
"start_time": "2019-12-02T20:40:02.363759Z"
},
"trusted": true
},
"cell_type": "code",
"source": "%%timeit\ninsert_data(df_train,\"fork_data\")",
"execution_count": 48,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": "1min 23s ± 5.67 s per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### Verify then let's get on with EDA!\n "
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T22:07:17.823033Z",
"start_time": "2019-12-02T22:07:17.443798Z"
},
"trusted": true
},
"cell_type": "code",
"source": "## Verify\npd.read_sql_query(\"\"\"SELECT COUNT(*) FROM fork_data;\"\"\", create_connection())",
"execution_count": 15,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>count</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " count\n0 0"
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "## So now we have 32 Million Records? Hmmm. Let's figure this out. ",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T21:15:42.945894Z",
"start_time": "2019-12-02T21:15:39.479630Z"
},
"trusted": true
},
"cell_type": "code",
"source": "df_train = pd.read_csv('train.csv') # our table\ndf_train.shape",
"execution_count": 8,
"outputs": [
{
"data": {
"text/plain": "(4094777, 29)"
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T00:10:20.661401Z",
"start_time": "2019-12-03T00:05:39.941Z"
},
"trusted": true
},
"cell_type": "code",
"source": "## Let's Clear that table and rewrite the insert. Just do it the slow and consistant way. \n## Something was funny about that so code eanyway. If you want something done right you have to do it youself.",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T21:19:45.512479Z",
"start_time": "2019-12-02T21:19:45.504974Z"
},
"trusted": true
},
"cell_type": "code",
"source": "7*4094777",
"execution_count": 9,
"outputs": [
{
"data": {
"text/plain": "28663439"
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "While that's not quite 32758216 it's close enough to know that there should not have been 7 runs as stated. Maybe %%time is for benchmarking. And not for reality. Give me a sec. Need google.. "
},
{
"metadata": {},
"cell_type": "markdown",
"source": "so the magic funtion is not magic. If you want ot time something get an alarm clock. Or import time"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T21:29:52.312057Z",
"start_time": "2019-12-02T21:29:48.328458Z"
},
"trusted": true
},
"cell_type": "code",
"source": "df_train = pd.read_csv('train.csv')\ncreate_table(df_train,\"fork_data\")",
"execution_count": 4,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T23:10:53.142471Z",
"start_time": "2019-12-02T23:10:51.646601Z"
},
"trusted": true
},
"cell_type": "code",
"source": "## Verify\npd.read_sql_query(\"\"\"SELECT COUNT(*) FROM fork_data;\"\"\", create_connection())\n# pd.read_sql_query(\"\"\"SELECT * FROM fo_data LIMIT 5;\"\"\", create_connection())",
"execution_count": 20,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>count</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>4094777</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " count\n0 4094777"
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## END FAIL ------------|"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# 2 Dump into Postgres - Take 1\n\n- Lets organise our code a little better. \n"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T23:42:43.663497Z",
"start_time": "2019-12-02T23:42:43.637340Z"
},
"trusted": true
},
"cell_type": "code",
"source": "def print_tables():\n#investigate the DB\n import sqlalchemy # Package for accessing SQL databases via Python\n\n # Connect to database (Note: The package psychopg2 is required for Postgres to work with SQLAlchemy)\n engine = sqlalchemy.create_engine(\"postgresql+psycopg2://postgres:1234@0.0.0.0:5432/postgres\")\n con = engine.connect()\n\n # Verify that there are no existing tables\n print(engine.table_names())\n\n",
"execution_count": 12,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": "['acc', 'fork_data', 'acquisition', 'performance', 'per', 'f_data', 'fo_data']\n"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Minor Cleaning.\n- dropping the performance_count \n- Changeing the label name to Label\n- write a new CSV to be used for DB insert\n"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T00:18:06.990209Z",
"start_time": "2019-12-03T00:18:06.980573Z"
},
"trusted": true
},
"cell_type": "code",
"source": "## This is why we write funtions and not a bunch of procedural code\ndef prep_data():\n df_train = pdx.read_csv('train.csv') ## Grabit\n df_train.rename(index=str, columns={\"foreclosure_status\": 'Label'}, inplace=True) ## Rename it\n df_train.pop(\"performance_count\") #Pop it\n cols = list(df_train.columns.values) # List em\n cols.pop(cols.index(\"Label\")) # Pop it\n df_train = df_train[cols + [\"Label\"]] # put it\n # Write it to the trainfile and rename it as the two files are merged noww\n df_train.to_csv(\"train_merged.csv\") #and kaboot it",
"execution_count": 34,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T00:19:17.581270Z",
"start_time": "2019-12-03T00:18:07.952199Z"
},
"trusted": true
},
"cell_type": "code",
"source": "prep_data() # Run the data prep",
"execution_count": 35,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Sanity check before insert"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T00:20:11.806413Z",
"start_time": "2019-12-03T00:20:03.580472Z"
},
"collapsed": true,
"jupyter": {
"outputs_hidden": true
},
"trusted": true
},
"cell_type": "code",
"source": "df_train_m = pdx.read_csv('train_merged.csv')\ndf_train_m",
"execution_count": 36,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>id</th>\n <th>channel</th>\n <th>seller</th>\n <th>interest_rate</th>\n <th>balance</th>\n <th>loan_term</th>\n <th>ltv</th>\n <th>cltv</th>\n <th>borrower_count</th>\n <th>...</th>\n <th>insurance_percentage</th>\n <th>product_type</th>\n <th>co_borrower_credit_score</th>\n <th>mortgage_insurance_type</th>\n <th>relocation_mortgage_indicator</th>\n <th>first_payment_year</th>\n <th>first_payment_month</th>\n <th>origination_year</th>\n <th>origination_month</th>\n <th>Label</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>100000827160</td>\n <td>R</td>\n <td>OTHER</td>\n <td>4.250</td>\n <td>150000</td>\n <td>360</td>\n <td>49</td>\n <td>49</td>\n <td>2</td>\n <td>...</td>\n <td>NaN</td>\n <td>FRM</td>\n <td>812.0</td>\n <td>NaN</td>\n <td>N</td>\n <td>2016</td>\n <td>5</td>\n <td>2016</td>\n <td>3</td>\n <td>False</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>100002112463</td>\n <td>R</td>\n <td>OTHER</td>\n <td>4.625</td>\n <td>250000</td>\n <td>360</td>\n <td>69</td>\n <td>69</td>\n <td>1</td>\n <td>...</td>\n <td>NaN</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>N</td>\n <td>2016</td>\n <td>6</td>\n <td>2016</td>\n <td>4</td>\n <td>False</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>100007277669</td>\n <td>R</td>\n <td>OTHER</td>\n <td>3.625</td>\n <td>100000</td>\n <td>360</td>\n <td>95</td>\n <td>103</td>\n <td>1</td>\n <td>...</td>\n <td>30.0</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>N</td>\n <td>2016</td>\n <td>6</td>\n <td>2016</td>\n <td>4</td>\n <td>False</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>100009404649</td>\n <td>R</td>\n <td>OTHER</td>\n <td>3.500</td>\n <td>149000</td>\n <td>360</td>\n <td>95</td>\n <td>95</td>\n <td>1</td>\n <td>...</td>\n <td>30.0</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>N</td>\n <td>2016</td>\n <td>7</td>\n <td>2016</td>\n <td>5</td>\n <td>False</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>100013046181</td>\n <td>R</td>\n <td>OTHER</td>\n <td>4.250</td>\n <td>216000</td>\n <td>360</td>\n <td>80</td>\n <td>80</td>\n <td>1</td>\n <td>...</td>\n <td>NaN</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>N</td>\n <td>2016</td>\n <td>6</td>\n <td>2016</td>\n <td>4</td>\n <td>False</td>\n </tr>\n <tr>\n <th>...</th>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n </tr>\n <tr>\n <th>4094772</th>\n <td>4094772</td>\n <td>999983030127</td>\n <td>C</td>\n <td>FRANKLIN AMERICAN MORTGAGE COMPANY</td>\n <td>4.125</td>\n <td>150000</td>\n <td>180</td>\n <td>73</td>\n <td>73</td>\n <td>2</td>\n <td>...</td>\n <td>NaN</td>\n <td>FRM</td>\n <td>713.0</td>\n <td>NaN</td>\n <td>N</td>\n <td>2017</td>\n <td>5</td>\n <td>2017</td>\n <td>3</td>\n <td>False</td>\n </tr>\n <tr>\n <th>4094773</th>\n <td>4094773</td>\n <td>999983903351</td>\n <td>C</td>\n <td>WELLS FARGO BANK, N.A.</td>\n <td>3.875</td>\n <td>236000</td>\n <td>360</td>\n <td>80</td>\n <td>80</td>\n <td>2</td>\n <td>...</td>\n <td>NaN</td>\n <td>FRM</td>\n <td>799.0</td>\n <td>NaN</td>\n <td>N</td>\n <td>2017</td>\n <td>6</td>\n <td>2017</td>\n <td>4</td>\n <td>False</td>\n </tr>\n <tr>\n <th>4094774</th>\n <td>4094774</td>\n <td>999988990744</td>\n <td>R</td>\n <td>OTHER</td>\n <td>4.375</td>\n <td>423000</td>\n <td>360</td>\n <td>90</td>\n <td>90</td>\n <td>1</td>\n <td>...</td>\n <td>25.0</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>N</td>\n <td>2017</td>\n <td>6</td>\n <td>2017</td>\n <td>4</td>\n <td>False</td>\n </tr>\n <tr>\n <th>4094775</th>\n <td>4094775</td>\n <td>999994624882</td>\n <td>C</td>\n <td>NATIONSTAR MORTGAGE, LLC</td>\n <td>4.125</td>\n <td>420000</td>\n <td>360</td>\n <td>71</td>\n <td>71</td>\n <td>2</td>\n <td>...</td>\n <td>NaN</td>\n <td>FRM</td>\n <td>805.0</td>\n <td>NaN</td>\n <td>N</td>\n <td>2017</td>\n <td>6</td>\n <td>2017</td>\n <td>4</td>\n <td>False</td>\n </tr>\n <tr>\n <th>4094776</th>\n <td>4094776</td>\n <td>999995989414</td>\n <td>C</td>\n <td>OTHER</td>\n <td>4.125</td>\n <td>333000</td>\n <td>360</td>\n <td>95</td>\n <td>95</td>\n <td>2</td>\n <td>...</td>\n <td>30.0</td>\n <td>FRM</td>\n <td>683.0</td>\n <td>1.0</td>\n <td>N</td>\n <td>2017</td>\n <td>8</td>\n <td>2017</td>\n <td>6</td>\n <td>False</td>\n </tr>\n </tbody>\n</table>\n<p>4094777 rows × 29 columns</p>\n</div>",
"text/plain": " Unnamed: 0 id channel seller \\\n0 0 100000827160 R OTHER \n1 1 100002112463 R OTHER \n2 2 100007277669 R OTHER \n3 3 100009404649 R OTHER \n4 4 100013046181 R OTHER \n... ... ... ... ... \n4094772 4094772 999983030127 C FRANKLIN AMERICAN MORTGAGE COMPANY \n4094773 4094773 999983903351 C WELLS FARGO BANK, N.A. \n4094774 4094774 999988990744 R OTHER \n4094775 4094775 999994624882 C NATIONSTAR MORTGAGE, LLC \n4094776 4094776 999995989414 C OTHER \n\n interest_rate balance loan_term ltv cltv borrower_count ... \\\n0 4.250 150000 360 49 49 2 ... \n1 4.625 250000 360 69 69 1 ... \n2 3.625 100000 360 95 103 1 ... \n3 3.500 149000 360 95 95 1 ... \n4 4.250 216000 360 80 80 1 ... \n... ... ... ... ... ... ... ... \n4094772 4.125 150000 180 73 73 2 ... \n4094773 3.875 236000 360 80 80 2 ... \n4094774 4.375 423000 360 90 90 1 ... \n4094775 4.125 420000 360 71 71 2 ... \n4094776 4.125 333000 360 95 95 2 ... \n\n insurance_percentage product_type co_borrower_credit_score \\\n0 NaN FRM 812.0 \n1 NaN FRM NaN \n2 30.0 FRM NaN \n3 30.0 FRM NaN \n4 NaN FRM NaN \n... ... ... ... \n4094772 NaN FRM 713.0 \n4094773 NaN FRM 799.0 \n4094774 25.0 FRM NaN \n4094775 NaN FRM 805.0 \n4094776 30.0 FRM 683.0 \n\n mortgage_insurance_type relocation_mortgage_indicator \\\n0 NaN N \n1 NaN N \n2 1.0 N \n3 1.0 N \n4 NaN N \n... ... ... \n4094772 NaN N \n4094773 NaN N \n4094774 1.0 N \n4094775 NaN N \n4094776 1.0 N \n\n first_payment_year first_payment_month origination_year \\\n0 2016 5 2016 \n1 2016 6 2016 \n2 2016 6 2016 \n3 2016 7 2016 \n4 2016 6 2016 \n... ... ... ... \n4094772 2017 5 2017 \n4094773 2017 6 2017 \n4094774 2017 6 2017 \n4094775 2017 6 2017 \n4094776 2017 8 2017 \n\n origination_month Label \n0 3 False \n1 4 False \n2 4 False \n3 5 False \n4 4 False \n... ... ... \n4094772 3 False \n4094773 4 False \n4094774 4 False \n4094775 4 False \n4094776 6 False \n\n[4094777 rows x 29 columns]"
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Double sanity check"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T00:21:47.298143Z",
"start_time": "2019-12-03T00:21:47.144762Z"
},
"trusted": true
},
"cell_type": "code",
"source": "create_table(df_train_m,\"fork_data\")",
"execution_count": 37,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T00:21:48.266919Z",
"start_time": "2019-12-03T00:21:48.225960Z"
},
"trusted": true
},
"cell_type": "code",
"source": "pd.read_sql_query(\"\"\"SELECT * FROM fork_data;\"\"\", create_connection())",
"execution_count": 38,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Unnamed: 0</th>\n <th>id</th>\n <th>channel</th>\n <th>seller</th>\n <th>interest_rate</th>\n <th>balance</th>\n <th>loan_term</th>\n <th>ltv</th>\n <th>cltv</th>\n <th>borrower_count</th>\n <th>...</th>\n <th>insurance_percentage</th>\n <th>product_type</th>\n <th>co_borrower_credit_score</th>\n <th>mortgage_insurance_type</th>\n <th>relocation_mortgage_indicator</th>\n <th>first_payment_year</th>\n <th>first_payment_month</th>\n <th>origination_year</th>\n <th>origination_month</th>\n <th>Label</th>\n </tr>\n </thead>\n <tbody>\n </tbody>\n</table>\n<p>0 rows × 29 columns</p>\n</div>",
"text/plain": "Empty DataFrame\nColumns: [Unnamed: 0, id, channel, seller, interest_rate, balance, loan_term, ltv, cltv, borrower_count, dti, borrower_credit_score, first_time_homebuyer, loan_purpose, property_type, unit_count, occupancy_status, property_state, zip, insurance_percentage, product_type, co_borrower_credit_score, mortgage_insurance_type, relocation_mortgage_indicator, first_payment_year, first_payment_month, origination_year, origination_month, Label]\nIndex: []\n\n[0 rows x 29 columns]"
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Fresh DB Insert From New csv. "
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T00:22:47.188336Z",
"start_time": "2019-12-03T00:22:47.177969Z"
},
"trusted": true
},
"cell_type": "code",
"source": "## Can't work with modin on db insert queries. No biggie. Or we can't reinitialize it. Will need to do more reaserch\nimport pandas as pdx\ndef do_clean_insert():\n df_train = pdx.read_csv('train_merged.csv')\n create_table(df_train,\"fork_data\")\n engine = sqlalchemy.create_engine(\"postgresql+psycopg2://postgres:1234@0.0.0.0:5432/postgres\")\n con = engine.connect()\n df_train.to_sql(\"fork_data\", con,if_exists=\"replace\")",
"execution_count": 39,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T00:37:42.177895Z",
"start_time": "2019-12-03T00:22:47.900862Z"
},
"trusted": true
},
"cell_type": "code",
"source": "do_clean_insert()",
"execution_count": 40,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Test for structural consistency"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T00:37:52.016533Z",
"start_time": "2019-12-03T00:37:51.921653Z"
},
"trusted": true
},
"cell_type": "code",
"source": "pdx.read_sql_query(\"\"\"SELECT * FROM fork_data LIMIT 5;\"\"\", create_connection())",
"execution_count": 41,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>index</th>\n <th>Unnamed: 0</th>\n <th>id</th>\n <th>channel</th>\n <th>seller</th>\n <th>interest_rate</th>\n <th>balance</th>\n <th>loan_term</th>\n <th>ltv</th>\n <th>cltv</th>\n <th>...</th>\n <th>insurance_percentage</th>\n <th>product_type</th>\n <th>co_borrower_credit_score</th>\n <th>mortgage_insurance_type</th>\n <th>relocation_mortgage_indicator</th>\n <th>first_payment_year</th>\n <th>first_payment_month</th>\n <th>origination_year</th>\n <th>origination_month</th>\n <th>Label</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>0</td>\n <td>0</td>\n <td>100000827160</td>\n <td>R</td>\n <td>OTHER</td>\n <td>4.250</td>\n <td>150000</td>\n <td>360</td>\n <td>49</td>\n <td>49</td>\n <td>...</td>\n <td>NaN</td>\n <td>FRM</td>\n <td>812.0</td>\n <td>NaN</td>\n <td>N</td>\n <td>2016</td>\n <td>5</td>\n <td>2016</td>\n <td>3</td>\n <td>False</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>1</td>\n <td>100002112463</td>\n <td>R</td>\n <td>OTHER</td>\n <td>4.625</td>\n <td>250000</td>\n <td>360</td>\n <td>69</td>\n <td>69</td>\n <td>...</td>\n <td>NaN</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>N</td>\n <td>2016</td>\n <td>6</td>\n <td>2016</td>\n <td>4</td>\n <td>False</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>2</td>\n <td>100007277669</td>\n <td>R</td>\n <td>OTHER</td>\n <td>3.625</td>\n <td>100000</td>\n <td>360</td>\n <td>95</td>\n <td>103</td>\n <td>...</td>\n <td>30.0</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>N</td>\n <td>2016</td>\n <td>6</td>\n <td>2016</td>\n <td>4</td>\n <td>False</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>3</td>\n <td>100009404649</td>\n <td>R</td>\n <td>OTHER</td>\n <td>3.500</td>\n <td>149000</td>\n <td>360</td>\n <td>95</td>\n <td>95</td>\n <td>...</td>\n <td>30.0</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>1.0</td>\n <td>N</td>\n <td>2016</td>\n <td>7</td>\n <td>2016</td>\n <td>5</td>\n <td>False</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>4</td>\n <td>100013046181</td>\n <td>R</td>\n <td>OTHER</td>\n <td>4.250</td>\n <td>216000</td>\n <td>360</td>\n <td>80</td>\n <td>80</td>\n <td>...</td>\n <td>NaN</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>N</td>\n <td>2016</td>\n <td>6</td>\n <td>2016</td>\n <td>4</td>\n <td>False</td>\n </tr>\n </tbody>\n</table>\n<p>5 rows × 30 columns</p>\n</div>",
"text/plain": " index Unnamed: 0 id channel seller interest_rate balance \\\n0 0 0 100000827160 R OTHER 4.250 150000 \n1 1 1 100002112463 R OTHER 4.625 250000 \n2 2 2 100007277669 R OTHER 3.625 100000 \n3 3 3 100009404649 R OTHER 3.500 149000 \n4 4 4 100013046181 R OTHER 4.250 216000 \n\n loan_term ltv cltv ... insurance_percentage product_type \\\n0 360 49 49 ... NaN FRM \n1 360 69 69 ... NaN FRM \n2 360 95 103 ... 30.0 FRM \n3 360 95 95 ... 30.0 FRM \n4 360 80 80 ... NaN FRM \n\n co_borrower_credit_score mortgage_insurance_type \\\n0 812.0 NaN \n1 NaN NaN \n2 NaN 1.0 \n3 NaN 1.0 \n4 NaN NaN \n\n relocation_mortgage_indicator first_payment_year first_payment_month \\\n0 N 2016 5 \n1 N 2016 6 \n2 N 2016 6 \n3 N 2016 7 \n4 N 2016 6 \n\n origination_year origination_month Label \n0 2016 3 False \n1 2016 4 False \n2 2016 4 False \n3 2016 5 False \n4 2016 4 False \n\n[5 rows x 30 columns]"
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T00:39:40.032255Z",
"start_time": "2019-12-03T00:39:40.025629Z"
},
"trusted": true
},
"cell_type": "code",
"source": "## We have to remomber to Nno Index on the insert. We'll take care of it during cleaning",
"execution_count": 42,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### Create a DataFrame from out Table "
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T06:54:31.657Z"
},
"trusted": true
},
"cell_type": "code",
"source": "df_train = pd.read_sql_query(\"\"\"SELECT * FROM fork_data;\"\"\", create_connection())",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Now we can verify then let's get on with EDA!\n \n- Imputing, \n- Feature selection\n- One Hot Encoding (my favorite ds word - I actually made a t-short tthat says \"One Hot Encoder\" none gets it. \n"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### Make the Label Binary"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T04:54:20.431976Z",
"start_time": "2019-12-03T04:54:08.046186Z"
},
"trusted": true
},
"cell_type": "code",
"source": "df_train[[\"Label\"]] *= 1",
"execution_count": 19,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Some Exporations\n- It's always good to check ouit the Label and their distribution among other features. "
},
{
"metadata": {},
"cell_type": "markdown",
"source": "The Must Do's \n- What's missing, \n- what are the datatypes\n- and big picture.\nthis makes it easier as we move along. "
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T08:25:28.745194Z",
"start_time": "2019-12-03T08:25:28.615822Z"
},
"trusted": true
},
"cell_type": "code",
"source": "#Searching for missing data,type of data and the shape\nprint(df_train.info())",
"execution_count": 41,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": "<class 'pandas.core.frame.DataFrame'>\nRangeIndex: 4094777 entries, 0 to 4094776\nData columns (total 26 columns):\nid int64\nchannel category\nseller category\ninterest_rate int64\nbalance int64\nloan_term int64\nltv int64\ncltv int64\nborrower_count int64\ndti float64\nborrower_credit_score float64\nfirst_time_homebuyer category\nloan_purpose category\nproperty_type category\nunit_count int64\noccupancy_status category\nproperty_state category\nzip int64\nproduct_type category\nco_borrower_credit_score float64\nrelocation_mortgage_indicator object\nfirst_payment_year int64\nfirst_payment_month int64\norigination_year int64\norigination_month int64\nLabel int64\ndtypes: category(8), float64(3), int64(14), object(1)\nmemory usage: 593.6+ MB\nNone\n"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## This tell us a lot. \n- 9 Items are lily to be categorical. We'll transform theose when we get there. I call these \"Qualatative\" feature\n- 19 are numbers. Are what I call Quantatative. \n- BUt don't be fooled. A Zip code is not a quantity. :)"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T03:58:27.259443Z",
"start_time": "2019-12-03T03:58:10.657759Z"
},
"trusted": true
},
"cell_type": "code",
"source": "\n#Looking unique values\nprint(df_train.nunique())\n#Looking the data\nprint(df_train.head())",
"execution_count": 14,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": "id 4094777\nchannel 3\nseller 28\ninterest_rate 2518\nbalance 1021\nloan_term 261\nltv 96\ncltv 112\nborrower_count 6\ndti 57\nborrower_credit_score 223\nfirst_time_homebuyer 3\nloan_purpose 3\nproperty_type 5\nunit_count 4\noccupancy_status 3\nproperty_state 54\nzip 911\ninsurance_percentage 36\nproduct_type 1\nco_borrower_credit_score 219\nmortgage_insurance_type 2\nrelocation_mortgage_indicator 2\nfirst_payment_year 6\nfirst_payment_month 12\norigination_year 5\norigination_month 12\nLabel 2\ndtype: int64\n id channel seller interest_rate balance loan_term ltv cltv \\\n0 100000827160 R OTHER 4.250 150000 360 49 49 \n1 100002112463 R OTHER 4.625 250000 360 69 69 \n2 100007277669 R OTHER 3.625 100000 360 95 103 \n3 100009404649 R OTHER 3.500 149000 360 95 95 \n4 100013046181 R OTHER 4.250 216000 360 80 80 \n\n borrower_count dti ... insurance_percentage product_type \\\n0 2 27.0 ... NaN FRM \n1 1 46.0 ... NaN FRM \n2 1 40.0 ... 30.0 FRM \n3 1 32.0 ... 30.0 FRM \n4 1 44.0 ... NaN FRM \n\n co_borrower_credit_score mortgage_insurance_type \\\n0 812.0 NaN \n1 NaN NaN \n2 NaN 1.0 \n3 NaN 1.0 \n4 NaN NaN \n\n relocation_mortgage_indicator first_payment_year first_payment_month \\\n0 N 2016 5 \n1 N 2016 6 \n2 N 2016 6 \n3 N 2016 7 \n4 N 2016 6 \n\n origination_year origination_month Label \n0 2016 3 0 \n1 2016 4 0 \n2 2016 4 0 \n3 2016 5 0 \n4 2016 4 0 \n\n[5 rows x 28 columns]\n"
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T00:56:12.799266Z",
"start_time": "2019-12-03T00:56:05.938Z"
},
"trusted": true
},
"cell_type": "code",
"source": "## Let's look at a cool package buildt for dealing with missing data",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### Deal With Missing Data\n- Analise the set via the head\n- Check for NaNs and decide action\n- Check dataTypes\n- Check for extra nonsense that may ahve been pushed to the db. Like the first 2 row \n- Grabs some stats"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "## Let’s see how many null values are in each column.This is alwauys telling. ",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T08:35:10.117649Z",
"start_time": "2019-12-03T08:35:04.737890Z"
},
"trusted": true
},
"cell_type": "code",
"source": "df_train.apply(lambda x: x.isnull().sum(), axis=0)",
"execution_count": 21,
"outputs": [
{
"data": {
"text/plain": "id 0\nchannel 0\nseller 0\ninterest_rate 0\nbalance 0\nloan_term 0\nltv 0\ncltv 0\nborrower_count 0\ndti 620\nborrower_credit_score 2309\nfirst_time_homebuyer 0\nloan_purpose 0\nproperty_type 0\nunit_count 0\noccupancy_status 0\nproperty_state 0\nzip 0\nproduct_type 0\nco_borrower_credit_score 2096276\nrelocation_mortgage_indicator 0\nfirst_payment_year 0\nfirst_payment_month 0\norigination_year 0\norigination_month 0\nLabel 0\ndtype: int64"
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Let's just drop the high numbers. \n- The co_borrower_credit_score we will keep. And I'll tell you why. When you have a co-signatory, the liklyhood of you paying is tremedously greater Or somewher nearthere there. We'll see how it plays out. "
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T08:35:23.672826Z",
"start_time": "2019-12-03T08:35:23.659986Z"
},
"trusted": true
},
"cell_type": "code",
"source": "do_drops():\n df_train.drop([\"insurance_percentage\"],axis=1, inplace=True)\n df_train.drop([\"mortgage_insurance_type\"],axis=1, inplace=True)\n\n # and the nonsence\n df_train.drop([\"index\"],axis=1, inplace=True)\n df_train.drop([\"Unnamed: 0\"],axis=1, inplace=True)\n## We'll keep the Id's just in case we made a mistake of some kind\n\ndo_drops()",
"execution_count": 52,
"outputs": [
{
"ename": "SyntaxError",
"evalue": "invalid syntax (<ipython-input-52-5c0b582c4418>, line 1)",
"output_type": "error",
"traceback": [
"\u001b[0;36m File \u001b[0;32m\"<ipython-input-52-5c0b582c4418>\"\u001b[0;36m, line \u001b[0;32m1\u001b[0m\n\u001b[0;31m do_drops():\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n"
]
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Now we should understand what each feature is. \n- this is the dataset according to fannie. I'm not diplaying the performance, becuse we ionly used a single value. \n- camelot is pretty bad ass. I use it alot. "
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T04:47:24.053202Z",
"start_time": "2019-12-03T04:47:20.307776Z"
},
"trusted": true
},
"cell_type": "code",
"source": "import camelot\nfrom camelot.core import Table, TableList\n\ntables = camelot.read_pdf('https://loanperformancedata.fanniemae.com/lppub-docs/FNMA_SF_Loan_Performance_File_layout.pdf')\ntables[0].df",
"execution_count": 8,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>0</th>\n <th>1</th>\n <th>2</th>\n <th>3</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>File Position</td>\n <td>Field Name</td>\n <td>Type</td>\n <td>Max Length</td>\n </tr>\n <tr>\n <th>1</th>\n <td>1</td>\n <td>LOAN IDENTIFIER</td>\n <td>ALPHA-NUMERIC</td>\n <td>20</td>\n </tr>\n <tr>\n <th>2</th>\n <td>2</td>\n <td>ORIGINATION CHANNEL</td>\n <td>ALPHA-NUMERIC</td>\n <td>1</td>\n </tr>\n <tr>\n <th>3</th>\n <td>3</td>\n <td>SELLER NAME</td>\n <td>ALPHA-NUMERIC</td>\n <td>80</td>\n </tr>\n <tr>\n <th>4</th>\n <td>4</td>\n <td>ORIGINAL INTEREST RATE</td>\n <td>NUMERIC</td>\n <td>14,10</td>\n </tr>\n <tr>\n <th>5</th>\n <td>5</td>\n <td>ORIGINAL UPB</td>\n <td>NUMERIC</td>\n <td>11,2</td>\n </tr>\n <tr>\n <th>6</th>\n <td>6</td>\n <td>ORIGINAL LOAN TERM</td>\n <td>NUMERIC</td>\n <td>3,0</td>\n </tr>\n <tr>\n <th>7</th>\n <td>7</td>\n <td>ORIGINATION DATE</td>\n <td>DATE</td>\n <td>MM/YYYY</td>\n </tr>\n <tr>\n <th>8</th>\n <td>8</td>\n <td>FIRST PAYMENT DATE</td>\n <td>DATE</td>\n <td>MM/YYYY</td>\n </tr>\n <tr>\n <th>9</th>\n <td>9</td>\n <td>ORIGINAL LOAN-TO-VALUE \\n(LTV)</td>\n <td>NUMERIC</td>\n <td>14,10</td>\n </tr>\n <tr>\n <th>10</th>\n <td>10</td>\n <td>ORIGINAL COMBINED LOAN-TO-VALUE \\n(CLTV)</td>\n <td>NUMERIC</td>\n <td>14,10</td>\n </tr>\n <tr>\n <th>11</th>\n <td>11</td>\n <td>NUMBER OF BORROWERS</td>\n <td>NUMERIC</td>\n <td>3,0</td>\n </tr>\n <tr>\n <th>12</th>\n <td>12</td>\n <td>ORIGINAL DEBT TO INCOME RATIO</td>\n <td>NUMERIC</td>\n <td>14,10</td>\n </tr>\n <tr>\n <th>13</th>\n <td>13</td>\n <td>BORROWER CREDIT SCORE AT ORIGINATION</td>\n <td>NUMERIC</td>\n <td>3,0</td>\n </tr>\n <tr>\n <th>14</th>\n <td>14</td>\n <td>FIRST TIME HOME BUYER INDICATOR</td>\n <td>ALPHA-NUMERIC</td>\n <td>1</td>\n </tr>\n <tr>\n <th>15</th>\n <td>15</td>\n <td>LOAN PURPOSE</td>\n <td>ALPHA-NUMERIC</td>\n <td>1</td>\n </tr>\n <tr>\n <th>16</th>\n <td>16</td>\n <td>PROPERTY TYPE</td>\n <td>ALPHA-NUMERIC</td>\n <td>2</td>\n </tr>\n <tr>\n <th>17</th>\n <td>17</td>\n <td>NUMBER OF UNITS</td>\n <td>ALPHA-NUMERIC</td>\n <td>10</td>\n </tr>\n <tr>\n <th>18</th>\n <td>18</td>\n <td>OCCUPANCY TYPE</td>\n <td>ALPHA-NUMERIC</td>\n <td>1</td>\n </tr>\n <tr>\n <th>19</th>\n <td>19</td>\n <td>PROPERTY STATE</td>\n <td>ALPHA-NUMERIC</td>\n <td>20</td>\n </tr>\n <tr>\n <th>20</th>\n <td>20</td>\n <td>ZIP CODE SHORT</td>\n <td>ALPHA-NUMERIC</td>\n <td>10</td>\n </tr>\n <tr>\n <th>21</th>\n <td>21</td>\n <td>PRIMARY MORTGAGE INSURANCE PERCENT</td>\n <td>NUMERIC</td>\n <td>14,10</td>\n </tr>\n <tr>\n <th>22</th>\n <td>22</td>\n <td>PRODUCT TYPE</td>\n <td>ALPHA-NUMERIC</td>\n <td>20</td>\n </tr>\n <tr>\n <th>23</th>\n <td>23</td>\n <td>CO-BORROWER CREDIT SCORE AT ORIGINATION</td>\n <td>NUMERIC</td>\n <td>3,0</td>\n </tr>\n <tr>\n <th>24</th>\n <td>24</td>\n <td>MORTGAGE INSURANCE TYPE</td>\n <td>NUMERIC</td>\n <td>1</td>\n </tr>\n <tr>\n <th>25</th>\n <td>25</td>\n <td>RELOCATION MORTGAGE INDICATOR</td>\n <td>ALPHA-NUMERIC</td>\n <td>1</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " 0 1 2 \\\n0 File Position Field Name Type \n1 1 LOAN IDENTIFIER ALPHA-NUMERIC \n2 2 ORIGINATION CHANNEL ALPHA-NUMERIC \n3 3 SELLER NAME ALPHA-NUMERIC \n4 4 ORIGINAL INTEREST RATE NUMERIC \n5 5 ORIGINAL UPB NUMERIC \n6 6 ORIGINAL LOAN TERM NUMERIC \n7 7 ORIGINATION DATE DATE \n8 8 FIRST PAYMENT DATE DATE \n9 9 ORIGINAL LOAN-TO-VALUE \\n(LTV) NUMERIC \n10 10 ORIGINAL COMBINED LOAN-TO-VALUE \\n(CLTV) NUMERIC \n11 11 NUMBER OF BORROWERS NUMERIC \n12 12 ORIGINAL DEBT TO INCOME RATIO NUMERIC \n13 13 BORROWER CREDIT SCORE AT ORIGINATION NUMERIC \n14 14 FIRST TIME HOME BUYER INDICATOR ALPHA-NUMERIC \n15 15 LOAN PURPOSE ALPHA-NUMERIC \n16 16 PROPERTY TYPE ALPHA-NUMERIC \n17 17 NUMBER OF UNITS ALPHA-NUMERIC \n18 18 OCCUPANCY TYPE ALPHA-NUMERIC \n19 19 PROPERTY STATE ALPHA-NUMERIC \n20 20 ZIP CODE SHORT ALPHA-NUMERIC \n21 21 PRIMARY MORTGAGE INSURANCE PERCENT NUMERIC \n22 22 PRODUCT TYPE ALPHA-NUMERIC \n23 23 CO-BORROWER CREDIT SCORE AT ORIGINATION NUMERIC \n24 24 MORTGAGE INSURANCE TYPE NUMERIC \n25 25 RELOCATION MORTGAGE INDICATOR ALPHA-NUMERIC \n\n 3 \n0 Max Length \n1 20 \n2 1 \n3 80 \n4 14,10 \n5 11,2 \n6 3,0 \n7 MM/YYYY \n8 MM/YYYY \n9 14,10 \n10 14,10 \n11 3,0 \n12 14,10 \n13 3,0 \n14 1 \n15 1 \n16 2 \n17 10 \n18 1 \n19 20 \n20 10 \n21 14,10 \n22 20 \n23 3,0 \n24 1 \n25 1 "
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Got it? Good. \n- One thing to note. Nice were dealing with llarge in memory opjects. It's ok to write them to the DB as a checkpoint. Let's do that now as Flag this for late"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T04:56:04.824189Z",
"start_time": "2019-12-03T04:54:52.086048Z"
},
"trusted": true
},
"cell_type": "code",
"source": "## Don't Ask\ndf_train.to_csv(\"train_chkpt_one.csv\")",
"execution_count": 21,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T04:56:34.597262Z",
"start_time": "2019-12-03T04:56:33.954275Z"
},
"trusted": true
},
"cell_type": "code",
"source": "# Sanity Check\ndf_train.head(3)",
"execution_count": 22,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>id</th>\n <th>channel</th>\n <th>seller</th>\n <th>interest_rate</th>\n <th>balance</th>\n <th>loan_term</th>\n <th>ltv</th>\n <th>cltv</th>\n <th>borrower_count</th>\n <th>dti</th>\n <th>...</th>\n <th>property_state</th>\n <th>zip</th>\n <th>product_type</th>\n <th>co_borrower_credit_score</th>\n <th>relocation_mortgage_indicator</th>\n <th>first_payment_year</th>\n <th>first_payment_month</th>\n <th>origination_year</th>\n <th>origination_month</th>\n <th>Label</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>100000827160</td>\n <td>R</td>\n <td>OTHER</td>\n <td>4.250</td>\n <td>150000</td>\n <td>360</td>\n <td>49</td>\n <td>49</td>\n <td>2</td>\n <td>27.0</td>\n <td>...</td>\n <td>CA</td>\n <td>953</td>\n <td>FRM</td>\n <td>812.0</td>\n <td>N</td>\n <td>2016</td>\n <td>5</td>\n <td>2016</td>\n <td>3</td>\n <td>0</td>\n </tr>\n <tr>\n <th>1</th>\n <td>100002112463</td>\n <td>R</td>\n <td>OTHER</td>\n <td>4.625</td>\n <td>250000</td>\n <td>360</td>\n <td>69</td>\n <td>69</td>\n <td>1</td>\n <td>46.0</td>\n <td>...</td>\n <td>CA</td>\n <td>932</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>N</td>\n <td>2016</td>\n <td>6</td>\n <td>2016</td>\n <td>4</td>\n <td>0</td>\n </tr>\n <tr>\n <th>2</th>\n <td>100007277669</td>\n <td>R</td>\n <td>OTHER</td>\n <td>3.625</td>\n <td>100000</td>\n <td>360</td>\n <td>95</td>\n <td>103</td>\n <td>1</td>\n <td>40.0</td>\n <td>...</td>\n <td>NY</td>\n <td>130</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>N</td>\n <td>2016</td>\n <td>6</td>\n <td>2016</td>\n <td>4</td>\n <td>0</td>\n </tr>\n </tbody>\n</table>\n<p>3 rows x 26 columns</p>\n</div>",
"text/plain": " id channel seller interest_rate balance loan_term ltv cltv \\\n0 100000827160 R OTHER 4.250 150000 360 49 49 \n1 100002112463 R OTHER 4.625 250000 360 69 69 \n2 100007277669 R OTHER 3.625 100000 360 95 103 \n\n borrower_count dti ... property_state zip product_type \\\n0 2 27.0 ... CA 953 FRM \n1 1 46.0 ... CA 932 FRM \n2 1 40.0 ... NY 130 FRM \n\n co_borrower_credit_score relocation_mortgage_indicator first_payment_year \\\n0 812.0 N 2016 \n1 NaN N 2016 \n2 NaN N 2016 \n\n first_payment_month origination_year origination_month Label \n0 5 2016 3 0 \n1 6 2016 4 0 \n2 6 2016 4 0 \n\n[3 rows x 26 columns]"
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:16:29.303539Z",
"end_time": "2019-12-03T17:16:29.310548Z"
},
"trusted": true
},
"cell_type": "code",
"source": "\nimport pandas as pdx\ndef do_chkpt_one():\n df_train = pdx.read_csv('train_chkpt_one.csv')\n create_table(df_train,\"fork_data_chk1\")\n engine = sqlalchemy.create_engine(\"postgresql+psycopg2://postgres:1234@0.0.0.0:5432/postgres\")\n con = engine.connect()\n df_train.to_sql(\"fork_data_chk1\", con,if_exists=\"replace\")",
"execution_count": 1,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:16:30.282478Z",
"end_time": "2019-12-03T17:16:30.284776Z"
},
"trusted": true
},
"cell_type": "code",
"source": "## looks good. call it\n# do_chkpt_one()\n",
"execution_count": 2,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:20:33.164587Z",
"end_time": "2019-12-03T17:21:47.977481Z"
},
"trusted": true
},
"cell_type": "code",
"source": "# // Pull er back out\ndf_train = pdx.read_sql_query(\"\"\"SELECT * FROM fork_data_chk1;\"\"\", create_connection())\n",
"execution_count": 8,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:24:19.884745Z",
"end_time": "2019-12-03T17:24:21.333294Z"
},
"trusted": true
},
"cell_type": "code",
"source": "def do_drops():\n ## Sanity Check\n df_train.drop([\"index\"],axis=1, inplace=True)\n df_train.drop([\"Unnamed: 0\"],axis=1, inplace=True)\n\ndo_drops()",
"execution_count": 9,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:24:23.247551Z",
"end_time": "2019-12-03T17:24:23.251765Z"
},
"trusted": true
},
"cell_type": "code",
"source": "# df_train = df_train.fillna(-1, inplace=True)\n# ",
"execution_count": 10,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:24:39.846738Z",
"end_time": "2019-12-03T17:24:39.855229Z"
},
"trusted": true
},
"cell_type": "code",
"source": "def do_types():\n for column in [\n \"channel\",\n \"seller\",\n \"first_time_homebuyer\",\n \"loan_purpose\",\n \"property_type\",\n \"occupancy_status\",\n \"property_state\",\n \"product_type\",\n ]:\n df_train[column] = df_train[column].astype(\"category\")\n\n\n for column in [\n \"interest_rate\",\n \"dti\",\n \"borrower_credit_score\",\n \"co_borrower_credit_score\",\n\n ]:\n df_train[column] = df_train[column].astype(\"int32\")",
"execution_count": 11,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:24:41.779263Z",
"end_time": "2019-12-03T17:24:47.137496Z"
},
"trusted": true
},
"cell_type": "code",
"source": "do_types()",
"execution_count": 12,
"outputs": [
{
"output_type": "error",
"ename": "ValueError",
"evalue": "Cannot convert non-finite values (NA or inf) to integer",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-12-30dfcef7509c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdo_types\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m<ipython-input-11-456c8bda45d5>\u001b[0m in \u001b[0;36mdo_types\u001b[0;34m()\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 21\u001b[0m ]:\n\u001b[0;32m---> 22\u001b[0;31m \u001b[0mdf_train\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcolumn\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf_train\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcolumn\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"int32\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36mastype\u001b[0;34m(self, dtype, copy, errors, **kwargs)\u001b[0m\n\u001b[1;32m 5880\u001b[0m \u001b[0;31m# else, only a single dtype is given\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5881\u001b[0m new_data = self._data.astype(\n\u001b[0;32m-> 5882\u001b[0;31m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5883\u001b[0m )\n\u001b[1;32m 5884\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_constructor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnew_data\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__finalize__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/pandas/core/internals/managers.py\u001b[0m in \u001b[0;36mastype\u001b[0;34m(self, dtype, **kwargs)\u001b[0m\n\u001b[1;32m 579\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 580\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 581\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"astype\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 582\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 583\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mconvert\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/pandas/core/internals/managers.py\u001b[0m in \u001b[0;36mapply\u001b[0;34m(self, f, axes, filter, do_integrity_check, consolidate, **kwargs)\u001b[0m\n\u001b[1;32m 436\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreindex\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb_items\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0malign_copy\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 437\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 438\u001b[0;31m \u001b[0mapplied\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 439\u001b[0m \u001b[0mresult_blocks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_extend_blocks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mapplied\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult_blocks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 440\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/pandas/core/internals/blocks.py\u001b[0m in \u001b[0;36mastype\u001b[0;34m(self, dtype, copy, errors, values, **kwargs)\u001b[0m\n\u001b[1;32m 557\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 558\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"raise\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 559\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_astype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0merrors\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 560\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 561\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_astype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"raise\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/pandas/core/internals/blocks.py\u001b[0m in \u001b[0;36m_astype\u001b[0;34m(self, dtype, copy, errors, values, **kwargs)\u001b[0m\n\u001b[1;32m 641\u001b[0m \u001b[0;31m# _astype_nansafe works fine with 1-d only\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 642\u001b[0m \u001b[0mvals1d\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mravel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 643\u001b[0;31m \u001b[0mvalues\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mastype_nansafe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvals1d\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 644\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 645\u001b[0m \u001b[0;31m# TODO(extension)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/pandas/core/dtypes/cast.py\u001b[0m in \u001b[0;36mastype_nansafe\u001b[0;34m(arr, dtype, copy, skipna)\u001b[0m\n\u001b[1;32m 698\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misfinite\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mall\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 699\u001b[0m raise ValueError(\n\u001b[0;32m--> 700\u001b[0;31m \u001b[0;34m\"Cannot convert non-finite values (NA or inf) to \"\u001b[0m \u001b[0;34m\"integer\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 701\u001b[0m )\n\u001b[1;32m 702\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: Cannot convert non-finite values (NA or inf) to integer"
]
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T09:14:31.249795Z",
"start_time": "2019-12-03T09:14:29.714Z"
},
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": 20,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T09:15:24.656572Z",
"start_time": "2019-12-03T09:15:24.650823Z"
},
"trusted": true
},
"cell_type": "code",
"source": "# from autoimpute.imputations import SingleImputer, MultipleImputer\n# def do_impute(data):\n# si = SingleImputer() \n# si.fit_transform(data)",
"execution_count": 12,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## The Inbalance of Data \n- It's staggering. For these two years 3% have defaulted. \n- What do we do? There are a couple of options. Actually many. Let's get a number first of how many did not default over the two years. We have a few million records.. We can SMOTE -- more later"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T09:04:59.003389Z",
"start_time": "2019-12-03T09:04:58.772652Z"
},
"trusted": true
},
"cell_type": "code",
"source": "sns.countplot(df_train['Label'])",
"execution_count": 69,
"outputs": [
{
"data": {
"text/plain": "<matplotlib.axes._subplots.AxesSubplot at 0x7fb2ca92d710>"
},
"execution_count": 69,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": "<Figure size 432x288 with 1 Axes>"
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T09:05:02.212244Z",
"start_time": "2019-12-03T09:05:02.037221Z"
},
"trusted": true
},
"cell_type": "code",
"source": "df_train.query(\"Label == True\")",
"execution_count": 70,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>id</th>\n <th>channel</th>\n <th>seller</th>\n <th>interest_rate</th>\n <th>balance</th>\n <th>loan_term</th>\n <th>ltv</th>\n <th>cltv</th>\n <th>borrower_count</th>\n <th>dti</th>\n <th>...</th>\n <th>property_state</th>\n <th>zip</th>\n <th>product_type</th>\n <th>co_borrower_credit_score</th>\n <th>relocation_mortgage_indicator</th>\n <th>first_payment_year</th>\n <th>first_payment_month</th>\n <th>origination_year</th>\n <th>origination_month</th>\n <th>Label</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>504</th>\n <td>100919899030</td>\n <td>R</td>\n <td>OTHER</td>\n <td>4</td>\n <td>178000</td>\n <td>360</td>\n <td>97</td>\n <td>97</td>\n <td>1</td>\n <td>27.0</td>\n <td>...</td>\n <td>AL</td>\n <td>350</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>N</td>\n <td>2016</td>\n <td>6</td>\n <td>2016</td>\n <td>4</td>\n <td>1</td>\n </tr>\n <tr>\n <th>1460</th>\n <td>102526639505</td>\n <td>R</td>\n <td>OTHER</td>\n <td>5</td>\n <td>446000</td>\n <td>360</td>\n <td>90</td>\n <td>90</td>\n <td>1</td>\n <td>45.0</td>\n <td>...</td>\n <td>VA</td>\n <td>231</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>N</td>\n <td>2016</td>\n <td>8</td>\n <td>2016</td>\n <td>6</td>\n <td>1</td>\n </tr>\n <tr>\n <th>7979</th>\n <td>114064133628</td>\n <td>R</td>\n <td>OTHER</td>\n <td>4</td>\n <td>71000</td>\n <td>360</td>\n <td>63</td>\n <td>63</td>\n <td>2</td>\n <td>28.0</td>\n <td>...</td>\n <td>PA</td>\n <td>150</td>\n <td>FRM</td>\n <td>634.0</td>\n <td>N</td>\n <td>2016</td>\n <td>5</td>\n <td>2016</td>\n <td>3</td>\n <td>1</td>\n </tr>\n <tr>\n <th>9097</th>\n <td>115995140179</td>\n <td>R</td>\n <td>LOANDEPOT.COM, LLC</td>\n <td>4</td>\n <td>198000</td>\n <td>360</td>\n <td>80</td>\n <td>80</td>\n <td>1</td>\n <td>39.0</td>\n <td>...</td>\n <td>VA</td>\n <td>230</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>N</td>\n <td>2016</td>\n <td>6</td>\n <td>2016</td>\n <td>4</td>\n <td>1</td>\n </tr>\n <tr>\n <th>12532</th>\n <td>122159215261</td>\n <td>R</td>\n <td>WELLS FARGO BANK, N.A.</td>\n <td>4</td>\n <td>125000</td>\n <td>360</td>\n <td>71</td>\n <td>71</td>\n <td>1</td>\n <td>30.0</td>\n <td>...</td>\n <td>NM</td>\n <td>871</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>N</td>\n <td>2016</td>\n <td>6</td>\n <td>2016</td>\n <td>4</td>\n <td>1</td>\n </tr>\n <tr>\n <th>...</th>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n <td>...</td>\n </tr>\n <tr>\n <th>4086263</th>\n <td>982336827813</td>\n <td>R</td>\n <td>FRANKLIN AMERICAN MORTGAGE COMPANY</td>\n <td>4</td>\n <td>70000</td>\n <td>240</td>\n <td>86</td>\n <td>86</td>\n <td>1</td>\n <td>42.0</td>\n <td>...</td>\n <td>OH</td>\n <td>443</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>N</td>\n <td>2017</td>\n <td>5</td>\n <td>2017</td>\n <td>3</td>\n <td>1</td>\n </tr>\n <tr>\n <th>4089682</th>\n <td>989347753728</td>\n <td>R</td>\n <td>OTHER</td>\n <td>4</td>\n <td>54000</td>\n <td>360</td>\n <td>91</td>\n <td>97</td>\n <td>1</td>\n <td>40.0</td>\n <td>...</td>\n <td>OH</td>\n <td>450</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>N</td>\n <td>2017</td>\n <td>5</td>\n <td>2017</td>\n <td>3</td>\n <td>1</td>\n </tr>\n <tr>\n <th>4090723</th>\n <td>991527843261</td>\n <td>R</td>\n <td>OTHER</td>\n <td>4</td>\n <td>360000</td>\n <td>360</td>\n <td>80</td>\n <td>80</td>\n <td>1</td>\n <td>26.0</td>\n <td>...</td>\n <td>MO</td>\n <td>657</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>N</td>\n <td>2017</td>\n <td>6</td>\n <td>2017</td>\n <td>4</td>\n <td>1</td>\n </tr>\n <tr>\n <th>4093356</th>\n <td>997017995239</td>\n <td>C</td>\n <td>U.S. BANK N.A.</td>\n <td>5</td>\n <td>167000</td>\n <td>360</td>\n <td>95</td>\n <td>95</td>\n <td>1</td>\n <td>32.0</td>\n <td>...</td>\n <td>AZ</td>\n <td>853</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>N</td>\n <td>2017</td>\n <td>5</td>\n <td>2017</td>\n <td>3</td>\n <td>1</td>\n </tr>\n <tr>\n <th>4094283</th>\n <td>998998046089</td>\n <td>R</td>\n <td>OTHER</td>\n <td>4</td>\n <td>56000</td>\n <td>240</td>\n <td>68</td>\n <td>68</td>\n <td>1</td>\n <td>34.0</td>\n <td>...</td>\n <td>IN</td>\n <td>465</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>N</td>\n <td>2017</td>\n <td>5</td>\n <td>2017</td>\n <td>3</td>\n <td>1</td>\n </tr>\n </tbody>\n</table>\n<p>1429 rows × 26 columns</p>\n</div>",
"text/plain": " id channel seller \\\n504 100919899030 R OTHER \n1460 102526639505 R OTHER \n7979 114064133628 R OTHER \n9097 115995140179 R LOANDEPOT.COM, LLC \n12532 122159215261 R WELLS FARGO BANK, N.A. \n... ... ... ... \n4086263 982336827813 R FRANKLIN AMERICAN MORTGAGE COMPANY \n4089682 989347753728 R OTHER \n4090723 991527843261 R OTHER \n4093356 997017995239 C U.S. BANK N.A. \n4094283 998998046089 R OTHER \n\n interest_rate balance loan_term ltv cltv borrower_count dti \\\n504 4 178000 360 97 97 1 27.0 \n1460 5 446000 360 90 90 1 45.0 \n7979 4 71000 360 63 63 2 28.0 \n9097 4 198000 360 80 80 1 39.0 \n12532 4 125000 360 71 71 1 30.0 \n... ... ... ... ... ... ... ... \n4086263 4 70000 240 86 86 1 42.0 \n4089682 4 54000 360 91 97 1 40.0 \n4090723 4 360000 360 80 80 1 26.0 \n4093356 5 167000 360 95 95 1 32.0 \n4094283 4 56000 240 68 68 1 34.0 \n\n ... property_state zip product_type co_borrower_credit_score \\\n504 ... AL 350 FRM NaN \n1460 ... VA 231 FRM NaN \n7979 ... PA 150 FRM 634.0 \n9097 ... VA 230 FRM NaN \n12532 ... NM 871 FRM NaN \n... ... ... ... ... ... \n4086263 ... OH 443 FRM NaN \n4089682 ... OH 450 FRM NaN \n4090723 ... MO 657 FRM NaN \n4093356 ... AZ 853 FRM NaN \n4094283 ... IN 465 FRM NaN \n\n relocation_mortgage_indicator first_payment_year first_payment_month \\\n504 N 2016 6 \n1460 N 2016 8 \n7979 N 2016 5 \n9097 N 2016 6 \n12532 N 2016 6 \n... ... ... ... \n4086263 N 2017 5 \n4089682 N 2017 5 \n4090723 N 2017 6 \n4093356 N 2017 5 \n4094283 N 2017 5 \n\n origination_year origination_month Label \n504 2016 4 1 \n1460 2016 6 1 \n7979 2016 3 1 \n9097 2016 4 1 \n12532 2016 4 1 \n... ... ... ... \n4086263 2017 3 1 \n4089682 2017 3 1 \n4090723 2017 4 1 \n4093356 2017 3 1 \n4094283 2017 3 1 \n\n[1429 rows x 26 columns]"
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# Woah. Unbalanced But with 1429 Defaulters. We'll even her out. "
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:30:38.009218Z",
"end_time": "2019-12-03T17:30:39.112631Z"
},
"trusted": true
},
"cell_type": "code",
"source": "plt.figure(figsize=(15, 20))\n\nplt.subplot(231)\nsns.heatmap(\n pdx.DataFrame(df_train.isnull().sum() / df_train.shape[0] * 100),\n annot=True,\n cmap=sns.color_palette(\"cool\"),\n linewidth=1,\n linecolor=\"white\",\n)\nplt.show()",
"execution_count": 22,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<Figure size 1080x1440 with 2 Axes>",
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T13:30:43.282187Z",
"start_time": "2019-12-03T13:30:43.037471Z"
},
"trusted": true
},
"cell_type": "code",
"source": "from sklearn import preprocessing\nenc = preprocessing.OneHotEncoder(handle_unknown='ignore')\nenc.fit(df_train)",
"execution_count": 46,
"outputs": [
{
"ename": "ValueError",
"evalue": "Input contains NaN, infinity or a value too large for dtype('float64').",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-46-464ed6de1848>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0msklearn\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mpreprocessing\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0menc\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpreprocessing\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOneHotEncoder\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhandle_unknown\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'ignore'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0menc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m 491\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 492\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 493\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle_unknown\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhandle_unknown\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 494\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop_idx_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_compute_drop_idx\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 495\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py\u001b[0m in \u001b[0;36m_fit\u001b[0;34m(self, X, handle_unknown)\u001b[0m\n\u001b[1;32m 78\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 79\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_fit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle_unknown\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'error'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 80\u001b[0;31m \u001b[0mX_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_samples\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_features\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_X\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 81\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 82\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_categories\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0;34m'auto'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/sklearn/preprocessing/_encoders.py\u001b[0m in \u001b[0;36m_check_X\u001b[0;34m(self, X)\u001b[0m\n\u001b[1;32m 65\u001b[0m \u001b[0mXi\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_feature\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeature_idx\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 66\u001b[0m Xi = check_array(Xi, ensure_2d=False, dtype=None,\n\u001b[0;32m---> 67\u001b[0;31m force_all_finite=needs_validation)\n\u001b[0m\u001b[1;32m 68\u001b[0m \u001b[0mX_columns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mXi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/sklearn/utils/validation.py\u001b[0m in \u001b[0;36mcheck_array\u001b[0;34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)\u001b[0m\n\u001b[1;32m 540\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mforce_all_finite\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 541\u001b[0m _assert_all_finite(array,\n\u001b[0;32m--> 542\u001b[0;31m allow_nan=force_all_finite == 'allow-nan')\n\u001b[0m\u001b[1;32m 543\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 544\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mensure_min_samples\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/sklearn/utils/validation.py\u001b[0m in \u001b[0;36m_assert_all_finite\u001b[0;34m(X, allow_nan)\u001b[0m\n\u001b[1;32m 54\u001b[0m not allow_nan and not np.isfinite(X).all()):\n\u001b[1;32m 55\u001b[0m \u001b[0mtype_err\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'infinity'\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mallow_nan\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m'NaN, infinity'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 56\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg_err\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtype_err\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 57\u001b[0m \u001b[0;31m# for object dtype data, we only check for NaNs (GH-13254)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 58\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'object'\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mallow_nan\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: Input contains NaN, infinity or a value too large for dtype('float64')."
]
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Let's start looking through the Label and it's distribuition\n\n- Let's check a few pertinant values and their distribution among zip codes. Let's look at the ORIGINAL LOAN-TO-VALUE \\n(LTV),ORIGINAL COMBINED LOAN-TO-VALUE \\n(CLTV)\t, CREDIT SCORE and INTREST RATE. And what do you know. Lower scores and higher debt default more. lol. \n- Find the outlier in the wick"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T08:36:13.441579Z",
"start_time": "2019-12-03T08:36:11.274160Z"
},
"trusted": true
},
"cell_type": "code",
"source": "\ncolumns = ['ltv','cltv','borrower_credit_score','interest_rate']\n\nfig, axes = plt.subplots(nrows=2, ncols=2, figsize=(7,8))\nplt.tight_layout(w_pad=2.0, h_pad=3.0)\n\nfor i, column in zip(range(1,5), columns):\n plt.subplot(2,2,i)\n sns.boxplot(x=\"Label\", y=column, data=df_train, linewidth=0.5)\n plt.xlabel('Label')",
"execution_count": 54,
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": "<Figure size 504x576 with 4 Axes>"
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Let's Keep Rolling\nThe figure below shows the Loan to Value distribution. 80 is the number "
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# ORIGINAL LOAN-TO-VALUE \\n(LTV)"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T07:48:51.933496Z",
"start_time": "2019-12-03T07:48:51.027616Z"
},
"trusted": true
},
"cell_type": "code",
"source": "plt.figure(figsize=(12,5))\nplt.title(\"Distribution of ltv\")\nax = sns.distplot(df_train[\"ltv\"]).dropna()",
"execution_count": 14,
"outputs": [
{
"ename": "AttributeError",
"evalue": "'AxesSubplot' object has no attribute 'dropna'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-14-315b007bcdba>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m12\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtitle\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Distribution of ltv\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0max\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdistplot\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf_train\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"ltv\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdropna\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m: 'AxesSubplot' object has no attribute 'dropna'"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": "<Figure size 864x360 with 1 Axes>"
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# ORIGINAL INTEREST RATE"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T07:48:51.944309Z",
"start_time": "2019-12-03T07:48:51.797Z"
},
"trusted": true
},
"cell_type": "code",
"source": "plt.figure(figsize=(12,5))\nplt.title(\"Distribution of Zip Codes\")\nax = sns.distplot(df_train[\"zip\"])",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# ORIGINAL COMBINED LOAN-TO-VALUE \\n(CLTV)"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T07:48:53.726048Z",
"start_time": "2019-12-03T07:48:52.838952Z"
},
"trusted": true
},
"cell_type": "code",
"source": "plt.figure(figsize=(12,5))\nplt.title(\"Distribution of interest_rates\")\nax = sns.distplot(df_train[\"interest_rate\"])",
"execution_count": 15,
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": "<Figure size 864x360 with 1 Axes>"
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T07:48:54.591790Z",
"start_time": "2019-12-03T07:48:53.863549Z"
},
"trusted": true
},
"cell_type": "code",
"source": "plt.figure(figsize=(12,5))\nplt.title(\"Distribution of loan_term\")\nax = sns.distplot(df_train[\"loan_term\"])",
"execution_count": 16,
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": "<Figure size 864x360 with 1 Axes>"
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T06:12:14.608461Z",
"start_time": "2019-12-03T06:08:48.051624Z"
}
},
"cell_type": "markdown",
"source": "## confused yet? I am. Not really..but now I'll how to make sence of it all"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## we first have to impute everything. No null values. "
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "ds_trak",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# load the dataset\ndef load_dataset(dataframe):\n\t# load the dataset as a pandas DataFrame\n\t# retrieve numpy array\n\tdataset = dataframe.values\n\t# split into input (X) and output (y) variables\n\tX = dataset[:,-1]\n\ty = dataset[-1]\n\t# format all fields as string\n\tX = X.astype(str)\n\t# reshape target to be a 2d array\n\ty = y.reshape((len(y), 1))\n\treturn X, y\n \n# prepare input data\ndef prepare_inputs(X_train, X_test):\n\toe = OrdinalEncoder()\n\toe.fit(X_train)\n\tX_train_enc = oe.transform(X_train)\n\tX_test_enc = oe.transform(X_test)\n\treturn X_train_enc, X_test_enc\n \n# prepare target\ndef prepare_targets(y_train, y_test):\n\tle = LabelEncoder()\n\tle.fit(y_train)\n\ty_train_enc = le.transform(y_train)\n\ty_test_enc = le.transform(y_test)\n\treturn y_train_enc, y_test_enc",
"execution_count": 43,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# load the dataset\nX, y = load_dataset(df_train)\n# split into train and test sets\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=1)\n# prepare input data\n# X_train_enc, X_test_enc = prepare_inputs(X_train, X_test)\n# # prepare output data\n# y_train_enc, y_test_enc = prepare_targets(y_train, y_test)",
"execution_count": 45,
"outputs": [
{
"ename": "ValueError",
"evalue": "Found input variables with inconsistent numbers of samples: [4094777, 28]",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-45-32dc76172606>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mload_dataset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# split into train and test sets\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mX_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX_test\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_train\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_test\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtrain_test_split\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtest_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.33\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrandom_state\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;31m# prepare input data\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;31m# X_train_enc, X_test_enc = prepare_inputs(X_train, X_test)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/sklearn/model_selection/_split.py\u001b[0m in \u001b[0;36mtrain_test_split\u001b[0;34m(*arrays, **options)\u001b[0m\n\u001b[1;32m 2094\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Invalid parameters passed: %s\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2095\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2096\u001b[0;31m \u001b[0marrays\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mindexable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0marrays\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2097\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2098\u001b[0m \u001b[0mn_samples\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_num_samples\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marrays\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/sklearn/utils/validation.py\u001b[0m in \u001b[0;36mindexable\u001b[0;34m(*iterables)\u001b[0m\n\u001b[1;32m 228\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 229\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 230\u001b[0;31m \u001b[0mcheck_consistent_length\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 231\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 232\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/sklearn/utils/validation.py\u001b[0m in \u001b[0;36mcheck_consistent_length\u001b[0;34m(*arrays)\u001b[0m\n\u001b[1;32m 203\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0muniques\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 204\u001b[0m raise ValueError(\"Found input variables with inconsistent numbers of\"\n\u001b[0;32m--> 205\u001b[0;31m \" samples: %r\" % [int(l) for l in lengths])\n\u001b[0m\u001b[1;32m 206\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 207\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: Found input variables with inconsistent numbers of samples: [4094777, 28]"
]
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Now let's see what happens. "
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T12:38:54.092438Z",
"start_time": "2019-12-03T12:38:15.781519Z"
},
"jupyter": {
"outputs_hidden": true
},
"trusted": true
},
"cell_type": "code",
"source": "# df_train = getdummies(df_train)\ndf_train = load",
"execution_count": 14,
"outputs": [
{
"ename": "ArrowIOError",
"evalue": "Broken pipe",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mArrowIOError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-14-423a840c439e>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# df_train = getdummies(df_train)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mdf_train\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_dummies\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/modin/pandas/reshape.py\u001b[0m in \u001b[0;36mget_dummies\u001b[0;34m(data, prefix, prefix_sep, dummy_na, columns, sparse, drop_first, dtype)\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[0msparse\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msparse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 50\u001b[0m \u001b[0mdrop_first\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdrop_first\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 51\u001b[0;31m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 52\u001b[0m )\n\u001b[1;32m 53\u001b[0m )\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/modin/pandas/dataframe.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, data, index, columns, dtype, copy, query_compiler)\u001b[0m\n\u001b[1;32m 84\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 85\u001b[0m )\n\u001b[0;32m---> 86\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_query_compiler\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfrom_pandas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpandas_df\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_query_compiler\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 87\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 88\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_query_compiler\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mquery_compiler\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/modin/pandas/utils.py\u001b[0m in \u001b[0;36mfrom_pandas\u001b[0;34m(df)\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;34m.\u001b[0m\u001b[0mdataframe\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mDataFrame\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 23\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mDataFrame\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mquery_compiler\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mBaseFactory\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_pandas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 24\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/modin/data_management/factories.py\u001b[0m in \u001b[0;36mfrom_pandas\u001b[0;34m(cls, df)\u001b[0m\n\u001b[1;32m 26\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mclassmethod\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 27\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfrom_pandas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcls\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 28\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_determine_engine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_from_pandas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 29\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 30\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mclassmethod\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/modin/data_management/factories.py\u001b[0m in \u001b[0;36m_from_pandas\u001b[0;34m(cls, df)\u001b[0m\n\u001b[1;32m 30\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mclassmethod\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_from_pandas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcls\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 32\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mio_cls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_pandas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 33\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mclassmethod\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/modin/engines/base/io/io.py\u001b[0m in \u001b[0;36mfrom_pandas\u001b[0;34m(cls, df)\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mclassmethod\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfrom_pandas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcls\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mquery_compiler_cls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_pandas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mframe_cls\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 15\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mclassmethod\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/modin/backends/pandas/query_compiler.py\u001b[0m in \u001b[0;36mfrom_pandas\u001b[0;34m(cls, df, data_cls)\u001b[0m\n\u001b[1;32m 59\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mclassmethod\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 60\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mfrom_pandas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcls\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdata_cls\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 61\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata_cls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_pandas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 62\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 63\u001b[0m \u001b[0mindex\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mproperty\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_get_axis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_set_axis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/modin/engines/base/frame/data.py\u001b[0m in \u001b[0;36mfrom_pandas\u001b[0;34m(cls, df)\u001b[0m\n\u001b[1;32m 1170\u001b[0m \u001b[0mnew_columns\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1171\u001b[0m \u001b[0mnew_dtypes\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtypes\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1172\u001b[0;31m \u001b[0mnew_frame\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew_lengths\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnew_widths\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_frame_mgr_cls\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_pandas\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1173\u001b[0m return cls(\n\u001b[1;32m 1174\u001b[0m \u001b[0mnew_frame\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/modin/engines/base/frame/partition_manager.py\u001b[0m in \u001b[0;36mfrom_pandas\u001b[0;34m(cls, df, return_dims)\u001b[0m\n\u001b[1;32m 307\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcol_chunksize\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 308\u001b[0m ]\n\u001b[0;32m--> 309\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrow_chunksize\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 310\u001b[0m ]\n\u001b[1;32m 311\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mreturn_dims\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/modin/engines/base/frame/partition_manager.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 307\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcol_chunksize\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 308\u001b[0m ]\n\u001b[0;32m--> 309\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrow_chunksize\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 310\u001b[0m ]\n\u001b[1;32m 311\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mreturn_dims\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/modin/engines/base/frame/partition_manager.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 305\u001b[0m [\n\u001b[1;32m 306\u001b[0m \u001b[0mput_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m \u001b[0;34m:\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mrow_chunksize\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mj\u001b[0m \u001b[0;34m:\u001b[0m \u001b[0mj\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mcol_chunksize\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 307\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcol_chunksize\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 308\u001b[0m ]\n\u001b[1;32m 309\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrow_chunksize\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/modin/engines/ray/pandas_on_ray/frame/partition.py\u001b[0m in \u001b[0;36mput\u001b[0;34m(cls, obj)\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0mA\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m`\u001b[0m\u001b[0mRayRemotePartition\u001b[0m\u001b[0;31m`\u001b[0m \u001b[0mobject\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 118\u001b[0m \"\"\"\n\u001b[0;32m--> 119\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mPandasOnRayFramePartition\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mray\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mput\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 120\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 121\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mclassmethod\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/ray/worker.py\u001b[0m in \u001b[0;36mput\u001b[0;34m(value)\u001b[0m\n\u001b[1;32m 2275\u001b[0m \u001b[0mworker\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtask_context\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mput_index\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2276\u001b[0m )\n\u001b[0;32m-> 2277\u001b[0;31m \u001b[0mworker\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mput_object\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2278\u001b[0m \u001b[0mworker\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtask_context\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mput_index\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2279\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mobject_id\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/ray/worker.py\u001b[0m in \u001b[0;36mput_object\u001b[0;34m(self, object_id, value)\u001b[0m\n\u001b[1;32m 396\u001b[0m range(ray_constants.DEFAULT_PUT_OBJECT_RETRIES)):\n\u001b[1;32m 397\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 398\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_try_store_and_register\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 399\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 400\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mpyarrow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplasma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPlasmaStoreFull\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mplasma_exc\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/ray/worker.py\u001b[0m in \u001b[0;36m_try_store_and_register\u001b[0;34m(self, object_id, value)\u001b[0m\n\u001b[1;32m 416\u001b[0m \"\"\"\n\u001b[1;32m 417\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 418\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstore_and_register\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mobject_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mvalue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 419\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mpyarrow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mplasma\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mPlasmaObjectExists\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 420\u001b[0m \u001b[0;31m# The object already exists in the object store, so there is no\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/ray/worker.py\u001b[0m in \u001b[0;36mstore_and_register\u001b[0;34m(self, object_id, value, depth)\u001b[0m\n\u001b[1;32m 325\u001b[0m \u001b[0mmemcopy_threads\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmemcopy_threads\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 326\u001b[0m serialization_context=self.get_serialization_context(\n\u001b[0;32m--> 327\u001b[0;31m self.current_job_id))\n\u001b[0m\u001b[1;32m 328\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 329\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mpyarrow\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSerializationCallbackError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/ray/utils.py\u001b[0m in \u001b[0;36m_wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 517\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_wrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 518\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlock\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 519\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0morig_attr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 520\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 521\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_wrapper_cache\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mattr\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_wrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/ray/pyarrow_files/pyarrow/_plasma.pyx\u001b[0m in \u001b[0;36mpyarrow._plasma.PlasmaClient.put\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/ray/pyarrow_files/pyarrow/_plasma.pyx\u001b[0m in \u001b[0;36mpyarrow._plasma.PlasmaClient.create\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/ray/pyarrow_files/pyarrow/_plasma.pyx\u001b[0m in \u001b[0;36mpyarrow._plasma.plasma_check_status\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/ray/pyarrow_files/pyarrow/error.pxi\u001b[0m in \u001b[0;36mpyarrow.lib.check_status\u001b[0;34m()\u001b[0m\n",
"\u001b[0;31mArrowIOError\u001b[0m: Broken pipe"
]
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T07:59:53.344053Z",
"start_time": "2019-12-03T07:59:53.321155Z"
},
"collapsed": true,
"jupyter": {
"outputs_hidden": true
},
"trusted": true
},
"cell_type": "code",
"source": "print(df_train.info())",
"execution_count": 28,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": "<class 'pandas.core.frame.DataFrame'>\nRangeIndex: 4094777 entries, 0 to 4094776\nData columns (total 26 columns):\nid int64\nchannel object\nseller object\ninterest_rate float64\nbalance int64\nloan_term int64\nltv int64\ncltv int64\nborrower_count int64\ndti float64\nborrower_credit_score float64\nfirst_time_homebuyer object\nloan_purpose object\nproperty_type object\nunit_count int64\noccupancy_status object\nproperty_state object\nzip int64\nproduct_type object\nco_borrower_credit_score float64\nrelocation_mortgage_indicator object\nfirst_payment_year int64\nfirst_payment_month int64\norigination_year int64\norigination_month int64\nLabel int64\ndtypes: float64(4), int64(13), object(9)\nmemory usage: 812.3+ MB\nNone\n"
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:29:14.377011Z",
"end_time": "2019-12-03T17:29:14.385768Z"
},
"trusted": true
},
"cell_type": "code",
"source": "df_train.columns\n",
"execution_count": 19,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 19,
"data": {
"text/plain": "Index(['id', 'channel', 'seller', 'interest_rate', 'balance', 'loan_term',\n 'ltv', 'cltv', 'borrower_count', 'dti', 'borrower_credit_score',\n 'first_time_homebuyer', 'loan_purpose', 'property_type', 'unit_count',\n 'occupancy_status', 'property_state', 'zip', 'product_type',\n 'co_borrower_credit_score', 'relocation_mortgage_indicator',\n 'first_payment_year', 'first_payment_month', 'origination_year',\n 'origination_month', 'Label'],\n dtype='object')"
},
"metadata": {}
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T23:42:22.507313Z",
"start_time": "2019-12-02T23:42:22.389915Z"
},
"jupyter": {
"source_hidden": true
}
},
"cell_type": "markdown",
"source": "## SMOTE em if you got em\n\n- I need one about now\n- The step may be the most crutial part to building a well balanced model\n- Synthetic Minority Oversampling Technique is a teqnique used to pad your data. Read more here https://github.com/scikit-learn-contrib/imbalanced-learn#id30 while I go make a sandwich. \n- https://imbalanced-learn.readthedocs.io/en/stable/auto_examples/index.html \n- The is an interesting tequniqe that I'll admin, i have not used that ofen. But the data is so unbalanced I didn't want to just oversample the minority the Class. This allows me to actually do both simultaneously while creating “new” instances of the minority class. \n- We'll get into Interpret right after so we can visualise every thing that we've just done befoer we create a model. "
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T15:27:39.892578Z",
"start_time": "2019-12-03T15:27:38.085088Z"
},
"trusted": true
},
"cell_type": "code",
"source": "from imblearn.combine import SMOTEENN\nsm = SMOTEENN()",
"execution_count": 55,
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": "Using TensorFlow backend.\n"
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T15:27:49.449835Z",
"start_time": "2019-12-03T15:27:44.527443Z"
},
"trusted": true
},
"cell_type": "code",
"source": "y = df_train['Label'].values\nX = df_train.drop(['Label'], axis=1).values\n\nX_resampled, y_resampled = sm.fit_sample(X, y)",
"execution_count": 56,
"outputs": [
{
"ename": "ValueError",
"evalue": "could not convert string to float: 'R'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-56-5f33ed5aa1b2>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mX\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf_train\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Label'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mX_resampled\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_resampled\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit_sample\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/imblearn/base.py\u001b[0m in \u001b[0;36mfit_resample\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m 77\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 78\u001b[0m \u001b[0mcheck_classification_targets\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 79\u001b[0;31m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbinarize_y\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_check_X_y\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 80\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 81\u001b[0m self.sampling_strategy_ = check_sampling_strategy(\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/imblearn/base.py\u001b[0m in \u001b[0;36m_check_X_y\u001b[0;34m(X, y)\u001b[0m\n\u001b[1;32m 135\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_check_X_y\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 136\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbinarize_y\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcheck_target_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindicate_one_vs_all\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 137\u001b[0;31m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcheck_X_y\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maccept_sparse\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'csr'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'csc'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 138\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbinarize_y\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 139\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/sklearn/utils/validation.py\u001b[0m in \u001b[0;36mcheck_X_y\u001b[0;34m(X, y, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, multi_output, ensure_min_samples, ensure_min_features, y_numeric, warn_on_dtype, estimator)\u001b[0m\n\u001b[1;32m 717\u001b[0m \u001b[0mensure_min_features\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mensure_min_features\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 718\u001b[0m \u001b[0mwarn_on_dtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mwarn_on_dtype\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 719\u001b[0;31m estimator=estimator)\n\u001b[0m\u001b[1;32m 720\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mmulti_output\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 721\u001b[0m y = check_array(y, 'csr', force_all_finite=True, ensure_2d=False,\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/sklearn/utils/validation.py\u001b[0m in \u001b[0;36mcheck_array\u001b[0;34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)\u001b[0m\n\u001b[1;32m 494\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 495\u001b[0m \u001b[0mwarnings\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msimplefilter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'error'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mComplexWarning\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 496\u001b[0;31m \u001b[0marray\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0masarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marray\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morder\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0morder\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 497\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mComplexWarning\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 498\u001b[0m raise ValueError(\"Complex data not supported\\n\"\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/numpy/core/_asarray.py\u001b[0m in \u001b[0;36masarray\u001b[0;34m(a, dtype, order)\u001b[0m\n\u001b[1;32m 83\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 84\u001b[0m \"\"\"\n\u001b[0;32m---> 85\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0marray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morder\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0morder\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 86\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 87\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mValueError\u001b[0m: could not convert string to float: 'R'"
]
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T08:10:03.361084Z",
"start_time": "2019-12-03T08:10:03.283324Z"
},
"trusted": true
},
"cell_type": "code",
"source": "from sklearn.impute import SimpleImputer\nimp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')\nimp_mean.fit_transform(df_train)",
"execution_count": 1,
"outputs": [
{
"ename": "NameError",
"evalue": "name 'df_train' is not defined",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-1-5e6a66b170d9>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0msklearn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mimpute\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mSimpleImputer\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mimp_mean\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mSimpleImputer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmissing_values\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnan\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstrategy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'mean'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mimp_mean\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit_transform\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf_train\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: name 'df_train' is not defined"
]
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Lets start making some forcasts"
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:36:33.129095Z",
"end_time": "2019-12-03T17:37:47.040154Z"
},
"trusted": true
},
"cell_type": "code",
"source": "from sklearn.model_selection import train_test_split\n\n## Fill in rthe few blanks for now\n# df = pd.read_csv(\"train.csv\", nrows=1000000)\ndf_train[\"dti\"].fillna(0, inplace=True)\ndf_train[\"co_borrower_credit_score\"].fillna(0, inplace=True)\ndf_train[\"borrower_credit_score\"].fillna(0, inplace=True)\n\n\ntrain_cols = df_train.columns[0:-1]\nlabel = df_train.columns[-1:]\n\n\nX = df_train[train_cols]\ny = df_train[label]\ndf_train.to_csv(\"train_chkpt_two.csv\")",
"execution_count": 23,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:42:14.555624Z",
"end_time": "2019-12-03T17:42:14.573111Z"
},
"trusted": true
},
"cell_type": "code",
"source": "seed = 1\nX_train, X_test, y_train, y_test = train_test_split(\n X, y, test_size=0.20, random_state=seed\n)",
"execution_count": 5,
"outputs": [
{
"output_type": "error",
"ename": "NameError",
"evalue": "name 'X' is not defined",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-5-18db517f55a4>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mseed\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m X_train, X_test, y_train, y_test = train_test_split(\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtest_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0.20\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrandom_state\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mseed\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m )\n",
"\u001b[0;31mNameError\u001b[0m: name 'X' is not defined"
]
}
]
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:42:15.699626Z",
"end_time": "2019-12-03T17:42:15.709138Z"
},
"trusted": true
},
"cell_type": "code",
"source": "import pandas as pdx\nfrom sqlalchemy import create_engine\nimport psycopg2\ndef do_chkpt_one():\n df_train = pdx.read_csv('train_chkpt_two.csv')\n create_table(df_train,\"fork_data_chk2\")\n engine = sqlalchemy.create_engine(\"postgresql+psycopg2://postgres:1234@0.0.0.0:5432/postgres\")\n con = engine.connect()\nunoirt df_train.to_sql(\"fork_data_chk2\", con,if_exists=\"replace\")",
"execution_count": 6,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:43:43.654108Z",
"end_time": "2019-12-03T18:02:43.890290Z"
},
"trusted": true
},
"cell_type": "code",
"source": "import sqlalchemy\n# do_chkpt_one()",
"execution_count": 9,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T18:04:54.388814Z",
"end_time": "2019-12-03T18:05:36.413910Z"
},
"trusted": true
},
"cell_type": "code",
"source": "df_train = pdx.read_sql_query(\"\"\"SELECT * FROM fork_data_chk2;\"\"\", create_connection())",
"execution_count": 11,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"start_time": "2019-12-03T17:35:44.850Z",
"end_time": "2019-12-03T17:37:47.094225Z"
}
},
"cell_type": "markdown",
"source": "## Start Setting Up Experements"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# Fit an EBM\nhttps://github.com/interpretml/interpret"
},
{
"metadata": {
"run_control": {
"marked": true
},
"trusted": true
},
"cell_type": "code",
"source": "# With 4 million records, this will take about 3 hours. I'll run it on colab as well. \nfrom interpret.glassbox import ExplainableBoostingClassifier\n\nebm = ExplainableBoostingClassifier()\nebm.fit(X_train, y_train)",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "# Understand it at a global level"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "from interpret import show\n\nebm_global = ebm.explain_global()\nshow(ebm_global)\n",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Learn about it on a per forcast level"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "ebm_local = ebm.explain_local(X_test, y_test)\nshow(ebm_local)",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "## compare the two",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "## Compare\nshow([logistic_regression, decision_tree])",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Evalualuate"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "from interpret.perf import ROC, AUC\n\nebm_perf = ROC(ebm.predict_proba).explain_perf(X_test, y_test, name='EBM')\nshow(ebm_perf)",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "markdown",
"source": "Compare in the dash"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "lr_perf = ROC(lr.predict_proba).explain_perf(X_test_enc, y_test, name='Logistic Regression')\ntree_perf = ROC(tree.predict_proba).explain_perf(X_test_enc, y_test, name='Classification Tree')\n\nshow(lr_perf)\nshow(tree_perf)\nshow(ebm_perf)",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "##A;; \"glassbox\" models have local explanations"
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"gist": {
"id": "",
"data": {
"description": "CreditWorkup/Data/Foreclosure Notebook Demo.ipynb",
"public": true
},
"description": "CreditWorkup/Data/Foreclosure Notebook Demo.ipynb.ipynb",
"extension": ".ipynb",
"public": false
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"name": "python",
"version": "3.6.9",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"toc": {
"nav_menu": {},
"number_sections": false,
"sideBar": false,
"skip_h1_title": false,
"base_numbering": 1,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": false,
"toc_position": {
"height": "100px",
"left": "1092px",
"top": "134px",
"width": "212px"
},
"toc_section_display": true,
"toc_window_display": false
},
"varInspector": {
"window_display": false,
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"library": "var_list.py",
"delete_cmd_prefix": "del ",
"delete_cmd_postfix": "",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"library": "var_list.r",
"delete_cmd_prefix": "rm(",
"delete_cmd_postfix": ") ",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
]
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment