我正在寻找一种更好的方法来执行以下操作。下面的代码可以工作,但速度非常慢,因为我正在处理一个大数据集。我也尝试使用 itertools 但不知怎的我无法让它工作。所以这是我非常不Python的起点。
辅助功能:
def signalbin(x,y):
if x > y:
return 1
else:
return -1
测试数据:
np.random.seed(0)
df = pd.DataFrame(
{
'a': np.random.normal(0, 2.5, n),
'b': np.random.normal(0, 2.5, n),
}
)
我当前的代码:
df["signal"] = [signalbin(x, y) for x, y in zip(df["a"], df["b"])]
df["signal2"] = df["signal"]
for i, row in df.iterrows():
if i == 0:
continue
if (row['signal2'] != df.at[i-1, "signal"]):
df.at[i, "signal2"] = df.at[i-1, "signal2"]
在这种情况下,列 signal2 就是所需的结果。
所以我正在寻找一种更有效的迭代逻辑,允许在多个列和行上设置条件
第一部分取决于你的实际功能,改进它可能并不容易,第二部分可以用
shift
进行矢量化:
df['signal'] = np.where(df['a']>df['b'], 1, -1)
prev = df['signal'].shift(fill_value=df['signal'].iloc[0])
df['signal2'] = (df['signal'].mask(df['signal'].ne(prev)).ffill()
.astype(df['signal'].dtype) # optional
)
输出:
a b signal signal2
0 4.410131 0.360109 1 1
1 1.000393 3.635684 -1 -1
2 2.446845 1.902594 1 1
3 5.602233 0.304188 1 1
4 4.668895 1.109658 1 1
5 -2.443195 0.834186 -1 -1
6 2.375221 3.735198 -1 -1
7 -0.378393 -0.512896 1 1
8 -0.258047 0.782669 -1 -1
9 1.026496 -2.135239 1 1