python - 如何获得该数据集的正确输出?

标签 python

我在从数据集中获取正确的输出时遇到问题。

我有一个包含股票代码名称、权重和分数的数据集,并且想要提取 TIK、权重、分数的唯一列表,其中给定股票代码的分数 = MAX(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,其相关分数的权重为 15,直到 sum(weight) = 100。

对于给定的重量,每个代码只能报告一次。因此,如果 AAPL 在权重 25 时得分最高,则不能在任何其他权重下再次使用。

这很难解释,希望我已经为你们提供了足够的指导。

***为了更加清晰而附加了一些真实的示例数据

最佳答案

>>> 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示例中的错误

关于python - 如何获得该数据集的正确输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8899925/

相关文章:

python - 如何使用 csv dictreader、matplotlib 和 numpy 创建概率密度函数图?

python - 如果库/API 不可用,则从硬件(例如闭路电视、RFID)检索数据

python - MySQL On Update 未触发 Django/TastyPie REST API

python - 将 4D float 组从 txt(字符串)文件转换为 numpy float 组

javascript - 代码的技术名称不属于任何功能

python - 如何在不使用原始字符串的情况下将 `sed` 命令传递给 `popen`?

python - 将时间戳列拆分为单独的日期和时间列

python - 有时会返回一个数据框而不是一个系列

python - 使用 pandas 为每个组创建一个组合 DataFrame

python - 使用 shutil 库将目录的内容从 src 复制到 dst,而不是目录本身