{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport json\nimport gc\nimport sys\nimport math\n\nfrom pandas.io.json import json_normalize\nfrom datetime import datetime\n\nimport os\nprint(os.listdir(\"../input\"))","execution_count":1,"outputs":[{"output_type":"stream","text":"['train_v2.csv', 'test_v2.csv', 'sample_submission_v2.csv']\n","name":"stdout"}]},{"metadata":{"trusted":true,"_uuid":"e688678dc2a15c21b4ad76461cdbbe2983cdb54c"},"cell_type":"code","source":"gc.enable()\n\nfeatures = ['channelGrouping', 'date', 'fullVisitorId', 'visitId',\\\n       'visitNumber', 'visitStartTime', 'device.browser',\\\n       'device.deviceCategory', 'device.isMobile', 'device.operatingSystem',\\\n       'geoNetwork.city', 'geoNetwork.continent', 'geoNetwork.country',\\\n       'geoNetwork.metro', 'geoNetwork.networkDomain', 'geoNetwork.region',\\\n       'geoNetwork.subContinent', 'totals.bounces', 'totals.hits',\\\n       'totals.newVisits', 'totals.pageviews', 'totals.transactionRevenue',\\\n       'trafficSource.adContent', 'trafficSource.campaign',\\\n       'trafficSource.isTrueDirect', 'trafficSource.keyword',\\\n       'trafficSource.medium', 'trafficSource.referralPath',\\\n       'trafficSource.source', 'customDimensions']\n\ndef load_df(csv_path):\n    JSON_COLUMNS = ['device', 'geoNetwork', 'totals', 'trafficSource']\n    ans = pd.DataFrame()\n    dfs = pd.read_csv(csv_path, sep=',',\n            converters={column: json.loads for column in JSON_COLUMNS}, \n            dtype={'fullVisitorId': 'str'}, # Important!!\n            chunksize=100000)\n    for df in dfs:\n        df.reset_index(drop=True, inplace=True)\n        for column in JSON_COLUMNS:\n            column_as_df = json_normalize(df[column])\n            column_as_df.columns = [f\"{column}.{subcolumn}\" for subcolumn in column_as_df.columns]\n            df = df.drop(column, axis=1).merge(column_as_df, right_index=True, left_index=True)\n\n        #print(f\"Loaded {os.path.basename(csv_path)}. Shape: {df.shape}\")\n        use_df = df[features]\n        del df\n        gc.collect()\n        ans = pd.concat([ans, use_df], axis=0).reset_index(drop=True)\n        #print(ans.shape)\n    return ans","execution_count":2,"outputs":[]},{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":true,"scrolled":true},"cell_type":"code","source":"%%time\ntrain = load_df('../input/train_v2.csv')\ntest = load_df('../input/test_v2.csv')\n\nprint('train date:', min(train['date']), 'to', max(train['date']))\nprint('test date:', min(test['date']), 'to', max(test['date']))","execution_count":3,"outputs":[{"output_type":"stream","text":"train date: 20160801 to 20180430\ntest date: 20180501 to 20181015\nCPU times: user 13min 8s, sys: 54.4 s, total: 14min 3s\nWall time: 14min 3s\n","name":"stdout"}]},{"metadata":{"trusted":true,"_uuid":"838393362ad3cf67afe056b0a27cb11926077220"},"cell_type":"code","source":"# Thanks and credited to https://www.kaggle.com/gemartin\ndef reduce_mem_usage(df):\n    \"\"\" iterate through all the columns of a dataframe and modify the data type\n        to reduce memory usage.        \n    \"\"\"\n    start_mem = df.memory_usage().sum() \n    print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))\n    \n    for col in df.columns:\n        col_type = df[col].dtype\n        \n        if col_type != object:\n            c_min = df[col].min()\n            c_max = df[col].max()\n            if str(col_type)[:3] == 'int':\n                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:\n                    df[col] = df[col].astype(np.int8)\n                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:\n                    df[col] = df[col].astype(np.int16)\n                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:\n                    df[col] = df[col].astype(np.int32)\n                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:\n                    df[col] = df[col].astype(np.int64)  \n            else:\n                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:\n                    df[col] = df[col].astype(np.float16)\n                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:\n                    df[col] = df[col].astype(np.float32)\n                else:\n                    df[col] = df[col].astype(np.float64)\n        #else:\n            #df[col] = df[col].astype('category')\n\n    end_mem = df.memory_usage().sum() \n    print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))\n    print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))\n    return df\n\ntrain = reduce_mem_usage(train)\ntest = reduce_mem_usage(test)","execution_count":4,"outputs":[{"output_type":"stream","text":"Memory usage of dataframe is 398042601.00 MB\nMemory usage after optimization is: 369000872.00 MB\nDecreased by 7.3%\nMemory usage of dataframe is 93570317.00 MB\nMemory usage after optimization is: 86743304.00 MB\nDecreased by 7.3%\n","name":"stdout"}]},{"metadata":{"trusted":true,"_uuid":"3a4cd6ceececc6736eed2ca310037ca59df30563"},"cell_type":"code","source":"# only train feature\nfor c in train.columns.values:\n    if c not in test.columns.values: print(c)","execution_count":5,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"92a8e510b31fc08078cadc85836b8807ea12ef51","scrolled":true},"cell_type":"code","source":"train['totals.transactionRevenue'].fillna(0, inplace=True)\ntrain['totals.transactionRevenue'] = np.log1p(train['totals.transactionRevenue'].astype(float))\nprint(train['totals.transactionRevenue'].describe())","execution_count":6,"outputs":[{"output_type":"stream","text":"count    1.708337e+06\nmean     1.925875e-01\nstd      1.844057e+00\nmin      0.000000e+00\n25%      0.000000e+00\n50%      0.000000e+00\n75%      0.000000e+00\nmax      2.386437e+01\nName: totals.transactionRevenue, dtype: float64\n","name":"stdout"}]},{"metadata":{"trusted":true,"_uuid":"ce7728eb1e5e50bd38f6db35feeb133b471d3721"},"cell_type":"code","source":"test['totals.transactionRevenue'] = np.nan","execution_count":7,"outputs":[]},{"metadata":{"_uuid":"39e9e2840995b2a4d084b2a23644028622451e79"},"cell_type":"markdown","source":"# "},{"metadata":{"trusted":true,"_uuid":"02c53418bb112ed272f7282d3e1e4b3228ec3f39"},"cell_type":"code","source":"all_data = train.append(test, sort=False).reset_index(drop=True)","execution_count":8,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"21e9028c7ddbec508a817e3253b3dcfccf0a6f8b"},"cell_type":"code","source":"print(all_data.info())","execution_count":9,"outputs":[{"output_type":"stream","text":"<class 'pandas.core.frame.DataFrame'>\nRangeIndex: 2109926 entries, 0 to 2109925\nData columns (total 30 columns):\nchannelGrouping               object\ndate                          int32\nfullVisitorId                 object\nvisitId                       int32\nvisitNumber                   int16\nvisitStartTime                int32\ndevice.browser                object\ndevice.deviceCategory         object\ndevice.isMobile               float16\ndevice.operatingSystem        object\ngeoNetwork.city               object\ngeoNetwork.continent          object\ngeoNetwork.country            object\ngeoNetwork.metro              object\ngeoNetwork.networkDomain      object\ngeoNetwork.region             object\ngeoNetwork.subContinent       object\ntotals.bounces                object\ntotals.hits                   object\ntotals.newVisits              object\ntotals.pageviews              object\ntotals.transactionRevenue     float64\ntrafficSource.adContent       object\ntrafficSource.campaign        object\ntrafficSource.isTrueDirect    object\ntrafficSource.keyword         object\ntrafficSource.medium          object\ntrafficSource.referralPath    object\ntrafficSource.source          object\ncustomDimensions              object\ndtypes: float16(1), float64(1), int16(1), int32(3), object(24)\nmemory usage: 434.6+ MB\nNone\n","name":"stdout"}]},{"metadata":{"trusted":true,"_uuid":"69f008c8b1d10e4b28945b97be085b43c290cc27","scrolled":false},"cell_type":"code","source":"null_cnt = train.isnull().sum().sort_values()\nprint(null_cnt[null_cnt > 0])","execution_count":10,"outputs":[{"output_type":"stream","text":"totals.pageviews                  239\ntotals.newVisits               400907\ntotals.bounces                 836759\ntrafficSource.keyword         1052780\ntrafficSource.referralPath    1142073\ntrafficSource.isTrueDirect    1173819\ntrafficSource.adContent       1643600\ndtype: int64\n","name":"stdout"}]},{"metadata":{"trusted":true,"_uuid":"f3134948730860dbe84e9a3672b5398c437b791f"},"cell_type":"code","source":"# fillna object feature\nfor col in ['trafficSource.keyword',\n            'trafficSource.referralPath',\n            'trafficSource.adContent']:\n    all_data[col].fillna('unknown', inplace=True)\n\n# fillna numeric feature\nall_data['totals.pageviews'].fillna(1, inplace=True)\nall_data['totals.newVisits'].fillna(0, inplace=True)\nall_data['totals.bounces'].fillna(0, inplace=True)\nall_data['totals.pageviews'] = all_data['totals.pageviews'].astype(int)\nall_data['totals.newVisits'] = all_data['totals.newVisits'].astype(int)\nall_data['totals.bounces'] = all_data['totals.bounces'].astype(int)\n\n# fillna boolean feature\nall_data['trafficSource.isTrueDirect'].fillna(False, inplace=True)","execution_count":11,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e93201ab3ceec116e1e66c64e8cb8b13019d96f6"},"cell_type":"code","source":"# drop constant column\nconstant_column = [col for col in all_data.columns if all_data[col].nunique() == 1]\n#for c in constant_column:\n#    print(c + ':', train[c].unique())\n\nprint('drop columns:', constant_column)\nall_data.drop(constant_column, axis=1, inplace=True)","execution_count":12,"outputs":[{"output_type":"stream","text":"drop columns: []\n","name":"stdout"}]},{"metadata":{"trusted":true,"_uuid":"e607e6782bbbaa79a7cfbaa79364223a899fe94c"},"cell_type":"code","source":"# pickup any visitor\nall_data[all_data['fullVisitorId'] == '7813149961404844386'].sort_values(by='visitNumber')[\n    ['date','visitId','visitNumber','totals.hits','totals.pageviews']].head(20)","execution_count":13,"outputs":[{"output_type":"execute_result","execution_count":13,"data":{"text/plain":"             date     visitId       ...         totals.hits totals.pageviews\n314476   20161117  1479408977       ...                  37               33\n31816    20161118  1479496350       ...                   2                2\n32524    20161118  1479507825       ...                  14               12\n338140   20161122  1479831970       ...                   3                3\n338305   20161122  1479842287       ...                   4                4\n495433   20161202  1480691778       ...                   1                1\n1203329  20161206  1481036817       ...                  12               10\n1204477  20161206  1481040342       ...                   1                1\n1203514  20161206  1481061263       ...                  28               19\n1203516  20161206  1481065071       ...                  28               26\n121418   20161209  1481296334       ...                   2                2\n119960   20161209  1481302820       ...                   6                6\n121393   20161209  1481305812       ...                   2                2\n121430   20161209  1481308967       ...                   2                2\n121497   20161209  1481311109       ...                   3                3\n1158231  20161212  1481563972       ...                   3                3\n1493009  20161214  1481747552       ...                  25               17\n747752   20170109  1483974128       ...                   1                1\n889983   20170110  1484075970       ...                  10               10\n87705    20170111  1484170311       ...                  16               13\n\n[20 rows x 5 columns]","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>date</th>\n      <th>visitId</th>\n      <th>visitNumber</th>\n      <th>totals.hits</th>\n      <th>totals.pageviews</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>314476</th>\n      <td>20161117</td>\n      <td>1479408977</td>\n      <td>1</td>\n      <td>37</td>\n      <td>33</td>\n    </tr>\n    <tr>\n      <th>31816</th>\n      <td>20161118</td>\n      <td>1479496350</td>\n      <td>2</td>\n      <td>2</td>\n      <td>2</td>\n    </tr>\n    <tr>\n      <th>32524</th>\n      <td>20161118</td>\n      <td>1479507825</td>\n      <td>3</td>\n      <td>14</td>\n      <td>12</td>\n    </tr>\n    <tr>\n      <th>338140</th>\n      <td>20161122</td>\n      <td>1479831970</td>\n      <td>4</td>\n      <td>3</td>\n      <td>3</td>\n    </tr>\n    <tr>\n      <th>338305</th>\n      <td>20161122</td>\n      <td>1479842287</td>\n      <td>5</td>\n      <td>4</td>\n      <td>4</td>\n    </tr>\n    <tr>\n      <th>495433</th>\n      <td>20161202</td>\n      <td>1480691778</td>\n      <td>13</td>\n      <td>1</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>1203329</th>\n      <td>20161206</td>\n      <td>1481036817</td>\n      <td>14</td>\n      <td>12</td>\n      <td>10</td>\n    </tr>\n    <tr>\n      <th>1204477</th>\n      <td>20161206</td>\n      <td>1481040342</td>\n      <td>15</td>\n      <td>1</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>1203514</th>\n      <td>20161206</td>\n      <td>1481061263</td>\n      <td>16</td>\n      <td>28</td>\n      <td>19</td>\n    </tr>\n    <tr>\n      <th>1203516</th>\n      <td>20161206</td>\n      <td>1481065071</td>\n      <td>17</td>\n      <td>28</td>\n      <td>26</td>\n    </tr>\n    <tr>\n      <th>121418</th>\n      <td>20161209</td>\n      <td>1481296334</td>\n      <td>20</td>\n      <td>2</td>\n      <td>2</td>\n    </tr>\n    <tr>\n      <th>119960</th>\n      <td>20161209</td>\n      <td>1481302820</td>\n      <td>21</td>\n      <td>6</td>\n      <td>6</td>\n    </tr>\n    <tr>\n      <th>121393</th>\n      <td>20161209</td>\n      <td>1481305812</td>\n      <td>22</td>\n      <td>2</td>\n      <td>2</td>\n    </tr>\n    <tr>\n      <th>121430</th>\n      <td>20161209</td>\n      <td>1481308967</td>\n      <td>23</td>\n      <td>2</td>\n      <td>2</td>\n    </tr>\n    <tr>\n      <th>121497</th>\n      <td>20161209</td>\n      <td>1481311109</td>\n      <td>24</td>\n      <td>3</td>\n      <td>3</td>\n    </tr>\n    <tr>\n      <th>1158231</th>\n      <td>20161212</td>\n      <td>1481563972</td>\n      <td>25</td>\n      <td>3</td>\n      <td>3</td>\n    </tr>\n    <tr>\n      <th>1493009</th>\n      <td>20161214</td>\n      <td>1481747552</td>\n      <td>26</td>\n      <td>25</td>\n      <td>17</td>\n    </tr>\n    <tr>\n      <th>747752</th>\n      <td>20170109</td>\n      <td>1483974128</td>\n      <td>28</td>\n      <td>1</td>\n      <td>1</td>\n    </tr>\n    <tr>\n      <th>889983</th>\n      <td>20170110</td>\n      <td>1484075970</td>\n      <td>29</td>\n      <td>10</td>\n      <td>10</td>\n    </tr>\n    <tr>\n      <th>87705</th>\n      <td>20170111</td>\n      <td>1484170311</td>\n      <td>30</td>\n      <td>16</td>\n      <td>13</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"trusted":true,"_uuid":"a8f4e841406d2babd6e8c3429dc0f9221a2f58ad"},"cell_type":"code","source":"train_rev = train[train['totals.transactionRevenue'] > 0].copy()\nprint(len(train_rev))\ntrain_rev.head()","execution_count":14,"outputs":[{"output_type":"stream","text":"18514\n","name":"stdout"},{"output_type":"execute_result","execution_count":14,"data":{"text/plain":"    channelGrouping                     ...                                                customDimensions\n433  Organic Search                     ...                      [{'index': '4', 'value': 'North America'}]\n550        Referral                     ...                      [{'index': '4', 'value': 'North America'}]\n555  Organic Search                     ...                      [{'index': '4', 'value': 'North America'}]\n597        Referral                     ...                      [{'index': '4', 'value': 'North America'}]\n619        Referral                     ...                      [{'index': '4', 'value': 'North America'}]\n\n[5 rows x 30 columns]","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>channelGrouping</th>\n      <th>date</th>\n      <th>fullVisitorId</th>\n      <th>visitId</th>\n      <th>visitNumber</th>\n      <th>visitStartTime</th>\n      <th>device.browser</th>\n      <th>device.deviceCategory</th>\n      <th>device.isMobile</th>\n      <th>device.operatingSystem</th>\n      <th>geoNetwork.city</th>\n      <th>geoNetwork.continent</th>\n      <th>geoNetwork.country</th>\n      <th>geoNetwork.metro</th>\n      <th>geoNetwork.networkDomain</th>\n      <th>geoNetwork.region</th>\n      <th>geoNetwork.subContinent</th>\n      <th>totals.bounces</th>\n      <th>totals.hits</th>\n      <th>totals.newVisits</th>\n      <th>totals.pageviews</th>\n      <th>totals.transactionRevenue</th>\n      <th>trafficSource.adContent</th>\n      <th>trafficSource.campaign</th>\n      <th>trafficSource.isTrueDirect</th>\n      <th>trafficSource.keyword</th>\n      <th>trafficSource.medium</th>\n      <th>trafficSource.referralPath</th>\n      <th>trafficSource.source</th>\n      <th>customDimensions</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>433</th>\n      <td>Organic Search</td>\n      <td>20171016</td>\n      <td>9549826748224805897</td>\n      <td>1508200705</td>\n      <td>4</td>\n      <td>1508200705</td>\n      <td>Chrome</td>\n      <td>desktop</td>\n      <td>0.0</td>\n      <td>Macintosh</td>\n      <td>New York</td>\n      <td>Americas</td>\n      <td>United States</td>\n      <td>New York NY</td>\n      <td>(not set)</td>\n      <td>New York</td>\n      <td>Northern America</td>\n      <td>NaN</td>\n      <td>9</td>\n      <td>NaN</td>\n      <td>9</td>\n      <td>16.536148</td>\n      <td>NaN</td>\n      <td>(not set)</td>\n      <td>True</td>\n      <td>(not provided)</td>\n      <td>organic</td>\n      <td>NaN</td>\n      <td>google</td>\n      <td>[{'index': '4', 'value': 'North America'}]</td>\n    </tr>\n    <tr>\n      <th>550</th>\n      <td>Referral</td>\n      <td>20171016</td>\n      <td>3700714855829972615</td>\n      <td>1508192636</td>\n      <td>11</td>\n      <td>1508192636</td>\n      <td>Chrome</td>\n      <td>desktop</td>\n      <td>0.0</td>\n      <td>Windows</td>\n      <td>Irvine</td>\n      <td>Americas</td>\n      <td>United States</td>\n      <td>Los Angeles CA</td>\n      <td>(not set)</td>\n      <td>California</td>\n      <td>Northern America</td>\n      <td>NaN</td>\n      <td>15</td>\n      <td>NaN</td>\n      <td>12</td>\n      <td>15.894952</td>\n      <td>NaN</td>\n      <td>(not set)</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>(none)</td>\n      <td>/</td>\n      <td>(direct)</td>\n      <td>[{'index': '4', 'value': 'North America'}]</td>\n    </tr>\n    <tr>\n      <th>555</th>\n      <td>Organic Search</td>\n      <td>20171016</td>\n      <td>1572225825161580042</td>\n      <td>1508162218</td>\n      <td>6</td>\n      <td>1508162218</td>\n      <td>Safari</td>\n      <td>mobile</td>\n      <td>1.0</td>\n      <td>iOS</td>\n      <td>Mountain View</td>\n      <td>Americas</td>\n      <td>United States</td>\n      <td>San Francisco-Oakland-San Jose CA</td>\n      <td>purechat.com</td>\n      <td>California</td>\n      <td>Northern America</td>\n      <td>NaN</td>\n      <td>15</td>\n      <td>NaN</td>\n      <td>15</td>\n      <td>17.863811</td>\n      <td>NaN</td>\n      <td>(not set)</td>\n      <td>True</td>\n      <td>(not provided)</td>\n      <td>organic</td>\n      <td>NaN</td>\n      <td>google</td>\n      <td>[{'index': '4', 'value': 'North America'}]</td>\n    </tr>\n    <tr>\n      <th>597</th>\n      <td>Referral</td>\n      <td>20171016</td>\n      <td>7187192533100162289</td>\n      <td>1508189401</td>\n      <td>17</td>\n      <td>1508189401</td>\n      <td>Chrome</td>\n      <td>desktop</td>\n      <td>0.0</td>\n      <td>Macintosh</td>\n      <td>Mountain View</td>\n      <td>Americas</td>\n      <td>United States</td>\n      <td>San Francisco-Oakland-San Jose CA</td>\n      <td>(not set)</td>\n      <td>California</td>\n      <td>Northern America</td>\n      <td>NaN</td>\n      <td>18</td>\n      <td>NaN</td>\n      <td>16</td>\n      <td>16.718579</td>\n      <td>NaN</td>\n      <td>(not set)</td>\n      <td>True</td>\n      <td>NaN</td>\n      <td>(none)</td>\n      <td>/</td>\n      <td>(direct)</td>\n      <td>[{'index': '4', 'value': 'North America'}]</td>\n    </tr>\n    <tr>\n      <th>619</th>\n      <td>Referral</td>\n      <td>20171016</td>\n      <td>7889233516776348524</td>\n      <td>1508190484</td>\n      <td>1</td>\n      <td>1508190484</td>\n      <td>Chrome</td>\n      <td>desktop</td>\n      <td>0.0</td>\n      <td>Macintosh</td>\n      <td>New York</td>\n      <td>Americas</td>\n      <td>United States</td>\n      <td>New York NY</td>\n      <td>(not set)</td>\n      <td>New York</td>\n      <td>Northern America</td>\n      <td>NaN</td>\n      <td>21</td>\n      <td>1</td>\n      <td>20</td>\n      <td>16.325923</td>\n      <td>NaN</td>\n      <td>(not set)</td>\n      <td>NaN</td>\n      <td>NaN</td>\n      <td>(none)</td>\n      <td>/</td>\n      <td>(direct)</td>\n      <td>[{'index': '4', 'value': 'North America'}]</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"metadata":{"trusted":true,"_uuid":"a4558c13d3270bd5e12a8abae94dc144194d4cd0"},"cell_type":"code","source":"def plotCategoryRateBar(a, b, colName, topN=np.nan):\n    if topN == topN: # isNotNan\n        vals = b[colName].value_counts()[:topN]\n        subA = a.loc[a[colName].isin(vals.index.values), colName]\n        df = pd.DataFrame({'All':subA.value_counts() / len(a), 'Revenue':vals / len(b)})\n    else:\n        df = pd.DataFrame({'All':a[colName].value_counts() / len(a), 'Revenue':b[colName].value_counts() / len(b)})\n    df.sort_values('Revenue').plot.barh(colormap='jet')","execution_count":15,"outputs":[]},{"metadata":{"_uuid":"76b8e5cdbcd0f77f0af9a38fc23d7d28de7ac6b3"},"cell_type":"markdown","source":"## customDimensions"},{"metadata":{"trusted":true,"_uuid":"bf4afafc3b1a3af5fc244c663f64dacea55f7428"},"cell_type":"code","source":"print('unique customDimensions count:', train['customDimensions'].nunique())\nplotCategoryRateBar(all_data, train_rev, 'customDimensions')","execution_count":16,"outputs":[{"output_type":"stream","text":"unique customDimensions count: 6\n","name":"stdout"},{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{"_uuid":"df1597ce637e40c82ddbce0567f1aca6d44010d5"},"cell_type":"markdown","source":"## date"},{"metadata":{"trusted":true,"_uuid":"7f62796c68e95615311e28ec061fc76c0877e967"},"cell_type":"code","source":"format_str = '%Y%m%d'\nall_data['formated_date'] = all_data['date'].apply(lambda x: datetime.strptime(str(x), format_str))\nall_data['_year'] = all_data['formated_date'].apply(lambda x:x.year)\nall_data['_month'] = all_data['formated_date'].apply(lambda x:x.month)\nall_data['_quarterMonth'] = all_data['formated_date'].apply(lambda x:x.day//8)\nall_data['_day'] = all_data['formated_date'].apply(lambda x:x.day)\nall_data['_weekday'] = all_data['formated_date'].apply(lambda x:x.weekday())\n\nall_data.drop(['date','formated_date'], axis=1, inplace=True)","execution_count":17,"outputs":[]},{"metadata":{"_uuid":"67f4ef3a6889ca30fdc15847fda4f21de1a9dc21"},"cell_type":"markdown","source":"## channelGrouping\n* The channel via which the user came to the Store."},{"metadata":{"trusted":true,"_uuid":"dcd7482789b1e78f42cc63a442fd9b165ca2c351"},"cell_type":"code","source":"plotCategoryRateBar(all_data, train_rev, 'channelGrouping')","execution_count":18,"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{"_uuid":"62571c594360b5ffdb8eed4fbea60d4307de9ae4"},"cell_type":"markdown","source":"## fullVisitorId\n* A unique identifier for each user of the Google Merchandise Store.\n\n## visitId\n* An identifier for this session. This is part of the value usually stored as the _utmb cookie. This is only unique to the user.   \nFor a completely unique ID, you should use a combination of fullVisitorId and visitId.\n\n## newVisits\n"},{"metadata":{"trusted":true,"_uuid":"e8799d0686a4caa28107145884221bdfaa1412ce"},"cell_type":"code","source":"print('train all:', len(train))\nprint('train unique fullVisitorId:', train['fullVisitorId'].nunique())\nprint('train unique visitId:', train['visitId'].nunique())\nprint('-' * 30)\nprint('test all:', len(test))\nprint('test unique fullVisitorId:', test['fullVisitorId'].nunique())\nprint('test unique visitId:', test['visitId'].nunique())\n\n#print('common fullVisitorId:', len(pd.merge(train, test, how='inner', on='fullVisitorId'))) # 183434","execution_count":19,"outputs":[{"output_type":"stream","text":"train all: 1708337\ntrain unique fullVisitorId: 1323730\ntrain unique visitId: 1665802\n------------------------------\ntest all: 401589\ntest unique fullVisitorId: 296530\ntest unique visitId: 393181\n","name":"stdout"}]},{"metadata":{"trusted":true,"_uuid":"47d962d3eb9f8674f7dc2a457877faab6cbaa916"},"cell_type":"code","source":"print(all_data['visitNumber'].value_counts()[:5])\nprint('-' * 30)\nprint(all_data['totals.newVisits'].value_counts())\nprint('-' * 30)\nprint(all_data['totals.bounces'].value_counts())","execution_count":20,"outputs":[{"output_type":"stream","text":"1    1593495\n2     235089\n3      92462\n4      49195\n5      30281\nName: visitNumber, dtype: int64\n------------------------------\n1    1593495\n0     516431\nName: totals.newVisits, dtype: int64\n------------------------------\n0    1055670\n1    1054256\nName: totals.bounces, dtype: int64\n","name":"stdout"}]},{"metadata":{"trusted":true,"scrolled":false,"_uuid":"b8b2c483edf2c431d7d8c1615bd7f14b57e4e149"},"cell_type":"code","source":"#maxVisitNumber = max(all_data['visitNumber'])\n#fvid = all_data[all_data['visitNumber'] == maxVisitNumber]['fullVisitorId']\n#all_data[all_data['fullVisitorId'] == fvid.values[0]].sort_values(by='visitNumber')","execution_count":21,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d17c15ad90f60602af11d19a9cf1c8ca8c7abb98"},"cell_type":"code","source":"all_data['_visitStartHour'] = all_data['visitStartTime'].apply(\n    lambda x: str(datetime.fromtimestamp(x).hour))","execution_count":22,"outputs":[]},{"metadata":{"_uuid":"a6b79c64d4c75031a9cd6d04abeff9eaa9648b25"},"cell_type":"markdown","source":"## device"},{"metadata":{"trusted":true,"_uuid":"94893bde8a5f5f2cdd5fe7757eab49f252753adb"},"cell_type":"code","source":"print('unique browser count:', train['device.browser'].nunique())\nplotCategoryRateBar(all_data, train_rev, 'device.browser', 10)","execution_count":23,"outputs":[{"output_type":"stream","text":"unique browser count: 129\n","name":"stdout"},{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{"trusted":true,"_uuid":"6103fcf3bcc3f70eec8a93d91551ec134b122342"},"cell_type":"code","source":"pd.crosstab(all_data['device.deviceCategory'], all_data['device.isMobile'], margins=False)\n\nall_data['isMobile'] = True\nall_data.loc[all_data['device.deviceCategory'] == 'desktop', 'isMobile'] = False","execution_count":24,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d8df08c75a5c8ac8f4771805d09d96b83362f3ae"},"cell_type":"code","source":"print('unique operatingSystem count:', train['device.operatingSystem'].nunique())\nplotCategoryRateBar(all_data, train_rev, 'device.operatingSystem', 10)","execution_count":25,"outputs":[{"output_type":"stream","text":"unique operatingSystem count: 24\n","name":"stdout"},{"output_type":"display_data","data":{"text/plain":"<Figure size 432x288 with 1 Axes>","image/png":"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\n"},"metadata":{}}]},{"metadata":{"_uuid":"d33b8252e73c702753086bb7c0a889f1a7922a9e"},"cell_type":"markdown","source":"## geoNetwork"},{"metadata":{"trusted":true,"_uuid":"3b1eaa2069013d4a1c19b80516e159a536dc6d8d"},"cell_type":"code","source":"print('unique geoNetwork.city count:', train['geoNetwork.city'].nunique())\nplotCategoryRateBar(all_data, train_rev, 'geoNetwork.city', 10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"4f44c8d97db856c51d763f5212aa3c98698130e3"},"cell_type":"code","source":"print('unique geoNetwork.region count:', train['geoNetwork.region'].nunique())\nplotCategoryRateBar(all_data, train_rev, 'geoNetwork.region', 10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"95c2c106c2f546e66c3d55c8cb791fffdbc10107"},"cell_type":"code","source":"print('unique geoNetwork.subContinent count:', train['geoNetwork.subContinent'].nunique())\nplotCategoryRateBar(all_data, train_rev, 'geoNetwork.subContinent', 10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"scrolled":true,"_uuid":"0464279e4253c4b89ba7bfb085f7049ed85bc128"},"cell_type":"code","source":"print('unique geoNetwork.continent count:', train['geoNetwork.continent'].nunique())\nplotCategoryRateBar(all_data, train_rev, 'geoNetwork.continent')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"084e17c130b2a0db036b9024d16440202b391bf6"},"cell_type":"code","source":"print('unique geoNetwork.metro count:', train['geoNetwork.metro'].nunique())\nplotCategoryRateBar(all_data, train_rev, 'geoNetwork.metro', 10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"2c5ae32c4cd8953a6f722ff66a72e6266a057d17","scrolled":false},"cell_type":"code","source":"print('unique geoNetwork.networkDomain count:', train['geoNetwork.networkDomain'].nunique())\nplotCategoryRateBar(all_data, train_rev, 'geoNetwork.networkDomain', 10)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"88469fecbc877ce38ea430e1cfd5e5ab998033e5"},"cell_type":"markdown","source":"## totals"},{"metadata":{"trusted":true,"_uuid":"82570f747376d5688ce66ff788d6687b5d92447b","scrolled":true},"cell_type":"code","source":"print(all_data['totals.hits'].value_counts()[:10])\n\nall_data['totals.hits'] = all_data['totals.hits'].astype(int)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d4b608e99f2ed2e8c2732ec7aabf3b24335e5ad8"},"cell_type":"code","source":"print(all_data['totals.pageviews'].value_counts()[:10])\n\nall_data['totals.pageviews'] = all_data['totals.pageviews'].astype(int)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1ed36a972f984806f846c77a44cdc7aa5285ab5b"},"cell_type":"code","source":"#print(all_data['totals.visits'].value_counts())","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"6bff69f27cc25158cf9aa565173d8aec5a6290ee"},"cell_type":"markdown","source":"## trafficSource"},{"metadata":{"trusted":true,"_uuid":"27776645f0f26a7cdd4ff84334df20d7451c37ae"},"cell_type":"code","source":"print('unique trafficSource.adContent count:', train['trafficSource.adContent'].nunique())\n\nplotCategoryRateBar(all_data, train_rev, 'trafficSource.adContent', 10)\n\nall_data['_adContentGMC'] = (all_data['trafficSource.adContent'] == 'Google Merchandise Collection').astype(np.uint8)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"216ff4ed12ecb7543b1cb0a71582f580cfc1becc","scrolled":false},"cell_type":"code","source":"print('unique trafficSource.campaign count:', train['trafficSource.campaign'].nunique())\nplotCategoryRateBar(all_data, train_rev, 'trafficSource.campaign', 10)\n\nall_data['_withCampaign'] = (all_data['trafficSource.campaign'] != '(not set)').astype(np.uint8)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8ddc105a27a0647205e91113d1e6744856756848"},"cell_type":"code","source":"print(all_data['trafficSource.isTrueDirect'].value_counts())\nplotCategoryRateBar(all_data, train_rev, 'trafficSource.isTrueDirect')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"7492ccdd02d468d1e7d9df57dfd3d09e5f4c2ed5"},"cell_type":"code","source":"print('unique trafficSource.keyword count:', train['trafficSource.keyword'].nunique())\nplotCategoryRateBar(all_data, train_rev, 'trafficSource.keyword', 10)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"8cc6336da483573190d7bbfc039d0aae3afc26a7"},"cell_type":"code","source":"print('unique trafficSource.medium count:', train['trafficSource.medium'].nunique())\nplotCategoryRateBar(all_data, train_rev, 'trafficSource.medium')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"68bbc2cf706edc7878ec79ef18a50ce39d5f6985","scrolled":true},"cell_type":"code","source":"print('unique trafficSource.referralPath count:', train['trafficSource.referralPath'].nunique())\nplotCategoryRateBar(all_data, train_rev, 'trafficSource.referralPath', 10)\n\nall_data['_referralRoot'] = (all_data['trafficSource.referralPath'] == '/').astype(np.uint8)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"921c55633ac9c113521b33611564762bc8090919"},"cell_type":"code","source":"print('unique trafficSource.source count:', train['trafficSource.source'].nunique())\nplotCategoryRateBar(all_data, train_rev, 'trafficSource.source', 10)\n\nall_data['_sourceGpmall'] = (all_data['trafficSource.source'] == 'mall.googleplex.com').astype(np.uint8)","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"7a0eef047ac62a8ab52abb174de2e84dd6150ed9"},"cell_type":"markdown","source":"## Aggregate"},{"metadata":{"trusted":true,"_uuid":"2dc1702ba3ecfc3c1e9b439fc9ba5f4a53b12ecb"},"cell_type":"code","source":"_='''\n'''\nall_data['_meanHitsPerDay'] = all_data.groupby(['_day'])['totals.hits'].transform('mean')\nall_data['_meanHitsPerWeekday'] = all_data.groupby(['_weekday'])['totals.hits'].transform('mean')\nall_data['_meanHitsPerMonth'] = all_data.groupby(['_month'])['totals.hits'].transform('mean')\nall_data['_sumHitsPerDay'] = all_data.groupby(['_day'])['totals.hits'].transform('sum')\nall_data['_sumHitsPerWeekday'] = all_data.groupby(['_weekday'])['totals.hits'].transform('sum')\nall_data['_sumHitsPerMonth'] = all_data.groupby(['_month'])['totals.hits'].transform('sum')\n\nfor feature in ['totals.hits', 'totals.pageviews']:\n    info = all_data.groupby('fullVisitorId')[feature].mean()\n    all_data['_usermean_' + feature] = all_data.fullVisitorId.map(info)\n    \nfor feature in ['visitNumber']:\n    info = all_data.groupby('fullVisitorId')[feature].max()\n    all_data['_usermax_' + feature] = all_data.fullVisitorId.map(info)\n\ndel info","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"fa595eea18a34885ba7fecbbd4bf63406d09460c"},"cell_type":"code","source":"all_data['_source.country'] = all_data['trafficSource.source'] + '_' + all_data['geoNetwork.country']\nall_data['_campaign.medium'] = all_data['trafficSource.campaign'] + '_' + all_data['trafficSource.medium']\nall_data['_browser.category'] = all_data['device.browser'] + '_' + all_data['device.deviceCategory']\nall_data['_browser.os'] = all_data['device.browser'] + '_' + all_data['device.operatingSystem']","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"7415c5915b8dd8fbe1c512f8f249ab548ce85c19"},"cell_type":"markdown","source":"## Select feature"},{"metadata":{"trusted":true,"_uuid":"19788577f9cf3b3bb98c7d229c82bd3099225187"},"cell_type":"code","source":"null_cnt = all_data.isnull().sum().sort_values()\nprint(null_cnt[null_cnt > 0])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"221c4d5f9bd5349e70c6af79d830356f7ab79428"},"cell_type":"code","source":"all_data.drop(['visitId','visitStartTime'],axis=1,inplace=True)\n\nfor i, t in all_data.loc[:, all_data.columns != 'fullVisitorId'].dtypes.iteritems():\n    if t == object:\n        all_data[i].fillna('unknown', inplace=True)\n        all_data[i] = pd.factorize(all_data[i])[0]\n        #all_data[i] = all_data[i].astype('category')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"c74fb04f46aeff7873b9d99e78a8bc030cd25340"},"cell_type":"markdown","source":"# Prediction"},{"metadata":{"trusted":true,"_uuid":"b56f51768a55937e8a7c9580fe7f91b8c0cbd6ac"},"cell_type":"code","source":"all_data.info()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f6c50f06b9c73de1dc6dd7a41e5221f7130224ad"},"cell_type":"code","source":"train = all_data[all_data['totals.transactionRevenue'].notnull()]\ntest = all_data[all_data['totals.transactionRevenue'].isnull()].drop(['totals.transactionRevenue'], axis=1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f489345ae339e46341303c9a1fa9b62ada3ef221"},"cell_type":"code","source":"test.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"684fdd483abd0da7de1c74b504ddb32a25b5c39b"},"cell_type":"code","source":"train_id = train['fullVisitorId']\ntest_id = test['fullVisitorId']\n\nY_train_reg = train.pop('totals.transactionRevenue')\n#Y_train_cls = (Y_train_reg.fillna(0) > 0).astype(np.uint8)\nX_train = train.drop(['fullVisitorId'], axis=1)\nX_test  = test.drop(['fullVisitorId'], axis=1)\n\nprint(X_train.shape, X_test.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"e4cdae49bc3394c1766bb70dc182bc5140fe068c"},"cell_type":"code","source":"del all_data, train, test, train_rev\ngc.collect()\n\nprint(pd.DataFrame([[val for val in dir()], [sys.getsizeof(eval(val)) for val in dir()]],\n                   index=['name','size']).T.sort_values('size', ascending=False).reset_index(drop=True)[:10])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"6357c37006d1433d710fd56aee8717fa1ae2efd3"},"cell_type":"code","source":"from sklearn.model_selection import StratifiedKFold, GroupKFold\nfrom sklearn.metrics import roc_auc_score\nimport lightgbm as lgb","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"f961204e8dc4b5dacbe252cfd6001e8170f15d60"},"cell_type":"code","source":"params={'learning_rate': 0.01,\n        'objective':'regression',\n        'metric':'rmse',\n        'num_leaves': 31,\n        'verbose': 1,\n        'random_state':42,\n        'bagging_fraction': 0.6,\n        'feature_fraction': 0.6\n       }\n\nfolds = GroupKFold(n_splits=5)\n\noof_preds = np.zeros(X_train.shape[0])\nsub_preds = np.zeros(X_test.shape[0])\nfor fold_, (trn_, val_) in enumerate(folds.split(X_train, Y_train_reg, groups=train_id)):\n    trn_x, trn_y = X_train.iloc[trn_], Y_train_reg.iloc[trn_]\n    val_x, val_y = X_train.iloc[val_], Y_train_reg.iloc[val_]\n    \n    reg = lgb.LGBMRegressor(**params, n_estimators=3000)\n    reg.fit(trn_x, trn_y, eval_set=[(val_x, val_y)], early_stopping_rounds=50, verbose=500)\n    \n    oof_preds[val_] = reg.predict(val_x, num_iteration=reg.best_iteration_)\n    sub_preds += reg.predict(X_test, num_iteration=reg.best_iteration_) / folds.n_splits\n\npred = sub_preds","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"c983046ebecf2476db72c27ce5288c5ab3a9cb1c"},"cell_type":"code","source":"# Plot feature importance\nfeature_importance = reg.feature_importances_\nfeature_importance = 100.0 * (feature_importance / feature_importance.max())\nsorted_idx = np.argsort(feature_importance)\nsorted_idx = sorted_idx[len(feature_importance) - 30:]\npos = np.arange(sorted_idx.shape[0]) + .5\n\nplt.figure(figsize=(12,8))\nplt.barh(pos, feature_importance[sorted_idx], align='center')\nplt.yticks(pos, X_train.columns[sorted_idx])\nplt.xlabel('Relative Importance')\nplt.title('Variable Importance')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"ce46c06204ebe113492b0bb018ca5513a8982dec"},"cell_type":"code","source":"submission = pd.DataFrame({'fullVisitorId':test_id, 'PredictedLogRevenue':pred})\n\nsubmission[\"PredictedLogRevenue\"] = np.expm1(submission[\"PredictedLogRevenue\"])\nsubmission[\"PredictedLogRevenue\"] = submission[\"PredictedLogRevenue\"].apply(lambda x : 0.0 if x < 0 else x)\nsubmission[\"PredictedLogRevenue\"] = submission[\"PredictedLogRevenue\"].fillna(0.0)\n\nsubmission_sum = submission[['fullVisitorId', 'PredictedLogRevenue']].groupby('fullVisitorId').sum().reset_index()\nsubmission_sum[\"PredictedLogRevenue\"] = np.log1p(submission_sum[\"PredictedLogRevenue\"])\nsubmission_sum.to_csv(\"submission.csv\", index=False)\nsubmission_sum.head(20)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"d4eca9c014bd3f1e0d02f9fbd39239f2be9c4628"},"cell_type":"code","source":"submission_sum['PredictedLogRevenue'].describe()","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}