写一段电力负荷预测代码
时间: 2023-08-06 22:13:52 浏览: 51
由于电力负荷预测需要考虑多个因素,如天气、时间、节假日等,因此代码比较复杂。这里提供一个基本的电力负荷预测代码,仅供参考。
```python
import pandas as pd
from sklearn.linear_model import LinearRegression
# 读取历史负荷数据
load_data = pd.read_csv('load.csv', index_col='date')
# 添加时间特征
load_data['month'] = load_data.index.month
load_data['weekday'] = load_data.index.weekday
load_data['hour'] = load_data.index.hour
# 读取天气数据
weather_data = pd.read_csv('weather.csv', index_col='date')
# 添加天气特征
weather_data['temperature'] = (weather_data['max_temp'] + weather_data['min_temp']) / 2
weather_data['wind_speed'] = (weather_data['max_wind_speed'] + weather_data['min_wind_speed']) / 2
# 合并数据
data = pd.merge(load_data, weather_data, on='date')
# 添加节假日特征
holidays = [
'2022-01-01', '2022-01-02', '2022-01-03', '2022-01-31', '2022-02-01',
'2022-02-02', '2022-04-04', '2022-04-05', '2022-04-06', '2022-05-01',
'2022-06-02', '2022-06-03', '2022-06-04', '2022-09-10', '2022-09-11',
'2022-09-12', '2022-10-01', '2022-10-02', '2022-10-03', '2022-10-04',
'2022-10-05', '2022-10-06', '2022-10-07'
]
data['holiday'] = data.index.date.astype('str').isin(holidays)
# 划分训练集和测试集
train_data = data.loc['2022-01-01':'2022-09-30']
test_data = data.loc['2022-10-01':]
# 训练模型
model = LinearRegression()
X_train = train_data[['month', 'weekday', 'hour', 'temperature', 'wind_speed', 'holiday']]
y_train = train_data['load']
model.fit(X_train, y_train)
# 预测测试集
X_test = test_data[['month', 'weekday', 'hour', 'temperature', 'wind_speed', 'holiday']]
y_test = test_data['load']
y_pred = model.predict(X_test)
# 计算误差
error = y_pred - y_test
mae = error.abs().mean()
rmse = (error ** 2).mean() ** 0.5
print('MAE:', mae)
print('RMSE:', rmse)
```
说明:
1. `load.csv` 是历史负荷数据,格式为 `date,load`,其中 `date` 为日期时间,`load` 为负荷值。
2. `weather.csv` 是历史天气数据,格式为 `date,max_temp,min_temp,max_wind_speed,min_wind_speed`,其中 `date` 为日期,`max_temp` 和 `min_temp` 分别为最高温度和最低温度,`max_wind_speed` 和 `min_wind_speed` 分别为最大风速和最小风速。
3. 预测时间为 2022 年 10 月。
4. 特征包括月份、星期几、小时、平均温度、平均风速和是否为节假日。
5. 使用线性回归模型进行预测,计算误差的指标为平均绝对误差(MAE)和均方根误差(RMSE)。