Pandas: BUG: groupby.pct_change () tidak bekerja dengan baik di Pandas 0.23.0. Pengelompokan diabaikan.

Dibuat pada 25 Mei 2018  ·  4Komentar  ·  Sumber: pandas-dev/pandas

Contoh Kode

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

Deskripsi masalah

Ketika ada grup yang berbeda dalam kerangka data, dengan menggunakan groupby diharapkan fungsi pct_change diterapkan pada setiap grup. Namun, menggabungkan groupby dengan pct_change tidak memberikan hasil yang benar.

Keluaran:

     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

Output yang Diharapkan

     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

Keluaran pd.show_versions()

VERSI TERPASANG


commit: Tidak ada
python: 3.6.3.final.0
python-bits: 64
OS: Darwin
Rilis OS: 17.5.0
mesin: x86_64
prosesor: i386
byteorder: sedikit
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LOCALE: en_US.UTF-8

panda: 0.23.0
pytest: 3.2.1
pip: 10.0.1
setuptools: 36.5.0.post20170921
Cython: 0.26.1
numpy: 1.14.3
scipy: 0.19.1
pyarrow: Tidak ada
xarray: Tidak ada
IPython: 6.1.0
sphinx: 1.6.3
patsy: 0.4.1
dateutil: 2.6.1
pytz: 2018.3
blosc: Tidak ada
kemacetan: 1.2.1
tabel: 3.4.2
numexpr: 2.6.2
bulu: Tidak ada
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: Tidak ada
psycopg2: Tidak ada
jinja2: 2.9.6
s3fs: Tidak ada
fastparquet: Tidak ada
pandas_gbq: Tidak ada
pandas_datareader: Tidak ada

Bug Groupby

Komentar yang paling membantu

Solusi untuk ini adalah menggunakan apply . Ini harus menghasilkan hasil yang diinginkan:

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

Semua 4 komentar

Saya dapat melihat fungsi pct_change di groupby.py on line ~ 3944 tidak menerapkan ini dengan benar. Sedangkan metode yang ditimpanya mengimplementasikannya dengan benar untuk dataframe. Menurut saya, ini relatif mudah untuk diperbaiki.
Saya akan mengambil celah di PR untuk ini. Meskipun saya belum pernah berkontribusi pada panda sebelumnya, jadi kita akan melihat apakah saya dapat menyelesaikannya tepat waktu.

Menemukan sesuatu di sepanjang garis ini ketika Anda menggesernya secara terbalik

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)

Metode alternatif memberi Anda keluaran yang benar daripada menggeser perhitungan.

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

Solusi untuk ini adalah menggunakan apply . Ini harus menghasilkan hasil yang diinginkan:

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat