Я пытаюсь использовать функцию прокрутки pandas.DataFrame.rolling.apply()
для нескольких столбцов. Python версия 3.7, pandas - 1.0.2.
import pandas as pd
#function to calculate
def masscenter(x):
print(x); # for debug purposes
return 0;
#simple DF creation routine
df = pd.DataFrame( [['02:59:47.000282', 87.60, 739],
['03:00:01.042391', 87.51, 10],
['03:00:01.630182', 87.51, 10],
['03:00:01.635150', 88.00, 792],
['03:00:01.914104', 88.00, 10]],
columns=['stamp', 'price','nQty'])
df['stamp'] = pd.to_datetime(df2['stamp'], format='%H:%M:%S.%f')
df.set_index('stamp', inplace=True, drop=True)
'stamp'
является монотонным c и уникальным, 'price'
является двойным и не содержит NaN, 'nQty'
является целым числом и также не содержит NaN.
Итак, мне нужно вычислить «центр масс», т. е. sum(price*nQty)/sum(nQty)
.
Что я пробовал до сих пор:
df.apply(masscenter, axis = 1)
masscenter
вызывается 5 раз с одной строкой, и вывод будет выглядеть как
price 87.6
nQty 739.0
Name: 1900-01-01 02:59:47.000282, dtype: float64
Это желательный вход для masscenter
, потому что я могу легко получить доступ к price
и nQty
используя x[0], x[1]
. Тем не менее, я застрял с rolling.apply()
Чтение документов DataFrame.rolling () и roll.apply () Я предполагал, что с использованием 'axis'
в rolling()
и 'raw'
в apply
человек достигает подобного поведения. Наивный подход
rol = df.rolling(window=2)
rol.apply(masscenter)
печатает строку за строкой (увеличивая количество строк до размера окна)
stamp
1900-01-01 02:59:47.000282 87.60
1900-01-01 03:00:01.042391 87.51
dtype: float64
затем
stamp
1900-01-01 02:59:47.000282 739.0
1900-01-01 03:00:01.042391 10.0
dtype: float64
Итак, столбцы передаются до masscenter
отдельно (ожидается).
К сожалению, в документации почти нет информации о 'axis'
. Однако следующий вариант был, очевидно,
rol = df.rolling(window=2, axis = 1)
rol.apply(masscenter)
Никогда не вызывает masscenter
и вызывает ValueError in rol.apply(..)
> Length of passed values is 1, index implies 5
Я признаю, что я не уверен в параметре 'axis'
и как это работает из-за отсутствия документации. Это первая часть вопроса: Что здесь происходит? Как правильно использовать «ось»? Для чего он предназначен?
Конечно, ранее были ответы, а именно:
Как применить функцию к двум столбцам- of- pandas -dataframe
Работает для всего DataFrame, не Rolling.
Как вызвать- pandas -rolling-apply-with-parameters- from-множественный столбец
Ответ предлагает написать мою собственную функцию прокрутки, но виновник для меня тот же, что и в комментариях : что, если нужно использовать размер окна смещения ( например, '1T'
) для неоднородных временных меток?
Мне не нравится идея заново изобретать колесо с нуля. Также я хотел бы использовать pandas для всего, чтобы предотвратить несоответствие между наборами, полученными из pandas и «самодельным броском». Есть другой ответ на этот вопрос, предлагающий заполнить фрейм данных отдельно и рассчитать все, что мне нужно, но это не сработает: размер хранимых данных будет огромен. Та же самая идея, представленная здесь:
Apply-Rolling-function-on- pandas -dataframe-with-множественные аргументы
Еще один вопрос и ответ, опубликованный здесь
Pandas -using-Rolling-On-Multi-Columns
Это хорошо и ближе всего к моей проблеме, но опять же, нет возможности использовать размеры смещенного окна (window = '1T'
).
Некоторые ответы были заданы до того, как вышла pandas 1.0, и, учитывая, что документы могли бы быть намного лучше, я надеюсь, что теперь возможно пролистывать несколько столбцов одновременно.
Вторая часть вопрос в следующем: Есть ли возможность одновременно пролистывать несколько столбцов, используя pandas 1.0.x со смещением размера окна?
Большое спасибо.