如何在使用 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 包进行时间序列预测时输入数据集的主要内容,如果未能解决你的问题,请参考以下文章

在 Avkit 中如何使用这三行代码,以及如何将音乐静音”

如何在发布管道中使用输出变量

如何在Hive&Impala中使用UDF

如何使用 Firebase 在 Web 上托管 Flutter?它的效果如何?

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何在android中使用WCF服务?