根据数据表生成排名

时间:2011-02-22 22:22:42

标签: python

背景:

我一直在创建一个基于输入目录中存在的输入csv的脚本,创建一个3维数组来存储聚合信息。数组中的每个表代表一个污染源(例如,输入csv之一是Incinerators.csv,创建的表将是关于流域规模的焚化炉释放的各种污染物的汇总信息),每行代表聚合信息分水岭 - 第0行=标题,每列是每种物质的数量和毒性当量 - col 0 =分水岭ID。

对于每个分水岭中的每种物质,计算所有来源释放的总量并将其存储在另一个数组中,使用totals[wsid][substance]通过索引或基于名称的字典查找可以寻址完全相同的布局。

问题:

通过这个总计表,我需要计算每个分水岭相对于其他流域释放的每种物质释放量的相对等级。

我可以使用几个嵌套循环遍历每个物质列并将其转换为列表,对列表进行排序,然后将其与流域ID相关联......但这不是一个非常干净的解决方案。零值也需要从排名中省略,重复值应该被赋予相同的排名,同时减少排名的总数。

有更聪明的方法吗?或者已经实现的模块? (没有在pyTables中看到任何明显的东西)

其中一个要求是解决方案也足够简单,以便那些比我更少的python经验的人至少能够理解这个过程。我最多可以使用2.7.1

最终目标:

根据结果生成来自Google地球描述气泡的iframed的HTML页面。我已经完成了几个<​​em>完全未完成的示例输出here

1 个答案:

答案 0 :(得分:0)

为此,我创建了2个函数

def sortTable(table, col):
    return sorted(table, key=itemgetter(col))

def buildRankTable(totalTable, fieldList, wsidList, subList, subDict, wsidDict):
    ## build rankTable to mimic other templates
    rankTable = newTemplateTable(wsidList, fieldList)

    ## add another row to track total number ranked for each substance
    numRanked = [0 for i in range(len(fieldList))]
    numRanked[0] = "TotalNoRanked"
    rankTable.append(numRanked)

    for substance in subList:
        tempTable = sortTable(totalTable, subDict[substance])
        exportCsv(tempTable, outdir + os.sep + "rankT_" + substance + ".csv")
        rankList = []
        ## extract a the low to high list of wsid's, skipping non-floats (no measurement)
        for row in tempTable:
            if type(row[subDict[substance]]) == float:
                rankList.append(row[0]) ## build wsid list in ranked order
        numRanked[subDict[substance]] = len(rankList)

        ## by default, this ranks low to high, we want to rank high to low starting at 1
        rankList.reverse()

        ## with the list of ranked wsids, get the rank and save to rankTable
        for rank, wsid in enumerate(rankList): 
            rankTable[wsidDict[wsid]][subDict[substance]] = rank + 1

    ## any 0 (default) values become 'NR' - No Rank
    for rowI in range(len(rankTable)):
        for colI in range(len(rankTable[rowI])):
            if rankTable[rowI][colI] == 0:
                rankTable[rowI][colI] = "NR"
    return rankTable'
  • fieldList =第一行中的字段列表
  • wsidList = wsid的列表(剩余的595行)
  • subList =要排名的物质列表
  • subDict =字典,用于将每种物质映射到totalTable中的col索引
  • wsidDict =字典来映射每个wsid它在totalTable中的行索引