Панды: среднее значение за последние k дней - PullRequest
0 голосов
/ 22 октября 2018

Я хочу вычислить скользящее среднее (FLIGHT_DURATION) за последние k вхождений.Где последний означает последний в отношении порядка, заданного FLIGHT_DATE.

, как я сделал в следующем примере:

ARRIVAL_AIRPORT ARRIVAL_RUNWAY  DEPARTURE_AIRPORT DEPARTURE_RUNWAY

FLIGHT_DATE FLIGHT_DURATION FLIGHT_NUMBER
0   FRA YYY HAM XXX 2000-01-01  11  1
1   FRA YYY HAM XXX 2000-01-02  12  1
2   FRA YYY HAM XXX 2000-01-03  13  1
3   FRA YYY HAM XXX 2000-01-04  14  1
4   FRA YYY HAM XXX 2000-01-05  15  1

Ожидается при k = 3:

Решение:

ExampleA = ExampleA.groupby('FLIGHT_NUMBER').apply(lambda x: x.set_index('FLIGHT_DATE').resample('1D').first())

df1 = ExampleA.groupby(level=0)['FLIGHT_DURATION'].apply(lambda x: x.shift().rolling(min_periods=3,window=3).mean()).reset_index(name='Value_Average_Past_2_days')

pd.merge(ExampleA, df1, on=['FLIGHT_NUMBER', 'FLIGHT_DATE'], how='left')

Вывод:

FLIGHT_DATE ARRIVAL_AIRPORT ARRIVAL_RUNWAY  DEPARTURE_AIRPORT   
DEPARTURE_RUNWAY    FLIGHT_DURATION FLIGHT_NUMBER    
Value_Average_Past_3_days
0   2000-01-01  FRA YYY HAM XXX 11  1   NaN
1   2000-01-02  FRA YYY HAM XXX 12  1   NaN
2   2000-01-03  FRA YYY HAM XXX 13  1   NaN
3   2000-01-04  FRA YYY HAM XXX 14  1   12.0
4   2000-01-05  FRA YYY HAM XXX 15  1   13.0

Как вы видите, я добавил новый столбец, который показывает среднее значение.требуется минимум 3 дня.

Проблема:

Теперь у меня есть более полный Dataframe:

FLIGHT_NUMBER FLIGHT_DATE DEPARTURE_AIRPORT ARRIVAL_AIRPORT 
DEPARTURE_RUNWAY ARRIVAL_RUNWAY FLIGHT_DURATION

 1 01.01.2000,HAM,FRA,XXX,YYY,11   -- NaN
 1 02.01.2000,HAM,FRA,XXX,YYY,12   -- NaN
 1 03.01.2000,HAM,FRA,XXX,YYY,13   -- NaN
 1 04.01.2000,HAM,FRA,XXX,ZZZ,101  -- NaN
 1 05.01.2000,HAM,FRA,XXX,YYY,14   -- 12
 1 06.01.2000,HAM,FRA,XXX,ZZZ,102  -- NaN
 9 01.01.2000,BOG,FRA,XXX,YYY,1001 -- NaN
 1 07.01.2000,HAM,FRA,XXX,ZZZ,103  -- NaN
 9 01.01.2000,BOG,FRA,XXX,YYY,1002 -- NaN
 9 02.01.2000,BOG,FRA,XXX,YYY,1003 -- NaN
 9 03.01.2000,BOG,FRA,XXX,YYY,1004 -- 1002
 1 08.01.2000,HAM,FRA,XXX,ZZZ,104  -- 102
 1 09.01.2000,HAM,FRA,XXX,YYY,15   -- 13
 1 10.01.2000,HAM,FRA,XXX,ZZZ,105  -- 103

Столбец с - перед значениями, являютсясредние значения я ожидаю.Как видите, этот пример немного сложнее.Для группы FLIGHT_DATE уже недостаточно.Там должны быть другие четко идентифицируемые столбцы.ARRIVAL_RUNWAY, DEPARTURE_RUNWAY, DEPARTURE_AIRPORT и ARRIVAL_AIRPORT теперь также должны учитываться для правильного расчета (или я ошибаюсь?)

Например, 01.01.2000 ОТ BOG в FRA получает нан, потому что у рейса нет как минимум 3исторические полеты.

Но рейс BOG - FRA 03.01.2000 имеет среднее значение, потому что есть 3 последних рейса (01.01.2000, 01.01.2000 и 02.01.2000).

В противном случае посмотрите на рейсы с HAM, FRA, XXX, ZZZ и на рейсы с HAM, FRA, XXX, YYY, затем сравните средние значения, тогда все должно быть ясно.

Я пытался:

dfTestB = pd.read_csv("Example2.csv")
dfTestB["FLIGHT_DATE"] = pd.to_datetime(dfTestB["FLIGHT_DATE"],format='%d.%m.%Y')
dfTestB = dfTestB.groupby(['FLIGHT_NUMBER','DEPARTURE_RUNWAY','ARRIVAL_RUNWAY']).apply(lambda x: x.set_index(['FLIGHT_DATE']).resample('1D').first())
df2 = dfTestB.groupby(level=0)['FLIGHT_DURATION'].apply(lambda x: x.shift().rolling(min_periods=3,window=3).mean()).reset_index(name='Value_Average_Past_3_days')
res = pd.merge(dfTestB, df2, on=['FLIGHT_NUMBER', 'FLIGHT_DATE'], how='left')

но это не работает ... как я могу решить это?

1 Ответ

0 голосов
/ 23 октября 2018

Ваши столбцы «группировки» кажутся ['FLIGHT_NUMBER', 'DEPARTURE_AIRPORT', 'ARRIVAL_RUNWAY']

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

import pandas as pd

gcols = ['FLIGHT_NUMBER', 'DEPARTURE_AIRPORT', 'ARRIVAL_RUNWAY']
df['result'] = pd.concat([gp.rolling(window=3, min_periods=3).mean().shift(1) 
                          for _, gp in df.groupby(gcols).FLIGHT_DURATION])

Вывод: (некоторые столбцы подавлены)

    FLIGHT_NUMBER FLIGHT_DATE DEPARTURE_AIRPORT ARRIVAL_RUNWAY  result
0               1  01.01.2000               HAM            YYY     NaN
1               1  02.01.2000               HAM            YYY     NaN
2               1  03.01.2000               HAM            YYY     NaN
3               1  04.01.2000               HAM            ZZZ     NaN
4               1  05.01.2000               HAM            YYY    12.0
5               1  06.01.2000               HAM            ZZZ     NaN
6               9  01.01.2000               BOG            YYY     NaN
7               1  07.01.2000               HAM            ZZZ     NaN
8               9  01.01.2000               BOG            YYY     NaN
9               9  02.01.2000               BOG            YYY     NaN
10              9  03.01.2000               BOG            YYY  1002.0
11              1  08.01.2000               HAM            ZZZ   102.0
12              1  09.01.2000               HAM            YYY    13.0
13              1  10.01.2000               HAM            ZZZ   103.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...