Трудность в чтении CSV-файлов, связанных с акциями - PullRequest
0 голосов
/ 15 октября 2018

Напишите функцию с именем «read_prices», которая принимает один параметр, представляющий собой список символов тикера, которыми ваша компания владеет в своем портфеле.Вы должны прочитать файл CSV для каждого из этих тикеров, который содержит цену каждой акции в течение года и вернуть эти цены в одном словаре.Возвращаемый словарь будет содержать символы тикера в качестве ключей и словари в качестве значений, где внутренние словари будут иметь даты в качестве ключей (в виде строк в формате "YYYY-MM-DD") и цены в качестве значений в виде чисел с плавающей запятой.Все сказали, что этот словарь будет содержать цену на любую акцию на любую дату за прошедший год.Вы можете предположить, что для каждого символа тикера в списке ввода будут файлы с именем «.csv».Например, если «TXN» находится в списке тикеров, тогда файл с именем «TXN.csv» будет находиться в том же каталоге, что и ваш код во время тестирования, и каждая строка этого CSV-файла будет иметь формат «дата, цена, объем».«где дата в формате ГГГГ-ММ-ДД, цена - это число с плавающей запятой, а объем - это целое число, представляющее количество акций, которые были проданы в этот день всеми трейдерами (вам не понадобится объем торговли для этой прелабы),

Пример строки для запаса AAPL: "2015-10-20,112.673677,48967800"

import csv
def read_prices(ticker):
    with open(ticker) as f:
        reader = csv.reader(f)
        dict = {}
        for items in reader:
            if items[0] in dict:
                dict[items[0]] += float(items[1]) * int(items[2])
            else:
                dict[items[0]] = float(items[1]) * int(items[2])
    return dict

Я получаю ошибку на входе [['AAPL', 'GOOG', 'FB']].Как бы я решил эту проблему?

1 Ответ

0 голосов
/ 15 октября 2018

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

import csv
def read_prices(tickers):
    d = {}
    for ticker in tickers:
        with open(ticker + '.csv') as f:
            for date, price, _ in csv.reader(f):
                d.setdefault(ticker, {})[date] = float(price)
    return d

Или вы можете использовать диктовку для достижения того же:

def read_prices(tickers):
    return {ticker: {date: price for date, price, _ in csv.reader(open(ticker + '.csv'))} for ticker in tickers}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...