【发布时间】:2021-11-25 19:28:01
【问题描述】:
我可以对基本的东西做 python/pandas,但我仍然在 pandas 的“不需要循环”世界中挣扎。我倾向于退回到转换为列表并像在 VBA 中那样执行循环,然后将这些列表带回 dfs。我知道有一个更简单的方法,但我想不通。
我的简单示例只是一个非常基本的策略,如果系列高于 70,则创建 -1 信号并保持 -1 直到信号变为 1 时系列跌破 30 并保持此信号直到值高于 70以此类推。
我可以通过简单的列表循环来做到这一点,但我知道这远非“Pythonic”!任何人都可以帮助将其“翻译”成一些没有循环的更好的代码吗?
#rsi_list is just a list from a df column of numbers. Simple example:
rsi={'rsi':[35, 45, 75, 56, 34, 29, 26, 34, 67. 78]}
rsi=pd.DataFrame(rsi)
rsi_list=rsi['rsi'].tolist()
signal_list=[]
hasShort=0
hasLong=0
for i in range(len(rsi_list)-1):
if rsi_list[i] >= 70 or hasShort==1:
signal_list.append(-1)
if rsi_list[i+1] >= 30:
hasShort=1
else:
hasShort=0
elif rsi_list[i] <= 30 or hasLong==1:
signal_list.append(1)
if rsi_list[i+1] <= 70:
hasLong=1
else:
hasLong=0
else:
signal_list.append(0)
#last part just for the list to be the same lenght of the original df as I put it back as a column
if rsi_list[-1]>=70:
signal_list.append(-1)
else:
signal_list.append(1)
【问题讨论】:
-
不是所有的东西都可以在没有循环的情况下有效地表达。有 numba 和类似的库 - 请参阅python - Efficient way to process pandas DataFrame timeseries with Numba - Stack Overflow 使用 numba 和 pandas
-
请注意:您可以使用
rsi_list=rsi['rsi'].values而不是转换为列表。 -
尽管特别是对于这个,将值 (=70) 替换为 (-1, 0, 1),然后执行此操作 python - pandas replace zeros with previous non zero value - Stack Overflow