Вычислить стандартное отклонение в Pandas.DataFrame с пользовательским средним значением ⇐ Python
Вычислить стандартное отклонение в Pandas.DataFrame с пользовательским средним значением
Я столкнулся со следующей проблемой: Я хотел бы иметь возможность получить стандартное отклонение для группы значений. Трудность состоит в том, чтобы получить стандартное значение, применив обычное уравнение и заменив выборочное среднее средним значением набора данных.
Чтобы понять, откуда возникла проблема, приведем пример набора данных:
импортировать панд как pd импортировать numpy как np данные = { 'X': ['asdf'] * 15, 'Y': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3], 'А': [58781, 60775, 61424, 61620, 60882, 58788, 57939, 60212, 59086, 59119, 59119, 59119, 59119, 59119, 59119], 'Б': [1.2, 1.6, 1.7, 2.1, 2.3, 2.8, 2.2, 1.9, 2.3, 2.2, 2.2, 2, 2.3, 2.4, 2.5], 'С': [4.4, 4.2, 5.8, 4, 4.3, 4.5, 4.3, 5.2, 5, 3.8, 4.1, 4.5, 4.4, 4.5, 4.3] } df = pd.DataFrame(данные) Стандартное отклонение, которое я хочу получить, относится к значениям, сгруппированным по характеристикам «X» и «Y» (есть и другие значения «X», которые я не добавил в пример), но среднее значение, которое я хочу применить, в уравнении соответствует всей группе «X».
Это побудило меня разработать следующий код:
def custom_std(df, средства, функции, ось=0, ddof=1): x = df['X'].iloc[0] x_means = pd.concat([means[means['X'] == x][f]] * len(df[features]), ignore_index=True) sum_diff_sqr = np.sum(np.square(df[features] - x_means), ось=ось) дисперсия = sum_diff_sqr/(len(df[features]) - ddof) std_dev = np.sqrt (дисперсия) вернуть стандартное_устройство df_means = df.groupby(['X'])['A', 'B', 'C'].mean(numeric_only=True).reset_index() df_custom_std = df.groupby(['X', 'Y']).apply(custom_std, df_means, ['A', 'B', 'C']).reset_index() Единственное, что мне удалось получить после нескольких тестов, — это нулевой стандартный результат. Я пришел, чтобы убедиться, что вычитание df[features] - x_means приводит к недопустимым значениям (NaN). Я надеюсь получить стандартное отклонение, которое, по моему мнению, невозможно, если я не реализую этот собственный метод. Ожидаемый результат должен выглядеть следующим образом (значения не совпадают, но идея такова):
X Y A B C asdf 1.0 1128.253207 0.432435 0.719722 asdf 2.0 815.018221 0.327109 0.559464 asdf 3,0 0,000000 0,192354 0,167332 qwer 1.0 1459.696133 0.820366 1.143678 qwer 2.0 1152.397067 0.476445 2.479919 qwer 3.0 0.000000 0.387298 0.704746 zxcv 1.0 922.013178 0.547723 0.731437 zxcv 2.0 1495.410813 0.476445 0.449444 zxcv 3,0 0,000000 0,356371 1,152389 уиоп 1,0 432,886475 0,164317 2,480323 уиоп 2.0 1078.097955 0.456070 2.735324 уиоп 3,0 0,000000 0,207364 1,463557 lkjh 1,0 703,333491 0,296648 1,521512 lkjh 2,0 685,065544 0,360555 3,683069 lkjh 3,0 0,000000 0,189297 1,373560 мнбв 1.0 942.376942 1.839837 2.358601 мнбв 2.0 394.140457 1.329662 1.083051 мнбв 3,0 0,000000 0,489898 0,187083 fghj 1,0 480,174760 0,328634 0,785493 fghj 2,0 1217,672780 0,450000 2,585859 fghj 3,0 0,000000 0,164317 1,186170 Более того, у меня есть сомнения, правильный ли метод — apply или transform. Кто-нибудь может мне помочь? Пожалуйста. Я искал уже проделанную работу, но не смог найти что-то, соответствующее критериям.
Я столкнулся со следующей проблемой: Я хотел бы иметь возможность получить стандартное отклонение для группы значений. Трудность состоит в том, чтобы получить стандартное значение, применив обычное уравнение и заменив выборочное среднее средним значением набора данных.
Чтобы понять, откуда возникла проблема, приведем пример набора данных:
импортировать панд как pd импортировать numpy как np данные = { 'X': ['asdf'] * 15, 'Y': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3], 'А': [58781, 60775, 61424, 61620, 60882, 58788, 57939, 60212, 59086, 59119, 59119, 59119, 59119, 59119, 59119], 'Б': [1.2, 1.6, 1.7, 2.1, 2.3, 2.8, 2.2, 1.9, 2.3, 2.2, 2.2, 2, 2.3, 2.4, 2.5], 'С': [4.4, 4.2, 5.8, 4, 4.3, 4.5, 4.3, 5.2, 5, 3.8, 4.1, 4.5, 4.4, 4.5, 4.3] } df = pd.DataFrame(данные) Стандартное отклонение, которое я хочу получить, относится к значениям, сгруппированным по характеристикам «X» и «Y» (есть и другие значения «X», которые я не добавил в пример), но среднее значение, которое я хочу применить, в уравнении соответствует всей группе «X».
Это побудило меня разработать следующий код:
def custom_std(df, средства, функции, ось=0, ddof=1): x = df['X'].iloc[0] x_means = pd.concat([means[means['X'] == x][f]] * len(df[features]), ignore_index=True) sum_diff_sqr = np.sum(np.square(df[features] - x_means), ось=ось) дисперсия = sum_diff_sqr/(len(df[features]) - ddof) std_dev = np.sqrt (дисперсия) вернуть стандартное_устройство df_means = df.groupby(['X'])['A', 'B', 'C'].mean(numeric_only=True).reset_index() df_custom_std = df.groupby(['X', 'Y']).apply(custom_std, df_means, ['A', 'B', 'C']).reset_index() Единственное, что мне удалось получить после нескольких тестов, — это нулевой стандартный результат. Я пришел, чтобы убедиться, что вычитание df[features] - x_means приводит к недопустимым значениям (NaN). Я надеюсь получить стандартное отклонение, которое, по моему мнению, невозможно, если я не реализую этот собственный метод. Ожидаемый результат должен выглядеть следующим образом (значения не совпадают, но идея такова):
X Y A B C asdf 1.0 1128.253207 0.432435 0.719722 asdf 2.0 815.018221 0.327109 0.559464 asdf 3,0 0,000000 0,192354 0,167332 qwer 1.0 1459.696133 0.820366 1.143678 qwer 2.0 1152.397067 0.476445 2.479919 qwer 3.0 0.000000 0.387298 0.704746 zxcv 1.0 922.013178 0.547723 0.731437 zxcv 2.0 1495.410813 0.476445 0.449444 zxcv 3,0 0,000000 0,356371 1,152389 уиоп 1,0 432,886475 0,164317 2,480323 уиоп 2.0 1078.097955 0.456070 2.735324 уиоп 3,0 0,000000 0,207364 1,463557 lkjh 1,0 703,333491 0,296648 1,521512 lkjh 2,0 685,065544 0,360555 3,683069 lkjh 3,0 0,000000 0,189297 1,373560 мнбв 1.0 942.376942 1.839837 2.358601 мнбв 2.0 394.140457 1.329662 1.083051 мнбв 3,0 0,000000 0,489898 0,187083 fghj 1,0 480,174760 0,328634 0,785493 fghj 2,0 1217,672780 0,450000 2,585859 fghj 3,0 0,000000 0,164317 1,186170 Более того, у меня есть сомнения, правильный ли метод — apply или transform. Кто-нибудь может мне помочь? Пожалуйста. Я искал уже проделанную работу, но не смог найти что-то, соответствующее критериям.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Панды: вычислить среднее значение или STD (стандартное отклонение) по всему лицу данных
Anonymous » » в форуме Python - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-