2012-12-17 55 views
5

Tôi có một tập dữ liệu chuỗi thời gian dài trong khoảng 30 phút và cố gắng thực hiện cửa sổ trượt trên tập hợp dữ liệu này nhưng riêng cho từng thời điểm trong ngày bằng cách sử dụng gấu trúc.Cửa sổ trượt trung bình theo các trục thời gian

Tôi không có thống kê và không giỏi về tư duy hoặc viết mã cho loại công việc này nhưng đây là nỗ lực vụng về của tôi khi làm những gì tôi muốn. Tôi thực sự đang tìm kiếm trợ giúp cải thiện nó như tôi biết sẽ có một cách tốt hơn để làm điều này, có thể sử dụng MultiIndexes và một số lặp thích hợp? Nhưng tôi đã vật lộn để làm điều này qua 'trục thời gian'.

def sliding_window(run,data,type='mean'): 
    data = data.asfreq('30T') 
    for x in date_range(run.START, run.END, freq='1d'): 
     if int(datetime.strftime(x, "%w")) == 0 or int(datetime.strftime(x, "%w")) == 6: 
      points = data.select(weekends).truncate(x - relativedelta(days=run.WINDOW),x + relativedelta(days=run.WINDOW)).groupby(lambda date: minutes(date, x)).mean() 
     else: 
      points = data.select(weekdays).truncate(x - relativedelta(days=run.WINDOW),x + relativedelta(days=run.WINDOW)).groupby(lambda date: minutes(date, x)).mean() 
     for point in points.index: 
      data[datetime(x.year,x.month,x.day,point.hour,point.minute)] = points[point] 
    return data 

chạy.START, chạy.END và chạy.WINDOW là hai điểm trong dữ liệu và 45 (ngày). Tôi đã nhìn chằm chằm vào mã này rất nhiều vì vậy tôi không chắc chắn những gì (nếu có) của nó có ý nghĩa với bất cứ ai khác, xin vui lòng yêu cầu để tôi có thể làm rõ bất cứ điều gì khác.

SOLVED: (Giải pháp kê biếu không của crewbum)

Chức năng sửa đổi mà như mong đợi đi ngớ ngẩn nhanh:

def sliding_window(run,data,am='mean',days='weekdays'): 
    data = data.asfreq('30T') 
    data = DataFrame({'Day': [d.date() for d in data.index], 'Time': [d.time() for d in data.index], 'Weekend': [weekday_string(d) for d in data.index], 'data': data}) 
    pivot = data.pivot_table(values='data', rows='Day', cols=['Weekend', 'Time']) 
    pivot = pivot[days] 
    if am == 'median': 
     mean = rolling_median(pivot, run.WINDOW*2, min_periods=1) 
    mean = rolling_mean(pivot, run.WINDOW*2, min_periods=1) 
    return DataFrame({'mean': unpivot(mean), 'amax': np.tile(pivot.max().values, pivot.shape[0]), 'amin': np.tile(pivot.min().values, pivot.shape[0])}, index=data.index) 

Chức năng UNPIVOT:

def unpivot(frame): 
    N, K = frame.shape 
    return Series(frame.values.ravel('C'), index=[datetime.combine(d[0], d[1]) for d in zip(np.asarray(frame.index).repeat(K), np.tile(np.asarray(frame.ix[0].index), N))]) 

Trung tâm = True trên sliding_mean dường như bị hỏng vào lúc này, sẽ gửi nó trong github nếu tôi có cơ hội.

+0

Bạn đã xem/thử hàm cuộn trung bình có sẵn chưa? Http: //pandas.pydata.org/pandas-docs/stable/generated/pandas.stats.moments.rolling_mean.html? Highlight = rolling # pandas.stats.moments.rolling_mean – Garrett

+0

Cố gắng làm rõ những gì bạn đang cố gắng làm: bạn muốn trung bình tất cả các giá trị trong khoảng từ 45 đến 45 ngày, nhưng được nhóm theo thời gian 24 giờ. Ví dụ: trung bình tất cả (91) dữ liệu lúc 13:00 và trung bình riêng tất cả dữ liệu lúc 13:30, v.v. Vì "làm cửa sổ trượt" là khá không xác định: cửa sổ trượt của gì? – Evert

+0

Ngoài ra, tại sao phải tách thành các ngày trong tuần và cuối tuần? Chỉ cần hợp lý cho các dữ liệu được xem xét, tôi giả sử? – Evert

Trả lời

4

Nếu bạn quan tâm đến MultiIndex, hãy xem df.pivot_table(). Nó sẽ tự động tạo một MultiIndex khi nhiều khóa được chuyển trong các tham số hàng và/hoặc cols. Ví dụ:

Ví dụ: giả sử bạn muốn xoay vòng dữ liệu để có các cột riêng biệt cho mỗi ngày cuối tuần và cuối tuần không phải là 30 phút; bạn có thể làm điều đó bằng cách thêm các cột Ngày, Cuối tuần và TOD (thời gian trong ngày) vào DataFrame và sau đó chuyển các tên cột đó vào pivot_table như sau.

pivot = df.pivot_table(values='Usage', rows='Day', cols=['TOD', 'Weekend']) 

Trong định dạng này, pd.rolling_mean() (hoặc một chức năng của sự sáng tạo của bạn) có thể dễ dàng được áp dụng cho các cột của pivot. pd.rolling_mean(), giống như tất cả các chức năng cuộn/di chuyển trong gấu trúc, thậm chí chấp nhận tham số center cho các cửa sổ trượt ở giữa.

pd.rolling_mean(pivot, 90, center=True, min_periods=1) 
+0

Tuyệt vời. Cảm ơn bạn rất nhiều. –

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