{"cells":[{"metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","collapsed":true,"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","trusted":false},"cell_type":"markdown","source":"<a id='top'></a>\n# GA Revenue Prediction Test Based on Last Year's Data\nThis is a fleshing out of what GeoffPidcock's **[Joke Submission Workbook](https://www.kaggle.com/geoffpidcock/joke-submission-workbook)** shows, ie. the prediction of so few repeat visitors will be a real *&lt;word removed by Kaggle's censorship squad>* of a problem.\n\n**This kernel uses last year's data to show that the RMSE would have been, for an all zero prediction, 0.32.**\n\n## As a guide to repeat visitors here is a breakdown of the v2 train/test data:\nv2 data|<p align=\"left\">v2 data description\n---|:---\ntrain_v2   |<p align=\"left\"> 01/08/2016 -> 30/04/2018 : 21 months with 1323730 unique visitors\ntest_v2    |<p align=\"left\"> 01/05/2018 -> 05/10/2018 : 5 months with 296530 unique visitors\nprediction |<p align=\"left\"> 01/12/2018 -> 31/01/2019 : 2 months; **? repeat visitors**\n* Only 2759 visitors appear in both train_v2 and test_v2 sets, and only 195 of them have rev>0.\n* We should expect the prediction period to have a similar quantity of repeat visitors.\n\n## And here is a breakdown of last years data:\n2017 data|<p align=\"left\">2017 data description\n---|:---\ntrain       |<p align=\"left\"> we ignore training data since we're predicting all zeros\ntest        |<p align=\"left\"> 01/05/2017 -> 05/10/2017  5 months with 305597 unique visitors (similar to this year)\nprediction  |<p align=\"left\"> 01/12/2017 -> 31/01/2018  2 months which had 144049 unique visitors; **2174 repeat visitors**\n* 2174 repeat visitors is 1.20% of 144049\n* 176 had rev>0 which is 0.12% of 144049\n\n**Assuming a similar year, we'll have to predict which 0.12% of visitors will spend money.**  I think I'm going to submit all zeros.\n"},{"metadata":{"trusted":true,"_uuid":"2b8500c307775e2028ba27946cab8a7d4fa4cbde"},"cell_type":"code","source":"import sys\nimport warnings\nimport numpy as np\nimport pandas as pd \nimport json\nimport time\nimport ast\nfrom sklearn import metrics\nwarnings.filterwarnings('ignore')\n\ntrain_v2_file = '../input/train_v2.csv'\n!ls -ld $train_v2_file\nrelevant_cols = ['date', 'fullVisitorId', 'totals']\ntrain = pd.read_csv(train_v2_file, usecols=relevant_cols, dtype={'fullVisitorId': 'str'})\ntrain['totals.transactionRevenue'] = train['totals'].apply(lambda x: ast.literal_eval(x).get('transactionRevenue',np.nan))\ntrain['totals.transactionRevenue'] = pd.to_numeric(train['totals.transactionRevenue'], errors=\"coerce\")\ntrain.drop(columns=['totals'], inplace=True)\nprint (train.shape)\nprint (train.columns)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_uuid":"1e2a5fb169125b7b1348763763b0a135ac26b6ee"},"cell_type":"code","source":"def rmse_log1p(df, col1, col2):\n    return np.sqrt(metrics.mean_squared_error(np.log1p(df[col1].values), np.log1p(df[col2].values)))\n\nprint (\"\")\nprint (\"Get 5 month period for test submission and 2 month period for competition:\")\nkeepcols = ['fullVisitorId','totals.transactionRevenue']\nsubmission2017  = train.loc[(20170501 <= train['date'])].loc[(train['date'] <= 20171005)][keepcols]\ncompetition2017 = train.loc[(20171201 <= train['date'])].loc[(train['date'] <= 20180131)][keepcols]\nprint (\"submission2017\", submission2017.shape)\nprint (\"competition2017\", competition2017.shape)\n\nprint (\"\")\nprint (\"Get visitors who are in both submission and competition periods:\")\nsubmission_visitors = list(submission2017['fullVisitorId'].dropna().astype(str).unique())\ncompetition_visitors = list(competition2017['fullVisitorId'].dropna().astype(str).unique())\nvisitors_in_both = set(submission_visitors) & set(competition_visitors)\nprint (\"unique 2017 sub visitors:\",len(submission_visitors))\nprint (\"unique 2017 comp visitors:\",len(competition_visitors))\nprint (\"unique 2017 in both:\",len(visitors_in_both))\n\nprint (\"\")\nsubmission2017['totals.transactionRevenue'] = 0.0\nsubmission2017['totals.predictedRevenue'] = 0.0\nsubmission2017 = submission2017.groupby('fullVisitorId').sum().reset_index()\nprint (\"submission with unique visitors and predictions of zero:\", submission2017.shape)\n\ncompetition2017['totals.transactionRevenue'].fillna(0, inplace=True)\ncompetition2017 = competition2017.groupby('fullVisitorId').sum().reset_index()\ncompetition2017 = competition2017[competition2017['fullVisitorId'].isin(visitors_in_both)]\ncompetition2017['totals.predictedRevenue'] = 0.0\nprint (\"competition visitors who appeared in submission:\", competition2017.shape)\n\nsubmission2017 = pd.concat([submission2017, competition2017], axis=0)\nsubmission2017 = submission2017.groupby('fullVisitorId').sum().reset_index()\nprint (\"submission with competiton data for calculating RMSE:\", submission2017.shape)\n\nprint (\"\")\nprint(\"RMSE score with all predictions zero:\", rmse_log1p(submission2017, 'totals.transactionRevenue', 'totals.predictedRevenue'))","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}