2012-01-17 11 views
1

私のデータセットから適切な出力を得ることに問題があります。このデータセットに対して適切な出力を得るにはどうすればよいですか?

私はティッカー名、重量、スコアを含むデータセットを持っており、与えられたティッカーシンボルのスコア= MAX(スコア)のTIK、Weight、Scoreのユニークなリストを取得したいと考えています。

データセットの例は、データセット内の各ティッカーため.....

[(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の体重を有し、合計(体重)= 100になるまで15の体重を有する。

各ティッカーは、所定の重量。したがって、AAPLが体重25で最も高いスコアを有する場合、他の体重では再び使用することはできません。

これは、私が皆さんにいくつかの指針を提供するのに十分なものであることをうまく説明してくれたのは難しいことでした。

あなたの入力と同じリスト形式で結果
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

あなたの出力は正しいですか? '300 'は' TITN'テロップの間で最も高いスコアではないから – juliomalegria

+0

新しいコードで私の編集を見る – joaquin

答えて

0

まあ、いくつかの追加のライブラリを使用せずにこれを行うことができます追加

*** 。

+0

とてもおかげさまで!実際のデータセットに対してこれをテストします。ライブラリを使用しないでアプローチに感謝! – wintermute

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

ジョアキンに感謝します。実際のデータセットでこのシナリオをテストして確認します。 – wintermute

+0

joaquin、ティッカーごとに一意の重量を返すために行うことができる調整はありますか?出力のすべてのティッカーが同じウェイトを持つことに注意してください。スコアに基づいてデクリメントする必要があります。 AAPLの体重は25、TITNの体重は20、ANFの体重は15である – wintermute

+0

あなたは何を意味するのかよく分かりません。タプルのうちの1つにしか25がなければならないということを意味するならば、これはユニークな答えがないことを意味します。私が( 'AAPL'、25,400)を最初に得ると、他の2つのタプルのどれもが結果の一部にはならないでしょう。しかし、最初に( 'ANF'、25,250)を選択すると、( 'AAPL'、25,400)という結果にはなりません。それはあなたが必要とするものですか?結果を選択する方法について他の条件はありますか? – joaquin

0

多くの有効な回答。私の答えは、開発者のための読みやすさに焦点を当てています。

すべての重みポイントが10点の得点を表しているようだと重量との間に直接的な相関関係があるので、それは、すでにスコアに統合された重みのように思えるあなたのテーブルでは
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 

スコア。

+0

実際の計算は必要ありません。特定の重量のスコアが最も高いテロップが選択されている行のユニークなリストを探したいだけで、重みごとに1回しか使用しません。したがって、データセットには多くのティッカーが表示されますが、私は特定のウエイトに対してベストを表示したいだけです。 – wintermute

+0

ティック&ウェイトの組み合わせで最高スコア。最終目標は、スコアで重み付けされた株式のリストを提供することです。株式は一度しか参照できません。したがって、最高スコアは、最高の重みに関連付けられた株式でなければなりません。助けてくれてありがとう! – wintermute

+0

ドン、それはすべてのティッカーが同じ重量で返されるようです、これはスコアに基づいて減少することができますか? AAPLの体重は25、TITNの体重は20、ANFの体重は15、体重は15である。 – wintermute

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

+0

@joaquinは私の答えのように見えます。 – Kev

+0

@Kevあなたは最後の言葉を持っていますが、質問の2つのバージョンとOP(自分自身)が掲示した期待結果のいずれかから上記の答えを導き出す方法を想像できませんでした... – joaquin

関連する問題