для цикла некоторые символы существуют, но некоторые другие нет

#python

Вопрос:

Я столкнулся с непростой проблемой для новичка.

У меня есть некоторые данные(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
 

Комментарии:

1. вы уже знаете, что в опубликованных наборах данных есть только элементы sm. что вы ожидаете, когда попытаетесь получить доступ к ключу, которого нет в словаре ?

2. Я просто хочу знать алфавитные обороты каждого символа в located_symbols, хочу найти элегантный способ его достижения

3. Создайте словарь всех ваших символов с его значениями и получите доступ к нему вместо доступа к вашим меньшим диктантам, у которых могут быть или могут не быть ключи, к которым вы обращаетесь.

4. Я знаю, что это способ, но у этого способа есть проблема, у него есть НаН, поэтому я должен дать условие, чтобы выбрать правильный

5. какая бабуля ?? в python нет NaN

Ответ №1:

Вам следует узнать о словарях на 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
 

Я не уверен, что расчеты, которые я сделал, — это то, что вам нужно. Но показан способ доступа к словарю с ключами, которых может быть или не быть.

Если вы используете pandas(при условии, что вы указали много таблиц в вопросе), у самой pandas есть способ преобразования вашей таблицы в словарь.

Вы также можете создавать вложенные словари, подобные этому —

 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
 

Комментарии:

1. Я понял, что вы имеете в виду, большое вам спасибо!

Ответ №2:

 for symbol in located_symbols:
    try:
        a = a[symbol].loc['signal_pettm'][a[symbol].loc['signal_pettm'].notna()].values.item()
    except:
        a = 0
    try:
        b = a[symbol].loc['signal_roe'][a[symbol].loc['signal_roe'].notna()].values.item()
    except:
        b = 0
    try:
        c = a[symbol].loc['signal_roa'][a[symbol].loc['signal_roa'].notna()].values.item()
    except:
        c = 0
    try:
        d = a[symbol].loc['signal_npttm'][a[symbol].loc['signal_npttm'].notna()].values.item()
    except:
        d = 0
    try:
        e = a[symbol].loc['signal_mkt'][a[symbol].loc['signal_mkt'].notna()].values.item()
    except:
        e = 0
    
    alphaReturns = intercept a*coe_list[0] b*coe_list[1] c*coe_list[2] d*coe_list[3] e*coe_list[4]
    alphaReturn[symbol] = (alphaReturns)```
my solution to this is too urgly, as using too many try and except, but this is only way I figured out...
 

Комментарии:

1. вы используете 0, если символ не существует в словаре. Просто сделай get(<key>, <default>) это . Просто прочитайте о том, как получить доступ к словарю.

2. get(<ключ>, <ключ><по умолчанию>) кажется хорошим, можете ли вы предоставить пример кода; все данные предоставлены, действительно пробовали…