cuDF(https://github.com/rapidsai/cudf)是一个基于Python的GPU DataFrame库,用于处理数据,包括加载、连接、聚合和过滤数据。向GPU的转移允许大规模的加速,因为GPU比CPU拥有更多的内核。

笔者觉得,对于我来说一个比较好的使用场景是,代替并行,在pandas处理比较慢的时候,切换到cuDF,就不用写繁琐的并行了。


官方文档:
1 Docs » API Reference
2 rapidsai/cudf

相关参考:

nvidia-rapids︱cuDF与pandas一样的DataFrame库
NVIDIA的python-GPU算法生态 ︱ RAPIDS 0.10
nvidia-rapids︱cuML机器学习加速库
nvidia-rapids︱cuGraph(NetworkX-like)关系图模型


文章目录

  • 1 cuDF背景与安装
    • 1.1 背景
    • 1.2 安装
  • 2 一些demo
    • 2.1 新建dataframe
    • 2.2 pandas 与 cuDF切换
    • 2.3 选中某行列
    • 2.4 apply_rows和apply_chunks
    • 2.5 groupby

1 cuDF背景与安装

1.1 背景

cuDF在过去一年中的发展速度非常之快。每个版本都加入了令人兴奋的新功能、优化和错误修复。0.10版本也不例外。cuDF 0.10版本的一些新功能包括 groupby.quantile()、Series.isin()、从远程/云文件系统(例如hdfs、gcs、s3)读取、Series和DataFrame isna()、按分组功能中的任意长度Series分组 、Series 协方差和Pearson相关性以及从DataFrame / Series .values 属性返回 CuPy数组。此外,apply UDF函数API经过了优化,并且加入了通过.iloc访问器的收集和散播方法。

除了提供所有上述出色的功能、优化和错误修复之外,cuDF 0.10版本还花费大量的精力构建未来。该版本将cuStrings存储库合并到cuDF中,并为合并两个代码库做好了准备,使字符串功能能够被更紧密地集成到cuDF中,以此提供更快的加速和更多的功能。此外,RAPIDS添加了cuStreamz元数据包,因此可以使用cuDF和Streamz库简化GPU加速流处理。cuDF继续改进其Pandas API兼容性和Dask DataFrame互操作性,使我们的用户可以最大程度地无缝使用cuDF。

在幕后,libcudf的内部架构正在经历一次重大的重新设计。0.10版本加入了最新的cudf :: column和cudf :: table类,这些类大大提高了内存所有权控制的强健性,并为将来支持可变大小数据类型(包括字符串列、数组和结构)奠定了基础。由于已构建对整个libcudf API中的新类的支持,这项工作将在下一个版本周期中继续进行。此外,libcudf 0.10添加了许多新的API和算法,包括基于排序、支持空数据的分组功能、分组功能分位数和中位数、cudf :: unique_count,cudf :: repeat、cudf :: scatter_to_tables等。与以往一样,此版本还包括许多其他改进和修复。

RAPIDS内存管理器库RMM也正在进行一系列重组。这次重组包括一个基于内存资源的新架构,该架构与C ++ 17 std :: pmr :: memory_resource大多兼容。这使该库更容易在公共接口之后添加新类型的内存分配器。0.10还用Cython取代了CFFI Python绑定,从而使C ++异常可以传播到Python异常,使更多可调整的错误被传递给应用程序。下一个版本将继续提高RMM中的异常支持。

最后,你会注意到cuDF在这个版本中速度有了显著提升,包括join(最多11倍)、gather和scatter on tables(速度也快2-3倍)的大幅性能改进,以及更多如图5所示的内容。

图5:单个NVIDIA Tesla V100(立即免费试用) GPU与双路Intel Xeon E5–2698 v4 CPU(20核)上的cuDF vs Pandas加速

1.2 安装

有conda可以直接安装,也可以使用docker,参考:https://github.com/rapidsai/cudf

conda版本,cudf version == 0.10

# for CUDA 9.2
conda install -c rapidsai -c nvidia -c numba -c conda-forge \cudf=0.10 python=3.6 cudatoolkit=9.2# or, for CUDA 10.0
conda install -c rapidsai -c nvidia -c numba -c conda-forge \cudf=0.10 python=3.6 cudatoolkit=10.0# or, for CUDA 10.1
conda install -c rapidsai -c nvidia -c numba -c conda-forge \cudf=0.10 python=3.6 cudatoolkit=10.1

docker版本,可参考:https://rapids.ai/start.html#prerequisites

docker pull rapidsai/rapidsai:cuda10.1-runtime-ubuntu16.04-py3.7
docker run --gpus all --rm -it -p 8888:8888 -p 8787:8787 -p 8786:8786 \rapidsai/rapidsai:cuda10.1-runtime-ubuntu16.04-py3.7

2 一些demo

2.1 新建dataframe

import cudf
import numpy as np
from datetime import datetime, timedeltat0 = datetime.strptime('2018-10-07 12:00:00', '%Y-%m-%d %H:%M:%S')
n = 5
df = cudf.DataFrame({'id': np.arange(n),'datetimes': np.array([(t0+ timedelta(seconds=x)) for x in range(n)])
})
df

Build DataFrame via list of rows as tuples:

>>> import cudf
>>> df = cudf.DataFrame([(5, "cats", "jump", np.nan),(2, "dogs", "dig", 7.5),(3, "cows", "moo", -2.1, "occasionally"),
])
>>> df
0     1     2     3             4
0  5  cats  jump  null          None
1  2  dogs   dig   7.5          None
2  3  cows   moo  -2.1  occasionally

2.2 pandas 与 cuDF切换

pandas到 cuDF

>>> import pandas as pd
>>> import cudf
>>> pdf = pd.DataFrame({'a': [0, 1, 2, 3],'b': [0.1, 0.2, None, 0.3]})
>>> df = cudf.from_pandas(pdf)
>>> dfa b
0 0 0.1
1 1 0.2
2 2 nan
3 3 0.3

cuDF 到pandas

>>> import cudf
>>> gdf = cudf.DataFrame({'a': [1, 2, None], 'b': [3, None, 5]})
>>> gdf.fillna(4).to_pandas()
a  b
0  1  3
1  2  4
2  4  5
>>> gdf.fillna({'a': 3, 'b': 4}).to_pandas()
a  b
0  1  3
1  2  4
2  3  5

2.3 选中某行列

df = cudf.DataFrame({'a': list(range(20)),'b': list(range(20)),'c': list(range(20))})
df

df.iloc[1]a    1
b    1
c    1
Name: 1, dtype: int64

2.4 apply_rows和apply_chunks

apply_rows

import cudf
import numpy as np
from numba import cudadf = cudf.DataFrame()
df['in1'] = np.arange(1000, dtype=np.float64)def kernel(in1, out):for i, x in enumerate(in1):print('tid:', cuda.threadIdx.x, 'bid:', cuda.blockIdx.x,'array size:', in1.size, 'block threads:', cuda.blockDim.x)out[i] = x * 2.0outdf = df.apply_rows(kernel,incols=['in1'],outcols=dict(out=np.float64),kwargs=dict())print(outdf['in1'].sum()*2.0)
print(outdf['out'].sum())>>> 999000.0
>>> 999000.0

apply_chunks

import cudf
import numpy as np
from numba import cudadf = cudf.DataFrame()
df['in1'] = np.arange(100, dtype=np.float64)def kernel(in1, out):print('tid:', cuda.threadIdx.x, 'bid:', cuda.blockIdx.x,'array size:', in1.size, 'block threads:', cuda.blockDim.x)for i in range(cuda.threadIdx.x, in1.size, cuda.blockDim.x):out[i] = in1[i] * 2.0outdf = df.apply_chunks(kernel,incols=['in1'],outcols=dict(out=np.float64),kwargs=dict(),chunks=16,tpb=8)print(outdf['in1'].sum()*2.0)
print(outdf['out'].sum())>>> 9900.0
>>> 9900.0

2.5 groupby

from cudf import DataFrame
df = DataFrame()
df['key'] = [0, 0, 1, 1, 2, 2, 2]
df['val'] = [0, 1, 2, 3, 4, 5, 6]
groups = df.groupby(['key'], method='cudf')# Define a function to apply to each row in a group
def mult(df):df['out'] = df['key'] * df['val']return dfresult = groups.apply(mult)
print(result)

输出:

   key  val  out
0    0    0    0
1    0    1    0
2    1    2    2
3    1    3    3
4    2    4    8
5    2    5   10
6    2    6   12

之后,用到的时候再追加。。

nvidia-rapids︱cuDF与pandas一样的DataFrame库相关推荐

  1. pandas自定义设置dataframe每个索引的标签、自定义设置索引的列名称(customize index name and index label)

    pandas自定义设置dataframe每个索引的标签.自定义设置索引的列名称(customize index name and index label) 目录

  2. pandas任取dataframe中的一个或者多个数据行(head、tail、loc、iloc),将抽取到的一个或者多个数据行复制N次形成新的dataframe

    pandas任取dataframe中的一个或者多个数据行(head.tail.loc.iloc),将抽取到的一个或者多个数据行复制N次形成新的dataframe 目录

  3. pandas移除dataframe字符串数据列中的前N个字符(remove the first n characters from values from column of dataframe)

    pandas移除dataframe字符串数据列中的前N个字符(remove the first n characters from values from str column of datafram ...

  4. pandas移除dataframe字符串数据列中的后N个字符(remove the last n characters from values from column of dataframe)

    pandas移除dataframe字符串数据列中的后N个字符(remove the last n characters from values from column of dataframe) 目录 ...

  5. pandas生成新的累积连乘数据列(cumprod)、pandas生成新的累积连乘cumprod数据列(数据列中包含NaN的情况)、pandas计算整个dataframe的所有数据列的累积连乘

    pandas生成新的累积连乘数据列(cumprod).pandas生成新的累积连乘cumprod数据列(数据列中包含NaN的情况).pandas计算整个dataframe的所有数据列的累积连乘cump ...

  6. pandas生成新的累加数据列、pandas生成新的累加数据列(数据列中包含NaN的情况)、pandas计算整个dataframe的所有数据列的累加

    pandas生成新的累加数据列.pandas生成新的累加数据列(数据列中包含NaN的情况).pandas计算整个dataframe的所有数据列的累加 目录

  7. Pandas批量删除dataframe列名中的后缀实战:使用rstrip函数批量删除列名中的后缀(suffix)、使用replace函数批量删除列名中的后缀(suffix)

    Pandas批量删除dataframe列名中的后缀实战:使用rstrip函数批量删除列名中的后缀(suffix).使用replace函数批量删除列名中的后缀(suffix) 目录

  8. Pandas批量删除dataframe列名中的前缀实战:使用lstrip函数批量删除列名中的前缀(prefix)、使用replace函数批量删除列名中的前缀(prefix)

    Pandas批量删除dataframe列名中的前缀实战:使用lstrip函数批量删除列名中的前缀(prefix).使用replace函数批量删除列名中的前缀(prefix) 目录

  9. pandas怎么选取dataframe中几列

    pandas怎么选取dataframe中几列 我用的方法是: df[['a','b,'c'']] 注意括号的嵌套. https://zhidao.baidu.com/question/19299765 ...

最新文章

  1. python3.7和3.8的区别-Python2.7和3.7区别
  2. Visual Studio Code 中文设置教程
  3. Windows下使用MinGw和gcc构建第一个C程序、g++构建第一个C++程序
  4. python_易忘的简单知识点总结
  5. 微型计算机,单片机和单板机是,9、微型计算机、单片机和单板机是()
  6. html页面之间传参乱码,急求教,在两个htm页面传参数时中文出现了乱码,试了网上的方法不管用。_html/css_WEB-ITnose...
  7. 勇敢一次_开放网络需要勇敢的新英雄吗?
  8. RxJava Map操作详解
  9. how-to-set-java_home-environment-variable-on-mac-os-x
  10. java ee 思维导图
  11. 计算机故障升温降温法,电脑故障排除1000例
  12. shiro原理_Shiro-实战(二)-身份认证
  13. idea-svn文件名字浅蓝色(蓝绿色)含义
  14. 黎曼的zeta函数(1)
  15. 群晖docker签到京豆_在docker中建立一个自动签到站点
  16. 鸥玛软件在深交所创业板挂牌上市,系山东大学间接控股企业
  17. Nature综述:宏基因组测序研究耐药基因的方法和资源
  18. CircuitJS 好玩实用电路仿真软件
  19. 2019年互联网行业进入寒冬?Java程序猿该怎么样适应?
  20. 3.3.Polynomial_add 一元多项式相加

热门文章

  1. Python开发环境Linux配置
  2. HDU_2156 分数矩阵
  3. JavaWeb之Servlet:Cookie 和 Session
  4. Windows 底层驱动级 Anti-Rootkit 工具 ScDetective 源代码
  5. tcpdump + mk-query-digest 分析mysql
  6. 面向对象进阶4:软件开发规范
  7. 2017 校赛 问题 B: CZJ-Superman
  8. 再谈CentOS 7程序自启动
  9. js中substr,substring,indexOf,lastIndexOf,split 的用法
  10. 笔记本系统恢复连载之十:系统恢复并不难