快速调整数据帧以计算pandas中P值的方法

时间:2017-03-28 08:44:56

标签: python pandas dataframe shuffle p-value

我有以下数据框(数据帧的实际长度要大得多):

spend_df:

var   spend
 1     120
 2     200
 1     111
 1     143
 1     230
 2     180
 2     190
 2     94
 2     100
 1     278

这里'var'列告诉测试行属于哪一组,我需要将df随机抽取1000次以随机地将每行随机分配给测试的不同侧,然后组合'var'并计算每次迭代的差异。最后计算组间总和之间的差异大于实际差异的时间:

我采取以下方法:

def simulate(df):
    simul_df = df.copy()

    shuffled_var = simul_df.sample(frac=1)
    shuffled_var.index = simul_df.index # replace shuffled series' index with the real one

    simul_df['var'] = shuffled_var
    simul_grouped = simul_df.groupby('var').sum()['spend']
    simul_difference = simul_grouped.iloc[1] - simul_grouped.iloc[0]
    return simul_difference


simulate(spend_df)

这就是我如何计算模拟差异大于实际差异的次数:

simulations = np.array([simulate(spend_df) for i in range(1000)])
(simulations > real_difference).mean()

这里real_difference是两组花费的总和之间的差异(由'var'分组):

grouped=df.groupby('var').sum().reset_index()
real_diff=grouped.iloc[1] - grouped.iloc[0]

在这种情况下是:882-764 = 118

每当我改变数据帧时,我需要计算上述新组的差异,然后我需要找出这个模拟差异多少次,而不是real_diff

这个解决方案对我来说似乎有点不好意思有没有更快或更有条理的方法来计算P值这个模拟任务?没有深入到统计方法。

1 个答案:

答案 0 :(得分:1)

尝试1

def gdif(df):
    v, s = df.values.T
    return np.diff(df.groupby('var').spend.sum().values)[0]

def shuf(df):
    np.random.shuffle(df['var'].values)
    return df

def sim1(df):
    sdf = df.copy()

    real_diff = gdif(sdf)

    return (np.array([gdif(shuf(sdf)) for _ in range(1000)]) > real_diff).mean()

sim1(spend_df)

0.52900000000000003

尝试2
有更多numpy

def gdif2(values):
    v, s = values.T
    r = np.arange(v.size)

    a = v.argsort()
    c = s[a].cumsum()
    d0 = c[np.flatnonzero(np.diff(v[a]))[0]]
    return c[-1] - 2 * d0

def shuf2(v):
    np.random.shuffle(v[:, 0])
    return v

def sim2(df):
    values = df.values

    real_diff = gdif2(values)

    return (np.array([gdif2(shuf2(values)) for _ in range(1000)]) > real_diff).mean()

sim2(spend_df)

0.52700000000000002

天真的时间叮咬

enter image description here