我正在尝试比较两个单独列表中具有匹配名称的最后一个值。例如:[(('Matching Name', '2015-06-25', 25.37), ('Matching Name', '2018-08-09', 74.66))]
我想通过[]括号内具有匹配名称的每个嵌套列表,将百分比变化从25.37提取到74.66。
示例输入数据:
> "(('', '2015-06-25', 25.37), ('', '2018-08-09', 74.66))","(('A',
> '2008-12-26', 10.38), ('A', '2019-04-29', 77.33))","(('AA',
> '2016-11-01', 22.92), ('AA', '2019-04-29', 26.85))","(('AAL',
> '2008-12-26', 7.1), ('AAL', '2019-04-29', 33.77))","(('AAMC',
> '2012-12-13', 15.), ('AAMC', '2019-04-29', 9.94))"
答案 0 :(得分:0)
一种方法是创建一个字典,其中的键是“匹配名称”,值是最后一个值的列表,然后对给定键的每个值执行计算。
目前尚不清楚您拥有什么数据结构,但是如果与以下假定的结构不同,则可以修改代码。
在下面的代码中,首先将列表缩小为“名称”和“价格”的元组。
from collections import defaultdict
the_list = [(
('', '2015-06-25', 25.37), ('', '2018-08-09', 74.66),
('A', '2008-12-26', 10.38), ('A', '2019-04-29', 77.33),
('AA','2016-11-01', 22.92), ('AA', '2019-04-29', 26.85),
)]
reduced_list = [(x,z) for tick in the_list for x,y,z in tick]
print(reduced_list)
# [('', 25.37), ('', 74.66), ('A', 10.38), ('A', 77.33), ('AA', 22.92), ('AA', 26.85)]
然后创建一个字典,其中关键字是名称,值是价格列表
# Map all 'Matching Name', where the dict key is 'Matching Name'
# and dict value is a list of last values
tickDict = defaultdict(list)
for key, val in reduced_list:
tickDict[key].append(val)
print(tickDict)
# defaultdict(<class 'list'>, {'': [25.37, 74.66], 'A': [10.38, 77.33], 'AA': [22.92, 26.85]})
最后,您可以通过计算来执行您的计算,例如计算更改:
# Compute percentage change
ratio = {key: tickDict[key][1]/tickDict[key][0]-1 for key in tickDict}
print(ratio)
# {'': 1.9428458809617655, 'A': 6.449903660886319, 'AA': 0.17146596858638752}
答案 1 :(得分:0)
pandas
是一个很好的第三方工具,可用于此目的:
raw = [
('', '2015-06-25', 25.37), ('', '2018-08-09', 74.66),
('A', '2008-12-26', 10.38), ('A', '2019-04-29', 77.33),
('AA', '2016-11-01', 22.92), ('AA', '2019-04-29', 26.85),
('AAL', '2008-12-26', 7.1), ('AAL', '2019-04-29', 33.77),
('AAMC', '2012-12-13', 15.), ('AAMC', '2019-04-29', 9.94)
]
import pandas as pd
df = pd.DataFrame(raw, columns=['symbol', 'date', 'value'])
df['date'] = pd.to_datetime(df['date'])
df.sort_values( ['symbol', 'date'] )
grouped = dict(list(df.groupby('symbol')))
for symbol, performance in grouped.items():
print('')
print(symbol)
print(performance.drop(columns=['symbol']).diff())
输出如下:
''
date value
0 NaT NaN
1 1141 days 49.29
'A'
date value
2 NaT NaN
3 3776 days 66.95
'AA'
date value
4 NaT NaN
5 909 days 3.93
'AAL'
date value
6 NaT NaN
7 3776 days 26.67
'AAMC'
date value
8 NaT NaN
9 2328 days -5.06