电力系统负荷(电力需求量,即有功功率)预测是指充分考虑历史的系统负荷、经济状况、气象条件和社会事件等因素的影响,对未来一段时间的系统负荷做出预测。负荷预测是电力系统规划与调度的一项重要内容。短期(两周以内)预测是电网内部机组启停、调度和运营计划制定的基础;中期(未来数月)预测可为保障企业生产和社会生活用电,合理安排电网的运营与检修决策提供支持;长期(未来数年)预测可为电网改造、扩建等计划的制定提供参考,以提高电力系统的经济效益和社会效益。
代码下载
文章图片
文章图片
文章图片
Python实现的baseline
2.1 数据读取
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlibinline
plt.style.use('seaborn-darkgrid')
sns.set(style = 'darkgrid')
import warnings
warnings.filterwarnings("ignore")
import lightgbm as lgb
from sklearn.preprocessing import scale
import lightgbm as lgb
import xgboost as xgb
from catboost import CatBoostRegressor
import time
from tqdm import tqdm
from sklearn.preprocessing import LabelEncoder
y = pd.read_csv('./data/附件1-区域15分钟负荷数据.csv')
indu = pd.read_csv('./data/附件2-行业日负荷数据.csv')
tianqi = pd.read_csv('./data/附件3-气象数据.csv')
tianqi
del tianqi['Unnamed: 6']
2.2 温度特征处理
tianqi['最高温度'] = tianqi['最高温度'].map(lambda d: d.replace('℃','')).astype(int)
tianqi['最低温度'] = tianqi['最低温度'].map(lambda d: d.replace('℃','')).astype(int)
2.3 天气状况特征处理
series = tianqi.join(tianqi['天气状况'].str.split('/',expand=True))
tianqi['天气1'] = series[0]
tianqi['天气2'] = series[1]
tianqi.info()
RangeIndex: 15 entries, 0 to 14 Data columns (total 8 columns):
Column Non-Null Count Dtype --- ------ -------------- -----
0 日期 15 non-null object
1 天气状况 15 non-null object
2 最高温度 15 non-null int32
3 最低温度 15 non-null int32
4 白天风力风向 15 non-null object
5 夜晚风力风向 15 non-null object
6 天气1 15 non-null object 7 天气
2 15 non-null object dtypes: int32(2), object(6)
2.4 风向特征处理
tianqi['白天风力风向'].unique()
array(['无持续风向<3级', '北风4~5级'], dtype=object)
tianqi['夜晚风力风向'].unique()
array(['无持续风向<3级', '北风4~5级', '北风3~4级'], dtype=object)
dic = {'无持续风向<3级':0,
'北风3~4级':1,
'北风4~5级':2}
tianqi['白天风力风向'] = tianqi['白天风力风向'].map(dic)
tianqi['夜晚风力风向'] = tianqi['夜晚风力风向'].map(dic)
2.5 天气进行有序编码
tianqi['天气1'].unique()
array(['多云', '阴', '小雨-中雨', '大雨', '中雨', '小雨', '晴'], dtype=object)
tianqi['天气2'].unique()
array(['多云', '阴', '小雨', '中雨-大雨', '中雨', '小雨-中雨', '晴'], dtype=object)
dic1 = {'晴':1,
'多云':2,
'阴':3,
'小雨':4,
'小雨-中雨':5,
'中雨':6,
'中雨-大雨':7,
'大雨':8}
tianqi['天气1'] = tianqi['天气1'].map(dic1)
tianqi['天气2'] = tianqi['天气2'].map(dic1)
del tianqi['天气状况']
2.6 连着两张表
y = y.rename(columns={'数据时间':'日期1'})
y['日期'] = y['日期1'].apply(lambda x: x.split(' ')[0])
tianqi.loc[:, '日期'] = pd.to_datetime(tianqi.loc[:, '日期'], format='%Y年%m月%d日', errors='coerce')
y.loc[:, '日期'] = pd.to_datetime(y.loc[:, '日期'], format='%Y/%m/%d', errors='coerce')
train = y.merge(tianqi,on='日期',how='left')
del train['日期']
2.7 时序特征提取(后期直接加入测试集数据)
train['日期1'] = pd.to_datetime(train['日期1'])
train['月'] = train['日期1'].dt.month
train['天'] = train['日期1'].dt.day
train['小时'] = train['日期1'].dt.hour
train['一年第几天'] = train['日期1'].dt.dayofyear
train['一年第几周'] = train['日期1'].dt.week
# test['月'] = test['日期1'].dt.month
# test['天'] = test['日期1'].dt.day
# test['小时'] = test['日期1'].dt.hour
# test['一年第几天'] = test['日期1'].dt.dayofyear
# test['一年第几周'] = test['日期1'].dt.week
。。。。。。。。。。
此处代码略,请下载完整代码
。。。。。。。。。。。。
train['是否月末'] = [int(i) for i in train['是否月末']]
train['是否季节初'] = [int(i) for i in train['是否季节初']]
train['是否季节末'] = [int(i) for i in train['是否季节末']]
train['是否周末'] = [int(i) for i in train['是否周末']]
train['是否月初'] = [int(i) for i in train['是否月初']]
【python|第十届泰迪杯数据挖掘大赛B题电力系统负荷预测】# test['是否月末'] = [int(i) for i in test['是否月末']]
# test['是否季节初'] = [int(i) for i in test['是否季节初']]
# test['是否季节末'] = [int(i) for i in test['是否季节末']]
# test['是否周末'] = [int(i) for i in test['是否周末']]
# test['是否月初'] = [int(i) for i in test['是否月初']]
3 模型训练
y = train['总有功功率(kw)']
x_train = 略。。。。
3.1 自定义训练集
(1)标签归一化
y = 略
(2)划分训练集和验证集
x = x_train[:900]
y_train = y[:900]
x_val = x_train[900:]
y_val = y[900:]
3.2 训练
model_lgb = lgb.LGBMRegressor(
learning_rate=0.01,
max_depth=-1,
n_estimators=1000,
boosting_type='gbdt',
random_state=2021,
objective='regression',
num_leaves = '32',
verbose=-1)
lgb_model = model_lgb.fit(x,y_train)
pred_val_y= lgb_model.predict(x_val)
3.2 模型评价(MAE,RMSE)
# coding=utf-8
import numpy as np
from sklearn import metrics
# MAPE需要自己实现
def mape(y_true, y_pred):
return np.mean(np.abs((y_pred - y_true) / y_true))
y_true = np.array(y_val)
y_pred = np.array(pred_val_y)
print('MSE:',metrics.mean_squared_error(y_true, y_pred))
print('RMSE:',np.sqrt(metrics.mean_squared_error(y_true, y_pred)))
print('MAE:',metrics.mean_absolute_error(y_true, y_pred))
print('MAPE:',mape(y_true, y_pred))
## R2-score
from sklearn.metrics import r2_score
print('R2-score:',r2_score(y_true, y_pred))
MSE: 0.010407552970462575
RMSE: 0.1020174150351918
MAE: 0.07714213380059706
MAPE: 0.13842409370994957
R2-score: 0.646261802505866
推荐阅读
- 数据挖掘|第十届“泰迪杯”数据挖掘挑战赛【B题(电力系统负荷预测分析】完整解题代码Python,共三套)
- 数学建模|【第十届“泰迪杯”数据挖掘挑战赛】B题(电力系统负荷预测分析 ARIMA、AutoARIMA、LSTM、Prophet、多元Prophet 实现)
- 程序员|python如何生成一系列浮点数(含例子)
- python3|python3_列表
- python|数字图像基本操作——图像采样、量化、算术运算、点运算实验结果及分析
- —OpenCV|OpenCV-Python——第7章(图像的基本运算)
- python|Python高效实现滑块验证码自动操纵
- python|python之numpy库--科学计算基础库必学(一)
- labview|labview python opencv_OpenCV官方教程中文版(for Python)pdf+自己编写的全套目录