Этот вопрос касается наилучшей практики создания описательной статистики в Python с форматированным выводом, который соответствует таблицам, найденным в научных публикациях: означает с соответствующими стандартными отклонениями в скобках ниже.Конечная цель - экспортировать его в латексный табличный формат (или в другой формат, html и т. Д.).
Пример ( Deucherta & Eugster (2018) ):
![enter image description here](https://i.stack.imgur.com/ADz8Xm.png)
Pandas:
Классическим решением для создания описательной статистики в Pandas является использование describe()
метода 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)
Было бы неплохо иметь решение, которое работает с многоиндексным фреймом данных:
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 Styling , но я не думаю, что это лучшее решение.
Также есть Таблицы StatModels , но я не нашел простого решения моей проблемы.Statsmodels Tables представляется наиболее перспективным решением.Но я не знаю, как это реализовать.В StatsModels есть некоторые функции описательной статистики, но я прочитал на GitHub, что они в некоторой степени устарели.
Так, каков наилучший способ создания этих таблиц?