Skip to content

Instantly share code, notes, and snippets.

@eggie5
Created February 28, 2018 16:15
Show Gist options
  • Save eggie5/61cf651ea91000bc259f2b38cb2ca2b0 to your computer and use it in GitHub Desktop.
Save eggie5/61cf651ea91000bc259f2b38cb2ca2b0 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"# Summary\n",
"- We used transaction tables for both drug and grocery stores on salty snacks, coffee, and sugar substitude\n",
"- We used the product and IRI Week Translation Table\n",
"- We aggregate all the three tables above and created new features for season and month from week\n",
"- We aggregate the final table at year, season, month level and created the following new features and Targets:\n",
" - Feature: # of Promotions\n",
" - Feature: Display Size Sum \n",
" - Feature: Ad importance\n",
" - Target: The most popular item within each product category\n",
"- We created the following models (can be used for yearly, seasonal, and monthly data):\n",
" - Classifying the most popular item eithin each category\n",
" - Forcasting the sale of each product\n",
" - Predicting the number of units sold for each category\n",
"- We evaluated our models by holding out 2011 dataset as our test set.\n",
"- We used stacking to improve the performance of our models.\n",
"- We did some initial work to underetsand if we can do prescriptive analysis on the given data set (as future work)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Importing required packages"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING: pylab import has clobbered these variables: ['datetime']\n",
"`%matplotlib` prevents importing * from pylab and numpy\n"
]
}
],
"source": [
"from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor\n",
"from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor, AdaBoostClassifier, BaggingClassifier\n",
"from sklearn.cross_validation import train_test_split\n",
"from sklearn.preprocessing import scale\n",
"from sklearn import datasets\n",
"import pandas as pd\n",
"from sklearn import preprocessing, cross_validation\n",
"from pandas.tools.plotting import scatter_matrix\n",
"from sklearn import grid_search\n",
"from sklearn import linear_model\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.tree import DecisionTreeRegressor, ExtraTreeRegressor, DecisionTreeClassifier, ExtraTreeClassifier\n",
"from itertools import combinations\n",
"from sklearn import decomposition\n",
"from sklearn.metrics import mean_squared_error\n",
"from collections import Counter\n",
"from datetime import date, datetime\n",
"\n",
"%pylab inline\n",
"pd.set_option('display.max_columns', 500)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Data Collection\n",
"we used local data aggregation for this final model as we didn't have time to migrate the table to the postgreq server on AWS. However for all previous models we did most of the data cleaning and merge/join operations on the database on AWS and imported the 'prepared' tables directly to python. "
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# as the transaction tables are too big, we sample some of them\n",
"dr_sampling_rate=0.3\n",
"gr_sampling_rate=0.05"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# getting the drug store salty snack products for 2008-2011 and aggregate them\n",
"saltsnck_dr_8=pd.read_fwf('saltsnck_drug_1479_1530').sample(frac=dr_sampling_rate)\n",
"saltsnck_dr_9=pd.read_fwf('saltsnck_drug_1531_1582').sample(frac=dr_sampling_rate)\n",
"saltsnck_dr_10=pd.read_fwf('saltsnck_drug_1583_1634').sample(frac=dr_sampling_rate)\n",
"saltsnck_dr_11=pd.read_fwf('saltsnck_drug_1635_1686').sample(frac=dr_sampling_rate)\n",
"saltsnck_dr_8_11=pd.concat([saltsnck_dr_8,saltsnck_dr_9,saltsnck_dr_10,saltsnck_dr_11]).reset_index(drop=True)\n",
"saltsnck_dr_8_11['OUTLET']='dr'"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# getting the drug store sugar substitude products for 2008-2011 and aggregate them\n",
"sugarsub_dr_8=pd.read_fwf('sugarsub_drug_1479_1530')\n",
"sugarsub_dr_9=pd.read_fwf('sugarsub_drug_1531_1582')\n",
"sugarsub_dr_10=pd.read_fwf('sugarsub_drug_1583_1634')\n",
"sugarsub_dr_11=pd.read_fwf('sugarsub_drug_1635_1686')\n",
"sugarsub_dr_8_11=pd.concat([sugarsub_dr_8,sugarsub_dr_9,sugarsub_dr_10,sugarsub_dr_11]).reset_index(drop=True)\n",
"sugarsub_dr_8_11['OUTLET']='dr'"
]
},
{
"cell_type": "code",
"execution_count": 122,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# getting the drug store coffee products for 2008-2011 and aggregate them\n",
"coffee_dr_8=pd.read_fwf('coffee_drug_1479_1530')\n",
"coffee_dr_9=pd.read_fwf('coffee_drug_1531_1582')\n",
"coffee_dr_10=pd.read_fwf('coffee_drug_1583_1634')\n",
"coffee_dr_11=pd.read_fwf('coffee_drug_1635_1686')\n",
"coffee_dr_8_11=pd.concat([coffee_dr_8,coffee_dr_9,coffee_dr_10,coffee_dr_11]).reset_index(drop=True)\n",
"coffee_dr_8_11['OUTLET']='dr'"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# getting the grocery store salty snack products for 2008-2011 and aggregate them\n",
"saltsnck_gr_8=pd.read_fwf('saltsnck_groc_1479_1530').sample(frac=gr_sampling_rate)\n",
"saltsnck_gr_9=pd.read_fwf('saltsnck_groc_1531_1582').sample(frac=gr_sampling_rate)\n",
"saltsnck_gr_10=pd.read_fwf('saltsnck_groc_1583_1634').sample(frac=gr_sampling_rate)\n",
"saltsnck_gr_11=pd.read_fwf('saltsnck_groc_1635_1686').sample(frac=gr_sampling_rate)\n",
"saltsnck_gr_8_11=pd.concat([saltsnck_gr_8,saltsnck_gr_9,saltsnck_gr_10,saltsnck_gr_11]).reset_index(drop=True)\n",
"saltsnck_gr_8_11['OUTLET']='gr'"
]
},
{
"cell_type": "code",
"execution_count": 123,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# getting the product table for salty snack, sugar substitude, and coffee\n",
"saltsnck_prod = pd.read_excel('prod11_saltsnck.xlsx')[['SY','GE','VEND','ITEM','L1','L2']]\n",
"sugarsub_prod = pd.read_excel('prod11_sugarsub.xlsx')[['SY','GE','VEND','ITEM','L1','L2']]\n",
"coffee_prod = pd.read_excel('prod11_coffee.xlsx')[['SY','GE','VEND','ITEM','L1','L2']]"
]
},
{
"cell_type": "code",
"execution_count": 152,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# creating a list of names of dataframes (to be used later in data_agg function)\n",
"trans_list = [saltsnck_dr_8_11,sugarsub_dr_8_11, coffee_dr_8_11]\n",
"prod_list = [saltsnck_prod,sugarsub_prod, coffee_prod]"
]
},
{
"cell_type": "code",
"execution_count": 153,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# convert the IRI WEEK_Translation_2008_2011.xls to season, year, and month (some sort of early feature engineering)\n",
"from datetime import date, datetime\n",
"week_season_translation=pd.read_excel('IRI week translation_2008_2017.xls')\n",
"week_season_translation = week_season_translation[\\\n",
" ['IRI Week', u'Calendar week starting on',u'Calendar week ending on']]\n",
"# if the date falls between March 21 and June 20, it is spring. Regardless of the year. \n",
"Y = 2000 # dummy leap year to allow input X-02-29 (leap day)\n",
"seasons = [('winter', (date(Y, 1, 1), date(Y, 3, 20))),\n",
" ('spring', (date(Y, 3, 21), date(Y, 6, 20))),\n",
" ('summer', (date(Y, 6, 21), date(Y, 9, 22))),\n",
" ('fall', (date(Y, 9, 23), date(Y, 12, 20))),\n",
" ('winter', (date(Y, 12, 21), date(Y, 12, 31)))]\n",
" \n",
"def get_season(rawDate):\n",
" aDate = rawDate\n",
" if isinstance(aDate, datetime):\n",
" aDate = aDate.date()\n",
" aDate = aDate.replace(year=Y)\n",
" \n",
" return next(season for season, (start, end) in seasons\n",
" if start <= aDate <= end)\n",
"\n",
"week_season_translation['season'] = week_season_translation['Calendar week starting on']\n",
"week_season_translation['season'] = week_season_translation['season'].apply(get_season)\n",
"week_season_translation.rename(columns={'IRI Week':'WEEK'}, inplace=True)\n",
"week_season_translation['YEAR']=week_season_translation['Calendar week starting on'].apply(lambda x:x.year)\n",
"week_season_translation['MONTH']=week_season_translation['Calendar week starting on'].apply(lambda x:x.month)\n",
"week_season_translation.drop(['Calendar week starting on','Calendar week ending on'], axis=1, inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 154,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# function to aggregate the transaction, product, and year/season/month \n",
"def data_agg(trans_list, prod_list,week_season_translation):\n",
" agg_trans=pd.concat(trans_list)\n",
" agg_prod=pd.concat(prod_list)\n",
" agg_df = pd.merge(agg_trans, agg_prod, on=['SY', 'GE','VEND','ITEM']).drop(['SY', 'GE','VEND','ITEM'],axis=1)\n",
" final_df = pd.merge(agg_df,week_season_translation,on='WEEK')\n",
" return final_df"
]
},
{
"cell_type": "code",
"execution_count": 155,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>IRI_KEY</th>\n",
" <th>WEEK</th>\n",
" <th>UNITS</th>\n",
" <th>DOLLARS</th>\n",
" <th>F</th>\n",
" <th>D</th>\n",
" <th>PR</th>\n",
" <th>OUTLET</th>\n",
" <th>L1</th>\n",
" <th>L2</th>\n",
" <th>season</th>\n",
" <th>YEAR</th>\n",
" <th>MONTH</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>8002426</td>\n",
" <td>1530</td>\n",
" <td>1</td>\n",
" <td>1.29</td>\n",
" <td>NONE</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>dr</td>\n",
" <td>CATEGORY - SALTY SNACKS</td>\n",
" <td>POTATO CHIPS</td>\n",
" <td>winter</td>\n",
" <td>2008</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>8016830</td>\n",
" <td>1530</td>\n",
" <td>1</td>\n",
" <td>1.29</td>\n",
" <td>NONE</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>dr</td>\n",
" <td>CATEGORY - SALTY SNACKS</td>\n",
" <td>POTATO CHIPS</td>\n",
" <td>winter</td>\n",
" <td>2008</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>931511</td>\n",
" <td>1530</td>\n",
" <td>3</td>\n",
" <td>3.87</td>\n",
" <td>NONE</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>dr</td>\n",
" <td>CATEGORY - SALTY SNACKS</td>\n",
" <td>POTATO CHIPS</td>\n",
" <td>winter</td>\n",
" <td>2008</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>8009679</td>\n",
" <td>1530</td>\n",
" <td>2</td>\n",
" <td>2.58</td>\n",
" <td>NONE</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>dr</td>\n",
" <td>CATEGORY - SALTY SNACKS</td>\n",
" <td>POTATO CHIPS</td>\n",
" <td>winter</td>\n",
" <td>2008</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>652759</td>\n",
" <td>1530</td>\n",
" <td>1</td>\n",
" <td>1.29</td>\n",
" <td>NONE</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>dr</td>\n",
" <td>CATEGORY - SALTY SNACKS</td>\n",
" <td>POTATO CHIPS</td>\n",
" <td>winter</td>\n",
" <td>2008</td>\n",
" <td>12</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" IRI_KEY WEEK UNITS DOLLARS F D PR OUTLET \\\n",
"0 8002426 1530 1 1.29 NONE 0 0 dr \n",
"1 8016830 1530 1 1.29 NONE 1 1 dr \n",
"2 931511 1530 3 3.87 NONE 2 0 dr \n",
"3 8009679 1530 2 2.58 NONE 2 0 dr \n",
"4 652759 1530 1 1.29 NONE 0 0 dr \n",
"\n",
" L1 L2 season YEAR MONTH \n",
"0 CATEGORY - SALTY SNACKS POTATO CHIPS winter 2008 12 \n",
"1 CATEGORY - SALTY SNACKS POTATO CHIPS winter 2008 12 \n",
"2 CATEGORY - SALTY SNACKS POTATO CHIPS winter 2008 12 \n",
"3 CATEGORY - SALTY SNACKS POTATO CHIPS winter 2008 12 \n",
"4 CATEGORY - SALTY SNACKS POTATO CHIPS winter 2008 12 "
]
},
"execution_count": 155,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_df=data_agg(trans_list, prod_list,week_season_translation)\n",
"data_df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Data Cleaning"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Handling NaNs"
]
},
{
"cell_type": "code",
"execution_count": 156,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"IRI_KEY 0\n",
"WEEK 0\n",
"UNITS 0\n",
"DOLLARS 0\n",
"F 0\n",
"D 0\n",
"PR 0\n",
"OUTLET 0\n",
"L1 0\n",
"L2 0\n",
"season 0\n",
"YEAR 0\n",
"MONTH 0\n",
"dtype: int64"
]
},
"execution_count": 156,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# looking at the number of NaNs for each column#\n",
"data_df.isnull().sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As we can see the data is clean and there are no NaNs and hence to cleaning is needed in this part.\n",
"\n",
"The function below does the following tasks:\n",
"- Assigning a relative weight to each Feature (F) based on their importance and our intuition. For example we assigned higher weights to A+ (QR code and coupons) compared to C (small size texts), and this way we created a new feature for \"ad importance'\n",
"- Detecting the non-numerical features and use sklearn labelizer to convert them to numerical \n",
"- Filling in NaN values (not applicable to this data we are using as there are no NaNs) of non-numerical features with the most popular value (top()) and filling in NaN values in the numerical feature with the mean value."
]
},
{
"cell_type": "code",
"execution_count": 157,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# function to detect the non-numerical featuresand labelize them and also fill in the NaN values\n",
"def data_prep (data):\n",
" # explicit mapping of F feature to reflect the ad size/importance\n",
" data=data.copy()\n",
" data.ix[data.F=='NONE', 'F'] = 1\n",
" data.ix[data.F=='C', 'F'] = 2\n",
" data.ix[data.F=='B', 'F'] = 3\n",
" data.ix[data.F=='A', 'F'] = 4\n",
" data.ix[data.F=='A+', 'F'] = 5\n",
" # determining the non-numeric columns and transforming them into numeric using LabelEncoder() method\n",
" real_or_str=data.applymap(np.isreal).all(0)\n",
" non_num_feature=real_or_str[~real_or_str].keys()\n",
" print \"Non-numeric features are: \", non_num_feature\n",
" le = preprocessing.LabelEncoder()\n",
" for col in non_num_feature:\n",
" #fill the NaN in non-numeric columns with the most used element#\n",
" data.ix[:,col]=data.ix[:,col].fillna(data[col].describe().top)\n",
" #transform the non-numeric columns to numeric values using \n",
" #LabelEncoder method from SKLearn#\n",
" data.ix[:,col]=le.fit_transform(data.ix[:,col])\n",
" #Filling in NaN values of numeric features with the mean value of the feature\n",
" data=data.fillna(data.mean())\n",
" return data"
]
},
{
"cell_type": "code",
"execution_count": 158,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Non-numeric features are: Index([u'OUTLET', u'L1', u'L2', u'season'], dtype='object')\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>IRI_KEY</th>\n",
" <th>WEEK</th>\n",
" <th>UNITS</th>\n",
" <th>DOLLARS</th>\n",
" <th>F</th>\n",
" <th>D</th>\n",
" <th>PR</th>\n",
" <th>OUTLET</th>\n",
" <th>L1</th>\n",
" <th>L2</th>\n",
" <th>season</th>\n",
" <th>YEAR</th>\n",
" <th>MONTH</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>8002426</td>\n",
" <td>1530</td>\n",
" <td>1</td>\n",
" <td>1.29</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>10</td>\n",
" <td>3</td>\n",
" <td>2008</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>8016830</td>\n",
" <td>1530</td>\n",
" <td>1</td>\n",
" <td>1.29</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>10</td>\n",
" <td>3</td>\n",
" <td>2008</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>931511</td>\n",
" <td>1530</td>\n",
" <td>3</td>\n",
" <td>3.87</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>10</td>\n",
" <td>3</td>\n",
" <td>2008</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>8009679</td>\n",
" <td>1530</td>\n",
" <td>2</td>\n",
" <td>2.58</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>10</td>\n",
" <td>3</td>\n",
" <td>2008</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>652759</td>\n",
" <td>1530</td>\n",
" <td>1</td>\n",
" <td>1.29</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>10</td>\n",
" <td>3</td>\n",
" <td>2008</td>\n",
" <td>12</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" IRI_KEY WEEK UNITS DOLLARS F D PR OUTLET L1 L2 season YEAR \\\n",
"0 8002426 1530 1 1.29 1 0 0 0 1 10 3 2008 \n",
"1 8016830 1530 1 1.29 1 1 1 0 1 10 3 2008 \n",
"2 931511 1530 3 3.87 1 2 0 0 1 10 3 2008 \n",
"3 8009679 1530 2 2.58 1 2 0 0 1 10 3 2008 \n",
"4 652759 1530 1 1.29 1 0 0 0 1 10 3 2008 \n",
"\n",
" MONTH \n",
"0 12 \n",
"1 12 \n",
"2 12 \n",
"3 12 \n",
"4 12 "
]
},
"execution_count": 158,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_preped=data_prep(data_df)\n",
"data_preped.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The following function does the followings:\n",
"\n",
"**Data Aggregation at store level (IRI_Key) and Target Engineering**\n",
"\n",
"- aggregate the data based on the method given (yearly, seasonal, monthly) \n",
"- Aggregate the data based on the outlet given (drug store, grocery store, or all)\n",
"- Summing up the Dollar/Units per store which will be used as our target\n",
"- Create a new target from L2 as the most popular item within each category, which will be used as one of our targets (please note that I didn't change the name and it is still L2, but it represent the most popular item within each product category).\n",
"\n",
"**Feature Engineering**\n",
"\n",
"- Create a new feature from F as the sum of the F values which signifies the sum of ad importance used on each product category at each given store (no column name change)\n",
"- Create a new feature from D as the sum of the D values which signifies the sum of display size used on each product category at each given store (no column name change)\n",
"- Create a new feature from PR as the sum of the PR values which signifies the number of promotions used on each product category at each given store (no column name change)"
]
},
{
"cell_type": "code",
"execution_count": 159,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def data_group(data_preped,outlet,method):\n",
" # aggregate data yearly and create new features and targets\n",
" if method=='yearly':\n",
" data_preped_grp=data_preped.groupby(['IRI_KEY','YEAR','L1']).agg({'L2': lambda x:Counter(x).most_common()[0][0],\\\n",
" 'OUTLET': lambda x:Counter(x).most_common()[0][0],\\\n",
" 'F':'sum', 'D':'sum', 'PR':'sum', 'UNITS':'sum','DOLLARS':'sum'})\\\n",
" .reset_index(level=1).reset_index(level=1).reset_index(drop=True)\n",
" # aggregate data monthly and create new features and targets\n",
" elif method=='monthly':\n",
" data_preped_grp=data_preped.groupby(['IRI_KEY','YEAR','MONTH','L1']).agg({'L2': lambda x:Counter(x).most_common()[0][0],\\\n",
" 'OUTLET': lambda x:Counter(x).most_common()[0][0],\\\n",
" 'F':'sum', 'D':'sum', 'PR':'sum', 'UNITS':'sum','DOLLARS':'sum'})\\\n",
" .reset_index(level=1).reset_index(level=1).reset_index(level=1).reset_index(drop=True)\n",
" # aggregate data seasonally and create new features and targets\n",
" elif method=='seasonal':\n",
" data_preped_grp=data_preped.groupby(['IRI_KEY','YEAR','season','L1']).agg({'L2': lambda x:Counter(x).most_common()[0][0],\\\n",
" 'OUTLET': lambda x:Counter(x).most_common()[0][0],\\\n",
" 'F':'sum', 'D':'sum', 'PR':'sum', 'UNITS':'sum','DOLLARS':'sum'})\\\n",
" .reset_index(level=1).reset_index(level=1).reset_index(level=1).reset_index(drop=True)\n",
" # aggregate data based on the given outlet\n",
" if outlet=='dr': \n",
" data_preped_grp=data_preped_grp.ix[data_preped_grp['OUTLET']==0]\n",
" elif outlet=='gr': \n",
" data_preped_grp=data_preped_grp.ix[data_preped_grp['OUTLET']==1]\n",
" elif outlet=='all': \n",
" data_preped_grp=data_preped_grp\n",
" return data_preped_grp"
]
},
{
"cell_type": "code",
"execution_count": 184,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>L1</th>\n",
" <th>YEAR</th>\n",
" <th>PR</th>\n",
" <th>D</th>\n",
" <th>F</th>\n",
" <th>DOLLARS</th>\n",
" <th>L2</th>\n",
" <th>OUTLET</th>\n",
" <th>UNITS</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>2008</td>\n",
" <td>209</td>\n",
" <td>11</td>\n",
" <td>931</td>\n",
" <td>7096.06</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>1728</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>2008</td>\n",
" <td>262</td>\n",
" <td>95</td>\n",
" <td>1448</td>\n",
" <td>6263.88</td>\n",
" <td>10</td>\n",
" <td>0</td>\n",
" <td>4362</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>2008</td>\n",
" <td>39</td>\n",
" <td>0</td>\n",
" <td>208</td>\n",
" <td>1120.32</td>\n",
" <td>14</td>\n",
" <td>0</td>\n",
" <td>430</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0</td>\n",
" <td>2009</td>\n",
" <td>290</td>\n",
" <td>44</td>\n",
" <td>1150</td>\n",
" <td>7665.73</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>1632</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1</td>\n",
" <td>2009</td>\n",
" <td>324</td>\n",
" <td>258</td>\n",
" <td>1686</td>\n",
" <td>7898.74</td>\n",
" <td>10</td>\n",
" <td>0</td>\n",
" <td>5051</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" L1 YEAR PR D F DOLLARS L2 OUTLET UNITS\n",
"0 0 2008 209 11 931 7096.06 4 0 1728\n",
"1 1 2008 262 95 1448 6263.88 10 0 4362\n",
"2 2 2008 39 0 208 1120.32 14 0 430\n",
"3 0 2009 290 44 1150 7665.73 4 0 1632\n",
"4 1 2009 324 258 1686 7898.74 10 0 5051"
]
},
"execution_count": 184,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# get the yearly data for drug stores only (This can be changed to any other value and the output will be the input to our model)\n",
"data_preped_grp=data_group(data_preped,'dr','yearly')\n",
"data_preped_grp.head()"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"data_preped_grp=pd.read_csv('data.csv')"
]
},
{
"cell_type": "code",
"execution_count": 185,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>L1</th>\n",
" <th>YEAR</th>\n",
" <th>PR</th>\n",
" <th>D</th>\n",
" <th>F</th>\n",
" <th>DOLLARS</th>\n",
" <th>L2</th>\n",
" <th>OUTLET</th>\n",
" <th>UNITS</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>7101.000000</td>\n",
" <td>7101.000000</td>\n",
" <td>7101.000000</td>\n",
" <td>7101.000000</td>\n",
" <td>7101.000000</td>\n",
" <td>7101.000000</td>\n",
" <td>7101.000000</td>\n",
" <td>7101.0</td>\n",
" <td>7101.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>0.999859</td>\n",
" <td>2008.992395</td>\n",
" <td>139.172511</td>\n",
" <td>113.093085</td>\n",
" <td>612.329109</td>\n",
" <td>4215.106117</td>\n",
" <td>9.335305</td>\n",
" <td>0.0</td>\n",
" <td>1614.841290</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>0.810060</td>\n",
" <td>1.388260</td>\n",
" <td>151.305288</td>\n",
" <td>205.950451</td>\n",
" <td>657.214081</td>\n",
" <td>5986.237935</td>\n",
" <td>4.123048</td>\n",
" <td>0.0</td>\n",
" <td>2678.508739</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>0.000000</td>\n",
" <td>2007.000000</td>\n",
" <td>0.000000</td>\n",
" <td>0.000000</td>\n",
" <td>1.000000</td>\n",
" <td>0.750000</td>\n",
" <td>0.000000</td>\n",
" <td>0.0</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>0.000000</td>\n",
" <td>2008.000000</td>\n",
" <td>9.000000</td>\n",
" <td>0.000000</td>\n",
" <td>47.000000</td>\n",
" <td>231.230000</td>\n",
" <td>4.000000</td>\n",
" <td>0.0</td>\n",
" <td>78.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>1.000000</td>\n",
" <td>2009.000000</td>\n",
" <td>74.000000</td>\n",
" <td>11.000000</td>\n",
" <td>309.000000</td>\n",
" <td>1751.530000</td>\n",
" <td>10.000000</td>\n",
" <td>0.0</td>\n",
" <td>532.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>2.000000</td>\n",
" <td>2010.000000</td>\n",
" <td>244.000000</td>\n",
" <td>118.000000</td>\n",
" <td>1081.000000</td>\n",
" <td>6289.740000</td>\n",
" <td>14.000000</td>\n",
" <td>0.0</td>\n",
" <td>2077.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>2.000000</td>\n",
" <td>2011.000000</td>\n",
" <td>1023.000000</td>\n",
" <td>1527.000000</td>\n",
" <td>3815.000000</td>\n",
" <td>75962.770000</td>\n",
" <td>16.000000</td>\n",
" <td>0.0</td>\n",
" <td>30984.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" L1 YEAR PR D F \\\n",
"count 7101.000000 7101.000000 7101.000000 7101.000000 7101.000000 \n",
"mean 0.999859 2008.992395 139.172511 113.093085 612.329109 \n",
"std 0.810060 1.388260 151.305288 205.950451 657.214081 \n",
"min 0.000000 2007.000000 0.000000 0.000000 1.000000 \n",
"25% 0.000000 2008.000000 9.000000 0.000000 47.000000 \n",
"50% 1.000000 2009.000000 74.000000 11.000000 309.000000 \n",
"75% 2.000000 2010.000000 244.000000 118.000000 1081.000000 \n",
"max 2.000000 2011.000000 1023.000000 1527.000000 3815.000000 \n",
"\n",
" DOLLARS L2 OUTLET UNITS \n",
"count 7101.000000 7101.000000 7101.0 7101.000000 \n",
"mean 4215.106117 9.335305 0.0 1614.841290 \n",
"std 5986.237935 4.123048 0.0 2678.508739 \n",
"min 0.750000 0.000000 0.0 1.000000 \n",
"25% 231.230000 4.000000 0.0 78.000000 \n",
"50% 1751.530000 10.000000 0.0 532.000000 \n",
"75% 6289.740000 14.000000 0.0 2077.000000 \n",
"max 75962.770000 16.000000 0.0 30984.000000 "
]
},
"execution_count": 185,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nZmZmZma5m1Ebjup4PKZzLie2jyGvDq8/5cR2zv0RES+nQ9UWASskvZXJ/4LK+V9/q8h2VFpLdtrk\nkYbbRqacfumlH7B9+/a9t46MvHJpnJ54ey/Tw8PDPT2+1fTE3POMX9R4DA8PF5JvkeOR5/IbHh5m\n1apVrF27lrVr12LV0bicrDge58FX7DIuJnaRORcXu6i49cy5Gz6rmpmZWcki4llJI8C7gDFJ8xsO\nVXsy3e1x4E0ND1uU5rWa38L1U2Sycsrp/fd/I4sXL95768rs9vEvSePTE2+fadNFjceyZcv2mVeV\n11vW9IUXXrjP9CWXXIKZmZmVzz2OzArmngzNuceRVUkZdSrp9cCLEfGMpNnAncBlwInA7ohYJ+ki\nYF5ErE7NsW8Cjic7FO1u4MiICEn3AucDm4DbgCuanULYPY5skPjztDX3OJpe1XqMVI17HE3NPY7q\npWrjU8V8Oq1T73FkZmZWjp8HbpC0H9mh4p+LiNvTRqBbJJ1N1vj6TICI2CrpFmAr8CJwbsO31vPI\ndiV6NXB7s41GZmZmZmZ5cI+jisd2zuXE9jHk1eH1p5zYzrl8EfFgRCyPiGUR8baI+OM0f3dEnBQR\nR0XEyRHxdMNjLo2IIyJiSUTc1TD//og4JiKOjIgLyn4tXn/Kie2craq8nMvhcR587nFUVuyi4tYz\n527MqA1HZmZmZmZmZmbWPvc4MiuYezI05x5HViWu0+bc48iqxHXamnscTa9qPUaqxj2OpuYeR/VS\ntfGpYj6d1qn3ODIzMzMzMzMzs6ba3nAkaT9J35L05TQ9T9Jdkh6WdKekuQ33XSPpEUkPSTq5Yf5y\nSVskbZc0nO9LmV4dj8d0zuXEHpRjyF2n/YntnMuJPSh1Ogi8/pQT2zlbVXk5l8PjPPjc46is2EXF\nrWfO3ehkj6MLyM7sMm41cE9EHAVsANYApNMHnwksAU4FrlK2bxbAeuBDEbEYWCzplB7zN7N9uU7N\nzMzMzMwsN231OJK0CLgO+GPgYxFxuqRtwIkRMSZpATASEUdLWg1ERKxLj/0qsJbsFMMbImJpmn9W\nevw5TZ7PPY5sYJTVk6FudeoeR1Yl7p3SnHscWZW4Tltzj6PpVa3HSNW4x9HU3OOoXqo2PlXMp6ge\nR38B/CH7vtr5ETEGEBG7gEPT/IXAYw33ezzNWwjsbJi/M80zs3y4Ts3MzMzMzCxX0244kvRuYCwi\n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\n3x4V/V0D9HU7H1vJ0wleO7JdbUjrYWlqL9T+Y4J5X0e23xsi+3I0p4ltqW3fKcbM++Ya821Hnw9h\n12fYvcCfNvu+UfuzsXK+Lfe5or2l71a15lukgSo5Cfwx8L8qpvlSWr5/BhYXvc/AGWQHDDcA/wS8\nuQB9rvaZUPT1PGGfi7aeqf35WOj13MLyNr0/bWY9trnvOz9b2zjPcf+7tmm+4/5vbWFeDX3vaHG+\nNf9vbXXeY54f9X9ri32u+X/rRMPIbUzNzMzMzMzMzMxGKdKlamZmZmZmZmZmViA+cGRmZmZmZmZm\nZlX5wJGZmZmZmZmZmVXlA0dmZmZmZmZmZlaVDxyZmZmZmZmZmVlVPnBkZmZmZmZmZmZV+cCRmZmZ\nmZmZmZlV5QNHZmZmZmZmZmZWlQ8cmZmZmZmZmZlZVT5wZGZmZmZmZmZmVfnAkZmZmZmZmZmZVeUD\nR2ZmZmZmZmZmVpUPHJmZmZmZmZmZWVU+cGRmZmZmZmZmZlX5wJGZmZmZmZmZmVXlA0dmZmZmZmZm\nZlaVDxxNEZIGJN0r6d8l/VzSZZJmpueulvSJMdPvJ+lFSdMkPSPpV2n4jaTnKtreI+kCSV+pEXdL\nmv5XFa+5VNKyivFfS9pRMc3GPNaJWVmMybPHJf2NpJdJWp3y61eSfiHpq5LmdLu/ZmWS9pWvG9N2\ngaTr0uMj0zRfGjPNP0r6QHp8iqR/TI8n2+fOTDn+uKTtku6X9Cd5La/ZVCXpK5L+ZkzbkZKekPRX\nkv6zIveekfRklXk8JOknVdq9vzUzm4APHE0Bks4FLgbOBV4BvAXYD1gpabcJXhoAEfHyiHhFRLwC\neBh4Z0Xb31VOW2Me70zTjrzmrIi4eGQc+H+Af6qY5pDWl9qsp+zMM2Ax8F+APwNeBM5I7QcAM4DP\ndq2XZuVUa/9X6d+B90t67WTzqWOf+wVgL+CgiJgJnAD8rLVFMOsJZwPHSXobgKQ9gCuAjwKPAzeO\n5F7Kub0rXyzpvwKvAl4n6fAx8w7gdO9vzcyq84GjgpP0cuBC4CMRcWdE/CYiHgFOAvqA/9HoLNPQ\n6GvMrLMEEBGPAyuA3658MiJ+BXwDWJR/18xKrZ593NPANWT740bnPXb+RwA3pJwmIh6MiK81OF+z\nnhMRTwJnAVdI2ossHzdHRNWz5qs4hWw/ent6PNbIftj7WzOzMXzgqPj+L2AP4OuVjRHx78B3gLdT\n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\nI+LVEbFHRLw2Iq6OiKci4uiIOCgijomIpyumvzgiDoiIhZVnKkTEjyPikIg4MCLO7s5+KvFHAAAU\nlElEQVTS7FK2OjplilOmZem2iNgWEUPp8bPAJrJLRQu7P3XtnXx4PZtZL2i2OLbvAmM2dQRwp6R1\nkj6U2uY0mMNmZmbGzktOFwFr8P7UzMx6wKQ1jgAk7UdWk2GkxtGTEbF3xfO/jIh9JP0l8MOIuCG1\nX0l2iv3DwMURcUxq/13gTyLihBrxXOMoB65xlI8C1Dj6rYh4XNKrgJVktVG+2UgOR8TXqszXNY6s\nNLqdp53Sao2jPfd8niee2Dr5xDXMmbMf27Ztafr1ZpWKkKeSZpCdBvLJiPhmo9+J27s/3cU1jiZX\ntOUqeX9Ktz8163XN3lWt43eBGRgY2HkXjVmzZrFo0aLC3KWkLOO7jIz3NzhOoZanKONFuwtMRDye\n/v6bpG+QnSrfaA7XMEDjd2tikuenxuu7vZ15vLXxouVpUWUHjZr/R2J42P87WHlImg7cCnwlIr6Z\nmru4P901vmPHMzvn1Orn464Y9cevPt6e/hTne+/IeDZP92dkfBAYYtf2a2alFBGTDmSfBBsrxpcD\n56XH5wGXpMcHAxuA3YH9gZ+x66ymNWT/sIrsLKTjJogX3bBq1aqeigsERJND8+9RL67nqCPPOjEA\newEz0uOXAT8Ajmkmh6vMu8lt5zMtb3vNv7aV169qabtvVq/lSy/maSeHVvJlxozX15kvqzqyrxgr\nr22jTHHKtCwR3c9Tshqdnx/T1sX96a5h5szFsX79+lHrq9n3pfW8bz7/O7kttWM9V1uusqznNq+f\nruWpBw8eOjNMesZRugtMP7CPpEeAC8ju+nKLpFPJLkM7KR3tuU/SyF1gXmD8XWCuAfYkO1XXd4Ex\n67w5wNez0+CZDlwfESslrQdubjCHzczMepKktwLvAzZK2gAEcD7ZgSPvT83MrNTqqnGUN9c4yodr\nHOWjCDUZOsE1jqxMnKfjzZhxAM8++y+0mm/OGWsX52ltrnE0uaItV8n7U7o8Net1zd5VzczMzMzM\nzMzMSs4HjiqMLw5X7rjd4vVsU9NqYA8kNTXMndvXXNQeyxfn6VS0Op8oOW0bZYpTpmWxxnX2fenM\nvKfituT1bGa9oNm7qpmZ9aDnafY0bt9dyszMzMzMpiLXOOphrnGUD9dkGGtq1zhyzpST83Q81ziy\nonGe1uYaR5Mr2nKVvD+ly1OzXudL1czMzMzMzMzMrCofOKrgmh758Hq2qWl1d6L2WL44T6ei1flE\nKVm9Htc4sk5z7Z18eD2bWS/wgSMzMzMzMzMzM6vKNY56mGsc5cM1GcZyjSMrHufpeK5xZEXjPK3N\nNY4mV7TlKnl/SpenZr3OZxyZmZlZh+yBpKaHuXP7ur0AZmZmZj0v9wNHko6TdL+kByWdl3f8ibim\nRz68nouvyHnaPau7E7XH8sV5Wr/i5OnqCZ57nuwX7OaG4eGHd0UpWb0e1zjqDd3MU9feyYfXs5n1\nglwPHEmaBnwJOBZ4I/AeSW/Isw8TGRoa6qm43eL1XGxFz9PuaXX7ae7Mi6OOOqorZ144T4utWHma\nz3uW17ZRpjhlWpapqNt52tn3pTPznorbktezmfWCvM84WgJsjoiHI+IF4EbgxJz7UNPTTz/dU3G7\nxeu58Aqdp93T6vbT7JkXFzD2zIs8OE8Lr0B5ms97lte2UaY4ZVqWKaqredrZ96Uz856K25LXs5n1\ngrwPHM0DHq0Y35razKw4nKdmxdcjebrrTL2LLrrI9ZFsqumRPDUzs7Kb3u0OtNOPfvQjPvnJTzb1\n2iOOOIItW7a0t0N16lbcbvF6Lo9XvOIPG37Nf/7nv/Af/9GBznTcli7H3SPd8aRxc+bsx7ZtWyad\nblRU52lpNJOnAL/+9eN1TrmlqfnXZ+RMPYAB4Jq6Xzk8vGfTOXPRRRcxbdpevPjic029HibPuzy2\n9bzyyXnbumbzdMSvf/0zdtttt1FtnX1fOjPvqbgteT2bWS9QnrfJlPQW4MKIOC6NLwUiIpaPma44\n9+40a4OpdFtS56n1KuepWfE5T82KbyrlqZnVJ+8DRy8BHgDeBjwO/Ah4T0Rsyq0TZjYh56lZ8TlP\nzYrPeWpmZmWR66VqEfEbSR8BVpLVV7rKO0+zYnGemhWf89Ss+JynZmZWFrmecWRmZmZmZmZmZlNH\n3ndVq0rSbEkrJT0g6Q5JM2tMN1PSLZI2SfqppDfnETdNO03SPZJuayVmvXElzZd0d1rOjZLOajLW\ncZLul/SgpPNqTHOppM2ShiQtaiZOo3ElvVfSP6fh+5IOySNuxXRHSHpB0rvziiupX9IGST+RtKod\ncbuh3nXc5LyrbvcT5YykZWn73STpmBbjj8rzPOJW+1zLKe5H07Z4r6TrJe3eibiSrpI0LOneiraG\n40hanPr6oKTBJuN+Os13SNJXJb2i3XGLotU8lbQlfT5vkPSj1Nby+9bp7SFtxzdK2i7pPyVtqnju\nAklbU47fI+m4FuN8U9JzabhfLXxeNRjnzA4tz82S/kPSv6c4F3RgeWZI+mVFnM93aFluTK/5oaTX\nUgDq4PexyeYt6UhJT1es3z+rc77j8rUdfZ5svi30t67vzk32edJ5N9NvSXtIWqvss3bjSN61qc+T\nzrvZdZ1eO+H/Rs1uz2ZWUBHR9QFYDvxJenwecEmN6a4BPpgeTwdekUfc9PxHgb8FbstjeYG5wKL0\neAbZNfJvaDDONOBnwH7AbsDQ2HkAxwPfTo/fDKxpw/LVE/ctwMz0+Li84lZM913g74F357S8M4Gf\nAvPS+CtbjduNod513ML8q273tXIGOBjYkD4P+lLf1EL8UXmeR9wqn2szOx0XeDXwELB7Gr8JOKUT\ncYHfBRYB91a0NRwHWAsckR7fDhzbRNyjgWnp8SXAxe2OW4SBNuRp2j5mj2lrx/v2sU5uD8CHgcvS\n+/8nwNMVcS4APlZlWRc2GefqtCx/BNxKC59XTcZp9/JcBuyV4twErAGWdGB5rkiPTwaeSDHavizp\n8R8BN06FnKTJ72N1zvtImvj+SpXP0Tb1ebL5NtvfSb87t9DneubdbL/3Sn9fMpJ37ehznfNuqs/p\ntTX/N2qlzx48eCjmUIgzjoATgWvT42uBd42dQNkvw78XEVcDRMSOiPhVp+Om2POBdwBXthiv7rgR\nsS0ihtLjZ4FNwLwG4ywBNkfEwxHxAnBjij22L9elOGuBmZLmNBin4bgRsSYitqfRNTS+bE3FTc4k\n+/L9izbErDfue4GvRsRjABHxRJti563eddyUGtv9fGrnzAlk/xTsiIgtwObUx4bVyPOOxq3xuba9\n03GTlwAvkzQdeCnwWCfiRsT3gafGNDcUR9Jc4OURsS5Ndx01Pq8nihsRd0XEi2l0Ddm21da4BdGO\nPBXjz0pux/t2IJ3dHk4Erk3v/y1k/+CNXa6xTmwyzl+lz6tbyf75aurzqsk4I/vMdi7PtRHxXIrz\n+2QHa6IDy3NVevz3ZAfKoxPLkh7fSlaYuts6+X2s3nxv+C5XNT6/KzXV5zrmC831t57vzs32ud7v\n5c30+7n0cA925V3Lfa5z3k31uY7/jTrx/4WZdVFRDhztGxHDkH0wA/tWmWZ/4AlJV6fTIq+Q9NIc\n4gJ8Afg41T9sOxkXAEl9ZL/MrG0wzjzg0YrxrYzfyY2d5rEq0zSqnriVPgR8p8WYdcWV9GrgXRFx\nOU3sKJuNCywA9pa0StI6Se9vU+y8NfreNq1iu18DzKmRM+3cfqvleafjVvtc26vTcSPi58DngEfS\nPLZHxF2djluh1mdgrTjzyLa1Ee3Y7k4lO0sh77h5aEeeBnBn+rz6UGprdPuod/21c3uofM2LwG8k\n7V0x7UfSZRNXatclVy3FiYjfAM8Ci2nu86qZOCPfB9q6PJKmAeuBvYF/TAdm2r08WyVtAH7O/9/e\n3cbKUdVxHP/+LBAsBakS28ZapBSboIJWUor4EIGSUk0xJmqF0KdESUTjCyW0ojHxFWBIJGBfqGkE\nIi0NFagQQluaaCIQC32g0hYaDEgpvTwYRWtam/bvi3O2Trezd/fuzty7t/4+yebunZ05/3N258zO\n/mfODPwTeKmOthTes783rQMjoc79sU77+yX5/X1U0vkdlNuJOvYhG3qq7yD7zj3Xuc1++ZDrnYd8\nbQH2AesLCdGe69xB2V3Vmfa/jepcN8xsBAxb4kjSeqWx6I3H9vx3XsnsZRuhk0g7Sz+PiBnAv4Gl\ndceV9AVgIB9lEB0mGypob6OccaQjZt/NRzhOKJI+Dywmnf4+HH7WFKuq5FE7jfX3KtLQvB9JmjZM\nsUedkvW+uY9UlcRtxGvu561UGpfjt2v7Sdu1utt7Julo4NmkYWunSbq27riDGK44AEi6GTgUESuH\nM+4oc2leJ+cCN0j6DMO3ftRV7nJgakR8nPQj6vYqCs3bq0nAsjq3VyVxKm9PRByJiE8ALwMzJH2E\n6tsTOcZk4FRgOjV9Ntlwfc/3s2eBKfn9vQt4aITr005P9a1z37lN2V3Vu9DvJgMXV5jY66TsIde5\n299GZja6nTRcgSJidqvXlC6QNyEiBvLpx2VDiPYAr0bEM/n/B+gg2VBB3EuBeZLmkoZznC7pnohY\nUHNc8hCSB4B7I+LhweK18BpQvCjk5DyteZ4PtpmnjrhIugD4BTAnItqdslxV3IuAVZIEnAVcJelQ\nRPRy0fNO4u4B3oqIA8ABSX8ALiRdl2A06eiz7UWL9b5Vn6lq/S3r5/cC+2qO27xdW0NKHNXd3iuA\nv0TE3wAkPQh8ahjiNgw1TmXxJS0iJUMuK0yuPe4w67mfRsTr+e+bkh4iDYep63OrstzGa3tJB8fG\nNNbziHizsMwvgd/1GkfSG6Tt1aGI+E1d7SmLU0d7gL2SxgCnAxtIBzrq+nz2k84KuyQinqqxLWc0\n1oERVOf+WNuyiwmOiHhM0nJJ763gfallG9lLfTvYd+66zu3K7vV9joh3lG6eMgfYUUWd25XdZZ07\n+W00Wr8/zayFfhmqthZYlJ8vBMo2xgOk06g/nCddzrEb1bri/iAipkTEVNKFHDe2SxpVETdbAeyI\niDu6jLMJmCbpbEmnkOrfnCBZCywAkDSLdCHRgS7jdRxX6S4na4DrIuKlkjJqiRsRU/PjHNKX/7d6\nTBp1FJf0GX9a0hiloUgXk8bHjzadtLVXZet9qz6zFpivdBedc4BpwJ+GGrBFP7+O9OOlzrhl27Xn\nqbm9pCFqsySdmpOoje1pXXGbj0gOKU4eHvMPSTNzfRfQervZMq7SnZpuBOZFxMGm+lQZd6T11E8l\njc1H1ZF0GnAlsJ3qPrc614e1uQyAL5KGdjXaNbEQ88vAnyuIswI4DDxac3uOi1NDe65XGiL2FeD3\nwGzS91SV7XkC+EZ+fg3p7PFdNX025LZsZOTVuT/WyT7XhMLzmaQLjHeaNBrsjJJe9iFblttjfdvt\nO/dS50HL7qbeks7K/Q6lS3DMBnZVUedOyu6mzh3+Nqrj94WZjaTogyt0k8bSbyDdoWAdcGaePgl4\npDDfhaQvyK3Ab8l35ao7bmH+ru88MNS4pGz+4dzWLcBm0pk5Q401J8fZDSzN064HvlmY5y7SmS/b\ngBkVfaaDxiUdUXw7t2sLaUew9rhN866ggruqDeF9/j4pKfAc8J0q4o7Eo6ytFZZdut636jN5mWV5\n/d0JXFlBHY728+GIW7ZdG6a4P85lPEe6kOzJdcQF7iOdXXCQlLBaDIwfahzgk6TkxW7gji7j7gZe\nyevVZvKdl6qM2y+PXvop6dpbjT64nf9t04a8fjS/f3WvD6QLwK4G3gH+0xTnnry+byUNx5jQY5wn\nSMO29pO27V1vr7qMU3V7HgcO5Dg7gZur+twL02eQLop8MMf5aZ5edVtW5+lPAx8a6f7Yqk9S0f5Y\nu7KBG0jJuC3Ak8DFHZZb1l97rnO7cnuob6t9iCrq3LbsbuoNfCyXtTX3gUa/q6LObcvu9r0uxCju\nM9X++8IPP/wYuUfjlqZmZmZmZmZmZmbH6JehamZmZmZmZmZm1mecODIzMzMzMzMzs1JOHJmZmZmZ\nmZmZWSknjszMzMzMzMzMrJQTR2ZmZmZmZn1M0m2SdkraKmmNpDNazDdH0i5JL0q6qTB9vKR1kl6Q\n9Lik9+Tp10jaImlz/ntY0gVt6vKrXI+tklZLGltta82s3/iuamZmZmZmZn1C0ueARRGxuDDtCmBj\nRByRdAsQEbGsabl3AS8ClwN7gU3A/IjYJelW4O2IuC0nlMZHxNKm5T8KPBgR57Wp37iI+Fd+fjsw\nEBG39dpuM+tfPuPIzMzMzMysvxxzdD8iNkTEkfzv08DkkmVmArsj4pWIOASsAq7Or10N3J2f3w18\nqWT5r+dlAJA0W9KTkp6RdH/jzKJC0kjAu5vramYnHieOzMzMzMzM+osGeW0J8FjJ9A8Arxb+35On\nAUyIiAGAiNgHvL9k+a8BKwEkvQ/4IXB5RFwEPAt872jlpBXA68B04M4O2mNmo9hJI10BMzMzMzOz\n/3eSngZOAU4HxkvanF+6KSLW53luBg5FxH09hjvmLCFJM4H9EbEjT5oFnA/8MZ9ZdDLw1NGFI5bk\n6XcC84Ff91gfM+tjThyZmZmZmZmNsIiYBUevcbQwIpYUX5e0CJgLXNaiiNeAKYX/J+dpAPskTYiI\nAUkTgTealp1PPtuoEQ5YFxHXDlLfkHQ/cCNOHJmd0DxUzczMzMzMrI9JmkNK0MyLiIMtZtsETJN0\ntqRTSMmgtfm1tcCi/Hwh8HChbAFfpXB9I9J1lC6VdG6eZ6yk8/LzcwvLzQN29dxAM+trThyZmZmZ\nmZn1tzuBccB6SZslLQeQNEnSIwARcRj4NrAOeB5YFRE78/K3ArMlvUC669othbI/C/w1Il5uTIiI\nt0iJppWStgFPAtNzsujuPG0bMBH4ST1NNrN+oQhfBN/MzMzMzMzMzI7nM47MzMzMzMzMzKyUE0dm\nZmZmZmZmZlbKiSMzMzMzMzMzMyvlxJGZmZmZmZmZmZVy4sjMzMzMzMzMzEo5cWRmZmZmZmZmZqWc\nODIzMzMzMzMzs1JOHJmZmZmZmZmZWan/AnQuqr8hiRarAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1b7921160>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# looking at the histogram and statistics of the features to make sure that most of the features have good variance and enough data#\n",
"data_preped_grp.hist(figsize=(20,50), layout=(15,5))\n",
"data_preped_grp.describe()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Outlier Detection and Removal\n",
"\n",
"**We assume that all features have Gaussian distribution and detect outliers based on the following rule:**\n",
"\n",
"Detect a column with extreme outlier if:\n",
"\n",
"$mean(col)-10*\\sigma <value < mean(col)+10*\\sigma$"
]
},
{
"cell_type": "code",
"execution_count": 186,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# function to detect the outliers withing each column and omit them\n",
"def outlier_detector(data):\n",
" out_col=[]\n",
" data=data.copy()\n",
" for col in data.describe().columns:\n",
" maxx = data.describe()[col]['max']\n",
" minn = data.describe()[col]['min']\n",
" mean = data.describe()[col]['mean']\n",
" std = data.describe()[col]['std']\n",
"\n",
" # detecting outliers\n",
" if maxx>(mean+10*std):\n",
" out_col.append(col)\n",
" print \"outliers for column\", col, \"are\",np.unique(data[col].ix[data[col]>(mean+10*std)].values)\n",
" # omitting outliers\n",
" data=data[data[col]<(mean+10*std)]\n",
" elif minn<(mean-10*std):\n",
" out_col.append(col)\n",
" print \"outliers for column\", col, \"are\",np.unique(saltsnck_preped[col].ix[saltsnck_preped[col]>(mean-10*std)].values)\n",
" # omitting outliers\n",
" data=data[data[col]>(mean-10*std)]\n",
" print \"columns containing outliers are: \",out_col\n",
" return data"
]
},
{
"cell_type": "code",
"execution_count": 187,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"outliers for column DOLLARS are [ 65323.39 70254.79 71730.87 75962.77]\n",
"outliers for column UNITS are [29390 30984]\n",
"columns containing outliers are: ['DOLLARS', 'UNITS']\n"
]
}
],
"source": [
"data_preped_grp=outlier_detector(data_preped_grp)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Natutral growth analysis"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In time series sale forcast we need to take into account the natural growth/decline of each store. So we compared the sales of each store year-over-year compared to 2008 and didn't see much change. So we assumed that there are no natural growth/decline."
]
},
{
"cell_type": "code",
"execution_count": 188,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"growth factor for 2011: DOLLARS 1.070066\n",
"dtype: float64\n",
"growth factor for 2010: DOLLARS 1.030598\n",
"dtype: float64\n",
"growth factor for 2009:: DOLLARS 0.978278\n",
"dtype: float64\n",
"growth factor for 2008: 1\n"
]
}
],
"source": [
"print \"growth factor for 2011:\", data_preped_grp.ix[data_preped_grp['YEAR']==2011][['DOLLARS']].sum()/(data_preped_grp.ix[data_preped_grp['YEAR']==2008][['DOLLARS']].sum())\n",
"print \"growth factor for 2010:\", data_preped_grp.ix[data_preped_grp['YEAR']==2010][['DOLLARS']].sum()/(data_preped_grp.ix[data_preped_grp['YEAR']==2008][['DOLLARS']].sum())\n",
"print \"growth factor for 2009::\", data_preped_grp.ix[data_preped_grp['YEAR']==2009][['DOLLARS']].sum()/(data_preped_grp.ix[data_preped_grp['YEAR']==2008][['DOLLARS']].sum())\n",
"print \"growth factor for 2008:\", 1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Modeling \n",
"\n",
"### Classification and Regression Models\n",
"Next we start building our models. For this example we build a yearly model. But as described in function `data_group(data_preped,outlet,method)` the `method` can be changed from yearly to seasonal or monthly to aggregate the data at finer time resolutio. We have 3 different targets:\n",
"- L2: The most popular item within each category\n",
"- UNITS: The total number of a specific product category item sold\n",
"- DOLLARS: The total dollar value sold for a specific product category.\n",
"\n",
"### Evaluation Method:\n",
"\n",
"While we used 10 fold CV for evaluation our models 0,1,2, and 3, for evaluating the performance of our final model, we hold out the 2011 data and used it as a test set while training our model on the data for 2008-2010. Please note that if we use 10 fold CV, we get even higher scores (2%-3%) but we believe for time varying target, using the future data set as test set makes more sense. "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Decision Tree on L2 (most popular item within a category ): Classification"
]
},
{
"cell_type": "code",
"execution_count": 189,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"score on train set: 0.992330486317\n",
"score on test set: 0.983063328424\n"
]
}
],
"source": [
"# building train and test data set by holding out the 2011 data as test data\n",
"X_train = data_preped_grp.ix[data_preped_grp['YEAR']!=2011][['PR','D','F','OUTLET','L1']]\n",
"y_train = data_preped_grp.ix[data_preped_grp['YEAR']!=2011][['L2']]\n",
"X_test = data_preped_grp.ix[data_preped_grp['YEAR']==2011][['PR','D','F','OUTLET','L1']]\n",
"y_test = data_preped_grp.ix[data_preped_grp['YEAR']==2011][['L2']]\n",
"# using a simple Decision Tree Classifier for classifying L2\n",
"dtree = DecisionTreeClassifier()\n",
"dtree.fit(X_train, y_train)\n",
"print \"score on train set:\", dtree.score(X_train, y_train)\n",
"print \"score on test set:\", dtree.score(X_test, y_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Random Forest Regressor for predicting the sale (DOLLARS) for any product category: Regression"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"score on train set: 0.976219795736\n",
"score on test set: 0.881157684855\n"
]
}
],
"source": [
"X_train = data_preped_grp.ix[data_preped_grp['YEAR']!=2011][['PR','D','F','OUTLET','L1']]\n",
"y_train = data_preped_grp.ix[data_preped_grp['YEAR']!=2011]['DOLLARS']\n",
"X_test = data_preped_grp.ix[data_preped_grp['YEAR']==2011][['PR','D','F','OUTLET','L1']]\n",
"y_test = data_preped_grp.ix[data_preped_grp['YEAR']==2011]['DOLLARS']\n",
"tree = RandomForestRegressor(random_state=0)\n",
"tree.fit(X_train, y_train)\n",
"print \"score on train set:\", tree.score(X_train, y_train)\n",
"print \"score on test set:\", tree.score(X_test, y_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Visualizing the Accuracy of the Model\n",
"In this part we plot the predicted values of the sale (DOLLARS) by the model versus the actual values of sale. The closer the blue dots are to the red line in the below plot, the more accurate the model."
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x10e536e10>"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nLj8/n8aNG1OjRo1yn7cql5a//vrri6QicjgcJXL+leUa69evJyUlhYYNGxIXF0fPnj3Lleqoqli9\nejXnn38+derUoWfPnqxZs8Zr3SNHjjBixAgaNWpE48aNGTlyZJHs8StWrKBXr17Ur1+fDh068PLL\nL1fFLfhN0BWUoXII91x2oSx/QUEBb775Jg899E/efffdgJgJZ86cycSJE5k5cya5ubl8/fXXbN++\nnf79+5Ofn1/m8/layjw2NpaFCxe69hcuXEhcXPgGtlZU4V1xxRWkpKSwd+9e9u3bx+zZs4mJiakk\n6Swqa2n5U6dOMXjwYEaNGsWhQ4cYNWoUV155pddnZNKkSezfv59t27axdetW9uzZw+TJkwHruR46\ndCg333wzhw8f5p133uHee+9l7dq1lSJrpRCohabCbcMsWFjt8fYd//777/rcc8/pM888o7/88kuR\nYwUFBTp8+CitU+cChX9qnTqJ+re/3V6pcuXm5mrdunX1vffeK1J+9OhRbdSokb7++uuqqjp69Gh9\n6KGHXMezsrK0ZcuWrv02bdro9OnTtWvXrlq7dm09ffp0iWuJiE6dOlWHDx/uKrvqqqv0scceU4fD\n4SrLzs7WQYMGaVxcnHbs2FFffvll17G8vDxNTU3V2NhY7dy5sz7xxBNFFirMzs7WYcOGaaNGjbRd\nu3Y6e/Zs17HJkyfryJEjPfZDUlKSfvDBB6qqumLFChUR/fTTT1VVdcmSJdq9e3dVtRYd7Nu3r6qq\n9uvXT0VE69Spo/Xq1dP58+e7+mXmzJnauHFjbd68uasPi7N//351OBx6+PBhj8dVVf/9739r9+7d\nNSYmRjt06KCZmZml9tHkyZP1qquu0hEjRmj9+vX11Vdf1YKCAp02bZq2b99e4+Pj9ZprrtGDBw96\nva4nFi1aVOQ7V1VNSEhwyVScAQMG6AsvvODaf+655/TSSy91ye9wODQvL891vGfPnvrOO+94PJe3\n/x/MgoWG0gh3H06w5M/Ozuacc3pw331fMH78erp2vYBVq1a5jq9fv55PPlnCsWNLgYc5diyLN998\nu8i6SydPnuSvf72devUaER/fmjlzymYm+fLLLzlx4gRDhgwpUl6nTh0uv/xyFi9e7LVt8dHDO++8\nw8KFCzl06BAOR8l/bxFh8ODBLF++nNzcXA4dOsSKFSu48sori9S75pprSEhIYM+ePSxYsIAHHnjA\n9R1NnjyZX3/9lV9//ZXMzEzmzp3raqeqXHHFFSQmJrJ7926WLFnCrFmzfN6DE/el5ZcvX15kafll\ny5YVGWU773vZsmUArF27ltzcXIYPHw7Anj17OHLkCNnZ2bzyyivcdtttHs2lDRs2pEOHDtxwww18\n9NFH7Nu3r8jxb775htTUVGbOnMnhw4dZvny5K3LNVx8BpKenc/XVV3Po0CFuuOEGZs+eTXp6Ov/9\n73/Jzs4mNja2yHpS7svJF19afsaMGQCsW7eOrl27FpGxW7durFu3zmOfpqSk8MEHH3Do0CEOHjzI\n+++/z+WXXw5Y64d17dqV1157jYKCAr766it27NhB3759vX5HVU6gNF+4bYT5CGrp0qXBFqFCVIX8\nnr7j2267RyMixrkt4jRHk5IGuo5/+eWXGhPTo8hCT/Xqna1r16511bnjjvs1KmqAwk6FHzQ6urV+\n/PHHfsv15ptvarNmzTwemzBhgg4YMEBVPY+gii+xnpaW5vNaDodDt27dqmPGjNE5c+boiy++qDff\nfLNu2bLFNYLasWOHRkRE6LFjx1ztJk6cqDfeeKOqqrZr104XLVrkOua+BPzXX39dYkn1adOm6U03\n3aSqvkdQS5Ys0W7duqmq6qWXXqqvvvqq9unTR1Wt0dWHH36oqiWXpxcR3bp1a5F+iY6OLjKCbNy4\nsa5cudLjdXft2qV33HGHdujQQWvUqKH9+vXTLVu2qKrq3//+d7333ntLtNm5c6fPPpo8ebImJSUV\nadOpUyf9/PPPXfvZ2dlas2ZNjyNdbzz66KN63XXXFSm74YYbvC4xf+LECe3fv786HA6tUaOGDhgw\nQE+dOuU6/s0332h8fLxGRERozZo19ZVXXvF6bW/vSMwIylAaoezD8Ydgyb93bw75+Z3cSv7E778f\ncO2de+651Kq1H5HngF04HE9Qv77SsWNHV52PPlpIXt7jWNPvEjl+/C7S0zP9liE+Pp79+/d7XNxu\n9+7dxMfH+32uli1b+jxuvU9g5MiRzJs3jzfeeKPE0vK7d+8mLi6O6OhoV1nxpeXdr1N8afldu3a5\nlk+PjY1l2rRpJUYmnujTpw+bNm1i3759rFmzhlGjRrFz504OHDjAN99841os0R8aNmxYZATpa2n5\n5s2bM3v2bDZv3sz27dupU6eOq0+8LS2fnZ3ts4/A89LyQ4YMcfXNOeecQ82aNdm7d6/f91W3bl1y\nc3OLlB0+fJh69ep5rH/99ddz1llncezYMXJzc2nXrh033HCD6x4GDhzI22+/zalTp1i3bh3Tp08v\n4p8MNkZBGc5orrxyANHRM7FmJ+wmOnoyV17pSpJP3bp1+e9/M+nefT4xMT3o2TOT5cszqFWrlqtO\nbGwsVlpIi4iIzcTHN/Bbhj59+lCrVi0++OCDIuVHjx5l4cKFXHLJJYBl8jt+/Ljr+O7du0ucy9+A\ngYsuuojdu3ezb98+LrzwwiLHmjdvTk5ODseOHXOV7dixw++l5du1a1dk+fTDhw/zn//8p1SZoqKi\n6NGjB7NmzaJLly5ERETQp08fnnrqKTp06FAlgRwtWrTgtttu46effgKs+9m6dWuJeqX1EXheWn7h\nwoVF+ubYsWM0a9YMwLWMvKel5R9//HEAOnfu7FqY0cmPP/5I586dPd5PRkYGf//736lduzbR0dHc\ncsstLgX05Zdf0rJlS9fz1bFjR/73f/83pBRU0E1robJhTHxBJVgmvoKCAp06dbrWq9dYo6Ia6Jgx\ndxQxgfjDsmXLNDo6XiMi7tbata/XJk3a6t69e8t0jhkzZmjTpk01IyNDT506pb/++qtefvnlev75\n5+vJkydVVfXll1/WTp06aU5Oju7evVt79+5dwsS3ZMkSn9dxN4etX79e169fr6qqW7ZsUXuyuqpa\nwQd33HGH/vHHH7pmzRpt0qSJyzw1fvx4TU5O1oMHD+rOnTu1a9euLjlOnz6tPXr00OnTp2teXp7m\n5+frTz/9pN9++62q+jbxqao+8MADGhMTo1OmTFFVy6kfExOjt99eGJhS3MTXrFkzXbx4sWu/uOnT\nV98cPHhQJ02apFu2bNGCggL9/fffdejQoZqSkqKqlgksNjZWP//8cy0oKNBdu3bpzz//XGofebrP\np59+WpOTk3X79u2qqrpv3z796KOPvPaFJ06ePKlt2rTR2bNn64kTJ3TWrFnapk0br8/s//zP/+id\nd96peXl5evz4cb311lv1wgsvVFXr+69Tp45L5i1btmiHDh28mvm8vSMJoIkv6IohVDajoIJLsBRU\nZbFu3Tp9/PHHddasWbp///5yneO1117TLl26aHR0tDZt2lRvvfVWPXTokOv4H3/8oddcc43GxMRo\nt27d9JlnninyIm7btm2pCsrpgyqOuw9K1fLLDBw4UOPi4rRDhw760ksvuY4dP35cR40apQ0aNNDO\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10cbb3310>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# plotting predicted vs actual DOLLARS\n",
"plt.scatter(tree.predict(X_test.head(100000)),y_test.iloc[:100000], label='Our Model with Score=0.88')\n",
"plt.plot(range(50000), range(50000), linewidth=5, color='r', label='Model with Score=1')\n",
"plt.xlabel('predicted total sale in 2011')\n",
"plt.ylabel('actual total sale in 2011')\n",
"plt.grid()\n",
"plt.title('Visualizng the Model Accuracy')\n",
"plt.legend()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Random Forest Regressor for predicting the number of units sold (UNITS) for any product category: Regression"
]
},
{
"cell_type": "code",
"execution_count": 192,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"score on train set: 0.974298175253\n",
"score on test set: 0.861411745343\n"
]
}
],
"source": [
"X_train = data_preped_grp.ix[data_preped_grp['YEAR']!=2011][['PR','D','F','OUTLET','L1']]\n",
"y_train = data_preped_grp.ix[data_preped_grp['YEAR']!=2011]['UNITS']\n",
"X_test = data_preped_grp.ix[data_preped_grp['YEAR']==2011][['PR','D','F','OUTLET','L1']]\n",
"y_test = data_preped_grp.ix[data_preped_grp['YEAR']==2011]['UNITS']\n",
"tree = RandomForestRegressor(random_state=0)\n",
"tree.fit(X_train, y_train)\n",
"print \"score on train set:\", tree.score(X_train, y_train)\n",
"print \"score on test set:\", tree.score(X_test, y_test)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Using GridSearchCV for tuning the Random Forest Regressor parameters"
]
},
{
"cell_type": "code",
"execution_count": 234,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The best set of parameters are: {'min_samples_split': 2, 'n_estimators': 40, 'max_depth': 6, 'min_samples_leaf': 1}\n",
"The best score is: 0.870872358433\n"
]
}
],
"source": [
"X_train = data_preped_grp.ix[data_preped_grp['YEAR']!=2011][['PR','D','F','OUTLET','L1']]\n",
"y_train = data_preped_grp.ix[data_preped_grp['YEAR']!=2011]['DOLLARS']\n",
"X_test = data_preped_grp.ix[data_preped_grp['YEAR']==2011][['PR','D','F','OUTLET','L1']]\n",
"y_test = data_preped_grp.ix[data_preped_grp['YEAR']==2011]['DOLLARS']\n",
"parameters = {'n_estimators':range(10,101,10),'max_depth':range(1,10,5),\\\n",
" 'min_samples_split':range(2,10,5),'min_samples_leaf':range(1,10,5)}\n",
"tree = RandomForestRegressor(warm_start=True)\n",
"clf = grid_search.GridSearchCV(tree, parameters, cv=10)\n",
"clf.fit(X_train, y_train)\n",
"print \"The best set of parameters are: \", clf.best_params_\n",
"print \"The best score is: \", clf.best_score_"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# More Complex Models :Stacking\n",
"In this section we tried a 2-level stacking with 3 base classifiers/regressors and 1 meta classifier/regressor to see if it can improve the accuracy of our models. We tried all combinations of several classifiers/regressors and picked the one with the best score.\n",
"\n",
"We realized that stacking didn't help to increase the performance of our models whenever the accuracy of our model was already high (for example score of 0.88 for yearly model). However, for monthly model where the performance of our model was slightly lower (score of 0.7) it boosted the score of our model by 2%-5%."
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"## writing a class with fit/predict/scoring method, to fit the sub-classifiers onto the data and fit\n",
"# a meta classifier on top of the base classifier and evaluate the performance\n",
"class stacked_classifier():\n",
" def __init__(self, base_classifiers=None, meta_classifier=None):\n",
" self.base_classifiers = base_classifiers\n",
" self.meta_classifier = meta_classifier\n",
"\n",
"\n",
" def fit(self, X, y):\n",
" for classifier in self.base_classifiers:\n",
" classifier.fit(X, y)\n",
" X_meta=self.predict_base(X)\n",
" self.meta_classifier.fit(X_meta, y)\n",
"\n",
" def predict_base(self, X):\n",
" self.predictions = np.zeros(len(X))\n",
" for classifier in self.base_classifiers:\n",
" self.predictions=np.column_stack([self.predictions, classifier.predict(X)])\n",
" return self.predictions\n",
" \n",
" def scoring(self,X,y):\n",
" clf_score=[]\n",
" for classifier in self.base_classifiers:\n",
" clf_score.append(classifier.score(X, y))\n",
" clf_score.append(self.meta_classifier.score(self.predict_base(X),y))\n",
" return clf_score"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Creating sub and meta classifiers/Regressors"
]
},
{
"cell_type": "code",
"execution_count": 203,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"#Creating sub and meta classifiers\n",
"DTC = DecisionTreeClassifier(random_state=0)\n",
"LR = linear_model.LogisticRegression()\n",
"RC = linear_model.RidgeClassifier(random_state=0)\n",
"ETC = ExtraTreeClassifier(random_state=32)\n",
"KNC = KNeighborsClassifier ()\n",
"BC = BaggingClassifier()"
]
},
{
"cell_type": "code",
"execution_count": 225,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"#Creating sub and meta regressors\n",
"DTR = DecisionTreeRegressor(random_state=0)\n",
"RR = linear_model.Ridge(random_state=0)\n",
"BRR= linear_model.BayesianRidge()\n",
"ETR = ExtraTreeRegressor(random_state=0)\n",
"LR = linear_model.Lasso()\n",
"RFR = RandomForestRegressor(random_state=0)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Importing the results of all possible combinations of base+meta classifier into a DataFrame"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Function to import the results of all possible combinations of base+meta classifier into a DataFrame\n",
"def stack_scoring(clf_dict, score_df, n, X_train, X_test, y_train, y_test):\n",
" l=0\n",
" for clf in combinations(clf_dict,n):\n",
" stacked_clf=stacked_classifier(base_classifiers=clf[0:n-1], meta_classifier=clf[n-1])\n",
" stacked_clf.fit(X_train,y_train)\n",
" clf_scores=[clf_dict.get(clf[i]) for i in range(n)]+stacked_clf.scoring(X_test,y_test)\n",
" score_df.loc[l]= clf_scores\n",
" l+=1\n",
" return score_df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Stacking for Predicting L2"
]
},
{
"cell_type": "code",
"execution_count": 206,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Best stacked classifier with 2 sub-classifier is: \n",
"Base1 Logistic Regression\n",
"Base2 Decision Tree\n",
"Base3 Ridge\n",
"Meta KNeighbor\n",
"Base1 Score 0.877911\n",
"Base2 Score 0.983063\n",
"Base3 Score 0.947717\n",
"Meta Score 0.984536\n",
"Name: 1, dtype: object\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Base1</th>\n",
" <th>Base2</th>\n",
" <th>Base3</th>\n",
" <th>Meta</th>\n",
" <th>Base1 Score</th>\n",
" <th>Base2 Score</th>\n",
" <th>Base3 Score</th>\n",
" <th>Meta Score</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Logistic Regression</td>\n",
" <td>Decision Tree</td>\n",
" <td>Ridge</td>\n",
" <td>Extra Tree</td>\n",
" <td>0.877911</td>\n",
" <td>0.983063</td>\n",
" <td>0.947717</td>\n",
" <td>0.983063</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Logistic Regression</td>\n",
" <td>Decision Tree</td>\n",
" <td>Ridge</td>\n",
" <td>KNeighbor</td>\n",
" <td>0.877911</td>\n",
" <td>0.983063</td>\n",
" <td>0.947717</td>\n",
" <td>0.984536</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Logistic Regression</td>\n",
" <td>Decision Tree</td>\n",
" <td>Ridge</td>\n",
" <td>Bagging</td>\n",
" <td>0.877911</td>\n",
" <td>0.983063</td>\n",
" <td>0.947717</td>\n",
" <td>0.980854</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Logistic Regression</td>\n",
" <td>Decision Tree</td>\n",
" <td>Extra Tree</td>\n",
" <td>KNeighbor</td>\n",
" <td>0.877911</td>\n",
" <td>0.983063</td>\n",
" <td>0.983800</td>\n",
" <td>0.983063</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Logistic Regression</td>\n",
" <td>Decision Tree</td>\n",
" <td>Extra Tree</td>\n",
" <td>Bagging</td>\n",
" <td>0.877911</td>\n",
" <td>0.983063</td>\n",
" <td>0.983800</td>\n",
" <td>0.981591</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Logistic Regression</td>\n",
" <td>Decision Tree</td>\n",
" <td>KNeighbor</td>\n",
" <td>Bagging</td>\n",
" <td>0.877911</td>\n",
" <td>0.983063</td>\n",
" <td>0.913108</td>\n",
" <td>0.979381</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Logistic Regression</td>\n",
" <td>Ridge</td>\n",
" <td>Extra Tree</td>\n",
" <td>KNeighbor</td>\n",
" <td>0.877911</td>\n",
" <td>0.947717</td>\n",
" <td>0.983800</td>\n",
" <td>0.984536</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Logistic Regression</td>\n",
" <td>Ridge</td>\n",
" <td>Extra Tree</td>\n",
" <td>Bagging</td>\n",
" <td>0.877911</td>\n",
" <td>0.947717</td>\n",
" <td>0.983800</td>\n",
" <td>0.981591</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Logistic Regression</td>\n",
" <td>Ridge</td>\n",
" <td>KNeighbor</td>\n",
" <td>Bagging</td>\n",
" <td>0.877911</td>\n",
" <td>0.947717</td>\n",
" <td>0.913108</td>\n",
" <td>0.982327</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Logistic Regression</td>\n",
" <td>Extra Tree</td>\n",
" <td>KNeighbor</td>\n",
" <td>Bagging</td>\n",
" <td>0.877911</td>\n",
" <td>0.983800</td>\n",
" <td>0.913108</td>\n",
" <td>0.980854</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>Decision Tree</td>\n",
" <td>Ridge</td>\n",
" <td>Extra Tree</td>\n",
" <td>KNeighbor</td>\n",
" <td>0.983063</td>\n",
" <td>0.947717</td>\n",
" <td>0.983800</td>\n",
" <td>0.983800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Decision Tree</td>\n",
" <td>Ridge</td>\n",
" <td>Extra Tree</td>\n",
" <td>Bagging</td>\n",
" <td>0.983063</td>\n",
" <td>0.947717</td>\n",
" <td>0.983800</td>\n",
" <td>0.983800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>Decision Tree</td>\n",
" <td>Ridge</td>\n",
" <td>KNeighbor</td>\n",
" <td>Bagging</td>\n",
" <td>0.983063</td>\n",
" <td>0.947717</td>\n",
" <td>0.913108</td>\n",
" <td>0.983063</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Decision Tree</td>\n",
" <td>Extra Tree</td>\n",
" <td>KNeighbor</td>\n",
" <td>Bagging</td>\n",
" <td>0.983063</td>\n",
" <td>0.983800</td>\n",
" <td>0.913108</td>\n",
" <td>0.983063</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Ridge</td>\n",
" <td>Extra Tree</td>\n",
" <td>KNeighbor</td>\n",
" <td>Bagging</td>\n",
" <td>0.947717</td>\n",
" <td>0.983800</td>\n",
" <td>0.913108</td>\n",
" <td>0.983800</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Base1 Base2 Base3 Meta Base1 Score \\\n",
"0 Logistic Regression Decision Tree Ridge Extra Tree 0.877911 \n",
"1 Logistic Regression Decision Tree Ridge KNeighbor 0.877911 \n",
"2 Logistic Regression Decision Tree Ridge Bagging 0.877911 \n",
"3 Logistic Regression Decision Tree Extra Tree KNeighbor 0.877911 \n",
"4 Logistic Regression Decision Tree Extra Tree Bagging 0.877911 \n",
"5 Logistic Regression Decision Tree KNeighbor Bagging 0.877911 \n",
"6 Logistic Regression Ridge Extra Tree KNeighbor 0.877911 \n",
"7 Logistic Regression Ridge Extra Tree Bagging 0.877911 \n",
"8 Logistic Regression Ridge KNeighbor Bagging 0.877911 \n",
"9 Logistic Regression Extra Tree KNeighbor Bagging 0.877911 \n",
"10 Decision Tree Ridge Extra Tree KNeighbor 0.983063 \n",
"11 Decision Tree Ridge Extra Tree Bagging 0.983063 \n",
"12 Decision Tree Ridge KNeighbor Bagging 0.983063 \n",
"13 Decision Tree Extra Tree KNeighbor Bagging 0.983063 \n",
"14 Ridge Extra Tree KNeighbor Bagging 0.947717 \n",
"\n",
" Base2 Score Base3 Score Meta Score \n",
"0 0.983063 0.947717 0.983063 \n",
"1 0.983063 0.947717 0.984536 \n",
"2 0.983063 0.947717 0.980854 \n",
"3 0.983063 0.983800 0.983063 \n",
"4 0.983063 0.983800 0.981591 \n",
"5 0.983063 0.913108 0.979381 \n",
"6 0.947717 0.983800 0.984536 \n",
"7 0.947717 0.983800 0.981591 \n",
"8 0.947717 0.913108 0.982327 \n",
"9 0.983800 0.913108 0.980854 \n",
"10 0.947717 0.983800 0.983800 \n",
"11 0.947717 0.983800 0.983800 \n",
"12 0.947717 0.913108 0.983063 \n",
"13 0.983800 0.913108 0.983063 \n",
"14 0.983800 0.913108 0.983800 "
]
},
"execution_count": 206,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_train = data_preped_grp.ix[data_preped_grp['YEAR']!=2011][['PR','D','F','OUTLET','L1']]\n",
"y_train = data_preped_grp.ix[data_preped_grp['YEAR']!=2011]['L2']\n",
"X_test = data_preped_grp.ix[data_preped_grp['YEAR']==2011][['PR','D','F','OUTLET','L1']]\n",
"y_test = data_preped_grp.ix[data_preped_grp['YEAR']==2011]['L2']\n",
"clf_dict={DTC: 'Decision Tree',LR:'Logistic Regression',RC: 'Ridge', ETC: 'Extra Tree', KNC:'KNeighbor', BC:'Bagging'}\n",
"score_df = pd.DataFrame(columns=['Base1','Base2','Base3', 'Meta','Base1 Score','Base2 Score','Base3 Score', 'Meta Score'])\n",
"\n",
"stack_2_base_score = stack_scoring(clf_dict,score_df, 4, X_train, X_test, y_train, y_test)\n",
"print \"Best stacked classifier with 2 sub-classifier is: \\n\", stack_2_base_score.loc[stack_2_base_score['Meta Score'].idxmax()]\n",
"stack_2_base_score"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Stacking for forecasting the sales (DOLLARS)"
]
},
{
"cell_type": "code",
"execution_count": 228,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Best stacked classifier with 2 sub-classifier is: \n",
"Base1 Lasso\n",
"Base2 Bayesian Ridge\n",
"Base3 Random Forrest\n",
"Meta Extra Tree\n",
"Base1 Score 0.692909\n",
"Base2 Score 0.692657\n",
"Base3 Score 0.880851\n",
"Meta Score 0.863544\n",
"Name: 14, dtype: object\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Base1</th>\n",
" <th>Base2</th>\n",
" <th>Base3</th>\n",
" <th>Meta</th>\n",
" <th>Base1 Score</th>\n",
" <th>Base2 Score</th>\n",
" <th>Base3 Score</th>\n",
" <th>Meta Score</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Decision Tree</td>\n",
" <td>Ridge</td>\n",
" <td>Lasso</td>\n",
" <td>Bayesian Ridge</td>\n",
" <td>0.750570</td>\n",
" <td>0.692926</td>\n",
" <td>0.692909</td>\n",
" <td>0.750570</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Decision Tree</td>\n",
" <td>Ridge</td>\n",
" <td>Lasso</td>\n",
" <td>Random Forrest</td>\n",
" <td>0.750570</td>\n",
" <td>0.692926</td>\n",
" <td>0.692909</td>\n",
" <td>0.751602</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Decision Tree</td>\n",
" <td>Ridge</td>\n",
" <td>Lasso</td>\n",
" <td>Extra Tree</td>\n",
" <td>0.750570</td>\n",
" <td>0.692926</td>\n",
" <td>0.692909</td>\n",
" <td>0.750624</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Decision Tree</td>\n",
" <td>Ridge</td>\n",
" <td>Bayesian Ridge</td>\n",
" <td>Random Forrest</td>\n",
" <td>0.750570</td>\n",
" <td>0.692926</td>\n",
" <td>0.692657</td>\n",
" <td>0.751053</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Decision Tree</td>\n",
" <td>Ridge</td>\n",
" <td>Bayesian Ridge</td>\n",
" <td>Extra Tree</td>\n",
" <td>0.750570</td>\n",
" <td>0.692926</td>\n",
" <td>0.692657</td>\n",
" <td>0.752212</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Decision Tree</td>\n",
" <td>Ridge</td>\n",
" <td>Random Forrest</td>\n",
" <td>Extra Tree</td>\n",
" <td>0.750570</td>\n",
" <td>0.692926</td>\n",
" <td>0.880851</td>\n",
" <td>0.783937</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Decision Tree</td>\n",
" <td>Lasso</td>\n",
" <td>Bayesian Ridge</td>\n",
" <td>Random Forrest</td>\n",
" <td>0.750570</td>\n",
" <td>0.692909</td>\n",
" <td>0.692657</td>\n",
" <td>0.751056</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Decision Tree</td>\n",
" <td>Lasso</td>\n",
" <td>Bayesian Ridge</td>\n",
" <td>Extra Tree</td>\n",
" <td>0.750570</td>\n",
" <td>0.692909</td>\n",
" <td>0.692657</td>\n",
" <td>0.752212</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Decision Tree</td>\n",
" <td>Lasso</td>\n",
" <td>Random Forrest</td>\n",
" <td>Extra Tree</td>\n",
" <td>0.750570</td>\n",
" <td>0.692909</td>\n",
" <td>0.880851</td>\n",
" <td>0.785596</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Decision Tree</td>\n",
" <td>Bayesian Ridge</td>\n",
" <td>Random Forrest</td>\n",
" <td>Extra Tree</td>\n",
" <td>0.750570</td>\n",
" <td>0.692657</td>\n",
" <td>0.880851</td>\n",
" <td>0.774660</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>Ridge</td>\n",
" <td>Lasso</td>\n",
" <td>Bayesian Ridge</td>\n",
" <td>Random Forrest</td>\n",
" <td>0.692926</td>\n",
" <td>0.692909</td>\n",
" <td>0.692657</td>\n",
" <td>0.566233</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>Ridge</td>\n",
" <td>Lasso</td>\n",
" <td>Bayesian Ridge</td>\n",
" <td>Extra Tree</td>\n",
" <td>0.692926</td>\n",
" <td>0.692909</td>\n",
" <td>0.692657</td>\n",
" <td>0.328893</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>Ridge</td>\n",
" <td>Lasso</td>\n",
" <td>Random Forrest</td>\n",
" <td>Extra Tree</td>\n",
" <td>0.692926</td>\n",
" <td>0.692909</td>\n",
" <td>0.880851</td>\n",
" <td>0.858073</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Ridge</td>\n",
" <td>Bayesian Ridge</td>\n",
" <td>Random Forrest</td>\n",
" <td>Extra Tree</td>\n",
" <td>0.692926</td>\n",
" <td>0.692657</td>\n",
" <td>0.880851</td>\n",
" <td>0.857181</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>Lasso</td>\n",
" <td>Bayesian Ridge</td>\n",
" <td>Random Forrest</td>\n",
" <td>Extra Tree</td>\n",
" <td>0.692909</td>\n",
" <td>0.692657</td>\n",
" <td>0.880851</td>\n",
" <td>0.863544</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Base1 Base2 Base3 Meta \\\n",
"0 Decision Tree Ridge Lasso Bayesian Ridge \n",
"1 Decision Tree Ridge Lasso Random Forrest \n",
"2 Decision Tree Ridge Lasso Extra Tree \n",
"3 Decision Tree Ridge Bayesian Ridge Random Forrest \n",
"4 Decision Tree Ridge Bayesian Ridge Extra Tree \n",
"5 Decision Tree Ridge Random Forrest Extra Tree \n",
"6 Decision Tree Lasso Bayesian Ridge Random Forrest \n",
"7 Decision Tree Lasso Bayesian Ridge Extra Tree \n",
"8 Decision Tree Lasso Random Forrest Extra Tree \n",
"9 Decision Tree Bayesian Ridge Random Forrest Extra Tree \n",
"10 Ridge Lasso Bayesian Ridge Random Forrest \n",
"11 Ridge Lasso Bayesian Ridge Extra Tree \n",
"12 Ridge Lasso Random Forrest Extra Tree \n",
"13 Ridge Bayesian Ridge Random Forrest Extra Tree \n",
"14 Lasso Bayesian Ridge Random Forrest Extra Tree \n",
"\n",
" Base1 Score Base2 Score Base3 Score Meta Score \n",
"0 0.750570 0.692926 0.692909 0.750570 \n",
"1 0.750570 0.692926 0.692909 0.751602 \n",
"2 0.750570 0.692926 0.692909 0.750624 \n",
"3 0.750570 0.692926 0.692657 0.751053 \n",
"4 0.750570 0.692926 0.692657 0.752212 \n",
"5 0.750570 0.692926 0.880851 0.783937 \n",
"6 0.750570 0.692909 0.692657 0.751056 \n",
"7 0.750570 0.692909 0.692657 0.752212 \n",
"8 0.750570 0.692909 0.880851 0.785596 \n",
"9 0.750570 0.692657 0.880851 0.774660 \n",
"10 0.692926 0.692909 0.692657 0.566233 \n",
"11 0.692926 0.692909 0.692657 0.328893 \n",
"12 0.692926 0.692909 0.880851 0.858073 \n",
"13 0.692926 0.692657 0.880851 0.857181 \n",
"14 0.692909 0.692657 0.880851 0.863544 "
]
},
"execution_count": 228,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_train = data_preped_grp.ix[data_preped_grp['YEAR']!=2011][['PR','D','F','OUTLET','L1']]\n",
"y_train = data_preped_grp.ix[data_preped_grp['YEAR']!=2011]['DOLLARS']\n",
"X_test = data_preped_grp.ix[data_preped_grp['YEAR']==2011][['PR','D','F','OUTLET','L1']]\n",
"y_test = data_preped_grp.ix[data_preped_grp['YEAR']==2011]['DOLLARS']\n",
"clf_dict={DTR: 'Decision Tree',RR: 'Ridge', ETR: 'Extra Tree', BRR:'Bayesian Ridge', LR:'Lasso', RFR: 'Random Forrest'}\n",
"score_df = pd.DataFrame(columns=['Base1','Base2','Base3', 'Meta','Base1 Score','Base2 Score','Base3 Score', 'Meta Score'])\n",
"\n",
"stack_2_base_score = stack_scoring(clf_dict,score_df, 4, X_train, X_test, y_train, y_test)\n",
"print \"Best stacked classifier with 2 sub-classifier is: \\n\", stack_2_base_score.loc[stack_2_base_score['Meta Score'].idxmax()]\n",
"stack_2_base_score"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Prescriptive Analysis (Future Work)\n",
"In this section we tried to approach the problem from a prescriptive analysis point of view. i.e., to build a model for each specific value of each feature (several models based on the number of unique values of each features) and quantify the impact of each feature on the sales. We didn't have time to finish this part but as it can be visually verified from the table below, all features have strong impact on the outcome of the sales. So, prescriptive analysis can work really well on this data set."
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Total Number of Promotions</th>\n",
" <th>Average Display Size</th>\n",
" <th>Ad Importance</th>\n",
" <th>OUTLET</th>\n",
" <th>Product Category</th>\n",
" <th>predicted sale</th>\n",
" <th>actual sale</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>224</td>\n",
" <td>5</td>\n",
" <td>1122</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>10102.708</td>\n",
" <td>9244.18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>380</td>\n",
" <td>200</td>\n",
" <td>1838</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>7160.160</td>\n",
" <td>8208.54</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>60</td>\n",
" <td>0</td>\n",
" <td>211</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>1175.044</td>\n",
" <td>983.82</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>322</td>\n",
" <td>109</td>\n",
" <td>1196</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>12564.724</td>\n",
" <td>14778.83</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>172</td>\n",
" <td>249</td>\n",
" <td>1174</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>4805.750</td>\n",
" <td>5824.10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>26</td>\n",
" <td>0</td>\n",
" <td>136</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>970.156</td>\n",
" <td>1074.03</td>\n",
" </tr>\n",
" <tr>\n",
" <th>39</th>\n",
" <td>35</td>\n",
" <td>37</td>\n",
" <td>331</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2569.789</td>\n",
" <td>3083.77</td>\n",
" </tr>\n",
" <tr>\n",
" <th>40</th>\n",
" <td>167</td>\n",
" <td>443</td>\n",
" <td>1810</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>12472.628</td>\n",
" <td>15847.39</td>\n",
" </tr>\n",
" <tr>\n",
" <th>41</th>\n",
" <td>5</td>\n",
" <td>0</td>\n",
" <td>71</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>531.743</td>\n",
" <td>564.05</td>\n",
" </tr>\n",
" <tr>\n",
" <th>54</th>\n",
" <td>322</td>\n",
" <td>18</td>\n",
" <td>1321</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>10671.119</td>\n",
" <td>12077.77</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Total Number of Promotions Average Display Size Ad Importance OUTLET \\\n",
"9 224 5 1122 0 \n",
"10 380 200 1838 0 \n",
"11 60 0 211 0 \n",
"24 322 109 1196 0 \n",
"25 172 249 1174 0 \n",
"26 26 0 136 0 \n",
"39 35 37 331 0 \n",
"40 167 443 1810 0 \n",
"41 5 0 71 0 \n",
"54 322 18 1321 0 \n",
"\n",
" Product Category predicted sale actual sale \n",
"9 0 10102.708 9244.18 \n",
"10 1 7160.160 8208.54 \n",
"11 2 1175.044 983.82 \n",
"24 0 12564.724 14778.83 \n",
"25 1 4805.750 5824.10 \n",
"26 2 970.156 1074.03 \n",
"39 0 2569.789 3083.77 \n",
"40 1 12472.628 15847.39 \n",
"41 2 531.743 564.05 \n",
"54 0 10671.119 12077.77 "
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sample=X_test.head(10)\n",
"sample.ix[:,'predicted sale']=tree.predict(X_test.head(10))\n",
"sample.ix[:,'actual sale']=y_test.iloc[:10]\n",
"sample=sample.rename(columns={'PR':'Total Number of Promotions', 'D':'Average Display Size','F':'Ad Importance','L1':'Product Category'})\n",
"sample"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment