Вычисление различий в Pandas после использования groupby приводит к неожиданному результату

у меня есть датафрейм, и яЯ пытаюсь добавить столбец последовательных различий к нему. Я нашел метод, который мне очень нравится (и хорошо обобщает для моего случая использования). Но я заметил одну странную вещь на этом пути. Можете ли вы помочь мне разобраться в этом?

Вот некоторые данные, которые имеют правильную структуру (код по образцу ответаВот):

import pandas as pd
import numpy as np
import random
from itertools import product

random.seed(1)       # so you can play along at home
np.random.seed(2)    # ditto

# make a list of dates for a few periods
dates = pd.date_range(start='2013-10-01', periods=4).to_native_types()
# make a list of tickers
tickers = ['ticker_%d' % i for i in range(3)]
# make a list of all the possible (date, ticker) tuples
pairs = list(product(dates, tickers))
# put them in a random order
random.shuffle(pairs)
# exclude a few possible pairs
pairs = pairs[:-3]
# make some data for all of our selected (date, ticker) tuples
values = np.random.rand(len(pairs))

mydates, mytickers = zip(*pairs)
data = pd.DataFrame({'date': mydates, 'ticker': mytickers, 'value':values})

Ок, отлично. Это дает мне такой кадр:

     date        ticker      value
0    2013-10-03  ticker_2    0.435995
1    2013-10-04  ticker_2    0.025926
2    2013-10-02  ticker_1    0.549662
3    2013-10-01  ticker_0    0.435322
4    2013-10-02  ticker_2    0.420368
5    2013-10-03  ticker_0    0.330335
6    2013-10-04  ticker_1    0.204649
7    2013-10-02  ticker_0    0.619271
8    2013-10-01  ticker_2    0.299655

Моя цель - добавить новый столбец к этому фрейму данных, который будет содержать последовательные изменения. Данные должны быть для того, чтобы сделать это, но порядок и различие должны быть сделаны "тикер-накрест» так что пробелы в другом тикерене вызывает NA 's для данного тикера. Я хочу сделать это, не нарушая фрейм данных любым другим способом (т.е. я не хочу, чтобы результирующий фрейм данных переупорядочивался в зависимости от того, что было необходимо для выполнения различий). Следующий код работает:

data1 = data.copy() #let's leave the original data alone for later experiments
data1.sort(['ticker', 'date'], inplace=True)
data1['diffs'] = data1.groupby(['ticker'])['value'].transform(lambda x: x.diff())
data1.sort_index(inplace=True)
data1

и возвращает:

     date        ticker      value       diffs
0    2013-10-03  ticker_2    0.435995    0.015627
1    2013-10-04  ticker_2    0.025926   -0.410069
2    2013-10-02  ticker_1    0.549662    NaN
3    2013-10-01  ticker_0    0.435322    NaN
4    2013-10-02  ticker_2    0.420368    0.120713
5    2013-10-03  ticker_0    0.330335   -0.288936
6    2013-10-04  ticker_1    0.204649   -0.345014
7    2013-10-02  ticker_0    0.619271    0.183949
8    2013-10-01  ticker_2    0.299655    NaN

Все идет нормально. Если я заменим среднюю строку выше более кратким кодом, показанным здесь, все будет работать:

data2 = data.copy()
data2.sort(['ticker', 'date'], inplace=True)
data2['diffs'] = data2.groupby('ticker')['value'].diff()
data2.sort_index(inplace=True)
data2

Быстрая проверка показывает, что, на самом деле,data1 равноdata2, Однако, если я сделаю это:

data3 = data.copy()
data3.sort(['ticker', 'date'], inplace=True)
data3['diffs'] = data3.groupby('ticker')['value'].transform(np.diff)
data3.sort_index(inplace=True)
data3

Я получаю странный результат:

     date        ticker     value       diffs
0    2013-10-03  ticker_2    0.435995    0
1    2013-10-04  ticker_2    0.025926   NaN
2    2013-10-02  ticker_1    0.549662   NaN
3    2013-10-01  ticker_0    0.435322   NaN
4    2013-10-02  ticker_2    0.420368   NaN
5    2013-10-03  ticker_0    0.330335    0
6    2013-10-04  ticker_1    0.204649   NaN
7    2013-10-02  ticker_0    0.619271   NaN
8    2013-10-01  ticker_2    0.299655    0

Какие'здесь происходит? Когда вы звоните.diff метод объекта Pandas, это не просто вызовnp.diff? Я знаю тамсdiff метод наDataFrame класс, но я не могне могу понять, как передать этоtransform безlambda Синтаксис функции, которую я использовал, чтобы сделатьdata1 Работа. Я что-то пропустил? Почемуdiffs столбец вdata3 чокнутый? Как я могу позвонить Пандам?diff метод в пределахtransform без необходимости писатьlambda сделать это?

Ответы на вопрос(2)

Ваш ответ на вопрос