Python处理OWID新冠数据填充DataFrame过慢,如何去掉显式循环提升性能
问题1:不同数据格式对处理效率的影响
OWID提供的XLSX、JSON格式不会提升你的处理效率,原因如下:
- XLSX属于压缩二进制格式,读取时需要先解压再做结构解析,耗时远高于直接读取纯文本CSV
- 3D结构的JSON解析成本更高,你需要的疫情数据是扁平的二维表结构,JSON的嵌套结构反而会增加额外的格式解析开销,占用更多内存
你当前选择的CSV格式是处理这类结构化表格数据效率最高的选择,不需要更换格式。
问题2:循环填充DataFrame的性能优化方案
你原来的双层循环+逐行布尔索引的写法时间复杂度极高,每次循环都要做全表扫描,是pandas性能的典型反面案例。你可以直接用pandas内置的透视+重索引操作,完全不需要写显式循环就能实现需求,性能提升至少上千倍。
优化后代码如下:
import pandas as pd import datetime # 读取数据和日期格式转换保持不变 data = pd.read_csv("https://raw.githubusercontent.com/owid/covid-19-data/master/public/data/owid-covid-data.csv") data['date'] = pd.to_datetime(data['date']) buffer = 30 # 生成你需要的完整日期范围 full_date_range = pd.date_range(start=data['date'].min() - datetime.timedelta(buffer), end=data['date'].max()) # 直接透视生成宽表:索引为日期,列名为国家,值为对应的统计指标 cases_wide = data.pivot(index='date', columns='location', values='total_cases') deaths_wide = data.pivot(index='date', columns='location', values='total_deaths') # 重索引补全所有缺失的日期,自动对齐现有数据,缺失位置默认填充NaN cases = cases_wide.reindex(full_date_range) deaths = deaths_wide.reindex(full_date_range) # 如果你需要对缺失值做填充(比如用最近一天的有效数据补齐,适合差分计算),可以加前向填充逻辑 # cases = cases.ffill() # deaths = deaths.ffill()
这个实现的所有运算都是pandas底层C实现的向量化操作,原本20分钟的任务运行耗时不会超过10秒,结果和你原来的循环实现完全一致。
内容的提问来源于stack exchange,提问作者Pranshu
相关产品推荐
相关产品推荐

