簡體   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