[英]df.groupby(...).apply(...).reset_index() in dask dataframe
[英]df.groupby(…).apply(…) function in dask dataframe
我正在使用Python dask
處理大型csv面板數據集(15 + GB),並且需要執行groupby(...).apply(...)
函數來刪除每天每一只股票的最后觀察結果。 我的數據集看起來像
stock date time spread time_diff
VOD 01-01 9:05 0.01 0:07
VOD 01-01 9:12 0.03 0:52
VOD 01-01 10:04 0.02 0:11
VOD 01-01 10:15 0.01 0:10
VOD 01-01 10:25 0.03 0:39
VOD 01-01 11:04 0.02 22:00
VOD 01-02 9:04 0.02 0:05
... ... ... .... ...
BAT 01-01 13:05 0.04 10:02
BAT 01-02 9:07 0.05 0:03
BAT 01-02 9:10 0.06 0:04
... ... ... .... ...
如果數據框位於大熊貓中,則可以通過
df_new=df_have.groupby(['stock','date'], as_index=False).apply(lambda x: x.iloc[:-1])
此代碼對pandas df效果很好。 但是,我無法在dask數據框中執行此代碼。 我做了以下嘗試。
ddf_new=ddf_have.groupby(['stock','date']).apply(lambda x: x.iloc[:-1]).compute()
要么
ddf_new=ddf_have.groupby(['stock','date']).apply(lambda x: x.iloc[:-1], meta=('stock' : 'f8')).compute()
要么
ddf_new=ddf_have.groupby(['stock','date']).apply(lambda x: x.iloc[:-1], meta=meta).compute()
不幸的是,他們都沒有工作。 誰能幫助我為dask dataframe獲取正確的代碼? 謝謝
我認為對於您的特定情況,問題在於您分配的meta
。 這應該工作。
import pandas as pd
import numpy as np
import dask.dataframe as dd
dates = pd.date_range(start='2019-01-01',
end='2019-12-31',
freq='5T')
out = []
for stock in list("abcdefgh"):
df = pd.DataFrame({"stock":[stock]*len(dates),
"date":dates,
"spread":np.random.randn(len(dates))})
df["time_diff"] = df["date"].diff().shift(-1)
df["time"] = df["date"].dt.time.astype(str)
df["date"] = df["date"].dt.date.astype(str)
out.append(df)
df = pd.concat(out, ignore_index=True)
del out
ddf = dd.from_pandas(df, npartitions=4)
out = ddf.groupby(['stock','date']).apply(lambda x: x[:-1],
meta={"stock":"str",
"date":"str",
"spread":"f8",
"time_diff":"str",
"time":"str"})
out = out.compute().reset_index(drop=True)
如果您可以按工作日很好地對文件進行分區並將其保存在to_parquet
,則可以使用map_partitions
而不是apply
來獲得更好的性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.