编写一个名为“ 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中的两个值时遇到困难。我将如何解决这个问题?
答案 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
是因为常规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])
我还没有机会对此进行测试,但这至少应该证明其基本概念。