gpt4 book ai didi

基于 Pandas 时间序列级别创建 1 和 0 的递归序列的 Pythonic 方法

转载 作者:太空宇宙 更新时间:2023-11-04 05:21:16 25 4
gpt4 key购买 nike

我正在尝试清理我有数据框的代码:

df = pd.DataFrame({'value': {'2016-09-21': 13.30,
'2016-09-22': 12.02,
'2016-09-23': 12.28,
'2016-09-26': 14.5,
'2016-09-27': 13.1,
'2016-09-28': 12.39,
'2016-09-29': 14.02}})

我有一个基于电平的 ON 和 OFF 信号。当“值(value)”向上穿越 14.39 时,我想要 1 直到它向下穿越 12.50 这样有:

df
value sig
2016-09-21 13.3000 0
2016-09-22 12.0200 0
2016-09-23 12.2800 0
2016-09-26 14.5000 1
2016-09-27 13.1000 1
2016-09-28 12.3900 0
2016-09-29 14.0200 0

我正在通过一个循环来解决这个问题,但我很确定有更好的方法来解决这个问题。这是我的方法:

off, on, sig = 14.39, 12.50, 0
log = []
for level in df.itertuples():
if level.value > off:
sig = 1
elif (sig == 1) & (level.value < on):
sig = 0
log.append([level.value, sig])
log = pd.DataFrame(log, index=df.index, columns=['value', 'sig'])

最佳答案

这是一个使用 pandas.Series.where 方法的矢量化解决方案:

import numpy as np

ON, OFF = 14.39, 12.50
df['sig'] = 0 # set the initial value to be 0
df['sig'] = (df.sig.where(df.value < ON, 1) # if value > ON, set it 1
.where((df.value < OFF) | (df.value > ON), np.nan)
# if value < ON, and value > OFF, set it nan
.ffill().fillna(0)) # forward fill the nan value as they depend
# on their previous state, and fill initial
# value as 0
df

# value sig
#2016-09-21 13.30 0
#2016-09-22 12.02 0
#2016-09-23 12.28 0
#2016-09-26 14.50 1
#2016-09-27 13.10 1
#2016-09-28 12.39 0
#2016-09-29 14.02 0

类似的np.where()方法,意图可能更清晰:

import numpy as np
df['sig'] = np.where(df.value > ON, 1, np.where(df.value < OFF, 0, np.nan))
df['sig'] = df.sig.ffill().fillna(0)

关于基于 Pandas 时间序列级别创建 1 和 0 的递归序列的 Pythonic 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40205539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com