Предположим, у меня есть такой фрейм данных:
ticker MS AAPL
field price volume price volume
0 -0.861210 -0.319607 -0.855145 0.635594
1 -1.986693 -0.526885 -1.765813 1.696533
2 -0.154544 -1.152361 -1.391477 -2.016119
3 0.621641 -0.109499 0.143788 -0.050672
сгенерировано из следующих кодов, пожалуйста, игнорируйте числа, которые приведены в качестве примеров
columns = pd.MultiIndex.from_tuples([('MS', 'price'), ('MS', 'volume'), ('AAPL', 'price'), ('AAPL', 'volume')], names=['ticker', 'field'])
data = np.random.randn(4, 4)
df = pd.DataFrame(data, columns=columns)
Теперь я хотел бы вычислить pct_change () или любую функцию, определенную пользователем в каждом ценовом столбце, и добавить новый столбец на уровне поля, чтобы сохранить результат.
Я знаю, как сделать это элегантно, если данные представляют собой Panel, которая устарела начиная с версии 0.20. Предположим, что на оси 3 панели указаны дата, тикер и поле:
p[:,:, 'ret'] = p[:,:,'price'].pct_change()
Вот и все. Но я не нашел подобного элегантного способа сделать это с несколькими индексными фреймами данных.