2013-03-18 31 views
5

Tôi có một tập dữ liệu với ba cột đầu tiên sau đây. Bao gồm ID giỏ hàng (số nhận dạng duy nhất), Số tiền bán (đô la) và ngày giao dịch. Tôi muốn tính toán cột sau cho mỗi hàng của tập dữ liệu, và tôi muốn nó trong Python.Python - sắp xếp chuỗi thời gian và các chức năng "đến nay"

Bán trước của cùng một giỏ hàng (nếu có); Đếm bán cho đến nay cho giỏ hiện tại; Có nghĩa là Ngày cho giỏ hiện tại (nếu có); Max Đến ngày cho giỏ hiện tại (nếu có)

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  

Tôi khá mới với Python, và tôi thực sự đấu tranh để tìm thấy bất cứ điều gì để làm điều đó một cách lạ mắt. Tôi đã sắp xếp dữ liệu (như trên) bởi BasketID và Date, vì vậy tôi có thể bán số lượng lớn trước đó bằng cách dịch chuyển tiếp lên một cho mỗi giỏ. Không có đầu mối làm thế nào để có được MeanToDate và MaxToDate một cách hiệu quả ngoài việc lặp ... bất kỳ ý tưởng nào?

+0

Định dạng dữ liệu hiện tại của bạn là gì (trong ba cột đầu tiên)? Nó là một tập tin hoặc bạn đang sử dụng một số loại cấu trúc dữ liệu hiện nay? – askewchan

+0

xin lỗi, tôi quên đề cập đến. nó đến từ một tệp văn bản, nhưng được lưu trữ trong một khung dữ liệu của gấu trúc. –

Trả lời

4

này nên làm như lừa:

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

Bạn có thể đọc thêm về nhóm/tập hợp here.

+0

Chức năng tích lũy thật tuyệt vời - Cảm ơn! Tại sao giả định không có nhiều hơn một giao dịch mỗi giỏ mỗi ngày? –

+0

Nếu chỉ mục không phải là duy nhất 'concat' sẽ không thể căn chỉnh các cột đúng cách với nhau vì sẽ có nhiều giá trị cho một số chỉ mục, nếu điều đó có ý nghĩa. – mtth

+0

có ý nghĩa ... và rất tiếc, có nhiều ngày cho cùng một giỏ. Khi bạn đề xuất sử dụng mẫu lại, nó có nằm trong "trình xử lý" hoặc trước cho khung dữ liệu không? Tôi hy vọng tôi đã yêu cầu một cái gì đó có ý nghĩa, vì nó không thực sự rõ ràng những gì resample thực sự đang làm (cần phải trở về nhà đầu tiên!) –

Các vấn đề liên quan