python - for循环,一些符号存在,但另一些不存在
问题描述
我遇到了一个新手的棘手问题。
我有一些数据(pettm_rank_20、roa_rank_20、roe_rank_20、npttm_rank_20 mkt_rank_20 和located_symbols):
pettm_rank_20
signal
002610.CS -1
000002.CS 1
roa_rank_20
signal
603719.CS -1
000001.CS 1
roe_rank_20
signal
300751.CS -1
002610.CS 1
npttm_rank_20
signal
300751.CS -1
002610.CS 1
mkt_rank_20
signal
000001.CS -1
002610.CS 1
located_symbols
['000001.CS', '000002.CS', '300724.CS', '300751.CS', '002610.CS', '603719.CS']
问题出在pettm_rank_20,located_symbols只有两项,
for symbol in located_symbols:
alphaReturn = {}
alphaReturns = 5 + (pettm_rank_20.loc[symbol]*2.5 + roa_rank_20.loc[symbol]*3 +
roe_rank_20.loc[symbol]*1.1 +
npttm_rank_20.loc[symbol]*1.7 +
mkt_rank_20[symbol]*3.3)
alphaReturn[symbol] = alphaReturns
错误很明显:
KeyError: 'the label [000001.CS] is not in the [index]'
我该如何解决这个逻辑问题,对不起我的编程能力不好,我假设其他人可能有同样的问题,所以我在这里发布,如果可能需要一些......
从 Ieo 的,我创建了大 dic:
total
signal_mkt signal_npttm signal_pettm signal_roa signal_roe
002610.CS NaN NaN -1.0 NaN NaN
000002.CS NaN NaN 1.0 NaN NaN
603719.CS NaN NaN NaN -1.0 NaN
000001.CS NaN NaN NaN 1.0 NaN
300751.CS NaN NaN NaN NaN -1.0
002610.CS NaN NaN NaN NaN 1.0
300751.CS NaN -1.0 NaN NaN NaN
002610.CS NaN 1.0 NaN NaN NaN
000001.CS -1.0 NaN NaN NaN NaN
002610.CS 1.0 NaN NaN NaN NaN
问题是:
total['signal_mkt']['000001.CS']
000001.CS NaN
000001.CS -1.0
Name: signal_mkt, dtype: float64
我只需要 -1 而不是 NaN,有没有办法解决它?我假设其他人可能有同样的问题,想找到一种优雅的方式吗?
我的方式有点傻:
total['signal_mkt']['000001.CS'][total['signal_mkt']['000001.CS'].notna()]
000001.CS -1.0
Name: signal_mkt, dtype: float64
解决方案
你应该了解python中的字典。您在编辑中添加的不是字典,而是表格。字典是键值对的集合。你给一个钥匙,然后说给我这个钥匙的价值。
您的定位符号数组应作为字典的键。
symbol_dict = {
"002610.CS": -1
"000002.CS": 1
"603719.CS": -1
"000001.CS": 1
"300751.CS": -1
"002610.CS": 1
"300751.CS": -1
"002610.CS": 1
"000001.CS": -1
"002610.CS": 1
}
然后,当您想要访问特定符号(例如 002610.CS)的值时,您可以执行 - symbol_dict['002610.CS']
。如果字典中不存在该键,这将返回一个键错误。
如果您不确定字典中是否存在某个键,您可以这样访问字典 -symbol_dict.get('non_existent_key', 'default_value')
这不会返回错误。如果字典中不存在该键,它将返回默认值。
located_symbols = ['000001.CS', '000002.CS', '300724.CS', '300751.CS', '002610.CS', '603719.CS']
factor_dict = {
"002610.CS": 2.5
"000002.CS": 2.5
"603719.CS": 3
"000001.CS": 3
"300751.CS": 1.1
"002610.CS": 1.1
"300751.CS": 1.7
"002610.CS": 1.7
"000001.CS": 3.3
"002610.CS": 3.3
}
for each in located_symbols:
alphaReturn = {}
alphaReturns = 5 + symbol_dict.get(each, 0) * factor_dict.get(each, 0) # usong 0 as default
alphaReturn[each] = alphaReturns
我不确定我所做的计算是否是您想要的。但是显示了使用可能存在或不存在的键访问字典的方法。
如果您使用熊猫(假设您在问题中提供了很多表格),熊猫本身有一种将您的表格转换为字典的方法。
您还可以像这样创建嵌套字典 -
symbol_dict = {
"002610.CS": {
"value": -1,
"factor": 2.5
},
"000002.CS": {
"value": 1,
"factor": 2.5
}
"603719.CS": {
"value": -1,
"factor": 3
}
"000001.CS": {
"value": 1,
"factor": 3
}
"300751.CS": {
"value": -1,
"factor": 1.1
}
"002610.CS": {
"value": 1,
"factor": 1.1
}
"300751.CS": {
"value": -1,
"factor": 1.7
}
"002610.CS": {
"value": 1,
"factor": 1.7
}
"000001.CS": {
"value": -1,
"factor": 3.3
}
"002610.CS": {
"value": 1,
"factor": 3.3
}
}
然后你的代码变成 -
for each in located_symbols:
alphaReturn = {}
if each in symbol_dict.keys(): # Check if key exists in dictionary else do nothing
alphaReturns = 5 + symbol_dict[each]['value'] * symbol_dict[each]['factor']
alphaReturn[each] = alphaReturns
推荐阅读
- r - Shiny 找不到包 RJSONIO
- python - Turtle onkeypress 功能不接受输入
- dataframe - names(x) <- value 中的错误:“names”属性必须与向量的长度相同——OpenML
- zapier - 在 Zapier 的代码中,如何将字段附加到常量 URL?
- arrays - 用 C 在特定内存位置声明二维整数数组
- r - 如何获得将对象分组的所有组合?
- javascript - 你可以在 Typescript 中声明一个特定长度的数组类型吗?
- mysql - 仅当重复列具有相同数据时才获取不同的列
- json - 在 Thunkable 中调用数据列表
- python - pgAdmin4 错误:ModuleNotFoundError:没有名为“email_validator”的模块