You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
3.8 KiB

5 months ago
from typing import List
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestRegressor
def random_forest_model(train_data: pd.DataFrame,
forecast_target: str,
exog_columns: List[str],
future_data: pd.DataFrame,
steps: int = 20) -> pd.DataFrame:
"""
使用随机森林模型根据给定的特征和目标数据进行训练并预测未来数据
Args:
train_data (pd.DataFrame): 训练数据集
forecast_target (str): 训练数据集中的目标列的列名
exog_columns (List[str): 训练数据集用于预测的特征列名的列表
future_data (pd.DataFrame): 存储未来预测所用的外生变量的数据集
steps (int, optional, default=20): 要进行预测的天数
Returns:
pd.DataFrame: 存储预测结果的数据表
"""
# 制作输入特征和目标变量
X = train_data[exog_columns].values
y = train_data[forecast_target].values
X_test = future_data[exog_columns].values
model = RandomForestRegressor(n_estimators=1200,
max_depth=8,
min_samples_split=2,
random_state=0)
model.fit(X, y)
pred = model.predict(X_test[-steps:])
forecast_df = pd.DataFrame(
pred,
index=pd.date_range(start=train_data.index.max() +
pd.Timedelta(days=1),
periods=steps),
columns=[forecast_target])
return forecast_df
def forecast_future(data: np.ndarray, steps: int = 20) -> List:
"""
使用随机森林预测未来的数据
Args:
data (np.ndarray): 已知的用于预测的数据
steps (int, optional, default=20): 要进行预测的天数
Returns:
List: 存放预测结果的列表
"""
# 制作输入特征和目标变量
X = data[:-1].reshape(-1, 1)
y = data[1:]
X_test = [y[-1]]
# 创建和训练随机森林模型
model = RandomForestRegressor(n_estimators=1200,
max_depth=8,
min_samples_split=2,
random_state=0)
model.fit(X, y)
# 创建一个列表保存预测结果
pred = []
# 迭代预测下一个数据点
for _ in range(steps):
y_pred = model.predict(np.array([X_test[-1]]).reshape(-1, 1))
pred.append(y_pred)
# 将预测的数据点添加到下一轮的输入
X_test.append(y_pred)
return pred
def RF_run(input_data: pd.DataFrame,
forecast_target: str,
exog_columns: List[str],
steps: int = 20) -> pd.DataFrame:
"""
执行数据读取预处理模型训练预测并绘图等一系列步骤的主函数
Args:
input_data (pd.DataFrame): 存储原始数据的DataFrame
forecast_target (str): 需要被预测的目标列名
exog_columns (List[str]): 特征列名的列表
steps (int, optional, default=20): 需要进行预测的天数
Returns:
pd.DataFrame: 存储预测结果的数据表
"""
# 创建一个未来日期的索引,用于保存预测数据
future_index = pd.date_range(start=input_data.index.max() +
pd.Timedelta(days=1),
periods=steps)
# 创建一个用于保存预测外生变量的空数据帧
df_exog = pd.DataFrame(index=future_index)
for exog in exog_columns:
pred = forecast_future(input_data[exog].values, steps=steps)
df_exog[exog] = pred
df_processed = random_forest_model(input_data, forecast_target,
exog_columns, df_exog, steps)
return df_processed