>>>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 : μμ
~ 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())
κ°μ₯ μ μ©ν λκΈ
μ΄μ λν ν΄κ²° λ°©λ²μ
apply
μ λλ€. μ΄λ κ²νλ©΄ μνλ κ²°κ³Όκ° μμ±λ©λλ€.df['%_groupby'] = df.groupby('grp')['a'].apply(lambda x: x.pct_change())