Проблема с чтением CSV-файла - PullRequest
0 голосов
/ 14 октября 2018

Напишите функцию с именем «values_owned», которая принимает один параметр, представляющий собой строку, представляющую имя файла, которое содержит все сделки, совершенные вашей компанией в течение года, и возвращает словарь, содержащий количество каждой акции, принадлежащей компании, по символу тикера.,Каждая строка CSV-файла будет содержать одну сделку в формате «buy_or_sell, количество, тикер, дата», где buy_or_sell - это либо строка «buy», либо «sell», количество - это целое число, представляющее количество торгуемых акций, тикер - этострока, представляющая символ тикера, на котором ведется торговля, а date - это дата сделки в формате YYYY-MM-DD.Эта функция возвращает словарь с символами тикера в качестве ключей и количеством долей каждого символа тикера, которые являются значениями в виде целых чисел.

Например, если входной файл содержит:

buy,1700,XOM,2015-01-26
buy,1900,AAPL,2015-02-13
sell,700,XOM,2015-02-17
buy,700,AAPL,2015-02-17

Тогда результат будет {AAPL: 2600, XOM: 1000}.(Мой код ниже)

import csv
def quantities_owned(filename):
    with open(filename) as f:
        reader = csv.reader(f)
        dicti = {}
        for row in reader:
            dicti[str(row[2])] = int(row[1])
    return dicti

У меня возникают трудности с попыткой разграничить два значения в ключе buy_or_sell.Как бы я попытался решить эту проблему?

Ответы [ 3 ]

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

Это простая настройка вашего уже написанного кода:

import csv
def quantities_owned(filename):
    tran = {'buy': 1, 'sell': -1}
    with open(filename) as f:
        reader = csv.reader(f)
        dicti = {}
        for row in reader:
            if row[2] in dicti:
                dicti[row[2]] += tran[row[0]] * int(row[1])
            else:
                dicti[row[2]] = tran[row[0]] * int(row[1])
    return dicti

В качестве альтернативы используйте defaultdict:

from collections import defaultdict
import csv
def quantities_owned(filename):
    tran = {'buy': 1, 'sell': -1}
    with open(filename) as f:
        reader = csv.reader(f)
        dicti = defaultdict(int)
        for row in reader:
            dicti[row[2]] += tran[row[0]] * int(row[1])
    return dicti
0 голосов
/ 14 октября 2018

Вот решение без использования панд или каких-либо внешних библиотек.

results = {}
with open(filename) as f:

    body = f.read().split("\n")
    for entry in body:
        splittedEntry = entry.split(",")
        if splittedEntry[3] in results:
            results[splittedEntry[3]] += int(splittedEntry[1])
        else:
            results[splittedEntry[3] = int(splittedEntry[1])

У меня еще не было возможности проверить это, но это должно по крайней мере продемонстрировать общую концепцию.

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

Используйте pandas groupby, затем выполните to_dict для преобразования обратно в словарь:

import pandas as pd
df=pd.read_csv('filename.txt',header=None)
df.loc[df[0]=='sell',1]=-df.loc[df[0]=='sell',1]
print(df.groupby(2)[1].sum().to_dict())

Вывод:

{'AAPL': 2600, 'XOM': 1000}

Я использовал loc для создания значений, которыепродаются в минус, поэтому при суммировании вычитается, что

pandas документация

Я использую pandas, поскольку обычный питон для этого слишком сложен, займет много временивремя (медленное) и длинный код (неэффективно), так же как и панды, которые очень быстрые и очень простые (маленький код)

Как все говорят в комментариях: «Как if row[2] == row[2] помогает вамсделать это? Это всегда правда. ", это главный вопрос.

Теперь pandas должен быть вашим другом: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...