Panda-equivalent van Oracle Lead/Lag-functie

Eerst ben ik nieuw met panda’s, maar ik word er nu al verliefd op. Ik probeer het equivalent van de Lag-functie van Oracle te implementeren.

Stel dat je dit DataFrame hebt:

Date                   Group      Data
2014-05-14 09:10:00        A         1
2014-05-14 09:20:00        A         2
2014-05-14 09:30:00        A         3
2014-05-14 09:40:00        A         4
2014-05-14 09:50:00        A         5
2014-05-14 10:00:00        B         1
2014-05-14 10:10:00        B         2
2014-05-14 10:20:00        B         3
2014-05-14 10:30:00        B         4

Als dit een Oracle-database was en ik een lag-functie wilde maken, gegroepeerd op de kolom “Groep” en geordend op datum, zou ik deze functie gemakkelijk kunnen gebruiken:

LAG(Data,1,NULL) OVER (PARTITION BY Group ORDER BY Date ASC) AS Data_lagged

Dit zou resulteren in de volgende tabel:

Date                   Group     Data    Data lagged
2014-05-14 09:10:00        A        1           Null
2014-05-14 09:20:00        A        2            1
2014-05-14 09:30:00        A        3            2
2014-05-14 09:40:00        A        4            3
2014-05-14 09:50:00        A        5            4
2014-05-14 10:00:00        B        1           Null
2014-05-14 10:10:00        B        2            1
2014-05-14 10:20:00        B        3            2
2014-05-14 10:30:00        B        4            3

In panda’s kan ik de datum instellen als een index en de shift-methode gebruiken:

db["Data_lagged"] = db.Data.shift(1)

Het enige probleem is dat dit niet per kolom wordt gegroepeerd. Zelfs als ik de twee kolommen Datum en Groep als indexen instel, zou ik nog steeds de “5” in de vertraagde kolom krijgen.

Is er een manier om het equivalent van de Lead- en lag-functies in Panda’s te implementeren?


Antwoord 1, autoriteit 100%

Je zou een groupby/ kunnen uitvoeren (ploeg)bediening toepassen:

In [15]: df['Data_lagged'] = df.groupby(['Group'])['Data'].shift(1)
In [16]: df
Out[16]: 
                Date Group  Data  Data_lagged
2014-05-14  09:10:00     A     1          NaN
2014-05-14  09:20:00     A     2            1
2014-05-14  09:30:00     A     3            2
2014-05-14  09:40:00     A     4            3
2014-05-14  09:50:00     A     5            4
2014-05-14  10:00:00     B     1          NaN
2014-05-14  10:10:00     B     2            1
2014-05-14  10:20:00     B     3            2
2014-05-14  10:30:00     B     4            3
[9 rows x 4 columns]

Om het effect ORDER BY Date ASCte verkrijgen, moet u eerst het DataFrame sorteren:

df['Data_lagged'] = (df.sort_values(by=['Date'], ascending=True)
                       .groupby(['Group'])['Data'].shift(1))

Antwoord 2, autoriteit 3%

Voor het gebruik van een lead bij panda’s hoeft u alleen shift(-1)te gebruiken in plaats van 1

df['Data_lead'] = df.groupby(['Group'])['Data'].shift(-1)

Other episodes