From eafe2d48a0d4b0c50945bbcfa5a43753a9048fa5 Mon Sep 17 00:00:00 2001 From: ckf1n19 <ckf1n19@soton.ac.uk> Date: Tue, 26 May 2020 11:05:04 +0800 Subject: [PATCH] two verison notebooks for different models --- .../Feature description. v1.1 .xlsx | Bin 0 -> 11086 bytes ...ring_Pipeline_df1n19 v1.1-checkpoint.ipynb | 328 +-- ...ering_Pipeline_df1n19_SVM-checkpoint.ipynb | 509 ++++ .../EDA_continued-checkpoint.ipynb | 2061 +++++++++++++++++ ...tureEngineering_Pipeline_df1n19 v1.1.ipynb | 328 +-- ...reEngineering_Pipeline_df1n19_SVM v1.ipynb | 799 ++----- tfn/notebooks/EDA_continued.ipynb | 2 +- tfn/notebooks/count number v1.xlsx | Bin 12067 -> 0 bytes .../debug/members_expire_date_16867.PNG | Bin 31526 -> 0 bytes 9 files changed, 3153 insertions(+), 874 deletions(-) create mode 100644 feature extraction/Feature description. v1.1 .xlsx rename feature extraction/DataPreprocessing_FeatureEngineering_Pipeline_df1n19.ipynb => tfn/notebooks/.ipynb_checkpoints/DataPreprocessing_FeatureEngineering_Pipeline_df1n19 v1.1-checkpoint.ipynb (94%) create mode 100644 tfn/notebooks/.ipynb_checkpoints/DataPreprocessing_FeatureEngineering_Pipeline_df1n19_SVM-checkpoint.ipynb create mode 100644 tfn/notebooks/.ipynb_checkpoints/EDA_continued-checkpoint.ipynb rename feature extraction/.ipynb_checkpoints/DataPreprocessing_FeatureEngineering_Pipeline_df1n19-checkpoint.ipynb => tfn/notebooks/DataPreprocessing_FeatureEngineering_Pipeline_df1n19_SVM v1.ipynb (77%) delete mode 100644 tfn/notebooks/count number v1.xlsx delete mode 100644 tfn/notebooks/debug/members_expire_date_16867.PNG 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 GIT binary patch literal 11086 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 Q@G$T&s4+7z2x)+L0BBA-`Tzg` literal 0 HcmV?d00001 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 300137e..c62f233 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 0000000..229205f --- /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 0000000..3d01299 --- /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 300137e..c62f233 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 2ecaf3a..7010360 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 5963a53..3d01299 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 GIT binary patch literal 0 HcmV?d00001 literal 12067 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 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 GIT binary patch literal 0 HcmV?d00001 literal 31526 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 -- GitLab