如何在使用 Salesforce-merlion 包进行时间序列预测时输入数据集

How to input dataset while using Salesforce-merlion package for timeseries forecasting

我已经在我的 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])

包含内部数据集的完整代码可在以下link获得: 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\forecasting786_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])

您收到此错误的原因是 trainval 不是 TimeSeries class 的参数。在您分享的 GitHub 示例中,metadata 是一个 pandas 时间范围,但您正在从 kpi_label.[=16 构建一个 TimeSeries 对象=]

我不确定您的数据集到底是什么样子,但请尝试使用:

kpi_labels = df.trainval

相反。

感谢 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)