'''
利用线性回归算法建立模型
自变量:国内市场铁精粉价格 下游钢材产量 下游钢材价格
因变量:公司铁精粉销售价格
'''
#导入Python库
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.linear_model import LinearRegression
import joblib
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#读取数据
df=pd.read_excel('产品价格预测/数据结果/数据清洗结果.xlsx')
print(df.head(n=1))
#数据集拆分
X = df.drop(columns=['日期', '公司铁精粉销售价格'])
column_name = X.columns
y = df['公司铁精粉销售价格']
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.8, test_size=0.2, random_state=123)
#建立模型
lr = LinearRegression()
#训练模型
lr.fit(X_train, y_train)
#模型评估
y_pred = lr.predict(X_test)
mse_value = metrics.mean_squared_error(y_test, y_pred)
print('均方误差MSE:', mse_value)
r2_score_value = metrics.r2_score(y_test, y_pred)
print('决定系数R2:', r2_score_value)
#可视化
plt.figure(figsize=(16,9), dpi=80)
x_index = range(1, len(y_test) + 1)
plt.plot(x_index, y_test,linestyle='-', marker='s', color='orangered', label="真实值", linewidth=2) # s-:方形
plt.plot(x_index, y_pred, linestyle='-', marker='o', color='dodgerblue', label="预测值", linewidth=2) # o-:圆形
plt.ylabel("价格", fontsize=16)
plt.legend(loc="best")
plt.xticks([])
plt.savefig('产品价格预测/数据结果/模拟值与测试值的关系.png')
plt.show()
#保存模型
joblib.dump(lr,'产品价格预测/数据结果/价格预测模型.pkl')
#保存回归系数
df_weight = pd.DataFrame({'特征': column_name, 'importance': np.round(lr.coef_, 3)})
print(df_weight)
df_weight.to_excel('产品价格预测/数据结果/回归系数.xlsx', index=False, encoding='utf-8-sig')