我有一个小的时间序列数据:
产生数据的步骤:
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)我想应用一个简单的函数来根据一些初始和评估的条件参数映射时间序列的值:
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等于零,退出市场
期望的输出:

发布于 2021-05-01 13:59:55
假设您有此数据(ts和idx取自您的问题):
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 NaThttps://stackoverflow.com/questions/67346687
复制相似问题