2015-05-24 29 views
5

Tôi muốn lấy lại hồi quy với chuỗi thời gian làm dự đoán và tôi đang cố gắng làm theo câu trả lời cho câu trả lời SO (OLS with pandas: datetime index as predictor) nhưng dường như nó không hoạt động tốt nhất kiến thức của tôi.Hồi quy tuyến tính từ chuỗi thời gian Pandas

Tôi có thiếu gì đó hoặc có cách mới để thực hiện việc này không?

import pandas as pd 

rng = pd.date_range('1/1/2011', periods=4, freq='H')  
s = pd.Series(range(4), index = rng)                  
z = s.reset_index() 

pd.ols(x=z["index"], y=z[0]) 

Tôi gặp phải lỗi này. Các lỗi là giải thích nhưng tôi tự hỏi những gì tôi đang thiếu trong reimplementing một giải pháp mà làm việc trước.

TypeError: cannot astype a datetimelike from [datetime64[ns]] to [float64]

+0

Tốt nhất, bạn không cần phải 'rest_index () ', không' pd.ols (y = s, x = s) 'có hiệu quả với bạn không? – Zero

+1

Có nó! Cảm ơn bạn. Bạn có cơ hội biết làm thế nào nó hoạt động hoặc tại sao chuyển đổi từ datetime để tôi giả sử nổi hoạt động không có lỗi? – canyon289

+0

Nevermind, điều này dường như thất bại. Nó chỉ là một hồi quy chống lại cùng một chuỗi – canyon289

Trả lời

3

Tôi không chắc chắn lý do tại sao pd.ols rất cầu kỳ ở đó (có vẻ như tôi đã theo dõi ví dụ một cách chính xác). Tôi nghi ngờ điều này là do những thay đổi trong cách gấu trúc xử lý hoặc lưu trữ chỉ mục datetime nhưng quá lười biếng để khám phá thêm. Dù sao, kể từ biến datetime của bạn khác chỉ trong một giờ, bạn có thể chỉ trích xuất các giờ với một accessor dt:

pd.ols(x=pd.to_datetime(z["index"]).dt.hour, y=z[0]) 

Tuy nhiên, cung cấp cho bạn một r-squared trong tổng số 1, vì mô hình của bạn được overspecified với sự bao gồm của một đánh chặn (và y là một hàm tuyến tính của x). Bạn có thể thay đổi range thành np.random.randn và sau đó bạn sẽ nhận được một cái gì đó trông giống như kết quả hồi quy bình thường.

In [6]: z = pd.Series(np.random.randn(4), index = rng).reset_index()                
     pd.ols(x=pd.to_datetime(z["index"]).dt.hour, y=z[0]) 
Out[6]: 

-------------------------Summary of Regression Analysis------------------------- 

Formula: Y ~ <x> + <intercept> 

Number of Observations:   4 
Number of Degrees of Freedom: 2 

R-squared:   0.7743 
Adj R-squared:  0.6615 

Rmse:    0.5156 

F-stat (1, 2):  6.8626, p-value:  0.1200 

Degrees of Freedom: model 1, resid 2 

-----------------------Summary of Estimated Coefficients------------------------ 
     Variable  Coef Std Err  t-stat p-value CI 2.5% CI 97.5% 
-------------------------------------------------------------------------------- 
      x -0.6040  0.2306  -2.62  0.1200 -1.0560 -0.1521 
    intercept  0.2915  0.4314  0.68  0.5689 -0.5540  1.1370 
---------------------------------End of Summary--------------------------------- 

Ngoài ra, bạn có thể chuyển đổi các chỉ số để một số nguyên, mặc dù tôi thấy điều này không làm việc rất tốt (tôi giả sử vì số nguyên đại diện nano giây kể từ khi kỷ nguyên hoặc một cái gì đó như thế, và do đó rất lớn và gây ra các vấn đề chính xác), nhưng chuyển sang số nguyên và chia cho một nghìn tỷ, hay như vậy đã làm việc và đưa về cơ bản kết quả tương tự như sử dụng dt.hour (tức là cùng r-squared):

pd.ols(x=pd.to_datetime(z["index"]).astype(int)/1e12, y=z[0]) 

Nguồn của thông báo lỗi

FWIW, có vẻ như rằng thông báo lỗi xuất phát từ một cái gì đó như thế này:

pd.to_datetime(z["index"]).astype(float) 

Mặc dù một workaround khá rõ ràng là thế này:

pd.to_datetime(z["index"]).astype(int).astype(float) 
+0

Cả hai giải pháp đều hữu ích, đặc biệt là giải pháp thứ hai. – canyon289

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