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、首先数据的形式如下

数据自带层标签,我只需要从每层抽取一定比例的数据就可以了

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实现的分层随机抽样案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python Pandas如何对数据集随机抽样

    摘要:有时候我们只需要数据集中的一部分,并不需要全部的数据.这个时候我们就要对数据集进行随机的抽样.pandas中自带有抽样的方法. 应用场景: 我有10W行数据,每一行都11列的属性. 现在,我们只需要随机抽取其中的2W行. 实现方法很简单: 利用Pandas库中的sample. DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None) n是要抽取的行数.(例如n

  • 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

  • Python+random模块实现随机抽样

    目录 1. 设置随机数种子 seed() 2. random() 与 randint() 3. sample()方法 无放回抽样 4. choice() 与 choices() 有放回抽样 5. shuffle()方法 6. 猜拳小案例 python的random库,提供了很多随机抽样方法. 1. 设置随机数种子 seed() 在适当的情形下,为例保证抽样的结果固定,不因多次运行而改变,可以设置随机数种子. 如果不设置则是以当前系统时间作为随机数种子. 设置随机数种子使用的是random.see

  • python numpy实现rolling滚动案例

    相比较pandas,numpy并没有很直接的rolling方法,但是numpy 有一个技巧可以让NumPy在C代码内部执行这种循环. 这是通过添加一个与窗口大小相同的额外尺寸和适当的步幅来实现的. import numpy as np data = np.arange(20) def rolling_window(a, window): shape = a.shape[:-1] + (a.shape[-1] - window + 1, window) strides = a.strides +

  • python 读取二进制 显示图片案例

    我就废话不多说了,大家还是直接看代码吧! import matplotlib.pyplot as plt import numpy as np f = open('bwall.bmpx', mode='rb') x = np.fromfile(f, dtype=np.ubyte) #x = x[0:1920] x = x[1920:3840] #x = x[3840:5760] x = x.reshape(60,32) #print((x)) plt.imshow(x) plt.axis('of

  • Python实现自动装机功能案例分析

    前言 提示:在管理服务器的过程中,发现有很多服务器在启动的过程中默认以PXE方式启动,这就导致我们无法将PXE装机程序放开到所有的交换机端口中,本文是以Python对dell服务器进行了一些控制,更多厂商机器的管理和控制,仍在调研中. 提示:以下是本篇文章正文内容,下面案例可供参考 一.利用snmp协议获取到目标机器的网卡mac地址 代码如下 def get_mac(ipmi, netcard): #ipmi即服务器idrac_ip,netcard即网卡序列号(一般是4个,从1开始) # 将控制

  • python爬虫破解字体加密案例详解

    本次案例以爬取起小点小说为例 案例目的: 通过爬取起小点小说月票榜的名称和月票数,介绍如何破解字体加密的反爬,将加密的数据转化成明文数据. 程序功能: 输入要爬取的页数,得到每一页对应的小说名称和月票数. 案例分析: 找到目标的url: (右键检查)找到小说名称所在的位置: 通过名称所在的节点位置,找到小说名称的xpath语法: (右键检查)找到月票数所在的位置: 由上图发现,检查月票数据的文本,得到一串加密数据. 我们通过xpathhelper进行调试发现,无法找到加密数据的语法.因此,需要通

  • python爬虫系列网络请求案例详解

    学习了之前的基础和爬虫基础之后,我们要开始学习网络请求了. 先来看看urllib urllib的介绍 urllib是Python自带的标准库中用于网络请求的库,无需安装,直接引用即可. 主要用来做爬虫开发,API数据获取和测试中使用. urllib库的四大模块: urllib.request: 用于打开和读取url urllib.error : 包含提出的例外,urllib.request urllib.parse:用于解析url urllib.robotparser:用于解析robots.tx

  • Python进行区间取值案例讲解

    需求背景: 进行分值计算.如下图,如果只是一两个还好说,写写判断,但是如果有几十个,几百个,会不会惨不忍睹.而且,下面的还是三种情况. 例如: 解决: # 根据值.比较list, 值list,返回区间值, other_value 即不在的情况 def get_value_by_between(self, compare_value, compare_list, value_list, other_value, type="compare", left=False, right=True

  • python利用numpy存取文件案例教程

         NumPy提供了多种存取数组内容的文件操作函数.保存数组数据的文件可以是二进制格式或者文本格式.二进制格式的文件又分为NumPy专用的格式化二进制类型和无格式类型. numpy格式的文件可以保存为后缀为(.npy/.npz)格式的文件 1. tofile()和fromfile() tofile()将数组中的数据以二进制格式写进文件 tofile()输出的数据不保存数组形状和元素类型等信息 fromfile()函数读回数据时需要用户指定元素类型,并对数组的形状进行适当的修改 import

  • Python之urlencode和urldecode案例讲解

    python中的urlencode和urldecode python将字符串转化成urlencode ,或者将url编码字符串decode的方法: 方法1: urlencode:urllib中的quote方法 >>> from urllib import quote >>> quote(':') '%3A' >>> quote('http://www.baidu.com') 'http%3A//www.baidu.com' urldecode:urll

随机推荐