как применять в python мобильное усреднение с учетом периодов c граничных условий в данных - PullRequest
0 голосов
/ 01 апреля 2020

Я бы хотел выполнить мобильное усреднение с учетом периодических c граничных условий. Я пытаюсь прояснить ситуацию.

У меня есть эти данные:

Date,Q
1989-01-01 00:00,0
1989-01-02 00:00,1
1989-01-03 00:00,4
1989-01-04 00:00,6
1989-01-05 00:00,8
1989-01-06 00:00,10
1989-01-07 00:00,11

Я хотел бы вычислить мобильное усреднение с учетом 3 данных: следующего и предыдущего. В частности, я хотел бы использовать ту же опцию в «скользящей» функции, когда первые данные (0 в python framework) могли учитывать последние и наоборот последние первые. Это позволило бы мне иметь некие периодические c граничные условия.

Действительно, я применил следующее: сначала я читаю фрейм данных

df = pd.read_csv(fname, index_col = 0,  parse_dates=True)

, затем применяю " roll "as

df['Q'] = pd.Series(df["Q"].rolling(3, center=True).mean())

Однако я получаю следующие результаты:

Date
1989-01-01     NaN
1989-01-02    1.66
1989-01-03    3.66
1989-01-04    6
1989-01-05    8
1989-01-06    9.66
1989-01-07     NaN

Я знаю, что могу применить опцию" min_periods = 1 ", но это не то, что я хочу. Действительно, ясно, что во втором ряду результат верный:

1.66 = (0+1+4)/3

Однако я бы хотел, чтобы этот результат был в первом ряду:

(0+1+11)/3

Как вы можете заметил, что число 11 является значением последней строки. Точно так же я ожидаю в последней строке:

(10+11+0)/3

, где 0 - значение первой строки.

У вас есть предложения или идеи?

Спасибо,

D iego

1 Ответ

1 голос
/ 02 апреля 2020

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

df.loc[df.index[0] - pd.offsets.Day(1), 'Q'] = df.iloc[-1]['Q']
df.loc[df.index[-2] + pd.offsets.Day(1), 'Q'] = df.iloc[0]['Q']
df = df.sort_index()
df['Q'] = pd.Series(df["Q"].rolling(3, center=True).mean())

Это дает, как и ожидалось:

                   Q
Date                
1989-01-01  4.000000
1989-01-02  1.666667
1989-01-03  3.666667
1989-01-04  6.000000
1989-01-05  8.000000
1989-01-06  9.666667
1989-01-07  7.000000
...