我有以下数据框(数据帧的实际长度要大得多):
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值这个模拟任务?没有深入到统计方法。
答案 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
天真的时间叮咬