Pandas: BUG: لا يعمل groupby.pct_change () بشكل صحيح في Pandas 0.23.0. تم تجاهل التجميع.

تم إنشاؤها على ٢٥ مايو ٢٠١٨  ·  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
byteorder: قليلا
LC_ALL: ar_US.UTF-8
LANG: en_US.UTF-8
الموقع: en_US.UTF-8

الباندا: 0.23.0
بيتيست: 3.2.1
النقطة: 10.0.1
أدوات الإعداد: 36.5.0.post20170921
سايثون: 0.26.1
numpy: 1.14.3
scipy: 0.19.1
بيارو: لا شيء
xarray: لا شيء
IPython: 6.1.0
أبو الهول: 1.6.3
باتسي: 0.4.1
داتوتيل: ​​2.6.1
بيتز: 2018.3.2
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: لا شيء
فاستباركيه: لا شيء
pandas_gbq: لا شيء
pandas_datareader: لا شيء

Bug Groupby

التعليق الأكثر فائدة

الحل البديل لهذا هو استخدام apply . يجب أن ينتج عن ذلك النتيجة المرجوة:

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

ال 4 كومينتر

أستطيع أن أرى وظيفة pct_change في groupby.py على السطر ~ 3944 لا تنفذ ذلك بشكل صحيح. في حين أن الطريقة التي تتجاوزها تنفذها بشكل صحيح لإطار البيانات. أود أن أعتقد أن هذا يجب أن يكون علاجًا مباشرًا نسبيًا.
سآخذ خطوة في العلاقات العامة لهذا الغرض. على الرغم من أنني لم أساهم في الباندا من قبل ، لذلك سنرى ما إذا كنت قادرًا على إكمالها في الوقت المناسب.

وجدت شيئًا ما على طول هذه الخطوط عندما تقوم بالتحول إلى الخلف

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 التقييمات