Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dask pct_变更_Dask_Dask Dataframe - Fatal编程技术网

Dask pct_变更

Dask pct_变更,dask,dask-dataframe,Dask,Dask Dataframe,我刚到达斯克。我有一个带有大小为appox的排序日期时间索引的熊猫df。3000万行。我正试图在达斯克进行这项熊猫行动(公元前,熊猫的分组成本很高) 换句话说,按tic对数据进行分组,然后找出连续(时段=1)的价格变化,其在时间上是单调递增的(因为该指数是一个排序的DateTimeIndex)。我的dask代码是: import dask from dask.distributed import Client,progress import dask.dataframe as dd clien

我刚到达斯克。我有一个带有大小为appox的排序日期时间索引的熊猫df。3000万行。我正试图在达斯克进行这项熊猫行动(公元前,熊猫的分组成本很高)

换句话说,按
tic
对数据进行分组,然后找出连续(时段=1)的价格变化,其在时间上是单调递增的(因为该指数是一个排序的DateTimeIndex)。我的dask代码是:

import dask
from dask.distributed import Client,progress
import dask.dataframe as dd

client = Client(n_workers=4, threads_per_worker=2, memory_limit='8GB')

df = dd.from_pandas(df0, npartitions=10)
df = df.persist()

df.groupby('tic', dropna=True).close.pct_change(1)
但是,我得到以下错误:

AttributeError: 'SeriesGroupBy' object has no attribute 'pct_change'
我不明白。我认为pct\U更改是一个串联函数

我知道
df.groupby(columns\u no\u index).apply(user\u fn)
需要洗牌,但是
df.groupby(columns\u with\u index.apply(user\u fn))
要快得多。因此,这种聚合是有效的

dask_job = df0 \
    .set_index('tic')\
    .pipe(dd.from_pandas, npartitions=20)\
    .groupby(['tic']) \
    .apply(lambda x: x.close.pct_change(1)) 
但是,上面返回的多索引带有
tic
作为level1和level2的索引,而我们关心的是DateTimeIndex是第二个索引(例如level1=tic,level2=DateTimeIndex,level3=precent\u change)


如下面的评论所述,如果我尝试编写自己的
pct\u更改
,如

df.groupby('tic',dropna=True).close.transform(lambda x: x.diff(1)/x, meta=('close_pct_change', 'f8')) 
我得到以下错误:

AttributeError: 'SeriesGroupBy' object has no attribute 'pct_change'
ValueError:长度不匹配:预期轴有183100个元素,新值有183921个元素


我不清楚为什么

根据您的评论,这只是一个间接的解决方案,但应该可以:

  • 根据
    tic
    将大型
    .gz
    文件拆分为一组文件
  • 使用基于
    tic
    的文件,您现在可以拥有一个加载文件并在其上运行的函数
  • 将函数包装为delayed
  • 粗略的例子:

    来自dask的
    导入延迟
    @耽搁
    def进程文件(到文件的路径):
    df=pd.read_csv(路径到文件)#拼花地板可能更好,但这并不重要
    df['close\u pct\u change']=df.groupby('tic').close.pct\u change(periods=1.dropna()
    返回df
    结果=dask.compute([为文件列表中的f处理文件(f)])
    
    我发现这是可行的

    df = dd.from_pandas(df0, npartitions=200)
    df = df.persist()
    
    df = df.groupby('tic').apply(lambda x: x.assign(close_pct_change=(x.close.diff(1)/x.close)*100))
    df  = df.compute().droplevel('tic')
    

    我想使用dask bc,数据集大约有3000万行。是的,分区在
    tic
    中是可分离的。我会调查一下延迟的
    。谢谢你的建议。它是一个.gz文件,但是多个文件实际上会更方便。但是这些文件将基于日期,而不是基于tic。也就是说,在我看到的特定日期范围内,每个文件都有所有的
    tics
    。我问的原因是,当
    dask.dataframe
    执行
    groupby
    时,它将不得不对数据进行洗牌,这是非常昂贵的。明白。。如果我将tic作为索引(如上面的
    dask_作业
    code),groupby似乎可以工作,但缺少日期索引,结果是一个多索引,级别1和级别2都是
    tic
    让我们来看看。尽管我可以看到解决方案,但我担心将数据导入tic级别文件的ETL并不干净。数据是timeseries,因此如果将gz文件拆分为一个选项,那么将其拆分为日期将更加干净,因为如果我尝试编写自己的
    pct_change
    ,如
    df.groupby('tic',dropna=True)。close.transform(lambda x:x.diff(1)/x,meta=('close\u pct_change',f8'),我们可以将每天的数据写入光盘并运行dask作业
    我得到以下错误:
    值错误:长度不匹配:预期轴有183100个元素,新值有183921个元素
    我不清楚原因