2012-03-04 7 views
6

Đây là lần đầu tiên tôi thử dùng Pandas. Tôi nghĩ rằng tôi có một trường hợp sử dụng hợp lý, nhưng tôi đang vấp ngã. Tôi muốn tải một tệp phân cách tab vào một khung dữ liệu Pandas, sau đó nhóm nó theo biểu tượng và vẽ nó với x.axis được chỉ mục bởi cột TimeStamp. Đây là một tập hợp con của dữ liệu:Pandas DataFrame - chỉ mục mong muốn có giá trị trùng lặp

Symbol,Price,M1,M2,Volume,TimeStamp 
TBET,2.19,3,8.05,1124179,9:59:14 AM 
FUEL,3.949,9,1.15,109674,9:59:11 AM 
SUNH,4.37,6,0.09,24394,9:59:09 AM 
FUEL,3.9099,8,1.11,105265,9:59:09 AM 
TBET,2.18,2,8.03,1121629,9:59:05 AM 
ORBC,3.4,2,0.22,10509,9:59:02 AM 
FUEL,3.8599,7,1.07,102116,9:58:47 AM 
FUEL,3.8544,6,1.05,100116,9:58:40 AM 
GBR,3.83,4,0.46,64251,9:58:24 AM 
GBR,3.8,3,0.45,63211,9:58:20 AM 
XRA,3.6167,3,0.12,42310,9:58:08 AM 
GBR,3.75,2,0.34,47521,9:57:52 AM 
MPET,1.42,3,0.26,44600,9:57:52 AM 

Lưu ý hai điều về cột TimeStamp;

  1. có giá trị trùng lặp và
  2. các khoảng không đều.

Tôi nghĩ tôi có thể làm một cái gì đó như thế này ...

from pandas import * 
import pylab as plt 

df = read_csv('data.txt',index_col=5) 
df.sort(ascending=False) 

df.plot() 
plt.show() 

Nhưng phương pháp read_csv đặt ra một ngoại lệ "cột Cố gắng 1-X như chỉ số nhưng không tìm thấy bản sao". Có một tùy chọn cho phép tôi chỉ định một cột chỉ mục với các giá trị trùng lặp không?

Tôi cũng muốn sắp xếp các khoảng thời gian không đều theo một độ phân giải thứ hai, tôi vẫn muốn vẽ nhiều sự kiện trong một giây, nhưng có lẽ tôi có thể giới thiệu một chỉ mục duy nhất, sau đó sắp xếp giá của tôi với nó?

Trả lời

4

Tôi tạo ra một số vấn đề chỉ là bây giờ để giải quyết một số tính năng/tiện mà tôi nghĩ rằng sẽ rất tuyệt nếu có: GH-856, GH-857, GH-858

Chúng tôi hiện đang làm việc trên một revamp các khả năng chuỗi thời gian và làm alignment để giải quyết thứ hai là có thể bây giờ (mặc dù không phải với các bản sao, do đó, sẽ cần phải viết một số chức năng cho điều đó). Tôi cũng muốn hỗ trợ dấu thời gian trùng lặp theo cách tốt hơn. Tuy nhiên, đây thực sự là dữ liệu bảng điều khiển (3D), vì vậy một cách mà bạn có thể thay đổi mọi thứ như sau:

In [29]: df.pivot('Symbol', 'TimeStamp').stack() 
Out[29]: 
        M1 M2 Price Volume 
Symbol TimeStamp        
FUEL 9:58:40 AM 6 1.05 3.8544 100116 
     9:58:47 AM 7 1.07 3.8599 102116 
     9:59:09 AM 8 1.11 3.9099 105265 
     9:59:11 AM 9 1.15 3.9490 109674 
GBR 9:57:52 AM 2 0.34 3.7500 47521 
     9:58:20 AM 3 0.45 3.8000 63211 
     9:58:24 AM 4 0.46 3.8300 64251 
MPET 9:57:52 AM 3 0.26 1.4200 44600 
ORBC 9:59:02 AM 2 0.22 3.4000 10509 
SUNH 9:59:09 AM 6 0.09 4.3700 24394 
TBET 9:59:05 AM 2 8.03 2.1800 1121629 
     9:59:14 AM 3 8.05 2.1900 1124179 
XRA 9:58:08 AM 3 0.12 3.6167 42310 

lưu ý rằng điều này tạo ra một MultiIndex. Một cách khác để tôi có thể nhận được này:

In [32]: df.set_index(['Symbol', 'TimeStamp']) 
Out[32]: 
        Price M1 M2 Volume 
Symbol TimeStamp        
TBET 9:59:14 AM 2.1900 3 8.05 1124179 
FUEL 9:59:11 AM 3.9490 9 1.15 109674 
SUNH 9:59:09 AM 4.3700 6 0.09 24394 
FUEL 9:59:09 AM 3.9099 8 1.11 105265 
TBET 9:59:05 AM 2.1800 2 8.03 1121629 
ORBC 9:59:02 AM 3.4000 2 0.22 10509 
FUEL 9:58:47 AM 3.8599 7 1.07 102116 
     9:58:40 AM 3.8544 6 1.05 100116 
GBR 9:58:24 AM 3.8300 4 0.46 64251 
     9:58:20 AM 3.8000 3 0.45 63211 
XRA 9:58:08 AM 3.6167 3 0.12 42310 
GBR 9:57:52 AM 3.7500 2 0.34 47521 
MPET 9:57:52 AM 1.4200 3 0.26 44600 

In [33]: df.set_index(['Symbol', 'TimeStamp']).sortlevel(0) 
Out[33]: 
        Price M1 M2 Volume 
Symbol TimeStamp        
FUEL 9:58:40 AM 3.8544 6 1.05 100116 
     9:58:47 AM 3.8599 7 1.07 102116 
     9:59:09 AM 3.9099 8 1.11 105265 
     9:59:11 AM 3.9490 9 1.15 109674 
GBR 9:57:52 AM 3.7500 2 0.34 47521 
     9:58:20 AM 3.8000 3 0.45 63211 
     9:58:24 AM 3.8300 4 0.46 64251 
MPET 9:57:52 AM 1.4200 3 0.26 44600 
ORBC 9:59:02 AM 3.4000 2 0.22 10509 
SUNH 9:59:09 AM 4.3700 6 0.09 24394 
TBET 9:59:05 AM 2.1800 2 8.03 1121629 
     9:59:14 AM 2.1900 3 8.05 1124179 
XRA 9:58:08 AM 3.6167 3 0.12 42310 

bạn có thể nhận được dữ liệu này trong một định dạng bảng đúng như vậy:

In [35]: df.set_index(['TimeStamp', 'Symbol']).sortlevel(0).to_panel() 
Out[35]: 
<class 'pandas.core.panel.Panel'> 
Dimensions: 4 (items) x 11 (major) x 7 (minor) 
Items: Price to Volume 
Major axis: 9:57:52 AM to 9:59:14 AM 
Minor axis: FUEL to XRA 

In [36]: panel = df.set_index(['TimeStamp', 'Symbol']).sortlevel(0).to_panel() 

In [37]: panel['Price'] 
Out[37]: 
Symbol  FUEL GBR MPET ORBC SUNH TBET  XRA 
TimeStamp            
9:57:52 AM  NaN 3.75 1.42 NaN NaN NaN  NaN 
9:58:08 AM  NaN NaN NaN NaN NaN NaN 3.6167 
9:58:20 AM  NaN 3.80 NaN NaN NaN NaN  NaN 
9:58:24 AM  NaN 3.83 NaN NaN NaN NaN  NaN 
9:58:40 AM 3.8544 NaN NaN NaN NaN NaN  NaN 
9:58:47 AM 3.8599 NaN NaN NaN NaN NaN  NaN 
9:59:02 AM  NaN NaN NaN 3.4 NaN NaN  NaN 
9:59:05 AM  NaN NaN NaN NaN NaN 2.18  NaN 
9:59:09 AM 3.9099 NaN NaN NaN 4.37 NaN  NaN 
9:59:11 AM 3.9490 NaN NaN NaN NaN NaN  NaN 
9:59:14 AM  NaN NaN NaN NaN NaN 2.19  NaN 

sau đó bạn có thể tạo ra một số lô từ dữ liệu đó.

lưu ý ở đây rằng dấu thời gian vẫn là chuỗi-- Tôi đoán chúng có thể được chuyển đổi thành đối tượng datetime.time của Python và mọi thứ có thể dễ dàng hơn để làm việc. Tôi không có nhiều kế hoạch để cung cấp nhiều hỗ trợ cho thời gian thô so với dấu thời gian (ngày + giờ) nhưng nếu đủ người cần nó, tôi cho rằng tôi có thể bị thuyết phục :)

Nếu bạn có nhiều quan sát trên giây đối với một biểu tượng duy nhất thì một số phương pháp trên sẽ không hoạt động. Nhưng tôi muốn xây dựng hỗ trợ tốt hơn cho điều đó trong các bản phát hành sắp tới của gấu trúc, vì vậy việc biết các trường hợp sử dụng của bạn sẽ hữu ích cho tôi-- xem xét tham gia danh sách gửi thư (pystatsmodels)

+0

Cảm ơn bạn. Tôi sẽ tham gia pystatsmodels - nếu bạn đang tìm kiếm noobs vấp ngã với các trường hợp sử dụng, tôi có thể là lãnh thổ màu mỡ. – kavu

+0

Nếu theo thời gian thô bạn có nghĩa là chỉ số nguyên có lẽ là một tỷ lệ lấy mẫu, đây là một upvote. Cả thế giới các bản ghi âm khoa học đều tuyệt vọng cho một phần mở rộng cho TimeSeries theo hướng đó ... – meteore