1. 程式人生 > 程式設計 >python實現的分層隨機抽樣案例

python實現的分層隨機抽樣案例

昨天寫了一段用來做分層隨機抽樣的程式碼,很粗糙,不過用公司的2萬名導購名單試了一下,結果感人,我覺得此刻的我已經要上天了,哈哈哈哈哈哈

程式碼如下:

#分層隨機抽樣 stratified sampling

import xlrd,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 = []
for i in range(xl_sht1_nrows):
  sample.append(xl_sht1.row_values(i))
#打亂樣本
random.shuffle(sample)
#把層的內容寫進列表 col
col = xl_sht1.col_values(0)
#對col中的內容進行計數,獲得每一類的名稱對應個數的字典
col_dict = {}
for i in col:
  col_dict[i] = col_dict.get(i,0) + 1
p = eval(input('每層抽取的比例(小數):'))
#獲得每一類的名稱對應抽取個數的字典
col_p = {}
k = 0
for i in col_dict.keys():
  col_p[i] = int(round(col_dict[i] * p)) #round用來四捨五入,不加int結果會變成無數個p
#開始抽樣,把抽取結果寫進result_l列表
result_l = []
for i in sample:
  if col_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
for i in title:
  f_sht1.write(0,n,i)
  n += 1
r = 1
for i in result_l:
  c = 0
  for k in i:
    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、首先資料的形式如下

python實現的分層隨機抽樣案例

資料自帶層標籤,我只需要從每層抽取一定比例的資料就可以了

2、第一步:先將源資料按行存入一個列表,然後打亂行的順序

3、第二步:對層標籤進行計數,獲取每一個層標籤的總數,並將結果存進字典

4、第三步:根據抽樣比例p,計算出每層實際應抽取的個數,並存入一個新的字典

5、第四步:從源資料列表中抽取出目標資料,每層抽取的個數由第三步的字典進行指定

小白剛剛起步,實現的時候發現自己對資料結構和演算法一點也不懂。。。。結果就寫了一堆的for迴圈。。。。

大神們如果看到這段程式碼,還請不吝賜教,看看程式碼可以怎樣優化,或者有更好的設計思路

補充拓展:pandas實現對dataframe抽樣的實現

隨機抽樣

import pandas as pd
#對dataframe隨機抽取2000個樣本
pd.sample(df,n=2000)

分層抽樣

利用sklean中的函式靈活進行抽樣

from sklearn.model_selection import train_test_split
#y是在X中的某一個屬性列
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,stratify=y)

以上這篇python實現的分層隨機抽樣案例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。