Скользящая медиана данных, индексированных по дате, с повторяющимися датами

#pandas #dataframe

#pandas #фрейм данных

Вопрос:

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

 df = pd.DataFrame({
    'date': ['2020-06-22', '2020-06-23','2020-06-24','2020-06-24', '2020-06-25', '2020-06-26'],
    'value': [2,8,5,1,3,7]
})
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
  

введите описание изображения здесь

 # Attempt to get the 3-day rolling median of 'value':
df['value'].rolling('3D').median()

# This yields the following, i.e. one median value
# per **observation**
# (two values for 6/24 in this example):
date
2020-06-22    2.0
2020-06-23    5.0
2020-06-24    5.0
2020-06-24    3.5
2020-06-25    4.0
2020-06-26    4.0
Name: value, dtype: float64

# I was hoping to get one median value
# per **distinct date** in the index
# The median for 6/24, for example, would be computed
# from **all** observations on 6/22, 6/23 and 6/24(2 observations)
date
2020-06-22    NaN
2020-06-23    NaN
2020-06-24    3.5
2020-06-25    4.0
2020-06-26    4.0
Name: value, dtype: float64
  

Как мне нужно изменить свой код?

Комментарии:

1. не могли бы вы опубликовать результат, который вы хотели бы получить. в частности, как именно следует обрабатывать повторяющиеся даты

2. Я изменил свой вопрос, чтобы включить желаемый результат. Чтобы перефразировать мою цель: я хочу, чтобы вычисление вычисляло медиану всех наблюдений в заданном (скользящем) временном окне

3. Скользящее окно не работает таким образом, если вы хотите получить разные значения, тогда ваш результирующий набор (к которому вы применяете прокрутку) должен иметь разные данные. При переходе с window = 3 будет выбрано 3 дня и вы получите медиану, например, для 26-го числа, пока не выберете 24-е, а нахождение 4,4 и 3,5 даст медиану как 4 медианы.

4. Спасибо, Дивьяанш! Если я не могу использовать rolling, что бы я использовал для получения желаемого результата?

Ответ №1:

Насколько я могу судить, ваш код выдает правильный ответ для второго вхождения 2020-06-24 , поскольку 3.5 — это медиана из 4 чисел 2,8,5,1. Первое вхождение 2020-06-24 использует только свое собственное значение и значения за два предыдущих дня. Предположительно, и я предполагаю здесь, что он просматривает окно «3D» в элементах в строках, предшествующих ему во временных рядах, а не после.

Поэтому я думаю, что ваш код нуждается лишь в небольшой модификации, чтобы удовлетворить ваши требования, и это при наличии нескольких строк с одинаковой датой, мы должны просто выбрать последнюю. Мы сделаем это ниже с groupby помощью . Также вы хотите, чтобы первые два значения были NaN , а не медианами более коротких временных рядов — это может быть достигнуто путем передачи min_periods = 3 rolling функции. Вот весь код, я помещаю медиану в отдельный столбец

 df['median'] = df['value'].rolling('3D', min_periods = 3).median()
df.groupby(level = 0, axis = 0).last()
  

С принтами

 
         value  median
date        
2020-06-22  2   NaN
2020-06-23  8   NaN
2020-06-24  1   3.5
2020-06-25  3   4.0
2020-06-26  7   4.0