Я загружаю таблицу основных данных из открытой символики Блумберга. CSV имеет столбцы, которые я не заинтересован.Более эффективный способ пропускать столбцы в csv для функции namedtuple?
Вопрос
Есть ли эффективный/Pythonic способ создания экземпляров namedtuple из подмножества столбцов, найденных в файл CSV?
То, что я пытался
Мой текущий процесс (Python 3.3 код ниже) выглядит следующим образом:
- Создать namedtuple TempRecord со всеми столбцами в формате CSV.
- Создайте экземпляр TempRecord для каждой записи в файле csv.
- Создайте BSYMRecord (с меньшим количеством и переименованными атрибутами) из заданного TempRecord.
- Выход BSYMRecord.
Этот запах действительно неэффективен.
from csv import reader
from collections import namedtuple
from datetime import date
from io import BytesIO
from urllib.request import urlopen
from urllib.error import HTTPError
from zipfile import ZipFile
def bsym_records(sector, security_type, file_date):
"""Yield BSYMRecord for given sector and security type."""
template = 'http://bdn-ak.bloomberg.com/precanned/{s}_{t}_{d}.txt.zip'
url = template.format(s=sector, t=security_type, d=file_date)
response = urlopen(url)
zipfile = ZipFile(BytesIO(response.read()))
for filename in zipfile.namelist():
with zipfile.open(filename) as f:
line = f.readline().decode('utf-8')
headers = line.strip().replace(' ', '_').split('|')
TempRecord = namedtuple('BSYMRecord', headers)
while True:
line = f.readline().decode('utf-8')
if line[0] == '#':
break
t = TempRecord._make(line.strip().split('|'))
yield reduce_bsym_record(t)
BSYMRecord = namedtuple('BSYMRecord', ['name',
'ticker',
'pricing_source',
'security_type',
'market_sector',
'BBGID',
'BBGID_composite',
'BSID',
'unique_id'])
def reduce_bsym_record(record):
"""Eliminate non-essential fields."""
return BSYMRecord._make((record.NAME,
record.ID_BB_SEC_NUM_DES,
record.FEED_SOURCE,
record.SECURITY_TYP,
record.MARKET_SECTOR_DES,
record.ID_BB_GLOBAL,
record.COMPOSITE_ID_BB_GLOBAL,
record.ID_BB_SEC_NUM_SRC,
record.ID_BB_UNIQUE))
Мне это нравится. Мне пришлось добавить фильтр в DictReader, чтобы пропустить нижние колонтитулы, но он работал хорошо. Благодарю. – MikeRand