Python:记住状态并检查传入数据流的条件

2024-06-17 09:47:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含以下列的熊猫数据框:

##code to generate data frame 
import pandas as pd 
a = [2,3,4,5,6,0,8,7,1,3,4,0,6,4,0,2,4,0,4,5,0,1,7,0,1,8,5,3,6]
idx = pd.date_range("2018-01-01", periods=len(a), freq="H")
ts = pd.Series(a, index=idx)

这将创建此数据帧:

## Will create this:

                     Percent_change
2018-01-01 00:00:00               2
2018-01-01 01:00:00               3
2018-01-01 02:00:00               4
2018-01-01 03:00:00               5
2018-01-01 04:00:00               6
2018-01-01 05:00:00               0
2018-01-01 06:00:00               8
2018-01-01 07:00:00               7
2018-01-01 08:00:00               1
2018-01-01 09:00:00               3
2018-01-01 10:00:00               4
2018-01-01 11:00:00               0
2018-01-01 12:00:00               6
2018-01-01 13:00:00               4
2018-01-01 14:00:00               0
2018-01-01 15:00:00               2
2018-01-01 16:00:00               4
2018-01-01 17:00:00               0
2018-01-01 18:00:00               4
2018-01-01 19:00:00               5
2018-01-01 20:00:00               0
2018-01-01 21:00:00               1
2018-01-01 22:00:00               7
2018-01-01 23:00:00               0
2018-01-02 00:00:00               1
2018-01-02 01:00:00               8
2018-01-02 02:00:00               5
2018-01-02 03:00:00               3
2018-01-02 04:00:00               6

我创建了一个生成器,用于根据百分比变化值从数据映射特定条件:

def signal():
    current_state = "Outside market"

    while True:
        pct_change = yield current_state

        if (
            current_state in ("Outside market", "Market exit")
            and pct_change >= 5
        ):
            current_state = "Entered market"
        elif current_state == "Entered market" and pct_change > 0:
            current_state = "Inside market"
        elif current_state is "Market exit" and pct_change < 5:
            current_state = "Outside market"
        elif (
            current_state in ("Entered market", "Inside market")
            and pct_change <= 0
        ):
            current_state = "Market exit"


s = signal()
next(s)

df["Signal"] = df["Percent_change"].apply(lambda x: s.send(x))
df["Timestamp"] = pd.to_datetime(
    np.where(
        ((df["Signal"] == "Entered market") | (df["Signal"] == "Market exit")),
        df.index,
        pd.NaT,
    )
)
print(df)

将生成以下内容:

                     Percent_change          Signal           Timestamp
2018-01-01 00:00:00               2  Outside market                 NaT
2018-01-01 01:00:00               3  Outside market                 NaT
2018-01-01 02:00:00               4  Outside market                 NaT
2018-01-01 03:00:00               5  Entered market 2018-01-01 03:00:00
2018-01-01 04:00:00               6   Inside market                 NaT
2018-01-01 05:00:00               0     Market exit 2018-01-01 05:00:00
2018-01-01 06:00:00               8  Entered market 2018-01-01 06:00:00
2018-01-01 07:00:00               7   Inside market                 NaT
2018-01-01 08:00:00               1   Inside market                 NaT
2018-01-01 09:00:00               3   Inside market                 NaT
2018-01-01 10:00:00               4   Inside market                 NaT
2018-01-01 11:00:00               0     Market exit 2018-01-01 11:00:00
2018-01-01 12:00:00               6  Entered market 2018-01-01 12:00:00
2018-01-01 13:00:00               4   Inside market                 NaT
2018-01-01 14:00:00               0     Market exit 2018-01-01 14:00:00
2018-01-01 15:00:00               2  Outside market                 NaT
2018-01-01 16:00:00               4  Outside market                 NaT
2018-01-01 17:00:00               0  Outside market                 NaT
2018-01-01 18:00:00               4  Outside market                 NaT
2018-01-01 19:00:00               5  Entered market 2018-01-01 19:00:00
2018-01-01 20:00:00               0     Market exit 2018-01-01 20:00:00
2018-01-01 21:00:00               1  Outside market                 NaT
2018-01-01 22:00:00               7  Entered market 2018-01-01 22:00:00
2018-01-01 23:00:00               0     Market exit 2018-01-01 23:00:00
2018-01-02 00:00:00               1  Outside market                 NaT
2018-01-02 01:00:00               8  Entered market 2018-01-02 01:00:00
2018-01-02 02:00:00               5   Inside market                 NaT
2018-01-02 03:00:00               3   Inside market                 NaT
2018-01-02 04:00:00               6   Inside market                 NaT

如果我有一个数据帧,在这个数据帧上应用这个函数并得到结果,那么是否有一种方法可以应用相同的机制来检查数据是否是实时的,例如来自websocket,并根据pct_变化的值从生成的信号触发其他函数

谢谢


Tags: and数据dfexitcurrentchangemarketnat