Панды получают максимум последовательности

#pandas #dataframe #time #timestamp

#панды #фрейм данных #время #временная метка

Вопрос:

У меня есть фрейм данных, который выглядит следующим образом:

 index                 status    counting
2018-02-11 10:00:00   close     0
2018-02-11 10:00:01   close     0
2018-02-11 10:00:02   close     0
2018-02-11 10:00:03   open      1
2018-02-11 10:00:04   open      2
2018-02-11 10:00:05   open      3
2018-02-11 10:00:06   close     0
2018-02-11 10:00:07   close     0
2018-02-11 10:00:08   close     0
2018-02-11 10:00:09   open      1
2018-02-11 10:00:10   open      2
2018-02-11 10:00:11   open      3
2018-02-11 10:00:12   open      4
2018-02-11 10:00:13   open      5
2018-02-11 10:00:14   open      6
2018-02-11 10:00:15   close     0
2018-02-11 10:00:16   close     0
2018-02-11 10:00:17   close     0
  

Я хочу рассчитать среднюю продолжительность последовательного «открытого» интервала. Либо

  • Доступ к индексу как начала, так и конца этих интервалов или
  • Получение самого высокого числа подсчета для каждого открытого блока..

У кого-нибудь есть идея?

Ответ №1:

Вы можете сравнивать значения по open , затем инвертировать маску по ~ с кумулятивной суммой для групп и фильтровать только open строки, последний переход к groupby :

 m = df['status'].eq('open')

s = df.groupby((~m).cumsum()[m])['counting'].max()
print (s)
status
3.0    3
6.0    6
Name: counting, dtype: int64
  

Если нужно mean :

 s = df.groupby((~m).cumsum()[m])['counting'].mean()
print (s)
status
3.0    2.0
6.0    3.5
Name: counting, dtype: float64
  

Если нужны минимальные и максимальные значения:

 df = df.reset_index()
m = df['status'].eq('open')

df1 = df.groupby((~m).cumsum()[m])['index'].agg(['min','max'])
print (df1)
                        min                  max
status                                          
3.0     2018-02-11 10:00:03  2018-02-11 10:00:05
6.0     2018-02-11 10:00:09  2018-02-11 10:00:14
  

Подробные сведения:

 print ((~m).cumsum())
0     1
1     2
2     3
3     3
4     3
5     3
6     4
7     5
8     6
9     6
10    6
11    6
12    6
13    6
14    6
15    7
16    8
17    9
Name: status, dtype: int32

print ((~m).cumsum()[m])
3     3
4     3
5     3
9     6
10    6
11    6
12    6
13    6
14    6
Name: status, dtype: int32