python - 需要计算数据框列时使用 dask 进行并行计算
问题描述
我有一个 3.6 亿记录的观鸟数据数据
框,我想以分布式方式
计算每种鸟类的质心作为年日的函数。dask
我想要做:
df2 = df.groupby(['VERNACULARNAME', 'yearday']).mean()
但我需要先计算yearday
,我不知道是否有办法使用dask
. 我希望 dask 可能只是将新数据保留给dask
工作人员,但是当我尝试时:
def yearday(r):
r['yearday'] = dt.datetime(r['YEAR'], r['MONTH'], r['DAY']).timetuple().tm_yday
return r
df.apply(yearday, axis=1).persist()
它不能扩展。
如果有人想实际尝试,可以像这样加载数据:
import dask.dataframe as dd
df = dd.read_parquet('s3://esipfed/ebird/EOD_CLO_2016.parq.gz',
storage_options={'anon': True, 'use_ssl': False})
注意:虽然我称这个数据集EOD_CLO_2016.parq.gz
为,但它被分块在 S3 存储桶中的许多对象上以促进并行化。每个块都被压缩。
有没有办法以分布式方式即时进行计算,或者我需要在使用 yearday 列之前编写另一个数据文件groupby
来执行可扩展部分?
解决方案
按照您在笔记本上所做的操作,我将通过groupby
以下方式修改之前的步骤
df = dd.read_parquet('s3://esipfed/ebird/EOD_CLO_2016.parq.gz',
columns=['YEAR', 'MONTH', 'DAY', 'DECIMALLATITUDE',
'DECIMALLONGITUDE', 'VERNACULARNAME'],
storage_options={'anon': True, 'use_ssl': False})
df = df.map_partitions(lambda df: df.assign(yearday=pd.to_datetime(df[['YEAR', 'MONTH', 'DAY']]).dt.dayofyear,
lat=np.deg2rad(df['DECIMALLATITUDE'].values),
lon=np.deg2rad(df['DECIMALLONGITUDE'].values)),
meta={'YEAR':'i8', 'MONTH':'i8', 'DAY':'i8',
'DECIMALLATITUDE':'f8','DECIMALLONGITUDE':'f8',
'VERNACULARNAME':'object',
'yearday':'i8', 'lat':'f8', 'lon':'f8'})
df = df.map_partitions(lambda df :df.assign(x=np.cos(df['lat'].values) * np.cos(df['lon'].values),
y=np.cos(df['lat'].values) * np.sin(df['lon'].values),
z=np.sin(df['lat'].values)),
meta={'YEAR':'i8', 'MONTH':'i8', 'DAY':'i8',
'DECIMALLATITUDE':'f8','DECIMALLONGITUDE':'f8',
'VERNACULARNAME':'object',
'yearday':'i8', 'lat':'f8', 'lon':'f8',
'x':'f8', 'y':'f8', 'z':'f8'})
更新:我不确定将您的数据存储为单个压缩文件而不是多个文件是否是个好主意。你考虑过不同的选择吗?
更新 2:鉴于从度到弧度的转换是线性的,您可以计算lon, lat
,然后x,y,z
在groupby
.
推荐阅读
- ios - Swift 4.1 支持 sqlite INSERT..ON CONFLICT..DO UPDATE 吗?
- mysql - 将mysql列转置为行
- rust - 在 Rust 中初始化 DST 的大小成员(在堆上)
- java - 持久化不识别实体类
- javascript - 如何在类/对象中使用 $.each()
- c - GCC 无法在 Linux 中编译
- blazor - 所有的wasm速度都一样吗?
- visual-studio-code - 在编辑器/标题菜单中使用内置的 Octicons 用于 vscode 扩展命令贡献点
- docker - docker login error 登录:帐户未激活。关系存储库
- delphi - 像任务管理器一样始终处于领先地位