如何在使用 Salesforce-merlion 包进行时间序列预测时输入数据集
Posted
技术标签:
【中文标题】如何在使用 Salesforce-merlion 包进行时间序列预测时输入数据集【英文标题】:How to input dataset while using Salesforce-merlion package for timeseries forecasting 【发布时间】:2022-01-17 14:04:49 【问题描述】:我已经在我的 conda 环境中安装了 Salesforce-Merlion 包。现在我想使用我自己的数据集来运行预测算法。在这里,我只需要一个单变量序列来预测。但我不知道该怎么做。因为有些变量我找不到如何初始化它们。在 GIThub 中提供的示例中,使用了一些已经拆分的数据集。有人可以帮我吗?
用于预测的 GIThub 示例如下:
from merlion.utils import TimeSeries from ts_datasets.forecast import M4
# Data loader returns pandas DataFrames, which we convert to Merlion TimeSeries
time_series, metadata = M4(subset="Hourly")[0]
train_data = TimeSeries.from_pd(time_series[metadata.trainval])
test_data = TimeSeries.from_pd(time_series[~metadata.trainval])
包含内部数据集的完整代码可在以下链接中找到:
https://github.com/salesforce/Merlion/tree/main/examples/forecast
(这里他们使用的是内部数据集M4
)
现在,我必须使用我的数据集。所以我的代码是这样的:
from merlion.utils import TimeSeries
df = pd.read_csv(r'C:\Users\Doyel_De_Sarkar\Desktop\forecasting\15786_GIK.csv')
df.dropna(inplace=True)
df['ts'] = pd.to_datetime(df['ts'])
df.sort_values('ts', inplace=True)
trainval = []
for i in range(len(df)):
if i <= (round((len(df)*0.75),0)):
trainval.append(True)
else:
trainval.append(False)
df['trainval'] = trainval
df = df.drop(columns=['wday', 'hour'])
from merlion.utils import UnivariateTimeSeries
kpi = UnivariateTimeSeries(
time_stamps=df.ts, # timestamps in units of seconds
values=df.saps_total, # time series values
name="kpi" # optional: a name for this univariate
)
kpi_label = UnivariateTimeSeries(
time_stamps=df.ts, # timestamps in units of seconds
values=df.trainval # time series values
)
from merlion.utils import TimeSeries
time_series, metadata = kpi, kpi_label
train_data = TimeSeries.from_pd(time_series[metadata.trainval])
test_data = TimeSeries.from_pd(time_series[~metadata.trainval])
test_data = TimeSeries.from_pd(time_series[~metadata.trainval])
我收到以下错误
'UnivariateTimeSeries' object has no attribute 'trainval'
在这一行:
train_data = TimeSeries.from_pd(time_series[metadata.trainval])
【问题讨论】:
【参考方案1】:您收到此错误的原因是因为trainval
不是TimeSeries
类的参数。在您分享的来自 GitHub 的示例中,metadata
是一个 pandas 时间范围,但您正在从 kpi_label
构造一个 TimeSeries
对象。
我不确定您的数据集到底是什么样的,但请尝试使用:
kpi_labels = df.trainval
改为。
【讨论】:
【参考方案2】:感谢 SalmonKiller 抽出时间来调查这个问题。 github 中使用的数据集具有非常奇怪的数据结构,因此我必须创建列 trainval 并将元数据设置为列 df[['trainval']]。我创建的单变量没有用。问题在于索引。在我将时间戳列设置为索引后,问题就解决了。
这是现在运行良好的代码。
import os
import numpy as np
import pandas as pd
from merlion.models.forecast.smoother import MSESConfig, MSES
from merlion.transform.resample import TemporalResample
from merlion.utils import TimeSeries
df = pd.read_csv(r'<file.csv>')
df['ts'] = pd.to_datetime(df['ts'])
df.set_index('ts', inplace=True)
df.sort_values('ts', inplace=True)
hours = pd.date_range(start=df.index[0], end=df.index[-1], freq='H')
mean = df.saps_total.mean()
df = df.reindex(hours, fill_value=mean)
trainval = []
for i in range(len(df)):
if i <= (round((len(df)*0.75),0)):
trainval.append(True)
else:
trainval.append(False)
df['trainval'] = trainval
df = df.drop(columns=['wday', 'hour'])
from merlion.utils import TimeSeries
time_series = df[['saps_total']]
metadata = df[['trainval']]
train_data = TimeSeries.from_pd(time_series[metadata.trainval])
test_data = TimeSeries.from_pd(time_series[~metadata.trainval])
from merlion.models.forecast.arima import Arima, ArimaConfig
config1 = ArimaConfig(max_forecast_steps=len(time_series[~metadata.trainval].index), order=(0, 1, 0),
transform=TemporalResample(granularity="1h"))
model1 = Arima(config1)
model1.train(train_data=train_data)
test_pred, test_err = model1.forecast(time_stamps=test_data.time_stamps)
print(test_pred)
【讨论】:
以上是关于如何在使用 Salesforce-merlion 包进行时间序列预测时输入数据集的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Firebase 在 Web 上托管 Flutter?它的效果如何?