专业编程基础技术教程

网站首页 > 基础教程 正文

了解Python数据分析库:如何在几秒内处理数十亿行的DataFrame?

ccvgpt 2024-10-28 13:18:02 基础教程 8 ℃

全文共1513字,预计学习时长8分钟


了解Python数据分析库:如何在几秒内处理数十亿行的DataFrame?


一切都始于NumPy。2006年,大数据这个话题逐渐引起人们关注,特别是在Hadoop问世时,Pandas DataFrames紧随其后。2014年是大数据元年,同年Apache Spark投入使用。2018年,Dask和其他用于Python数据分析的库诞生。可以看到,Python中的大数据分析正在复兴。


每个月笔者都会找到一个想学的新工具,跟上最新的技术步伐也很重要。花一两个小时看教程是值得的,从长远来看这可以节省大量时间。最近,笔者发现了一个值得了解的用于数据分析的Python库。


Python中的大数据分析正在复兴


Meet Vaex


Vaex是一个高性能的Python库,类似于Pandas,是采用延迟out-of-core DataFrames库,可以对大型表格数据集进行可视化及探索。每秒可计算超过十亿行的基本统计数据。支持多种可视化,允许对大数据进行交互式探索。


Vaex vs Dask


Vaex与Dask不同,但与Dask DataFrames类似,Dask DataFrames是建立在Pandas DataFrames基础之上的,这意味着Dask继承了Pandas的问题,例如必须将数据完全加载到RAM中才能进行处理,而Vaex并不会这样。


Vaex不会复制DataFrame,可以在主内存较少的机器上处理更大的DataFrame。Vaex和Dask都使用延迟处理。唯一的区别是Vaex会在需要的时候计算字段,而Dask则需要显式地使用compute函数。数据需要采用HDF5或Apache Arrow格式才能充分利用Vaex。


Vaex安装


安装Vaex和安装其他Python包一样简单:


pip install vaex


让我们试验一下


创建一个包含10亿行和1000列的Pandas DataFrame,以创建一个大数据文件:


importvaex
import pandas as pd
import numpy as npn_rows = 1000000
n_cols = 1000
df = pd.DataFrame(np.random.randint(0, 100, size=(n_rows, n_cols)),columns=['col%d' % i for i in range(n_cols)])df.head()


此DataFrame使用多少主内存?


df.info(memory_usage='deep')


把它保存到磁盘上,之后可以用Vaex读取。


file_path= 'big_file.csv'
df.to_csv(file_path, index=False)


直接通过Vaex读取整个CSV,这与pandas相似,我们不会有什么发现。这个过程下来笔者的笔记本电脑需要大约85秒。



我们需要将CSV转换为HDF5(分层数据格式第五版)来看看看Vaex的好处。Vaex有一个转换函数,通过转换较小的块甚至可以支持大于主内存的文件。如果由于内存限制不能用pandas打开更大的文件,可以将其转换为HDF5并用Vaex处理。


dv =vaex.from_csv(file_path, convert=True, chunk_size=5_000_000)


这个函数自动创建一个HDF5文件并将其保存到硬盘。检查一下dv类型:


type(dv)#output
vaex.hdf5.dataset.Hdf5MemoryMapped


现在,用Vaex处理7.5GB的数据集——不需要读取它,因为在上面的dv变量中已经有了它。这里只是为了测试速度。


dv =vaex.open('big_file.csv.hdf5')


Vaex只需要不到1秒的时间来执行上面的命令。但因为延迟加载,Vaex实际上并没有读取文件。让我们通过计算col1的和来读取它:


suma =dv.col1.sum()
suma# array(49486599)


因为使用了存储印象,Vaex只需要不到1秒的时间来计算总和!


绘图


在绘制数据时,Vaex速度也很快。它具有特殊的绘图功能plot1d,plot2d和plot2d_contour。


dv.plot1d(dv.col2,figsize=(14, 7))


虚拟列


Vaex在添加新列时创建一个虚拟列,这个列在即时计算时不占用主内存。


dv['col1_plus_col2']= dv.col1 + dv.col2
dv['col1_plus_col2']


高效过滤


Vaex在过滤数据时不会创建DataFrame副本,这样可以提高内存效率。


dvv =dv[dv.col1 > 90]


聚合


聚合的工作原理与Pandas略有不同,但它们的速度极快。让我们计算一个二进制列,其中col1≥50。


dv['col1_50']= dv.col1 >= 50


Vaex在一个命令中包括分组和聚合。下面的命令按“col1_50”列对数据进行分组,并计算col3列的总和。


dv_group= dv.groupby(dv['col1_50'], agg=vaex.agg.sum(dv['col3']))
dv_group


连接


Vaex连接数据而不复制内存,这样可以保存主内存。Pandas用户将熟悉join函数:


dv_join= dv.join(dv_group, on=’col1_50')


这个Python库可能你之前未听说过,但它真的值得了解。


留言点赞关注

我们一起分享AI学习与发展的干货

如转载,请后台留言,遵守转载规范

Tags:

最近发表
标签列表