Я хочу вычислить скользящее среднее (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')
но это не работает ... как я могу решить это?