2012-03-15 3 views
9

Я только что получил руки на панды и выяснял, как я могу читать файл. Файл находится из базы данных WRDS и является списком составляющих SP500 вплоть до 1960-х годов. Я проверил файл и независимо от того, что я делаю, чтобы импортировать его с помощью «read_csv», я все еще не могу правильно отобразить данные.Как читать текстовый файл формата ширины фиксированной ширины в pandas

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) 

Что означает вышеупомянутый кусок выходного сигнала? Все было бы полезно

+2

что панды могут съели ваши данные ? – hochl

+1

Не могли бы вы отобразить первые несколько строк файла? –

ответ

7

Уэс ответил мне по электронной почте. Приветствия.

Это файл с фиксированной шириной (не разделенный запятыми или вкладками, как обычный). Я понимаю, что у панд нет читателя с фиксированной шириной, например, R, хотя его можно легко создать. Я посмотрю, что смогу сделать. Тем временем, если вы можете экспортировать данные в другом формате (например, csv - по-настоящему запятыми), вы сможете прочитать его с помощью read_csv. I подозреваемый с некоторой магией unix, вы можете преобразовать файл FWF в файл CSV .

Я рекомендую после выпуска на GitHub, как ваша электронная почта собирается исчезнуть из моего почтового ящика :)

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

лучше, Wes

+6

Следуйте за ответом. Read_fwf() теперь реализует формат фиксированной ширины чтения. См. Http://pandas.pydata.org/pandas-docs/dev/io.html#files-with-fixed-width-columns –

0

Что вы подразумеваете под дисплеем? Не отправляет df['gvkey'] данные в столбец gvkey?

Если все, что вы делаете, распечатывает весь кадр данных на консоли, то посмотрите на df.to_string(), но это будет трудно прочитать, если у вас слишком много столбцов. Pandas не будет печатать все это по умолчанию, если у вас слишком много столбцов:

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

спасибо TR. Мой файл данных - это формат фиксированной ширины ... в настоящее время не поддерживается. Уэс любезно добавил к источнику списка выпусков pandas. – user1234440

+0

У вас есть доступ к WRDS?У вас должна быть опция для вывода файла в формате csv. –

0

пользователя, если вам придется иметь дело с фиксированным форматом прямо сейчас, вы можете использовать примерно следующее:

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)) 

Адрес: Программа Текущая:

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 

Это должно сделать трюк, если вам это нужно прямо сейчас, но имейте в виду, что выше функция очень проста, в частности, он ничего не знает о типах данных не делать.

Смежные вопросы