我正在尝试计算股票收益数据中连续上升的天数- 因此,如果正数日为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]。
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)
我猜想我遍历整个列表太多次了。是否有一种很好的Pythonic方式可以实现我想要的,而只需要遍历一次数据?我可以自己编写一个循环,但想知道是否有更好的方法。
谢谢!
为什么痴迷于超pythonic的做事方式?可读性+效率胜过“ leet hackerz风格”。
我只是这样做:
a = [0,0,1,1,1,0,0,1,0,1,1] b = [0,0,0,0,0,0,0,0,0,0,0] for i in range(len(a)): if a[i] == 1: b[i] = b[i-1] + 1 else: b[i] = 0