1.  实验环境

Ubuntu 16.04 - VMware Workstation 16 Pro

java - openjdk version “1.8.0_292”

Scala code runner version 2.11.8

Spark 2.1.0

Hadoop 2.7.1

  1. 实验背景

    1. 背景

为了限制机动车保有量,2011年北京市推出了小汽车摇号政策。在2016年,为了照顾那些长时间没有摇中号码牌的申请者,摇号政策又推出了“倍率制度”,根据参与摇号的次数为每个人赋予不同的倍率系数。这样,大家的中签率就由原来的整齐划一的基础概率,变为了“基础概率*倍率系数”。

  1. 数据介绍

2011-2019北京市小汽车摇号数据下载地址:百度网盘 请输入提取码 ,提取码ajs6

目录下有apply和lucky两个目录,前者是申请记录,后者是中签记录,数据文件为Parquet。里面的每条记录包含两个字段:String类型的carNum,以及Int型的batchNum。 在实现过程中,所谓的倍率其实就是增加申请号码的副本数量。

  1. 问题A

    1. 任务要求

大多数人反馈,即使背了8倍,10倍的倍率,照样摇不上。为了验证加倍率的方式是否能提高中签率,请大家用spark SQL(基于DataFrame)分析摇号和中签的历史数据,定量分析:倍率和中签率之间有何关系,判断当前加倍率的方案是否合理,如何分析,方案自定。(提示:关注中签者的倍率变化)

  1. 实验分析

由于倍率制度是在2016年之后推出的,分析数据时我们只需要关注2016年之后的倍率和中签率之间的关系。由于每个倍率申请者基数不一致,我们并不能简单地使用每个倍率中签者数量除以中签者总数,所以我们采取的方法是观察每个倍率中签者在该倍率基数中的比例。

  1. 操作与代码实现

打开一个终端,开启hadoop:

将本地数据放入hdfs中:

可以看到hdfs目录中多了car-num-dataset一项,用命令打印car-num-dataset文件夹内容,可以看到数据已经正常传入:

开启spark:

引用头文件,使用spark sql DataFrame

import org.apache.spark.sql.DataFrameimport spark.implicits._

分别读入两个parquet文件apply和lucky,生成DataFrame

val applyNumbersDF: DataFrame = spark.read.parquet("hdfs://localhost:9000/user/hadoop/car-num-dataset/apply")val luckyNumbersDF: DataFrame = spark.read.parquet("hdfs://localhost:9000/user/hadoop/car-num-dataset/lucky")

applyNumbersDF和luckyNumbersDF格式为:

   

对applyNumbersDF使用filter函数过滤出batchNum在2016年之后的数据,并以carNum编号和batchNum摇号日期使用groupBy函数聚合并使用count函数得出申请者的倍率。最后将使用count函数默认得到的列名“count”用withColumnRenamed函数改为“applyNum”,方便之后操作。

val applyCount = applyNumbersDF.filter(applyNumbersDF("batchNum")>201600).groupBy("carNum","batchNum").count().withColumnRenamed("count","applyNum")

applyCount数据格式:

对luckyNumbersDF使用filter函数过滤出batchNum在2016年之后的数据,使用join函数将其与applyCount中得到的倍率表聚合,这一步相当于luckyNumbersDF在applyCount表中查找每一项的applyNum的值写入表中。

val luckyCount = luckyNumbersDF.filter(luckyNumbersDF("batchNum")>201600).join(applyCount,Seq("carNum","batchNum"))

luckyCount数据格式:

对applyCount使用groupyBy函数count函数的联合方式对“applyNum”每个倍率的申请者数目进行统计,并使用sort函数升序排列。对luckyCount以同样的方式对每个倍率的中签者数目进行统计,并将count函数默认的列明改为“luckyNum”。

val applyNum = applyCount.groupBy("applyNum").count().sort(applyCount("applyNum").asc)val luckyNum = luckyCount.groupBy("applyNum").count().sort(luckyCount("applyNum").asc).withColumnRenamed("count","luckyNum")

applyNum和luckyNum的数据:

    

这里我们可以发现,倍率为13的申请者由于基数太少中签率低的原因,并没有中签者产生。

为了方便调试和使之后的计算不必重复,我们将applyNum和luckyNum在这里进行存储:

applyNum.write.parquet("hdfs://localhost:9000/user/hadoop/applyNum.parquet")luckyNum.write.parquet("hdfs://localhost:9000/user/hadoop/luckNum.parquet")

加载存储的applyNum和luckyNum数据

val applyNum: DataFrame = spark.read.parquet("hdfs://localhost:9000/user/hadoop/applyNum.parquet")val luckyNum: DataFrame = spark.read.parquet("hdfs://localhost:9000/user/hadoop/luckNum.parquet")

使用join函数将两个表格合并,并使用withColumn函数生成新列”rate”,用原luckyNum中每个倍率的”luckyNum”中签数除以原applyNum中每个倍率的”count”申请总数得到每个倍率的中签率。

val rate1 = luckyNum.join(applyNum,Seq("applyNum"))val rate = rate1.withColumn("rate", rate1("luckyNum")/rate1("count"))

可以观察到倍率从1增加到9,中签率在不断上升,倍率到9之后继续增加,中签率有所下降,这有可能是高倍率的申请者基数过少导致的。

通过对倍率和中签率的分析,在倍率低时中签率呈拟线性增加,当倍率达到一定时,中签率有所下降。说明该倍率机制在低倍率中表现良好,但是高倍率的申请者由于基数过少、倍率增幅不大的原因没有体现出优势,存在一定的问题。

spark+dataframe+小汽车摇号倍率与中签率分析相关推荐

  1. 愚人节汽车假新闻之北京取消摇号

    京籍首辆车无需摇号 "翻身把歌唱!" 北京小汽车摇号粉碎了多少人的买车梦.不过今天北京市摇号政策发生变化,在目前号码池摇号的基础上增加上牌资格筛查,北京户籍购买首台汽车无需摇号,二 ...

  2. pbdom 不能解析gbk_备受家长追捧的公立学校,摇中率不到3%,还要抢着报名?速看大摇号学校全面解析!...

    原标题:备受家长追捧的公立学校,摇中率不到3%,还要抢着报名?速看大摇号学校全面解析! 大摇号和民办摇号冲突吗? 大摇号没摇中还能入读划片内初中吗? 5所学校,该选哪所? 大摇号摇中后,民办摇号和小摇 ...

  3. 技术宅男揭秘:北京机动车摇号真的公平?

    [编者按]本文作者为蚂蚁金服人工智能部高级算法工程师墨眀(网名:沙漠之鹰),曾就职于三星研究院从事语音合成工作,擅长自然语言处理.网页爬虫和数据分析.本文为作者在加入蚂蚁金服之前的个人业余兴趣项目.本 ...

  4. 机器学习预测机动车摇号:神秘的第七位

    沙漠君按 上一篇帝都摇号文章在发布之后,总阅读量高达百万,不少读者觉得意犹未尽.当时成文过于仓促,很多细节没有理清. 两月磨一剑,看看我们能否解决下面的问题: 13位用户编码真的是随机的吗? 摇号池中 ...

  5. CCD工业相机、镜头倍率及相关参数计算方法

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 随着自动化的日益剧增,CCD相机.镜头倍率被提上日程,许多小伙伴们 ...

  6. 学计算机的学校17w,摇号中签率23.19%,学费一年17W?11所民校详情介绍!

    原标题:摇号中签率23.19%,学费一年17W?11所民校详情介绍! 民校专辑 点击蓝色字体查看学校具体介绍 2021小升初已经进入准备阶段,家长帮一路跟进小升初进度,帮助家长朋友搜集一手咨询,掌握最 ...

  7. 基于Alluxio系统的Spark DataFrame高效存储管理技术

    介绍 越来越多的公司和组织开始将Alluxio和Spark一起部署从而简化数据管理,提升数据访问性能.Qunar最近将Alluxio部署在他们的生产环境中,从而将Spark streaming作业的平 ...

  8. 发那科攻丝回退参数_参数-Fanuc数控系统的攻丝拉拔动作倍率即回退速度倍率

    众所周知Fanuc数控系统的参数多如牛毛.上千的参数,并且有的还是八位,虽然Fanuc发布有相关的参数说明书.但是,作为最终用户的我们,有的也只是公开发布的,也没有更新更全的相关资料.即便是有了相关书 ...

  9. 杭州个人小客车摇号百分之百中签率所需要的时间预测和阶梯摇号概率提升

    2018年7月31日,杭州第一次车牌阶梯摇号落下帷幕,各种准确的数据进行了详细公布,咱们可以更准确的对像我这样运气不佳久摇不中的人进行摇号预测了.可以看到第一次第一阶梯的阶梯摇号的概率相当于普通摇号概 ...

  10. 多地“摇号购房” 开发商迎来了良机?

    如果住房紧张在这些地方已经成为事实,而且在短期内难以解决,那么,更长远的办法应该是加大供应,满足购房者的需求. 近期宣布"摇号购房"政策的武汉.杭州.西安等城市,开始推出摇号项目. ...

最新文章

  1. C++编译器会对没有构造函数的类生成默认构造函数吗?
  2. 大学加权平均分计算器_英国排名前20的大学GPA要求
  3. 【转】HTML5移动端最新兼容问题解决方案
  4. matlab gradient
  5. (论文阅读笔记1)Collaborative Metric Learning(一)(WWW2017)
  6. 数据库系统实训——实验二——单表查询
  7. 【转】性能测试,影响 TPS 的一些因素
  8. 小米CC开机动画公布:扑面而来的青春活力
  9. App后台开发运维和架构实践学习总结(5)——App产品从需求到研发到开发到上线到产品迭代全过程
  10. OpenFeign 的 9 个坑,每个都能让你的系统奔溃
  11. python创建矩阵_从文本文件创建矩阵-python
  12. 营造平安 信息化使公交事业更加人性化
  13. CSS几种常见的页面布局方式介绍
  14. 计算机网络 P2P应用
  15. Android 解决使用VLC实现视频播放报错 libvlc decoder: more than 5 seconds of late video
  16. 为什么服务器系统会异常,windows服务器查看系统异常
  17. 纯净IP地址--跨境人的爱恨情仇
  18. Si39333有源 RFID 标签
  19. 内网环境如何访问钉钉服务接口
  20. ffmpeg——同时剪辑多个视频并合并

热门文章

  1. CleanMyMac2023免费版系统清理优化工具
  2. Sql学习04(11.23-11.24)
  3. enfuzion与lsf构建渲染集群_集群渲染系统构建及优化-精选文档
  4. 如何利用Python实现自动打卡签到
  5. winhex查看mysql_使用WINHEX查看innodb的BTree高度
  6. 鸟哥的Linux私房菜:首次登陆与在线求助,LINUX最简单的命令及应用(一)
  7. 计算机研究院分所烟台,综合新闻_中科院计算所烟台分所 烟台中科网络技术研究所...
  8. Android开发艺术探索之初探AIDL(一)
  9. “大狼狗加密专家”使用简介
  10. php时区问题,php时区问题