2013-03-18 16 views
5

Mam zestaw danych z następującymi trzema pierwszymi kolumnami. Dołącz identyfikator koszyka (unikatowy identyfikator), kwotę sprzedaży (w dolarach) i datę transakcji. Chcę obliczyć następujące kolumna dla każdego wiersza zestawu danych i chciałbym to w Pythonie.Python - wyrównanie szeregów czasowych i funkcje "na dzień"

Poprzednia sprzedaż tego samego koszyka (jeśli istnieje); Liczba sprzedaży do tej pory dla bieżącego koszyka; Do tej pory dla bieżącego koszyka (jeśli jest dostępny); MAX Data dla bieżącej kosza (jeśli są dostępne)

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  

Jestem całkiem nowy w Pythonie, i naprawdę ciężko będzie znaleźć coś go w fantazyjny sposób. Posortowałem dane (jak wyżej) według BasketID i Date, dzięki czemu mogę uzyskać wcześniejszą sprzedaż hurtową, przesuwając ją o jeden dla każdego pojedynczego koszyka. Nie ma wskazówki, jak uzyskać MeanToDate i MaxToDate w skuteczny sposób, z wyjątkiem zapętlenia ... jakichkolwiek pomysłów?

+0

Jaki jest format bieżącego "zestawu danych" (trzy pierwsze kolumny)? Czy jest to plik czy używasz obecnie jakiejś struktury danych? – askewchan

+0

Przepraszam, zapomniałem wspomnieć. pochodzi z pliku tekstowego, ale jest przechowywany w ramce danych pandy. –

Odpowiedz

4

To powinno załatwić sprawę:

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() 

można przeczytać więcej na temat grupy/agregowania here.

+0

Skumulowana funkcja jest po prostu niesamowita - dzięki! Po co zakładać, że nie ma więcej niż jednej transakcji na kosz na dzień? –

+0

Jeśli indeks nie jest unikalny, 'concat' nie będzie w stanie poprawnie ustawić kolumn, ponieważ będzie wiele wartości dla niektórych indeksów, jeśli ma to sens. – mtth

+0

ma sens ... i niestety istnieje wiele dat dla tego samego koszyka. Kiedy sugerujesz użycie opcji resample, czy jest to w ramach "handler'a" lub wcześniej dla ramki danych? Mam nadzieję, że pytałem o coś, co ma sens, ponieważ nie jest do końca jasne, co faktycznie robi resample (trzeba najpierw wrócić do domu!). –

Powiązane problemy