pandas: переход с периодическими границами

#python #pandas #rolling-computation #periodicity

#python #pandas #переход-вычисление #периодичность

Вопрос:

Возможно ли включить значения начального и конечного индексов в при использовании rolling функции в pandas таким образом, чтобы значения ряда были периодическими?

Например, у меня есть следующий Series экземпляр:

 import pandas as pd
timestamps = [1, 2, 3, 4]
quantities = [1, 16, 9, 4]
series = pd.Series(quantities, index=timestamps)
  

который, когда я набираю:

 series.rolling(window=3, min_periods=3, center=True).median()
  

дает:

 1    NaN
2    9.0
3    9.0
4    NaN
dtype: float64
  

Тем не менее, я хотел бы включить в вычисление оба конца ряда таким образом, чтобы результат был:

 1    median([4, 1, 16])   4.0
2    median([1, 16, 9])   9.0
3    median([16, 9, 4])   9.0
4    median([9, 4, 1])    4.0
dtype: float64
  

Спасибо за любую помощь в попытке достичь этого!

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

1. Имело бы больше смысла, если бы последний был 9, 4, 1

2. @Erfan да, и правильно 🙂

Ответ №1:

Мы можем расширить список первым и последним элементом, а затем вычислить скользящую медиану. После этого мы dropna и присваиваем серию обратно

За самый красивый код не заплатишь, но он выполняет свою работу. Не мог придумать другого способа.

 quantities2 = quantities.copy()
quantities2.insert(0, quantities2[-1])
quantities2.insert(len(quantities2), quantities2[0])
print(quantities2)

[4, 1, 16, 9, 4, 4]
  
 series = pd.Series(quantities2)
series = pd.Series(series.rolling(window=3, min_periods=3, center=True).median().dropna(), index=timestamps)

print(series)
1    4.0
2    9.0
3    9.0
4    4.0
dtype: float64
  

Но опять же, обязательно ли нам писать максимально чистый код? 🙂