pandas dataframe, fügen Sie eine Spalte als gleitender Durchschnitt der anderen Spalte für jede Gruppe

Ich habe einen dataframe df wie unten.

dates = pd.date_range('2000-01-01', '2001-01-01')
df1 = pd.DataFrame({'date':dates, 'value':np.random.normal(size = len(dates)), 'market':'GOLD'})
df2 = pd.DataFrame({'date':dates, 'value':np.random.normal(size = len(dates)), 'market':'SILVER'})
df = pd.concat([df1, df2])
df = df.sort('date')

          date  market     value
0   2000-01-01    GOLD -1.361360
0   2000-01-01  SILVER  0.255830
1   2000-01-02  SILVER  0.196953
1   2000-01-02    GOLD  1.422454
2   2000-01-03    GOLD -0.827672
...

Möchte ich eine weitere Spalte hinzufügen, wie die 10d gleitenden Durchschnitt der Wert, für jeden Markt.

Gibt es eine einfache df.groupby('market').??? dies erreichen? Oder muss ich die pivot-Tabelle zu Breite form geben, glatt streichen, jede Spalte, dann Schmelzen Sie wieder zurück?

InformationsquelleAutor jf328 | 2016-08-30



2 Replies
  1. 3

    Könnten Sie groupby/rolling/mean:

    result = (df.set_index('date')
                .groupby('market')['value']
                .rolling(10).mean()
                .unstack('market'))

    Erträge

    market          GOLD    SILVER
    date                          
    2000-01-01       NaN       NaN
    2000-01-02       NaN       NaN
    2000-01-03       NaN       NaN
    2000-01-04       NaN       NaN
    2000-01-05       NaN       NaN
    2000-01-06       NaN       NaN
    2000-01-07       NaN       NaN
    2000-01-08       NaN       NaN
    2000-01-09       NaN       NaN
    2000-01-10  0.310077  0.582063
    2000-01-11  0.312008  0.752218
    2000-01-12  0.151159  0.877230
    2000-01-13  0.213611  0.742156
    2000-01-14  0.440113  0.614720
    2000-01-15  0.551360  0.649967
    ...
    • Dann, wenn Sie wollen, mischen Sie Sie in einer einzigen Spalte: df['avg'] = avg.GOLD.where(df.market == 'GOLD', avg.SILVER).
  2. 1

    Diese baut auf @unutbu Antwort, und fügt die Ergebnisse zurück an den ursprünglichen dataframe wie eine neue Spalte.

    result = df.set_index('date').groupby('market')['value'].rolling(10).mean()

    Nun, wenn df sortiert nach market ersten und dann date sollten die Ergebnisse synchron, und wir können nur weisen wieder die Werte

    df.sort_values(['market','date'], inplace = True)
    df['value10d_1'] = result.values

    Jedoch, wenn Sie paranoid sind ich bin merge geben sollte Frieden des Geistes,

    df = pd.merge(df, result.reset_index().rename(columns = {'value':'value10d_2'}), on = ['market','date'])
    
    df['value10d_1'] - df['value10d_2'] # all 0

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.