# 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
# 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
# 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")
# 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"))
# 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
monthly_sales = sales.groupby(['date_block_num', 'shop_id', 'item_id']).agg({'date': ['min', 'max'], 'item_price': 'sum','item_cnt_day': 'sum'})
monthly_sales.head()
# 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() # 그래프를 노트북 셀에 출력함
본 컴페티션의 목적은 store-item combination의 다음달 판매량(sales)를 예측하는 것이다.
그러나 먼저 문제의 단순화를 위해 store-item combination을 고려하지 않고 월별 총 판매량(total sales per month)를 파악해 보자.
ts = sales.groupby('date_block_num').sum()['item_cnt_day']
x_axis = ts.index
plt.figure(figsize=(16, 6)) # 그래프를 그릴 도화지 사이즈 결정
plt.xticks(x_axis) # 모든 x축 좌표를 표시하기 위함
plt.plot(x_axis, # 그래프를 그림
ts,
color='green',
marker='o')
[<matplotlib.lines.Line2D at 0x1c1d98f278>]
test = ts[:10]
test
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
test.rolling(window=2, center=True).mean()
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
test.rolling(window=2, center=False).mean()
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