Описательная статистика на Python/с Pandas со стандартным значением в скобкахPython

Программы на Python
Anonymous
Описательная статистика на Python/с Pandas со стандартным значением в скобках

Сообщение Anonymous »

Этот вопрос касается передовой практики создания описательной статистики в Python с форматированным выводом, соответствующим таблицам, найденным в научных публикациях: средние значения с соответствующими стандартными отклонениями в скобках ниже. Конечная цель — иметь возможность экспортировать его в табличный формат Latex (или другой формат, HTML и т. д.).

Пример (Deucherta & Eugster (2018)):

Изображение


Pandas:

Классическим решением для создания описательной статистики в Pandas является использование метода define() DataFrame.

Код: Выделить всё

import numpy as np
import pandas as pd

# Generate a DataFrame to have an example
df = pd.DataFrame(
{"Age" : np.random.normal(20,15,5),
"Income": np.random.pareto(1,5)*20_000 }
)
# The describe method to get means and stds
df.describe().loc[["mean", "std"]].T
>>>
mean            std
Age        15.322797      13.449727
Income  97755.733510  143683.686484
Я хотел бы получить следующий результат:

Код: Выделить всё

Age        15.32
(13.44)
Income  97755.73
(143683.68)
Было бы неплохо иметь решение, работающее с многоиндексным Dataframe:

Код: Выделить всё

df2 = pd.DataFrame(
{"Age" : np.random.normal(20,15,5),
"Income": np.random.pareto(1,5)*20_000 }
)
df_c = pd.concat([df,df2], keys = ["A", "B"])
>>>
и получите

Код: Выделить всё

                A           B
Age          23.15       21.33
(11.62)      (9.34)
Income    68415.53    46619.51
(95612.40)  (64596.10)
Мое текущее решение:

Код: Выделить всё

idx = pd.IndexSlice
df_desc = (df_c
).groupby(level = 0, axis = 0).describe()
df_desc = df_desc.loc[idx[:],idx[:,["mean", "std"]]].T
df_desc.loc[idx[:,["std"]],idx[:]] = df_desc.loc[idx[:,["std"]],idx[:]
].applymap(
lambda x: "("+"{:.2f}".format(x)+")")
print(df_desc)

>>>
A           B
Age    mean     23.1565     21.3359
std      (11.62)      (9.34)
Income mean     68415.5     46619.5
std   (95612.40)  (64596.10)
Проблема 1:

Я не нашел решения, как скрыть второй столбец индекса [mean, std, mean,std].

Тогда я хочу экспортировать свой df в латекс:

Код: Выделить всё

df_desc.to_latex()

>>>
\begin{tabular}{llll}
\toprule
&     &            A &           B \\
\midrule
Age & mean &       5.5905 &     29.5894 \\
& std &      (16.41) &     (13.03) \\
Income & mean &       531970 &     72653.7 \\
& std &  (875272.44) &  (79690.18) \\
\bottomrule
\end{tabular}
Проблема 2:

Символы & в таблице не выровнены, что делает ее редактирование немного утомительным (я использую расширения для выравнивания & в VSCode)

В целом я нахожу это решение утомительным и неэлегантным.

Решения?

Я не знаю, что мне следует делать, чтобы получить желаемый результат без сложных манипуляций со строками.

Я рассмотрел стиль Pandas, но не думаю, что это лучшее решение.

Есть еще таблицы StatModels, но простого решения своей проблемы я не нашел. Таблицы Statsmodels кажутся наиболее многообещающим решением. Но я не знаю, как это реализовать. В StatsModels есть некоторые функции описательной статистики, но я прочитал на GitHub, что они в некоторой степени устарели.

Итак, как лучше всего создавать такие таблицы?

Вернуться в «Python»