如何实现此数据集的正确输出?

2024-06-02 11:12:44 发布

您现在位置:Python中文网/ 问答频道 /正文

从数据集中获取正确的输出时遇到问题。你知道吗

我有一个数据集,其中包含一个股票代码名,权重和分数,并想拉一个TIK,权重,分数的唯一列表,其中分数=最大(分数)为给定的股票代码。你知道吗

数据集的一个例子是

[(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磅的时候得分最高,那么它就不能在其他任何重量的时候再次使用。你知道吗

这很难解释希望我已经提供了足够的给你们提供一些指导。你知道吗

***附加了一些真实的样本数据以进一步说明


Tags: 数据分数权重股票代码aetcoolaapldish
3条回答
>>> 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示例中的错误

许多有效的答案。我的回答侧重于开发人员的可读性:

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个分数,并且权重和分数之间存在直接的相关性。你知道吗

在不使用其他库的情况下,可以按以下方式进行:

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

其结果与输入的列表格式相同。你知道吗

相关问题 更多 >