zoukankan      html  css  js  c++  java
  • Python看春运,万条拼车数据背后的春节迁徙地图

    Python看春运,万条拼车数据背后的春节迁徙地图

    今天是正月初九,春运返程也已过半。这篇文章,作者对北京、上海、广州、深圳、杭州等地 1万多条出行数据进行分析,得出了一些有意思的结论,并且绘制了这几个城市春运的迁移图。虽然数据在取样公平性上不能完全符合标准,但是思路还是值得大家学习参考的~

    目录

    • 前言
    • 统计结果
    • 爬虫思路
    • 统计思路
    • 后记

    前言

    很早之前发过一篇关于某拼车平台爬虫的文章,因为工作比较忙,一直没有下文。最近年底稍微空了些,加上碰上春节返乡大潮,刚好再拿过来写一下数据分析的思路。

    本次数据样本共13041条,本别采集了北京、上海、广州、深圳、杭州的某一天出行数据,由于手动操作难以保证取样的公平性,所以不能对全部数据结果的准确性做保证,本文以提供思路参考为主,先放一张路线图:

    img

    统计结果

    好了知道大家比较关心结果,所以先把结果放一放,后面再接着讲分析过程。

    • 乘客性别

    先单独把性别拎出来看一下,后面再根据城市进行分析,结果显示,抛开未设置性别的乘客不论,总体来看顺风车的用户群中,男性(占比 49.39%)还是多于女性(占比 31.55%)的。毕竟跨城顺风车,大过年的,女性乘客对于安全性的忧虑还有要有的。

    img

    • 城市订单

    真实数据的话订单数量应该是深圳 > 北京 > 广州 > 上海 > 杭州,但是同一个城市内的乘客性别比例应该还是具有一定的参考价值的,可以看到北京、上海、深圳的女性乘客数量占比都是高于男性的。

    img

    • 客单价

    原本是想比较一下平均路程长度,但是想想这个事情太折腾了,由于平台主要还是依靠路程来计算拼车费用的,所以通过计算客单价的话大概也能反映一下平均形成长度(我猜的,然后结果是这样的,没想到广州是最高的,也可能是我统计错误。

    img

    • 哪里乘客最壕

    有时候有些偏远地区订单或者顺路司机少,乘客会加价希望司机接单,于是统计了一下各城市加价订单的占比和平均的加价额度,得出如下结果

    占比最高的城市是深圳,平均加价额度最高的城市也是深圳,看来深圳的小哥哥小姐姐们的确出手阔错,然而加价比例最低的是北京,不过这也不能说明帝都人民不壕气,可能就是人家繁华,司机多。

    img

    • 返乡路线图

    最后放几张返乡的路线图

    北京

    img

    上海

    img

    img

    广州

    img

    img

    深圳

    img

    杭州

    杭州明显有别与其它几个城市,一个是杭州的数据样本多,另外一个平台上杭州黄牛多,那些最远的单子就是黄牛广告单。

    img

    img

    爬虫思路:注册成为司机,利用 mitm 抓包存储拼车单

    统计思路:数据的话我是通过本地 Mongodb 存储,所以直接用 python 操作 Mongodb 数据

    Pymongo:关于 Mongodb 数据库的连接,直接上代码:

    client = MongoClient('mongodb://localhost:27017')
    spring = client.spring
    collection = spring['orders']
    

    以上代码的意思就是连接本地 Mongodb-spring 数据库 -orders 文档集合

    Pyecharts:是大名鼎鼎的 Echarts 的 Python 可视化图表库,用起来挺顺手的,而且文档规范,基本上可以零门槛入门,具体实现请移步文档。

    Pyecharts(http://pyecharts.org)

    这里介绍一下关于 Pyecharts 的图表样式配置,为了保持各图表的样式统一(偷懒),Pyecharts 提供了一个 Style 类,可用于在同一个图或者多个图内保持统一的风格。

    rom pyecharts import Style,Geo
    
    style = Style(
       title_color="#fff",
       title_pos="center",
       width=1100,
       height=600,
       background_color='#404a59'
    )
    # style.init_style 会返回类初始化的风格配置字典
    geo = Geo("全国主要城市空气质量", "data from pm2.5", **style.init_style)
    

    代码解读

    因为全部代码有点长,所以抽了一段举个例子,主要思路就是从 Mongodb 取出指定数据,或者通过 $group 管道对数据进行处理,最后通过 pyecharts 生成相应的图表,呈现

    from pymongo import MongoClient
    from pyecharts import Style,GeoLines
    
    def getLines(self):
       # 连接数据库
       client = MongoClient('mongodb://localhost:27017')
       spring = self.client.spring
       collection = self.spring['orders']
       
       # Mongodb的操作,$match-筛选出'from_poi.city.city_name'为'杭州'的文档,
       # 再通过$group管道,按照目标城市统计出汇总数量
       line_hangzhou = collection.aggregate([
           {'$match': {'from_poi.city.city_name': '杭州'}},
           {'$group': {'_id': '$to_poi.city.city_name', 'count': {'$sum': 1}}}
       ])
       # 按照Geolines图表的数据格式格式化数据
       line_hangzhou_ = []
       for line in line_hangzhou:
           line_hangzhou_.append(["杭州", line['_id'], line['count']])
           
       # 创建一个GeoLines图表
       citylines = GeoLines("春节迁移路线图", **style.init_style)
       # 添加数据以及样式
       citylines.add("从杭州出发",
                     line_hangzhou_,
                     **geo_style)
       # 生成html文件
       citylines.render("results/citylines.html")
    

    后记

    这是一篇迟到很久的文章,本来没打算再写,但是总觉得下半部分没写完心里有个结,所以还是抽时间补上。另外作为一个非专业技术人员,多记多练免得过几天自己就忘了。

    源码地址附上:

    https://github.com/bkidy/Dida_spider

  • 相关阅读:
    linux内核中的subsys_initcall是干什么的?
    linux内核中的MFD子系统
    linux内核中有哪些子系统(框架)呢?
    软件架构师书籍
    求最大公约数和最小公倍数
    写一个函数判断字符串中"{"与"}","["与"]","("与")"匹配,"{"必须在"}"前面,"["必须在"]"前面,"("必须在")"前面,可以嵌套
    请用程序写出冒泡排序算法,并做相应改进使得排序效率更高
    50个必备的实用jQuery代码段+ 可以直接拿来用的15个jQuery代码片段
    js同比例缩放图片
    oracle 10g函数大全--其他函数
  • 原文地址:https://www.cnblogs.com/paisenpython/p/10371647.html
Copyright © 2011-2022 走看看