Определение минимальных и максимальных значений в течение определенного времени в Pandas - PullRequest
1 голос
/ 03 мая 2020

У меня есть кадр данных, подобный приведенному ниже:

df = pd.DataFrame({'ticker':['A', 'A', 'A', 'A', 'A', 
                             'B', 'B', 'B', 'B', 'B'], 
                   'date':['2020-05-01 09:30:00', '2020-05-01 09:31:00', '2020-05-01 09:32:00', '2020-05-01 09:33:00', '2020-05-01 09:34:00', 
                           '2020-05-01 09:30:00', '2020-05-01 09:31:00', '2020-05-01 09:32:00', '2020-05-01 09:33:00', '2020-05-01 09:34:00'], 
                   'datetime':['2020-05-01 09:30:00', '2020-05-01 09:31:00', '2020-05-01 09:32:00', '2020-05-01 09:33:00', '2020-05-01 09:34:00', 
                               '2020-05-01 09:30:00', '2020-05-01 09:31:00', '2020-05-01 09:32:00', '2020-05-01 09:33:00', '2020-05-01 09:34:00'], 
                   'low':[10.00, 11.00, 12.00, 11.00, 11.50,
                          15.00, 14.00, 13.00, 12.00, 12.50], 
                   'high':[10.25, 11.25, 12.25, 11.25, 11.75,
                          15.25, 14.25, 13.25, 12.25, 12.75], 
                   'close':[10.20, 11.20, 12.20, 11.20, 11.70,
                          15.20, 14.20, 13.20, 12.20, 12.75]})

df['date'] = pd.to_datetime(df['date'], format='%Y-%m-%d %H:%M')
df['datetime'] = pd.to_datetime(df['datetime'], format='%Y-%m-%d %H:%M')
df = df.set_index(['ticker', 'date'])

Я пытаюсь выяснить, как создать столбцы в моем кадре данных с минимальной и максимальной ценами каждого тикера в данный момент времени. То есть между первым днем ​​и текущим временем данной строки.

  • Например, в 09:32:00 тикер B имел самую низкую цену 13,0 (происходившую в эту минуту ), но тикер А имел самую низкую цену 10,0 (что произошло в 09:30:00).
  • Аналогично, в 09:32:00 тикер В имел самую высокую цену 11,25 (что произошло в минута), но у тикера A была самая высокая цена 15,25 (что произошло при открытии в 09:30:00).

Я пробовал различные операторы .groupby и .lo c , но, кажется, не могу найти правильный.

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

2 голосов
/ 03 мая 2020

Вы ищете .expanding() в сочетании с .min() и .max(), например:

df.groupby('ticker')[['low', 'high', 'close']].expanding().min()
                                    low   high  close
ticker ticker date                                   
A      A      2020-05-01 09:30:00  10.0  10.25   10.2
              2020-05-01 09:31:00  10.0  10.25   10.2
              2020-05-01 09:32:00  10.0  10.25   10.2
              2020-05-01 09:33:00  10.0  10.25   10.2
              2020-05-01 09:34:00  10.0  10.25   10.2
B      B      2020-05-01 09:30:00  15.0  15.25   15.2
              2020-05-01 09:31:00  14.0  14.25   14.2
              2020-05-01 09:32:00  13.0  13.25   13.2
              2020-05-01 09:33:00  12.0  12.25   12.2
              2020-05-01 09:34:00  12.0  12.25   12.2

Это в основном похоже на .rolling(), но его длина продолжает увеличиваться вместо того, чтобы окно было фиксированного размера.

0 голосов
/ 03 мая 2020

Я не уверен, что вам нужно, но я думаю, что следующий код будет работать:

df[['date','low']].loc[df['ticker']=='A'].min()

Вывод:

date    2020-05-01 09:30:00
low                      10

Вы не хотите устанавливать Индекс к ticker и date

...