python - 如何在 Python 中将多条件循环转换为函数
问题描述
我的问题
我编写了一些代码,将 4 个独立的技术信号(买入、卖出、空头和回补)分别在各自的列中合并为一列。信号只能以特定顺序连接,例如,如果您在一个时间段内买入一只股票,那么在下一个时间段内,唯一可能的行动是卖出或卖空它,而您无法覆盖它。
代码完全按照它应该的方式工作,但我遇到的问题是循环使代码非常慢,我想让它更快更高效。
当前工作慢代码
import numpy as np
import pandas as pd
csv1 = pd.read_csv('signals.csv', delimiter = ',')
df = pd.DataFrame(csv1)
df.loc[df.index[0], 'Signal'] = "Buy"
for x in range(1,len(df.index)):
if df["Signal"].iloc[x-1] == "Buy" and (df["Sell"].iloc[x] == "Sell" or df["Short"].iloc[x] == "Short"):
df["Signal"].iloc[x] = df["Sell"].iloc[x] + df["Short"].iloc[x]
elif df["Signal"].iloc[x-1] == "Short" and (df["Buy"].iloc[x] == "Buy" or df["Cover"].iloc[x] == "Cover"):
df["Signal"].iloc[x] = df["Buy"].iloc[x] + str(df["Cover"].iloc[x])
elif df["Signal"].iloc[x-1] == "Cover" and (df["Buy"].iloc[x] == "Buy" or df["Short"].iloc[x] == "Short"):
df["Signal"].iloc[x] = df["Buy"].iloc[x] + df["Short"].iloc[x]
elif df["Signal"].iloc[x-1] == "Sell" and (df["Buy"].iloc[x] == "Buy" or df["Short"].iloc[x] == "Short"):
df["Signal"].iloc[x] = df["Buy"].iloc[x] + df["Short"].iloc[x]
else:
df["Signal"].iloc[x] = df["Signal"].iloc[x-1]
df
预期输入
Short,Cover,Buy,Sell
,,,
Short,,,
,,,
,Cover,,
,,,
,,,
,,Buy,
,,,
,,,
,,,Sell
,,,
,,,
,,Buy,
,,,
,,,Sell
,,,
预期产出
Short,Cover,Buy,Sell,Signal
,,,,Buy
Short,,,,Short
,,,,Short
,Cover,,,Cover
,,,,Cover
,,,,Cover
,,Buy,,Buy
,,,,Buy
,,,,Buy
,,,Sell,Sell
,,,,Sell
,,,,Sell
,,Buy,,Buy
,,,,Buy
,,,Sell,Sell
,,,,Sell
知道我该怎么做吗?
干杯!
解决方案
IIUC,你只需要做
df['Signal'] = df.ffill(axis=1).iloc[:,-1].ffill().fillna('Buy')
输出:
Short Cover Buy Sell Signal
0 NaN NaN NaN NaN Buy
1 Short NaN NaN NaN Short
2 NaN NaN NaN NaN Short
3 NaN Cover NaN NaN Cover
4 NaN NaN NaN NaN Cover
5 NaN NaN NaN NaN Cover
6 NaN NaN Buy NaN Buy
7 NaN NaN NaN NaN Buy
8 NaN NaN NaN NaN Buy
9 NaN NaN NaN Sell Sell
10 NaN NaN NaN NaN Sell
11 NaN NaN NaN NaN Sell
12 NaN NaN Buy NaN Buy
13 NaN NaN NaN NaN Buy
14 NaN NaN NaN Sell Sell
15 NaN NaN NaN NaN Sell
推荐阅读
- android - 为什么 layout_constraintStart_toEndOf 总是与 ConstraintLayout 中的第一个控件重叠?
- python - 每个项目(子列表)都是在 .sort() 函数上显示 None 的列表
- python - 二叉树一次向左 XOR 向右移动一个节点
- javascript - 如何解决方法的错误?axios.post
- java - POSTMAN/Java 中的文件传输。需要找到 curl -T 等价物
- c++ - 如何在 cgal Dd Delaunay Triangulations 中修改(移动)点
- react-native - React Native - XCodeBuild - 致命错误:模块映射文件
- python - 在适用于 Android 的跨平台 C++ Qt 项目中嵌入 Python 时出错
- laravel - Laravel Backpack enableAjaxTable 不存在
- java - 多层感知器的置信矩阵