Dask ttest между 2 строками для всех столбцов в dataframe

#pandas #dataframe #dask #t-test

#pandas #фрейм данных #dask #t-тест

Вопрос:

Я написал следующую функцию для параллельного вычисления статистических тестов между двумя категориями во всех столбцах pandas —

Я смог извлечь категории с помощью dask, но мне нужно вычислить и использовать pandas для получения ttest (или другого статистического теста) Мне было интересно, есть ли у кого-нибудь идея о том, как использовать dask для запуска не только категоризации, но и t-теста для каждого столбца параллельно) Ниже приведен мой код:

 import numpy as np
import pandas as pd
import dask
from scipy.stats import ttest_ind 
from scipy.stats import ttest_rel 
from scipy.stats import kstest 

df = pd.DataFrame({
'var1'      : np.random.randint(0, 1000000, 1000000),
'var2'      : np.random.randint(0, 1000000, 1000000),
'var3'      : np.random.randint(0, 1000000, 1000000),
'Category'   : np.random.randint(0, 2, 1000000) 
})


custom_list = dask.dataframe.Aggregation('custom_test', 
                                         chunk= lambda s: s.apply(lambda x:list(x)),
                                         agg = lambda s0 :s0.obj.groupby(level=list(range(s0.obj.index.nlevels))).sum(),
                                         finalize= lambda s1 :s1.apply(lambda x: x))

def testCustom(x, test=kstest, **args):
    x=list(x)
    return test(x[0],x[1])

def diffDiffrentialCategory(df, catcol='Category', test=ttest_ind, pVal=0.05, chunksize=10000, **args):
    ddf=dask.dataframe.from_pandas(df,chunksize=chunksize)

    df1=ddf.groupby(catcol).aggregate(custom_list).compute()
    # I'd like to work directly on df1=ddf.groupby(catcol).aggregate(custom_list) w/o compute()
    df1=pd.DataFrame.from_records(df1.apply(testCustom, test=test)).set_index(df1.columns).rename(columns={0:'statistic', 1:'p-value'})
    return df1[df1['p-value']<=pVal]
  

Ценю помощь / совет

Яно

Комментарии:

1. Я предполагаю, что вы пытаетесь определить, существует ли статистически значимая разница в средних значениях между двумя категориями? Являются ли эти выборки зависимыми или независимыми?

2. @NickODell, да, точно, 1) Я хочу посмотреть, для каких столбцов две категории существенно отличаются. Этот код действительно выполняет эту работу. 2) Поскольку я хотел, чтобы меня использовали в разных ситуациях, вы можете видеть, что функция testCustom может принимать любой тест в качестве входных данных. 3) Проблема в том, что после того, как я разделил две категории в виде списка, используя dask для построения df1, мне нужно вычислить df1, а затем применить testCustom к фрейму данных pandas. Что я хотел сделать, так это применить testCustom или что-то похожее на df1 перед вычислением, чтобы оно выполнялось параллельно dask вместо pandas, имеет ли это смысл?