{"metadata": {"language_info": {"nbconvert_exporter": "python", "version": "3.6.3", "mimetype": "text/x-python", "file_extension": ".py", "codemirror_mode": {"version": 3, "name": "ipython"}, "pygments_lexer": "ipython3", "name": "python"}, "kernelspec": {"language": "python", "display_name": "Python 3", "name": "python3"}}, "nbformat": 4, "cells": [{"metadata": {}, "cell_type": "markdown", "source": ["This kernel helps you to compare submission files.  \n", "It is very useful to find your bad predictions compared to a previous submission or a public kernel.  \n", "Enjoy !! :-)  "]}, {"metadata": {"_cell_guid": "3a17dd99-7661-46a9-a8b5-456137c991d9", "_uuid": "af74cf1b6c5cd3d3c6b1891dc4b3f3369f7537a7", "collapsed": true}, "outputs": [], "execution_count": null, "cell_type": "code", "source": ["# imports\n", "import numpy as np\n", "import pandas as pd\n", "\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline"]}, {"metadata": {}, "cell_type": "markdown", "source": ["## Load data"]}, {"metadata": {"_cell_guid": "dc1c5997-3f73-409b-a56c-297b84bd3f48", "_kg_hide-output": true, "_uuid": "625e03b07d9cee2abac59829cd72c56113be0a98"}, "outputs": [], "execution_count": null, "cell_type": "code", "source": ["# load train, test and items\n", "types = {'id': 'int64','item_nbr': 'int32','store_nbr': 'int8','unit_sales': 'float32','onpromotion': bool,}\n", "df_train= pd.read_csv(\"../input/favorita-grocery-sales-forecasting/train.csv\", parse_dates = ['date'], dtype = types, infer_datetime_format = True)\n", "\n", "types = {'id': 'int64','item_nbr': 'int32','store_nbr': 'int8','onpromotion': bool,}\n", "df_test = pd.read_csv(\"../input/favorita-grocery-sales-forecasting/test.csv\", parse_dates = ['date'], dtype = types, infer_datetime_format = True)\n", "\n", "df_items= pd.read_csv(\"../input/favorita-grocery-sales-forecasting/items.csv\")"]}, {"metadata": {}, "outputs": [], "execution_count": null, "cell_type": "code", "source": ["# load submission files\n", "config = {'lgbm-0.529': ('../input/lgbm-starter/lgb.csv', 'blue'), \\\n", "          'logma-0.529': ('../input/log-ma-with-special-days-lb-0-529/ma8dspdays.csv.gz', 'green'), \\\n", "          'ets-0.556': ('../input/time-series-ets-starter-lb-0-556/sub_ets_log.csv', 'orange'), \\\n", "          'meanlog-0.622': ('../input/one-line-mean-log-lb-0-622/meanlog.csv.gz', 'pink')\n", "         }\n", "\n", "subs = {}\n", "colors = {}\n", "for key, conf in config.items():\n", "    subs[key] = df_test.merge(pd.read_csv(conf[0]), on='id')\n", "    colors[key] = conf[1]"]}, {"metadata": {}, "cell_type": "markdown", "source": ["## Display comparison on a specified or random store / item combo"]}, {"metadata": {"collapsed": true}, "outputs": [], "execution_count": null, "cell_type": "code", "source": ["picked = [] # keep track of previous comparisons when random"]}, {"metadata": {}, "outputs": [], "execution_count": null, "cell_type": "code", "source": ["_LAST_X_DAYS = 120 # define time frame to display for train data, if None : display all available data\n", "_RANDOM = False # change to True to display random comparison\n", "if _RANDOM:\n", "    df_s = df_test.sample(1)\n", "    _store, _item = df_s['store_nbr'].values[0], df_s['item_nbr'].values[0]\n", "    picked.append((_store, _item))\n", "else:\n", "    _store, _item = 34, 1239871\n", "    \n", "df_train_c = df_train[(df_train.store_nbr == _store) & (df_train.item_nbr == _item)].filter(items=['date', 'unit_sales']).set_index('date')\n", "\n", "u_dates = [d for d in df_train.date.unique() if pd.Timestamp(d) >= df_train_c.index.min()]\n", "df_train_c = df_train_c.reindex(u_dates)\n", "df_train_c.unit_sales = df_train_c.unit_sales.fillna(0.0)\n", "\n", "f, ax = plt.subplots(2, 1, figsize=(20, 20))\n", "\n", "if df_train_c.shape[0] > 0:\n", "    if _LAST_X_DAYS == None:\n", "        df_train_c.rename(columns={\"unit_sales\": \"unit_sales_train\"}).plot(ax=ax[0], color='black')\n", "    else:\n", "        df_train_c[-_LAST_X_DAYS:].rename(columns={\"unit_sales\": \"unit_sales_train\"}).plot(ax=ax[0], color='black')\n", "\n", "for k in subs.keys():\n", "    df_plot = subs[k][(subs[k].store_nbr == _store) & (subs[k].item_nbr == _item)].filter(items=['date', 'unit_sales']).set_index('date').rename(columns={\"unit_sales\": \"unit_sales_\" + k})\n", "    df_plot.plot(ax=ax[0], color=colors[k])\n", "    df_plot.plot(ax=ax[1], color=colors[k])\n", "\n", "plt.show()\n", "_store, _item"]}, {"metadata": {}, "cell_type": "markdown", "source": ["## Find most different combos"]}, {"metadata": {}, "outputs": [], "execution_count": null, "cell_type": "code", "source": ["# find most different store / item combos from 2 submissions according to nwrmsle\n", "k1 = 'lgbm-0.529'\n", "k2 = 'logma-0.529'\n", "\n", "df_comp = df_test.merge(subs[k1], on='id').merge(subs[k2], on='id', suffixes=('_' + k1, '_' + k2)).merge(df_items, on='item_nbr').filter(items=['date', 'store_nbr', 'item_nbr', 'unit_sales_' + k1, 'unit_sales_' + k2, 'perishable'])\n", "df_comp['perishable'] = df_comp['perishable'].apply(lambda x: 1.0 if x == 0 else 1.25)\n", "\n", "def nwrmsle(x, k1, k2):\n", "    return np.dot(np.square(np.log1p(x['unit_sales_' + k1])-np.log1p(x['unit_sales_' + k2])), np.transpose(x.perishable))\n", "\n", "df_nwrmsle = df_comp.groupby(by=['store_nbr', 'item_nbr']).apply(nwrmsle, k1, k2)\n", "df_nwrmsle = df_nwrmsle.reset_index()\n", "df_nwrmsle.columns = ['store_nbr', 'item_nbr', 'nwrmsle']\n", "\n", "df_nwrmsle.sort_values(by='nwrmsle', ascending=False).head(20)"]}], "nbformat_minor": 1}