如何通过消除循环来提高chi2_contingency距离测量的速度

时间:2019-06-05 22:29:42

标签: python performance scipy numpy-broadcasting

我的循环非常慢,可以使用一些帮助。我有一个熊猫行的DataFrame,我需要每一行之间的卡方距离。我对它进行了浇铸,以便按列进行操作,这使我的速度提高了25%。我看到了一些使用numpy广播来提高速度的帖子,但我不了解如何在此处应用它。

from scipy.stats import chi2_contingency
import pandas as pd
import numpy as np

def get_n_by_n_chi_distance_table(df):

    chi_distance_df = pd.DataFrame(columns = df.index, index = df.index).fillna(0)
    df_temp = df.T
    cols = df_temp.columns

    for col in cols:
        cols = cols.drop(col)
        for col_next in cols:
            input_df = df_temp[[col,col_next]]#.values
            input_df = input_df.loc[(input_df != 0).any(axis=1),:]
            chi_distance_df.loc[col,col_next] = self.get_distance(input_df.values)


    return chi_distance_df

def get_distance(obs):
    return np.sqrt(chi2_contingency(obs.T)[0])

0 个答案:

没有答案