热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

nvidiarapids︱cuDF与pandas一样的DataFrame库

cuDF(https:github.comrapidsaicudf)是一个基于Python的GPUDataFrame库,用于处理数据&#x

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


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


推荐阅读
  • 微信平台通过盛派SDK(sdk.weixin.senparc.com)允许服务号和订阅号使用appId和token读取关注用户的个人信息。然而,这一过程需严格遵守隐私保护和数据安全的相关规定,确保用户数据的安全性和隐私性。 ... [详细]
  • 贪心策略在算法设计中的应用与优化
    贪心算法在算法设计中具有广泛的应用,特别是在解决优化问题时表现出色。本文通过分析经典问题“买卖股票的最佳时机II”,探讨了贪心策略的基本原理及其在实际问题中的应用。通过实例分析,展示了贪心算法如何通过局部最优选择逐步达到全局最优解,并讨论了其在时间和空间复杂度上的优势。此外,还提出了一些优化方法,以提高算法的效率和适用性。 ... [详细]
  • 在处理大数相加的问题时,有许多方法可以借鉴。本文介绍了两种不同的函数式编程方法:一种是从网络上找到的经典实现,另一种是作者自行设计的创新方案。通过函数式编程的方式重新实现了这两种方法,其中经典实现简洁明了,而创新方案则在性能和可读性方面有所提升。这些方法不仅适用于大数相加,还可以扩展应用于其他数值计算场景。 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 在IIS上运行的WebApi应用程序在开发环境中能够正常进行文件的读写操作。然而,在尝试通过FTP访问实时服务器上的文件列表时,遇到了无法显示的问题,尽管服务器配置与开发环境相同。这可能涉及权限设置、FTP服务配置或网络连接等方面的问题。 ... [详细]
  • 提升Android开发效率:Clean Code的最佳实践与应用
    在Android开发中,提高代码质量和开发效率是至关重要的。本文介绍了如何通过Clean Code的最佳实践来优化Android应用的开发流程。以SQLite数据库操作为例,详细探讨了如何编写高效、可维护的SQL查询语句,并将其结果封装为Java对象。通过遵循这些最佳实践,开发者可以显著提升代码的可读性和可维护性,从而加快开发速度并减少错误。 ... [详细]
  • 图论入门基础教程
    图论是计算机科学和数学中的重要分支,本教程旨在为初学者提供全面的基础知识。通过实例解析,如“昂贵的聘礼”问题,讲述了一个年轻探险家在印第安部落与酋长女儿的爱情故事,展示了图论在解决实际问题中的应用。教程内容涵盖了图的基本概念、表示方法以及常见算法,适合各类读者学习。 ... [详细]
  • 本文介绍了 Vue 开发的入门指南,重点讲解了开发环境的配置与项目的基本搭建。推荐使用 WebStorm 作为 IDE,其下载地址为 。安装时请选择适合您操作系统的版本,并通过 获取激活码。WebStorm 是前端开发者的理想选择,提供了丰富的功能和强大的代码编辑能力。 ... [详细]
  • 每日前端实战:148# 视频教程展示纯 CSS 实现按钮两侧滑入装饰元素的悬停效果
    通过点击页面右侧的“预览”按钮,您可以直接在当前页面查看效果,或点击链接进入全屏预览模式。该视频教程展示了如何使用纯 CSS 实现按钮两侧滑入装饰元素的悬停效果。视频内容具有互动性,观众可以实时调整代码并观察变化。访问以下链接体验完整效果:https://codepen.io/comehope/pen/yRyOZr。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 计算机视觉领域介绍 | 自然语言驱动的跨模态行人重识别前沿技术综述(上篇)
    本文介绍了计算机视觉领域的最新进展,特别是自然语言驱动的跨模态行人重识别技术。上篇内容详细探讨了该领域的基础理论、关键技术及当前的研究热点,为读者提供了全面的概述。 ... [详细]
  • MySQL 8.0 MGR 自动化部署与配置:DBA 和开源工具的高效解决方案
    MySQL 8.0 MGR 自动化部署与配置:DBA 和开源工具的高效解决方案 ... [详细]
  • 本文介绍了如何在 Windows 系统上利用 Docker 构建一个包含 NGINX、PHP、MySQL、Redis 和 Elasticsearch 的集成开发环境。通过详细的步骤说明,帮助开发者快速搭建和配置这一复杂的技术栈,提升开发效率和环境一致性。 ... [详细]
  • 在Kohana 3框架中,实现最优的即时消息显示方法是许多开发者关注的问题。本文将探讨如何高效、优雅地展示flash消息,包括最佳实践和技术细节,以提升用户体验和代码可维护性。 ... [详细]
  • 蓝桥杯算法实战:节点选取策略优化分析
    本文针对蓝桥杯算法竞赛中的节点选取策略进行了深入分析与优化。通过对比不同节点选择方法的效果,提出了基于贪心算法和动态规划的综合优化方案,旨在提高算法效率和准确性。实验结果表明,该优化策略在处理大规模数据集时表现出色,显著提升了算法性能。 ... [详细]
author-avatar
mobiledu2502900505
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有