2012-01-17 44 views
1

我有一個問題從我的數據集獲取正確的輸出。如何獲得此數據集的正確輸出?

我有一個包含Ticker名稱,重量和分數的數據集,並希望爲給定的股票代碼獲取TIK,Weight,Score的獨特列表,其中Score = MAX(分數)。

數據集的一個例子是

[(u'COOL ', 25, 452.50000000000006), (u'MIND', 25, 221), (u'SIMO', 25, 209), (u'RAVN', 25, 131.75), (u'AET', 25, 99), (u'SBUX', 25, 83.5), (u'ATVI', 25, 47.75), (u'CACI', 25, 45.5), (u'DISH ', 25, 17.25), (u'COOL ', 15, 271.5), (u'MIND', 15, 132.6), (u'SIMO', 15, 125.39999999999999), (u'RAVN', 15, 79.05), (u'AET', 15, 59.4), (u'SBUX', 15, 50.099999999999994), (u'ATVI', 15, 28.65), (u'CACI', 15, 27.3), (u'DISH ', 15, 10.35), (u'COOL ', 10, 181), (u'MIND', 10, 88.4), (u'SIMO', 10, 83.6), (u'RAVN', 10, 52.699999999999996), (u'AET', 10, 39.6), (u'SBUX', 10, 33.4), (u'ATVI', 10, 19.099999999999998), (u'CACI', 10, 18.2), (u'DISH ', 10, 6.8999999999999995), (u'COOL ', 5, 90.5), (u'MIND', 5, 44.2), (u'SIMO', 5, 41.8), (u'RAVN', 5, 26.349999999999998), (u'AET', 5, 19.8), (u'SBUX', 5, 16.7), (u'ATVI', 5, 9.549999999999999), (u'CACI', 5, 9.1), (u'DISH ', 5, 3.4499999999999997)] 

.....對於數據集中的每個股票。

我期待達到的效果是:

COOL 25 452.50 
MIND 15 132.6 
SIMO 10 83.6 

前。 AAPL的權重爲25,TITN的權重爲20,ANF的權重爲15,其權重爲15,直到總和(權重)= 100。

每個報價器只能報告一次給定的重量。所以如果AAPL的分數最高爲25,那麼在任何其他體重下都不能再使用它。

這很難解釋希望我已經提供足夠的,你們提供一些指導。

***追加爲了更加清晰一些真正的樣本數據

+0

是您的輸出是否正確?因爲'300'不是'TITN'代碼之間的最高分數 – juliomalegria 2012-01-17 19:38:03

+0

請參閱我的編輯與新代碼 – joaquin 2012-01-18 08:01:53

回答

0

嘛,不使用一些其他的庫這是可以做到如下:

def get_element(lst, key): 
    for obj in lst: 
    if key(obj): 
     return obj 
    return None 

def generate_list(data_set): 
    result = [] 
    for obj in data_set: 
    temp = get_element(result, lambda k: k[0] == obj[0]) 
    if temp is None: 
     result.append(obj) 
    elif obj[1] > temp[1]: 
     ind = result.index(temp) 
     result[ind] = obj  
    return result 

導致在同一列表格式作爲輸入。

+0

非常感謝怪異!我會根據我的真實數據集來測試這個。感謝沒有使用庫的方法! – wintermute 2012-01-17 19:56:10

2
>>> from itertools import groupby 
>>> 
>>> groups = groupby(table, lambda x: x[0])  # table not sorted because items already are 
>>> [max(item[1], key=lambda x:x[2]) for item in groups] 
[('AAPL', 25, 400), ('TITN', 25, 350), ('ANF', 25, 250)] 
>>> 

或兩行(只是爲了好玩,不好意思):

>>> from itertools import groupby 
>>> [max(item[1], key=lambda x:x[2]) for item in groupby(table, lambda x: x[0])] 
[('AAPL', 25, 400), ('TITN', 25, 350), ('ANF', 25, 250)] 

編輯:考慮到新表,由OP給出的例子,據我所知,分析有在每個選擇步驟中優先考慮表中可用的有效最大值。然後使用:

table = [(u'COOL ', 25, 452.5), (u'MIND', 25, 221), 
     (u'SIMO', 25, 209), (u'RAVN', 25, 131.75), (u'AET', 25, 99), 
      ............................. 
     (u'CACI', 5, 9.1), (u'DISH ', 5, 3.45)] 

while table: 
    maxim = max(table, key= lambda x:x[2]) 
    print maxim 
    table = [tup for tup in table if tup[1] != maxim[1] and tup[0] != maxim[0]] 

此打印:

(u'COOL ', 25, 452.5) 
(u'MIND', 15, 132.59999999999999) 
(u'SIMO', 10, 83.599999999999994) 
(u'RAVN', 5, 26.350000000000001) 

請注意,這取決於你遵循連續選擇你的項目規則的結果是不同的(見下面我的意見)。上面代碼中選擇的條件是給出的結果更接近OP的結果。有可能我的答案中的附加術語對應於OP示例中的錯誤

+0

非常感謝joaquin,我會在我的真實數據集上測試這個場景並確認它! – wintermute 2012-01-17 19:55:24

+0

joaquin,有沒有可以做的調整,以返回一個獨特的重量每個行情?注意你的輸出中的所有代號都具有相同的權重,這應該基於分數遞減。所以AAPL的權重爲25,TITN的權重爲20,ANF的權重爲15 – wintermute 2012-01-18 03:24:59

+0

我不確定你的意思。如果你的意思是25只應該在一個元組中,那麼這意味着沒有唯一的答案。如果我首先得到('AAPL',25,400),那麼其他兩個元組都不會成爲結果的一部分。但是如果我先選擇('ANF',25,250),那麼('AAPL',25,400)就不會出現在結果中。那是你需要的嗎?有關於如何選擇結果的其他條件? – joaquin 2012-01-18 06:53:53

0

許多有效的答案。我的回答集中於可讀性爲開發者:

from collections import namedtuple 

Share = namedtuple('Share', 'name weight score') 
d = {} 
for share in [Share(*i) for i in table]: 
    try: 
     d[share.name] = share if share.score > d[share.name][2]\ 
           else d[share.name]  
    except KeyError: 
     d[share.name] = share 

for share in d: 
    print repr(d[share][:]).strip('()') 

>>> 'AAPL', 25, 400 
>>> 'TITN', 25, 350 
>>> 'ANF', 25, 250 

在你的桌子,好像體重已經集成在了比分,因爲每一個重點似乎代表着10個的得分點,並有重量,有直接關係得分了。

+0

沒有真正需要進行任何計算,只想找到一個行的唯一列表,其中特定權重的得分最高的行情被選中,並且每個權重只使用一次。所以在數據集中會有很多代碼,但我只想顯示一個特定的權重。 – wintermute 2012-01-17 19:54:54

+0

這是Tik和體重組合的最高分數。最終目標是提供一個股票的名單,這些股票是通過他們的分數加權的,而一隻股票只能被引用一次......所以「最高分」股票應該是與最高權重相關的股票。謝謝你的幫助先生! – wintermute 2012-01-17 20:42:20

+0

不,看起來所有的代碼都是以相同的重量返回的,這可以根據分數遞減嗎?所以AAPL的體重是25,TITN的體重是20,ANF的體重是15,體重是15? – wintermute 2012-01-18 03:28:02

0

嘿傢伙感謝您的反饋!我從你的意見中意識到,我需要退後一步。

爲了將每個權重分配給每個股票並試圖查詢該數據集,我根據其總體評分爲股票分配了一個獨特的權重。

* 這使用已經按最高分排序的數據集。

x = (25, 20, 15, 10, 10, 10, 5, 5) 
y = 0 
for each in table: 
    if y > 7: 
     pass 
    else: 
     w = each[0], each[1], each[2], x[y] 
     print w 
     y += 1 

感謝您的指導!併爲您的煩惱,這些是一些優質股...

(u'COOL ', 2.98, 0.54, 25) 
(u'MIND', 23.96, 2.12, 20) 
(u'SIMO', 22.35, 1.87, 15) 
(u'RAVN', 65.35, 3.45, 10) 
(u'AET', 43.93, 1.74, 10) 
(u'SBUX', 47.6, 1.59, 10) 
(u'ATVI', 12.56, 0.24, 5) 
(u'CACI', 56.96, 1.04, 5) 
+1

你沒有回答你自己的原始問題,而是你正在回答一個從未做過的問題! – joaquin 2012-01-18 08:09:48

+0

@joaquin看起來像是對我的回答。 – Kev 2012-01-18 12:16:37

+0

@Kev你有最後一個字,但我無法想象如何從OP(他自己)發佈的問題的兩個版本和預期結果中得出上述答案...... – joaquin 2012-01-18 13:39:08