Jovian
⭐️
Sign In
In [1]:
# Always start with checking out the files!
!ls
item_categories.csv sample_submission.csv.gz items.csv shops.csv sales_train.csv test.csv sales_train.csv.gz test.csv.gz sample_submission.csv time_series_tutorials.ipynb
In [2]:
# Basic packages
import numpy as np   # linear algebra
import pandas as pd  # data processing, CSV file I/O (e.g. pd.read_csv)
import random as rd  # generating random numbers
import datetime      # manipulating date formats

# Viz
import matplotlib.pyplot as plt  # basic plotting
import seaborn as sns            # prettier plot

# Time series
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.tsa.statespace.sarimax import SARIMAX
from pandas.plotting import autocorrelation_plot
from statsmodels.tsa.stattools import adfuller, acf, pacf, arma_order_select_ic
import statsmodels.formula.api as smf
import statsmodels.tsa.api as smt
import statsmodels.api as sm
import scipy.stats as scs

# Settings
import warnings
warnings.filterwarnings("ignore")  # ignoring warning messages
In [3]:
# Import all of them
sales = pd.read_csv("sales_train.csv")
item_cat =  pd.read_csv("item_categories.csv")
item = pd.read_csv("items.csv")
sub = pd.read_csv("sample_submission.csv")
shops = pd.read_csv("shops.csv")
test = pd.read_csv("test.csv")
In [4]:
# formatting the 'date' column correctly (e.g. yyyy-mm-dd)
# 데이터 프레임의 한 열에 대해 함수를 적용하고 싶을 때는 ColumnName.apply(lambda x: ...)를 활용하자.
sales['date'] = sales['date'].apply(lambda x: datetime.datetime.strptime(x, "%d.%m.%Y"))
In [5]:
# checking whether the 'date' column type is 'datetimes64' or not
print(sales.info())
<class 'pandas.core.frame.DataFrame'> RangeIndex: 2935849 entries, 0 to 2935848 Data columns (total 6 columns): date datetime64[ns] date_block_num int64 shop_id int64 item_id int64 item_price float64 item_cnt_day float64 dtypes: datetime64[ns](1), float64(2), int64(3) memory usage: 134.4 MB None
In [6]:
monthly_sales = sales.groupby(['date_block_num', 'shop_id', 'item_id']).agg({'date': ['min', 'max'], 'item_price': 'sum','item_cnt_day': 'sum'})
In [7]:
monthly_sales.head()
Out[7]:
In [9]:
# plotting number of items per category
cat_count_df = item.groupby('item_category_id').count()                       # 카테고리별 아이템의 개수를 카운트 함
cat_count_df = cat_count_df.sort_values(by='item_id', ascending=False)        # 내림차순으로 정렬
cat_count_df = cat_count_df.iloc[:10, :]                                      # 시각화의 단순화를 위해 상위 10개만 나타냄


plt.figure(figsize=(50,15))                                                   # 그래프를 그릴 도화지 사이즈를 정힘
ax = sns.barplot(x=cat_count_df.index, y=cat_count_df['item_id'], alpha=0.9)  # seaborn을 통해 barplot을 그림
plt.title("Items per Category")                                               # 그래프의 제목을 명명함
plt.ylabel('# of items', fontsize=12)                                         # 그래프의 y축 이름을 명명함
plt.xlabel('Category', fontsize=12, color='white')                            # 그래프의 x축 이름을 명명함
plt.show()                                                                    # 그래프를 노트북 셀에 출력함
Notebook Image

Single series

본 컴페티션의 목적은 store-item combination의 다음달 판매량(sales)를 예측하는 것이다.

그러나 먼저 문제의 단순화를 위해 store-item combination을 고려하지 않고 월별 총 판매량(total sales per month)를 파악해 보자.

In [35]:
ts = sales.groupby('date_block_num').sum()['item_cnt_day']
x_axis = ts.index
In [36]:
plt.figure(figsize=(16, 6)) # 그래프를 그릴 도화지 사이즈 결정
plt.xticks(x_axis)          # 모든 x축 좌표를 표시하기 위함
plt.plot(x_axis,            # 그래프를 그림
         ts, 
         color='green', 
         marker='o')
Out[36]:
[<matplotlib.lines.Line2D at 0x1c1d98f278>]
Notebook Image
In [38]:
test = ts[:10]
In [39]:
test
Out[39]:
date_block_num
0    131479.0
1    128090.0
2    147142.0
3    107190.0
4    106970.0
5    125381.0
6    116966.0
7    125291.0
8    133332.0
9    127541.0
Name: item_cnt_day, dtype: float64
In [43]:
test.rolling(window=2, center=True).mean()
Out[43]:
date_block_num
0         NaN
1    129784.5
2    137616.0
3    127166.0
4    107080.0
5    116175.5
6    121173.5
7    121128.5
8    129311.5
9    130436.5
Name: item_cnt_day, dtype: float64
In [44]:
test.rolling(window=2, center=False).mean()
Out[44]:
date_block_num
0         NaN
1    129784.5
2    137616.0
3    127166.0
4    107080.0
5    116175.5
6    121173.5
7    121128.5
8    129311.5
9    130436.5
Name: item_cnt_day, dtype: float64