如何向量化加速Pandas iterrows?解决apply前序索引使用困惑
优化Pandas股票涨跌幅计算代码的方案
你现在用iterrows()逐行循环的方式效率极低,尤其是数据量大的时候,完全没必要这么做。Pandas提供了向量化操作的能力,用shift()函数就能轻松替代循环,速度提升几个量级都不是问题。
核心逻辑很简单:shift(n)会把Adj_Close列的数据整体向下移动n行,这样当前行的值除以shift(n)后的值,再减1,就是你要的n周期涨跌幅,全程不需要循环。
直接替换成下面的代码就行:
# 用向量化操作计算各周期涨跌幅 data['1_Day_%_Change'] = (data['Adj_Close'] / data['Adj_Close'].shift(1)) - 1 data['5_Day_%_Change'] = (data['Adj_Close'] / data['Adj_Close'].shift(5)) - 1 data['1_Month_%_Change'] = (data['Adj_Close'] / data['Adj_Close'].shift(21)) - 1 data['6_Month_%_Change'] = (data['Adj_Close'] / data['Adj_Close'].shift(151)) - 1 data['1_Year_%_Change'] = (data['Adj_Close'] / data['Adj_Close'].shift(252)) - 1
为什么这方法更快?
- Pandas的向量化操作是底层基于C实现的,避开了Python循环的开销,数据量越大,对比
iterrows()的速度差距越明显。 - 原来的循环里每次都要做索引查找、
at赋值,这些都是非常耗时的Python层面操作,现在一行代码搞定一个周期,简洁高效。 shift()会自动处理开头的行(比如第0行用shift(1)后会得到NaN),不需要你手动判断索引是否为0,后续可以根据需求用fillna()填充缺失值,或者直接保留。
内容的提问来源于stack exchange,提问作者Matthew Rozanoff
相关产品推荐
相关产品推荐

