2012-03-15 33 views
9

Tôi chỉ có bàn tay của mình trên gấu trúc và tìm ra cách tôi có thể đọc tệp. Các tập tin là từ cơ sở dữ liệu WRDS và là thành phần SP500 danh sách tất cả các cách trở lại năm 1960. Tôi đã kiểm tra các tập tin và không có vấn đề gì tôi làm để nhập khẩu nó bằng cách sử dụng 'read_csv', tôi vẫn không thể hiển thị dữ liệu một cách chính xác.Làm cách nào để đọc tệp văn bản có định dạng chiều rộng cố định trong gấu trúc

df = read_csv('sp500-sb.txt') 

df 

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 1231 entries, 0 to 1230 
Data columns: gvkeyx      from      thru     conm 
                                        gvkey      co_conm 
...(the column names) 
dtypes: object(1) 

Đoạn đầu ra ở trên có nghĩa là gì? Mọi thứ sẽ hữu ích

+2

Đó Pandas có thể đã ăn dữ liệu của bạn ? – hochl

+1

Bạn có thể hiển thị một vài dòng đầu tiên của tệp không? –

Trả lời

7

Wes đã trả lời tôi bằng email. Chúc mừng.

Đây là tệp định dạng có chiều rộng cố định (không được phân tách bằng dấu phẩy hoặc tab là thông thường). Tôi nhận ra rằng gấu trúc không có đầu đọc có chiều rộng cố định như R, mặc dù gấu trúc có thể được thời trang rất dễ dàng. Tôi sẽ xem những gì tôi có thể . Trong thời gian chờ đợi nếu bạn có thể xuất dữ liệu ở định dạng khác (như csv - thực sự được phân cách bằng dấu phẩy), bạn sẽ có thể đọc dữ liệu bằng read_csv. Tôi nghi ngờ với một số phép thuật unix, bạn có thể chuyển đổi tệp FWF thành tệp CSV .

Tôi khuyên bạn nên sau khi vấn đề trên github như e-mail của bạn sắp biến mất từ ​​hộp thư của tôi :)

https://github.com/pydata/pandas/issues/920

tốt nhất, Wes

+6

Theo dõi câu trả lời. Đọc định dạng chiều rộng sửa lỗi hiện đang được thực hiện bởi read_fwf(). Xem http://pandas.pydata.org/pandas-docs/dev/io.html#files-with-fixed-width-columns –

0

Bạn có ý nghĩa gì khi hiển thị? Không df['gvkey'] cung cấp cho bạn dữ liệu trong cột gvkey?

Nếu những gì bạn làm là in toàn bộ khung dữ liệu vào bảng điều khiển, hãy xem df.to_string(), nhưng sẽ rất khó đọc nếu bạn có quá nhiều cột. Pandas sẽ không in toàn bộ nội dung theo mặc định nếu bạn có quá nhiều cột:

import pandas 
import numpy 

df1 = pandas.DataFrame(numpy.random.randn(10, 3), columns=['col%d' % d for d in range(3)]) 
df2 = pandas.DataFrame(numpy.random.randn(10, 30), columns=['col%d' % d for d in range(30)]) 

print df1 # <--- substitute by df2 to see the difference 
print 
print df1['col1'] 
print 
print df1.to_string() 
+0

cảm ơn TR. Tệp dữ liệu của tôi là định dạng chiều rộng cố định ... hiện không được hỗ trợ. Wes đã ân cần thêm vào danh sách các vấn đề về gấu trúc. – user1234440

+0

Bạn vẫn có quyền truy cập vào WRDS?Bạn nên có một tùy chọn ở đó để xuất tệp ở định dạng csv. –

0

người sử dụng, nếu bạn cần để đối phó với định dạng cố định ngay bây giờ, bạn có thể sử dụng một cái gì đó như sau:

def fixed_width_to_items(filename, fields, first_column_is_index=False, ignore_first_rows=0): 
    reader = open(filename, 'r') 
    # skip first rows 
    for i in xrange(ignore_first_rows): 
     reader.next() 
    if first_column_is_index: 
     index = slice(0, fields[1]) 
     fields = [slice(*x) for x in zip(fields[1:-1], fields[2:])] 
     return ((line[index], [line[x].strip() for x in fields]) for line in reader) 
    else: 
     fields = [slice(*x) for x in zip(fields[:-1], fields[1:])] 
     return ((i, [line[x].strip() for x in fields]) for i,line in enumerate(reader)) 

Đây là lúc chương trình est:

import pandas 
import numpy 
import tempfile 

# create a data frame 
df = pandas.DataFrame(numpy.random.randn(100, 5)) 
file_ = tempfile.NamedTemporaryFile(delete=True) 
file_.write(df.to_string()) 
file_.flush() 

# specify fields 
fields = [0, 3, 12, 22, 32, 42, 52] 
df2 = pandas.DataFrame.from_items(fixed_width_to_items(file_.name, fields, first_column_is_index=True, ignore_first_rows=1)).T 

# need to specify the datatypes, otherwise everything is a string 
df2 = pandas.DataFrame(df2, dtype=float) 
df2.index = [int(x) for x in df2.index] 

# check 
assert (df - df2).abs().max().max() < 1E-6 

Điều này nên thực hiện thủ thuật nếu bạn cần ngay bây giờ, nhưng đặc biệt nó không làm bất cứ điều gì về kiểu dữ liệu.

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