微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何纠正时间序列数据上的不匹配映射

如何解决如何纠正时间序列数据上的不匹配映射

我有一个小的时间序列数据:

生成数据的步骤:

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

我想应用一个简单的函数来映射基于一些初始和评估条件参数的时间序列的值:

state = False
s = 'outside market'

def check_market_state(x):
    global state
    global s
    if state == False and x < 5 or x == 0:
        s = 'outside market'
        state = False
    if state == False and x >= 5:
        s = 'entered market'
        state = True 
    if state == True and x !=0 and x >= 5:
        s = 'inside market'
    if state == True and  x >=5:
        s = 'inside market'
    if state == True and x == 0 :
        s = 'exit market'
        state = False
    return s

条件:

如果阈值为 5 :

外部市场如果 x 小于 5 并且我们之前是外部市场

如果 x 大于等于 5 则进入市场并且我们之前在市场之外

如果 x 小于 5 或​​大于 5 但不等于 0 并且我们之前进入市场或内部市场

如果 x 等于 0 退出市场

期望输出

enter image description here

解决方法

假设您有这个数据框(tsidx 取自您的问题):

df = pd.DataFrame({"Percent_change": ts},index=idx)
print(df)
                     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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。