2012-01-17 48 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