Pandas: BUG: groupby.pct_change () рдкрдВрдбреЛрдВ рдореЗрдВ рдареАрдХ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ 0.23.0ред рд╕рдореВрд╣рди рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рдордИ 2018  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pandas-dev/pandas

рдХреЛрдб рдирдореВрдирд╛

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

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг

рдЬрдм рдХреЛрдИ рдбреЗрдЯрд╛рдлрд╝реНрд░реЗрдо рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдореВрд╣ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ groupby рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдореВрд╣ рдкрд░ pct_change рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, groupby pct_change рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред

рдЖрдЙрдЯрдкреБрдЯ:

     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() рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ

рд╕реНрдерд╛рдкрд┐рдд рд╕рдВрд╕реНрдХрд░рдг


рдкреНрд░рддрд┐рдмрджреНрдз: рдХреЛрдИ рдирд╣реАрдВ
рдЕрдЬрдЧрд░: 3.6.3.final.0
рдкрд╛рдпрдерди-рдмрд┐рдЯреНрд╕: 64
рдУрдПрд╕: рдбрд╛рд░реНрд╡рд┐рди
рдУрдПрд╕-рд░рд┐рд▓реАрдЬрд╝: 17.5.0
рдорд╢реАрди: x86_64
рдкреНрд░реЛрд╕реЗрд╕рд░: i386
рдмрд╛рдЗрдЯрдСрд░реНрдбрд░: рдереЛрдбрд╝рд╛
LC_ALL: en_US.UTF-8
рд▓реИрдВрдЧ: en_US.UTF-8
LOCALE: en_US.UTF-8

рдкрд╛рдВрдбрд╛: 0.23.0
pytest: 3.2.1
рдкрд╛рдЗрдк: 10.0.1
setuptools: 36.5.0.post20170921
рд╕рд╛рдЗрдерди: 0.26.1
рд╕реБрдиреНрди: 1.14.3
scipy: 0.19.1
рд╡реНрдпрдВрдЧреНрдп: рдХреЛрдИ рдирд╣реАрдВ
xarray: рдХреЛрдИ рдирд╣реАрдВ
рдЖрдИрдкреАрдереЙрди: 6.1.0
рд╕реНрдлрд┐рдВрдХреНрд╕: 1.6.3
patsy: 0.4.1
рджрд┐рдирд╛рдВрдХ: 2.6.1
pytz: 2018.3
рдмреНрд▓реЙрд╕реНрдХ: рдХреЛрдИ рдирд╣реАрдВ
рдЕрдбрд╝рдЪрди: 1.2.1
рдЯреЗрдмрд▓: 3.4.2
numexpr: 2.6.2
рдкрдВрдЦ: рдХреЛрдИ рдирд╣реАрдВ
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
рд╕реНрдХреНрд╡реИрд▓реНрд╕реАрдо: 1.1.13
pymysql: рдХреЛрдИ рдирд╣реАрдВ
рдорд╛рдирд╕ 2: рдХреЛрдИ рдирд╣реАрдВ
jinja2: 2.9.6
s3fs: рдХреЛрдИ рдирд╣реАрдВ
fastparquet: рдХреЛрдИ рдирд╣реАрдВ
pandas_gbq: рдХреЛрдИ рдирд╣реАрдВ
pandas_datareader: рдХреЛрдИ рдирд╣реАрдВ

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб apply рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

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

рд╕рднреА 4 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдореИрдВ pby_change рдлрд╝рдВрдХреНрд╢рди рдХреЛ groupby.py рдореЗрдВ рд▓рд╛рдЗрди ~ 3944 рдкрд░ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдЗрд╕реЗ рдареАрдХ рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЬрдмрдХрд┐ рдпрд╣ рд╡рд┐рдзрд┐ рдЗрд╕реЗ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреА рд╣реИ рдПрдХ рдбреЗрдЯрд╛рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдареАрдХ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрд╛рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдореЗрдВ рдПрдХ рджрд░рд╛рд░ рд▓реЗ рдЬрд╛рдКрдБрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдкрдВрдбреЛрдВ рдореЗрдВ рдпреЛрдЧрджрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдореИрдВ рдЗрд╕реЗ рд╕рдордп рдкрд░ рдкреВрд░рд╛ рдХрд░ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВред

рд╢рд╛рдпрдж https://github.com/pandas-dev/pandas/issues/11811 рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд

рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдорд┐рд▓рд╛ рдЬрдм рдЖрдк рд░рд┐рд╡рд░реНрд╕ рдореЗрдВ рд╢рд┐рдлреНрдЯ рдХрд░рддреЗ рд╣реИрдВ

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)

рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдЧрдгрдирд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕рд╣реА рдЖрдЙрдЯрдкреБрдЯ рджреЗрддреА рд╣реИред

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

рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб apply рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

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

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

ebran picture ebran  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

venuktan picture venuktan  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

swails picture swails  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jaradc picture jaradc  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

amelio-vazquez-reina picture amelio-vazquez-reina  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ