#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, имеет ли это смысл?