revert 3a339c5270
revert 在原始代码的基础上,增加(load、water、carbon数据集、处理),增加flask接口,将test运行的数据,传入到run.py,返回给test。py窗口
This commit is contained in:
parent
3a339c5270
commit
652c5ff1e1
|
@ -1,24 +0,0 @@
|
||||||
import joblib
|
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
|
|
||||||
def load_carbon_model(path):
|
|
||||||
gbm = joblib.load(path)
|
|
||||||
return gbm
|
|
||||||
def carbon_forecast(inputs: np.ndarray, model):
|
|
||||||
"""_summary_
|
|
||||||
|
|
||||||
Args:
|
|
||||||
inputs (np.ndarray): 输入序列
|
|
||||||
model (_type_): _description_
|
|
||||||
"""
|
|
||||||
out = model.predict([inputs])
|
|
||||||
return out
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
model = load_carbon_model('./models/carbon_pred.joblib')
|
|
||||||
inputs = np.random.randn(24)
|
|
||||||
print(inputs.shape)
|
|
||||||
out = carbon_forecast(inputs, model)
|
|
||||||
print(out)
|
|
|
@ -1,67 +0,0 @@
|
||||||
import pandas as pd
|
|
||||||
import numpy as np
|
|
||||||
import xgboost as xgb
|
|
||||||
from sklearn.model_selection import train_test_split
|
|
||||||
from sklearn.metrics import mean_squared_error, r2_score
|
|
||||||
import joblib
|
|
||||||
from logzero import logger
|
|
||||||
|
|
||||||
def time_series_to_supervised(data, columns, n_in=24, n_out=1,dropnan=True):
|
|
||||||
"""
|
|
||||||
:param data:作为列表或2D NumPy数组的观察序列。需要。
|
|
||||||
:param n_in:作为输入的滞后观察数(X)。值可以在[1..len(数据)]之间可选。默认为1。
|
|
||||||
:param n_out:作为输出的观测数量(y)。值可以在[0..len(数据)]之间。可选的。默认为1。
|
|
||||||
:param dropnan:Boolean是否删除具有NaN值的行。可选的。默认为True。
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
logger.info(f"正在处理训练数据:size:{data.shape}")
|
|
||||||
n_vars = 1 if type(data) is list else data.shape[1]
|
|
||||||
df = pd.DataFrame(data)
|
|
||||||
origNames = columns
|
|
||||||
cols, names = list(), list()
|
|
||||||
cols.append(df.shift(0))
|
|
||||||
names += [('%s' % origNames[j]) for j in range(n_vars)]
|
|
||||||
n_in = max(1, n_in)
|
|
||||||
for i in range(n_in-1, 0, -1):
|
|
||||||
time = '(t-%d)' % i
|
|
||||||
cols.append(df.shift(i))
|
|
||||||
names += [('%s%s' % (origNames[j], time)) for j in range(n_vars)]
|
|
||||||
n_out = max(n_out, 0)
|
|
||||||
for i in range(1, n_out+1):
|
|
||||||
time = '(t+%d)' % i
|
|
||||||
cols.append(df.shift(-i))
|
|
||||||
names += [('%s%s' % (origNames[j], time)) for j in range(n_vars)]
|
|
||||||
agg = pd.concat(cols, axis=1)
|
|
||||||
agg.columns = names
|
|
||||||
if dropnan:
|
|
||||||
agg.dropna(inplace=True)
|
|
||||||
return agg
|
|
||||||
|
|
||||||
def train_model(train_data: pd.DataFrame):
|
|
||||||
"""训练模型的函数,需要根据模型类型实际调整
|
|
||||||
Args:
|
|
||||||
data (pd.DataFrame): 训练集
|
|
||||||
"""
|
|
||||||
# 特征和输出列名,需要根据业务场景灵活处理
|
|
||||||
fea_cols = train_data.columns[:-1].tolist()
|
|
||||||
out_cols = train_data.columns[-1:].tolist()
|
|
||||||
logger.info(f"特征列: {fea_cols}, 输出列: {out_cols}")
|
|
||||||
X = train_data[fea_cols]
|
|
||||||
y = train_data[out_cols]
|
|
||||||
train_X,test_X,train_y,test_y = train_test_split(X, y, test_size=0.2, random_state=42)
|
|
||||||
valid_X,test_X,valid_y,test_y = train_test_split(test_X, test_y, test_size=0.5, random_state=42)
|
|
||||||
# 参数
|
|
||||||
other_params = {'learning_rate': 0.1, 'n_estimators': 150, 'max_depth': 10, 'min_child_weight': 1, 'seed': 0, 'subsample': 0.8, 'colsample_bytree': 0.8, 'gamma': 0, 'reg_alpha': 0, 'reg_lambda': 1}
|
|
||||||
print(train_X.shape, train_y.shape)
|
|
||||||
gbm = xgb.XGBRegressor(objective='reg:squarederror', early_stopping_rounds=20,**other_params)
|
|
||||||
gbm.fit(train_X.values, train_y.values, eval_set=[(valid_X.values, valid_y.values)])
|
|
||||||
y_pred = gbm.predict(test_X.values)
|
|
||||||
logger.info(f"Root Mean Squared Error on Test set: {np.sqrt(mean_squared_error(test_y, y_pred))}")
|
|
||||||
logger.info(f"R2 score on Test set: {r2_score(test_y, y_pred)}")
|
|
||||||
joblib.dump(gbm, './models/carbon_pred.joblib')
|
|
||||||
logger.info(f"save_path: ./models/carbon_pred.joblib")
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
data = pd.read_csv('./data/carbon_data_hourly.csv', index_col=0)
|
|
||||||
agg = time_series_to_supervised(data.values, data.columns, 24, 1)
|
|
||||||
train_model(agg)
|
|
|
@ -1,567 +0,0 @@
|
||||||
date,Value
|
|
||||||
2022-01-01 00:00:00,72.076
|
|
||||||
2022-01-01 01:00:00,64.442
|
|
||||||
2022-01-01 02:00:00,64.084
|
|
||||||
2022-01-01 03:00:00,60.842
|
|
||||||
2022-01-01 04:00:00,61.798
|
|
||||||
2022-01-01 05:00:00,66.538
|
|
||||||
2022-01-01 06:00:00,72.626
|
|
||||||
2022-01-01 07:00:00,75.181
|
|
||||||
2022-01-01 08:00:00,68.397
|
|
||||||
2022-01-01 09:00:00,67.668
|
|
||||||
2022-01-01 10:00:00,67.021
|
|
||||||
2022-01-01 11:00:00,71.118
|
|
||||||
2022-01-01 12:00:00,811.791
|
|
||||||
2022-01-01 13:00:00,70.55
|
|
||||||
2022-01-01 14:00:00,62.929
|
|
||||||
2022-01-01 15:00:00,64.519
|
|
||||||
2022-01-01 16:00:00,60.544
|
|
||||||
2022-01-01 17:00:00,64.687
|
|
||||||
2022-01-01 18:00:00,64.736
|
|
||||||
2022-01-01 19:00:00,73.698
|
|
||||||
2022-01-01 20:00:00,72.559
|
|
||||||
2022-01-01 21:00:00,63.221
|
|
||||||
2022-01-01 22:00:00,65.418
|
|
||||||
2022-01-01 23:00:00,65.593
|
|
||||||
2022-01-02 00:00:00,71.677
|
|
||||||
2022-01-02 01:00:00,800.131
|
|
||||||
2022-01-02 02:00:00,72.708
|
|
||||||
2022-01-02 03:00:00,65.117
|
|
||||||
2022-01-02 04:00:00,66.532
|
|
||||||
2022-01-02 05:00:00,61.975
|
|
||||||
2022-01-02 06:00:00,62.031
|
|
||||||
2022-01-02 07:00:00,67.875
|
|
||||||
2022-01-02 08:00:00,74.184
|
|
||||||
2022-01-02 09:00:00,77.029
|
|
||||||
2022-01-02 10:00:00,66.156
|
|
||||||
2022-01-02 11:00:00,66.651
|
|
||||||
2022-01-02 12:00:00,67.625
|
|
||||||
2022-01-02 13:00:00,75.857
|
|
||||||
2022-01-02 14:00:00,823.74
|
|
||||||
2022-01-02 15:00:00,81.264
|
|
||||||
2022-01-02 16:00:00,71.058
|
|
||||||
2022-01-02 17:00:00,73.361
|
|
||||||
2022-01-02 18:00:00,68.703
|
|
||||||
2022-01-02 19:00:00,68.985
|
|
||||||
2022-01-02 20:00:00,73.936
|
|
||||||
2022-01-02 21:00:00,80.968
|
|
||||||
2022-01-02 22:00:00,81.962
|
|
||||||
2022-01-02 23:00:00,72.95
|
|
||||||
2022-01-03 00:00:00,74.746
|
|
||||||
2022-01-03 01:00:00,78.924
|
|
||||||
2022-01-03 02:00:00,84.49
|
|
||||||
2022-01-03 03:00:00,911.346
|
|
||||||
2022-01-03 04:00:00,87.215
|
|
||||||
2022-01-03 05:00:00,75.943
|
|
||||||
2022-01-03 06:00:00,75.092
|
|
||||||
2022-01-03 07:00:00,68.641
|
|
||||||
2022-01-03 08:00:00,74.916
|
|
||||||
2022-01-03 09:00:00,80.942
|
|
||||||
2022-01-03 10:00:00,90.667
|
|
||||||
2022-01-03 11:00:00,89.046
|
|
||||||
2022-01-03 12:00:00,80.975
|
|
||||||
2022-01-03 13:00:00,77.369
|
|
||||||
2022-01-03 14:00:00,78.058
|
|
||||||
2022-01-03 15:00:00,83.279
|
|
||||||
2022-01-03 16:00:00,962.143
|
|
||||||
2022-01-03 17:00:00,85.191
|
|
||||||
2022-01-03 18:00:00,71.476
|
|
||||||
2022-01-03 19:00:00,67.829
|
|
||||||
2022-01-03 20:00:00,69.051
|
|
||||||
2022-01-03 21:00:00,74.201
|
|
||||||
2022-01-03 22:00:00,81.372
|
|
||||||
2022-01-03 23:00:00,88.003
|
|
||||||
2022-01-04 00:00:00,91.836
|
|
||||||
2022-01-04 01:00:00,85.066
|
|
||||||
2022-01-04 02:00:00,79.494
|
|
||||||
2022-01-04 03:00:00,79.291
|
|
||||||
2022-01-04 04:00:00,87.107
|
|
||||||
2022-01-04 05:00:00,959.916
|
|
||||||
2022-01-04 06:00:00,93.946
|
|
||||||
2022-01-04 07:00:00,83.91
|
|
||||||
2022-01-04 08:00:00,83.689
|
|
||||||
2022-01-04 09:00:00,78.077
|
|
||||||
2022-01-04 10:00:00,83.19
|
|
||||||
2022-01-04 11:00:00,88.15
|
|
||||||
2022-01-04 12:00:00,96.579
|
|
||||||
2022-01-04 13:00:00,97.246
|
|
||||||
2022-01-04 14:00:00,84.463
|
|
||||||
2022-01-04 15:00:00,86.071
|
|
||||||
2022-01-04 16:00:00,86.09
|
|
||||||
2022-01-04 17:00:00,94.293
|
|
||||||
2022-01-04 18:00:00,1055.704
|
|
||||||
2022-01-04 19:00:00,100.568
|
|
||||||
2022-01-04 20:00:00,94.862
|
|
||||||
2022-01-04 21:00:00,93.21
|
|
||||||
2022-01-04 22:00:00,81.245
|
|
||||||
2022-01-04 23:00:00,82.785
|
|
||||||
2022-01-05 00:00:00,91.484
|
|
||||||
2022-01-05 01:00:00,107.126
|
|
||||||
2022-01-05 02:00:00,106.245
|
|
||||||
2022-01-05 03:00:00,95.662
|
|
||||||
2022-01-05 04:00:00,90.03
|
|
||||||
2022-01-05 05:00:00,91.239
|
|
||||||
2022-01-05 06:00:00,102.138
|
|
||||||
2022-01-05 07:00:00,1136.594
|
|
||||||
2022-01-05 08:00:00,108.164
|
|
||||||
2022-01-05 09:00:00,94.766
|
|
||||||
2022-01-05 10:00:00,95.724
|
|
||||||
2022-01-05 11:00:00,86.386
|
|
||||||
2022-01-05 12:00:00,89.002
|
|
||||||
2022-01-05 13:00:00,99.05
|
|
||||||
2022-01-05 14:00:00,111.044
|
|
||||||
2022-01-05 15:00:00,107.758
|
|
||||||
2022-01-05 16:00:00,95.891
|
|
||||||
2022-01-05 17:00:00,94.541
|
|
||||||
2022-01-05 18:00:00,92.986
|
|
||||||
2022-01-05 19:00:00,105.056
|
|
||||||
2022-01-05 20:00:00,1180.367
|
|
||||||
2022-01-05 21:00:00,113.136
|
|
||||||
2022-01-05 22:00:00,97.313
|
|
||||||
2022-01-05 23:00:00,95.335
|
|
||||||
2022-01-06 00:00:00,86.587
|
|
||||||
2022-01-06 01:00:00,90.83
|
|
||||||
2022-01-06 02:00:00,94.419
|
|
||||||
2022-01-06 03:00:00,109.995
|
|
||||||
2022-01-06 04:00:00,109.179
|
|
||||||
2022-01-06 05:00:00,96.39
|
|
||||||
2022-01-06 06:00:00,92.24
|
|
||||||
2022-01-06 07:00:00,95.165
|
|
||||||
2022-01-06 08:00:00,101.367
|
|
||||||
2022-01-06 09:00:00,1181.956
|
|
||||||
2022-01-06 10:00:00,105.965
|
|
||||||
2022-01-06 11:00:00,90.912
|
|
||||||
2022-01-06 12:00:00,93.568
|
|
||||||
2022-01-06 13:00:00,86.575
|
|
||||||
2022-01-06 14:00:00,90.75
|
|
||||||
2022-01-06 15:00:00,99.98
|
|
||||||
2022-01-06 16:00:00,119.945
|
|
||||||
2022-01-06 17:00:00,126.652
|
|
||||||
2022-01-06 18:00:00,107.675
|
|
||||||
2022-01-06 19:00:00,100.677
|
|
||||||
2022-01-06 20:00:00,101.663
|
|
||||||
2022-01-06 21:00:00,117.417
|
|
||||||
2022-01-06 22:00:00,1241.778
|
|
||||||
2022-01-06 23:00:00,119.436
|
|
||||||
2022-01-07 00:00:00,103.635
|
|
||||||
2022-01-07 01:00:00,108.149
|
|
||||||
2022-01-07 02:00:00,94.329
|
|
||||||
2022-01-07 03:00:00,98.181
|
|
||||||
2022-01-07 04:00:00,112.983
|
|
||||||
2022-01-07 05:00:00,119.701
|
|
||||||
2022-01-07 06:00:00,125.724
|
|
||||||
2022-01-07 07:00:00,107.179
|
|
||||||
2022-01-07 08:00:00,108.583
|
|
||||||
2022-01-07 09:00:00,107.546
|
|
||||||
2022-01-07 10:00:00,112.167
|
|
||||||
2022-01-07 11:00:00,1317.614
|
|
||||||
2022-01-07 12:00:00,125.429
|
|
||||||
2022-01-07 13:00:00,109.359
|
|
||||||
2022-01-07 14:00:00,107.966
|
|
||||||
2022-01-07 15:00:00,100.317
|
|
||||||
2022-01-07 16:00:00,107.595
|
|
||||||
2022-01-07 17:00:00,113.584
|
|
||||||
2022-01-07 18:00:00,126.626
|
|
||||||
2022-01-07 19:00:00,124.309
|
|
||||||
2022-01-07 20:00:00,111.9
|
|
||||||
2022-01-07 21:00:00,108.331
|
|
||||||
2022-01-07 22:00:00,107.034
|
|
||||||
2022-01-07 23:00:00,124.95
|
|
||||||
2022-01-08 00:00:00,1367.401
|
|
||||||
2022-01-08 01:00:00,126.887
|
|
||||||
2022-01-08 02:00:00,109.086
|
|
||||||
2022-01-08 03:00:00,106.803
|
|
||||||
2022-01-08 04:00:00,95.341
|
|
||||||
2022-01-08 05:00:00,101.892
|
|
||||||
2022-01-08 06:00:00,116.698
|
|
||||||
2022-01-08 07:00:00,134.789
|
|
||||||
2022-01-08 08:00:00,122.28
|
|
||||||
2022-01-08 09:00:00,112.03
|
|
||||||
2022-01-08 10:00:00,107.235
|
|
||||||
2022-01-08 11:00:00,107.317
|
|
||||||
2022-01-08 12:00:00,117.127
|
|
||||||
2022-01-08 13:00:00,1357.485
|
|
||||||
2022-01-08 14:00:00,124.043
|
|
||||||
2022-01-08 15:00:00,106.754
|
|
||||||
2022-01-08 16:00:00,108.607
|
|
||||||
2022-01-08 17:00:00,102.222
|
|
||||||
2022-01-08 18:00:00,112.257
|
|
||||||
2022-01-08 19:00:00,126.2
|
|
||||||
2022-01-08 20:00:00,140.582
|
|
||||||
2022-01-08 21:00:00,139.268
|
|
||||||
2022-01-08 22:00:00,117.773
|
|
||||||
2022-01-08 23:00:00,113.515
|
|
||||||
2022-01-09 00:00:00,111.217
|
|
||||||
2022-01-09 01:00:00,124.314
|
|
||||||
2022-01-09 02:00:00,1426.753
|
|
||||||
2022-01-09 03:00:00,133.468
|
|
||||||
2022-01-09 04:00:00,120.783
|
|
||||||
2022-01-09 05:00:00,115.584
|
|
||||||
2022-01-09 06:00:00,106.49
|
|
||||||
2022-01-09 07:00:00,111.2
|
|
||||||
2022-01-09 08:00:00,128.537
|
|
||||||
2022-01-09 09:00:00,141.139
|
|
||||||
2022-01-09 10:00:00,148.031
|
|
||||||
2022-01-09 11:00:00,121.057
|
|
||||||
2022-01-09 12:00:00,117.165
|
|
||||||
2022-01-09 13:00:00,116.659
|
|
||||||
2022-01-09 14:00:00,131.695
|
|
||||||
2022-01-09 15:00:00,1491.807
|
|
||||||
2022-01-09 16:00:00,132.233
|
|
||||||
2022-01-09 17:00:00,124.345
|
|
||||||
2022-01-09 18:00:00,122.803
|
|
||||||
2022-01-09 19:00:00,111.194
|
|
||||||
2022-01-09 20:00:00,115.915
|
|
||||||
2022-01-09 21:00:00,126.031
|
|
||||||
2022-01-09 22:00:00,138.083
|
|
||||||
2022-01-09 23:00:00,139.614
|
|
||||||
2022-01-10 00:00:00,124.594
|
|
||||||
2022-01-10 01:00:00,119.943
|
|
||||||
2022-01-10 02:00:00,120.824
|
|
||||||
2022-01-10 03:00:00,143.264
|
|
||||||
2022-01-10 04:00:00,1518.844
|
|
||||||
2022-01-10 05:00:00,132.923
|
|
||||||
2022-01-10 06:00:00,116.26
|
|
||||||
2022-01-10 07:00:00,121.806
|
|
||||||
2022-01-10 08:00:00,115.909
|
|
||||||
2022-01-10 09:00:00,118.556
|
|
||||||
2022-01-10 10:00:00,130.719
|
|
||||||
2022-01-10 11:00:00,143.146
|
|
||||||
2022-01-10 12:00:00,146.257
|
|
||||||
2022-01-10 13:00:00,134.042
|
|
||||||
2022-01-10 14:00:00,128.8
|
|
||||||
2022-01-10 15:00:00,122.119
|
|
||||||
2022-01-10 16:00:00,137.027
|
|
||||||
2022-01-10 17:00:00,1547.564
|
|
||||||
2022-01-10 18:00:00,143.148
|
|
||||||
2022-01-10 19:00:00,117.505
|
|
||||||
2022-01-10 20:00:00,118.823
|
|
||||||
2022-01-10 21:00:00,111.147
|
|
||||||
2022-01-10 22:00:00,122.745
|
|
||||||
2022-01-10 23:00:00,131.945
|
|
||||||
2022-01-11 00:00:00,144.042
|
|
||||||
2022-01-11 01:00:00,144.107
|
|
||||||
2022-01-11 02:00:00,129.099
|
|
||||||
2022-01-11 03:00:00,124.058
|
|
||||||
2022-01-11 04:00:00,127.928
|
|
||||||
2022-01-11 05:00:00,133.633
|
|
||||||
2022-01-11 06:00:00,1548.18
|
|
||||||
2022-01-11 07:00:00,137.39
|
|
||||||
2022-01-11 08:00:00,121.125
|
|
||||||
2022-01-11 09:00:00,126.201
|
|
||||||
2022-01-11 10:00:00,118.33
|
|
||||||
2022-01-11 11:00:00,121.946
|
|
||||||
2022-01-11 12:00:00,129.054
|
|
||||||
2022-01-11 13:00:00,148.563
|
|
||||||
2022-01-11 14:00:00,142.166
|
|
||||||
2022-01-11 15:00:00,132.766
|
|
||||||
2022-01-11 16:00:00,126.405
|
|
||||||
2022-01-11 17:00:00,126.014
|
|
||||||
2022-01-11 18:00:00,139.605
|
|
||||||
2022-01-11 19:00:00,1569.566
|
|
||||||
2022-01-11 20:00:00,139.269
|
|
||||||
2022-01-11 21:00:00,128.056
|
|
||||||
2022-01-11 22:00:00,134.599
|
|
||||||
2022-01-11 23:00:00,119.596
|
|
||||||
2022-01-12 00:00:00,120.469
|
|
||||||
2022-01-12 01:00:00,136.697
|
|
||||||
2022-01-12 02:00:00,157.967
|
|
||||||
2022-01-12 03:00:00,156.392
|
|
||||||
2022-01-12 04:00:00,133.435
|
|
||||||
2022-01-12 05:00:00,130.321
|
|
||||||
2022-01-12 06:00:00,131.799
|
|
||||||
2022-01-12 07:00:00,143.919
|
|
||||||
2022-01-12 08:00:00,1632.52
|
|
||||||
2022-01-12 09:00:00,153.119
|
|
||||||
2022-01-12 10:00:00,131.25
|
|
||||||
2022-01-12 11:00:00,132.54
|
|
||||||
2022-01-12 12:00:00,120.392
|
|
||||||
2022-01-12 13:00:00,126.496
|
|
||||||
2022-01-12 14:00:00,146.639
|
|
||||||
2022-01-12 15:00:00,153.375
|
|
||||||
2022-01-12 16:00:00,151.757
|
|
||||||
2022-01-12 17:00:00,133.235
|
|
||||||
2022-01-12 18:00:00,129.229
|
|
||||||
2022-01-12 19:00:00,124.074
|
|
||||||
2022-01-12 20:00:00,136.675
|
|
||||||
2022-01-12 21:00:00,1638.781
|
|
||||||
2022-01-12 22:00:00,143.097
|
|
||||||
2022-01-12 23:00:00,127.774
|
|
||||||
2022-01-13 00:00:00,127.348
|
|
||||||
2022-01-13 01:00:00,118.414
|
|
||||||
2022-01-13 02:00:00,125.516
|
|
||||||
2022-01-13 03:00:00,138.913
|
|
||||||
2022-01-13 04:00:00,159.638
|
|
||||||
2022-01-13 05:00:00,167.717
|
|
||||||
2022-01-13 06:00:00,137.474
|
|
||||||
2022-01-13 07:00:00,132.871
|
|
||||||
2022-01-13 08:00:00,134.591
|
|
||||||
2022-01-13 09:00:00,147.39
|
|
||||||
2022-01-13 10:00:00,1660.744
|
|
||||||
2022-01-13 11:00:00,153.915
|
|
||||||
2022-01-13 12:00:00,138.446
|
|
||||||
2022-01-13 13:00:00,138.362
|
|
||||||
2022-01-13 14:00:00,124.885
|
|
||||||
2022-01-13 15:00:00,135.014
|
|
||||||
2022-01-13 16:00:00,147.23
|
|
||||||
2022-01-13 17:00:00,160.939
|
|
||||||
2022-01-13 18:00:00,162.998
|
|
||||||
2022-01-13 19:00:00,144.095
|
|
||||||
2022-01-13 20:00:00,143.399
|
|
||||||
2022-01-13 21:00:00,147.318
|
|
||||||
2022-01-13 22:00:00,155.809
|
|
||||||
2022-01-13 23:00:00,1752.41
|
|
||||||
2022-01-14 00:00:00,162.245
|
|
||||||
2022-01-14 01:00:00,135.873
|
|
||||||
2022-01-14 02:00:00,138.495
|
|
||||||
2022-01-14 03:00:00,130.325
|
|
||||||
2022-01-14 04:00:00,136.525
|
|
||||||
2022-01-14 05:00:00,147.624
|
|
||||||
2022-01-14 06:00:00,169.108
|
|
||||||
2022-01-14 07:00:00,164.925
|
|
||||||
2022-01-14 08:00:00,152.353
|
|
||||||
2022-01-14 09:00:00,152.153
|
|
||||||
2022-01-14 10:00:00,146.425
|
|
||||||
2022-01-14 11:00:00,160.993
|
|
||||||
2022-01-14 12:00:00,1797.045
|
|
||||||
2022-01-14 13:00:00,159.602
|
|
||||||
2022-01-14 14:00:00,138.682
|
|
||||||
2022-01-14 15:00:00,144.143
|
|
||||||
2022-01-14 16:00:00,133.418
|
|
||||||
2022-01-14 17:00:00,146.249
|
|
||||||
2022-01-14 18:00:00,158.591
|
|
||||||
2022-01-14 19:00:00,174.995
|
|
||||||
2022-01-14 20:00:00,174.745
|
|
||||||
2022-01-14 21:00:00,156.709
|
|
||||||
2022-01-14 22:00:00,147.334
|
|
||||||
2022-01-14 23:00:00,139.397
|
|
||||||
2022-01-15 00:00:00,154.318
|
|
||||||
2022-01-15 01:00:00,1828.184
|
|
||||||
2022-01-15 02:00:00,161.387
|
|
||||||
2022-01-15 03:00:00,138.081
|
|
||||||
2022-01-15 04:00:00,145.169
|
|
||||||
2022-01-15 05:00:00,137.504
|
|
||||||
2022-01-15 06:00:00,144.891
|
|
||||||
2022-01-15 07:00:00,157.377
|
|
||||||
2022-01-15 08:00:00,179.42
|
|
||||||
2022-01-15 09:00:00,173.707
|
|
||||||
2022-01-15 10:00:00,154.874
|
|
||||||
2022-01-15 11:00:00,147.523
|
|
||||||
2022-01-15 12:00:00,142.095
|
|
||||||
2022-01-15 13:00:00,154.387
|
|
||||||
2022-01-15 14:00:00,1836.415
|
|
||||||
2022-01-15 15:00:00,172.903
|
|
||||||
2022-01-15 16:00:00,155.75
|
|
||||||
2022-01-15 17:00:00,152.347
|
|
||||||
2022-01-15 18:00:00,137.295
|
|
||||||
2022-01-15 19:00:00,151.232
|
|
||||||
2022-01-15 20:00:00,165.771
|
|
||||||
2022-01-15 21:00:00,172.816
|
|
||||||
2022-01-15 22:00:00,179.476
|
|
||||||
2022-01-15 23:00:00,158.627
|
|
||||||
2022-01-16 00:00:00,156.631
|
|
||||||
2022-01-16 01:00:00,155.015
|
|
||||||
2022-01-16 02:00:00,169.514
|
|
||||||
2022-01-16 03:00:00,1927.376
|
|
||||||
2022-01-16 04:00:00,171.379
|
|
||||||
2022-01-16 05:00:00,146.187
|
|
||||||
2022-01-16 06:00:00,151.068
|
|
||||||
2022-01-16 07:00:00,136.46
|
|
||||||
2022-01-16 08:00:00,148.784
|
|
||||||
2022-01-16 09:00:00,159.457
|
|
||||||
2022-01-16 10:00:00,176.898
|
|
||||||
2022-01-16 11:00:00,180.673
|
|
||||||
2022-01-16 12:00:00,153.202
|
|
||||||
2022-01-16 13:00:00,146.64
|
|
||||||
2022-01-16 14:00:00,142.367
|
|
||||||
2022-01-16 15:00:00,156.713
|
|
||||||
2022-01-16 16:00:00,1869.826
|
|
||||||
2022-01-16 17:00:00,159.356
|
|
||||||
2022-01-16 18:00:00,139.482
|
|
||||||
2022-01-16 19:00:00,146.594
|
|
||||||
2022-01-16 20:00:00,138.353
|
|
||||||
2022-01-16 21:00:00,147.956
|
|
||||||
2022-01-16 22:00:00,161.561
|
|
||||||
2022-01-16 23:00:00,179.351
|
|
||||||
2022-01-17 00:00:00,177.391
|
|
||||||
2022-01-17 01:00:00,162.681
|
|
||||||
2022-01-17 02:00:00,156.051
|
|
||||||
2022-01-17 03:00:00,153.318
|
|
||||||
2022-01-17 04:00:00,167.785
|
|
||||||
2022-01-17 05:00:00,1889.879
|
|
||||||
2022-01-17 06:00:00,175.518
|
|
||||||
2022-01-17 07:00:00,152.63
|
|
||||||
2022-01-17 08:00:00,150.919
|
|
||||||
2022-01-17 09:00:00,138.322
|
|
||||||
2022-01-17 10:00:00,147.491
|
|
||||||
2022-01-17 11:00:00,160.056
|
|
||||||
2022-01-17 12:00:00,178.656
|
|
||||||
2022-01-17 13:00:00,181.673
|
|
||||||
2022-01-17 14:00:00,161.942
|
|
||||||
2022-01-17 15:00:00,155.337
|
|
||||||
2022-01-17 16:00:00,156.001
|
|
||||||
2022-01-17 17:00:00,172.427
|
|
||||||
2022-01-17 18:00:00,1930.971
|
|
||||||
2022-01-17 19:00:00,175.35
|
|
||||||
2022-01-17 20:00:00,157.548
|
|
||||||
2022-01-17 21:00:00,149.42
|
|
||||||
2022-01-17 22:00:00,138.155
|
|
||||||
2022-01-17 23:00:00,153.824
|
|
||||||
2022-01-18 00:00:00,164.022
|
|
||||||
2022-01-18 01:00:00,178.541
|
|
||||||
2022-01-18 02:00:00,175.913
|
|
||||||
2022-01-18 03:00:00,163.182
|
|
||||||
2022-01-18 04:00:00,155.596
|
|
||||||
2022-01-18 05:00:00,156.598
|
|
||||||
2022-01-18 06:00:00,174.92
|
|
||||||
2022-01-18 07:00:00,1943.069
|
|
||||||
2022-01-18 08:00:00,175.514
|
|
||||||
2022-01-18 09:00:00,153.555
|
|
||||||
2022-01-18 10:00:00,159.857
|
|
||||||
2022-01-18 11:00:00,140.548
|
|
||||||
2022-01-18 12:00:00,151.645
|
|
||||||
2022-01-18 13:00:00,171.133
|
|
||||||
2022-01-18 14:00:00,184.087
|
|
||||||
2022-01-18 15:00:00,186.022
|
|
||||||
2022-01-18 16:00:00,169.222
|
|
||||||
2022-01-18 17:00:00,160.682
|
|
||||||
2022-01-18 18:00:00,155.899
|
|
||||||
2022-01-18 19:00:00,175.664
|
|
||||||
2022-01-18 20:00:00,1983.829
|
|
||||||
2022-01-18 21:00:00,166.165
|
|
||||||
2022-01-18 22:00:00,154.226
|
|
||||||
2022-01-18 23:00:00,156.997
|
|
||||||
2022-01-19 00:00:00,138.082
|
|
||||||
2022-01-19 01:00:00,153.221
|
|
||||||
2022-01-19 02:00:00,166.169
|
|
||||||
2022-01-19 03:00:00,184.807
|
|
||||||
2022-01-19 04:00:00,186.844
|
|
||||||
2022-01-19 05:00:00,160.475
|
|
||||||
2022-01-19 06:00:00,159.328
|
|
||||||
2022-01-19 07:00:00,156.604
|
|
||||||
2022-01-19 08:00:00,170.779
|
|
||||||
2022-01-19 09:00:00,1953.699
|
|
||||||
2022-01-19 10:00:00,174.337
|
|
||||||
2022-01-19 11:00:00,159.772
|
|
||||||
2022-01-19 12:00:00,155.545
|
|
||||||
2022-01-19 13:00:00,144.038
|
|
||||||
2022-01-19 14:00:00,154.284
|
|
||||||
2022-01-19 15:00:00,170.559
|
|
||||||
2022-01-19 16:00:00,183.582
|
|
||||||
2022-01-19 17:00:00,188.407
|
|
||||||
2022-01-19 18:00:00,167.18
|
|
||||||
2022-01-19 19:00:00,159.36
|
|
||||||
2022-01-19 20:00:00,156.666
|
|
||||||
2022-01-19 21:00:00,173.557
|
|
||||||
2022-01-19 22:00:00,1987.288
|
|
||||||
2022-01-19 23:00:00,177.865
|
|
||||||
2022-01-20 00:00:00,163.114
|
|
||||||
2022-01-20 01:00:00,156.693
|
|
||||||
2022-01-20 02:00:00,144.524
|
|
||||||
2022-01-20 03:00:00,152.626
|
|
||||||
2022-01-20 04:00:00,168.239
|
|
||||||
2022-01-20 05:00:00,184.592
|
|
||||||
2022-01-20 06:00:00,179.993
|
|
||||||
2022-01-20 07:00:00,160.76
|
|
||||||
2022-01-20 08:00:00,150.605
|
|
||||||
2022-01-20 09:00:00,152.302
|
|
||||||
2022-01-20 10:00:00,168.073
|
|
||||||
2022-01-20 11:00:00,1959.387
|
|
||||||
2022-01-20 12:00:00,169.01
|
|
||||||
2022-01-20 13:00:00,138.457
|
|
||||||
2022-01-20 14:00:00,134.157
|
|
||||||
2022-01-20 15:00:00,125.161
|
|
||||||
2022-01-20 16:00:00,131.317
|
|
||||||
2022-01-20 17:00:00,147.22
|
|
||||||
2022-01-20 18:00:00,157.083
|
|
||||||
2022-01-20 19:00:00,161.543
|
|
||||||
2022-01-20 20:00:00,137.175
|
|
||||||
2022-01-20 21:00:00,138.952
|
|
||||||
2022-01-20 22:00:00,136.236
|
|
||||||
2022-01-20 23:00:00,164.564
|
|
||||||
2022-01-21 00:00:00,1740.874
|
|
||||||
2022-01-21 01:00:00,169.541
|
|
||||||
2022-01-21 02:00:00,149.732
|
|
||||||
2022-01-21 03:00:00,142.659
|
|
||||||
2022-01-21 04:00:00,125.288
|
|
||||||
2022-01-21 05:00:00,141.697
|
|
||||||
2022-01-21 06:00:00,163.128
|
|
||||||
2022-01-21 07:00:00,177.165
|
|
||||||
2022-01-21 08:00:00,176.655
|
|
||||||
2022-01-21 09:00:00,148.406
|
|
||||||
2022-01-21 10:00:00,132.129
|
|
||||||
2022-01-21 11:00:00,135.919
|
|
||||||
2022-01-21 12:00:00,165.3
|
|
||||||
2022-01-21 13:00:00,1827.618
|
|
||||||
2022-01-21 14:00:00,166.309
|
|
||||||
2022-01-21 15:00:00,135.738
|
|
||||||
2022-01-21 16:00:00,133.862
|
|
||||||
2022-01-21 17:00:00,123.65
|
|
||||||
2022-01-21 18:00:00,135.488
|
|
||||||
2022-01-21 19:00:00,155.016
|
|
||||||
2022-01-21 20:00:00,173.728
|
|
||||||
2022-01-21 21:00:00,169.987
|
|
||||||
2022-01-21 22:00:00,141.456
|
|
||||||
2022-01-21 23:00:00,128.32
|
|
||||||
2022-01-22 00:00:00,123.628
|
|
||||||
2022-01-22 01:00:00,135.527
|
|
||||||
2022-01-22 02:00:00,1722.711
|
|
||||||
2022-01-22 03:00:00,129.542
|
|
||||||
2022-01-22 04:00:00,115.247
|
|
||||||
2022-01-22 05:00:00,105.084
|
|
||||||
2022-01-22 06:00:00,94.674
|
|
||||||
2022-01-22 07:00:00,114.96
|
|
||||||
2022-01-22 08:00:00,131.167
|
|
||||||
2022-01-22 09:00:00,158.331
|
|
||||||
2022-01-22 10:00:00,151.36
|
|
||||||
2022-01-22 11:00:00,127.184
|
|
||||||
2022-01-22 12:00:00,121.741
|
|
||||||
2022-01-22 13:00:00,127.974
|
|
||||||
2022-01-22 14:00:00,133.974
|
|
||||||
2022-01-22 15:00:00,1511.237
|
|
||||||
2022-01-22 16:00:00,137.055
|
|
||||||
2022-01-22 17:00:00,122.562
|
|
||||||
2022-01-22 18:00:00,128.606
|
|
||||||
2022-01-22 19:00:00,110.959
|
|
||||||
2022-01-22 20:00:00,118.029
|
|
||||||
2022-01-22 21:00:00,137.026
|
|
||||||
2022-01-22 22:00:00,151.952
|
|
||||||
2022-01-22 23:00:00,149.701
|
|
||||||
2022-01-23 00:00:00,132.785
|
|
||||||
2022-01-23 01:00:00,121.075
|
|
||||||
2022-01-23 02:00:00,120.445
|
|
||||||
2022-01-23 03:00:00,141.155
|
|
||||||
2022-01-23 04:00:00,1571.349
|
|
||||||
2022-01-23 05:00:00,153.85
|
|
||||||
2022-01-23 06:00:00,140.102
|
|
||||||
2022-01-23 07:00:00,132.664
|
|
||||||
2022-01-23 08:00:00,106.751
|
|
||||||
2022-01-23 09:00:00,117.672
|
|
||||||
2022-01-23 10:00:00,136.577
|
|
||||||
2022-01-23 11:00:00,149.776
|
|
||||||
2022-01-23 12:00:00,148.995
|
|
||||||
2022-01-23 13:00:00,126.983
|
|
||||||
2022-01-23 14:00:00,112.3
|
|
||||||
2022-01-23 15:00:00,118.837
|
|
||||||
2022-01-23 16:00:00,124.629
|
|
||||||
2022-01-23 17:00:00,1569.137
|
|
||||||
2022-01-23 18:00:00,130.232
|
|
||||||
2022-01-23 19:00:00,122.417
|
|
||||||
2022-01-23 20:00:00,106.412
|
|
||||||
2022-01-23 21:00:00,88.646
|
|
||||||
2022-01-23 22:00:00,104.498
|
|
||||||
2022-01-23 23:00:00,126.28
|
|
||||||
2022-01-24 00:00:00,140.283
|
|
||||||
2022-01-24 01:00:00,135.156
|
|
||||||
2022-01-24 02:00:00,118.653
|
|
||||||
2022-01-24 03:00:00,98.469
|
|
||||||
2022-01-24 04:00:00,90.263
|
|
||||||
2022-01-24 05:00:00,91.658
|
|
||||||
2022-01-24 06:00:00,1352.967
|
|
||||||
2022-01-24 07:00:00,113.495
|
|
||||||
2022-01-24 08:00:00,92.416
|
|
||||||
2022-01-24 09:00:00,72.84
|
|
||||||
2022-01-24 10:00:00,71.41
|
|
||||||
2022-01-24 11:00:00,82.51
|
|
||||||
2022-01-24 12:00:00,115.772
|
|
||||||
2022-01-24 13:00:00,135.958
|
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,25 +0,0 @@
|
||||||
import joblib
|
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
|
|
||||||
def load_load_model(path):
|
|
||||||
gbm = joblib.load(path)
|
|
||||||
return gbm
|
|
||||||
|
|
||||||
def load_forecast(inputs: np.ndarray, model):
|
|
||||||
"""_summary_
|
|
||||||
|
|
||||||
Args:
|
|
||||||
inputs (np.ndarray): 输入序列
|
|
||||||
model (_type_): _description_
|
|
||||||
"""
|
|
||||||
out = model.predict([inputs])
|
|
||||||
return out
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
model = load_load_model('./models/load_pred.joblib')
|
|
||||||
inputs = np.random.randn(24)
|
|
||||||
print(inputs.shape)
|
|
||||||
out = load_forecast(inputs, model)
|
|
||||||
print(out)
|
|
|
@ -1,73 +0,0 @@
|
||||||
import pandas as pd
|
|
||||||
import numpy as np
|
|
||||||
import xgboost as xgb
|
|
||||||
from sklearn.model_selection import train_test_split
|
|
||||||
from sklearn.metrics import mean_squared_error, r2_score
|
|
||||||
import joblib
|
|
||||||
from logzero import logger
|
|
||||||
|
|
||||||
def time_series_to_supervised(data, columns, n_in=24, n_out=1,dropnan=True):
|
|
||||||
"""
|
|
||||||
:param data:作为列表或2D NumPy数组的观察序列。需要。
|
|
||||||
:param n_in:作为输入的滞后观察数(X)。值可以在[1..len(数据)]之间可选。默认为1。
|
|
||||||
:param n_out:作为输出的观测数量(y)。值可以在[0..len(数据)]之间。可选的。默认为1。
|
|
||||||
:param dropnan:Boolean是否删除具有NaN值的行。可选的。默认为True。
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
logger.info(f"正在处理训练数据:size:{data.shape}")
|
|
||||||
n_vars = 1 if type(data) is list else data.shape[1]
|
|
||||||
df = pd.DataFrame(data)
|
|
||||||
origNames = columns
|
|
||||||
cols, names = list(), list()
|
|
||||||
cols.append(df.shift(0))
|
|
||||||
names += [('%s' % origNames[j]) for j in range(n_vars)]
|
|
||||||
n_in = max(1, n_in)
|
|
||||||
for i in range(n_in-1, 0, -1):
|
|
||||||
time = '(t-%d)' % i
|
|
||||||
cols.append(df.shift(i))
|
|
||||||
names += [('%s%s' % (origNames[j], time)) for j in range(n_vars)]
|
|
||||||
n_out = max(n_out, 0)
|
|
||||||
for i in range(1, n_out+1):
|
|
||||||
time = '(t+%d)' % i
|
|
||||||
cols.append(df.shift(-i))
|
|
||||||
names += [('%s%s' % (origNames[j], time)) for j in range(n_vars)]
|
|
||||||
agg = pd.concat(cols, axis=1)
|
|
||||||
agg.columns = names
|
|
||||||
if dropnan:
|
|
||||||
agg.dropna(inplace=True)
|
|
||||||
return agg
|
|
||||||
|
|
||||||
def train_model(train_data: pd.DataFrame):
|
|
||||||
"""训练模型的函数,需要根据模型类型实际调整
|
|
||||||
|
|
||||||
Args:
|
|
||||||
data (pd.DataFrame): 训练集
|
|
||||||
"""
|
|
||||||
# 特征和输出列名,需要根据业务场景灵活处理
|
|
||||||
fea_cols = train_data.columns[:-1].tolist()
|
|
||||||
out_cols = train_data.columns[-1:].tolist()
|
|
||||||
logger.info(fea_cols, out_cols)
|
|
||||||
X = train_data[fea_cols]
|
|
||||||
y = train_data[out_cols]
|
|
||||||
train_X,test_X,train_y,test_y = train_test_split(X, y, test_size=0.2, random_state=42)
|
|
||||||
valid_X,test_X,valid_y,test_y = train_test_split(test_X, test_y, test_size=0.5, random_state=42)
|
|
||||||
|
|
||||||
# 参数
|
|
||||||
other_params = {'learning_rate': 0.1, 'n_estimators': 150, 'max_depth': 10, 'min_child_weight': 1, 'seed': 0, 'subsample': 0.8, 'colsample_bytree': 0.8, 'gamma': 0, 'reg_alpha': 0, 'reg_lambda': 1}
|
|
||||||
print(train_X.shape, train_y.shape)
|
|
||||||
|
|
||||||
gbm = xgb.XGBRegressor(objective='reg:squarederror',**other_params)
|
|
||||||
|
|
||||||
gbm.fit(train_X.values, train_y.values, eval_set=[(valid_X.values, valid_y.values)], early_stopping_rounds=20)
|
|
||||||
|
|
||||||
y_pred = gbm.predict(test_X.values)
|
|
||||||
|
|
||||||
logger.info(f"Root Mean Squared Error on Test set: {np.sqrt(mean_squared_error(test_y, y_pred))}")
|
|
||||||
logger.info(f"R2 score on Test set: {r2_score(test_y, y_pred)}")
|
|
||||||
joblib.dump(gbm, './models/load_pred.joblib')
|
|
||||||
logger.info(f"save_path: ./models/load_pred.joblib")
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
data = pd.read_csv('./data/load_data_hourly.csv', index_col=0)
|
|
||||||
agg = time_series_to_supervised(data.values, data.columns, 24, 1)
|
|
||||||
train_model(agg)
|
|
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
Binary file not shown.
|
@ -1,26 +0,0 @@
|
||||||
import joblib
|
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
|
|
||||||
def load_model(path):
|
|
||||||
gbm = joblib.load(path)
|
|
||||||
return gbm
|
|
||||||
|
|
||||||
def pv_forecast(inputs: np.ndarray, model):
|
|
||||||
"""_summary_
|
|
||||||
|
|
||||||
Args:
|
|
||||||
inputs (np.ndarray): 输入序列
|
|
||||||
model (_type_): _description_
|
|
||||||
"""
|
|
||||||
out = model.predict([inputs])
|
|
||||||
return out
|
|
||||||
|
|
||||||
|
|
||||||
# if __name__ == '__main__':
|
|
||||||
# model = load_model('models/pv_pred.joblib')
|
|
||||||
# inputs = np.random.randn(24)
|
|
||||||
#
|
|
||||||
# print(inputs.shape)
|
|
||||||
# out = pv_forecast(inputs, model)
|
|
||||||
# print(out)
|
|
|
@ -1,79 +0,0 @@
|
||||||
import pandas as pd
|
|
||||||
import numpy as np
|
|
||||||
import xgboost as xgb
|
|
||||||
from sklearn.model_selection import train_test_split
|
|
||||||
from sklearn.metrics import mean_squared_error, r2_score
|
|
||||||
import joblib
|
|
||||||
from logzero import logger
|
|
||||||
|
|
||||||
def time_series_to_supervised(data, columns, n_in=24, n_out=1,dropnan=True):
|
|
||||||
"""
|
|
||||||
:param data:作为列表或2D NumPy数组的观察序列。需要。
|
|
||||||
:param n_in:作为输入的滞后观察数(X)。值可以在[1..len(数据)]之间可选。默认为1。
|
|
||||||
:param n_out:作为输出的观测数量(y)。值可以在[0..len(数据)]之间。可选的。默认为1。
|
|
||||||
:param dropnan:Boolean是否删除具有NaN值的行。可选的。默认为True。
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
logger.info(f"正在处理训练数据:size:{data.shape}")
|
|
||||||
n_vars = 1 if type(data) is list else data.shape[1]
|
|
||||||
df = pd.DataFrame(data)
|
|
||||||
origNames = columns
|
|
||||||
cols, names = list(), list()
|
|
||||||
cols.append(df.shift(0))
|
|
||||||
names += [('%s' % origNames[j]) for j in range(n_vars)]
|
|
||||||
n_in = max(1, n_in)
|
|
||||||
for i in range(n_in-1, 0, -1):
|
|
||||||
time = '(t-%d)' % i
|
|
||||||
cols.append(df.shift(i))
|
|
||||||
names += [('%s%s' % (origNames[j], time)) for j in range(n_vars)]
|
|
||||||
n_out = max(n_out, 0)
|
|
||||||
for i in range(1, n_out+1):
|
|
||||||
time = '(t+%d)' % i
|
|
||||||
cols.append(df.shift(-i))
|
|
||||||
names += [('%s%s' % (origNames[j], time)) for j in range(n_vars)]
|
|
||||||
agg = pd.concat(cols, axis=1)
|
|
||||||
agg.columns = names
|
|
||||||
if dropnan:
|
|
||||||
agg.dropna(inplace=True)
|
|
||||||
return agg
|
|
||||||
|
|
||||||
def train_model(train_data: pd.DataFrame):
|
|
||||||
"""训练模型的函数,需要根据模型类型实际调整
|
|
||||||
|
|
||||||
Args:
|
|
||||||
data (pd.DataFrame): 训练集
|
|
||||||
"""
|
|
||||||
# 特征和输出列名,需要根据业务场景灵活处理
|
|
||||||
fea_cols = train_data.columns[:-1].tolist()
|
|
||||||
out_cols = train_data.columns[-1:].tolist()
|
|
||||||
logger.info(fea_cols, out_cols)
|
|
||||||
X = train_data[fea_cols]
|
|
||||||
y = train_data[out_cols]
|
|
||||||
# 8:1:1
|
|
||||||
train_X,test_X,train_y,test_y = train_test_split(X, y, test_size=0.2, random_state=42)
|
|
||||||
|
|
||||||
valid_X,test_X,valid_y,test_y = train_test_split(test_X, test_y, test_size=0.5, random_state=42)
|
|
||||||
|
|
||||||
# 参数
|
|
||||||
other_params = {'learning_rate': 0.1, 'n_estimators': 150, 'max_depth': 10, 'min_child_weight': 1, 'seed': 0, 'subsample': 0.8, 'colsample_bytree': 0.8, 'gamma': 0, 'reg_alpha': 0, 'reg_lambda': 1}
|
|
||||||
print(train_X.shape, train_y.shape)
|
|
||||||
print("测试集test_X:",test_X.shape, "测试集test_y:",test_y.shape)
|
|
||||||
|
|
||||||
gbm = xgb.XGBRegressor(objective='reg:squarederror',**other_params)
|
|
||||||
|
|
||||||
gbm.fit(train_X.values,
|
|
||||||
train_y.values,
|
|
||||||
eval_set=[(valid_X.values, valid_y.values)],
|
|
||||||
early_stopping_rounds=20)
|
|
||||||
|
|
||||||
y_pred = gbm.predict(test_X.values)
|
|
||||||
|
|
||||||
logger.info(f"Root Mean Squared Error on Test set: {np.sqrt(mean_squared_error(test_y, y_pred))}")
|
|
||||||
logger.info(f"R2 score on Test set: {r2_score(test_y, y_pred)}")
|
|
||||||
joblib.dump(gbm, './models/pv_pred.joblib')
|
|
||||||
logger.info(f"save_path: ./models/pv_pred.joblib")
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
data = pd.read_csv('./data/pv_data_hourly.csv', index_col=0)
|
|
||||||
agg = time_series_to_supervised(data.values, data.columns, 24, 1)
|
|
||||||
train_model(agg)
|
|
|
@ -1,13 +0,0 @@
|
||||||
EMD_signal==1.6.0
|
|
||||||
matplotlib==3.7.0
|
|
||||||
numpy==1.22.0
|
|
||||||
pandas==1.5.3
|
|
||||||
PyEMD==1.0.0
|
|
||||||
scikit_learn==1.2.1
|
|
||||||
seaborn==0.13.2
|
|
||||||
xlrd==2.0.1
|
|
||||||
vmdpy==0.2
|
|
||||||
scikit-optimize==0.10.1
|
|
||||||
xgboost==1.6.0
|
|
||||||
logzero==1.7.0
|
|
||||||
flask==3.1.0
|
|
|
@ -1,103 +0,0 @@
|
||||||
from flask import request, Flask, jsonify
|
|
||||||
from pv.pv_inference import load_model, pv_forecast
|
|
||||||
from carbon.carbon_inference import load_carbon_model,carbon_forecast
|
|
||||||
from water.water_inference import load_water_model,water_forecast
|
|
||||||
from load.load_inference import load_load_model,load_forecast
|
|
||||||
from logzero import logger
|
|
||||||
import numpy as np
|
|
||||||
app = Flask(__name__)
|
|
||||||
pv_model_gbm = load_model('./pv/models/pv_pred.joblib')
|
|
||||||
carbon_model_gbm = load_carbon_model('./carbon/models/carbon_pred.joblib')
|
|
||||||
water_model_gbm = load_water_model('./water/models/water_pred.joblib')
|
|
||||||
load_model_gbm = load_load_model('./load/models/load_pred.joblib')
|
|
||||||
|
|
||||||
|
|
||||||
@app.route('/pv', methods=['POST'])
|
|
||||||
def run_pv_forecast():
|
|
||||||
try:
|
|
||||||
data = request.json
|
|
||||||
if not data or 'inputs' not in data:
|
|
||||||
return jsonify({"error": "Invalid data"}), 400
|
|
||||||
inputs = data.get('inputs')
|
|
||||||
# 转为1维数组
|
|
||||||
inputs = np.array(inputs)
|
|
||||||
if inputs.ndim != 1:
|
|
||||||
inputs = inputs.flatten()
|
|
||||||
logger.info(f"pv history inputs: {inputs}")
|
|
||||||
# 调用预测函数
|
|
||||||
out = pv_forecast(inputs, pv_model_gbm)
|
|
||||||
# 将 NumPy 数组转换为列表
|
|
||||||
results = {"result": out.tolist()} # 使用 .tolist() 转换为列表
|
|
||||||
return jsonify(results), 200
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"Error in pv_forecast: {e}", exc_info=True)
|
|
||||||
return jsonify({"error": str(e)}), 500
|
|
||||||
|
|
||||||
@app.route('/carbon', methods=['POST'])
|
|
||||||
def run_carbon_forecast():
|
|
||||||
|
|
||||||
try:
|
|
||||||
data = request.json
|
|
||||||
if not data or 'inputs' not in data:
|
|
||||||
return jsonify({"error": "Invalid data"}), 400
|
|
||||||
inputs = data.get('inputs')
|
|
||||||
# 转为1维数组
|
|
||||||
inputs = np.array(inputs)
|
|
||||||
if inputs.ndim != 1:
|
|
||||||
inputs = inputs.flatten()
|
|
||||||
logger.info(f"carbon history inputs: {inputs}")
|
|
||||||
# 调用预测函数
|
|
||||||
out = carbon_forecast(inputs, carbon_model_gbm)
|
|
||||||
# 将 NumPy 数组转换为列表
|
|
||||||
results = {"result": out.tolist()} # 使用 .tolist() 转换为列表
|
|
||||||
return jsonify(results), 200
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"Error in carbon_forecast: {e}", exc_info=True)
|
|
||||||
return jsonify({"error": str(e)}), 500
|
|
||||||
|
|
||||||
@app.route('/water', methods=['POST'])
|
|
||||||
def run_water_forecast():
|
|
||||||
|
|
||||||
try:
|
|
||||||
data = request.json
|
|
||||||
if not data or 'inputs' not in data:
|
|
||||||
return jsonify({"error": "Invalid data"}), 400
|
|
||||||
inputs = data.get('inputs')
|
|
||||||
# 转为1维数组
|
|
||||||
inputs = np.array(inputs)
|
|
||||||
if inputs.ndim != 1:
|
|
||||||
inputs = inputs.flatten()
|
|
||||||
logger.info(f"water history inputs: {inputs}")
|
|
||||||
# 调用预测函数
|
|
||||||
out = water_forecast(inputs, water_model_gbm)
|
|
||||||
# 将 NumPy 数组转换为列表
|
|
||||||
results = {"result": out.tolist()} # 使用 .tolist() 转换为列表
|
|
||||||
return jsonify(results), 200
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"Error in water_forecast: {e}", exc_info=True)
|
|
||||||
return jsonify({"error": str(e)}), 500
|
|
||||||
@app.route('/load', methods=['POST'])
|
|
||||||
def run_load_forecast():
|
|
||||||
|
|
||||||
try:
|
|
||||||
data = request.json
|
|
||||||
if not data or 'inputs' not in data:
|
|
||||||
return jsonify({"error": "Invalid data"}), 400
|
|
||||||
inputs = data.get('inputs')
|
|
||||||
# 转为1维数组
|
|
||||||
inputs = np.array(inputs)
|
|
||||||
if inputs.ndim != 1:
|
|
||||||
inputs = inputs.flatten()
|
|
||||||
logger.info(f"load history inputs: {inputs}")
|
|
||||||
# 调用预测函数
|
|
||||||
out = load_forecast(inputs, load_model_gbm)
|
|
||||||
# 将 NumPy 数组转换为列表
|
|
||||||
results = {"result": out.tolist()} # 使用 .tolist() 转换为列表
|
|
||||||
return jsonify(results), 200
|
|
||||||
except Exception as e:
|
|
||||||
logger.error(f"Error in load_forecast: {e}", exc_info=True)
|
|
||||||
return jsonify({"error": str(e)}), 500
|
|
||||||
|
|
||||||
if __name__=='__main__':
|
|
||||||
app.run(host='0.0.0.0', port='2467')
|
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
import requests
|
|
||||||
import pandas as pd
|
|
||||||
import numpy as np
|
|
||||||
# 这里使用的是load进行预测,可改(load/pv/water/carbon)
|
|
||||||
url = "http://127.0.0.1:2467/load"
|
|
||||||
data = {
|
|
||||||
"inputs":(np.random.randn(24)*100).tolist()
|
|
||||||
}
|
|
||||||
|
|
||||||
response = requests.post(url, json=data)
|
|
||||||
|
|
||||||
print("Status Code:", response.status_code) # 打印状态码
|
|
||||||
print("Response Content:", response.text) # 打印响应内容
|
|
||||||
|
|
||||||
if response.status_code == 200:
|
|
||||||
try:
|
|
||||||
print(response.json()) # 尝试解析 JSON
|
|
||||||
except requests.exceptions.JSONDecodeError as e:
|
|
||||||
print("JSON Decode Error:", e)
|
|
||||||
else:
|
|
||||||
print("Error:", response.status_code)
|
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
@ -1,25 +0,0 @@
|
||||||
import joblib
|
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
|
|
||||||
def load_water_model(path):
|
|
||||||
gbm = joblib.load(path)
|
|
||||||
return gbm
|
|
||||||
|
|
||||||
def water_forecast(inputs: np.ndarray, model):
|
|
||||||
"""_summary_
|
|
||||||
|
|
||||||
Args:
|
|
||||||
inputs (np.ndarray): 输入序列
|
|
||||||
model (_type_): _description_
|
|
||||||
"""
|
|
||||||
out = model.predict([inputs])
|
|
||||||
return out
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
model = load_water_model('./models/water_pred.joblib')
|
|
||||||
inputs = np.random.randn(24)
|
|
||||||
print(inputs.shape)
|
|
||||||
out = water_forecast(inputs, model)
|
|
||||||
print(out)
|
|
|
@ -1,73 +0,0 @@
|
||||||
import pandas as pd
|
|
||||||
import numpy as np
|
|
||||||
import xgboost as xgb
|
|
||||||
from sklearn.model_selection import train_test_split
|
|
||||||
from sklearn.metrics import mean_squared_error, r2_score
|
|
||||||
import joblib
|
|
||||||
from logzero import logger
|
|
||||||
|
|
||||||
def time_series_to_supervised(data, columns, n_in=24, n_out=1,dropnan=True):
|
|
||||||
"""
|
|
||||||
:param data:作为列表或2D NumPy数组的观察序列。需要。
|
|
||||||
:param n_in:作为输入的滞后观察数(X)。值可以在[1..len(数据)]之间可选。默认为1。
|
|
||||||
:param n_out:作为输出的观测数量(y)。值可以在[0..len(数据)]之间。可选的。默认为1。
|
|
||||||
:param dropnan:Boolean是否删除具有NaN值的行。可选的。默认为True。
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
logger.info(f"正在处理训练数据:size:{data.shape}")
|
|
||||||
n_vars = 1 if type(data) is list else data.shape[1]
|
|
||||||
df = pd.DataFrame(data)
|
|
||||||
origNames = columns
|
|
||||||
cols, names = list(), list()
|
|
||||||
cols.append(df.shift(0))
|
|
||||||
names += [('%s' % origNames[j]) for j in range(n_vars)]
|
|
||||||
n_in = max(1, n_in)
|
|
||||||
for i in range(n_in-1, 0, -1):
|
|
||||||
time = '(t-%d)' % i
|
|
||||||
cols.append(df.shift(i))
|
|
||||||
names += [('%s%s' % (origNames[j], time)) for j in range(n_vars)]
|
|
||||||
n_out = max(n_out, 0)
|
|
||||||
for i in range(1, n_out+1):
|
|
||||||
time = '(t+%d)' % i
|
|
||||||
cols.append(df.shift(-i))
|
|
||||||
names += [('%s%s' % (origNames[j], time)) for j in range(n_vars)]
|
|
||||||
agg = pd.concat(cols, axis=1)
|
|
||||||
agg.columns = names
|
|
||||||
if dropnan:
|
|
||||||
agg.dropna(inplace=True)
|
|
||||||
return agg
|
|
||||||
|
|
||||||
def train_model(train_data: pd.DataFrame):
|
|
||||||
"""训练模型的函数,需要根据模型类型实际调整
|
|
||||||
|
|
||||||
Args:
|
|
||||||
data (pd.DataFrame): 训练集
|
|
||||||
"""
|
|
||||||
# 特征和输出列名,需要根据业务场景灵活处理
|
|
||||||
fea_cols = train_data.columns[:-1].tolist()
|
|
||||||
out_cols = train_data.columns[-1:].tolist()
|
|
||||||
logger.info(fea_cols, out_cols)
|
|
||||||
X = train_data[fea_cols]
|
|
||||||
y = train_data[out_cols]
|
|
||||||
train_X,test_X,train_y,test_y = train_test_split(X, y, test_size=0.2, random_state=42)
|
|
||||||
valid_X,test_X,valid_y,test_y = train_test_split(test_X, test_y, test_size=0.5, random_state=42)
|
|
||||||
|
|
||||||
# 参数
|
|
||||||
other_params = {'learning_rate': 0.1, 'n_estimators': 150, 'max_depth': 10, 'min_child_weight': 1, 'seed': 0, 'subsample': 0.8, 'colsample_bytree': 0.8, 'gamma': 0, 'reg_alpha': 0, 'reg_lambda': 1}
|
|
||||||
print(train_X.shape, train_y.shape)
|
|
||||||
|
|
||||||
gbm = xgb.XGBRegressor(objective='reg:squarederror',**other_params)
|
|
||||||
|
|
||||||
gbm.fit(train_X.values, train_y.values, eval_set=[(valid_X.values, valid_y.values)], early_stopping_rounds=20)
|
|
||||||
|
|
||||||
y_pred = gbm.predict(test_X.values)
|
|
||||||
|
|
||||||
logger.info(f"Root Mean Squared Error on Test set: {np.sqrt(mean_squared_error(test_y, y_pred))}")
|
|
||||||
logger.info(f"R2 score on Test set: {r2_score(test_y, y_pred)}")
|
|
||||||
joblib.dump(gbm, './models/water_pred.joblib')
|
|
||||||
logger.info(f"save_path: ./models/water_pred.joblib")
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
data = pd.read_csv('./data/preprocessed_example.csv', index_col=0)
|
|
||||||
agg = time_series_to_supervised(data.values, data.columns, 24, 1)
|
|
||||||
train_model(agg)
|
|
Loading…
Reference in New Issue