Python – выравнивание временных рядов и функции «на сегодняшний день»

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

Предыдущая Продажа той же корзины (если есть); Продажа Подсчет текущей корзины; Среднее значение для текущей корзины (если доступно); Максимальное значение для текущей корзины (если доступно)

Basket Sale Date PrevSale SaleCount MeanToDate MaxToDate 88 $15 3/01/2012 1 88 $30 11/02/2012 $15 2 $23 $30 88 $16 16/08/2012 $30 3 $20 $30 123 $90 18/06/2012 1 477 $77 19/08/2012 1 477 $57 11/12/2012 $77 2 $67 $77 566 $90 6/07/2012 1 

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

    Это должно сделать трюк:

     from pandas import concat from pandas.stats.moments import expanding_mean, expanding_count def handler(grouped): se = grouped.set_index('Date')['Sale'].sort_index() # se is the (ordered) time series of sales restricted to a single basket # we can now create a dataframe by combining different metrics # pandas has a function for each of the ones you are interested in! return concat( { 'MeanToDate': expanding_mean(se), # cumulative mean 'MaxToDate': se.cummax(), # cumulative max 'SaleCount': expanding_count(se), # cumulative count 'Sale': se, # simple copy 'PrevSale': se.shift(1) # previous sale }, axis=1 ) # we then apply this handler to all the groups and pandas combines them # back into a single dataframe indexed by (Basket, Date) # we simply need to reset the index to get the shape you mention in your question new_df = df.groupby('Basket').apply(handler).reset_index() 

    Здесь вы можете узнать больше об группировании / агрегации.