У меня проблемы с расчетом в данных.
Я вычисляю
- % - изменение на столбец
- % - доля на столбец на основе суммы строки
Теперь я хочу вычислить% -обмен на столбец на основе% -перечисления на столбец. Я бы сделал это следующим образом:
(col A% -смена * col A% -по доле) + (col B% -смены * col B% -по доле) + (col C% -смена * col C% -по доле) и т. Д.
Я подумал о двух способах сделать это, хотя ни один из них не работает ... И - конечно - я хотел бы сделать это максимально динамично, так как число столбцов будет меняться.
Вот некоторый код для получения подходящего кадра данных:
import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.array([
['2019-04-29', 5, 5, 10],
['2019-04-28', 10, 10, 50],
['2019-04-27', 20, 5, 100]]),
columns=['Date', 'attr1', 'attr2', 'attr3'])
df1["attr1"] = pd.to_numeric(df1["attr1"])
df1["attr2"] = pd.to_numeric(df1["attr2"])
df1["attr3"] = pd.to_numeric(df1["attr3"])
df1 = df1.set_index(['Date'])
col_list= list(df1)
df1['sum'] = df1[col_list].sum(axis=1)
for i in col_list:
df1[i + ' %-change'] = df1[i].pct_change()*100
df1[i + " %-share"] = df1[i]/ df1['sum']
Идея 1:
В основном я пробую формулу, упомянутую выше. Так что умножьте% -share и% -change каждого столбца и суммируйте их. Я думал об использовании .sum, но не знаю, как использовать его в этой конкретной ситуации.
df1[i + ' %-change incl share'] = (df1[i + ' %-share'] * df1[i + ' %-change'])
Идея 2:
Мысль о том, чтобы сделать это в два этапа. Первым шагом будет умножение% -share и% -change каждого столбца. Вторым шагом будет суммирование новых столбцов в новой строке кода. Проблема в том, что я не могу сделать это динамически. Мне нужно было бы вручную выбрать столбцы, которые мне нужно обобщить, но если я скажу, что 100 столбцов - это действительно утомительная работа.
Я думал о записи недавно вычисленных столбцов в новый фрейм данных, поэтому у меня есть все нужные мне столбцы, но данные в фрейме для меня не имеют смысла.
df2[i + ' %-change incl share'] = (df1[i + ' %-share'] * df1[i + ' %-change'])
Как всегда, любая помощь очень ценится.
Большое спасибо!