根据python词典计算百分比

时间:2013-04-12 04:22:07

标签: python python-2.7

我需要帮助计算dict日期值的每个字母到百分比。

raw_data = [{'name':'AB', 'date':datetime.date(2012, 10, 2), 'price': 23.80}, {'name':'AB', 'date':datetime.date(2012, 10, 3), 'price': 23.72}]

我已经使用集合在字典上面形成了以下格式。

import collections
res = collections.defaultdict(dict)

for row in raw_data:
  row_col = res[row['name']]
  row_col[row['date']] = row['price']


  {'AB': {datetime.date(2012, 10, 2): 23.80,
  datetime.date(2012, 10, 3): 23.72,
  datetime.date(2012, 10, 4): 25.90,
  datetime.date(2012, 10, 5): 29.95}

现在我需要将以上数据计算成以下格式。

计算公式:

最后价格将为所有最高值分红

   Date                               Price   Percentage 
   datetime.date(2012, 10, 5)         29.95      26%     
   datetime.date(2012, 10, 4)         25.90      9%        
   datetime.date(2012, 10, 3)         23.72      0%      
   datetime.date(2012, 10, 2)         23.80      0       

计算就像这样

(23.72/23.80-1) * 100 = 0% 
(25.90/23.80-1) * 100 = 9% 
(29.95/23.80-1) * 100 = 26%

任何帮助都非常感激。

2 个答案:

答案 0 :(得分:1)

您可以使用value_list = res.values()之类的内容获取字典中所有值的列表。这将是可迭代的,您可以使用for循环和列表切片来获取价格值。 value_list[0]将包含您将所有内容划分的最低价格。然后,根据您计划对数据执行的操作,您可以使用for循环计算所有百分比或将其包装在函数中并根据需要运行它。

参考:Python: Index a Dictionary?

答案 1 :(得分:0)

import datetime
import collections

raw_data = [
{'name':'AB', 'date':datetime.date(2012, 10, 2), 'price': 23.80}, 
{'name':'AB', 'date':datetime.date(2012, 10, 3), 'price': 23.72},
{'name':'AB', 'date':datetime.date(2012, 10, 4), 'price': 25.90},
{'name':'AB', 'date':datetime.date(2012, 10, 5), 'price': 29.95}
]

#all unique names in raw_data
names = set(row["name"] for row in raw_data)
#lowest prices, keyed by name
lowestPrices = {name: min(row["price"] for row in raw_data) for name in names}

for row in raw_data:
    name = row["name"]
    lowestPrice = lowestPrices[name]
    price = row["price"]
    percentage = ((price/lowestPrice)-1)*100
    row["percentage"] = percentage

print raw_data

输出(由我添加的新行):

[
{'date': datetime.date(2012, 10, 5), 'price': 29.95, 'percentage': 26.264755480607093, 'name': 'AB'},
{'date': datetime.date(2012, 10, 4), 'price': 25.9, 'percentage': 9.190556492411472, 'name': 'AB'}, 
{'date': datetime.date(2012, 10, 2), 'price': 23.8, 'percentage': 0.337268128161905, 'name': 'AB'}, 
{'date': datetime.date(2012, 10, 3), 'price': 23.72, 'percentage': 0, 'name': 'AB'} 
]