<jupyter_start><jupyter_text>0.0 - IMPORTS<jupyter_code>import math
import numpy as np
import pandas as pd
import seaborn as sns
import inflection

from matplotlib import pyplot as plt
from IPython.core.display import HTML
from IPython.display import Image<jupyter_output><empty_output><jupyter_text>0.1 Helper Functions<jupyter_code>def jupyter_settings():
    %matplotlib inline
    %pylab inline
    
    plt.style.use( 'bmh' )
    plt.rcParams['figure.figsize'] = [25,12]
    plt.rcParams['font.size'] = 24
    
    display( HTML( '<style>.container {width:100% !important; }</style>') )
    pd.options.display.max_columns = None
    pd.options.display.max_rows = None
    pd.set_option( 'display.expand_frame_repr', False )
    
    sns.set()
jupyter_settings()<jupyter_output>Populating the interactive namespace from numpy and matplotlib<jupyter_text>0.2 Loading Data<jupyter_code>df_sales_raw = pd.read_csv( 'data_csv/train.csv', low_memory= False)
df_store_raw = pd.read_csv( 'data_csv/store.csv', low_memory= False)

# Merge
df_raw = pd.merge( df_sales_raw, df_store_raw, how='left', on='Store' )<jupyter_output><empty_output><jupyter_text>1.0 PASSO 1 - DESCRIÇÃO DOS DADOS  1.1 Rename Columns.<jupyter_code>df1 = df_raw.copy()
cols_old = ['Store', 'DayOfWeek', 'Date', 'Sales', 'Customers', 'Open', 'Promo', 'StateHoliday', 'SchoolHoliday', 'StoreType',
            'Assortment', 'CompetitionDistance', 'CompetitionOpenSinceMonth', 'CompetitionOpenSinceYear', 'Promo2',
            'Promo2SinceWeek','Promo2SinceYear', 'PromoInterval']

snakecase = lambda x: inflection.underscore( x )

cols_new = list( map( snakecase, cols_old ) )

# rename
df1.columns = cols_new<jupyter_output><empty_output><jupyter_text>1.2 Data Dimensions<jupyter_code>print( 'Number of Rows: {}'.format( df1.shape[0] ) )
print( 'Number of Cols: {}'.format( df1.shape[1] ) )<jupyter_output>Number of Rows: 1017209
Number of Cols: 18<jupyter_text>1.3 Data Types<jupyter_code>df1['date'] = pd.to_datetime (df1['date'] )<jupyter_output><empty_output><jupyter_text>1.4 Check NA  1.5 Fillout NA<jupyter_code># Competition Distance
df1['competition_distance'] = df1['competition_distance'].apply( lambda x: 200000.0 if math.isnan( x ) else x )

# Competition Open Since Month
df1['competition_open_since_month'] = df1.apply( lambda x: x['date'].month if math.isnan( x['competition_open_since_month'] ) else x['competition_open_since_month'], axis=1 )

# Competition Open Since Year
df1['competition_open_since_year'] = df1.apply( lambda x: x['date'].year if math.isnan( x['competition_open_since_year'] ) else x['competition_open_since_year'], axis=1 )

# Promo2 Since Week
df1['promo2_since_week'] = df1.apply( lambda x: x['date'].week if math.isnan( x['promo2_since_week'] ) else x['promo2_since_week'], axis=1 )

# Promo2 Since Year
df1['promo2_since_year'] = df1.apply( lambda x: x['date'].year if math.isnan( x['promo2_since_year'] ) else x['promo2_since_year'], axis=1 )

# Promo Interval
month_map = {1: 'Jan', 2: 'Fev', 3: 'Mar', 4: 'Apr', 5: 'May', 6: 'Jun', 7: 'Jul', 8: 'Aug', 9: 'Sept', 10: 'Oct', 11: 'Nov', 12: 'Dec'}

df1['promo_interval'].fillna(0, inplace=True)

df1['month_map'] = df1['date'].dt.month.map( month_map )

df1['is_promo'] = df1[['promo_interval', 'month_map']].apply( lambda x: 0 if x['promo_interval'] == 0 else 1 if x['month_map'] in x['promo_interval'].split( ',' ) else 0, axis=1 )<jupyter_output><empty_output><jupyter_text>1.6 Change Types<jupyter_code>df1['competition_open_since_month'] = df1['competition_open_since_month'].astype( int )
df1['competition_open_since_year'] = df1['competition_open_since_year'].astype( int )

df1['promo2_since_week'] = df1['promo2_since_week'].astype( int )
df1['promo2_since_year'] = df1['promo2_since_year'].astype( int )<jupyter_output><empty_output><jupyter_text>1.7 Descriptive Statistical  1.7.1 Numerical Categorics<jupyter_code>num_attributes = df1.select_dtypes( include=['int32', 'int64', 'float64'] )
cat_attributes = df1.select_dtypes( exclude=['int32', 'int64', 'float64', 'datetime64[ns]'] )
# Central Tendency - mean, median
ct1 = pd.DataFrame( num_attributes.apply( np.mean ) ).T
ct2 = pd.DataFrame( num_attributes.apply( np.median ) ).T

# Dispersion - std, min, max, range, skew, kurtosis
d1 = pd.DataFrame( num_attributes.apply( np.std ) ).T
d2 = pd.DataFrame( num_attributes.apply( min ) ).T
d3 = pd.DataFrame( num_attributes.apply( max ) ).T
d4 = pd.DataFrame( num_attributes.apply( lambda x: x.max() - x.min() ) ).T
d5 = pd.DataFrame( num_attributes.apply( lambda x: x.skew() ) ).T
d6 = pd.DataFrame( num_attributes.apply( lambda x: x.kurtosis() ) ).T

# Concatenar
m = pd.concat( [ d2, d3, d4, ct1, ct2, d1, d5, d6 ] ).T.reset_index()
m.columns = ['attributes', 'min', 'max', 'range', 'mean', 'median', 'std', 'skew', 'kurtosis']
m
sns.displot( df1['competition_distance'] )<jupyter_output><empty_output><jupyter_text>1.7.2 Categorical Attributes<jupyter_code>cat_attributes.apply( lambda x: x.unique().shape[0] )
aux1 = df1[(df1['state_holiday'] != '0') & (df1['sales'] > 0)]

plt.subplot(1,3,1)
sns.boxplot( x='state_holiday', y='sales', data=aux1 )

plt.subplot(1,3,2)
sns.boxplot( x='store_type', y='sales', data=aux1 )

plt.subplot(1,3,3)
sns.boxplot( x='assortment', y='sales', data=aux1 )<jupyter_output><empty_output><jupyter_text>2.0 PASSO 2 - FEATURE ENGINEERING<jupyter_code>df2 = df1.copy()<jupyter_output><empty_output><jupyter_text>2.1 Mapa mental de Hipoteses<jupyter_code>Image('img/mindmaphypothesis.png')<jupyter_output><empty_output><jupyter_text>2.2 Criação das Hipoteses  2.2.1 Hipoteses Loja **1.** Lojas com número maior de funcionários deveriam vender mais.**2.** Lojas com maior capacidade de estoque deveriam vender mais.**3.** Lojas com maior porte deveriam vender mais.**4.** Lojas com maior sortimentos deveriam vender mais.**5.** Lojas com competidores mais próximos deveriam vender menos.**6.** Lojas com competidores à mais tempo deveriam vendem mais.  2.2.2 Hipoteses Produto **1.** Lojas que investem mais em Marketing deveriam vender mais.**2.** Lojas com maior exposição de produto deveriam vender mais.**3.** Lojas com produtos com preço menor deveriam vender mais.**5.** Lojas com promoções mais agressivas ( descontos maiores ), deveriam vender mais.**6.** Lojas com promoções ativas por mais tempo deveriam vender mais.**7.** Lojas com mais dias de promoção deveriam vender mais.**8.** Lojas com mais promoções consecutivas deveriam vender mais.  2.2.3 Hipoteses Tempo **1.** Lojas abertas durante o feriado de Natal deveriam vender mais.**2.** Lojas deveriam vender mais ao longo dos anos.**3.** Lojas deveriam vender mais no segundo semestre do ano.**4.** Lojas deveriam vender mais depois do dia 10 de cada mês.**5.** Lojas deveriam vender menos aos finais de semana.**6.** Lojas deveriam vender menos durante os feriados escolares.  2.2.4 Lista Final de Hipoteses **1.** Lojas com maior sortimentos deveriam vender mais.**2.** Lojas com competidores mais próximos deveriam vender menos.**3.** Lojas com competidores à mais tempo deveriam vendem mais.**4.** Lojas com promoções ativas por mais tempo deveriam vender mais.**5.** Lojas com mais dias de promoção deveriam vender mais.**7.** Lojas com mais promoções consecutivas deveriam vender mais.**8.** Lojas abertas durante o feriado de Natal deveriam vender mais.**9.** Lojas deveriam vender mais ao longo dos anos.**10.** Lojas deveriam vender mais no segundo semestre do ano.**11.** Lojas deveriam vender mais depois do dia 10 de cada mês.**12.** Lojas deveriam vender menos aos finais de semana.**13.** Lojas deveriam vender menos durante os feriados escolares.  2.3 Feature Engineering<jupyter_code># year
df2['year'] = df2['date'].dt.year

# month
df2['month'] = df2['date'].dt.month

# day
df2['day'] = df2['date'].dt.day

# week of year
df2['week_of_year'] = df2['date'].dt.weekofyear

# year week
df2['year_week'] = df2['date'].dt.strftime( '%Y-%W' )

# # competition since
# df2['competition_since'] = df2.apply( lambda x: datetime.datetime( year=x['competition_open_since_year'], month=x['competition_open_since_month'], day=1 ), axis=1 )
# df2['competition_time_month'] = ( ( df2['date'] - df2['competition_since'] ) / 30 ).apply( lambda x: x.days ).astype( int )                                                                                      

# # promo since
# df2['promo_since'] = df2['promo2_since_year'].astype( str ) + '-' + df2['promo2_since_week'].astype( str )
# df2['promo_since'] = df2['promo_since'].apply( lambda x: datetime.datetime.strptime( x + '-1', '%Y-%W-%w' ) - datetime.timedelta( days=7 ) )
# df2['promo_time_week'] = ( ( df2['date'] - df2['promo_since'] ) /7 ).apply( lambda x: x.days ).astype( int )

# # assortment
# df2['assortment'] = df2['assortment'].apply(lambda x: 'basic' if x == 'a' else 'extra' if x == 'b' else 'extended' )

# state holiday
df2['state_holiday'] = df2['state_holiday'].apply( lambda x:'public_holiday' if x == 'a' else 'easter_holiday' if x == 'b' else 'christmas' if x == 'c' else 'regular_day' )

df2.head().T<jupyter_output><empty_output><jupyter_text>3.0 PASSO 3 - FILTRAGEM DE VARIÁVEIS<jupyter_code>df3 = df2.copy()
df3.head()<jupyter_output><empty_output><jupyter_text>3.1 Filtragem das Linhas<jupyter_code>df3 = df3[ (df3['open'] != 0) & (df3['sales'] > 0) ]<jupyter_output><empty_output><jupyter_text>3.2 Seleção das Colunas<jupyter_code>cols_drop = ['customers', 'open', 'promo_interval', 'month_map']
df3 = df3.drop( cols_drop, axis = 1)
df3.columns<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.15363626823381257, 'fraction_numerical': 0.03106307062650855, 'mean_word_length': 5.452268111035884, 'pattern_counts': {'":': 0, '<': 65, '<?xml version=': 0, '>': 67, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 3, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '16', 'dir': 'jupyter-structured-clean-dedup', 'id': '641004', 'license': 'MIT', 'n_tokens_mistral': 3695, 'n_tokens_neox': 3557, 'n_words': 854, 'path': 'notebooks/m03_v01_store_sales_prediction.ipynb', 'repo_name': 'RPerottoni/Rossmann_Sales_Prediction', 'size': '9529'}