Как выполнить числовые тесты на строках данных панд? - PullRequest
0 голосов
/ 18 января 2019

у меня есть датафрейм df вида

          class_1_frequency    class_2_frequency
group_1          20                    10
group_2          60                    25 
..
group_n          50                    15 

Предположим, что в class_1 всего 70 членов, а в class_2 30.

Для каждой строки (group_1, group_2, .. group_n) я хочу создать таблицы сопряженности (желательно динамически), а затем выполнить числовой тест для оценки p-значений.

Например, для group_1 таблица непредвиденных расходов под капотом будет выглядеть следующим образом:

                   class_1      class_2
group_1_present      20           10
group_1_absent     70-20         30-10

Кроме того, я знаю, scipy.stats.chi2_contingency () является подходящей функцией для chisquare, но я не могу применить ее к своему контексту. Я рассмотрел ранее обсужденные вопросы, такие как: здесь и здесь .

Какой самый эффективный способ добиться этого?

1 Ответ

0 голосов
/ 18 января 2019

Вы можете воспользоваться функцией apply на pd.DataFrame. Это позволяет применять произвольные функции к столбцам или строкам DataFrame. Используя ваш пример:

df = pd.DataFrame([[20, 10], [60, 25], [50, 15]])

Для создания таблиц сопряженности можно использовать lambda и некоторые векторные операции

>>> members = np.array([70, 30])
>>> df.apply(lambda x: np.array([x, members-x]), axis=1)
0    [[20, 10], [50, 20]]
1    [[60, 25], [10,  5]]
2    [[50, 15], [20, 15]]

И это, конечно, можно обернуть функцией scipy.

df.apply(lambda x: chi2_contingency(np.array([x, members-x])), axis=1)

Это производит все возможные возвращаемые значения, но, разрезая выходные данные, можно указать желаемые возвращаемые значения, оставив, например, ожидаемые массивы. Полученный ряд также можно преобразовать в DataFrame.

>>> s = df.apply(lambda x: chi2_contingency(np.array([x, members-x]))[:-1], axis=1)
>>> s
0    (0.056689342403628114, 0.8118072280034329, 1)
1                                    (0.0, 1.0, 1)
2      (3.349031920460492, 0.06724454934343391, 1)
dtype: object
>>> s.apply(pd.Series)
          0         1    2
0  0.056689  0.811807  1.0
1  0.000000  1.000000  1.0
2  3.349032  0.067245  1.0

Сейчас я не знаю об эффективности выполнения этого подхода, но я бы доверял тем, кто реализовал эти функции. И, скорее всего, скорость не так критична. Но он по крайней мере эффективен в том смысле, что его (гипотетически) легко понять и быстро написать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...