我有一个格式为元组的列表:
[(证券、支付的价格、购买的股票数量)....]
[('MSFT', '$39.458', '1,000'), ('AAPL', '$638.416', '200'), ('FOSL', '$52.033', '1,000'), ('OCZ', '$5.26', '34,480'), ('OCZ', '$5.1571', '5,300')]
我想合并数据。这样每个证券只列出一次。
[(证券名称、支付的平均价格、拥有的股份数量)、...]
我有一个格式为元组的列表:
[(证券、支付的价格、购买的股票数量)....]
[('MSFT', '$39.458', '1,000'), ('AAPL', '$638.416', '200'), ('FOSL', '$52.033', '1,000'), ('OCZ', '$5.26', '34,480'), ('OCZ', '$5.1571', '5,300')]
我想合并数据。这样每个证券只列出一次。
[(证券名称、支付的平均价格、拥有的股份数量)、...]
目前还不是很清楚你要做什么。一些示例代码以及您尝试过的一些信息会有所帮助。即使你的方法完全错误,它也会让我们对你的目标有一个模糊的概念。
同时,也许 numpy 的numpy.mean
功能适合您的问题?我建议将您的元组列表转换为一个 numpy 数组,然后将 mean 函数应用于所述数组的一个切片。
也就是说,它确实适用于任何类似列表的数据结构,您可以指定要执行平均的访问。
http://docs.scipy.org/doc/numpy/reference/generated/numpy.mean.html
编辑:
根据我收集的信息,您的元组列表以下列方式组织数据:
(name, dollar ammount, weight)
我首先使用 numpy 将元组列表转换为数组。从那里,在第一列(名称)中找到唯一值:
import numpy as np
a = np.array([(tag, 23.00, 5), (tag2, 25.00, 10)])
unique_tags = np.unique(a[0,:]) # note the slicing of the array
现在计算每个标签的平均值
meandic = {}
for element in unique_tags:
tags = np.nonzero(a[0,:] == element) # identify which lines are tagged with element
meandic[element] = np.mean([t(1) * t(2) for t in a[tags]])
请注意,此代码未经测试。我可能弄错了一些小细节。如果您无法解决问题,请发表评论,我很乐意纠正我的错误。您必须删除 '$' 并在必要时将字符串转换为浮点数。
我用 adictionary
作为输出。
lis=[('MSFT', '$39.458', '1,000'), ('AAPL', '$638.416', '200'), ('FOSL', '$52.033', '1,000'), ('OCZ', '$5.26', '34,480'), ('OCZ', '$5.1571', '5,300')]
dic={}
for x in lis:
if x[0] not in dic:
price=float(x[1].strip('$'))
nos=int("".join(x[2].split(',')))
#print(nos)
dic[x[0]]=[price,nos]
else:
price=float(x[1].strip('$'))
nos=int("".join(x[2].split(',')))
dic[x[0]][1]+=nos
dic[x[0]][0]=(dic[x[0]][0]+price)/2
print(dic)
输出:
{'AAPL': [638.416, 200], 'OCZ': [5.20855, 39780], 'FOSL': [52.033, 1000], 'MSFT': [39.458, 1000]}
>>> lis
[('MSFT', '$39.458', '1,000'), ('AAPL', '$638.416', '200'), ('FOSL', '$52.033', '1,000'), ('OCZ', '$5.26', '34,480'), ('OCZ', '$5.1571', '5,300')]
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for i in lis:
... amt = float(i[1].strip('$'))
... num = int(i[2].replace(",", ""))
... d[i[0]].append((amt,num))
...
>>> for i in d.iteritems():
... average_price = sum([s[0] for s in i[1]])/len([s[0] for s in i[1]])
... total_shares = sum([s[1] for s in i[1]])
... print (i[0],average_price,total_shares)
...
('AAPL', 638.416, 200)
('OCZ', 5.20855, 39780)
('FOSL', 52.033, 1000)
('MSFT', 39.458, 1000)
干得好:
the_list = [('msft', '$31', 5), ('msft','$32', 10), ('aapl', '$100', 1)]
clean_list = map (lambda x: (x[0],float (x[1][1:]), int(x[2])), the_list)
out = {}
for name, price, shares in clean_list:
if not name in out:
out[name] = [price, shares]
else:
out[name][0] += price * shares
out[name][1] += shares
# put the output in the requested format
# not forgetting to calculate avg price paid
# out contains total # shares and total price paid
nice_out = [ (name, "$%0.2f" % (out[name][0] / out[name][1]), out[name][1])
for name in out.keys()]
print nice_out
>>> [('aapl', '$100.00', 1), ('msft', '$23.40', 15)]