2012-09-07 22 views
12

kdb + có chức năng aj thường được sử dụng để nối các bảng cùng với các cột thời gian.KDB + như asof tham gia cho dữ liệu timeseries trong gấu trúc?

Dưới đây là ví dụ mà tôi có bảng thương mại và báo giá và tôi nhận được báo giá hiện hành cho mỗi giao dịch.

q)5# t 
time   sym price size 
----------------------------- 
09:30:00.439 NVDA 13.42 60511 
09:30:00.439 NVDA 13.42 60511 
09:30:02.332 NVDA 13.42 100 
09:30:02.332 NVDA 13.42 100 
09:30:02.333 NVDA 13.41 100 

q)5# q 
time   sym bid ask bsize asize 
----------------------------------------- 
09:30:00.026 NVDA 13.34 13.44 3  16 
09:30:00.043 NVDA 13.34 13.44 3  17 
09:30:00.121 NVDA 13.36 13.65 1  10 
09:30:00.386 NVDA 13.36 13.52 21 1  
09:30:00.440 NVDA 13.4 13.44 15 17 

q)5# aj[`time; t; q] 
time   sym price size bid ask bsize asize 
----------------------------------------------------- 
09:30:00.439 NVDA 13.42 60511 13.36 13.52 21 1  
09:30:00.439 NVDA 13.42 60511 13.36 13.52 21 1  
09:30:02.332 NVDA 13.42 100 13.34 13.61 1  1  
09:30:02.332 NVDA 13.42 100 13.34 13.61 1  1  
09:30:02.333 NVDA 13.41 100 13.34 13.51 1  1 

Làm thế nào tôi có thể làm các hoạt động tương tự sử dụng gấu trúc? Tôi đang làm việc với các dataframes thương mại và báo giá trong đó chỉ mục là datetime64.

In [55]: quotes.head() 
Out[55]: 
           bid ask bsize asize 
2012-09-06 09:30:00.026000 13.34 13.44  3  16 
2012-09-06 09:30:00.043000 13.34 13.44  3  17 
2012-09-06 09:30:00.121000 13.36 13.65  1  10 
2012-09-06 09:30:00.386000 13.36 13.52  21  1 
2012-09-06 09:30:00.440000 13.40 13.44  15  17 

In [56]: trades.head() 
Out[56]: 
          price size 
2012-09-06 09:30:00.439000 13.42 60511 
2012-09-06 09:30:00.439000 13.42 60511 
2012-09-06 09:30:02.332000 13.42 100 
2012-09-06 09:30:02.332000 13.42 100 
2012-09-06 09:30:02.333000 13.41 100 

Tôi thấy rằng gấu trúc có chức năng asof nhưng không được xác định trên DataFrame, chỉ trên đối tượng Chuỗi. Tôi đoán người ta có thể lặp qua mỗi Series và sắp xếp chúng từng cái một, nhưng tôi tự hỏi nếu có một cách tốt hơn?

+1

điều này cũng được gọi là * lăn tham gia * – jangorecki

Trả lời

8

Như bạn đề cập trong câu hỏi, lặp qua mỗi cột nên làm việc cho bạn:

df1.apply(lambda x: x.asof(df2.index)) 

Chúng tôi có khả năng có thể tạo ra một phiên bản nhanh hơn NaN-ngây thơ của DataFrame.asof để làm tất cả các cột trong một shot. Nhưng hiện tại, tôi nghĩ đây là cách đơn giản nhất.

+0

Cảm ơn bạn. Tôi đang dùng cách tiếp cận này ngay bây giờ. Nhưng một phiên bản NaN-ngây thơ sẽ rất được hoan nghênh! – signalseeker

+1

https://gist.github.com/3686236 – signalseeker

13

tôi đã viết một dưới quảng cáo ordered_merge chức năng một số thời gian trước đây:

In [27]: quotes 
Out[27]: 
         time bid ask bsize asize 
0 2012-09-06 09:30:00.026000 13.34 13.44  3  16 
1 2012-09-06 09:30:00.043000 13.34 13.44  3  17 
2 2012-09-06 09:30:00.121000 13.36 13.65  1  10 
3 2012-09-06 09:30:00.386000 13.36 13.52  21  1 
4 2012-09-06 09:30:00.440000 13.40 13.44  15  17 

In [28]: trades 
Out[28]: 
         time price size 
0 2012-09-06 09:30:00.439000 13.42 60511 
1 2012-09-06 09:30:00.439000 13.42 60511 
2 2012-09-06 09:30:02.332000 13.42 100 
3 2012-09-06 09:30:02.332000 13.42 100 
4 2012-09-06 09:30:02.333000 13.41 100 

In [29]: ordered_merge(quotes, trades) 
Out[29]: 
         time bid ask bsize asize price size 
0 2012-09-06 09:30:00.026000 13.34 13.44  3  16 NaN NaN 
1 2012-09-06 09:30:00.043000 13.34 13.44  3  17 NaN NaN 
2 2012-09-06 09:30:00.121000 13.36 13.65  1  10 NaN NaN 
3 2012-09-06 09:30:00.386000 13.36 13.52  21  1 NaN NaN 
4 2012-09-06 09:30:00.439000 NaN NaN NaN NaN 13.42 60511 
5 2012-09-06 09:30:00.439000 NaN NaN NaN NaN 13.42 60511 
6 2012-09-06 09:30:00.440000 13.40 13.44  15  17 NaN NaN 
7 2012-09-06 09:30:02.332000 NaN NaN NaN NaN 13.42 100 
8 2012-09-06 09:30:02.332000 NaN NaN NaN NaN 13.42 100 
9 2012-09-06 09:30:02.333000 NaN NaN NaN NaN 13.41 100 

In [32]: ordered_merge(quotes, trades, fill_method='ffill') 
Out[32]: 
         time bid ask bsize asize price size 
0 2012-09-06 09:30:00.026000 13.34 13.44  3  16 NaN NaN 
1 2012-09-06 09:30:00.043000 13.34 13.44  3  17 NaN NaN 
2 2012-09-06 09:30:00.121000 13.36 13.65  1  10 NaN NaN 
3 2012-09-06 09:30:00.386000 13.36 13.52  21  1 NaN NaN 
4 2012-09-06 09:30:00.439000 13.36 13.52  21  1 13.42 60511 
5 2012-09-06 09:30:00.439000 13.36 13.52  21  1 13.42 60511 
6 2012-09-06 09:30:00.440000 13.40 13.44  15  17 13.42 60511 
7 2012-09-06 09:30:02.332000 13.40 13.44  15  17 13.42 100 
8 2012-09-06 09:30:02.332000 13.40 13.44  15  17 13.42 100 
9 2012-09-06 09:30:02.333000 13.40 13.44  15  17 13.41 100 

Nó có thể là một cách dễ dàng (tốt, đối với một người quen thuộc với mã) mở rộng để trở thành một "trái tham gia" bắt chước KDB. Tôi nhận ra trong trường hợp này, việc chuyển tiếp dữ liệu thương mại không phù hợp; chỉ minh họa chức năng.

+1

Cảm ơn, điều này rất tốt để biết. Đây là bản chất uj (http://code.kx.com/wiki/Reference/uj) trong KDB !. Đối với các chức năng aj, tôi sẽ với cách tiếp cận của Chang nhưng tôi có kế hoạch để có một đâm nghiêm trọng tại mã sau này. – signalseeker

+1

Điều này có thể được khái quát hóa trong trường hợp dataframe chứa nhiều Series cùng nhau, ví dụ: nếu dữ liệu, ngoài dấu thời gian, cũng có một cột ID chứng khoán? (Vì vậy chúng tôi có thể có hàng ngàn nhóm, và mỗi nhóm là một Series). Tôi nghi ngờ chúng tôi sẽ cần một hỗn hợp của 'groupby()' và 'ordered_merge', nhưng tôi đang vật lộn về cách làm điều đó ... Chắc chắn, nó sẽ là sai lầm chỉ đơn giản là' ffill' theo thứ tự tổng thể của dataframe (Tôi không muốn một nhóm tràn vào nhóm tiếp theo bằng cách điền vào phía trước). –

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