-1

次の形式のタプルのリストがあります。

[(有価証券、支払われた価格、購入された株式の数)....]

[('MSFT', '$39.458', '1,000'), ('AAPL', '$638.416', '200'), ('FOSL', '$52.033', '1,000'), ('OCZ', '$5.26', '34,480'), ('OCZ', '$5.1571', '5,300')]

データを統合したい。各証券が一度だけリストされるように。

[(証券名、平均支払価格、保有株式数)、...]

4

4 に答える 4

1

dictionary出力としてa を使用しました。

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]}
于 2012-05-18T16:56:57.967 に答える
1

あなたがやろうとしていることはあまり明確ではありません。あなたが試したことのいくつかの情報とともに、いくつかのサンプルコードが役立ちます。あなたのアプローチが完全に間違っていたとしても、あなたが何を目指しているのか漠然とした考えを私たちに与えてくれます.

それまでの間、おそらくnumpyのnumpy.mean機能があなたの問題に適していますか? タプルのリストをnumpy配列に変換し、その配列のスライスに平均関数を適用することをお勧めします。

とはいえ、リストのようなデータ構造でも機能し、平均を実行するアクセスを指定できます。

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

このコードはテストされていないことに注意してください。細かいところを間違っているかもしれません。何かわからないことがあれば、コメントを残していただければ、間違いを喜んで訂正します。'$' を削除し、必要に応じて文字列を float に変換する必要があります。

于 2012-05-18T16:21:18.103 に答える
1
>>> 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)
于 2012-05-18T18:24:36.267 に答える
0

どうぞ:

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)]
于 2012-05-18T18:59:57.033 に答える