Skip to content

Instantly share code, notes, and snippets.

@mikewlange
Created December 3, 2019 09:35
Show Gist options
  • Save mikewlange/85db7e75afac1f12ebca8fd20dbd9328 to your computer and use it in GitHub Desktop.
Save mikewlange/85db7e75afac1f12ebca8fd20dbd9328 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": {
"end_time": "2019-12-03T09:13:10.377941Z",
"start_time": "2019-12-03T09:13:07.671060Z"
},
"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": {
"end_time": "2019-12-03T09:13:10.840382Z",
"start_time": "2019-12-03T09:13:09.614Z"
},
"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": {
"end_time": "2019-12-03T09:13:10.957505Z",
"start_time": "2019-12-03T09:13:10.952483Z"
},
"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": {
"end_time": "2019-12-03T09:13:11.259880Z",
"start_time": "2019-12-03T09:13:11.165028Z"
},
"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": [
{
"name": "stdout",
"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"
}
]
},
{
"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": {
"end_time": "2019-12-03T07:44:41.541995Z",
"start_time": "2019-12-03T07:44:41.538903Z"
},
"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": 7,
"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,
"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": 51,
"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": 51,
"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": {
"end_time": "2019-12-03T09:13:46.901483Z",
"start_time": "2019-12-03T09:13:46.891220Z"
},
"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": 5,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T09:13:51.719113Z",
"start_time": "2019-12-03T09:13:51.711738Z"
},
"trusted": true
},
"cell_type": "code",
"source": "## looks good. call it\n# do_chkpt_one()",
"execution_count": 6,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T09:14:23.695385Z",
"start_time": "2019-12-03T09:13:52.207457Z"
},
"trusted": true
},
"cell_type": "code",
"source": "# // Pull er back out\ndf_train = pdx.read_sql_query(\"\"\"SELECT * FROM fork_data_chk1;\"\"\", create_connection())",
"execution_count": 7,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T09:14:26.966985Z",
"start_time": "2019-12-03T09:14:26.952513Z"
},
"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(\"int64\")",
"execution_count": 8,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T09:14:31.241349Z",
"start_time": "2019-12-03T09:14:27.386725Z"
},
"trusted": true
},
"cell_type": "code",
"source": "do_types()",
"execution_count": 9,
"outputs": [
{
"ename": "ValueError",
"evalue": "Cannot convert non-finite values (NA or inf) to integer",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-9-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-8-2cd0614ecd4b>\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\"int64\"\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.245945Z",
"start_time": "2019-12-03T09:14:28.224Z"
},
"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)",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T09:14:31.249795Z",
"start_time": "2019-12-03T09:14:29.714Z"
},
"trusted": true
},
"cell_type": "code",
"source": "do_drops()",
"execution_count": null,
"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\ndef 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": {
"end_time": "2019-12-03T09:05:18.837176Z",
"start_time": "2019-12-03T09:05:18.101937Z"
},
"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": 71,
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": "<Figure size 1080x1440 with 2 Axes>"
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
]
},
{
"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": {
"ExecuteTime": {
"end_time": "2019-12-03T07:51:54.773078Z",
"start_time": "2019-12-03T07:51:54.753163Z"
},
"trusted": true
},
"cell_type": "code",
"source": "# ## This is a simple funtion that return vars for categorical features. A simple version of \n# # https://github.com/pandas-dev/pandas/blob/v0.25.3/pandas/core/reshape/reshape.py#L752-L940. \n\n# def getdummies(df):\n# columns = df.columns[df.isnull().any()]\n# nan_cols = df[columns]\n\n# df.drop(nan_cols.columns, axis=1, inplace=True)\n\n# cat = df.select_dtypes(include=['object'])\n# num = df.drop(cat.columns, axis=1)\n\n# data = pdx.DataFrame()\n# for i in cat.columns:\n# tmp = pdx.get_dummies(cat[i], drop_first=True)\n# data = pdx.concat([data, tmp], axis=1)\n\n# df = pdx.concat([num,data,nan_cols], axis=1).reset_index(drop=True)\n# return df",
"execution_count": 17,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T08:29:31.395580Z",
"start_time": "2019-12-03T08:29:21.925396Z"
},
"trusted": true
},
"cell_type": "code",
"source": "# ## now lets fill in thew blanks. This funtion uses a random forest classifier to the emptties. \n# # So that's the ORIGINAL DEBT TO INCOME RATIO, BORROWER CREDIT SCORE AT ORIGINATION\t \n# # and CO-BORROWER CREDIT SCORE AT ORIGINATION, my favorite one\t- \n\n# def fillnan(df):\n# columns = df.columns[df.isnull().any()]\n# for name in columns:\n# y = df.loc[df[name].notnull(), name].values\n# X = df.loc[df[name].notnull()].drop(columns, axis=1).values\n# X_test = df.loc[df[name].isnull()].drop(columns, axis=1).values\n# if df[name].dtypes == 'object':\n# model = RandomForestClassifier(n_estimators=400, max_depth=3)\n# model.fit(X, y)\n# df.loc[df[name].isnull(), name] = model.predict(X_test)\n# else:\n# model = RandomForestRegressor(n_estimators=400, max_depth=3)\n# model.fit(X, y)\n# df.loc[df[name].isnull(), name] = model.predict(X_test)\n# return df",
"execution_count": 44,
"outputs": [
{
"ename": "AttributeError",
"evalue": "'NoneType' object has no attribute 'update'",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-44-dd65687738f0>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 101\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mxval\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 102\u001b[0m ax1.barh(j, mses_diabetes[j], xerr=stds_diabetes[j],\n\u001b[0;32m--> 103\u001b[0;31m color=colors[j], alpha=0.6, align='center')\n\u001b[0m\u001b[1;32m 104\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 105\u001b[0m \u001b[0max1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_title\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Imputation Techniques with Diabetes Data'\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/matplotlib/axes/_axes.py\u001b[0m in \u001b[0;36mbarh\u001b[0;34m(self, y, width, height, left, align, **kwargs)\u001b[0m\n\u001b[1;32m 2461\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msetdefault\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'orientation'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'horizontal'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2462\u001b[0m patches = self.bar(x=left, height=height, width=width, bottom=y,\n\u001b[0;32m-> 2463\u001b[0;31m align=align, **kwargs)\n\u001b[0m\u001b[1;32m 2464\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mpatches\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2465\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/matplotlib/__init__.py\u001b[0m in \u001b[0;36minner\u001b[0;34m(ax, data, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1808\u001b[0m \u001b[0;34m\"the Matplotlib list!)\"\u001b[0m \u001b[0;34m%\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mlabel_namer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\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 1809\u001b[0m RuntimeWarning, stacklevel=2)\n\u001b[0;32m-> 1810\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0max\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 1811\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1812\u001b[0m inner.__doc__ = _add_data_doc(inner.__doc__,\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/matplotlib/axes/_axes.py\u001b[0m in \u001b[0;36mbar\u001b[0;34m(self, x, height, width, bottom, align, **kwargs)\u001b[0m\n\u001b[1;32m 2239\u001b[0m \u001b[0mwidth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconvert_xunits\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mwidth\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2240\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mxerr\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2241\u001b[0;31m \u001b[0mxerr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconvert_xunits\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mxerr\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 2242\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2243\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0myaxis\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\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/matplotlib/artist.py\u001b[0m in \u001b[0;36mconvert_xunits\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 184\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0max\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxaxis\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 185\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 186\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxaxis\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconvert_units\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 187\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 188\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mconvert_yunits\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\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[0;32m/opt/conda/lib/python3.6/site-packages/matplotlib/axis.py\u001b[0m in \u001b[0;36mconvert_units\u001b[0;34m(self, x)\u001b[0m\n\u001b[1;32m 1528\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1529\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1530\u001b[0;31m \u001b[0mret\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconverter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconvert\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munits\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[0m\u001b[1;32m 1531\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mret\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1532\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/matplotlib/category.py\u001b[0m in \u001b[0;36mconvert\u001b[0;34m(value, unit, axis)\u001b[0m\n\u001b[1;32m 51\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 52\u001b[0m \u001b[0;31m# force an update so it also does type checking\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 53\u001b[0;31m \u001b[0munit\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvalues\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 54\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 55\u001b[0m str2idx = np.vectorize(unit._mapping.__getitem__,\n",
"\u001b[0;31mAttributeError\u001b[0m: 'NoneType' object has no attribute 'update'"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": "<Figure size 864x432 with 1 Axes>"
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Now let's see what happens. "
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T08:52:53.510096Z",
"start_time": "2019-12-03T08:36:54.710893Z"
},
"trusted": true
},
"cell_type": "code",
"source": "df_train = getdummies(df_train)\ndf_train = fillnan(df_train)",
"execution_count": 55,
"outputs": [
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-55-9eb15a4c0157>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0mdf_train\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgetdummies\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[0;32m----> 2\u001b[0;31m \u001b[0mdf_train\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfillnan\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<ipython-input-30-11d9f6e6a162>\u001b[0m in \u001b[0;36mfillnan\u001b[0;34m(df)\u001b[0m\n\u001b[1;32m 17\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 18\u001b[0m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mRandomForestRegressor\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mn_estimators\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m400\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmax_depth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\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 20\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0misnull\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpredict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_test\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mdf\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/ensemble/forest.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, X, y, sample_weight)\u001b[0m\n\u001b[1;32m 328\u001b[0m \u001b[0mt\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[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msample_weight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtrees\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 329\u001b[0m verbose=self.verbose, class_weight=self.class_weight)\n\u001b[0;32m--> 330\u001b[0;31m for i, t in enumerate(trees))\n\u001b[0m\u001b[1;32m 331\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 332\u001b[0m \u001b[0;31m# Collect newly grown trees\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/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, iterable)\u001b[0m\n\u001b[1;32m 1004\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_iterating\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_original_iterator\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1005\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1006\u001b[0;31m \u001b[0;32mwhile\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdispatch_one_batch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0miterator\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 1007\u001b[0m \u001b[0;32mpass\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1008\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36mdispatch_one_batch\u001b[0;34m(self, iterator)\u001b[0m\n\u001b[1;32m 832\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 833\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--> 834\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dispatch\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtasks\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 835\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 836\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m_dispatch\u001b[0;34m(self, batch)\u001b[0m\n\u001b[1;32m 751\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_lock\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 752\u001b[0m \u001b[0mjob_idx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_jobs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 753\u001b[0;31m \u001b[0mjob\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_async\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbatch\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcallback\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcb\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 754\u001b[0m \u001b[0;31m# A job can complete so quickly than its callback is\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 755\u001b[0m \u001b[0;31m# called before we get here, causing self._jobs to\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/joblib/_parallel_backends.py\u001b[0m in \u001b[0;36mapply_async\u001b[0;34m(self, func, callback)\u001b[0m\n\u001b[1;32m 199\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mapply_async\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcallback\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\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 200\u001b[0m \u001b[0;34m\"\"\"Schedule a func to be run\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 201\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mImmediateResult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfunc\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 202\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcallback\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 203\u001b[0m \u001b[0mcallback\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[0;32m/opt/conda/lib/python3.6/site-packages/joblib/_parallel_backends.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, batch)\u001b[0m\n\u001b[1;32m 580\u001b[0m \u001b[0;31m# Don't delay the application, to avoid keeping the input\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 581\u001b[0m \u001b[0;31m# arguments in memory\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 582\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbatch\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 583\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 584\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mget\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[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 254\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mparallel_backend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_n_jobs\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 255\u001b[0m return [func(*args, **kwargs)\n\u001b[0;32m--> 256\u001b[0;31m for func, args, kwargs in self.items]\n\u001b[0m\u001b[1;32m 257\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__len__\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[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/joblib/parallel.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 254\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mparallel_backend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_backend\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn_jobs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_n_jobs\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 255\u001b[0m return [func(*args, **kwargs)\n\u001b[0;32m--> 256\u001b[0;31m for func, args, kwargs in self.items]\n\u001b[0m\u001b[1;32m 257\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__len__\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[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/sklearn/ensemble/forest.py\u001b[0m in \u001b[0;36m_parallel_build_trees\u001b[0;34m(tree, forest, X, y, sample_weight, tree_idx, n_trees, verbose, class_weight)\u001b[0m\n\u001b[1;32m 116\u001b[0m \u001b[0mcurr_sample_weight\u001b[0m \u001b[0;34m*=\u001b[0m \u001b[0mcompute_sample_weight\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'balanced'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindices\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 117\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 118\u001b[0;31m \u001b[0mtree\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\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[0msample_weight\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcurr_sample_weight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcheck_input\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\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 119\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 120\u001b[0m \u001b[0mtree\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\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[0msample_weight\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msample_weight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcheck_input\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\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/tree/tree.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, X, y, sample_weight, check_input, X_idx_sorted)\u001b[0m\n\u001b[1;32m 1155\u001b[0m \u001b[0msample_weight\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msample_weight\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1156\u001b[0m \u001b[0mcheck_input\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcheck_input\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1157\u001b[0;31m X_idx_sorted=X_idx_sorted)\n\u001b[0m\u001b[1;32m 1158\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 1159\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/sklearn/tree/tree.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, X, y, sample_weight, check_input, X_idx_sorted)\u001b[0m\n\u001b[1;32m 378\u001b[0m min_impurity_split)\n\u001b[1;32m 379\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 380\u001b[0;31m \u001b[0mbuilder\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuild\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtree_\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[0msample_weight\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mX_idx_sorted\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 381\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 382\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mn_outputs_\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[0;31mKeyboardInterrupt\u001b[0m: "
]
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T07:59:53.344053Z",
"start_time": "2019-12-03T07:59:53.321155Z"
},
"collapsed": 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": {
"end_time": "2019-12-03T08:04:21.654366Z",
"start_time": "2019-12-03T08:04:21.632298Z"
},
"trusted": true
},
"cell_type": "code",
"source": "df_train.head(5)",
"execution_count": 29,
"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 <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>TX</td>\n <td>765</td>\n <td>FRM</td>\n <td>NaN</td>\n <td>N</td>\n <td>2016</td>\n <td>7</td>\n <td>2016</td>\n <td>5</td>\n <td>0</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>WA</td>\n <td>980</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>5 rows × 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 \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 ... 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 \n3 1 32.0 ... TX 765 FRM \n4 1 44.0 ... WA 980 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 \n3 NaN N 2016 \n4 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 \n3 7 2016 5 0 \n4 6 2016 4 0 \n\n[5 rows x 26 columns]"
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T23:42:22.507313Z",
"start_time": "2019-12-02T23:42:22.389915Z"
}
},
"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-03T06:40:31.193625Z",
"start_time": "2019-12-03T06:40:29.812952Z"
},
"trusted": true
},
"cell_type": "code",
"source": "from imblearn.combine import SMOTEENN\nsm = SMOTEENN()",
"execution_count": 82,
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": "Using TensorFlow backend.\n"
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T08:10:03.361084Z",
"start_time": "2019-12-03T08:10:03.283324Z"
},
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": 35,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": "id int64\nchannel category\nseller category\ninterest_rate float64\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\ndtype: object\n"
},
{
"ename": "ValueError",
"evalue": "Cannot convert non-finite values (NA or inf) to integer",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-35-3405b0936596>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 22\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 23\u001b[0m ]:\n\u001b[0;32m---> 24\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\"int64\"\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:02:00.526983Z",
"start_time": "2019-12-03T09:01:59.500458Z"
},
"trusted": true
},
"cell_type": "code",
"source": "print(df_train)",
"execution_count": 63,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": " id channel seller \\\n0 100000827160 R OTHER \n1 100002112463 R OTHER \n2 100007277669 R OTHER \n3 100009404649 R OTHER \n4 100013046181 R OTHER \n... ... ... ... \n4094772 999983030127 C FRANKLIN AMERICAN MORTGAGE COMPANY \n4094773 999983903351 C WELLS FARGO BANK, N.A. \n4094774 999988990744 R OTHER \n4094775 999994624882 C NATIONSTAR MORTGAGE, LLC \n4094776 999995989414 C OTHER \n\n interest_rate balance loan_term ltv cltv borrower_count dti \\\n0 4.250 150000 360 49 49 2 27.0 \n1 4.625 250000 360 69 69 1 46.0 \n2 3.625 100000 360 95 103 1 40.0 \n3 3.500 149000 360 95 95 1 32.0 \n4 4.250 216000 360 80 80 1 44.0 \n... ... ... ... ... ... ... ... \n4094772 4.125 150000 180 73 73 2 39.0 \n4094773 3.875 236000 360 80 80 2 44.0 \n4094774 4.375 423000 360 90 90 1 45.0 \n4094775 4.125 420000 360 71 71 2 35.0 \n4094776 4.125 333000 360 95 95 2 38.0 \n\n ... property_state zip product_type co_borrower_credit_score \\\n0 ... CA 953 FRM 812.0 \n1 ... CA 932 FRM NaN \n2 ... NY 130 FRM NaN \n3 ... TX 765 FRM NaN \n4 ... WA 980 FRM NaN \n... ... ... ... ... ... \n4094772 ... OK 746 FRM 713.0 \n4094773 ... VA 234 FRM 799.0 \n4094774 ... CA 925 FRM NaN \n4094775 ... NC 282 FRM 805.0 \n4094776 ... MN 566 FRM 683.0 \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... ... ... ... \n4094772 N 2017 5 \n4094773 N 2017 6 \n4094774 N 2017 6 \n4094775 N 2017 6 \n4094776 N 2017 8 \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... ... ... ... \n4094772 2017 3 0 \n4094773 2017 4 0 \n4094774 2017 4 0 \n4094775 2017 4 0 \n4094776 2017 6 0 \n\n[4094777 rows x 26 columns]\n"
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T08:11:05.377883Z",
"start_time": "2019-12-03T08:11:05.370917Z"
},
"trusted": true
},
"cell_type": "code",
"source": "df_train[\"borrower_credit_score\"]",
"execution_count": 37,
"outputs": [
{
"data": {
"text/plain": "0 809.0\n1 774.0\n2 758.0\n3 766.0\n4 737.0\n ... \n4094772 771.0\n4094773 790.0\n4094774 709.0\n4094775 799.0\n4094776 688.0\nName: borrower_credit_score, Length: 4094777, dtype: float64"
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-03T06:47:58.111052Z",
"start_time": "2019-12-03T06:41:54.410201Z"
},
"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": 84,
"outputs": [
{
"ename": "MemoryError",
"evalue": "Unable to allocate array with shape (4094777, 106) and data type float64",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mMemoryError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-84-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 82\u001b[0m self.sampling_strategy, y, self._sampling_type)\n\u001b[1;32m 83\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 84\u001b[0;31m \u001b[0moutput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fit_resample\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 85\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 86\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mbinarize_y\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/imblearn/combine/_smote_enn.py\u001b[0m in \u001b[0;36m_fit_resample\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m 140\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msampling_strategy_\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msampling_strategy\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 141\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 142\u001b[0;31m \u001b[0mX_res\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_res\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msmote_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit_resample\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 143\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0menn_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit_resample\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_res\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my_res\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/imblearn/base.py\u001b[0m in \u001b[0;36mfit_resample\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m 82\u001b[0m self.sampling_strategy, y, self._sampling_type)\n\u001b[1;32m 83\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 84\u001b[0;31m \u001b[0moutput\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_fit_resample\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 85\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 86\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mbinarize_y\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/imblearn/over_sampling/_smote.py\u001b[0m in \u001b[0;36m_fit_resample\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m 795\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_fit_resample\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[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 796\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_validate_estimator\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--> 797\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_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[1;32m 798\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 799\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_sample\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[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[0;32m/opt/conda/lib/python3.6/site-packages/imblearn/over_sampling/_smote.py\u001b[0m in \u001b[0;36m_sample\u001b[0;34m(self, X, y)\u001b[0m\n\u001b[1;32m 808\u001b[0m \u001b[0;32mcontinue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 809\u001b[0m \u001b[0mtarget_class_indices\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mflatnonzero\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mclass_sample\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 810\u001b[0;31m \u001b[0mX_class\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msafe_indexing\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtarget_class_indices\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 811\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 812\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnn_k_\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mX_class\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/__init__.py\u001b[0m in \u001b[0;36msafe_indexing\u001b[0;34m(X, indices)\u001b[0m\n\u001b[1;32m 217\u001b[0m indices.dtype.kind == 'i'):\n\u001b[1;32m 218\u001b[0m \u001b[0;31m# This is often substantially faster than X[indices]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 219\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtake\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindices\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\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[0m\u001b[1;32m 220\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 221\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mX\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindices\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mMemoryError\u001b[0m: Unable to allocate array with shape (4094777, 106) and data type float64"
]
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2019-12-02T23:18:43.814022Z",
"start_time": "2019-12-02T23:17:32.454072Z"
},
"code_folding": [],
"trusted": true
},
"cell_type": "code",
"source": "### This would work were I to clean the data first. But out of time. Need to get on with it\n# import psycopg2\n# import os\n# from io import StringIO\n# import pandas as pd\n\n# # Get a database connection\n# conn = create_connection()\n# cur = conn.cursor()\n# # Do something to create your dataframe here...\n# df = pd.read_csv(\"train.csv\")\n\n# # Initialize a string buffer\n# sio = StringIO()\n# sio.write(df.to_csv(index=None, header=None)) # Write the Pandas DataFrame as a csv to the buffer\n# sio.seek(0) # Be sure to reset the position to the start of the stream\n\n# # Copy the string buffer to the database, as if it were an actual file\n# with cur as c:\n# c.copy_from(sio, \"fork_data\", columns=df.columns, sep=',')\n# conn.commit()",
"execution_count": 25,
"outputs": [
{
"ename": "BadCopyFileFormat",
"evalue": "extra data after last expected column\nCONTEXT: COPY fork_data, line 9: \"100018494233,C,\"WELLS FARGO BANK, N.A.\",3.75,223000,360,95,95,1,16.0,797.0,N,P,PU,1,P,AL,357,30.0,FR...\"\n",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mBadCopyFileFormat\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-25-b9860fc04f5a>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0;31m# Copy the string buffer to the database, as if it were an actual file\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mcur\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mc\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0mc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy_from\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msio\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"fork_data\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcolumns\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[0msep\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[0m\u001b[1;32m 20\u001b[0m \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcommit\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;31mBadCopyFileFormat\u001b[0m: extra data after last expected column\nCONTEXT: COPY fork_data, line 9: \"100018494233,C,\"WELLS FARGO BANK, N.A.\",3.75,223000,360,95,95,1,16.0,797.0,N,P,PU,1,P,AL,357,30.0,FR...\"\n"
]
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "%reload_ext sql\n%sql postgresql+psycopg2://postgres:1234@0.0.0.0:5432/postgres",
"execution_count": 39,
"outputs": [
{
"data": {
"text/plain": "'Connected: postgres@postgres'"
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "%%sql\nSELECT version()",
"execution_count": 42,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": " * postgresql+psycopg2://postgres:***@0.0.0.0:5432/postgres\n1 rows affected.\n"
},
{
"data": {
"text/html": "<table>\n <tr>\n <th>version</th>\n </tr>\n <tr>\n <td>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</td>\n </tr>\n</table>",
"text/plain": "[('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',)]"
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "def create_table_once(df, table_name):\n engine = create_engine(\"postgresql+psycopg2://postgres:1234@localhost:5432\")\n df.head(0).to_sql(table_name, engine, if_exists=\"replace\", index=False)",
"execution_count": 27,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "# create_table_once(df_a, 'acc')\ncreate_table_once(df_p, 'per')",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "\nconn = create_connection()\ncur = conn.cursor()\nwith open('Acquisition.txt', 'r') as f:\n# Notice that we don't need the `csv` module.\n next(f) # Skip the header row.\n cur.copy_from(f, 'acc', sep='|')\n conn.commit()",
"execution_count": 31,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "conn = create_connection()\ncur = conn.cursor()\nwith open('Performance.txt', 'r') as f:\n# Notice that we don't need the `csv` module.\n next(f) # Skip the header row.\n cur.copy_from(f, 'per', sep='|')\n conn.commit()",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "cur = create_connection().cursor()",
"execution_count": 21,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "pd.read_sql_query(\"\"\"SELECT * FROM acc \"\"\", create_connection())",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "cur.execute(\"SELECT COUNT(id) FROM per;\")\ncur.fetchone()",
"execution_count": 23,
"outputs": [
{
"data": {
"text/plain": "(118095695,)"
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "pd.read_sql_query(\"\"\"SELECT * FROM per \"\"\", create_connection())",
"execution_count": null,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "df = pd.read_sql('select * from per where foreclosure_date IS NOT NULL', create_connection())\ndf",
"execution_count": 20,
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": "distributed.nanny - WARNING - Restarting worker\ndistributed.nanny - WARNING - Restarting worker\ndistributed.nanny - WARNING - Restarting worker\ndistributed.nanny - WARNING - Restarting worker\n"
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-20-d46c968f9d85>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_sql\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'select * from per where foreclosure_date IS NOT NULL'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcreate_connection\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[0m\u001b[1;32m 2\u001b[0m \u001b[0mdf\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/io.py\u001b[0m in \u001b[0;36mread_sql\u001b[0;34m(sql, con, index_col, coerce_float, params, parse_dates, columns, chunksize)\u001b[0m\n\u001b[1;32m 319\u001b[0m \"\"\"\n\u001b[1;32m 320\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minspect\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetargvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minspect\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcurrentframe\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--> 321\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[0mread_sql\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[0m\u001b[1;32m 322\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 323\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;36mread_sql\u001b[0;34m(cls, **kwargs)\u001b[0m\n\u001b[1;32m 146\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 147\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mread_sql\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcls\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--> 148\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_read_sql\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 149\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 150\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_read_sql\u001b[0;34m(cls, **kwargs)\u001b[0m\n\u001b[1;32m 150\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 151\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_read_sql\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcls\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--> 152\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[0mread_sql\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 153\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 154\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;36mread_sql\u001b[0;34m(cls, sql, con, index_col, coerce_float, params, parse_dates, columns, chunksize)\u001b[0m\n\u001b[1;32m 447\u001b[0m \u001b[0mparse_dates\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mparse_dates\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 448\u001b[0m \u001b[0mcolumns\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[0m\n\u001b[0;32m--> 449\u001b[0;31m \u001b[0mchunksize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mchunksize\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 450\u001b[0m )\n\u001b[1;32m 451\u001b[0m )\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/pandas/io/sql.py\u001b[0m in \u001b[0;36mread_sql\u001b[0;34m(sql, con, index_col, coerce_float, params, parse_dates, columns, chunksize)\u001b[0m\n\u001b[1;32m 408\u001b[0m \u001b[0mcoerce_float\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcoerce_float\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 409\u001b[0m \u001b[0mparse_dates\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mparse_dates\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 410\u001b[0;31m \u001b[0mchunksize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mchunksize\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 411\u001b[0m )\n\u001b[1;32m 412\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/pandas/io/sql.py\u001b[0m in \u001b[0;36mread_query\u001b[0;34m(self, sql, index_col, coerce_float, params, parse_dates, chunksize)\u001b[0m\n\u001b[1;32m 1664\u001b[0m \u001b[0mindex_col\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mindex_col\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1665\u001b[0m \u001b[0mcoerce_float\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcoerce_float\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1666\u001b[0;31m \u001b[0mparse_dates\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mparse_dates\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 1667\u001b[0m )\n\u001b[1;32m 1668\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mframe\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/io/sql.py\u001b[0m in \u001b[0;36m_wrap_result\u001b[0;34m(data, columns, index_col, coerce_float, parse_dates)\u001b[0m\n\u001b[1;32m 123\u001b[0m \u001b[0;34m\"\"\"Wrap result set of query in a DataFrame.\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 124\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 125\u001b[0;31m \u001b[0mframe\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mDataFrame\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfrom_records\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\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[0mcoerce_float\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcoerce_float\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 126\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 127\u001b[0m \u001b[0mframe\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_parse_date_columns\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mframe\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparse_dates\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/frame.py\u001b[0m in \u001b[0;36mfrom_records\u001b[0;34m(cls, data, index, exclude, columns, coerce_float, nrows)\u001b[0m\n\u001b[1;32m 1650\u001b[0m \u001b[0mcolumns\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdrop\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexclude\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1651\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1652\u001b[0;31m \u001b[0mmgr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0marrays_to_mgr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marrays\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marr_columns\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult_index\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[0m\n\u001b[0m\u001b[1;32m 1653\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1654\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mcls\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmgr\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/construction.py\u001b[0m in \u001b[0;36marrays_to_mgr\u001b[0;34m(arrays, arr_names, index, columns, dtype)\u001b[0m\n\u001b[1;32m 80\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 81\u001b[0m \u001b[0;31m# don't force copy because getting jammed in an ndarray anyway\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 82\u001b[0;31m \u001b[0marrays\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_homogenize\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marrays\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\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 83\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 84\u001b[0m \u001b[0;31m# from BlockManager perspective\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/construction.py\u001b[0m in \u001b[0;36m_homogenize\u001b[0;34m(data, index, dtype)\u001b[0m\n\u001b[1;32m 321\u001b[0m \u001b[0mval\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfast_multiget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mval\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0moindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdefault\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[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 322\u001b[0m val = sanitize_array(\n\u001b[0;32m--> 323\u001b[0;31m \u001b[0mval\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\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[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mraise_cast_failure\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 324\u001b[0m )\n\u001b[1;32m 325\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m/opt/conda/lib/python3.6/site-packages/pandas/core/internals/construction.py\u001b[0m in \u001b[0;36msanitize_array\u001b[0;34m(data, index, dtype, copy, raise_cast_failure)\u001b[0m\n\u001b[1;32m 747\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mis_object_dtype\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[1;32m 748\u001b[0m ):\n\u001b[0;32m--> 749\u001b[0;31m \u001b[0minferred\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minfer_dtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msubarr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mskipna\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\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 750\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0minferred\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"period\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 751\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;31mKeyboardInterrupt\u001b[0m: "
]
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.9"
},
"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": "641.323px",
"width": "212px",
"left": "309px",
"top": "270px"
},
"toc_section_display": true,
"toc_window_display": true
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
},
"gist": {
"id": "",
"data": {
"description": "CreditWorkup/Data/Foreclosure Notebook Demo.ipynb",
"public": true
},
"public": false,
"description": "CreditWorkup/Data/Foreclosure Notebook Demo.ipynb.ipynb",
"extension": ".ipynb"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment