Скажем, у меня есть кадр данных с тремя столбцами: Date, Ticker, Value (без индекса, по крайней мере, для начала). У меня много дат и много тикеров, но каждый набор (ticker, date)
уникален. (Но, очевидно, одна и та же дата будет отображаться во многих строках, так как она будет там для нескольких тикеров, и один и тот же тикер появится в нескольких строках, так как он будет там для многих дат.)
Первоначально мои строки в определенном порядке, но не отсортированы ни по одному из столбцов.
Я хотел бы вычислить первые отличия (ежедневные изменения) каждого тикера (упорядоченные по дате) и поместить их в новый столбец в моем фреймворке. Учитывая этот контекст, я не могу просто
df['diffs'] = df['value'].diff()
поскольку соседние строки не принадлежат одному тикеру. Сортировка:
df = df.sort(['ticker', 'date'])
df['diffs'] = df['value'].diff()
не решает проблему, потому что будут "границы". То есть после этого сортировки последнее значение для одного тикера будет превышать первое значение для следующего тикера. И тогда вычислительные различия будут иметь значение между двумя тикерами. Я не хочу этого. Я хочу, чтобы самая ранняя дата каждого тикера завершилась с NaN
в столбце diff.
Это кажется очевидным временем для использования groupby
, но по какой-то причине я не могу заставить его работать правильно. Чтобы быть ясным, я хотел бы выполнить следующий процесс:
- Группировать строки на основе их
ticker
- В каждой группе сортируйте строки по
date
- В каждой сортированной группе вычисляйте различия столбца
value
- Поместите эти различия в исходный блок данных в новый столбец
diffs
(в идеале оставляя исходный порядок данных в такте.)
Я должен представить, что это однострочный. Но чего мне не хватает?
Редактировать в 21:00 2013-12-17
Хорошо... некоторый прогресс. Я могу сделать следующее, чтобы получить новый фреймворк данных:
result = df.set_index(['ticker', 'date'])\
.groupby(level='ticker')\
.transform(lambda x: x.sort_index().diff())\
.reset_index()
Но если я понимаю механику groupby, мои строки теперь будут отсортированы сначала на ticker
, а затем на date
. Это верно? Если это так, мне нужно выполнить слияние, чтобы добавить столбец различий (в настоящее время в result['current']
к исходному файловому кадру df
?