python实现的分层随机抽样案例
昨天写了一段用来做分层随机抽样的代码,很粗糙,不过用公司的2万名导购名单试了一下,结果感人,我觉得此刻的我已经要上天了,哈哈哈哈哈哈
代码如下:
#分层随机抽样stratifiedsampling importxlrd,xlwt,time,random xl=xlrd.open_workbook(r'C:\Users\Administrator\Desktop\分层抽样.xlsx') xl_sht1=xl.sheets()[0] xl_sht1_nrows=xl_sht1.nrows #表头 title=xl_sht1.row_values(0) #把样本写进列表sample sample=[] foriinrange(xl_sht1_nrows): sample.append(xl_sht1.row_values(i)) #打乱样本 random.shuffle(sample) #把层的内容写进列表col col=xl_sht1.col_values(0) #对col中的内容进行计数,获得每一类的名称对应个数的字典 col_dict={} foriincol: col_dict[i]=col_dict.get(i,0)+1 p=eval(input('每层抽取的比例(小数):')) #获得每一类的名称对应抽取个数的字典 col_p={} k=0 foriincol_dict.keys(): col_p[i]=int(round(col_dict[i]*p))#round用来四舍五入,不加int结果会变成无数个p #开始抽样,把抽取结果写进result_l列表 result_l=[] foriinsample: ifcol_p.get(i[0],0)>0: result_l.append(i) col_p[i[0]]-=1 #新建文档,写入结果 f=xlwt.Workbook() f_sht1=f.add_sheet('result') n=0 foriintitle: f_sht1.write(0,n,i) n+=1 r=1 foriinresult_l: c=0 forkini: f_sht1.write(r,c,k) c+=1 r+=1 nowtime=time.strftime("%Y%m%d_%H%M%S",time.localtime()) f.save(r'C:\Users\Administrator\Desktop\Result_{0}.xls'.format(nowtime)) print('\n抽样成功!') input()
原理思路如下:
1、首先数据的形式如下
数据自带层标签,我只需要从每层抽取一定比例的数据就可以了
2、第一步:先将源数据按行存入一个列表,然后打乱行的顺序
3、第二步:对层标签进行计数,获取每一个层标签的总数,并将结果存进字典
4、第三步:根据抽样比例p,计算出每层实际应抽取的个数,并存入一个新的字典
5、第四步:从源数据列表中抽取出目标数据,每层抽取的个数由第三步的字典进行指定
小白刚刚起步,实现的时候发现自己对数据结构和算法一点也不懂。。。。结果就写了一堆的for循环。。。。
大神们如果看到这段代码,还请不吝赐教,看看代码可以怎样优化,或者有更好的设计思路
补充拓展:pandas实现对dataframe抽样的实现
随机抽样
importpandasaspd #对dataframe随机抽取2000个样本 pd.sample(df,n=2000)
分层抽样
利用sklean中的函数灵活进行抽样
fromsklearn.model_selectionimporttrain_test_split #y是在X中的某一个属性列 X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,stratify=y)
以上这篇python实现的分层随机抽样案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。