#python #pandas #numpy #dataframe
#python #pandas #numpy #фрейм данных
Вопрос:
У меня есть 3 фрейма данных, все они имеют одинаковую длину индекса, но имеют разное количество столбцов. Это их выходные данные
df1:
HPMI LQPN VHJ AEBV WOY
2008-08-31 0 0 0 0 0
2008-09-30 0 0 0 0 0
2008-10-31 0 1 0 1 1
2008-11-30 1 1 1 0 0
df2:
HPMI LQPN VHJ AEBV WOY
2008-08-31 0 0 0 0 0
2008-09-30 0 0 0 0 0
2008-10-31 1 0 1 1 0
2008-11-30 0 1 0 1 1
df3:
HPMI LQPN VHJ AEBV WOY
2008-08-31 3.13172138 0.72709204 5.76874778 1.77557845 0.04098317
2008-09-30 -3.78816218 -0.67583590 -4.95433863 -1.67093250 -0.24929051
2008-10-31 0.05579709 0.29199789 0.00697116 1.05956179 0.30686995
2008-11-30 1.25459098 6.87369275 2.58265839 6.92676837 0.84632677
Я хотел бы выполнить вычисление, например, в df2, если HPMI == 1 на дату 2008-10-31, тогда я хотел бы выполнить вычисление с тем же именем столбца и значением индекса df3, в противном случае, если HPMI == 0, тогда сделайте df3 == 0.
Это то, что у меня есть до сих пор, и это работает, но не работает с фреймами данных, которые имеют разное количество столбцов или строк.
Я не уверен, правильно ли я формулирую вопрос, поэтому, пожалуйста, дайте мне знать, если что-то неясно, и любая помощь будет оценена
def portfolio_returns(df1, df2, df3, n_stocks):
weight = 1 / n_stocks
output_short = np.where(df1 == 1, (df3 * weight)* -1, 0)
output_long = np.where(df2 == 1, df3 * weight, 0)
output = output_short output_long
expected_returns = pd.DataFrame(output, columns=lookahead_returns.columns, index=lookahead_returns.index)
return expected_returns
Ответ №1:
Если требуется одинаковое количество и порядок во всех 3 фреймах данных, которые используются Index.union
с DataFrame.reindex
, здесь задается 0
для несуществующих столбцов параметром fill_value=0
:
def portfolio_returns(df1, df2, df3, n_stocks):
cols = df1.columns.union(df2.columns).union(df3.columns)
df1 = df1.reindex(cols, axis=1, fill_value=0)
df2 = df2.reindex(cols, axis=1, fill_value=0)
df3 = df3.reindex(cols, axis=1, fill_value=0)
weight = 1 / n_stocks
output_short = np.where(df1 == 1, (df3 * weight)* -1, 0)
output_long = np.where(df2 == 1, df3 * weight, 0)
output = output_short output_long
expected_returns = pd.DataFrame(output, columns=cols, index=lookahead_returns.index)
return expected_returns