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

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

У меня есть наблюдения за разными attribute для ряда element_id в разные даты, но данных мало:

enter image description here

Это мой второй массив df_weight_at_date список весов для каждого element_id (python для создания внизу сообщения)

enter image description here

Для каждой даты я хочу умножить значения вместе, поэтому, например, в моих наблюдаемых данных A/1/2021-01-15 (0,87) следует умножить на вес на дату 1/2021-01-15 (0,3) для значения 0,261

Если любое значение равно NaN, то результатом будет NaN, и выходной кадр будет иметь ту же форму, что и кадр данных df_observations.

Я пробовал использовать .multiply, но получаю ошибку нет ValueError: cannot join with no overlapping index names

df_observations.multiply(df_weight_at_date.unstack())

Ожидаемый результат для этих данных

enter image description here

Немного новичок - был бы признателен за любые указатели, спасибо

код для создания фреймов данных


df_observations=pd.DataFrame({'observed_date':['2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-15','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16','2021-01-16'],
               'element_id':[1,2,3,4,5,6,7,1,2,3,4,5,6,7,1,2,3,2,3,4,5,6,7,3,2,3,4,5,6,7],
                'factor_id':['A','A','A','A','A','A','A','B','B','B','B','B','B','B','C','C','C','A','A','A','A','A','A','F','F','B','B','B','B','B'],
               'observation':[0.87,0.84,0.15,0.6,0.17,0.76,0.03,0.91,0.05,0.38,0.06,0.27,0.92,0.27,0.16,0.71,0.32,0.92,0.88,0.53,0.79,0.15,0.3,0.16,0.36,0.05,0.22,0.73,0.7,0.9]}).pivot(index=['observed_date','element_id'], columns='factor_id', values='observation')


df_weight_at_date=pd.DataFrame({'observed_date':['2021-01-15','2021-01-15','2021-01-15',
                                 '2021-01-16','2021-01-17','2021-01-18',
                                 '2021-01-19','2021-01-20','2021-01-18'
                                ],
               'element_id':[1,3,5,1,3,5,1,3,9],
               'weight':[0.3,0.35,0.35,1,1,0.4,1,1,0.6]}).pivot(index=['element_id'], columns='observed_date', values='weight')
1
JohnnieL 16 Фев 2021 в 00:44

3 ответа

Лучший ответ

После исправления входных фреймов так, чтобы имена индексов совпадали (observation_date -> observed_date), теперь это работает и достаточно лаконично, я думаю

df_observations.multiply(df_weight_at_date.unstack(), axis=0)

Результат введите описание изображения здесь

1
JohnnieL 15 Фев 2021 в 22:53

Это должно работать так же:

df_weight_at_date.stack().swaplevel().to_frame('A').reindex(df_observations.columns,axis=1).ffill(axis=1).mul(df_observations)
0
rhug123 16 Фев 2021 в 00:30

Вы можете попробовать разложить df_weight_at_date:

df_observations.mul(df_weight_at_date.unstack().fillna(1)
                    .reindex(df_observations.index, fill_value=1),
                    axis=0
                   )

Выход:

factor_id                      A       B      C     F
observed_date element_id                             
2021-01-15    1           0.2610  0.2730  0.048   NaN
              2           0.8400  0.0500  0.710   NaN
              3           0.0525  0.1330  0.112   NaN
              4           0.6000  0.0600    NaN   NaN
              5           0.0595  0.0945    NaN   NaN
              6           0.7600  0.9200    NaN   NaN
              7           0.0300  0.2700    NaN   NaN
2021-01-16    2           0.9200     NaN    NaN  0.36
              3           0.8800  0.0500    NaN  0.16
              4           0.5300  0.2200    NaN   NaN
              5           0.7900  0.7300    NaN   NaN
              6           0.1500  0.7000    NaN   NaN
              7           0.3000  0.9000    NaN   NaN
2
Quang Hoang 15 Фев 2021 в 21:58