python實現的分層隨機抽樣案例
阿新 • • 發佈:2020-02-25
昨天寫了一段用來做分層隨機抽樣的程式碼,很粗糙,不過用公司的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、首先資料的形式如下
資料自帶層標籤,我只需要從每層抽取一定比例的資料就可以了
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實現的分層隨機抽樣案例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。