我需要帮助计算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%
任何帮助都非常感激。
答案 0 :(得分:1)
您可以使用value_list = res.values()
之类的内容获取字典中所有值的列表。这将是可迭代的,您可以使用for循环和列表切片来获取价格值。 value_list[0]
将包含您将所有内容划分的最低价格。然后,根据您计划对数据执行的操作,您可以使用for循环计算所有百分比或将其包装在函数中并根据需要运行它。
答案 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'}
]