Описательная статистика в Python / с пандами с std в скобках - PullRequest
0 голосов
/ 31 января 2019

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

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

enter image description here

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, что они в некоторой степени устарели.

Так, каков наилучший способ создания этих таблиц?

...