Dask pct_变更
我刚到达斯克。我有一个带有大小为appox的排序日期时间索引的熊猫df。3000万行。我正试图在达斯克进行这项熊猫行动(公元前,熊猫的分组成本很高) 换句话说,按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
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
的文件,您现在可以拥有一个加载文件并在其上运行的函数导入延迟
@耽搁
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个元素
我不清楚原因