Pandas: BUG : groupby.pct_change ()κ°€ Pandas 0.23.0μ—μ„œ μ œλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έλ£Ήν™”λŠ” λ¬΄μ‹œλ©λ‹ˆλ‹€.

에 λ§Œλ“  2018λ…„ 05μ›” 25일  Β·  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
운영체제 : Darwin
OS 릴리슀 : 17.5.0
컴퓨터 : x86_64
ν”„λ‘œμ„Έμ„œ : i386
byteorder : 쑰금
LC_ALL : en_US.UTF-8
LANG : en_US.UTF-8
둜컬 : en_US.UTF-8

νŒλ‹€ : 0.23.0
pytest : 3.2.1
핍 : 10.0.1
setuptools : 36.5.0.post20170921
사이 톀 : 0.26.1
numpy : 1.14.3
scipy : 0.19.1
pyarrow : μ—†μŒ
xarray : μ—†μŒ
IPython : 6.1.0
μŠ€ν•‘ν¬μŠ€ : 1.6.3
νŒ¨μ‹œ : 0.4.1
dateutil : 2.6.1
pytz : 2018.3
blosc : μ—†μŒ
병λͺ© ν˜„μƒ : 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
sqlalchemy : 1.1.13
pymysql : μ—†μŒ
psycopg2 : μ—†μŒ
jinja2 : 2.9.6
s3fs : μ—†μŒ
fastparquet : μ—†μŒ
pandas_gbq : μ—†μŒ
pandas_datareader : μ—†μŒ

Bug Groupby

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이에 λŒ€ν•œ ν•΄κ²° 방법은 apply μž…λ‹ˆλ‹€. μ΄λ ‡κ²Œν•˜λ©΄ μ›ν•˜λŠ” κ²°κ³Όκ°€ μƒμ„±λ©λ‹ˆλ‹€.

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

λͺ¨λ“  4 λŒ“κΈ€

~ 3944 ν–‰μ—μ„œ groupby.py의 pct_change ν•¨μˆ˜κ°€ μ œλŒ€λ‘œ κ΅¬ν˜„λ˜μ§€ μ•ŠλŠ” 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μž¬μ •μ˜ν•˜λŠ” λ©”μ„œλ“œλŠ” 데이터 ν”„λ ˆμž„μ— λŒ€ν•΄ μ μ ˆν•˜κ²Œ κ΅¬ν˜„ν•©λ‹ˆλ‹€. λ‚˜λŠ” 이것이 μΉ˜λ£Œν•˜κΈ°μ— 비ꡐ적 κ°„λ‹¨ν•΄μ•Όν•œλ‹€κ³  μƒκ°ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.
λ‚˜λŠ” 이것을 μœ„ν•΄ PR에 균열을 κ°€μ§ˆ 것이닀. μ΄μ „μ—λŠ” νŒ¬λ”μ— κΈ°μ—¬ν•œ 적이 μ—†μ§€λ§Œ μ μ‹œμ— μ™„λ£Œ ν•  수 μžˆλŠ”μ§€ μ‚΄νŽ΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

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 λ“±κΈ‰