繁体   English   中英

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

[英]Pythonic way of creating a recursive series of 1 and 0 based on a pandas time series level

我正在尝试清理我有一个数据框的代码,例如:

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 信号。 当“价值”向上跨越 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) 

尝试这个:

df['sig'] = (df['value'] < off & df['value'] > on).astype(int)

在我的头顶上,未经证实。

v = df['value']
s = v.gt(14.39).sub(v.lt(12.5))
df['sig'] = s.where(s.ne(0). np.nan).ffill().add(1).div(2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM