Vaex/Pandas加载转换大数据时的精准进度条实现需求
为Vaex/Pandas大数据操作添加进度条(类似%time的无循环实现)
你需要为Vaex加载大数据、Pandas转换大数据的操作添加进度条以查看剩余时间,且希望像%time一样简便,无需冗余循环。之前用progress.bar的方案无效,进度条无法真正监控操作内部进度,甚至操作完成后仍异常运行。
解决方案
Vaex 内置进度条
Vaex原生支持进度条,无需额外依赖,启用后所有耗时操作都会自动显示进度和剩余时间:
import vaex # 开启全局进度条 vaex.settings.progressbar.enabled = True # 直接执行加载/转换操作,进度条自动生效 df_vaex = vaex.open("large_dataset.hdf5") df_filtered = df_vaex[df_vaex["tolls_amount"] > 50]
Pandas 进度条实现
Pandas本身无内置进度条,可通过以下两种方式实现:
方式1:用tqdm监控操作
tqdm提供Pandas集成,能近似显示进度(部分底层C实现的操作无法实时更新,但结束后会准确完成):
from tqdm import tqdm import pandas as pd # 注册Pandas监控 tqdm.pandas() # 单条操作的进度条实现 with tqdm(total=1, desc="Processing") as pbar: sample_tolls_amount = df_panda_tolls.sample(n=4999) pbar.update(1) # 对支持apply的操作,可直接用progress_apply实现实时进度 # df["calculated_col"] = df["original_col"].progress_apply(lambda x: x * 1.5)
方式2:用Dask替代Pandas(推荐大数据场景)
Dask是并行计算框架,语法与Pandas几乎一致,天然支持进度条,适合处理超内存的大数据:
from dask.dataframe import read_csv from dask.diagnostics import ProgressBar # 读取大数据集 ddf = read_csv("large_tolls_data.csv") # 启用进度条执行操作 with ProgressBar(): sample_tolls_amount = ddf.sample(n=4999).compute() # 其他转换操作同理 df_transformed = ddf[ddf["tolls_amount"] > 20].compute()
原测试代码无效原因
你使用progress.bar.Bar的方式只是在操作前后手动更新进度条,并没有真正Hook到Pandas操作的内部执行流程。Pandas的sample等核心操作是底层C实现的一次性任务,中间没有进度回调,导致进度条直接跳满,无法反映真实进度和剩余时间。
内容的提问来源于stack exchange,提问作者José Miguel Rego Terol
相关产品推荐
相关产品推荐

