前期,我们简单介绍过关于Polars的相关情况,详见Polars库:数据分析的新星,性能与易用性的完美结合。本期,我们通过具体的例子来对比一下Pandas和Polars这两个Python库,来见识一下Polars的强大。一、测试数据生成代码首先,我用python构建了一个1千万行的数据集(csv文件大概接近900M),具体代码为:
import pandas as pdimport polars as plimport numpy as np def create_dataframe(n_rows, library): if library == 'pandas': data = { 'name': np.random.choice(['Alice', 'Bob', 'Charlie', 'David', 'Eva'], n_rows), 'age': np.random.randint(18, 65, size=n_rows), 'city': np.random.choice(['New York', 'San Francisco', 'Los Angeles'], n_rows), 'income': np.random.normal(50000, 10000, size=n_rows), 'gender': np.random.choice(['Male', 'Female'], n_rows), 'is_married': np.random.choice([True, False], n_rows), 'children': np.random.randint(0, 5, size=n_rows), 'zip_code': np.random.randint(10000, 99999, size=n_rows), 'interest_rate': np.random.uniform(0, 0.1, size=n_rows), 'is_default': np.random.choice([True, False], n_rows) } return pd.DataFrame(data) elif library == 'polars': data = { 'name': np.random.choice(['Alice', 'Bob', 'Charlie', 'David', 'Eva'], n_rows).astype('str'), 'age': np.random.randint(18, 65, size=n_rows).astype('int'), 'city': np.random.choice(['New York', 'San Francisco', 'Los Angeles'], n_rows).astype('str'), 'income': np.random.normal(50000, 10000, size=n_rows).astype('float'), 'gender': np.random.choice(['Male', 'Female'], n_rows).astype('str'), 'is_married': np.random.choice([True, False], n_rows).astype('bool'), 'children': np.random.randint(0, 5, size=n_rows).astype('int'), 'zip_code': np.random.randint(10000, 99999, size=n_rows).astype('str'), 'interest_rate': np.random.uniform(0, 0.1, size=n_rows).astype('float'), 'is_default': np.random.choice([True, False], n_rows).astype('bool') } return pl.DataFrame(data)
二、测试生成数据能力1. Pandas
%%timedata1=create_dataframe(10000000,'pandas')
Wall time: 9.65 s
2. Polars
%%timedata2=create_dataframe(10000000,'polars')
Wall time: 24.2 s
在生成数据能力方面,Pandas的数据生成速度要快于Polars。
三、测试保存、读取、筛选、分类、排序能力
1. 保存数据对比(to_csv)
%%time#pandasdata1.to_csv('1.csv')
Wall time: 52 s
%%time#polarsdata2.write_csv('2.csv')
Wall time: 6.64 s2. 读取数据对比(read_csv)
%%time#pandasdatar1=pd.read_csv('1.csv')
Wall time: 7.5 s
%%time#polarsdatar1=pl.read_csv('1.csv')
Wall time: 1.63 s
3. 筛选数据对比(Filter)
%%time#pandasdata1[data1['name']=='Eva']
Wall time: 5.25 s
%%time#polarsdatar1.filter(pl.col('name')=='Eva')
Wall time: 1.4 s
4. 分类对比(Groupby)
%%time#pandasdata1.groupby('name').apply(lambda x:x[:])
Wall time: 14.4 s
%%time#polarsdatar1.group_by('name').apply(lambda x:x[:])
Wall time: 5.49 s
5. 排序对比(Sort)
%%time#pandasdata1.sort_values(by="name",ascending=True)
Wall time: 20.1 s
%%time#polarsdatar1.sort(by="name",descending=False)
Wall time: 1.7 s
综上,我们可以看到在保存、读取、筛选、分类、排序这5项能力对比中,Polars的速度都远超Pandas,迅如闪电。
四、Matplotlib画图对比一下
import matplotlib.pyplot as pltimport numpy as np # 两组数据pandas1 = [9.65, 52, 7.5, 5.25,14.4,20.1]polars1 = [24.2, 6.64, 1.63, 1.4,5.49,1.7] # 通用 x 轴位置x_positions = np.arange(len(pandas1)) # 增加柱状图宽度以区分数据组bar_width = 0.35 # 创建图表和轴fig, ax = plt.subplots(figsize=(10, 6)) # 绘制第一组数据的柱状图ax.bar(x_positions, pandas1, bar_width, label='Pandas', color='g', edgecolor='black') # 绘制第二组数据的柱状图,稍微向右偏移ax.bar(x_positions+ bar_width,polars1, bar_width, label='Polars', color='r', edgecolor='black') # 设置 x 轴标签ax.set_xticks(x_positions + bar_width / 2)ax.set_xticklabels(['Create', 'Save', 'Read', 'Filter','Groupby','Sort']) # 设置 y 轴标签和标题ax.set_xlabel('Items')ax.set_ylabel('Time(s)')ax.set_title('Pandas vs Polars') # 显示图例ax.legend() # 显示图表plt.show()
五、结语综上,在Python数据处理领域,虽然Pandas因其易用性和灵活性,在数据探索和原型设计阶段仍然非常受欢迎,但Polars凭借其出色的性能、高效的内存使用和强大的并行处理能力,在处理大规模数据集方面展现出了明显的优势。因此,对于需要处理大量数据的应用场景,Polars是一个值得考虑的选择。