-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathtemplate.py
121 lines (86 loc) · 4.47 KB
/
template.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
"""
Private Score: XYZ, Public Score: XYZ
"""
import datetime as dt
import pandas as pd
from pandas import Series, DataFrame
import numpy as np
pd.options.mode.chained_assignment = None
################################################################
# Import CSV Data into Pandas DataFrames #
################################################################
training_df = pd.read_csv("data/train.csv")
store_df = pd.read_csv("data/store.csv")
test_df = pd.read_csv("data/test.csv")
# print(training_df.head())
# print(store_df.head())
# print(test_df.head())
################################################################
# Process Data (Universal) #
################################################################
def is_nan(val):
return val != val
def less_than_ten(val):
if int(val) < 10:
return "0" + val
else:
return val
############################################
# training_df & test_df #
############################################
# Fill NaN values in test_df with "Open" = 1 if "DayOfWeek" != 7
test_df["Open"][is_nan(test_df["Open"])] = (test_df["DayOfWeek"] != 7).astype(int)
# Create "Year" & "Month" columns
training_df["Year"] = training_df["Date"].apply(lambda x: dt.datetime.strptime(x, "%Y-%m-%d").year)
training_df["Month"] = training_df["Date"].apply(lambda x: dt.datetime.strptime(x, "%Y-%m-%d").month)
test_df["Year"] = test_df["Date"].apply(lambda x: dt.datetime.strptime(x, "%Y-%m-%d").year)
test_df["Month"] = test_df["Date"].apply(lambda x: dt.datetime.strptime(x, "%Y-%m-%d").month)
# Create "YearMonth" column
training_df["YearMonth"] = training_df["Date"].apply(lambda x: str(dt.datetime.strptime(x, "%Y-%m-%d").year) + "-" + less_than_ten(str(dt.datetime.strptime(x, "%Y-%m-%d").month)))
test_df["YearMonth"] = test_df["Date"].apply(lambda x: str(dt.datetime.strptime(x, "%Y-%m-%d").year) + "-" + less_than_ten(str(dt.datetime.strptime(x, "%Y-%m-%d").month)))
# "StateHoliday" has values "0" & 0
training_df["StateHoliday"].loc[training_df["StateHoliday"] == 0] = "0"
test_df["StateHoliday"].loc[test_df["StateHoliday"] == 0] = "0"
# Create "StateHolidayBinary" column
training_df["StateHolidayBinary"] = training_df["StateHoliday"].map({0: 0, "0": 0, "a": 1, "b": 1, "c": 1})
test_df["StateHolidayBinary"] = test_df["StateHoliday"].map({0: 0, "0": 0, "a": 1, "b": 1, "c": 1})
# One-hot encoding of "DayOfWeek" & "StateHoliday" columns
training_df = pd.get_dummies(training_df, columns=["DayOfWeek", "StateHoliday"])
test_df = pd.get_dummies(test_df, columns=["DayOfWeek", "StateHoliday"])
############################################
# store_df #
############################################
# Fill NaN values in store_df for "CompetitionDistance" = 0 (since no record exists where "CD" = NaN & "COS[Y/M]" = !NaN)
store_df["CompetitionDistance"][is_nan(store_df["CompetitionDistance"])] = 0
# Fill NaN values in store_df for "CompetitionSince[X]" with 1900-01
store_df["CompetitionOpenSinceYear"][(store_df["CompetitionDistance"] != 0) & (is_nan(store_df["CompetitionOpenSinceYear"]))] = 1900
store_df["CompetitionOpenSinceMonth"][(store_df["CompetitionDistance"] != 0) & (is_nan(store_df["CompetitionOpenSinceMonth"]))] = 1
# One-hot encoding of "StoreType" & "Assortment" columns
store_df = pd.get_dummies(store_df, columns=["StoreType", "Assortment"])
################################################################
# Process Data (Custom) #
################################################################
# Any custom data processing goes here.
################################################################
# RMSPE Function #
################################################################
def rmspe(y_true, y_pred):
w = np.zeros(y_true.shape, dtype=float)
index = y_true != 0
w[index] = 1.0 / (y_true[index])
diff = y_true - y_pred
diff_percentage = diff * w
diff_percentage_squared = diff_percentage ** 2
rmspe = np.sqrt(np.mean(diff_percentage_squared))
return rmspe
################################################################
# Training the Model & Predicting Sales #
################################################################
"""
Describe the model here.
Features: < List of Features Used >
Assumptions:
- < Assumption 1 >
- < Assumption 2 >
"""
# Code for training & using actual model goes here.