CSV读取文件的问题

时间:2018-10-14 01:22:52

标签: python python-3.x csv dictionary dataframe

编写一个名为“ quantities_owned”的函数,该函数采用一个参数,该参数是一个表示文件名的字符串,该文件名包含您公司全年的所有交易,并返回一个字典,其中包含该公司所有股票的数量(用股票代码表示) 。 CSV文件的每一行都将包含“ buy_or_sell,quantity,ticker,date”格式的单笔交易,其中buy_or_sell是字符串“ buy”或“ sell”,数量是代表交易数量的整数,股票代号是代表正在交易的股票代码的字符串,日期是交易日期,格式为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 :(得分:1)

这是对您已编写的代码的简单调整:

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

答案 1 :(得分:0)

使用熊猫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 documentation

我使用pandas是因为常规python对此太难了,将花费很长时间(很慢),并且代码很长(效率低下),所以超级快又超级容易(小代码)的pandas也会这样做。

正如每个人在评论中所说:“ if row[2] == row[2]如何帮助您做到这一点?这始终是事实。”,这是主要问题。

现在pandas必须成为您的朋友:-)

答案 2 :(得分:0)

这是不使用熊猫或任何外部库的解决方案。

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

我还没有机会对此进行测试,但这至少应该证明其基本概念。