Pandas: BUG: groupby.pct_change () funktioniert in Pandas 0.23.0 nicht richtig. Die Gruppierung wird ignoriert.

Erstellt am 25. Mai 2018  ·  4Kommentare  ·  Quelle: pandas-dev/pandas

Codebeispiel

>>>import pandas as pd
>>>import numpy as np

>>>df = pd.DataFrame(data=np.random.rand(8, 1), columns={'a'})
>>>df['grp']=1
>>>df.loc[::2, 'grp']=2
>>>df['%_groupby']=df.groupby('grp')['a'].pct_change()
>>>df['%_shift']=df.groupby('grp')['a'].shift(0)/df.groupby('grp')['a'].shift(1)-1
>>>print(df)

Problembeschreibung

Wenn sich in einem Datenrahmen verschiedene Gruppen befinden, wird bei Verwendung von groupby erwartet, dass die Funktion pct_change auf jede Gruppe angewendet wird. Das Kombinieren von groupby mit pct_change jedoch nicht zum richtigen Ergebnis.

Ausgabe:

     a  grp  %_groupby   %_shift
0  1.0    2        NaN       NaN
1  1.1    1   0.100000       NaN
2  1.2    2   0.090909  0.200000
3  1.3    1   0.083333  0.181818
4  1.4    2   0.076923  0.166667
5  1.5    1   0.071429  0.153846
6  1.6    2   0.066667  0.142857
7  1.7    1   0.062500  0.133333

Erwartete Ausgabe

     a  grp  %_groupby   %_shift
0  1.0    2        NaN       NaN
1  1.1    1        NaN       NaN
2  1.2    2   0.200000  0.200000
3  1.3    1   0.181818  0.181818
4  1.4    2   0.166667  0.166667
5  1.5    1   0.153846  0.153846
6  1.6    2   0.142857  0.142857
7  1.7    1   0.133333  0.133333

Ausgabe von pd.show_versions()

INSTALLIERTE VERSIONEN


Festschreiben: Keine
Python: 3.6.3.final.0
Python-Bits: 64
OS: Darwin
Betriebssystemversion: 17.5.0
Maschine: x86_64
Prozessor: i386
Byteorder: wenig
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LOCALE: en_US.UTF-8

Pandas: 0,23,0
Pytest: 3.2.1
pip: 10.0.1
setuptools: 36.5.0.post20170921
Cython: 0,26,1
Anzahl: 1.14.3
scipy: 0.19.1
Pyarrow: Keine
xarray: Keine
IPython: 6.1.0
Sphinx: 1.6.3
Patsy: 0.4.1
Datum: 2.6.1
Pytz: 2018.3
blosc: Keine
Engpass: 1.2.1
Tabellen: 3.4.2
numexpr: 2.6.2
Feder: Keine
matplotlib: 2.1.0
openpyxl: 2.4.8
xlrd: 1.1.0
xlwt: 1.2.0
xlsxwriter: 1.0.2
lxml: 4.1.1
bs4: 4.6.0
html5lib: 0,9999999
sqlalchemy: 1.1.13
pymysql: Keine
psycopg2: Keine
jinja2: 2.9.6
s3fs: Keine
Fastparquet: Keine
pandas_gbq: Keine
pandas_datareader: Keine

Bug Groupby

Hilfreichster Kommentar

Eine Problemumgehung hierfür ist die Verwendung von apply . Dies sollte das gewünschte Ergebnis liefern:

df['%_groupby'] = df.groupby('grp')['a'].apply(lambda x: x.pct_change())

Alle 4 Kommentare

Ich kann sehen, dass die Funktion pct_change in groupby.py in Zeile ~ 3944 dies nicht richtig implementiert. Die überschriebene Methode implementiert sie ordnungsgemäß für einen Datenrahmen. Ich würde gerne denken, dass dies relativ einfach zu beheben sein sollte.
Ich werde dafür eine PR machen. Obwohl ich noch nie zu Pandas beigetragen habe, werden wir sehen, ob ich es rechtzeitig schaffen kann.

möglicherweise im Zusammenhang mit https://github.com/pandas-dev/pandas/issues/11811

Fand etwas in diese Richtung, wenn Sie so rückwärts schalten

import pandas_datareader.data as web
import pandas as pd

tickers = ['F','AAPL','NFLX','AMZN','GOOG']

df = pd.DataFrame()
for ticker in tickers:
    data = web.DataReader(ticker, 'iex', '2018-01-01', '2018-06-01')
    data['ticker'] = ticker
    df = df.append(data)

df = df.reset_index()
df['5_day_growth'] = df.groupby('ticker').close.pct_change(periods=-5)
df['5_day_growth_alt'] = df.groupby('ticker').close.pct_change(periods=5).shift(-5)

Die alternative Methode liefert eine korrekte Ausgabe, anstatt die Berechnung zu verschieben.

print(df[['date','ticker','close','5_day_growth', '5_day_growth_alt']].head(6))

          date ticker    close  5_day_growth  5_day_growth_alt
0  2018-01-02      F  12.1939     -0.032115          0.033181
1  2018-01-03      F  12.2903     -0.020717          0.021155
2  2018-01-04      F  12.5022     -0.013672          0.013862
3  2018-01-05      F  12.7141     -0.002268          0.002273
4  2018-01-08      F  12.6659      0.003820         -0.003805
5  2018-01-09      F  12.5985      0.073894         -0.068810

Eine Problemumgehung hierfür ist die Verwendung von apply . Dies sollte das gewünschte Ergebnis liefern:

df['%_groupby'] = df.groupby('grp')['a'].apply(lambda x: x.pct_change())

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen