>>>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: لا شيء
أستطيع أن أرى وظيفة pct_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())
التعليق الأكثر فائدة
الحل البديل لهذا هو استخدام
apply
. يجب أن ينتج عن ذلك النتيجة المرجوة:df['%_groupby'] = df.groupby('grp')['a'].apply(lambda x: x.pct_change())