如何在使用 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)
我已经在我的 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)