我不确定您是否是这个意思:
strats = []
for k in range(11):
y_val = k*0.1
dummy_df = your_df[your_df['Y'] == y_val]
stats.append( dummy_df.sample(200) )
这将使虚拟数据帧仅包含所需的Y
值,然后取样200。
确定,因此您需要不同的块以具有相同的结构。我想这有点难,这是我的做法:
首先,我将得到如下所示的直方图X1
:
hist, edges = np.histogram(your_df['X1'], bins=np.linespace(min_x, max_x, nbins))
现在的策略是根据行的值绘制一定数量的行X1
。我们将从具有更多观察结果的容器中获取更多信息,而从具有更少观察值的容器中获取更少信息,从而X
保留的结构。
特别是,每个垃圾箱的相对贡献应为:
rel = [float(i) / sum(hist) for i in hist]
这会像 [0.1, 0.2, 0.1, 0.3, 0.3]
如果需要200个样本,则需要绘制:
draws_in_bin = [int(i*200) for i in rel]
现在我们知道从每个箱中抽取多少个观测值:
strats = []
for k in range(11):
y_val = k*0.1
#get a dataframe for every value of Y
dummy_df = your_df[your_df['Y'] == y_val]
bin_strat = []
for left_edge, right_edge, n_draws in zip(edges[:-1], edges[1:], draws_in_bin):
bin_df = dummy_df[ (dummy_df['X1']> left_edge)
& (dummy_df['X1']< right_edge) ]
bin_strat.append(bin_df.sample(n_draws))
# this takes the right number of draws out
# of the X1 bin where we currently are
# Note that every element of bin_strat is a dataframe
# with a number of entries that corresponds to the
# structure of draws_in_bin
#
#concatenate the dataframes for every bin and append to the list
strats.append( pd.concat(bin_strat) )