diff --git a/feature extraction/Feature description. v1.1 .xlsx b/feature extraction/Feature description. v1.1 .xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..bf4f6e4825741ccc979e28f5993157b58f38f7fc
Binary files /dev/null and b/feature extraction/Feature description. v1.1 .xlsx differ
diff --git a/feature extraction/DataPreprocessing_FeatureEngineering_Pipeline_df1n19.ipynb b/tfn/notebooks/.ipynb_checkpoints/DataPreprocessing_FeatureEngineering_Pipeline_df1n19 v1.1-checkpoint.ipynb
similarity index 94%
rename from feature extraction/DataPreprocessing_FeatureEngineering_Pipeline_df1n19.ipynb
rename to tfn/notebooks/.ipynb_checkpoints/DataPreprocessing_FeatureEngineering_Pipeline_df1n19 v1.1-checkpoint.ipynb
index 300137e3e2d71b93d22426f7063f3e4ac737d4fa..c62f23391cd5d20b286bcdefd0c6157a13f00407 100644
--- a/feature extraction/DataPreprocessing_FeatureEngineering_Pipeline_df1n19.ipynb	
+++ b/tfn/notebooks/.ipynb_checkpoints/DataPreprocessing_FeatureEngineering_Pipeline_df1n19 v1.1-checkpoint.ipynb	
@@ -1278,7 +1278,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "songs = apply_pipeline(songs, feature_pipeline_song)\n"
+    "songs = apply_pipeline(songs, feature_pipeline_song)"
    ]
   },
   {
@@ -1583,23 +1583,6 @@
    "execution_count": 16,
    "metadata": {},
    "outputs": [],
-   "source": [
-    "# Standardize numerical data: registration_duration & song_length\n",
-    "\n",
-    "transfer_list = ['song_length','registration_duration']\n",
-    "def standardize(data, transfer_list):\n",
-    "    for i in transfer_list:\n",
-    "        data[i] = preprocessing.scale(data[i], axis=0, with_mean=True, with_std=True, copy=True)\n",
-    "        \n",
-    "standardize(train, transfer_list)\n",
-    "standardize(test, transfer_list)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 17,
-   "metadata": {},
-   "outputs": [],
    "source": [
     "# Sparse label data from train dataset\n",
     "\n",
@@ -1613,7 +1596,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": 17,
    "metadata": {},
    "outputs": [
     {
@@ -1681,7 +1664,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.420898</td>\n",
+       "      <td>2103</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>1</th>\n",
@@ -1704,7 +1687,7 @@
        "      <td>13</td>\n",
        "      <td>24.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.596334</td>\n",
+       "      <td>2301</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>2</th>\n",
@@ -1713,7 +1696,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>4</td>\n",
-       "      <td>-0.303863</td>\n",
+       "      <td>225396.0</td>\n",
        "      <td>2006.0</td>\n",
        "      <td>31</td>\n",
        "      <td>186.0</td>\n",
@@ -1727,7 +1710,7 @@
        "      <td>13</td>\n",
        "      <td>24.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.596334</td>\n",
+       "      <td>2301</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>3</th>\n",
@@ -1750,7 +1733,7 @@
        "      <td>13</td>\n",
        "      <td>24.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.596334</td>\n",
+       "      <td>2301</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>4</th>\n",
@@ -1759,7 +1742,7 @@
        "      <td>1</td>\n",
        "      <td>7</td>\n",
        "      <td>7</td>\n",
-       "      <td>-0.872754</td>\n",
+       "      <td>187802.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>2</td>\n",
        "      <td>18.0</td>\n",
@@ -1773,7 +1756,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.420898</td>\n",
+       "      <td>2103</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>5</th>\n",
@@ -1782,7 +1765,7 @@
        "      <td>1</td>\n",
        "      <td>7</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.035210</td>\n",
+       "      <td>247803.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>31</td>\n",
        "      <td>13.0</td>\n",
@@ -1796,7 +1779,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.420898</td>\n",
+       "      <td>2103</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>6</th>\n",
@@ -1805,7 +1788,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>4</td>\n",
-       "      <td>-0.234466</td>\n",
+       "      <td>229982.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>109</td>\n",
        "      <td>34.0</td>\n",
@@ -1819,7 +1802,7 @@
        "      <td>13</td>\n",
        "      <td>24.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.596334</td>\n",
+       "      <td>2301</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7</th>\n",
@@ -1828,7 +1811,7 @@
        "      <td>1</td>\n",
        "      <td>7</td>\n",
        "      <td>7</td>\n",
-       "      <td>-0.973945</td>\n",
+       "      <td>181115.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>2</td>\n",
        "      <td>39.0</td>\n",
@@ -1842,7 +1825,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.420898</td>\n",
+       "      <td>2103</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>8</th>\n",
@@ -1851,7 +1834,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.506754</td>\n",
+       "      <td>278964.0</td>\n",
        "      <td>2007.0</td>\n",
        "      <td>58</td>\n",
        "      <td>153.0</td>\n",
@@ -1865,7 +1848,7 @@
        "      <td>15</td>\n",
        "      <td>26.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.603422</td>\n",
+       "      <td>2309</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>9</th>\n",
@@ -1874,7 +1857,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.179968</td>\n",
+       "      <td>257369.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>109</td>\n",
        "      <td>153.0</td>\n",
@@ -1888,7 +1871,7 @@
        "      <td>15</td>\n",
        "      <td>26.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.603422</td>\n",
+       "      <td>2309</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>10</th>\n",
@@ -1897,7 +1880,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.326002</td>\n",
+       "      <td>223933.0</td>\n",
        "      <td>2014.0</td>\n",
        "      <td>109</td>\n",
        "      <td>49.0</td>\n",
@@ -1911,7 +1894,7 @@
        "      <td>15</td>\n",
        "      <td>26.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.603422</td>\n",
+       "      <td>2309</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>11</th>\n",
@@ -1920,7 +1903,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.315954</td>\n",
+       "      <td>224597.0</td>\n",
        "      <td>2015.0</td>\n",
        "      <td>109</td>\n",
        "      <td>79.0</td>\n",
@@ -1934,7 +1917,7 @@
        "      <td>15</td>\n",
        "      <td>26.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.603422</td>\n",
+       "      <td>2309</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>12</th>\n",
@@ -1943,7 +1926,7 @@
        "      <td>3</td>\n",
        "      <td>20</td>\n",
        "      <td>11</td>\n",
-       "      <td>0.523702</td>\n",
+       "      <td>280084.0</td>\n",
        "      <td>2014.0</td>\n",
        "      <td>109</td>\n",
        "      <td>236.0</td>\n",
@@ -1957,7 +1940,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.746018</td>\n",
+       "      <td>786</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>13</th>\n",
@@ -1980,7 +1963,7 @@
        "      <td>5</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.688482</td>\n",
+       "      <td>2405</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>14</th>\n",
@@ -1989,7 +1972,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>4</td>\n",
-       "      <td>-0.531335</td>\n",
+       "      <td>210364.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>109</td>\n",
        "      <td>236.0</td>\n",
@@ -2003,7 +1986,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.746018</td>\n",
+       "      <td>786</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>15</th>\n",
@@ -2012,7 +1995,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.073426</td>\n",
+       "      <td>240624.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>109</td>\n",
        "      <td>58815.0</td>\n",
@@ -2026,7 +2009,7 @@
        "      <td>5</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.688482</td>\n",
+       "      <td>2405</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>16</th>\n",
@@ -2035,7 +2018,7 @@
        "      <td>3</td>\n",
        "      <td>9</td>\n",
        "      <td>4</td>\n",
-       "      <td>0.050146</td>\n",
+       "      <td>248790.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>109</td>\n",
        "      <td>13.0</td>\n",
@@ -2049,7 +2032,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.746018</td>\n",
+       "      <td>786</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>17</th>\n",
@@ -2058,7 +2041,7 @@
        "      <td>3</td>\n",
        "      <td>9</td>\n",
        "      <td>4</td>\n",
-       "      <td>0.217920</td>\n",
+       "      <td>259877.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>108</td>\n",
        "      <td>308.0</td>\n",
@@ -2072,7 +2055,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.746018</td>\n",
+       "      <td>786</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>18</th>\n",
@@ -2081,7 +2064,7 @@
        "      <td>3</td>\n",
        "      <td>20</td>\n",
        "      <td>11</td>\n",
-       "      <td>0.306687</td>\n",
+       "      <td>265743.0</td>\n",
        "      <td>2013.0</td>\n",
        "      <td>109</td>\n",
        "      <td>236.0</td>\n",
@@ -2095,7 +2078,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.746018</td>\n",
+       "      <td>786</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>19</th>\n",
@@ -2104,7 +2087,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.052982</td>\n",
+       "      <td>241975.0</td>\n",
        "      <td>2006.0</td>\n",
        "      <td>109</td>\n",
        "      <td>252.0</td>\n",
@@ -2118,7 +2101,7 @@
        "      <td>9</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.147940</td>\n",
+       "      <td>1461</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>20</th>\n",
@@ -2127,7 +2110,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.841823</td>\n",
+       "      <td>189846.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>108</td>\n",
        "      <td>10.0</td>\n",
@@ -2141,7 +2124,7 @@
        "      <td>9</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.147940</td>\n",
+       "      <td>1461</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>21</th>\n",
@@ -2150,7 +2133,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.036845</td>\n",
+       "      <td>247911.0</td>\n",
        "      <td>2003.0</td>\n",
        "      <td>109</td>\n",
        "      <td>298.0</td>\n",
@@ -2164,7 +2147,7 @@
        "      <td>9</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.147940</td>\n",
+       "      <td>1461</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>22</th>\n",
@@ -2187,7 +2170,7 @@
        "      <td>9</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.147940</td>\n",
+       "      <td>1461</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>23</th>\n",
@@ -2210,7 +2193,7 @@
        "      <td>15</td>\n",
        "      <td>18.0</td>\n",
        "      <td>4</td>\n",
-       "      <td>-0.866519</td>\n",
+       "      <td>650</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>24</th>\n",
@@ -2233,7 +2216,7 @@
        "      <td>15</td>\n",
        "      <td>18.0</td>\n",
        "      <td>4</td>\n",
-       "      <td>-0.866519</td>\n",
+       "      <td>650</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>25</th>\n",
@@ -2242,7 +2225,7 @@
        "      <td>3</td>\n",
        "      <td>11</td>\n",
        "      <td>7</td>\n",
-       "      <td>-1.728693</td>\n",
+       "      <td>131239.0</td>\n",
        "      <td>2006.0</td>\n",
        "      <td>58</td>\n",
        "      <td>546.0</td>\n",
@@ -2256,7 +2239,7 @@
        "      <td>15</td>\n",
        "      <td>18.0</td>\n",
        "      <td>4</td>\n",
-       "      <td>-0.866519</td>\n",
+       "      <td>650</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>26</th>\n",
@@ -2265,7 +2248,7 @@
        "      <td>3</td>\n",
        "      <td>11</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.934035</td>\n",
+       "      <td>307200.0</td>\n",
        "      <td>1998.0</td>\n",
        "      <td>109</td>\n",
        "      <td>1.0</td>\n",
@@ -2279,7 +2262,7 @@
        "      <td>15</td>\n",
        "      <td>18.0</td>\n",
        "      <td>4</td>\n",
-       "      <td>-0.866519</td>\n",
+       "      <td>650</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>27</th>\n",
@@ -2288,7 +2271,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.477796</td>\n",
+       "      <td>213902.0</td>\n",
        "      <td>2009.0</td>\n",
        "      <td>109</td>\n",
        "      <td>231.0</td>\n",
@@ -2302,7 +2285,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.849741</td>\n",
+       "      <td>2587</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>28</th>\n",
@@ -2311,7 +2294,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.390097</td>\n",
+       "      <td>271255.0</td>\n",
        "      <td>2008.0</td>\n",
        "      <td>109</td>\n",
        "      <td>292.0</td>\n",
@@ -2325,7 +2308,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.849741</td>\n",
+       "      <td>2587</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>29</th>\n",
@@ -2334,7 +2317,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.046983</td>\n",
+       "      <td>248581.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>152</td>\n",
        "      <td>62.0</td>\n",
@@ -2348,7 +2331,7 @@
        "      <td>13</td>\n",
        "      <td>34.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.850627</td>\n",
+       "      <td>2588</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>...</th>\n",
@@ -2380,7 +2363,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.453351</td>\n",
+       "      <td>275435.0</td>\n",
        "      <td>1996.0</td>\n",
        "      <td>107</td>\n",
        "      <td>162.0</td>\n",
@@ -2394,7 +2377,7 @@
        "      <td>15</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.570582</td>\n",
+       "      <td>984</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377389</th>\n",
@@ -2403,7 +2386,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.094363</td>\n",
+       "      <td>251712.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>108</td>\n",
        "      <td>24.0</td>\n",
@@ -2417,7 +2400,7 @@
        "      <td>15</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.570582</td>\n",
+       "      <td>984</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377390</th>\n",
@@ -2426,7 +2409,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>4</td>\n",
-       "      <td>0.865757</td>\n",
+       "      <td>302688.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>108</td>\n",
        "      <td>24.0</td>\n",
@@ -2440,7 +2423,7 @@
        "      <td>15</td>\n",
        "      <td>21.0</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.103695</td>\n",
+       "      <td>1745</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377391</th>\n",
@@ -2449,7 +2432,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.347409</td>\n",
+       "      <td>268434.0</td>\n",
        "      <td>2015.0</td>\n",
        "      <td>108</td>\n",
        "      <td>136.0</td>\n",
@@ -2463,7 +2446,7 @@
        "      <td>13</td>\n",
        "      <td>41.0</td>\n",
        "      <td>7</td>\n",
-       "      <td>-0.903733</td>\n",
+       "      <td>608</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377392</th>\n",
@@ -2472,7 +2455,7 @@
        "      <td>7</td>\n",
        "      <td>0</td>\n",
        "      <td>0</td>\n",
-       "      <td>0.701600</td>\n",
+       "      <td>291840.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>109</td>\n",
        "      <td>103.0</td>\n",
@@ -2486,7 +2469,7 @@
        "      <td>6</td>\n",
        "      <td>23.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>1.417693</td>\n",
+       "      <td>3228</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377393</th>\n",
@@ -2495,7 +2478,7 @@
        "      <td>7</td>\n",
        "      <td>0</td>\n",
        "      <td>0</td>\n",
-       "      <td>0.053309</td>\n",
+       "      <td>248999.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>109</td>\n",
        "      <td>103.0</td>\n",
@@ -2509,7 +2492,7 @@
        "      <td>6</td>\n",
        "      <td>23.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>1.417693</td>\n",
+       "      <td>3228</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377394</th>\n",
@@ -2518,7 +2501,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.306587</td>\n",
+       "      <td>225216.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>109</td>\n",
        "      <td>58815.0</td>\n",
@@ -2532,7 +2515,7 @@
        "      <td>15</td>\n",
        "      <td>22.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.668103</td>\n",
+       "      <td>2382</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377395</th>\n",
@@ -2541,7 +2524,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.351485</td>\n",
+       "      <td>222249.0</td>\n",
        "      <td>2013.0</td>\n",
        "      <td>108</td>\n",
        "      <td>17.0</td>\n",
@@ -2555,7 +2538,7 @@
        "      <td>15</td>\n",
        "      <td>22.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.668103</td>\n",
+       "      <td>2382</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377396</th>\n",
@@ -2564,7 +2547,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.924184</td>\n",
+       "      <td>306549.0</td>\n",
        "      <td>2007.0</td>\n",
        "      <td>109</td>\n",
        "      <td>148.0</td>\n",
@@ -2578,7 +2561,7 @@
        "      <td>15</td>\n",
        "      <td>22.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.668103</td>\n",
+       "      <td>2382</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377397</th>\n",
@@ -2587,7 +2570,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.561434</td>\n",
+       "      <td>208375.0</td>\n",
        "      <td>2003.0</td>\n",
        "      <td>109</td>\n",
        "      <td>252.0</td>\n",
@@ -2601,7 +2584,7 @@
        "      <td>13</td>\n",
        "      <td>18.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.450966</td>\n",
+       "      <td>1119</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377398</th>\n",
@@ -2624,7 +2607,7 @@
        "      <td>15</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>2.547395</td>\n",
+       "      <td>4503</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377399</th>\n",
@@ -2647,7 +2630,7 @@
        "      <td>15</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>2.547395</td>\n",
+       "      <td>4503</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377400</th>\n",
@@ -2656,7 +2639,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>4</td>\n",
-       "      <td>1.000436</td>\n",
+       "      <td>311588.0</td>\n",
        "      <td>2014.0</td>\n",
        "      <td>109</td>\n",
        "      <td>308.0</td>\n",
@@ -2670,7 +2653,7 @@
        "      <td>15</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>2.547395</td>\n",
+       "      <td>4503</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377401</th>\n",
@@ -2679,7 +2662,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>4</td>\n",
-       "      <td>-0.169290</td>\n",
+       "      <td>234289.0</td>\n",
        "      <td>2013.0</td>\n",
        "      <td>109</td>\n",
        "      <td>133.0</td>\n",
@@ -2693,7 +2676,7 @@
        "      <td>22</td>\n",
        "      <td>29.0</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.007060</td>\n",
+       "      <td>1620</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377402</th>\n",
@@ -2702,7 +2685,7 @@
        "      <td>0</td>\n",
        "      <td>20</td>\n",
        "      <td>10</td>\n",
-       "      <td>-1.199389</td>\n",
+       "      <td>166217.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>41</td>\n",
        "      <td>58.0</td>\n",
@@ -2716,7 +2699,7 @@
        "      <td>22</td>\n",
        "      <td>37.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>2.305506</td>\n",
+       "      <td>4230</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377403</th>\n",
@@ -2725,7 +2708,7 @@
        "      <td>0</td>\n",
        "      <td>20</td>\n",
        "      <td>10</td>\n",
-       "      <td>-0.311944</td>\n",
+       "      <td>224862.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>41</td>\n",
        "      <td>1.0</td>\n",
@@ -2739,7 +2722,7 @@
        "      <td>22</td>\n",
        "      <td>37.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>2.305506</td>\n",
+       "      <td>4230</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377404</th>\n",
@@ -2748,7 +2731,7 @@
        "      <td>0</td>\n",
        "      <td>20</td>\n",
        "      <td>10</td>\n",
-       "      <td>-0.914913</td>\n",
+       "      <td>185016.0</td>\n",
        "      <td>2015.0</td>\n",
        "      <td>41</td>\n",
        "      <td>14.0</td>\n",
@@ -2762,7 +2745,7 @@
        "      <td>22</td>\n",
        "      <td>37.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>2.305506</td>\n",
+       "      <td>4230</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377405</th>\n",
@@ -2771,7 +2754,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.619754</td>\n",
+       "      <td>204521.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>96</td>\n",
        "      <td>58815.0</td>\n",
@@ -2785,7 +2768,7 @@
        "      <td>4</td>\n",
        "      <td>28.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.675191</td>\n",
+       "      <td>2390</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377406</th>\n",
@@ -2794,7 +2777,7 @@
        "      <td>1</td>\n",
        "      <td>11</td>\n",
        "      <td>7</td>\n",
-       "      <td>-0.718312</td>\n",
+       "      <td>198008.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>128</td>\n",
        "      <td>76.0</td>\n",
@@ -2808,7 +2791,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>-0.240089</td>\n",
+       "      <td>1357</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377407</th>\n",
@@ -2817,7 +2800,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.155414</td>\n",
+       "      <td>235206.0</td>\n",
        "      <td>2015.0</td>\n",
        "      <td>108</td>\n",
        "      <td>31.0</td>\n",
@@ -2831,7 +2814,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>-0.225026</td>\n",
+       "      <td>1374</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377408</th>\n",
@@ -2840,7 +2823,7 @@
        "      <td>7</td>\n",
        "      <td>15</td>\n",
        "      <td>9</td>\n",
-       "      <td>-1.059686</td>\n",
+       "      <td>175449.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>141</td>\n",
        "      <td>58815.0</td>\n",
@@ -2854,7 +2837,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.813414</td>\n",
+       "      <td>2546</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377409</th>\n",
@@ -2877,7 +2860,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.813414</td>\n",
+       "      <td>2546</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377410</th>\n",
@@ -2886,7 +2869,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-1.086380</td>\n",
+       "      <td>173685.0</td>\n",
        "      <td>2003.0</td>\n",
        "      <td>109</td>\n",
        "      <td>291.0</td>\n",
@@ -2900,7 +2883,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>-1.200557</td>\n",
+       "      <td>273</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377411</th>\n",
@@ -2909,7 +2892,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.469367</td>\n",
+       "      <td>214459.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>109</td>\n",
        "      <td>291.0</td>\n",
@@ -2923,7 +2906,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>-1.200557</td>\n",
+       "      <td>273</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377412</th>\n",
@@ -2932,7 +2915,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.237462</td>\n",
+       "      <td>229784.0</td>\n",
        "      <td>2012.0</td>\n",
        "      <td>109</td>\n",
        "      <td>291.0</td>\n",
@@ -2946,7 +2929,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>-1.200557</td>\n",
+       "      <td>273</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377413</th>\n",
@@ -2969,7 +2952,7 @@
        "      <td>4</td>\n",
        "      <td>26.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>2.694478</td>\n",
+       "      <td>4669</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377414</th>\n",
@@ -2978,7 +2961,7 @@
        "      <td>7</td>\n",
        "      <td>15</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.273477</td>\n",
+       "      <td>227404.0</td>\n",
        "      <td>2015.0</td>\n",
        "      <td>109</td>\n",
        "      <td>1.0</td>\n",
@@ -2992,7 +2975,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>-0.058450</td>\n",
+       "      <td>1562</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377415</th>\n",
@@ -3001,7 +2984,7 @@
        "      <td>7</td>\n",
        "      <td>15</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.194026</td>\n",
+       "      <td>258298.0</td>\n",
        "      <td>2015.0</td>\n",
        "      <td>109</td>\n",
        "      <td>9.0</td>\n",
@@ -3015,7 +2998,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>-0.058450</td>\n",
+       "      <td>1562</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377416</th>\n",
@@ -3024,7 +3007,7 @@
        "      <td>0</td>\n",
        "      <td>5</td>\n",
        "      <td>7</td>\n",
-       "      <td>4.216968</td>\n",
+       "      <td>524146.0</td>\n",
        "      <td>2007.0</td>\n",
        "      <td>73</td>\n",
        "      <td>38.0</td>\n",
@@ -3038,7 +3021,7 @@
        "      <td>5</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.602479</td>\n",
+       "      <td>948</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377417</th>\n",
@@ -3047,7 +3030,7 @@
        "      <td>0</td>\n",
        "      <td>5</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.129380</td>\n",
+       "      <td>254026.0</td>\n",
        "      <td>1999.0</td>\n",
        "      <td>72</td>\n",
        "      <td>3.0</td>\n",
@@ -3061,7 +3044,7 @@
        "      <td>5</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.602479</td>\n",
+       "      <td>948</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
        "</table>\n",
@@ -3085,15 +3068,15 @@
        "         song_length  song_year  first_genre_type  artist_count  \\\n",
        "0                NaN        NaN               152           NaN   \n",
        "1                NaN        NaN               152           NaN   \n",
-       "2          -0.303863     2006.0                31         186.0   \n",
+       "2           225396.0     2006.0                31         186.0   \n",
        "3                NaN        NaN               152           NaN   \n",
-       "4          -0.872754     2016.0                 2          18.0   \n",
+       "4           187802.0     2016.0                 2          18.0   \n",
        "...              ...        ...               ...           ...   \n",
        "7377413          NaN        NaN               152           NaN   \n",
-       "7377414    -0.273477     2015.0               109           1.0   \n",
-       "7377415     0.194026     2015.0               109           9.0   \n",
-       "7377416     4.216968     2007.0                73          38.0   \n",
-       "7377417     0.129380     1999.0                72           3.0   \n",
+       "7377414     227404.0     2015.0               109           1.0   \n",
+       "7377415     258298.0     2015.0               109           9.0   \n",
+       "7377416     524146.0     2007.0                73          38.0   \n",
+       "7377417     254026.0     1999.0                72           3.0   \n",
        "\n",
        "         composer_count  lyricist_count  first_genre_typecount  featured_song  \\\n",
        "0                   NaN             NaN                    NaN            NaN   \n",
@@ -3122,22 +3105,22 @@
        "7377417       1.0       0.0            52     5   NaN               9   \n",
        "\n",
        "         registration_duration  \n",
-       "0                     0.420898  \n",
-       "1                     0.596334  \n",
-       "2                     0.596334  \n",
-       "3                     0.596334  \n",
-       "4                     0.420898  \n",
+       "0                         2103  \n",
+       "1                         2301  \n",
+       "2                         2301  \n",
+       "3                         2301  \n",
+       "4                         2103  \n",
        "...                        ...  \n",
-       "7377413               2.694478  \n",
-       "7377414              -0.058450  \n",
-       "7377415              -0.058450  \n",
-       "7377416              -0.602479  \n",
-       "7377417              -0.602479  \n",
+       "7377413                   4669  \n",
+       "7377414                   1562  \n",
+       "7377415                   1562  \n",
+       "7377416                    948  \n",
+       "7377417                    948  \n",
        "\n",
        "[7377418 rows x 20 columns]"
       ]
      },
-     "execution_count": 23,
+     "execution_count": 17,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -3148,7 +3131,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 24,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -3169,7 +3152,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 25,
    "metadata": {},
    "outputs": [
     {
@@ -3178,18 +3161,18 @@
        "1"
       ]
      },
-     "execution_count": 19,
+     "execution_count": 25,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "save(train, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\train_processed.pkl')"
+    "save(data_train, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\data_train.pkl')"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": 26,
    "metadata": {},
    "outputs": [
     {
@@ -3198,32 +3181,61 @@
        "1"
       ]
      },
-     "execution_count": 20,
+     "execution_count": 26,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "save(test, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\test_processed.pkl')"
+    "save(data_val, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\data_val.pkl')"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": 27,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1"
+      ]
+     },
+     "execution_count": 27,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
    "source": [
-    "train_pkl = load(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\train.pkl')"
+    "save(label_train, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\label_train.pkl')"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": 28,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1"
+      ]
+     },
+     "execution_count": 28,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
    "source": [
-    "test_pkl = load(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\test.pkl')"
+    "save(label_val, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\label_val.pkl')"
    ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
   }
  ],
  "metadata": {
diff --git a/tfn/notebooks/.ipynb_checkpoints/DataPreprocessing_FeatureEngineering_Pipeline_df1n19_SVM-checkpoint.ipynb b/tfn/notebooks/.ipynb_checkpoints/DataPreprocessing_FeatureEngineering_Pipeline_df1n19_SVM-checkpoint.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..229205f064ce571ee9fbcbd120ad15ce5efb053a
--- /dev/null
+++ b/tfn/notebooks/.ipynb_checkpoints/DataPreprocessing_FeatureEngineering_Pipeline_df1n19_SVM-checkpoint.ipynb
@@ -0,0 +1,509 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Debug record\n",
+    "1. def user_age(members): add else x at the end\n",
+    "2. def add_is_same_feature(songs): correct 'artist_name'\n",
+    "3. def songs_language_to_str(language):elif type(language) == float and not language.isnull():  # add  not language.isnull()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# import necessary pacakges\n",
+    "\n",
+    "import numpy as np\n",
+    "import pandas as pd\n",
+    "import datetime\n",
+    "import time\n",
+    "import re \n",
+    "\n",
+    "from sklearn.model_selection import train_test_split\n",
+    "from sklearn import preprocessing\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 1. Loading Data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# author@Fiona\n",
+    "# read data from csv files\n",
+    "members = pd.read_csv(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\members.csv',parse_dates=['registration_init_time','expiration_date'])\n",
+    "songs = pd.read_csv(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\songs.csv')\n",
+    "songs_extra = pd.read_csv(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\song_extra_info.csv')\n",
+    "train = pd.read_csv(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\train.csv')\n",
+    "test = pd.read_csv(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\test.csv')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Outlier preprocess for members.expiration_date row 16867\n",
+    "\n",
+    "members.expiration_date[16867] = members.registration_init_time[16867]\n",
+    "members.expiration_date[16867]"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 2. Data Preprocessing + Feature Extraction\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# song test file generate\n",
+    "songs0 = pd.read_csv(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\songs.csv')\n",
+    "songs_extra0 = pd.read_csv(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\song_extra_info.csv')\n",
+    "\n",
+    "songs = songs0.head(1048575)\n",
+    "songs_extra = songs_extra0.head(1048575)\n",
+    "del songs0\n",
+    "del songs_extra0\n",
+    "\n",
+    "# merge songinfo file\n",
+    "songs = songs.merge(songs_extra, on = 'song_id', how = 'left')\n",
+    "del songs_extra\n",
+    "\n",
+    "songs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# author@Fiona\n",
+    "# song feature extraction functions \n",
+    "\n",
+    "# get song_year feature from isrc code\n",
+    "def isrc_to_year(isrc):\n",
+    "    if type(isrc) == str:\n",
+    "        if int(isrc[5:7]) > 17:\n",
+    "            return 1900 + int(isrc[5:7])\n",
+    "        else:\n",
+    "            return 2000 + int(isrc[5:7])\n",
+    "    else:\n",
+    "        return np.nan\n",
+    "\n",
+    "# add new feature \n",
+    "def add_song_year(songs):\n",
+    "    songs['song_year'] = songs['isrc'].apply(lambda attribute: isrc_to_year(attribute))\n",
+    "    return songs\n",
+    "    \n",
+    "# add genre id counts feature 'popular genres'\n",
+    "def add_first_genre_type(songs):\n",
+    "    songs['first_genre_type'] = songs.genre_ids.apply(str).apply(lambda attribute: attribute.split('|')[0])\n",
+    "    return songs\n",
+    "\n",
+    "# get song played counts\n",
+    "# 循环完成计数并添加到新字典变量song_played_counts中 \n",
+    "# 再把song_played_counts和原表根据song_id拼接起来\n",
+    "#dictionary used to save times a song is played\n",
+    "#key = song_id, value = number of times the song's played\n",
+    "\n",
+    "def song_played_counts(songs):\n",
+    "    song_played_counts_dic = {}\n",
+    "    for song_id in songs['song_id']:\n",
+    "        if song_id not in song_played_counts_dic:\n",
+    "            song_played_counts_dic[song_id] = 1\n",
+    "        else:\n",
+    "            song_played_counts_dic[song_id] += 1\n",
+    "    \n",
+    "    return song_played_counts_dic\n",
+    "\n",
+    "# add song played counts feature 'hit songs'\n",
+    "def add_song_played_times(songs):\n",
+    "    song_played_times = song_played_counts(songs)\n",
+    "    new_song_played_times = pd.DataFrame(pd.Series(song_played_times), columns = ['song_played_times'])\n",
+    "    new_song_played_times = new_song_played_times.reset_index().rename(columns = {'index' : 'song_id'})\n",
+    "    songs = songs.merge(new_song_played_times, on = 'song_id', how = 'left')\n",
+    "    return songs\n",
+    "    \n",
+    "# add artist counts feature 'hot artist'\n",
+    "def add_artist_counts(songs):\n",
+    "    artistcount = songs.groupby(['artist_name'],as_index=False)['artist_name'].agg({'artist_count':'count'})\n",
+    "    songs = songs.merge(artistcount, on = 'artist_name', how = 'left')\n",
+    "    return songs\n",
+    "\n",
+    "# add composer played counts\n",
+    "## Count the number of times the composer has been listened\n",
+    "def add_composer_counts(songs):\n",
+    "    composercount = songs.groupby(['composer'],as_index=False)['composer'].agg({'composer_count':'count'})\n",
+    "    songs = songs.merge(composercount, on = 'composer', how = 'left')\n",
+    "    return songs\n",
+    "\n",
+    "\n",
+    "#add lyricist played counts\n",
+    "# Count the number of times the lyricist has been listened\n",
+    "def add_lyricist_counts(songs):\n",
+    "    lyricistcount = songs.groupby(['lyricist'],as_index=False)['lyricist'].agg({'lyricist_count':'count'})\n",
+    "    songs = songs.merge(lyricistcount, on = 'lyricist', how = 'left')\n",
+    "    return songs\n",
+    "\n",
+    "# add genre type counts 'popular genres'\n",
+    "# 分组要使用first genre type属性\n",
+    "def add_genere_counts(songs):\n",
+    "    genrecount = songs.groupby(['first_genre_type'],as_index = False)['first_genre_type'].agg({'first_genre_typecount':'count'})\n",
+    "    songs = songs.merge(genrecount, on = 'first_genre_type', how = 'left')\n",
+    "    return songs\n",
+    "\n",
+    "\n",
+    "# add feat feature \n",
+    "def add_feat_feature(songs):\n",
+    "    songs['featured_song'] = songs.apply(lambda attribute : 1 if 'feat' in str(attribute['artist_name'])else 0,\n",
+    "                                        axis = 1)\n",
+    "    return songs\n",
+    "    \n",
+    "\n",
+    "# add if_artist_composer_lyricist_are_same feature:\n",
+    "def add_is_same_feature(songs):\n",
+    "    songs['same_c_l'] = songs.apply(lambda attribute : 1 if attribute['composer'] == attribute['lyricist'] else 0, \n",
+    "                                    axis = 1 )\n",
+    "    songs['all_same'] = songs.apply(lambda attribute : 1 if attribute['artist_name'] == attribute['composer'] and \n",
+    "                                   attribute['composer'] == attribute['lyricist'] else 0, axis = 1)\n",
+    "    return songs\n",
+    "\n",
+    "\n",
+    "#deal with missing values\n",
+    "def songs_language_to_str(language):\n",
+    "    if language == -1.0 or np.isnan(language):\n",
+    "        return np.nan\n",
+    "    elif type(language) == float:\n",
+    "        return str(int(language)) \n",
+    "    else:\n",
+    "        return np.nan\n",
+    "    \n",
+    "def missing_value(songs):\n",
+    "    #deal with song_length missing value\n",
+    "    songs.song_length.fillna(songs.song_length.mean(), inplace = True)\n",
+    "    # deal with language missing value\n",
+    "    songs['song_language'] = songs['language'].apply(songs_language_to_str)\n",
+    "    return songs\n",
+    "\n",
+    "    \n",
+    "#delete unuseful features\n",
+    "def del_unuseful_feature(songs):\n",
+    "    songs = songs.drop('isrc', axis = 1)\n",
+    "    songs = songs.drop('name', axis = 1)\n",
+    "    songs = songs.drop('genre_ids', axis = 1)\n",
+    "    songs = songs.drop(['artist_name', 'composer', 'lyricist'], axis = 1)\n",
+    "    songs = songs.drop('language', axis = 1)\n",
+    "    return songs\n",
+    "    \n",
+    "# finish song features extraction"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# author@Karen\n",
+    "# member features extraction\n",
+    "# Convert time string to timestamp for calculate\n",
+    "def add_registration_duration(members):\n",
+    "    members.registration_init_time = members.registration_init_time.apply(lambda x : time.mktime(x.timetuple()))\n",
+    "    members.expiration_date = members.expiration_date.apply(lambda x : time.mktime(x.timetuple()))\n",
+    "    #count Duration\n",
+    "    members['registration_duration'] = ((members['expiration_date'] - members['registration_init_time'])/(24*60*60))\n",
+    "    members['registration_duration'] = members['registration_duration'].apply(int)\n",
+    "    return members\n",
+    "\n",
+    "#print (duration(members))\n",
+    "\n",
+    "#Using NAN replace the bd = 0\n",
+    "def user_age(members):\n",
+    "    members['bd'] = members['bd'].replace(0,np.nan)\n",
+    "    members['bd'] = members['bd'].apply(lambda x: np.nan if x < 12 or x > 65 else x) # else x\n",
+    "    return members\n",
+    "\n",
+    "#print (age(members))\n",
+    "\n",
+    "#drop unnecessary features\n",
+    "def delete_unuseful_features(members):\n",
+    "    members = members.drop(\"registration_init_time\",axis = 1)\n",
+    "    members = members.drop(\"expiration_date\",axis = 1)\n",
+    "    members = members.drop(\"gender\",axis = 1) \n",
+    "    return members\n",
+    "\n",
+    "# finish member features extraction"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#train and test feature extraction\n",
+    "\n",
+    "#feature_pipeline_song\n",
+    "feature_pipeline_song = [add_song_year, add_first_genre_type, add_artist_counts, add_composer_counts, \n",
+    "                         add_lyricist_counts, add_genere_counts, add_feat_feature, add_is_same_feature,\n",
+    "                         missing_value, del_unuseful_feature]\n",
+    "\n",
+    "# feature_pipeline_members \n",
+    "feature_pipeline_members = [add_registration_duration, user_age, delete_unuseful_features]"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "songs.head()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#apply pipeline functions\n",
+    "def apply_pipeline(data, pipelinefunctions):\n",
+    "    for function in pipelinefunctions:\n",
+    "        data = function(data)\n",
+    "    return data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "songs = apply_pipeline(songs, feature_pipeline_song)\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "songs.head()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "members = apply_pipeline(members, feature_pipeline_members)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "members.head()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# user operation feature extraction functions\n",
+    "train = train.merge(songs, on = 'song_id', how = 'left')\n",
+    "train = train.merge(members, on = 'msno', how = 'left')\n",
+    "\n",
+    "test = test.merge(songs, on = 'song_id', how = 'left')\n",
+    "test = test.merge(members, on = 'msno', how = 'left')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#labelencoding operation features\n",
+    "le = preprocessing.LabelEncoder()\n",
+    "transfer = ['msno', 'song_id', 'first_genre_type', 'source_system_tab', 'source_screen_name', 'source_type']\n",
+    "\n",
+    "def labelencoding(data, transfer):\n",
+    "    for i in transfer:\n",
+    "        data[i] = np.array(le.fit_transform(data[i].tolist()))\n",
+    "\n",
+    "\n",
+    "labelencoding(train, transfer)\n",
+    "labelencoding(test, transfer)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Standardize numerical data: registration_duration & song_length\n",
+    "\n",
+    "transfer_list = ['song_length','registration_duration']\n",
+    "def standardize(data, transfer_list):\n",
+    "    for i in transfer_list:\n",
+    "        data[i] = preprocessing.scale(data[i], axis=0, with_mean=True, with_std=True, copy=True)\n",
+    "        \n",
+    "standardize(train, transfer_list)\n",
+    "standardize(test, transfer_list)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Sparse label data from train dataset\n",
+    "\n",
+    "label = train.target.tolist()\n",
+    "train = train.drop('target', axis = 1)\n",
+    "\n",
+    "# training and validation dataset split 70:30 & shuffle\n",
+    "\n",
+    "data_train, data_val, label_train, label_val = train_test_split(train, label, test_size=0.3, shuffle=True )"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "train"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# save and load the data using pickle (Optional)\n",
+    "import pickle\n",
+    "\n",
+    "def save(obj, filename):\n",
+    "    with open(filename, 'wb') as output:  # Overwrites any existing file.\n",
+    "        pickle.dump(obj, output, pickle.HIGHEST_PROTOCOL)\n",
+    "    return 1\n",
+    "\n",
+    "##-- Load obj from file    \n",
+    "def load(filename):\n",
+    "    with open(filename, 'rb') as input: \n",
+    "        obj = pickle.load(input)\n",
+    "    return obj   "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1"
+      ]
+     },
+     "execution_count": 19,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "save(train, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\train_processed.pkl')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1"
+      ]
+     },
+     "execution_count": 20,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "save(test, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\test_processed.pkl')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "train_pkl = load(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\train.pkl')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "test_pkl = load(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\test.pkl')"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.7.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/tfn/notebooks/.ipynb_checkpoints/EDA_continued-checkpoint.ipynb b/tfn/notebooks/.ipynb_checkpoints/EDA_continued-checkpoint.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..3d0129935bfa1f75628eb9c93e58c4e34a2b180a
--- /dev/null
+++ b/tfn/notebooks/.ipynb_checkpoints/EDA_continued-checkpoint.ipynb
@@ -0,0 +1,2061 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import pandas as pd\n",
+    "import numpy as np\n",
+    "import matplotlib.pyplot as plt\n",
+    "import seaborn as sns\n",
+    "import os"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 1. Member Data Exploration"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## STEPS:\n",
+    "1. Transform datatime to string\n",
+    "2. Calculate the amount of 'NaN'\n",
+    "3. Data summarization -- > distinct data\n",
+    "4. bd -- > find out outliers\n",
+    "5. Distribution of categorical data"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 1. Train Data Exploration"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "train = pd.read_csv('D:/Project/DS/Data Mining/cw1/kkbox_recommendation/data/train.csv')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "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>msno</th>\n",
+       "      <th>song_id</th>\n",
+       "      <th>source_system_tab</th>\n",
+       "      <th>source_screen_name</th>\n",
+       "      <th>source_type</th>\n",
+       "      <th>target</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <td>0</td>\n",
+       "      <td>FGtllVqz18RPiwJj/edr2gV78zirAiY/9SmYvia+kCg=</td>\n",
+       "      <td>BBzumQNXUHKdEBOB7mAJuzok+IJA1c2Ryg/yzTF6tik=</td>\n",
+       "      <td>explore</td>\n",
+       "      <td>Explore</td>\n",
+       "      <td>online-playlist</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <td>1</td>\n",
+       "      <td>Xumu+NIjS6QYVxDS4/t3SawvJ7viT9hPKXmf0RtLNx8=</td>\n",
+       "      <td>bhp/MpSNoqoxOIB+/l8WPqu6jldth4DIpCm3ayXnJqM=</td>\n",
+       "      <td>my library</td>\n",
+       "      <td>Local playlist more</td>\n",
+       "      <td>local-playlist</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <td>2</td>\n",
+       "      <td>Xumu+NIjS6QYVxDS4/t3SawvJ7viT9hPKXmf0RtLNx8=</td>\n",
+       "      <td>JNWfrrC7zNN7BdMpsISKa4Mw+xVJYNnxXh3/Epw7QgY=</td>\n",
+       "      <td>my library</td>\n",
+       "      <td>Local playlist more</td>\n",
+       "      <td>local-playlist</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <td>3</td>\n",
+       "      <td>Xumu+NIjS6QYVxDS4/t3SawvJ7viT9hPKXmf0RtLNx8=</td>\n",
+       "      <td>2A87tzfnJTSWqD7gIZHisolhe4DMdzkbd6LzO1KHjNs=</td>\n",
+       "      <td>my library</td>\n",
+       "      <td>Local playlist more</td>\n",
+       "      <td>local-playlist</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <td>4</td>\n",
+       "      <td>FGtllVqz18RPiwJj/edr2gV78zirAiY/9SmYvia+kCg=</td>\n",
+       "      <td>3qm6XTZ6MOCU11x8FIVbAGH5l5uMkT3/ZalWG1oo2Gc=</td>\n",
+       "      <td>explore</td>\n",
+       "      <td>Explore</td>\n",
+       "      <td>online-playlist</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "                                           msno  \\\n",
+       "0  FGtllVqz18RPiwJj/edr2gV78zirAiY/9SmYvia+kCg=   \n",
+       "1  Xumu+NIjS6QYVxDS4/t3SawvJ7viT9hPKXmf0RtLNx8=   \n",
+       "2  Xumu+NIjS6QYVxDS4/t3SawvJ7viT9hPKXmf0RtLNx8=   \n",
+       "3  Xumu+NIjS6QYVxDS4/t3SawvJ7viT9hPKXmf0RtLNx8=   \n",
+       "4  FGtllVqz18RPiwJj/edr2gV78zirAiY/9SmYvia+kCg=   \n",
+       "\n",
+       "                                        song_id source_system_tab  \\\n",
+       "0  BBzumQNXUHKdEBOB7mAJuzok+IJA1c2Ryg/yzTF6tik=           explore   \n",
+       "1  bhp/MpSNoqoxOIB+/l8WPqu6jldth4DIpCm3ayXnJqM=        my library   \n",
+       "2  JNWfrrC7zNN7BdMpsISKa4Mw+xVJYNnxXh3/Epw7QgY=        my library   \n",
+       "3  2A87tzfnJTSWqD7gIZHisolhe4DMdzkbd6LzO1KHjNs=        my library   \n",
+       "4  3qm6XTZ6MOCU11x8FIVbAGH5l5uMkT3/ZalWG1oo2Gc=           explore   \n",
+       "\n",
+       "    source_screen_name      source_type  target  \n",
+       "0              Explore  online-playlist       1  \n",
+       "1  Local playlist more   local-playlist       1  \n",
+       "2  Local playlist more   local-playlist       1  \n",
+       "3  Local playlist more   local-playlist       1  \n",
+       "4              Explore  online-playlist       1  "
+      ]
+     },
+     "execution_count": 7,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "train.head()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "msno                  7377418\n",
+       "song_id               7377418\n",
+       "source_system_tab     7352569\n",
+       "source_screen_name    6962614\n",
+       "source_type           7355879\n",
+       "target                7377418\n",
+       "dtype: int64"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "train.count()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def summarize(data): \n",
+    "    summary = dict()    \n",
+    "\n",
+    "    total_row, total_column = data.shape\n",
+    "    for column in data.columns:\n",
+    "        summary[column] = data[column].nunique() # len(set(data[column]))--> missing data is also counted\n",
+    "    \n",
+    "    print('Total number of records:{}'.format(total_row))\n",
+    "    for key, value in summary.items():\n",
+    "        print('The distinct {} in records:{}'.format(key, value))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def count_nan(data):\n",
+    "    total_row, total_column = data.shape\n",
+    "    total_nan = [(0, 0) for _ in range(total_column)]\n",
+    "                 \n",
+    "    df = pd.DataFrame(total_nan, columns = ['Nan_count', 'Percentage'], index = data.columns)\n",
+    "   # result.astype({'Percentage':float})\n",
+    "\n",
+    "    for column in data.columns:\n",
+    "        number_nan = data[column].isnull().sum()\n",
+    "        df.loc[column][0] = number_nan\n",
+    "        df.loc[column][1] = number_nan/total_row * 100\n",
+    "    convert_dict = {\n",
+    "        'Nan_count': int,\n",
+    "        'Percentage': float\n",
+    "    }\n",
+    "\n",
+    "    df = df.astype(convert_dict)\n",
+    "    return df"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 1.1 Get the distinct count number in train data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "array(['explore', 'my library', 'search', 'discover', nan, 'radio',\n",
+       "       'listen with', 'notification', 'settings'], dtype=object)"
+      ]
+     },
+     "execution_count": 12,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "train.source_system_tab.unique()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "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>target</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>count</th>\n",
+       "      <td>7.377418e+06</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>mean</th>\n",
+       "      <td>5.035171e-01</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>std</th>\n",
+       "      <td>4.999877e-01</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>min</th>\n",
+       "      <td>0.000000e+00</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>25%</th>\n",
+       "      <td>0.000000e+00</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>50%</th>\n",
+       "      <td>1.000000e+00</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>75%</th>\n",
+       "      <td>1.000000e+00</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>max</th>\n",
+       "      <td>1.000000e+00</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "             target\n",
+       "count  7.377418e+06\n",
+       "mean   5.035171e-01\n",
+       "std    4.999877e-01\n",
+       "min    0.000000e+00\n",
+       "25%    0.000000e+00\n",
+       "50%    1.000000e+00\n",
+       "75%    1.000000e+00\n",
+       "max    1.000000e+00"
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "train.describe()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "0.007342677343211405\n"
+     ]
+    }
+   ],
+   "source": [
+    "n = len(train.source_screen_name)\n",
+    "count = 0\n",
+    "for test in train.source_screen_name:\n",
+    "    if test == 'Unknown':\n",
+    "        count += 1\n",
+    "print(count/n)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Total number of records:7377418\n",
+      "The distinct msno in records:30755\n",
+      "The distinct song_id in records:359966\n",
+      "The distinct source_system_tab in records:8\n",
+      "The distinct source_screen_name in records:20\n",
+      "The distinct source_type in records:12\n",
+      "The distinct target in records:2\n"
+     ]
+    }
+   ],
+   "source": [
+    "summarize(train)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# 1.2 Get the total number of missing data in member data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "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>Nan_count</th>\n",
+       "      <th>Percentage</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>msno</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>song_id</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>source_system_tab</th>\n",
+       "      <td>24849</td>\n",
+       "      <td>0.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>source_screen_name</th>\n",
+       "      <td>414804</td>\n",
+       "      <td>5.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>source_type</th>\n",
+       "      <td>21539</td>\n",
+       "      <td>0.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>target</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0.0</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "                    Nan_count  Percentage\n",
+       "msno                        0         0.0\n",
+       "song_id                     0         0.0\n",
+       "source_system_tab       24849         0.0\n",
+       "source_screen_name     414804         5.0\n",
+       "source_type             21539         0.0\n",
+       "target                      0         0.0"
+      ]
+     },
+     "execution_count": 16,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "count_nan(train)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "a = train.groupby('source_type').size()\n",
+    "a = pd.DataFrame(a)\n",
+    "a.reset_index(level=0, inplace=True)\n",
+    "a.columns = ['Source System Tab', 'Count']\n",
+    "a = a.sort_values(by='Count', ascending=False)\n",
+    "print(a)\n",
+    "plt.rcParams[\"axes.labelsize\"] = 15\n",
+    "ax = sns.catplot(x='Source System Tab', y='Count', kind='bar',\n",
+    "                 data=a, height=6, palette='ch:2.5,-.2,dark=.4', aspect=1.5)\n",
+    "ax.fig.suptitle('Distribution of Source System Tab', fontsize=15)\n",
+    "ax.fig.subplots_adjust(top=.9)\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "  Source System Tab    Count\n",
+      "3        my library  3684730\n",
+      "0          discover  2179252\n",
+      "6            search   623286\n",
+      "5             radio   476701\n",
+      "2       listen with   212266\n",
+      "1           explore   167949\n",
+      "4      notification     6185\n",
+      "7          settings     2200\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 648x432 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "a = train.groupby('source_system_tab').size()\n",
+    "a = pd.DataFrame(a)\n",
+    "a.reset_index(level=0, inplace=True)\n",
+    "a.columns = ['Source System Tab', 'Count']\n",
+    "a = a.sort_values(by='Count', ascending=False)\n",
+    "print(a)\n",
+    "plt.rcParams[\"axes.labelsize\"] = 15\n",
+    "ax = sns.catplot(x='Source System Tab', y='Count', kind='bar',\n",
+    "                 data=a, height=6, palette='ch:2.5,-.2,dark=.4', aspect=1.5)\n",
+    "ax.fig.suptitle('Distribution of Source System Tab', fontsize=15)\n",
+    "ax.fig.subplots_adjust(top=.9)\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "                     target\n",
+      "source_system_tab          \n",
+      "my library         0.619659\n",
+      "settings           0.590909\n",
+      "explore            0.422146\n",
+      "search             0.421362\n",
+      "discover           0.415770\n",
+      "notification       0.378011\n",
+      "listen with        0.326581\n",
+      "radio              0.222662\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 648x432 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "repeat_df = train.groupby(['source_system_tab']).mean(\n",
+    ").sort_values(by='target', ascending=False)\n",
+    "print(repeat_df)\n",
+    "\n",
+    "repeat_df.reset_index(level=0, inplace=True)\n",
+    "repeat_df.columns = ['Source System Tab', 'Target']\n",
+    "plt.rcParams[\"axes.labelsize\"] = 15\n",
+    "ax = sns.catplot(x='Source System Tab', y='Target', kind='bar', palette=\"ch:7,-.2,dark=.4\",\n",
+    "                 data=repeat_df, height=6, aspect=1.5)\n",
+    "ax.fig.subplots_adjust(top=.9)\n",
+    "ax.fig.suptitle('Source System Tab v/s Target', fontsize=15)\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 756x504 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "Type = train.groupby(['song_id']).sum().sort_values(\n",
+    "    by='target', ascending=False)\n",
+    "Type.reset_index(level=0, inplace=True)\n",
+    "Type.columns = ['Source Type', 'Views/user']\n",
+    "\n",
+    "new = Type.groupby(['Views/user']).count()\n",
+    "new.reset_index(inplace=True)\n",
+    "new.columns = ['Views/user', 'Log_Count']\n",
+    "new['Log_Count'] = np.log(new.Log_Count)\n",
+    "plt.rcParams[\"axes.labelsize\"] = 15\n",
+    "ax = sns.catplot(x='Views/user', y='Log_Count', kind='strip', color='blue', height=7, aspect=1.5,\n",
+    "                 data=new)\n",
+    "ax.fig.subplots_adjust(top=.9)\n",
+    "ax.fig.suptitle('Distribution of Views', fontsize=15)\n",
+    "\n",
+    "for a in ax.axes.flat:\n",
+    "    labels = a.get_xticklabels() # get x labels\n",
+    "    for i,l in enumerate(labels):\n",
+    "        if(i%100 != 0): labels[i] = '' # skip non-10 digits labels\n",
+    "    ax.set_xticklabels(labels, rotation = 0) # set new lab\n",
+    "\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 2. Member Data Exploration"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "member = pd.read_csv('members.csv')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 85,
+   "metadata": {},
+   "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>msno</th>\n",
+       "      <th>city</th>\n",
+       "      <th>bd</th>\n",
+       "      <th>gender</th>\n",
+       "      <th>registered_via</th>\n",
+       "      <th>registration_init_time</th>\n",
+       "      <th>expiration_date</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>XQxgAYj3klVKjR3oxPPXYYFp4soD4TuBghkhMTD4oTw=</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>NA</td>\n",
+       "      <td>7</td>\n",
+       "      <td>2011-08-20</td>\n",
+       "      <td>2017-09-20</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>UizsfmJb9mV54qE9hCYyU07Va97c0lCRLEQX3ae+ztM=</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>NA</td>\n",
+       "      <td>7</td>\n",
+       "      <td>2015-06-28</td>\n",
+       "      <td>2017-06-22</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>D8nEhsIOBSoE6VthTaqDX8U6lqjJ7dLdr72mOyLya2A=</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>NA</td>\n",
+       "      <td>4</td>\n",
+       "      <td>2016-04-11</td>\n",
+       "      <td>2017-07-12</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>mCuD+tZ1hERA/o5GPqk38e041J8ZsBaLcu7nGoIIvhI=</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>NA</td>\n",
+       "      <td>9</td>\n",
+       "      <td>2015-09-06</td>\n",
+       "      <td>2015-09-07</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>q4HRBfVSssAFS9iRfxWrohxuk9kCYMKjHOEagUMV6rQ=</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>NA</td>\n",
+       "      <td>4</td>\n",
+       "      <td>2017-01-26</td>\n",
+       "      <td>2017-06-13</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "                                           msno  city  bd gender  \\\n",
+       "0  XQxgAYj3klVKjR3oxPPXYYFp4soD4TuBghkhMTD4oTw=     1   0     NA   \n",
+       "1  UizsfmJb9mV54qE9hCYyU07Va97c0lCRLEQX3ae+ztM=     1   0     NA   \n",
+       "2  D8nEhsIOBSoE6VthTaqDX8U6lqjJ7dLdr72mOyLya2A=     1   0     NA   \n",
+       "3  mCuD+tZ1hERA/o5GPqk38e041J8ZsBaLcu7nGoIIvhI=     1   0     NA   \n",
+       "4  q4HRBfVSssAFS9iRfxWrohxuk9kCYMKjHOEagUMV6rQ=     1   0     NA   \n",
+       "\n",
+       "   registered_via registration_init_time expiration_date  \n",
+       "0               7             2011-08-20      2017-09-20  \n",
+       "1               7             2015-06-28      2017-06-22  \n",
+       "2               4             2016-04-11      2017-07-12  \n",
+       "3               9             2015-09-06      2015-09-07  \n",
+       "4               4             2017-01-26      2017-06-13  "
+      ]
+     },
+     "execution_count": 85,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "member.head()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "songs = pd.read_csv('songs.csv')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "metadata": {},
+   "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>song_id</th>\n",
+       "      <th>song_length</th>\n",
+       "      <th>genre_ids</th>\n",
+       "      <th>artist_name</th>\n",
+       "      <th>composer</th>\n",
+       "      <th>lyricist</th>\n",
+       "      <th>language</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>CXoTN1eb7AI+DntdU1vbcwGRV4SCIDxZu+YD8JP8r4E=</td>\n",
+       "      <td>247640</td>\n",
+       "      <td>465</td>\n",
+       "      <td>張信哲 (Jeff Chang)</td>\n",
+       "      <td>董貞</td>\n",
+       "      <td>何啟弘</td>\n",
+       "      <td>3.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>o0kFgae9QtnYgRkVPqLJwa05zIhRlUjfF7O1tDw0ZDU=</td>\n",
+       "      <td>197328</td>\n",
+       "      <td>444</td>\n",
+       "      <td>BLACKPINK</td>\n",
+       "      <td>TEDDY|  FUTURE BOUNCE|  Bekuh BOOM</td>\n",
+       "      <td>TEDDY</td>\n",
+       "      <td>31.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>DwVvVurfpuz+XPuFvucclVQEyPqcpUkHR0ne1RQzPs0=</td>\n",
+       "      <td>231781</td>\n",
+       "      <td>465</td>\n",
+       "      <td>SUPER JUNIOR</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>31.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>dKMBWoZyScdxSkihKG+Vf47nc18N9q4m58+b4e7dSSE=</td>\n",
+       "      <td>273554</td>\n",
+       "      <td>465</td>\n",
+       "      <td>S.H.E</td>\n",
+       "      <td>湯小康</td>\n",
+       "      <td>徐世珍</td>\n",
+       "      <td>3.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>W3bqWd3T+VeHFzHAUfARgW9AvVRaF4N5Yzm4Mr6Eo/o=</td>\n",
+       "      <td>140329</td>\n",
+       "      <td>726</td>\n",
+       "      <td>貴族精選</td>\n",
+       "      <td>Traditional</td>\n",
+       "      <td>Traditional</td>\n",
+       "      <td>52.0</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "                                        song_id  song_length genre_ids  \\\n",
+       "0  CXoTN1eb7AI+DntdU1vbcwGRV4SCIDxZu+YD8JP8r4E=       247640       465   \n",
+       "1  o0kFgae9QtnYgRkVPqLJwa05zIhRlUjfF7O1tDw0ZDU=       197328       444   \n",
+       "2  DwVvVurfpuz+XPuFvucclVQEyPqcpUkHR0ne1RQzPs0=       231781       465   \n",
+       "3  dKMBWoZyScdxSkihKG+Vf47nc18N9q4m58+b4e7dSSE=       273554       465   \n",
+       "4  W3bqWd3T+VeHFzHAUfARgW9AvVRaF4N5Yzm4Mr6Eo/o=       140329       726   \n",
+       "\n",
+       "        artist_name                            composer     lyricist  language  \n",
+       "0  張信哲 (Jeff Chang)                                  董貞          何啟弘       3.0  \n",
+       "1         BLACKPINK  TEDDY|  FUTURE BOUNCE|  Bekuh BOOM        TEDDY      31.0  \n",
+       "2      SUPER JUNIOR                                 NaN          NaN      31.0  \n",
+       "3             S.H.E                                 湯小康          徐世珍       3.0  \n",
+       "4              貴族精選                         Traditional  Traditional      52.0  "
+      ]
+     },
+     "execution_count": 28,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "songs.head()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "metadata": {},
+   "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>msno</th>\n",
+       "      <th>city</th>\n",
+       "      <th>bd</th>\n",
+       "      <th>gender</th>\n",
+       "      <th>registered_via</th>\n",
+       "      <th>registration_init_time</th>\n",
+       "      <th>expiration_date</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>XQxgAYj3klVKjR3oxPPXYYFp4soD4TuBghkhMTD4oTw=</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>7</td>\n",
+       "      <td>20110820</td>\n",
+       "      <td>20170920</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>UizsfmJb9mV54qE9hCYyU07Va97c0lCRLEQX3ae+ztM=</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>7</td>\n",
+       "      <td>20150628</td>\n",
+       "      <td>20170622</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>D8nEhsIOBSoE6VthTaqDX8U6lqjJ7dLdr72mOyLya2A=</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>4</td>\n",
+       "      <td>20160411</td>\n",
+       "      <td>20170712</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>mCuD+tZ1hERA/o5GPqk38e041J8ZsBaLcu7nGoIIvhI=</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>9</td>\n",
+       "      <td>20150906</td>\n",
+       "      <td>20150907</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>q4HRBfVSssAFS9iRfxWrohxuk9kCYMKjHOEagUMV6rQ=</td>\n",
+       "      <td>1</td>\n",
+       "      <td>0</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>4</td>\n",
+       "      <td>20170126</td>\n",
+       "      <td>20170613</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "                                           msno  city  bd gender  \\\n",
+       "0  XQxgAYj3klVKjR3oxPPXYYFp4soD4TuBghkhMTD4oTw=     1   0    NaN   \n",
+       "1  UizsfmJb9mV54qE9hCYyU07Va97c0lCRLEQX3ae+ztM=     1   0    NaN   \n",
+       "2  D8nEhsIOBSoE6VthTaqDX8U6lqjJ7dLdr72mOyLya2A=     1   0    NaN   \n",
+       "3  mCuD+tZ1hERA/o5GPqk38e041J8ZsBaLcu7nGoIIvhI=     1   0    NaN   \n",
+       "4  q4HRBfVSssAFS9iRfxWrohxuk9kCYMKjHOEagUMV6rQ=     1   0    NaN   \n",
+       "\n",
+       "   registered_via  registration_init_time  expiration_date  \n",
+       "0               7                20110820         20170920  \n",
+       "1               7                20150628         20170622  \n",
+       "2               4                20160411         20170712  \n",
+       "3               9                20150906         20150907  \n",
+       "4               4                20170126         20170613  "
+      ]
+     },
+     "execution_count": 29,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "member.head()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "member.registration_init_time = pd.to_datetime(member.registration_init_time.astype('str'))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 31,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "member.expiration_date = pd.to_datetime(member.expiration_date.astype('str'))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "metadata": {},
+   "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>city</th>\n",
+       "      <th>bd</th>\n",
+       "      <th>registered_via</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>count</th>\n",
+       "      <td>34403.000000</td>\n",
+       "      <td>34403.000000</td>\n",
+       "      <td>34403.000000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>mean</th>\n",
+       "      <td>5.371276</td>\n",
+       "      <td>12.280935</td>\n",
+       "      <td>5.953376</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>std</th>\n",
+       "      <td>6.243929</td>\n",
+       "      <td>18.170251</td>\n",
+       "      <td>2.287534</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>min</th>\n",
+       "      <td>1.000000</td>\n",
+       "      <td>-43.000000</td>\n",
+       "      <td>3.000000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>25%</th>\n",
+       "      <td>1.000000</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>4.000000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>50%</th>\n",
+       "      <td>1.000000</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>7.000000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>75%</th>\n",
+       "      <td>10.000000</td>\n",
+       "      <td>25.000000</td>\n",
+       "      <td>9.000000</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>max</th>\n",
+       "      <td>22.000000</td>\n",
+       "      <td>1051.000000</td>\n",
+       "      <td>16.000000</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "               city            bd  registered_via\n",
+       "count  34403.000000  34403.000000    34403.000000\n",
+       "mean       5.371276     12.280935        5.953376\n",
+       "std        6.243929     18.170251        2.287534\n",
+       "min        1.000000    -43.000000        3.000000\n",
+       "25%        1.000000      0.000000        4.000000\n",
+       "50%        1.000000      0.000000        7.000000\n",
+       "75%       10.000000     25.000000        9.000000\n",
+       "max       22.000000   1051.000000       16.000000"
+      ]
+     },
+     "execution_count": 32,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "member.describe()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 2.1 Get the distinct count number in member data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 33,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Total number of records:34403\n",
+      "The distinct msno in records:34403\n",
+      "The distinct city in records:21\n",
+      "The distinct bd in records:95\n",
+      "The distinct gender in records:2\n",
+      "The distinct registered_via in records:6\n",
+      "The distinct registration_init_time in records:3862\n",
+      "The distinct expiration_date in records:1484\n"
+     ]
+    }
+   ],
+   "source": [
+    "summarize(member)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 2.2 Get the total number of missing data in member data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "metadata": {},
+   "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>Nan_count</th>\n",
+       "      <th>Percentage</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>msno</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>city</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>bd</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>gender</th>\n",
+       "      <td>19902</td>\n",
+       "      <td>57.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>registered_via</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>registration_init_time</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>expiration_date</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0.0</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "                        Nan_count  Percentage\n",
+       "msno                            0         0.0\n",
+       "city                            0         0.0\n",
+       "bd                              0         0.0\n",
+       "gender                      19902        57.0\n",
+       "registered_via                  0         0.0\n",
+       "registration_init_time          0         0.0\n",
+       "expiration_date                 0         0.0"
+      ]
+     },
+     "execution_count": 34,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "count_nan(member)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 2.3 The distribution of categorical variables"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "#### The distribution of age"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 35,
+   "metadata": {},
+   "outputs": [
+    {
+     "ename": "NameError",
+     "evalue": "name 'index' is not defined",
+     "output_type": "error",
+     "traceback": [
+      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
+      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
+      "\u001b[1;32m<ipython-input-35-c17665332d8f>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mindex\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
+      "\u001b[1;31mNameError\u001b[0m: name 'index' is not defined"
+     ]
+    }
+   ],
+   "source": [
+    "index"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bd = member.groupby(['bd']).size()\n",
+    "bd = pd.DataFrame(bd)\n",
+    "bd.reset_index(level=0, inplace=True)\n",
+    "bd.columns = ['Age', 'Count']\n",
+    "\n",
+    "plt.rcParams[\"axes.labelsize\"] = 15\n",
+    "ax = sns.catplot(x='Age', y='Count', kind='bar', palette=\"ch:2,0.3,dark=.4\",\n",
+    "                 data=bd, height=6, aspect=1.5)\n",
+    "#ax.fig.subplots_adjust(top=.9)\n",
+    "ax.fig.suptitle('Distribution of member age', fontsize=15)\n",
+    "\n",
+    "for a in ax.axes.flat:\n",
+    "    labels = a.get_xticklabels() # get x labels\n",
+    "    for i,l in enumerate(labels):\n",
+    "        if(i%2 != 0): labels[i] = '' # skip non-10 digits labels\n",
+    "    ax.set_xticklabels(labels, rotation = 0) # set new lab\n",
+    "\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bd.describe()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "#### The distribution of age > 0"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [],
+   "source": [
+    "bd = member.groupby(['bd']).size()\n",
+    "bd = pd.DataFrame(bd)\n",
+    "bd.reset_index(level=0, inplace=True)\n",
+    "bd.columns = ['Age', 'Count']\n",
+    "bd = bd[(bd['Age'] > 0) & (bd['Age'] <= 80)  ]\n",
+    "\n",
+    "plt.rcParams[\"axes.labelsize\"] = 15\n",
+    "ax = sns.catplot(x='Age', y='Count', kind='bar', palette=\"ch:2,0.3,dark=.4\",\n",
+    "                 data=bd, height=6, aspect=1.5)\n",
+    "#ax.fig.subplots_adjust(top=.9)\n",
+    "ax.fig.suptitle('Distribution of member age', fontsize=15)\n",
+    "for a in ax.axes.flat:\n",
+    "    labels = a.get_xticklabels() # get x labels\n",
+    "    for i,l in enumerate(labels):\n",
+    "        if(i%2 != 0): labels[i] = '' # skip non-10 digits labels\n",
+    "    ax.set_xticklabels(labels, rotation = 0) # set new lab\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "bd.describe()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "#### Distribution of City IDs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 51,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 648x432 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "city = member.groupby(['city']).size()\n",
+    "city = pd.DataFrame(city)\n",
+    "city.reset_index(level=0, inplace=True)\n",
+    "city.columns = ['City_ID', 'Count']\n",
+    "\n",
+    "plt.rcParams[\"axes.labelsize\"] = 15\n",
+    "ax = sns.catplot(x='City_ID', y='Count', kind='bar', palette=\"ch:3,0.6,dark=.5\",\n",
+    "                 data=city, height=6, aspect=1.5)## 3. Train Data Exploration\n",
+    "\n",
+    "train = pd.read_csv('train.csv')"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "#### Distribution of Gender"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 50,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 648x432 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "member['gender'] = member.gender.replace(np.NaN, 'NA')\n",
+    "plt.rcParams[\"axes.labelsize\"] = 15\n",
+    "ax = sns.catplot(x='gender', kind='count', palette=\"ch:17,0.6,dark=.5\",\n",
+    "                 data=member, height=6, aspect=1.5)\n",
+    "ax.fig.subplots_adjust(top=.9)\n",
+    "ax.fig.suptitle('Distribution of Gender', fontsize=15)\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 3. Songs Data Exploration"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "songs = pd.read_csv('songs.csv')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "summarize(songs)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "count_nan(songs)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "songs.describe()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "for n in songs.genre_ids.values:\n",
+    "    if len(str(n)) > 5:\n",
+    "        print(n)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 36,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 648x432 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "language = songs.groupby(['language']).size()\n",
+    "language = pd.DataFrame(language)\n",
+    "language.reset_index(level=0, inplace=True)\n",
+    "language.columns = ['Language', 'Count']\n",
+    "language = language.sort_values(by='Count', ascending=False)\n",
+    "language['Language'] = language['Language'].astype('str')\n",
+    "ax = sns.catplot(x='Language', y='Count', kind='bar', order=language['Language'],\n",
+    "                 palette=\"ch:10,-0.1,dark=.4\", data=language, height=6, aspect=1.5)\n",
+    "ax.fig.subplots_adjust(top=.9)\n",
+    "ax.fig.suptitle('Distribution of Language of the songs', fontsize=15)\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 63,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "count    2.296320e+06\n",
+      "mean     4.116558e+00\n",
+      "std      2.682000e+00\n",
+      "min      3.083333e-03\n",
+      "25%      3.060000e+00\n",
+      "50%      3.777117e+00\n",
+      "75%      4.621150e+00\n",
+      "max      2.028975e+02\n",
+      "Name: song_length, dtype: float64\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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RxwBFNfM7bfffmzYsGGP7e+55x4+/OEPc+mll06pHzJJkqaLn/3sZ1xxxRWsXLmSVatWTXZzdjOwVWT+/PnMnTsXqDawAdxxxx309fVx6KGH7l53xBFHsGXLFrZu3QrAjh07uPTSS4kI1q5dy3XXXVdJGyRJ2lsMDAzwta99jQMOOIClS5dy5ZVXsmXLlsluFmBgq9SiRYuA6gPbxo0bWbx4MbNnz969rtEtumbNGjKT5cuXs3XrVl7zmtfwK7/yK1x99dWsX79+j/098MADfOlLX2LFihVW4CRJe61169Zxww03POoSoquvvprNmzdz2mmncfrpp9PX18fXvva1KfE3s+eBLSJOiYhbI2JdRJzTZv3ciPhCuf76iFjatO6vyuW3RsTJvWx3JxrdolUHNmB3d2jDggULWLhwIatXr+b666/nlltu4aSTTuKoo47itNNOY+HChVx66aU88sgjANx000187GMfY82aNVx++eV8/vOf32Mut4GBAb773e/ywQ9+kM985jPcfffdj2pPZrJx40Z27NhRyflJklSHrVu3snHjxkcFrYcffpivfOUrfPazn2X58uVcdNFFbNq0CSh6s1asWMEzn/lMli5dyv7778/JJ5/MXXfdxfXXXz8Zp7GHWb08WET0A+cDLwTWAysiYnlmrmna7A3Alsx8fEScAbwXeGVEHAecATwZOAK4OiKemJm7enkOo6mrwtbaHdpwxBFHsHbtWjZs2MChhx7KnDlzdve3H3/88fzgBz/g4osvZvbs2WzYsIGjjjqKl770pfz0pz/lqquu4qMf/SgveclL2Lp1K9/73vd4+OGHOfroo9mwYQOf/OQnOfbYY3nuc5/Lzp07WbNmDWvXruXBBx+kr6+PY445hic96Ukce+yxDAwMcPfdd3P33Xdz7733st9++3HEEUewZMkSDjvsMHbs2MHGjRvZtGkT999/P/vuuy+HHHIIixcv5qCDDmJoaIgHH3yQrVu3sm3bNubNm8fChQvZf//92Xfffdm1axcPP/zw7secOXNYsGAB++67L3PnzmV4eJgdO3awfft2duzYwezZs5k/fz7z589n1qxZZCYDAwPs3LmTnTt3MmvWLObNm8fcuXPp7+8nMxkcHGRgYIDBwUH6+/uZO3cus2fPpq+vj8xk165dDAwMMDQ0RH9/P7Nnz2b27NlEBJnJ8PAw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\n",
+      "text/plain": [
+       "<Figure size 720x504 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "print((songs.song_length/60000).describe())\n",
+    "plt.subplots(figsize=(10, 7))\n",
+    "x = songs.song_length/60000\n",
+    "ax = sns.distplot(x, color='grey')\n",
+    "ax.set_title('Distribution of Song Length', fontsize=15)\n",
+    "ax.set(xlabel='Song Length', ylabel='Count')\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 82,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def genres_separate(data):\n",
+    "    results = {}\n",
+    "    for i in range(len(songs.genre_ids)):\n",
+    "        data = str(songs.genre_ids[i]).split('|')\n",
+    "        for d in data:\n",
+    "            if d not in results:\n",
+    "                results[d] = 1\n",
+    "                continue\n",
+    "            results[d] += 1\n",
+    "\n",
+    "    return results"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 83,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gener_count = genres_separate(songs.genre_ids)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 84,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 1008x504 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "gener_df = pd.DataFrame.from_dict(\n",
+    "    gener_count, orient='index', columns=['counts'])\n",
+    "gener_df.reset_index(level=0, inplace=True)\n",
+    "gener_df = gener_df.sort_values(by='counts', ascending=False)\n",
+    "gener_df.columns = ['Genre', 'Count']\n",
+    "gener_df = gener_df[0:50]\n",
+    "ax = sns.catplot(x='Genre', y='Count', kind='bar', order=gener_df['Genre'],\n",
+    "                 palette=\"ch:7,-0.8,dark=.4\", data=gener_df, height=7, aspect=2)\n",
+    "ax.fig.subplots_adjust(top=.9)\n",
+    "ax.fig.suptitle('Distribution of Genre of the songs', fontsize=15)\n",
+    "for ax in ax.axes.flat:\n",
+    "    plt.setp(ax.get_xticklabels(), rotation=90)\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 4. Song extra info Data Exploration"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 4.1 Get the distinct count number in Song extra info data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 41,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "songs_extra = pd.read_csv('song_extra_info.csv')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 126,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Total number of records:2295971\n",
+      "The distinct song_id in records:2295971\n",
+      "The distinct name in records:1168979\n",
+      "The distinct isrc in records:1806825\n"
+     ]
+    }
+   ],
+   "source": [
+    "summarize(songs_extra)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 127,
+   "metadata": {},
+   "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>Nan_count</th>\n",
+       "      <th>Percentage</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>song_id</th>\n",
+       "      <td>0</td>\n",
+       "      <td>0.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>name</th>\n",
+       "      <td>2</td>\n",
+       "      <td>0.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>isrc</th>\n",
+       "      <td>136548</td>\n",
+       "      <td>5.0</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "         Nan_count  Percentage\n",
+       "song_id          0         0.0\n",
+       "name             2         0.0\n",
+       "isrc        136548         5.0"
+      ]
+     },
+     "execution_count": 127,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "count_nan(songs_extra)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 50,
+   "metadata": {},
+   "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>song_id</th>\n",
+       "      <th>name</th>\n",
+       "      <th>isrc</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>LP7pLJoJFBvyuUwvu+oLzjT+bI+UeBPURCecJsX1jjs=</td>\n",
+       "      <td>我們</td>\n",
+       "      <td>TWUM71200043</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>ClazTFnk6r0Bnuie44bocdNMM3rdlrq0bCGAsGUWcHE=</td>\n",
+       "      <td>Let Me Love You</td>\n",
+       "      <td>QMZSY1600015</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>u2ja/bZE3zhCGxvbbOB3zOoUjx27u40cf5g09UXMoKQ=</td>\n",
+       "      <td>原諒我</td>\n",
+       "      <td>TWA530887303</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>92Fqsy0+p6+RHe2EoLKjHahORHR1Kq1TBJoClW9v+Ts=</td>\n",
+       "      <td>Classic</td>\n",
+       "      <td>USSM11301446</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>0QFmz/+rJy1Q56C1DuYqT9hKKqi5TUqx0sN0IwvoHrw=</td>\n",
+       "      <td>愛投羅網</td>\n",
+       "      <td>TWA471306001</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "                                        song_id             name          isrc\n",
+       "0  LP7pLJoJFBvyuUwvu+oLzjT+bI+UeBPURCecJsX1jjs=               我們  TWUM71200043\n",
+       "1  ClazTFnk6r0Bnuie44bocdNMM3rdlrq0bCGAsGUWcHE=  Let Me Love You  QMZSY1600015\n",
+       "2  u2ja/bZE3zhCGxvbbOB3zOoUjx27u40cf5g09UXMoKQ=              原諒我  TWA530887303\n",
+       "3  92Fqsy0+p6+RHe2EoLKjHahORHR1Kq1TBJoClW9v+Ts=          Classic  USSM11301446\n",
+       "4  0QFmz/+rJy1Q56C1DuYqT9hKKqi5TUqx0sN0IwvoHrw=             愛投羅網  TWA471306001"
+      ]
+     },
+     "execution_count": 50,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "songs_extra.head()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 51,
+   "metadata": {},
+   "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>song_id</th>\n",
+       "      <th>name</th>\n",
+       "      <th>isrc</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>2295966</th>\n",
+       "      <td>hLnetpF6UbPg28sSfXnPE2vsdaGsLvddlXEdJR4VTIA=</td>\n",
+       "      <td>Deep Breathing</td>\n",
+       "      <td>PLL431720793</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2295967</th>\n",
+       "      <td>N+6vJ8actKQm0S3Fpf4elipTjoAo9ev28aA5FJN5e40=</td>\n",
+       "      <td>In Hiding</td>\n",
+       "      <td>US5UL1519827</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2295968</th>\n",
+       "      <td>pv35uG0ts05mWtirM/AMOWEzbHxIVart5ZzRXqKUY1c=</td>\n",
+       "      <td>Il Est Ne Le Divin Enfant</td>\n",
+       "      <td>PLL431502294</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2295969</th>\n",
+       "      <td>QSySnm8jt2Go7byY34/PxsZP6dPCins2j2cyYquNhBo=</td>\n",
+       "      <td>The Exodus Song</td>\n",
+       "      <td>DEPZ69316095</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2295970</th>\n",
+       "      <td>DYKJKSgDOKxb19XzOVO81176qTH0OIHCsfzFRm/BG+g=</td>\n",
+       "      <td>Like This</td>\n",
+       "      <td>US5UL1512426</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "                                              song_id  \\\n",
+       "2295966  hLnetpF6UbPg28sSfXnPE2vsdaGsLvddlXEdJR4VTIA=   \n",
+       "2295967  N+6vJ8actKQm0S3Fpf4elipTjoAo9ev28aA5FJN5e40=   \n",
+       "2295968  pv35uG0ts05mWtirM/AMOWEzbHxIVart5ZzRXqKUY1c=   \n",
+       "2295969  QSySnm8jt2Go7byY34/PxsZP6dPCins2j2cyYquNhBo=   \n",
+       "2295970  DYKJKSgDOKxb19XzOVO81176qTH0OIHCsfzFRm/BG+g=   \n",
+       "\n",
+       "                              name          isrc  \n",
+       "2295966             Deep Breathing  PLL431720793  \n",
+       "2295967                  In Hiding  US5UL1519827  \n",
+       "2295968  Il Est Ne Le Divin Enfant  PLL431502294  \n",
+       "2295969            The Exodus Song  DEPZ69316095  \n",
+       "2295970                  Like This  US5UL1512426  "
+      ]
+     },
+     "execution_count": 51,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "songs_extra.tail()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 49,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "song_id        2296320\n",
+       "song_length    2296320\n",
+       "genre_ids      2202204\n",
+       "artist_name    2296320\n",
+       "composer       1224966\n",
+       "lyricist        351052\n",
+       "language       2296319\n",
+       "dtype: int64"
+      ]
+     },
+     "execution_count": 49,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "songs.count()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 47,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "song_id    2295971\n",
+       "name       2295969\n",
+       "isrc       2159423\n",
+       "dtype: int64"
+      ]
+     },
+     "execution_count": 47,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "songs_extra.count()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 52,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Total number of records:2295971\n",
+      "The distinct msno in records:0\n",
+      "The distinct song_id in records:2295971\n",
+      "The distinct source_system_tab in records:0\n",
+      "The distinct source_screen_name in records:0\n",
+      "The distinct source_type in records:0\n",
+      "The distinct target in records:0\n",
+      "The distinct name in records:1168980\n",
+      "The distinct isrc in records:1806826\n"
+     ]
+    }
+   ],
+   "source": [
+    "summarize(songs_extra)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def count_nan(data):\n",
+    "    total_row, total_column = data.shape\n",
+    "    total_nan = [(0, 0) for _ in range(total_column)]\n",
+    "                 \n",
+    "    df = pd.DataFrame(total_nan, columns = ['Nan_count', 'Percentage'], index = data.columns)\n",
+    "   # result.astype({'Percentage':float})\n",
+    "\n",
+    "    for column in data.columns:\n",
+    "        number_nan = data[column].isnull().sum()\n",
+    "        df.loc[column][0] = number_nan\n",
+    "        df.loc[column][1] = number_nan/total_row * 100\n",
+    "    convert_dict = {'Nan_count': int, \n",
+    "                    'Percentage': float\n",
+    "                   } \n",
+    "  \n",
+    "    df = df.astype(convert_dict) \n",
+    "    return df"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.7.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/tfn/notebooks/DataPreprocessing_FeatureEngineering_Pipeline_df1n19 v1.1.ipynb b/tfn/notebooks/DataPreprocessing_FeatureEngineering_Pipeline_df1n19 v1.1.ipynb
index 300137e3e2d71b93d22426f7063f3e4ac737d4fa..c62f23391cd5d20b286bcdefd0c6157a13f00407 100644
--- a/tfn/notebooks/DataPreprocessing_FeatureEngineering_Pipeline_df1n19 v1.1.ipynb	
+++ b/tfn/notebooks/DataPreprocessing_FeatureEngineering_Pipeline_df1n19 v1.1.ipynb	
@@ -1278,7 +1278,7 @@
    "metadata": {},
    "outputs": [],
    "source": [
-    "songs = apply_pipeline(songs, feature_pipeline_song)\n"
+    "songs = apply_pipeline(songs, feature_pipeline_song)"
    ]
   },
   {
@@ -1583,23 +1583,6 @@
    "execution_count": 16,
    "metadata": {},
    "outputs": [],
-   "source": [
-    "# Standardize numerical data: registration_duration & song_length\n",
-    "\n",
-    "transfer_list = ['song_length','registration_duration']\n",
-    "def standardize(data, transfer_list):\n",
-    "    for i in transfer_list:\n",
-    "        data[i] = preprocessing.scale(data[i], axis=0, with_mean=True, with_std=True, copy=True)\n",
-    "        \n",
-    "standardize(train, transfer_list)\n",
-    "standardize(test, transfer_list)"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 17,
-   "metadata": {},
-   "outputs": [],
    "source": [
     "# Sparse label data from train dataset\n",
     "\n",
@@ -1613,7 +1596,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 23,
+   "execution_count": 17,
    "metadata": {},
    "outputs": [
     {
@@ -1681,7 +1664,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.420898</td>\n",
+       "      <td>2103</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>1</th>\n",
@@ -1704,7 +1687,7 @@
        "      <td>13</td>\n",
        "      <td>24.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.596334</td>\n",
+       "      <td>2301</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>2</th>\n",
@@ -1713,7 +1696,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>4</td>\n",
-       "      <td>-0.303863</td>\n",
+       "      <td>225396.0</td>\n",
        "      <td>2006.0</td>\n",
        "      <td>31</td>\n",
        "      <td>186.0</td>\n",
@@ -1727,7 +1710,7 @@
        "      <td>13</td>\n",
        "      <td>24.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.596334</td>\n",
+       "      <td>2301</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>3</th>\n",
@@ -1750,7 +1733,7 @@
        "      <td>13</td>\n",
        "      <td>24.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.596334</td>\n",
+       "      <td>2301</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>4</th>\n",
@@ -1759,7 +1742,7 @@
        "      <td>1</td>\n",
        "      <td>7</td>\n",
        "      <td>7</td>\n",
-       "      <td>-0.872754</td>\n",
+       "      <td>187802.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>2</td>\n",
        "      <td>18.0</td>\n",
@@ -1773,7 +1756,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.420898</td>\n",
+       "      <td>2103</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>5</th>\n",
@@ -1782,7 +1765,7 @@
        "      <td>1</td>\n",
        "      <td>7</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.035210</td>\n",
+       "      <td>247803.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>31</td>\n",
        "      <td>13.0</td>\n",
@@ -1796,7 +1779,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.420898</td>\n",
+       "      <td>2103</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>6</th>\n",
@@ -1805,7 +1788,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>4</td>\n",
-       "      <td>-0.234466</td>\n",
+       "      <td>229982.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>109</td>\n",
        "      <td>34.0</td>\n",
@@ -1819,7 +1802,7 @@
        "      <td>13</td>\n",
        "      <td>24.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.596334</td>\n",
+       "      <td>2301</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7</th>\n",
@@ -1828,7 +1811,7 @@
        "      <td>1</td>\n",
        "      <td>7</td>\n",
        "      <td>7</td>\n",
-       "      <td>-0.973945</td>\n",
+       "      <td>181115.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>2</td>\n",
        "      <td>39.0</td>\n",
@@ -1842,7 +1825,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.420898</td>\n",
+       "      <td>2103</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>8</th>\n",
@@ -1851,7 +1834,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.506754</td>\n",
+       "      <td>278964.0</td>\n",
        "      <td>2007.0</td>\n",
        "      <td>58</td>\n",
        "      <td>153.0</td>\n",
@@ -1865,7 +1848,7 @@
        "      <td>15</td>\n",
        "      <td>26.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.603422</td>\n",
+       "      <td>2309</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>9</th>\n",
@@ -1874,7 +1857,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.179968</td>\n",
+       "      <td>257369.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>109</td>\n",
        "      <td>153.0</td>\n",
@@ -1888,7 +1871,7 @@
        "      <td>15</td>\n",
        "      <td>26.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.603422</td>\n",
+       "      <td>2309</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>10</th>\n",
@@ -1897,7 +1880,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.326002</td>\n",
+       "      <td>223933.0</td>\n",
        "      <td>2014.0</td>\n",
        "      <td>109</td>\n",
        "      <td>49.0</td>\n",
@@ -1911,7 +1894,7 @@
        "      <td>15</td>\n",
        "      <td>26.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.603422</td>\n",
+       "      <td>2309</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>11</th>\n",
@@ -1920,7 +1903,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.315954</td>\n",
+       "      <td>224597.0</td>\n",
        "      <td>2015.0</td>\n",
        "      <td>109</td>\n",
        "      <td>79.0</td>\n",
@@ -1934,7 +1917,7 @@
        "      <td>15</td>\n",
        "      <td>26.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.603422</td>\n",
+       "      <td>2309</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>12</th>\n",
@@ -1943,7 +1926,7 @@
        "      <td>3</td>\n",
        "      <td>20</td>\n",
        "      <td>11</td>\n",
-       "      <td>0.523702</td>\n",
+       "      <td>280084.0</td>\n",
        "      <td>2014.0</td>\n",
        "      <td>109</td>\n",
        "      <td>236.0</td>\n",
@@ -1957,7 +1940,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.746018</td>\n",
+       "      <td>786</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>13</th>\n",
@@ -1980,7 +1963,7 @@
        "      <td>5</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.688482</td>\n",
+       "      <td>2405</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>14</th>\n",
@@ -1989,7 +1972,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>4</td>\n",
-       "      <td>-0.531335</td>\n",
+       "      <td>210364.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>109</td>\n",
        "      <td>236.0</td>\n",
@@ -2003,7 +1986,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.746018</td>\n",
+       "      <td>786</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>15</th>\n",
@@ -2012,7 +1995,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.073426</td>\n",
+       "      <td>240624.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>109</td>\n",
        "      <td>58815.0</td>\n",
@@ -2026,7 +2009,7 @@
        "      <td>5</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.688482</td>\n",
+       "      <td>2405</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>16</th>\n",
@@ -2035,7 +2018,7 @@
        "      <td>3</td>\n",
        "      <td>9</td>\n",
        "      <td>4</td>\n",
-       "      <td>0.050146</td>\n",
+       "      <td>248790.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>109</td>\n",
        "      <td>13.0</td>\n",
@@ -2049,7 +2032,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.746018</td>\n",
+       "      <td>786</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>17</th>\n",
@@ -2058,7 +2041,7 @@
        "      <td>3</td>\n",
        "      <td>9</td>\n",
        "      <td>4</td>\n",
-       "      <td>0.217920</td>\n",
+       "      <td>259877.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>108</td>\n",
        "      <td>308.0</td>\n",
@@ -2072,7 +2055,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.746018</td>\n",
+       "      <td>786</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>18</th>\n",
@@ -2081,7 +2064,7 @@
        "      <td>3</td>\n",
        "      <td>20</td>\n",
        "      <td>11</td>\n",
-       "      <td>0.306687</td>\n",
+       "      <td>265743.0</td>\n",
        "      <td>2013.0</td>\n",
        "      <td>109</td>\n",
        "      <td>236.0</td>\n",
@@ -2095,7 +2078,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.746018</td>\n",
+       "      <td>786</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>19</th>\n",
@@ -2104,7 +2087,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.052982</td>\n",
+       "      <td>241975.0</td>\n",
        "      <td>2006.0</td>\n",
        "      <td>109</td>\n",
        "      <td>252.0</td>\n",
@@ -2118,7 +2101,7 @@
        "      <td>9</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.147940</td>\n",
+       "      <td>1461</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>20</th>\n",
@@ -2127,7 +2110,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.841823</td>\n",
+       "      <td>189846.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>108</td>\n",
        "      <td>10.0</td>\n",
@@ -2141,7 +2124,7 @@
        "      <td>9</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.147940</td>\n",
+       "      <td>1461</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>21</th>\n",
@@ -2150,7 +2133,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.036845</td>\n",
+       "      <td>247911.0</td>\n",
        "      <td>2003.0</td>\n",
        "      <td>109</td>\n",
        "      <td>298.0</td>\n",
@@ -2164,7 +2147,7 @@
        "      <td>9</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.147940</td>\n",
+       "      <td>1461</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>22</th>\n",
@@ -2187,7 +2170,7 @@
        "      <td>9</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.147940</td>\n",
+       "      <td>1461</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>23</th>\n",
@@ -2210,7 +2193,7 @@
        "      <td>15</td>\n",
        "      <td>18.0</td>\n",
        "      <td>4</td>\n",
-       "      <td>-0.866519</td>\n",
+       "      <td>650</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>24</th>\n",
@@ -2233,7 +2216,7 @@
        "      <td>15</td>\n",
        "      <td>18.0</td>\n",
        "      <td>4</td>\n",
-       "      <td>-0.866519</td>\n",
+       "      <td>650</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>25</th>\n",
@@ -2242,7 +2225,7 @@
        "      <td>3</td>\n",
        "      <td>11</td>\n",
        "      <td>7</td>\n",
-       "      <td>-1.728693</td>\n",
+       "      <td>131239.0</td>\n",
        "      <td>2006.0</td>\n",
        "      <td>58</td>\n",
        "      <td>546.0</td>\n",
@@ -2256,7 +2239,7 @@
        "      <td>15</td>\n",
        "      <td>18.0</td>\n",
        "      <td>4</td>\n",
-       "      <td>-0.866519</td>\n",
+       "      <td>650</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>26</th>\n",
@@ -2265,7 +2248,7 @@
        "      <td>3</td>\n",
        "      <td>11</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.934035</td>\n",
+       "      <td>307200.0</td>\n",
        "      <td>1998.0</td>\n",
        "      <td>109</td>\n",
        "      <td>1.0</td>\n",
@@ -2279,7 +2262,7 @@
        "      <td>15</td>\n",
        "      <td>18.0</td>\n",
        "      <td>4</td>\n",
-       "      <td>-0.866519</td>\n",
+       "      <td>650</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>27</th>\n",
@@ -2288,7 +2271,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.477796</td>\n",
+       "      <td>213902.0</td>\n",
        "      <td>2009.0</td>\n",
        "      <td>109</td>\n",
        "      <td>231.0</td>\n",
@@ -2302,7 +2285,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.849741</td>\n",
+       "      <td>2587</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>28</th>\n",
@@ -2311,7 +2294,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.390097</td>\n",
+       "      <td>271255.0</td>\n",
        "      <td>2008.0</td>\n",
        "      <td>109</td>\n",
        "      <td>292.0</td>\n",
@@ -2325,7 +2308,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.849741</td>\n",
+       "      <td>2587</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>29</th>\n",
@@ -2334,7 +2317,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.046983</td>\n",
+       "      <td>248581.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>152</td>\n",
        "      <td>62.0</td>\n",
@@ -2348,7 +2331,7 @@
        "      <td>13</td>\n",
        "      <td>34.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.850627</td>\n",
+       "      <td>2588</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>...</th>\n",
@@ -2380,7 +2363,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.453351</td>\n",
+       "      <td>275435.0</td>\n",
        "      <td>1996.0</td>\n",
        "      <td>107</td>\n",
        "      <td>162.0</td>\n",
@@ -2394,7 +2377,7 @@
        "      <td>15</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.570582</td>\n",
+       "      <td>984</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377389</th>\n",
@@ -2403,7 +2386,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.094363</td>\n",
+       "      <td>251712.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>108</td>\n",
        "      <td>24.0</td>\n",
@@ -2417,7 +2400,7 @@
        "      <td>15</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.570582</td>\n",
+       "      <td>984</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377390</th>\n",
@@ -2426,7 +2409,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>4</td>\n",
-       "      <td>0.865757</td>\n",
+       "      <td>302688.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>108</td>\n",
        "      <td>24.0</td>\n",
@@ -2440,7 +2423,7 @@
        "      <td>15</td>\n",
        "      <td>21.0</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.103695</td>\n",
+       "      <td>1745</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377391</th>\n",
@@ -2449,7 +2432,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.347409</td>\n",
+       "      <td>268434.0</td>\n",
        "      <td>2015.0</td>\n",
        "      <td>108</td>\n",
        "      <td>136.0</td>\n",
@@ -2463,7 +2446,7 @@
        "      <td>13</td>\n",
        "      <td>41.0</td>\n",
        "      <td>7</td>\n",
-       "      <td>-0.903733</td>\n",
+       "      <td>608</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377392</th>\n",
@@ -2472,7 +2455,7 @@
        "      <td>7</td>\n",
        "      <td>0</td>\n",
        "      <td>0</td>\n",
-       "      <td>0.701600</td>\n",
+       "      <td>291840.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>109</td>\n",
        "      <td>103.0</td>\n",
@@ -2486,7 +2469,7 @@
        "      <td>6</td>\n",
        "      <td>23.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>1.417693</td>\n",
+       "      <td>3228</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377393</th>\n",
@@ -2495,7 +2478,7 @@
        "      <td>7</td>\n",
        "      <td>0</td>\n",
        "      <td>0</td>\n",
-       "      <td>0.053309</td>\n",
+       "      <td>248999.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>109</td>\n",
        "      <td>103.0</td>\n",
@@ -2509,7 +2492,7 @@
        "      <td>6</td>\n",
        "      <td>23.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>1.417693</td>\n",
+       "      <td>3228</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377394</th>\n",
@@ -2518,7 +2501,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.306587</td>\n",
+       "      <td>225216.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>109</td>\n",
        "      <td>58815.0</td>\n",
@@ -2532,7 +2515,7 @@
        "      <td>15</td>\n",
        "      <td>22.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.668103</td>\n",
+       "      <td>2382</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377395</th>\n",
@@ -2541,7 +2524,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.351485</td>\n",
+       "      <td>222249.0</td>\n",
        "      <td>2013.0</td>\n",
        "      <td>108</td>\n",
        "      <td>17.0</td>\n",
@@ -2555,7 +2538,7 @@
        "      <td>15</td>\n",
        "      <td>22.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.668103</td>\n",
+       "      <td>2382</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377396</th>\n",
@@ -2564,7 +2547,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>0.924184</td>\n",
+       "      <td>306549.0</td>\n",
        "      <td>2007.0</td>\n",
        "      <td>109</td>\n",
        "      <td>148.0</td>\n",
@@ -2578,7 +2561,7 @@
        "      <td>15</td>\n",
        "      <td>22.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.668103</td>\n",
+       "      <td>2382</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377397</th>\n",
@@ -2587,7 +2570,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.561434</td>\n",
+       "      <td>208375.0</td>\n",
        "      <td>2003.0</td>\n",
        "      <td>109</td>\n",
        "      <td>252.0</td>\n",
@@ -2601,7 +2584,7 @@
        "      <td>13</td>\n",
        "      <td>18.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.450966</td>\n",
+       "      <td>1119</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377398</th>\n",
@@ -2624,7 +2607,7 @@
        "      <td>15</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>2.547395</td>\n",
+       "      <td>4503</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377399</th>\n",
@@ -2647,7 +2630,7 @@
        "      <td>15</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>2.547395</td>\n",
+       "      <td>4503</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377400</th>\n",
@@ -2656,7 +2639,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>4</td>\n",
-       "      <td>1.000436</td>\n",
+       "      <td>311588.0</td>\n",
        "      <td>2014.0</td>\n",
        "      <td>109</td>\n",
        "      <td>308.0</td>\n",
@@ -2670,7 +2653,7 @@
        "      <td>15</td>\n",
        "      <td>27.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>2.547395</td>\n",
+       "      <td>4503</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377401</th>\n",
@@ -2679,7 +2662,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>4</td>\n",
-       "      <td>-0.169290</td>\n",
+       "      <td>234289.0</td>\n",
        "      <td>2013.0</td>\n",
        "      <td>109</td>\n",
        "      <td>133.0</td>\n",
@@ -2693,7 +2676,7 @@
        "      <td>22</td>\n",
        "      <td>29.0</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.007060</td>\n",
+       "      <td>1620</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377402</th>\n",
@@ -2702,7 +2685,7 @@
        "      <td>0</td>\n",
        "      <td>20</td>\n",
        "      <td>10</td>\n",
-       "      <td>-1.199389</td>\n",
+       "      <td>166217.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>41</td>\n",
        "      <td>58.0</td>\n",
@@ -2716,7 +2699,7 @@
        "      <td>22</td>\n",
        "      <td>37.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>2.305506</td>\n",
+       "      <td>4230</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377403</th>\n",
@@ -2725,7 +2708,7 @@
        "      <td>0</td>\n",
        "      <td>20</td>\n",
        "      <td>10</td>\n",
-       "      <td>-0.311944</td>\n",
+       "      <td>224862.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>41</td>\n",
        "      <td>1.0</td>\n",
@@ -2739,7 +2722,7 @@
        "      <td>22</td>\n",
        "      <td>37.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>2.305506</td>\n",
+       "      <td>4230</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377404</th>\n",
@@ -2748,7 +2731,7 @@
        "      <td>0</td>\n",
        "      <td>20</td>\n",
        "      <td>10</td>\n",
-       "      <td>-0.914913</td>\n",
+       "      <td>185016.0</td>\n",
        "      <td>2015.0</td>\n",
        "      <td>41</td>\n",
        "      <td>14.0</td>\n",
@@ -2762,7 +2745,7 @@
        "      <td>22</td>\n",
        "      <td>37.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>2.305506</td>\n",
+       "      <td>4230</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377405</th>\n",
@@ -2771,7 +2754,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.619754</td>\n",
+       "      <td>204521.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>96</td>\n",
        "      <td>58815.0</td>\n",
@@ -2785,7 +2768,7 @@
        "      <td>4</td>\n",
        "      <td>28.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.675191</td>\n",
+       "      <td>2390</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377406</th>\n",
@@ -2794,7 +2777,7 @@
        "      <td>1</td>\n",
        "      <td>11</td>\n",
        "      <td>7</td>\n",
-       "      <td>-0.718312</td>\n",
+       "      <td>198008.0</td>\n",
        "      <td>NaN</td>\n",
        "      <td>128</td>\n",
        "      <td>76.0</td>\n",
@@ -2808,7 +2791,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>-0.240089</td>\n",
+       "      <td>1357</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377407</th>\n",
@@ -2817,7 +2800,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.155414</td>\n",
+       "      <td>235206.0</td>\n",
        "      <td>2015.0</td>\n",
        "      <td>108</td>\n",
        "      <td>31.0</td>\n",
@@ -2831,7 +2814,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>-0.225026</td>\n",
+       "      <td>1374</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377408</th>\n",
@@ -2840,7 +2823,7 @@
        "      <td>7</td>\n",
        "      <td>15</td>\n",
        "      <td>9</td>\n",
-       "      <td>-1.059686</td>\n",
+       "      <td>175449.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>141</td>\n",
        "      <td>58815.0</td>\n",
@@ -2854,7 +2837,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.813414</td>\n",
+       "      <td>2546</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377409</th>\n",
@@ -2877,7 +2860,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.813414</td>\n",
+       "      <td>2546</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377410</th>\n",
@@ -2886,7 +2869,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-1.086380</td>\n",
+       "      <td>173685.0</td>\n",
        "      <td>2003.0</td>\n",
        "      <td>109</td>\n",
        "      <td>291.0</td>\n",
@@ -2900,7 +2883,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>-1.200557</td>\n",
+       "      <td>273</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377411</th>\n",
@@ -2909,7 +2892,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.469367</td>\n",
+       "      <td>214459.0</td>\n",
        "      <td>2016.0</td>\n",
        "      <td>109</td>\n",
        "      <td>291.0</td>\n",
@@ -2923,7 +2906,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>-1.200557</td>\n",
+       "      <td>273</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377412</th>\n",
@@ -2932,7 +2915,7 @@
        "      <td>3</td>\n",
        "      <td>8</td>\n",
        "      <td>3</td>\n",
-       "      <td>-0.237462</td>\n",
+       "      <td>229784.0</td>\n",
        "      <td>2012.0</td>\n",
        "      <td>109</td>\n",
        "      <td>291.0</td>\n",
@@ -2946,7 +2929,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>-1.200557</td>\n",
+       "      <td>273</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377413</th>\n",
@@ -2969,7 +2952,7 @@
        "      <td>4</td>\n",
        "      <td>26.0</td>\n",
        "      <td>9</td>\n",
-       "      <td>2.694478</td>\n",
+       "      <td>4669</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377414</th>\n",
@@ -2978,7 +2961,7 @@
        "      <td>7</td>\n",
        "      <td>15</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.273477</td>\n",
+       "      <td>227404.0</td>\n",
        "      <td>2015.0</td>\n",
        "      <td>109</td>\n",
        "      <td>1.0</td>\n",
@@ -2992,7 +2975,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>-0.058450</td>\n",
+       "      <td>1562</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377415</th>\n",
@@ -3001,7 +2984,7 @@
        "      <td>7</td>\n",
        "      <td>15</td>\n",
        "      <td>9</td>\n",
-       "      <td>0.194026</td>\n",
+       "      <td>258298.0</td>\n",
        "      <td>2015.0</td>\n",
        "      <td>109</td>\n",
        "      <td>9.0</td>\n",
@@ -3015,7 +2998,7 @@
        "      <td>1</td>\n",
        "      <td>NaN</td>\n",
        "      <td>7</td>\n",
-       "      <td>-0.058450</td>\n",
+       "      <td>1562</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377416</th>\n",
@@ -3024,7 +3007,7 @@
        "      <td>0</td>\n",
        "      <td>5</td>\n",
        "      <td>7</td>\n",
-       "      <td>4.216968</td>\n",
+       "      <td>524146.0</td>\n",
        "      <td>2007.0</td>\n",
        "      <td>73</td>\n",
        "      <td>38.0</td>\n",
@@ -3038,7 +3021,7 @@
        "      <td>5</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.602479</td>\n",
+       "      <td>948</td>\n",
        "    </tr>\n",
        "    <tr>\n",
        "      <th>7377417</th>\n",
@@ -3047,7 +3030,7 @@
        "      <td>0</td>\n",
        "      <td>5</td>\n",
        "      <td>7</td>\n",
-       "      <td>0.129380</td>\n",
+       "      <td>254026.0</td>\n",
        "      <td>1999.0</td>\n",
        "      <td>72</td>\n",
        "      <td>3.0</td>\n",
@@ -3061,7 +3044,7 @@
        "      <td>5</td>\n",
        "      <td>NaN</td>\n",
        "      <td>9</td>\n",
-       "      <td>-0.602479</td>\n",
+       "      <td>948</td>\n",
        "    </tr>\n",
        "  </tbody>\n",
        "</table>\n",
@@ -3085,15 +3068,15 @@
        "         song_length  song_year  first_genre_type  artist_count  \\\n",
        "0                NaN        NaN               152           NaN   \n",
        "1                NaN        NaN               152           NaN   \n",
-       "2          -0.303863     2006.0                31         186.0   \n",
+       "2           225396.0     2006.0                31         186.0   \n",
        "3                NaN        NaN               152           NaN   \n",
-       "4          -0.872754     2016.0                 2          18.0   \n",
+       "4           187802.0     2016.0                 2          18.0   \n",
        "...              ...        ...               ...           ...   \n",
        "7377413          NaN        NaN               152           NaN   \n",
-       "7377414    -0.273477     2015.0               109           1.0   \n",
-       "7377415     0.194026     2015.0               109           9.0   \n",
-       "7377416     4.216968     2007.0                73          38.0   \n",
-       "7377417     0.129380     1999.0                72           3.0   \n",
+       "7377414     227404.0     2015.0               109           1.0   \n",
+       "7377415     258298.0     2015.0               109           9.0   \n",
+       "7377416     524146.0     2007.0                73          38.0   \n",
+       "7377417     254026.0     1999.0                72           3.0   \n",
        "\n",
        "         composer_count  lyricist_count  first_genre_typecount  featured_song  \\\n",
        "0                   NaN             NaN                    NaN            NaN   \n",
@@ -3122,22 +3105,22 @@
        "7377417       1.0       0.0            52     5   NaN               9   \n",
        "\n",
        "         registration_duration  \n",
-       "0                     0.420898  \n",
-       "1                     0.596334  \n",
-       "2                     0.596334  \n",
-       "3                     0.596334  \n",
-       "4                     0.420898  \n",
+       "0                         2103  \n",
+       "1                         2301  \n",
+       "2                         2301  \n",
+       "3                         2301  \n",
+       "4                         2103  \n",
        "...                        ...  \n",
-       "7377413               2.694478  \n",
-       "7377414              -0.058450  \n",
-       "7377415              -0.058450  \n",
-       "7377416              -0.602479  \n",
-       "7377417              -0.602479  \n",
+       "7377413                   4669  \n",
+       "7377414                   1562  \n",
+       "7377415                   1562  \n",
+       "7377416                    948  \n",
+       "7377417                    948  \n",
        "\n",
        "[7377418 rows x 20 columns]"
       ]
      },
-     "execution_count": 23,
+     "execution_count": 17,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -3148,7 +3131,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 24,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -3169,7 +3152,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 19,
+   "execution_count": 25,
    "metadata": {},
    "outputs": [
     {
@@ -3178,18 +3161,18 @@
        "1"
       ]
      },
-     "execution_count": 19,
+     "execution_count": 25,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "save(train, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\train_processed.pkl')"
+    "save(data_train, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\data_train.pkl')"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 20,
+   "execution_count": 26,
    "metadata": {},
    "outputs": [
     {
@@ -3198,32 +3181,61 @@
        "1"
       ]
      },
-     "execution_count": 20,
+     "execution_count": 26,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "save(test, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\test_processed.pkl')"
+    "save(data_val, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\data_val.pkl')"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": 27,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1"
+      ]
+     },
+     "execution_count": 27,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
    "source": [
-    "train_pkl = load(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\train.pkl')"
+    "save(label_train, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\label_train.pkl')"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 22,
+   "execution_count": 28,
    "metadata": {},
-   "outputs": [],
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1"
+      ]
+     },
+     "execution_count": 28,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
    "source": [
-    "test_pkl = load(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\test.pkl')"
+    "save(label_val, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\label_val.pkl')"
    ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
   }
  ],
  "metadata": {
diff --git a/feature extraction/.ipynb_checkpoints/DataPreprocessing_FeatureEngineering_Pipeline_df1n19-checkpoint.ipynb b/tfn/notebooks/DataPreprocessing_FeatureEngineering_Pipeline_df1n19_SVM v1.ipynb
similarity index 77%
rename from feature extraction/.ipynb_checkpoints/DataPreprocessing_FeatureEngineering_Pipeline_df1n19-checkpoint.ipynb
rename to tfn/notebooks/DataPreprocessing_FeatureEngineering_Pipeline_df1n19_SVM v1.ipynb
index 2ecaf3a83da5ab997212856432ff38704638c5e1..70103609fab17932a97c1e95dca652847cc49b75 100644
--- a/feature extraction/.ipynb_checkpoints/DataPreprocessing_FeatureEngineering_Pipeline_df1n19-checkpoint.ipynb	
+++ b/tfn/notebooks/DataPreprocessing_FeatureEngineering_Pipeline_df1n19_SVM v1.ipynb	
@@ -12,7 +12,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 89,
+   "execution_count": 1,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -25,149 +25,63 @@
     "import re \n",
     "\n",
     "from sklearn.model_selection import train_test_split\n",
-    "from sklearn import preprocessing\n"
+    "from sklearn import preprocessing"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
-   "source": []
-  },
-  {
-   "cell_type": "raw",
-   "metadata": {},
-   "source": []
+   "source": [
+    "## 1. Loading Data"
+   ]
   },
   {
    "cell_type": "code",
-   "execution_count": 100,
+   "execution_count": 2,
    "metadata": {},
    "outputs": [],
    "source": [
-    "id = members.msno[16867]"
+    "# author@Fiona\n",
+    "# read data from csv files\n",
+    "members = pd.read_csv(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\members.csv',parse_dates=['registration_init_time','expiration_date'])\n",
+    "songs = pd.read_csv(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\songs.csv')\n",
+    "songs_extra = pd.read_csv(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\song_extra_info.csv')\n",
+    "train = pd.read_csv(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\train.csv')\n",
+    "test = pd.read_csv(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\test.csv')"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 102,
+   "execution_count": 3,
    "metadata": {},
    "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "c:\\users\\user\\miniconda3\\lib\\site-packages\\ipykernel_launcher.py:3: SettingWithCopyWarning: \n",
+      "A value is trying to be set on a copy of a slice from a DataFrame\n",
+      "\n",
+      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
+      "  This is separate from the ipykernel package so we can avoid doing imports until\n"
+     ]
+    },
     {
      "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>msno</th>\n",
-       "      <th>song_id</th>\n",
-       "      <th>source_system_tab</th>\n",
-       "      <th>source_screen_name</th>\n",
-       "      <th>source_type</th>\n",
-       "      <th>target</th>\n",
-       "    </tr>\n",
-       "  </thead>\n",
-       "  <tbody>\n",
-       "    <tr>\n",
-       "      <th>2487533</th>\n",
-       "      <td>1Y+bNz3FxSoJnKOcR/Q8VJGXZbWIstrW0HfBe5LZzKA=</td>\n",
-       "      <td>WznMG5LmzE4k7q1OQLPAV2s96k8ZIrVvG/rihErlYWk=</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>2487534</th>\n",
-       "      <td>1Y+bNz3FxSoJnKOcR/Q8VJGXZbWIstrW0HfBe5LZzKA=</td>\n",
-       "      <td>DdKsqy3JAygpcHwihcjBKzzp8SDYhdtXbEZmhKDrOSo=</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>2487535</th>\n",
-       "      <td>1Y+bNz3FxSoJnKOcR/Q8VJGXZbWIstrW0HfBe5LZzKA=</td>\n",
-       "      <td>xEjg9Bs0QcYD3BBQrzPUk89Eb2jBCWu/aki+pOy6H0w=</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>0</td>\n",
-       "    </tr>\n",
-       "  </tbody>\n",
-       "</table>\n",
-       "</div>"
-      ],
       "text/plain": [
-       "                                                 msno  \\\n",
-       "2487533  1Y+bNz3FxSoJnKOcR/Q8VJGXZbWIstrW0HfBe5LZzKA=   \n",
-       "2487534  1Y+bNz3FxSoJnKOcR/Q8VJGXZbWIstrW0HfBe5LZzKA=   \n",
-       "2487535  1Y+bNz3FxSoJnKOcR/Q8VJGXZbWIstrW0HfBe5LZzKA=   \n",
-       "\n",
-       "                                              song_id source_system_tab  \\\n",
-       "2487533  WznMG5LmzE4k7q1OQLPAV2s96k8ZIrVvG/rihErlYWk=               NaN   \n",
-       "2487534  DdKsqy3JAygpcHwihcjBKzzp8SDYhdtXbEZmhKDrOSo=               NaN   \n",
-       "2487535  xEjg9Bs0QcYD3BBQrzPUk89Eb2jBCWu/aki+pOy6H0w=               NaN   \n",
-       "\n",
-       "        source_screen_name source_type  target  \n",
-       "2487533                NaN         NaN       0  \n",
-       "2487534                NaN         NaN       0  \n",
-       "2487535                NaN         NaN       0  "
+       "Timestamp('2014-05-01 00:00:00')"
       ]
      },
-     "execution_count": 102,
+     "execution_count": 3,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "train[train.msno == id]"
-   ]
-  },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "## 1. Loading Data"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 90,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "# author@Fiona\n",
-    "# read data from csv files\n",
-    "members = pd.read_csv(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\members.csv',parse_dates=['registration_init_time','expiration_date'])\n",
-    "# members = pd.read_csv('members.csv')"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 91,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "songs = pd.read_csv(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\songs.csv')\n",
-    "songs_extra = pd.read_csv(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\song_extra_info.csv')\n",
-    "train = pd.read_csv(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\train.csv')\n",
-    "test = pd.read_csv(r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\test.csv')"
+    "# Outlier preprocess for members.expiration_date row 16867\n",
+    "\n",
+    "members.expiration_date[16867] = members.registration_init_time[16867]\n",
+    "members.expiration_date[16867]"
    ]
   },
   {
@@ -179,7 +93,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 92,
+   "execution_count": 4,
    "metadata": {},
    "outputs": [
     {
@@ -1008,7 +922,7 @@
        "[1048575 rows x 9 columns]"
       ]
      },
-     "execution_count": 92,
+     "execution_count": 4,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1032,7 +946,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 5,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1159,19 +1073,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
-   "metadata": {},
-   "outputs": [],
-   "source": [
-    "# Outlier preprocess for members.expiration_date row 16867\n",
-    "\n",
-    "members.expiration_date[16867] = members.registration_init_time[16867]\n",
-    "members.expiration_date[16867]"
-   ]
-  },
-  {
-   "cell_type": "code",
-   "execution_count": 11,
+   "execution_count": 6,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1182,7 +1084,7 @@
     "    members.registration_init_time = members.registration_init_time.apply(lambda x : time.mktime(x.timetuple()))\n",
     "    members.expiration_date = members.expiration_date.apply(lambda x : time.mktime(x.timetuple()))\n",
     "    #count Duration\n",
-    "    members['registration_duration'] = ((members['expiration_date'] -members['registration_init_time'])/(24*60*60))\n",
+    "    members['registration_duration'] = ((members['expiration_date'] - members['registration_init_time'])/(24*60*60))\n",
     "    members['registration_duration'] = members['registration_duration'].apply(int)\n",
     "    return members\n",
     "\n",
@@ -1208,7 +1110,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 12,
+   "execution_count": 7,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1225,7 +1127,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 13,
+   "execution_count": 8,
    "metadata": {},
    "outputs": [
     {
@@ -1348,7 +1250,7 @@
        "4      52.0  Mary Had a Little Lamb           NaN  "
       ]
      },
-     "execution_count": 13,
+     "execution_count": 8,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1359,7 +1261,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 14,
+   "execution_count": 9,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1372,16 +1274,16 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 15,
+   "execution_count": 10,
    "metadata": {},
    "outputs": [],
    "source": [
-    "songs = apply_pipeline(songs, feature_pipeline_song)\n"
+    "songs = apply_pipeline(songs, feature_pipeline_song)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 16,
+   "execution_count": 11,
    "metadata": {},
    "outputs": [
     {
@@ -1522,7 +1424,7 @@
        "4                  16114              0         1         0            52  "
       ]
      },
-     "execution_count": 16,
+     "execution_count": 11,
      "metadata": {},
      "output_type": "execute_result"
     }
@@ -1533,7 +1435,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 17,
+   "execution_count": 12,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1542,16 +1444,110 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 13,
    "metadata": {},
-   "outputs": [],
+   "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>msno</th>\n",
+       "      <th>city</th>\n",
+       "      <th>bd</th>\n",
+       "      <th>registered_via</th>\n",
+       "      <th>registration_duration</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>XQxgAYj3klVKjR3oxPPXYYFp4soD4TuBghkhMTD4oTw=</td>\n",
+       "      <td>1</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>7</td>\n",
+       "      <td>2223</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>UizsfmJb9mV54qE9hCYyU07Va97c0lCRLEQX3ae+ztM=</td>\n",
+       "      <td>1</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>7</td>\n",
+       "      <td>725</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>D8nEhsIOBSoE6VthTaqDX8U6lqjJ7dLdr72mOyLya2A=</td>\n",
+       "      <td>1</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>4</td>\n",
+       "      <td>457</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>mCuD+tZ1hERA/o5GPqk38e041J8ZsBaLcu7nGoIIvhI=</td>\n",
+       "      <td>1</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>9</td>\n",
+       "      <td>1</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>q4HRBfVSssAFS9iRfxWrohxuk9kCYMKjHOEagUMV6rQ=</td>\n",
+       "      <td>1</td>\n",
+       "      <td>NaN</td>\n",
+       "      <td>4</td>\n",
+       "      <td>138</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "                                           msno  city  bd  registered_via  \\\n",
+       "0  XQxgAYj3klVKjR3oxPPXYYFp4soD4TuBghkhMTD4oTw=     1 NaN               7   \n",
+       "1  UizsfmJb9mV54qE9hCYyU07Va97c0lCRLEQX3ae+ztM=     1 NaN               7   \n",
+       "2  D8nEhsIOBSoE6VthTaqDX8U6lqjJ7dLdr72mOyLya2A=     1 NaN               4   \n",
+       "3  mCuD+tZ1hERA/o5GPqk38e041J8ZsBaLcu7nGoIIvhI=     1 NaN               9   \n",
+       "4  q4HRBfVSssAFS9iRfxWrohxuk9kCYMKjHOEagUMV6rQ=     1 NaN               4   \n",
+       "\n",
+       "   registration_duration  \n",
+       "0                   2223  \n",
+       "1                    725  \n",
+       "2                    457  \n",
+       "3                      1  \n",
+       "4                    138  "
+      ]
+     },
+     "execution_count": 13,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
    "source": [
     "members.head()"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 18,
+   "execution_count": 14,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1565,7 +1561,28 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 76,
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Drop composer count and lyristics count\n",
+    "train = train.drop('lyricist_count', axis = 1)\n",
+    "train = train.drop('composer_count', axis = 1)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "test = test.drop('lyricist_count', axis = 1)\n",
+    "test = test.drop('composer_count', axis = 1)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
    "metadata": {},
    "outputs": [],
    "source": [
@@ -1577,26 +1594,86 @@
     "    for i in transfer:\n",
     "        data[i] = np.array(le.fit_transform(data[i].tolist()))\n",
     "\n",
-    "\n",
     "labelencoding(train, transfer)\n",
     "labelencoding(test, transfer)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 18,
    "metadata": {},
    "outputs": [],
    "source": [
-    "# training and validation dataset split\n"
+    "# 缺失值处理\n",
+    "# fillnan data with mode\n",
+    "missing_attribute_list = dict(train.isnull().any())\n",
+    "attribute_name = [i for i in list(missing_attribute_list.keys()) if missing_attribute_list[i] == True ]\n",
+    "for i in attribute_name:\n",
+    "    train[i].fillna(train[i].mode()[0], inplace = True)\n",
+    "    test[i].fillna(test[i].mode()[0], inplace = True)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 79,
+   "execution_count": 19,
    "metadata": {},
    "outputs": [],
    "source": [
+    "#np.array(train.song_id).reshape(-1,1).ravel()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Sparse label data from train dataset\n",
+    "\n",
+    "label = train.target.tolist()\n",
+    "train = train.drop('target', axis = 1)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Normalise numerical data: registration_duration & song_length\n",
+    "\n",
+    "transfer_list = train.columns.tolist()\n",
+    "def normalize(data, transfer_list):\n",
+    "    min_max_scaler = preprocessing.MinMaxScaler()\n",
+    "    for i in transfer_list:\n",
+    "        temp = min_max_scaler.fit_transform(np.array(data[i]).reshape(-1,1))\n",
+    "        data[i] = temp.ravel()\n",
+    "        #data[i] = min_max_scaler(data[i])\n",
+    "        \n",
+    "normalize(train, transfer_list)\n",
+    "normalize(test, transfer_list)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "\n",
+    "\n",
+    "# training and validation dataset split 70:30 & shuffle\n",
+    "\n",
+    "data_train, data_val, label_train, label_val = train_test_split(train, label, test_size=0.3, shuffle=True )"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 31,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# save and load the data using pickle (Optional)\n",
     "import pickle\n",
     "\n",
     "def save(obj, filename):\n",
@@ -1613,7 +1690,7 @@
   },
   {
    "cell_type": "code",
-   "execution_count": 83,
+   "execution_count": 32,
    "metadata": {},
    "outputs": [
     {
@@ -1622,18 +1699,18 @@
        "1"
       ]
      },
-     "execution_count": 83,
+     "execution_count": 32,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "save(train, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\train.pkl')"
+    "save(data_train, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\data_train.pkl')"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 84,
+   "execution_count": 33,
    "metadata": {},
    "outputs": [
     {
@@ -1642,445 +1719,53 @@
        "1"
       ]
      },
-     "execution_count": 84,
+     "execution_count": 33,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "save(test, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\test.pkl')"
+    "save(data_val, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\data_val.pkl')"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 21,
+   "execution_count": 34,
    "metadata": {},
    "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>msno</th>\n",
-       "      <th>song_id</th>\n",
-       "      <th>source_system_tab</th>\n",
-       "      <th>source_screen_name</th>\n",
-       "      <th>source_type</th>\n",
-       "      <th>target</th>\n",
-       "      <th>song_length</th>\n",
-       "      <th>song_year</th>\n",
-       "      <th>first_genre_type</th>\n",
-       "      <th>artist_count</th>\n",
-       "      <th>...</th>\n",
-       "      <th>lyricist_count</th>\n",
-       "      <th>first_genre_typecount</th>\n",
-       "      <th>featured_song</th>\n",
-       "      <th>same_c_l</th>\n",
-       "      <th>all_same</th>\n",
-       "      <th>song_language</th>\n",
-       "      <th>city</th>\n",
-       "      <th>bd</th>\n",
-       "      <th>registered_via</th>\n",
-       "      <th>registration_duration</th>\n",
-       "    </tr>\n",
-       "  </thead>\n",
-       "  <tbody>\n",
-       "    <tr>\n",
-       "      <th>0</th>\n",
-       "      <td>8158</td>\n",
-       "      <td>74679</td>\n",
-       "      <td>explore</td>\n",
-       "      <td>Explore</td>\n",
-       "      <td>online-playlist</td>\n",
-       "      <td>1</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>...</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>1</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>7</td>\n",
-       "      <td>2103</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>1</th>\n",
-       "      <td>17259</td>\n",
-       "      <td>223479</td>\n",
-       "      <td>my library</td>\n",
-       "      <td>Local playlist more</td>\n",
-       "      <td>local-playlist</td>\n",
-       "      <td>1</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>...</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>13</td>\n",
-       "      <td>24.0</td>\n",
-       "      <td>9</td>\n",
-       "      <td>2301</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>2</th>\n",
-       "      <td>17259</td>\n",
-       "      <td>120758</td>\n",
-       "      <td>my library</td>\n",
-       "      <td>Local playlist more</td>\n",
-       "      <td>local-playlist</td>\n",
-       "      <td>1</td>\n",
-       "      <td>225396.0</td>\n",
-       "      <td>2006.0</td>\n",
-       "      <td>1259</td>\n",
-       "      <td>186.0</td>\n",
-       "      <td>...</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>44584.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>52</td>\n",
-       "      <td>13</td>\n",
-       "      <td>24.0</td>\n",
-       "      <td>9</td>\n",
-       "      <td>2301</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>3</th>\n",
-       "      <td>17259</td>\n",
-       "      <td>23707</td>\n",
-       "      <td>my library</td>\n",
-       "      <td>Local playlist more</td>\n",
-       "      <td>local-playlist</td>\n",
-       "      <td>1</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>...</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>13</td>\n",
-       "      <td>24.0</td>\n",
-       "      <td>9</td>\n",
-       "      <td>2301</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>4</th>\n",
-       "      <td>8158</td>\n",
-       "      <td>33308</td>\n",
-       "      <td>explore</td>\n",
-       "      <td>Explore</td>\n",
-       "      <td>online-playlist</td>\n",
-       "      <td>1</td>\n",
-       "      <td>187802.0</td>\n",
-       "      <td>2016.0</td>\n",
-       "      <td>1011</td>\n",
-       "      <td>18.0</td>\n",
-       "      <td>...</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>13030.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>52</td>\n",
-       "      <td>1</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>7</td>\n",
-       "      <td>2103</td>\n",
-       "    </tr>\n",
-       "  </tbody>\n",
-       "</table>\n",
-       "<p>5 rows × 21 columns</p>\n",
-       "</div>"
-      ],
       "text/plain": [
-       "    msno  song_id source_system_tab   source_screen_name      source_type  \\\n",
-       "0   8158    74679           explore              Explore  online-playlist   \n",
-       "1  17259   223479        my library  Local playlist more   local-playlist   \n",
-       "2  17259   120758        my library  Local playlist more   local-playlist   \n",
-       "3  17259    23707        my library  Local playlist more   local-playlist   \n",
-       "4   8158    33308           explore              Explore  online-playlist   \n",
-       "\n",
-       "   target  song_length  song_year first_genre_type  artist_count  ...  \\\n",
-       "0       1          NaN        NaN              NaN           NaN  ...   \n",
-       "1       1          NaN        NaN              NaN           NaN  ...   \n",
-       "2       1     225396.0     2006.0             1259         186.0  ...   \n",
-       "3       1          NaN        NaN              NaN           NaN  ...   \n",
-       "4       1     187802.0     2016.0             1011          18.0  ...   \n",
-       "\n",
-       "   lyricist_count  first_genre_typecount  featured_song  same_c_l  all_same  \\\n",
-       "0             NaN                    NaN            NaN       NaN       NaN   \n",
-       "1             NaN                    NaN            NaN       NaN       NaN   \n",
-       "2             NaN                44584.0            0.0       0.0       0.0   \n",
-       "3             NaN                    NaN            NaN       NaN       NaN   \n",
-       "4             NaN                13030.0            0.0       0.0       0.0   \n",
-       "\n",
-       "   song_language city    bd  registered_via  registration_duration  \n",
-       "0            NaN    1   NaN               7                   2103  \n",
-       "1            NaN   13  24.0               9                   2301  \n",
-       "2             52   13  24.0               9                   2301  \n",
-       "3            NaN   13  24.0               9                   2301  \n",
-       "4             52    1   NaN               7                   2103  \n",
-       "\n",
-       "[5 rows x 21 columns]"
+       "1"
       ]
      },
-     "execution_count": 21,
+     "execution_count": 34,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "train.head()"
+    "save(label_train, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\label_train.pkl')"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": 85,
+   "execution_count": 35,
    "metadata": {},
    "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>msno</th>\n",
-       "      <th>song_id</th>\n",
-       "      <th>source_system_tab</th>\n",
-       "      <th>source_screen_name</th>\n",
-       "      <th>source_type</th>\n",
-       "      <th>song_length</th>\n",
-       "      <th>song_year</th>\n",
-       "      <th>first_genre_type</th>\n",
-       "      <th>artist_count</th>\n",
-       "      <th>...</th>\n",
-       "      <th>lyricist_count</th>\n",
-       "      <th>first_genre_typecount</th>\n",
-       "      <th>featured_song</th>\n",
-       "      <th>same_c_l</th>\n",
-       "      <th>all_same</th>\n",
-       "      <th>song_language</th>\n",
-       "      <th>city</th>\n",
-       "      <th>bd</th>\n",
-       "      <th>registered_via</th>\n",
-       "      <th>registration_duration</th>\n",
-       "    </tr>\n",
-       "  </thead>\n",
-       "  <tbody>\n",
-       "    <tr>\n",
-       "      <th>0</th>\n",
-       "      <td>0</td>\n",
-       "      <td>12934</td>\n",
-       "      <td>122191</td>\n",
-       "      <td>3</td>\n",
-       "      <td>8</td>\n",
-       "      <td>3</td>\n",
-       "      <td>224130.0</td>\n",
-       "      <td>2014.0</td>\n",
-       "      <td>103</td>\n",
-       "      <td>77.0</td>\n",
-       "      <td>...</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>11233.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>3</td>\n",
-       "      <td>1</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>7</td>\n",
-       "      <td>577</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>1</th>\n",
-       "      <td>1</td>\n",
-       "      <td>12934</td>\n",
-       "      <td>217907</td>\n",
-       "      <td>3</td>\n",
-       "      <td>8</td>\n",
-       "      <td>3</td>\n",
-       "      <td>320470.0</td>\n",
-       "      <td>2010.0</td>\n",
-       "      <td>104</td>\n",
-       "      <td>236.0</td>\n",
-       "      <td>...</td>\n",
-       "      <td>2.0</td>\n",
-       "      <td>304098.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>3</td>\n",
-       "      <td>1</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>7</td>\n",
-       "      <td>577</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>2</th>\n",
-       "      <td>2</td>\n",
-       "      <td>712</td>\n",
-       "      <td>37385</td>\n",
-       "      <td>0</td>\n",
-       "      <td>22</td>\n",
-       "      <td>10</td>\n",
-       "      <td>315899.0</td>\n",
-       "      <td>2010.0</td>\n",
-       "      <td>55</td>\n",
-       "      <td>76.0</td>\n",
-       "      <td>...</td>\n",
-       "      <td>66.0</td>\n",
-       "      <td>75940.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>1.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>17</td>\n",
-       "      <td>1</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>4</td>\n",
-       "      <td>7</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>3</th>\n",
-       "      <td>3</td>\n",
-       "      <td>1383</td>\n",
-       "      <td>224360</td>\n",
-       "      <td>6</td>\n",
-       "      <td>16</td>\n",
-       "      <td>8</td>\n",
-       "      <td>285210.0</td>\n",
-       "      <td>2002.0</td>\n",
-       "      <td>104</td>\n",
-       "      <td>288.0</td>\n",
-       "      <td>...</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>304098.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>52</td>\n",
-       "      <td>3</td>\n",
-       "      <td>30.0</td>\n",
-       "      <td>9</td>\n",
-       "      <td>3567</td>\n",
-       "    </tr>\n",
-       "    <tr>\n",
-       "      <th>4</th>\n",
-       "      <td>4</td>\n",
-       "      <td>1383</td>\n",
-       "      <td>85597</td>\n",
-       "      <td>6</td>\n",
-       "      <td>16</td>\n",
-       "      <td>8</td>\n",
-       "      <td>197590.0</td>\n",
-       "      <td>2011.0</td>\n",
-       "      <td>132</td>\n",
-       "      <td>20.0</td>\n",
-       "      <td>...</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>9111.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>0.0</td>\n",
-       "      <td>NaN</td>\n",
-       "      <td>3</td>\n",
-       "      <td>30.0</td>\n",
-       "      <td>9</td>\n",
-       "      <td>3567</td>\n",
-       "    </tr>\n",
-       "  </tbody>\n",
-       "</table>\n",
-       "<p>5 rows × 21 columns</p>\n",
-       "</div>"
-      ],
       "text/plain": [
-       "   id   msno  song_id  source_system_tab  source_screen_name  source_type  \\\n",
-       "0   0  12934   122191                  3                   8            3   \n",
-       "1   1  12934   217907                  3                   8            3   \n",
-       "2   2    712    37385                  0                  22           10   \n",
-       "3   3   1383   224360                  6                  16            8   \n",
-       "4   4   1383    85597                  6                  16            8   \n",
-       "\n",
-       "   song_length  song_year  first_genre_type  artist_count  ...  \\\n",
-       "0     224130.0     2014.0               103          77.0  ...   \n",
-       "1     320470.0     2010.0               104         236.0  ...   \n",
-       "2     315899.0     2010.0                55          76.0  ...   \n",
-       "3     285210.0     2002.0               104         288.0  ...   \n",
-       "4     197590.0     2011.0               132          20.0  ...   \n",
-       "\n",
-       "   lyricist_count  first_genre_typecount  featured_song  same_c_l  all_same  \\\n",
-       "0             NaN                11233.0            0.0       0.0       0.0   \n",
-       "1             2.0               304098.0            0.0       0.0       0.0   \n",
-       "2            66.0                75940.0            0.0       1.0       0.0   \n",
-       "3             NaN               304098.0            0.0       0.0       0.0   \n",
-       "4             NaN                 9111.0            0.0       0.0       0.0   \n",
-       "\n",
-       "   song_language city    bd  registered_via  registration_duration  \n",
-       "0              3    1   NaN               7                    577  \n",
-       "1              3    1   NaN               7                    577  \n",
-       "2             17    1   NaN               4                      7  \n",
-       "3             52    3  30.0               9                   3567  \n",
-       "4            NaN    3  30.0               9                   3567  \n",
-       "\n",
-       "[5 rows x 21 columns]"
+       "1"
       ]
      },
-     "execution_count": 85,
+     "execution_count": 35,
      "metadata": {},
      "output_type": "execute_result"
     }
    ],
    "source": [
-    "test.head()"
+    "save(label_val, r'D:\\Project\\DS\\Data Mining\\cw1\\kkbox_recommendation\\tfn\\data\\label_val.pkl')"
    ]
   },
   {
diff --git a/tfn/notebooks/EDA_continued.ipynb b/tfn/notebooks/EDA_continued.ipynb
index 5963a5358fe0a77db9a5760ddb4fdde66af8802d..3d0129935bfa1f75628eb9c93e58c4e34a2b180a 100644
--- a/tfn/notebooks/EDA_continued.ipynb
+++ b/tfn/notebooks/EDA_continued.ipynb
@@ -2053,7 +2053,7 @@
    "name": "python",
    "nbconvert_exporter": "python",
    "pygments_lexer": "ipython3",
-   "version": "3.6.9"
+   "version": "3.7.3"
   }
  },
  "nbformat": 4,
diff --git a/tfn/notebooks/count number v1.xlsx b/tfn/notebooks/count number v1.xlsx
deleted file mode 100644
index c6c0aa6b214b05699c1b0561bfedb625908d58c1..0000000000000000000000000000000000000000
Binary files a/tfn/notebooks/count number v1.xlsx and /dev/null differ
diff --git a/tfn/notebooks/debug/members_expire_date_16867.PNG b/tfn/notebooks/debug/members_expire_date_16867.PNG
deleted file mode 100644
index 5e8570e517dd2e8e660de46ded0a1ed2e40ce981..0000000000000000000000000000000000000000
Binary files a/tfn/notebooks/debug/members_expire_date_16867.PNG and /dev/null differ