首页 > 解决方案 > 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

解决方案


你应该了解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

推荐阅读