>>>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)
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
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
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
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())
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())