#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(<ключ>, <ключ><по умолчанию>) кажется хорошим, можете ли вы предоставить пример кода; все данные предоставлены, действительно пробовали…