# -*- coding: utf-8 -*-
# 导入库pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import metrics
from sklearn.metrics import mean_squared_error # 评价指标
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM, GRU
from keras import optimizers
import keras
import tensorflow as tf
# mse rmse mae rmape
# adam sgd
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
import warnings
warnings.filterwarnings("ignore") # 忽略一些警告 不影响运行
import pandas as pd
date1=pd.read_csv('ercot_2022_weather (1).csv')
# print(date1.columns)#['time', 'NAME', 'u10', 'v10', 'd2m', 't2m', 'tcc']
date2=pd.read_excel('Native_Load_2022.xlsx')
# print(date2.columns)#['Hour Ending', 'COAST', 'EAST', 'FWEST', 'NORTH', 'NCENT', 'SOUTH','SCENT', 'WEST', 'ERCOT']
# print(date2.head())
df1=date1[['u10', 'v10', 'd2m', 't2m', 'tcc']]
df1['y']=date2['ERCOT']
print(df1.head())
data_x=df1.values
# data_y=date2['ERCOT'].values
# 序列长度
int_sequence_len=2
# 每个序列的长度
int_a = 6
train_x = []
train_y = []
for i in range(0, len(data_x)-int_sequence_len,1):
train_x.append(data_x[i:i+int_sequence_len])
train_y.append(data_x[i+int_sequence_len][-1])
print(len(train_x), len(train_y))
# print(train_y)
# print(train_x)
# 划分验证集和测试集
x_train, x_test, y_train, y_test = train_test_split(np.array(train_x,dtype=float), np.array(train_y,dtype=float), test_size=0.2, random_state=1)
print(x_train.shape)
print(len(x_train), len(x_test)) # 1243 311
x_train = x_train.reshape(len(x_train),int_sequence_len, int_a) # 三维度数据 全部数据长度 序列长度 每个序列维度
y_train = y_train.reshape(len(x_train),1)
print(x_train.shape)
print(y_train.shape)
x_test = x_test.reshape(len(x_test),int_sequence_len, int_a)
y_test = y_test.reshape(len(x_test),1)
print(x_test.shape)
print(y_test.shape)
def create_model_1():
model = keras.models.Sequential([
keras.layers.LSTM(100, activation='relu',input_shape=(int_sequence_len, int_a)), # (1,9) 要与三维度的(1243,1,9) 一一对应
keras.layers.Dense(1024), # 全连接 activation='sigmoid'
keras.layers.Dense(1,) # 1个全链接 activation='relu'
])
op = optimizers.Adamax(lr=0.001, clipvalue=0.5)
model.compile(loss='mean_absolute_error', optimizer=op) # 回归损失函数和优化器 Adam SGD
return model
model1 = create_model_1()
model1.summary()
history=model1.fit(x_train, y_train, validation_data=(x_train, y_train), epochs=200, batch_size=128, shuffle=True)
# 训练世代 batch
model1.save_weights('lstmmoxing') # 模型保存
import matplotlib.pyplot as plt
training_loss = history.history['loss']
test_loss = history.history['val_loss']
# 创建迭代数量
epoch_count = range(1, len(training_loss) + 1)
# 可视化损失历史
plt.plot(epoch_count, training_loss, 'r--')
plt.plot(epoch_count, test_loss, 'b-')
plt.legend(['Training Loss', 'Test Loss'])
plt.title("天气预测Epoch——loss")
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.show()
from sklearn.metrics import mean_squared_error # 均方误差
from sklearn.metrics import mean_absolute_error # 平方绝对误差
from sklearn.metrics import r2_score # R square
# 调用
# 引用上边的模型实例
model_jiazai_1 = create_model_1()
# 加载保存好的模型
model_jiazai_1.load_weights('lstmmoxing')
result = []
y1_pred_lstm = model_jiazai_1.predict(x_test)
for i in range(len(y1_pred_lstm)):
print("真实:", y_test[i])
print("预测:", y1_pred_lstm[i])
result.append([y_test[i][0], y1_pred_lstm[i][0]])
print("-----------------------")
print(mean_squared_error(y_test, y1_pred_lstm))
print(mean_absolute_error(y_test, y1_pred_lstm))
print(r2_score(y_test, y1_pred_lstm))
# 所有画图
len_ = [i for i in range(len(y_test))]
plt.xlabel('标签', fontsize=8)
plt.ylabel('均值', fontsize=8)
plt.plot(len_, y_test, label='y_test', color="blue")
plt.plot(len_, y1_pred_lstm, label='y1_pred_lstm', color="yellow")
plt.title("真实值预测值走势图")
plt.show()
plt.clf()
#---- 具体的值来预测 ----
x_test=[[[16,3,27, 3, 2],
[6,0,0,5,3],
[10,-1, 25, 7,2,]]]
x_test=np.array(x_test)
y1_pred_lstm = model_jiazai_1.predict(x_test)
for i in range(len(y1_pred_lstm)):
print("真实:",10)
print("预测:", y1_pred_lstm[i])
print("-----------------------")
break