Хорошо, я мог бы использовать небольшую помощь в этом. Я создал функцию, в которую я могу вставить два мультииндексных фрейма данных, а также список 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
Надеюсь, это будет более полезным. И, как вы можете видеть, функция работает, но с очень большими наборами данных она чрезвычайно медленная и неэффективная.