Using SVR to Do Sales Forecasts
作者:XD / 发表: 2021年6月30日 14:32 / 更新: 2021年6月30日 14:32 / 编程笔记 / 阅读量:2766
I used python pandas package to load the data, and sklearn package to do predictions.
# -*- coding: UTF-8 -*-
import pandas as pd
data_frame = pd.read_excel('sample.xlsx',
sheet_name='xdata-1')
days = data_frame['day_of_year'].unique()
# pay_time = data_frame['pay_time'].unique()
# day_of_week = data_frame['day_of_week'].unique()
# week_of_year = data_frame['month_of_year'].unique()
# act_class = data_frame['act_class'].unique()
x, y = [], []
for day in days:
df1 = data_frame[(data_frame['day_of_year'] == day)]['num'].sum()
df2 = data_frame[(data_frame['day_of_year'] == day)]['pay_price'].sum()
df3 = data_frame[(data_frame['day_of_year'] == day)]['act_class'].sum()
df4 = data_frame[(data_frame['day_of_year'] == day)]['month_of_year'].sum()
df5 = data_frame[(data_frame['day_of_year'] == day)]['week_of_year'].sum()
df6 = data_frame[(data_frame['day_of_year'] == day)]['day_of_month'].sum()
df7 = data_frame[(data_frame['day_of_year'] == day)]['day_of_week'].sum()
# x.append([day, round(df2/float(df1), 2), round(df3/float(df1), 2)])
x.append([day, round(df2 / float(df1), 2), round(df3 / float(df1), 2),
df4, df5, df6, df7])
y.append(df1)
import matplotlib.pyplot as plt
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.svm import SVR
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error, accuracy_score
np.random.seed(0)
x.extend(x[-3:])
y.extend(y[-3:])
x = np.array(x)
y = np.array(y)
clf = SVR(kernel='linear', C=20)
# x_tran, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
x_tran, x_test, y_train, y_test = x[:-3], x[-3:], y[:-3], y[-3:]
clf.fit(x_tran, y_train)
y_hat = clf.predict(x_test)
print(y_hat)
print("R2:", r2_score(y_test, y_hat))
print("RMSE:", np.sqrt(mean_squared_error(y_test, y_hat)))
print("MAE:", mean_absolute_error(y_test, y_hat))
# print("Accuracy: ", accuracy_score(y_test, y_hat))
r = len(x_test) + 1
# print(y_test)
plt.plot(np.arange(1,r), y_hat, 'go-', label="predict")
plt.plot(np.arange(1,r), y_test, 'co-', label="real")
plt.legend()
plt.show()