数据框的复杂掩码

ric*_*ric 1 python mask conditional-statements pandas

我有一个数据框,其中一列包含时间序列。数据如下图所示

输入

我想创建一个每次数据等于或低于 -0.20 时为 TRUE 的掩码。在达到 -0.20 且为负值之前,它也应该为 TRUE 。当负数达到 -0.20后也应该如此。此版本的图表

输出

是我手动尝试显示(以红色)掩码为 TRUE 的值。我开始创建掩码,但只能在数据小于 -0.20 时使其等于 TRUE mask = (df['data'] < -0.2)。我不能做得更好,有人知道如何实现我的目标吗?

tlg*_*lgs 5

一种方法可能是将完全低于零的段分组,然后对于每个组验证是否存在低于 的任何值-0.2

在此输入图像描述

请参阅下面的完整可重现示例脚本:

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd


np.random.seed(167)

df = pd.DataFrame(
    {"y": np.cumsum([np.random.uniform(-0.01, 0.01) for _ in range(10 ** 5)])}
)
plt.plot(df)

gt_zero = df["y"] < 0
regions = (gt_zero != gt_zero.shift()).cumsum()

# here's your interesting DataFrame with the specified mask
df_interesting = df.groupby(regions).filter(lambda s: s.min() < -0.2)

# plot individual regions
for i, grp in df.groupby(regions):
    if grp["y"].min() < -0.2:
        plt.plot(grp, color="tab:red", linewidth=5, alpha=0.6)

plt.axhline(0, linestyle="--", color="tab:gray")
plt.axhline(-0.2, linestyle="--", color="tab:gray")
plt.show()
Run Code Online (Sandbox Code Playgroud)