numpy:在几个维度中采样以生成微数据

时间:2015-09-09 20:08:20

标签: python numpy pandas distribution sampling

我按年龄组,城市,收入和他们工作的行业,或者在这种情况下有四个维度的人数统计数据。

我希望从这些汇总计数中生成微观数据。例如,如果摘要表显示按性别,种族,年龄和行业分配的10,000人,我希望有10,000条记录,当汇总时,与原始的四维分布相匹配。所以简而言之,我想同时从四个发行版中抽样,取决于其他发行版的价值。

以下是我所拥有的:

## generate mock person data
N=500000

age = np.random.choice(['20-44','45-64','65+'], N)
ind = np.random.choice(['retail','construction','information','medical'], size=N,p=[.05,.15,.3,.5])
cty = np.random.choice(['cooltown','mountain pines'], N)
income = pd.cut(np.random.lognormal(mean=10,sigma=2,size=N),range(0,250000,50000)+[np.Inf])

## prep data frame
persons = pd.DataFrame({'industry':ind,'city':cty,'income':income,'age':age})

## group by the categoricals
persons_grouped = persons.groupby(['city','industry','age','income']).size()


df_persons_grouped=persons_grouped.reset_index(name='personcount')
df_persons_grouped['personcount']=df_persons_grouped.personcount.div(df_persons_grouped.personcount.sum(),axis=0)
df_persons_grouped.head()

现在可以通过相关维度对其进行总结。

要重新生成原始记录数,我希望如此:

newdf = df_persons_grouped.loc[np.random.choice(a=df_persons_grouped.index, size=N, p=df_persons_grouped.personcount.tolist())].groupby(['city','industry','age','income']).size()

## I expect the follwoing to produce near-1 values, but they sometimes vary
newdf.div( persons_grouped,axis=0)

但更大的问题是,这种方法是否适用于复制"原始"记录级数据。我只使用计数(作为份额)作为概率,这可能与从多变量分布中采样不同。建议欢迎。

0 个答案:

没有答案