Выбор значений из одного мультииндексного фрейма данных для добавления в новый столбец в другом существующем мультииндексном фрейме данных - PullRequest
0 голосов
/ 22 января 2020

Хорошо, я мог бы использовать небольшую помощь в этом. Я создал функцию, в которую я могу вставить два мультииндексных фрейма данных, а также список kwargs, и функция затем возьмет значения из одного фрейма данных и добавит их к другому в новый столбец.

Просто чтобы убедиться, что я объясняю это достаточно хорошо, оба фрейма данных являются информацией о запасах, где один фрейм данных - это моя "вселенная" или акции, которые я анализирую, а другой - Фреймы данных рыночных и отраслевых ETF.

Итак, моя функция принимает kwargs в виде:

new_stock_column_name = "existing_sector_column_name"

Вот моя действительная функция:

def map_columns(hist_multi_to, hist_multi_from, **kwargs):
    ''' Map columns from the sector multi index dataframe to a new column
        in the existing universe multi index dataframe.

        **kwargs should be in the format newcolumn="existing_sector_column"
    '''
    df_to = hist_multi_to.copy()
    df_from = hist_multi_from.copy()

    for key, value in kwargs.items(): 
        df_to[key] = np.nan

        for index, val in df_to.iterrows():
            try:
                df_to.loc[index, key] = df_from.loc[(index[0],val.xl_sect),value]
            except KeyError:
                pass

    return df_to

Я считаю, что моя функция работает точно так же, как Я намерен, за исключением того, что это займет смехотворно много времени, чтобы l oop через данные. Должен быть лучший способ сделать это, поэтому любая помощь, которую вы можете оказать, будет принята с благодарностью.

Я заранее извиняюсь, но у меня возникают проблемы при создании двух простых примеров данных, но единственное реальное требование состоит в том, чтобы в базовом кадре данных был столбец, в котором перечислены его сектора ETF, и значение этого столбца. непосредственно совпадает с индексом уровня 1 информационного кадра ETF.

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

Обновление Вот пересмотренный фрагмент кода, который позволит вам запустить функцию, чтобы увидеть, о чем я говорю. Простите, мои навыки кодирования ограничены.

import pandas as pd
import numpy as np

stock_arrays = [np.array(['1/1/2020','1/1/2020','1/2/2020','1/2/2020']),
                np.array(['aapl', 'amzn', 'aapl', 'amzn'])]
stock_tuples = list(zip(*stock_arrays))
stock_index = pd.MultiIndex.from_tuples(stock_tuples, names=['date', 'stock'])

etf_arrays = [np.array(['1/1/2020','1/1/2020','1/2/2020','1/2/2020']),
                np.array(['xly', 'xlk','xly', 'xlk'])]
etf_tuples = list(zip(*etf_arrays))
etf_index = pd.MultiIndex.from_tuples(etf_tuples, names=['date', 'stock'])

stock_df = pd.DataFrame(np.random.randn(4), index=stock_index, columns=['close_price'])
etf_df = pd.DataFrame(np.random.randn(4), index=etf_index, columns=['close_price'])

stock_df['xl_sect'] = np.array(['xlk', 'xly','xlk', 'xly'])

def map_columns(hist_multi_to, hist_multi_from, **kwargs):
    ''' Map columns from the sector multi index dataframe to a new column
        in the existing universe multi index dataframe.

        **kwargs should be in the format newcolumn="existing_sector_column"
    '''
    df_to = hist_multi_to.copy()
    df_from = hist_multi_from.copy()

    for key, value in kwargs.items(): 
        df_to[key] = np.nan

        for index, val in df_to.iterrows():
            try:
                df_to.loc[index, key] = df_from.loc[(index[0],val.xl_sect),value]
            except KeyError:
                pass

    return df_to

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

new_stock_df = map_columns(stock_df, etf_df, sect_etf_close='close_price')
new_stock_df

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

...