【发布时间】:2014-12-23 19:09:58
【问题描述】:
我正在尝试计算股票回报数据中连续上升的天数;因此,如果正数为 1,负数为 0,则列表 y=[0,0,1,1,1,0,0,1,0,1,1] 应返回 z=[0,0,1,2,3,0,0,1,0,1,2]。
我找到了一个只有几行代码但非常很慢的解决方案:
import pandas
y = pandas.Series([0,0,1,1,1,0,0,1,0,1,1])
def f(x):
return reduce(lambda a,b:reduce((a+b)*b,x)
z = pandas.expanding_apply(y,f)
我猜我循环整个列表y 太多次了。有没有一种很好的 Pythonic 方式来实现我想要的,而只浏览一次数据?我可以自己写一个循环,但想知道是否有更好的方法。
【问题讨论】:
-
你真的想要一个 pandas 解决方案吗?
-
对于原生 Pyton vs pandas 的性能,pandas 优化了
pd.Series.diff(),cumcount(),cumsum()等。比原生 Python 更快,尤其是。慢迭代的东西,比如reduce()