2017-02-11 6 views
4

Я новичок в Pandas, и в качестве упражнения я перемещаю старый код/​​решения, чтобы учиться на нем. В этом случае я пытаюсь вычислить синтетический индекс цен на товары, который до этого был рассчитан в SQL.Расчет ежедневных агрегатов на пандах с пользовательской функцией

Это данные, которые я имею в dataframe:

id weight  date  price 
0 1 0.002796 2005-11-15 0.998298 
1 1 0.002796 2005-11-16 1.014242 
2 1 0.002796 2005-11-17 1.016452 
3 1 0.002796 2005-11-18 1.026396 
4 1 0.002796 2005-11-19 1.026047 
5 1 0.002796 2005-11-20 1.024285 
6 1 0.002796 2005-11-21 1.018764 
7 1 0.002796 2005-11-22 1.033175 
8 1 0.002796 2005-11-23 1.058509 
9 1 0.002796 2005-11-24 1.061231 
10 1 0.002796 2005-11-25 1.058137 
11 1 0.002796 2005-11-26 0.999380 
12 1 0.002796 2005-11-27 0.990504 
13 1 0.002796 2005-11-28 0.993764 
14 1 0.002796 2005-11-29 0.978754 
15 1 0.002796 2005-11-30 0.992070 
...  ...  ...  ...  ... 
4085 1 0.002796 2017-01-21 0.857420 
4086 1 0.002796 2017-01-22 0.848195 
4087 1 0.002796 2017-01-23 0.791784 
4088 1 0.002796 2017-01-24 0.846603 
4089 1 0.002796 2017-01-25 0.878104 
4090 1 0.002796 2017-01-26 0.806651 
4091 1 0.002796 2017-01-27 0.849316 
4092 1 0.002796 2017-01-28 0.826550 
4093 1 0.002796 2017-01-29 0.848651 
4094 1 0.002796 2017-01-30 0.829643 
4095 1 0.002796 2017-01-31 0.837094 
4096 1 0.002796 2017-02-01 0.846572 
4097 1 0.002796 2017-02-02 0.800163 
4098 1 0.002796 2017-02-03 0.820356 
4099 1 0.002796 2017-02-04 0.818924 
4100 1 0.002796 2017-02-05 0.822157 
4101 1 0.002796 2017-02-06 0.787123 
4102 1 0.002796 2017-02-07 0.796264 
4103 1 0.002796 2017-02-08 0.797241 
4104 1 0.002796 2017-02-09 0.818499 
4105 1 0.002796 2017-02-10 0.810928 

Синтетический индекс рассчитывается ежедневно возвращается, будучи возврат в течение дня:

Rt = (Price_day/Price_day_before) - 1

Я читал о пандах, временных рядах и т. Д., Но я изо всех сил стараюсь понять конкретную операцию, чтобы выполнить здесь; это прокатка? Как получить данные для заданной даты и даты раньше?

ответ

2

IIUC вы хотите использовать pct_change() метод:

In [196]: x 
Out[196]: 
    id weight  date  price 
0 1 0.002796 2005-11-15 0.998298 
1 1 0.002796 2005-11-16 1.014242 
2 1 0.002796 2005-11-17 1.016452 
3 1 0.002796 2005-11-18 1.026396 
4 1 0.002796 2005-11-19 1.026047 
5 1 0.002796 2005-11-20 1.024285 
6 1 0.002796 2005-11-21 1.018764 
7 1 0.002796 2005-11-22 1.033175 
8 1 0.002796 2005-11-23 1.058509 
9 1 0.002796 2005-11-24 1.061231 
10 1 0.002796 2005-11-25 1.058137 
11 1 0.002796 2005-11-26 0.999380 
12 1 0.002796 2005-11-27 0.990504 
13 1 0.002796 2005-11-28 0.993764 
14 1 0.002796 2005-11-29 0.978754 
15 1 0.002796 2005-11-30 0.992070 

In [197]: x['Rt'] = x['price'].pct_change() 

In [198]: x 
Out[198]: 
    id weight  date  price  Rt 
0 1 0.002796 2005-11-15 0.998298  NaN 
1 1 0.002796 2005-11-16 1.014242 0.015971 
2 1 0.002796 2005-11-17 1.016452 0.002179 
3 1 0.002796 2005-11-18 1.026396 0.009783 
4 1 0.002796 2005-11-19 1.026047 -0.000340 
5 1 0.002796 2005-11-20 1.024285 -0.001717 
6 1 0.002796 2005-11-21 1.018764 -0.005390 
7 1 0.002796 2005-11-22 1.033175 0.014146 
8 1 0.002796 2005-11-23 1.058509 0.024521 
9 1 0.002796 2005-11-24 1.061231 0.002572 
10 1 0.002796 2005-11-25 1.058137 -0.002915 
11 1 0.002796 2005-11-26 0.999380 -0.055529 
12 1 0.002796 2005-11-27 0.990504 -0.008882 
13 1 0.002796 2005-11-28 0.993764 0.003291 
14 1 0.002796 2005-11-29 0.978754 -0.015104 
15 1 0.002796 2005-11-30 0.992070 0.013605 

другое решение (используя shift() метод):

In [199]: x['Rt2'] = x['price']/x['price'].shift() - 1 

In [200]: x 
Out[200]: 
    id weight  date  price  Rt  Rt2 
0 1 0.002796 2005-11-15 0.998298  NaN  NaN 
1 1 0.002796 2005-11-16 1.014242 0.015971 0.015971 
2 1 0.002796 2005-11-17 1.016452 0.002179 0.002179 
3 1 0.002796 2005-11-18 1.026396 0.009783 0.009783 
4 1 0.002796 2005-11-19 1.026047 -0.000340 -0.000340 
5 1 0.002796 2005-11-20 1.024285 -0.001717 -0.001717 
6 1 0.002796 2005-11-21 1.018764 -0.005390 -0.005390 
7 1 0.002796 2005-11-22 1.033175 0.014146 0.014146 
8 1 0.002796 2005-11-23 1.058509 0.024521 0.024521 
9 1 0.002796 2005-11-24 1.061231 0.002572 0.002572 
10 1 0.002796 2005-11-25 1.058137 -0.002915 -0.002915 
11 1 0.002796 2005-11-26 0.999380 -0.055529 -0.055529 
12 1 0.002796 2005-11-27 0.990504 -0.008882 -0.008882 
13 1 0.002796 2005-11-28 0.993764 0.003291 0.003291 
14 1 0.002796 2005-11-29 0.978754 -0.015104 -0.015104 
15 1 0.002796 2005-11-30 0.992070 0.013605 0.013605 
+0

Ничего себе, даже не знаю pct_change(). Документация не очень хороша в отношении точного расчета, но результаты согласуются с самой операцией. – mydaemon

+0

Я даю вам лучший ответ, как только вы добавили shift(), это именно та операция, которую я имел в виду. Superb! – mydaemon

+0

@mydaemon, рад, что я мог помочь :) – MaxU

3

код:

df['return'] = df['price']/df['price'].shift(1) - 1

функция df.shift(1) я n python используется как LEAD() или LEG() функция в SQL.

2

Чтобы создать синтетический индекс, начиная с 100

df['PrcRtnIdx'] = df.price.pct_change().fillna(0).add(1).cumprod().mul(100) 

print(df) 

    id weight  date  price PrcRtnIdx 
0 1 0.002796 2005-11-15 0.998298 100.000000 
1 1 0.002796 2005-11-16 1.014242 101.597118 
2 1 0.002796 2005-11-17 1.016452 101.818495 
3 1 0.002796 2005-11-18 1.026396 102.814590 
4 1 0.002796 2005-11-19 1.026047 102.779631 
5 1 0.002796 2005-11-20 1.024285 102.603131 
6 1 0.002796 2005-11-21 1.018764 102.050089 
7 1 0.002796 2005-11-22 1.033175 103.493646 
8 1 0.002796 2005-11-23 1.058509 106.031365 
9 1 0.002796 2005-11-24 1.061231 106.304029 
10 1 0.002796 2005-11-25 1.058137 105.994102 
11 1 0.002796 2005-11-26 0.999380 100.108384 
12 1 0.002796 2005-11-27 0.990504 99.219271 
13 1 0.002796 2005-11-28 0.993764 99.545827 
14 1 0.002796 2005-11-29 0.978754 98.042268 
15 1 0.002796 2005-11-30 0.992070 99.376138 

ответа на @mydaemon

df['PrcRtnIdx'] = \ 
    df.groupby('id').price.apply(
     lambda x: x.pct_change().fillna(0).add(1).cumprod().mul(100)) 
+0

Вы, сэр, широко открыли глаза: -O. Итак, это делает весь расчет каждого синтетического индекса для P0 = 100 ?? Как насчет идентификатора продукта? – mydaemon

+0

@mydaemon см. Редактирование. – piRSquared

+0

Превосходно, спасибо! – mydaemon