弄清楚如何定义一个并行运行的自定义(时间折叠)函数并返回具有不同形状的数据框

时间:2018-06-28 09:14:09

标签: pandas dataframe dask dask-distributed dask-delayed

我正在尝试实现一个时间折叠功能,以将其“映射”到dask数据框的各个分区,从而依次更改所讨论的数据框的形状(或生成形状已更改的新数据框)。这就是我所走的路。计算返回的结果“ res”是3个延迟对象的列表。当我尝试在一个循环(最后两行代码)中计算它们的每一个时,会导致“ TypeError:'DataFrame'对象不可调用” ,经过examples for map_partitions之后,我还尝试了更改函数中的输入DF(就地),而没有返回值,这会导致与NoneType相似的TypeError。我想念什么?

另外,看着visualization (attached),我觉得有必要将单独计算(折叠)的分区减少到单个DF中。我该怎么做?

#! /usr/bin/env python

# Start dask scheduler and workers
# dask-scheduler &
# dask-worker --nthreads 1 --nprocs 6 --memory-limit 3GB localhost:8786 --local-directory /dev/shm &

from dask.distributed import Client
from dask.delayed import delayed
import pandas as pd
import numpy as np
import dask.dataframe as dd
import math

foldbucketsecs=30
periodicitysecs=15
secsinday=24 * 60 * 60
chunksizesecs=60 # 1 minute
numts = 5
start = 1525132800 # 01/05
end = 1525132800 + (3 * 60) # 3 minute

c = Client('127.0.0.1:8786')

def fold(df, start, bucket):
    return df

def reduce_folds(df):
    return df

def load(epoch):
    idx = []
    for ts in range(0, chunksizesecs, periodicitysecs):
        idx.append(epoch + ts)
    d = np.random.rand(chunksizesecs/periodicitysecs, numts)
    ts = []
    for i in range(0, numts):
        tsname = "ts_%s" % (i)
        ts.append(tsname)
        gts.append(tsname)
    res = pd.DataFrame(index=idx, data=d, columns=ts, dtype=np.float64)
    res.index = pd.to_datetime(arg=res.index, unit='s')
    return res

gts = []
load(start)
cols = len(gts)

idx1 = pd.DatetimeIndex(start=start, freq=('%sS' % periodicitysecs), end=start+periodicitysecs, dtype='datetime64[s]')
meta = pd.DataFrame(index=idx1[:0], data=[], columns=gts, dtype=np.float64)
dfs = [delayed(load)(fn) for fn in range(start, end, chunksizesecs)]

from_delayed = dd.from_delayed(dfs, meta, 'sorted')

nfolds = int(math.ceil((end - start)/foldbucketsecs))
cprime = nfolds * cols

gtsnew = []

for i in range(0, cprime):
    gtsnew.append("ts_%s,fold=%s" % (i%cols, i/cols))

idx2 = pd.DatetimeIndex(start=start, freq=('%sS' % periodicitysecs), end=start+foldbucketsecs, dtype='datetime64[s]')
meta = pd.DataFrame(index=idx2[:0], data=[], columns=gtsnew, dtype=np.float64)
folded_df = from_delayed.map_partitions(delayed(fold)(from_delayed, start, foldbucketsecs), meta=meta)
result = c.submit(reduce_folds, folded_df)

c.gather(result).visualize(filename='/usr/share/nginx/html/svg/df4.svg')

res = c.gather(result).compute()

for f in res:
    f.compute()

1 个答案:

答案 0 :(得分:0)

没关系!这是我的错,没有像延迟那样包装我的函数,我只是像这样将其传递给map_partitions调用,它就起作用了。

folded_df = from_delayed.map_partitions(fold, start, foldbucketsecs, nfolds, meta=meta)