更高效的迭代方法

问题描述 投票:0回答:1

我正在寻找一种更好的方法来执行以下操作。下面的代码可以工作,但速度非常慢,因为我正在处理一个大数据集。我也尝试使用 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 就是所需的结果。

所以我正在寻找一种更有效的迭代逻辑,允许在多个列和行上设置条件

python pandas python-itertools
1个回答
0
投票

第一部分取决于你的实际功能,改进它可能并不容易,第二部分可以用

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
© www.soinside.com 2019 - 2024. All rights reserved.