установить все совпадающие элементы в мультииндексном кадре данных в серию - PullRequest
0 голосов
/ 28 июня 2018

Ранее я использовал pandas.Panel для хранения нескольких фреймов данных, по одному на дату в списке дат.

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

В качестве примера у меня есть следующие данные:

dates  = pandas.date_range('20180101', periods=3)
stocks = ['AAPL', 'GOOG', 'MSFT', 'AMZN', 'FB']

До устаревания я мог бы создать панель следующим образом:

pnl = pandas.Panel(items=dates, major_axis=stocks, minor_axis=stocks, dtype=float)

Теперь у меня есть 1 кадр данных на дату, например, выбирая первый:

pnl['2018-01-01']

возвращает кадр данных следующим образом:

enter image description here

Теперь, однако, согласно совету в предупреждении о дефракции, я создаю мультииндексный фрейм данных:

tuples = list(itertools.product(dates, stocks))
index  = pandas.MultiIndex.from_tuples(tuples, names=['date', 'stock'])
df     = pandas.DataFrame(index=index, columns=stocks, dtype=float)

Полученный кадр данных теперь выглядит так:

enter image description here

Пока все хорошо ...

Заполнение кадра данных:

У меня есть pandas.Series данных для данной пары акций, с одной записью на дату.

Например:

data = pandas.Series([1.3, 7.4, 8.2], index=dates)

Серия выглядит так:

2018-01-01    1.3
2018-01-02    7.4
2018-01-03    8.2
Freq: D, dtype: float64

Скажем, к примеру, эти данные для биржевой пары ['GOOG','MSFT'].

Я хотел бы установить все ['GOOG','MSFT'] записей.

С моей панелью я мог бы очень легко сделать это, используя следующий краткий синтаксис:

pnl.loc[:,'GOOG','MSFT'] = data

Какой самый простой способ выбрать все элементы ['GOOG','MSFT'] из моего мультииндексного фрейма данных и установить их для моего объекта pandas.Series (т.е. дата для даты)?

1 Ответ

0 голосов
/ 28 июня 2018

Использование pd.DataFrame.loc & pd.IndexSlice:

df.loc[pd.IndexSlice[data.index, 'GOOG'], 'MSFT'] = data.values

Если у вас много пар данных, поместите их в словарь, например:

pairs = {('GOOG', 'MSFT'): data}

Затем выполните итерацию по парам, установив значение с помощью loc & pd.IndexSlice.

for k, v in pairs.items():
    df.loc[pd.IndexSlice[v.index, k[0]], k[1]] = v.values

В качестве альтернативы IndexSlice вы можете настроить логический индекс на мультииндекс, используя метод индекса get_level_value

df.loc[ (df.index.get_level_values(1) == 'GOOG') &
        (df.index.get_level_values(0).isin(data.index))
       , 'MSFT'] = data.values

Все вышеперечисленное приведет к следующему выводу:

                  AAPL  GOOG  MSFT  AMZN  FB
date       stock
2018-01-01 AAPL    NaN   NaN   NaN   NaN NaN
           GOOG    NaN   NaN   1.3   NaN NaN
           MSFT    NaN   NaN   NaN   NaN NaN
           AMZN    NaN   NaN   NaN   NaN NaN
           FB      NaN   NaN   NaN   NaN NaN
2018-01-02 AAPL    NaN   NaN   NaN   NaN NaN
           GOOG    NaN   NaN   7.4   NaN NaN
           MSFT    NaN   NaN   NaN   NaN NaN
           AMZN    NaN   NaN   NaN   NaN NaN
           FB      NaN   NaN   NaN   NaN NaN
2018-01-03 AAPL    NaN   NaN   NaN   NaN NaN
           GOOG    NaN   NaN   8.2   NaN NaN
           MSFT    NaN   NaN   NaN   NaN NaN
           AMZN    NaN   NaN   NaN   NaN NaN
           FB      NaN   NaN   NaN   NaN NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...