如何使用dask有效地并行化时间序列预测?

时间:2018-03-21 21:41:22

标签: python parallel-processing time-series forecasting dask

我正在尝试使用dask在python中并行化时间序列预测。数据的格式是每个时间序列都是一列,并且它们具有每月日期的公共索引。我有一个自定义预测函数,它返回一个具有拟合和预测值的时间序列对象。我想在数据帧的所有列(所有时间序列)中应用此函数,并返回包含所有这些序列的新数据帧以上载到数据库。 我已经通过运行代码来运行:

data = pandas_df.copy()
ddata = dd.from_pandas(data, npartitions=1)
res = ddata.map_partitions(lambda df: df.apply(forecast_func, 
    axis=0)).compute(get=dask.multiprocessing.get)

我的问题是,在Dask中有没有办法按列而不是行进行分区,因为在这个用例中我需要保持有序时间索引,使预测功能正常工作。

如果没有,我将如何重新格式化数据以允许有效的大规模预测,并仍然以我需要的格式返回数据然后推送到数据库?

example of data format

2 个答案:

答案 0 :(得分:3)

感谢您的帮助,我真的很感激。我已经使用了dask.delayed解决方案并且它运行得非常好,只需要1/3的时间就可以使用本地集群。

对于任何对我已实施的解决方案感兴趣的人:

from dask.distributed import Client, LocalCluster
import pandas as pd
import dask

cluster = LocalCluster(n_workers=3,ncores=3)
client = Client(cluster)

#get list of time series back
output = []
for i in small_df:
    forecasted_series = dask.delayed(custom_forecast_func)(small_df[i])
    output.append(forecasted_series)

total = dask.delayed(output).compute()

#combine list of series into 1 dataframe
full_df = pd.concat(total,ignore_index=False,keys=small_df.columns,names=['time_series_names','Date'])
final_df = full_df.to_frame().reset_index()
final_df.columns = ['time_series_names','Date','value_variable']
final_df.head()

这为您提供了融化的数据框结构,因此如果您希望系列成为列,您可以使用

进行转换。
pivoted_df = final_df.pivot(index='Date', columns='time_series_names', values='value_variable')

small_df is in this format in pandas dataframe with Date being the index

答案 1 :(得分:1)

Dask数据帧仅按行分区数据。请参阅Dask dataframe documentation

然而,

Dask array可以沿任何维度进行分区。你有使用Numpy语义而不是Pandas语义。

您可以使用dask delayedfutures执行任何操作。在更通用的教程中给出的parallel computing example可能会给你一些想法。