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函数应用于每个组。 但是,将groupbypct_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()

安装的版本


提交:无
的Python:3.6.3.final.0
python位:64
操作系统:Darwin
操作系统版本:17.5.0
机器:x86_64
处理器:i386
字节序:小
LC_ALL:en_US.UTF-8
朗:en_US.UTF-8
本地电话:en_US.UTF-8

熊猫:0.23.0
pytest的:3.2.1
点:10.0.1
setuptools:36.5.0.post20170921
Cython: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上谈一谈。 尽管我以前没有为熊猫做过贡献,所以我们将看看我是否能够及时完成。

当您反向移动时,沿着这些方向发现了一些东西,因此

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 等级