#python #pandas #bloomberg
#python #pandas #bloomberg
Вопрос:
Я создаю приложение для тестирования торговли, и мне удалось получить данные в записной книжке jupyter с помощью pdblp. Однако данные являются многоуровневыми, и я недостаточно знаю о фреймах данных, чтобы правильно их распаковать.
Что мне нужно, так это иметь доступ к df[PX_LAST], который должен быть одинаковым независимо от используемого запаса. Это не так просто, как выдает df.keys()
MultiIndex(levels=[['AHT LN Equity'], ['BEST_PE_RATIO', 'PX_LAST']],
labels=[[0, 0], [1, 0]],
names=['ticker', 'field'])
Я пробовал
df = pd.DataFrame(df.to_records())
но это приводит к беспорядочным заголовкам, и у меня возникли проблемы с изменением имени.
import pdblp
con = pdblp.BCon(debug=False, port=8194, timeout=5000)
con.start()
df = con.bdh('AHT LN Equity', ['PX_LAST', 'BEST_PE_RATIO'], '20190102', '20190331')
Я пробовал
df1=df.unstack(уровень = 1).reset_index()
что не сработало, и
import pandas as pd
import numpy as np
df = pd.DataFrame(df.to_records())
последнее частично сработало, но сложно, поскольку я хочу переименовать столбец во что-то без тикера, а также возникли проблемы с апострофами, которые, я думаю, не удалось переименовать.
df.rename(columns={'('AHT LN Equity', 'PX_LAST')': 'Close'}, inplace=True)
File "<ipython-input-37-7677eac9ff45>", line 2
df.rename(columns={'('AHT LN Equity', 'PX_LAST')': 'Close'}, inplace=True)
^
SyntaxError: invalid syntax
Приветствуется любая помощь.
Ответ №1:
Несколько примеров, с которыми вы можете поиграть xbbg
:
In [1]: from xbbg import blp
In [2]: df = blp.bdh(['AHT LN Equity', 'AGK LN Equity'], ['PX_LAST', 'BEST_PE_RATIO'], start_date='20190102', end_date='20190331')
In [3]: df.tail()
Out[3]:
ticker AHT LN Equity AGK LN Equity
field PX_LAST BEST_PE_RATIO PX_LAST BEST_PE_RATIO
2019-03-25 1,827.50 11.09 749.96 14.62
2019-03-26 1,805.50 10.96 755.63 14.73
2019-03-27 1,809.00 10.98 751.52 14.71
2019-03-28 1,827.50 11.09 753.48 14.74
2019-03-29 1,852.50 11.24 770.71 15.08
Чтобы процитировать PX_LAST
, вы можете:
In [4]: df.xs('PX_LAST', axis=1, level=1).tail()
Out[4]:
ticker AHT LN Equity AGK LN Equity
2019-03-25 1,827.50 749.96
2019-03-26 1,805.50 755.63
2019-03-27 1,809.00 751.52
2019-03-28 1,827.50 753.48
2019-03-29 1,852.50 770.71
Чтобы указать данные AHT LN Equity
, вы можете либо:
In [5]: df['AHT LN Equity'].tail()
Out[5]:
field PX_LAST BEST_PE_RATIO
2019-03-25 1,827.50 11.09
2019-03-26 1,805.50 10.96
2019-03-27 1,809.00 10.98
2019-03-28 1,827.50 11.09
2019-03-29 1,852.50 11.24
или
In [6]: df.loc[:, 'AHT LN Equity'].tail()
Out[6]:
field PX_LAST BEST_PE_RATIO
2019-03-25 1,827.50 11.09
2019-03-26 1,805.50 10.96
2019-03-27 1,809.00 10.98
2019-03-28 1,827.50 11.09
2019-03-29 1,852.50 11.24
Цитируя BEST_PE_RATIO
AHT LN Equity
, вы можете либо (обратите внимание на незначительные различия в названии Series
):
In [7]: df['AHT LN Equity']['BEST_PE_RATIO'].tail()
Out[7]:
2019-03-25 11.09
2019-03-26 10.96
2019-03-27 10.98
2019-03-28 11.09
2019-03-29 11.24
Name: BEST_PE_RATIO, dtype: float64
или
In [8]: df[('AHT LN Equity', 'BEST_PE_RATIO')].tail()
Out[8]:
2019-03-25 11.09
2019-03-26 10.96
2019-03-27 10.98
2019-03-28 11.09
2019-03-29 11.24
Name: (AHT LN Equity, BEST_PE_RATIO), dtype: float64
Комментарии:
1. спасибо за это очень полезно — я использовал pdblp, а затем просто выполнил df1 = df.loc[:, AHT LN Equity] . Это решило проблему с несколькими индексами. Это большая проблема, потому что в формате raw вы не можете использовать циклы for, операторы if и т. Д. Теперь мы так высоко оценили его работу.
Ответ №2:
Используйте pd.IndexSlice
при попытке разрезать столбец или индекс в мультииндексе pd.IndexSlice очень эффективен.
# set idx for ease of use.
idx = pd.IndexSlice
Фрагмент с использованием .loc
# if you are slicing in the column
df.loc[:, idx[:,'PX_LAST']]
# if you have more than one item in level 1
df.loc[:, idx[:,['BEST_PE_RATIO','PX_LAST']]
# if you wish to add slice up one level
df.loc[:, idx['AHT LN Equity','BEST_PE_RATIO']]
# if you are slicing in the index
df.loc[idx[:,'SOME_INDEX'],:]
# if you are slicing in both index and column
df.loc[idx[:,'SOME_INDEX'], idx[:,'PX_LAST']]