精华内容
下载资源
问答
  • 共享单车之数据可视化
    2022-05-17 19:22:58

    <%@ page language="java" contentType="text/html; charset=utf-8"

             pageEncoding="utf-8"%>

    <html>

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

        <style type="text/css">

            body, html,#allmap {

                width: 100%;

                height: 100%;

                overflow: hidden;

                margin:0;

            }

        </style>

        <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.4"></script>

        <title>step1</title>

    </head>

    <body>

    <div id="allmap"></div>

    </body>

    </html>

    <script type="text/javascript">

        var map = new BMap.Map("allmap");// 创建地图实例

        var point = new BMap.Point(116.10 ,38.98);// 创建点坐标

        map.centerAndZoom(point, 13);//设初始化地图。 如果center类型为Point时,zoom必须赋值,范围3-19级,若调用高清底图(针对移动端开发)时,zoom可赋值范围为3-18级。如果center类型为字符串时,比如“北京”,zoom可以忽略,地图将自动根据center适配最佳zoom级别

        map.addControl(new BMap.NavigationControl());//缩放平移控件

        map.enableScrollWheelZoom();//利用鼠标滚轮控制大小

        var start_longitude=116.233093;//开始经度

        var start_latitude=39.04607;//开始纬度

        var stop_longitude=116.235352;//结束经度

        var stop_latitude=39.041691;//结束纬度

        var address=["乡里乡情铁锅炖南228米","擎天矿用材料有限公司北609米"];

     

        /**********   Begin   **********/

     

     

     

    //遍历绘制路程线  

    for (var i=0;i<start_latitude.length;i++){  

        var polyline = new BMap.Polyline([  

            new BMap.Point(start_longitude[i], start_latitude[i]),  

            new BMap.Point(stop_longitude[i], stop_latitude[i])  

        ], {strokeColor:"red", strokeWeight:3, strokeOpacity:0.5});  

        //将线添加到地图上  

        map.addOverlay(polyline);  

        //调用绘制箭头线函数  

        addArrow(polyline,10,Math.PI/7);  

    }

     

     

     

     

     

    var marker = new BMap.Marker(new BMap.Point(start_longitude,start_latitude)); //创建开始位置标注  

    var marker1 = new BMap.Marker(new BMap.Point(stop_longitude,stop_latitude)); //创建开始位置标注  

    var label = new BMap.Label(address[0], {offset: new BMap.Size(20, 0)});//给标注设置文字描述  

    var label1 = new BMap.Label(address[1], {offset: new BMap.Size(20, 0)});//给标注设置文字描述

    marker.setLabel(label);//将文字描述设置到标注上  

    map.addOverlay(marker);//将标注添加到地图中  

    marker1.setLabel(label1);

    更多相关内容
  • 摘要:头歌 EduCoder 共享单车之数据可视化 大数据

    第1关:绘制地图

    // 图片与题目无关,可以忽略//

     (本人是菜鸟一枚,如果发现错误,属于正常,希望各位大佬批评指正!)

    编程要求:

    在右侧编辑器补充代码,绘制出一条河北省保定市雄县(经纬度为116.10,38.98)一共享单车使用的路程线,具体信息如下:

    1.起点经纬度为(39.04607,116.233093);

    2.终点经纬度为(39.041691,116.235352);

    3.要求设置路程线为红色,宽度为**3,透明度为0.5**;

    4.给起点和终点都创建标注,描述起点为乡里乡情铁锅炖南228米,终点为擎天矿用材料有限公司北609米,要求设置的字体大小为**20**;

    5.调用提供绘制箭头函数addArrow函数添加**r=10,angle=Math.PI/7**的箭头。

    注意:直接使用已定义的变量,且已定义的变量名不要私自修改。

    The answer(Ⅰ.这边建议先自己写哦,不要不讲伍德,直接copy!

    Ⅱ.直接看begin 和end之间的部分!)

    //直接从bengin 开始看,到 end 结束,其余均是无用的。
    <%@ page language="java" contentType="text/html; charset=utf-8"
             pageEncoding="utf-8"%>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <style type="text/css">
            body, html,#allmap {
                width: 100%;
                height: 100%;
                overflow: hidden;
                margin:0;
            }
        </style>
        <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.4"></script>
        <title>step1</title>
    </head>
    <body>
    <div id="allmap"></div>
    </body>
    </html>
    <script type="text/javascript">
        var map = new BMap.Map("allmap");// 创建地图实例
        var point = new BMap.Point(116.10 ,38.98);// 创建点坐标
        map.centerAndZoom(point, 13);//设初始化地图。 如果center类型为Point时,zoom必须赋值,范围3-19级,若调用高清底图(针对移动端开发)时,zoom可赋值范围为3-18级。如果center类型为字符串时,比如“北京”,zoom可以忽略,地图将自动根据center适配最佳zoom级别
        map.addControl(new BMap.NavigationControl());//缩放平移控件
        map.enableScrollWheelZoom();//利用鼠标滚轮控制大小
        var start_longitude=116.233093;//开始经度
        var start_latitude=39.04607;//开始纬度
        var stop_longitude=116.235352;//结束经度
        var stop_latitude=39.041691;//结束纬度
        var address=["乡里乡情铁锅炖南228米","擎天矿用材料有限公司北609米"];
    
    	/**********   Begin   **********/
    
        //1.初始化路程线
        var polyline = new BMap.Polyline([  
        new BMap.Point(start_longitude, start_latitude),  
        new BMap.Point(stop_longitude, stop_latitude)  
        ],{strokeColor:"red",strokeWeight:3,strokeOpacity:0.5});//创建一条宽度为3外边框透明度为0.5的红色线  
    
        //2.将线添加到地图上
       map.addOverlay(polyline);
    
        //3.调用绘制箭头线函数
       addArrow(polyline,10,Math.PI/7);
    
        //4.设置起始点标注
    
        //①先设置起点位置
        var marker = new BMap.Marker(new BMap.Point(start_longitude,start_latitude)); //创建 
        起点位置标注  
        var label = new BMap.Label(address[0], {offset: new BMap.Size(20, 0)});//给标注设置文 
        字描述  //调用上面已经定义的address数组里面的第一个值,即起点的位置。
        marker.setLabel(label);//将文字描述设置到标注上  
        map.addOverlay(marker);//将标注添加到地图中  
    
       //①再设置终点位置
        var marker = new BMap.Marker(new BMap.Point(stop_longitude,stop_latitude)); //创建终点 
        位置标注  
        var label = new BMap.Label(address[1], {offset: new BMap.Size(20, 0)});//给标注设置文 
        字描述  //调用上面已经定义的address数组里面的第二个值,即终点的位置。
        marker.setLabel(label);//将文字描述设置到标注上  
        map.addOverlay(marker);//将标注添加到地图中  
    
    
    //注(也可以是鄙人的一些废话):因为题目中的要求中写到“注意:直接使用已定义的变量,且已定义的变量名不要私自修改”,所以起点,终点位置标注当中 maker和label建议直接照抄左侧格式,不建议修改名称
    
    	/**********   End   **********/
    
        //绘制箭头的函数
        function addArrow(polyline,r,angle){
            var linePoint=polyline.getPath();//线的坐标串(里面存的就是起始点的坐标点)
            var arrowCount=linePoint.length;
            for(var i =1;i<arrowCount;i++){ //在拐点处绘制箭头
                var pixelStart=map.pointToPixel(linePoint[i-1]);
                var pixelEnd=map.pointToPixel(linePoint[i]);
                var pixelTemX,pixelTemY;//临时点坐标
                var pixelX,pixelY,pixelX1,pixelY1;//定义箭头两个点坐标
                var delta=(pixelEnd.y-pixelStart.y)/(pixelEnd.x-pixelStart.x);//主线斜率,垂直时无斜率
                var param=Math.sqrt(delta*delta+1);//代码简洁考虑
                if((pixelEnd.x-pixelStart.x)<0){ //第二、三象限
                    pixelTemX=pixelEnd.x+ r/param;
                    pixelTemY=pixelEnd.y+delta*r/param;
                }else{ //第一、四象限
                    pixelTemX=pixelEnd.x- r/param;
                    pixelTemY=pixelEnd.y-delta*r/param;
                }
                //已知直角三角形两个点坐标及其中一个角,求另外一个点坐标算法
                pixelX=pixelTemX+ Math.tan(angle)*r*delta/param;
                pixelY=pixelTemY-Math.tan(angle)*r/param;
                pixelX1=pixelTemX- Math.tan(angle)*r*delta/param;
                pixelY1=pixelTemY+Math.tan(angle)*r/param;
                var pointArrow=map.pixelToPoint(new BMap.Pixel(pixelX,pixelY));
                var pointArrow1=map.pixelToPoint(new BMap.Pixel(pixelX1,pixelY1));
                var Arrow = new BMap.Polyline([
                    pointArrow,linePoint[i],pointArrow1
                ], {strokeColor:"blue", strokeWeight:3, strokeOpacity:0.5});
                map.addOverlay(Arrow);
                return Arrow;
            }
        }
    </script>

    2关:绘制流量最高的五条线路的路程图

    编程要求:

    在右侧编辑器补充代码,绘制流量最高的五条数据的路程线,具体要求如下:

    1.在servlet中将字段名为key,bickMap.get(key)为value作为键值对方式传值给jsp;

    2.绘制路程线样式为红色,宽度为**3,透明度为0.5**;

    3.调用提供绘制箭头函数addArrow,绘制以**r=10,angle=Math.PI/7**的箭头;

    4.绘制起始地点的标注信息,文字大小仍为20。

    注意:直接使用已定义的变量,且已定义的变量名不要私自修改。

    The answer(小傻瓜们,注意了,要在两个文件中分别写代码哦!)

    //servlet里的代码
    package com.educoder.servlet;
    
    import com.educoder.util.HBaseUtil;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Set;
    
    public class BickMapServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
    
            /**********   Begin   **********/
    
            //1.通过HbaseUtil类获取数据
            BickMap bickMap = HBaseUtil.scanTable(); //直接从左侧的提示栏中cv
       
    		//2.遍历将数据以键值对的方式传给jsp
             for (String key : bickMap.getKeys()) {  
            request.setAttribute(key,bickMap.get(key));//遍历将最高五条流量的数据以“字段名-结果集合”形式传到后台  
        }    //直接从左侧的提示栏中cv
    
            /**********   End    **********/
            request.getRequestDispatcher("step2.jsp").forward(request,response);
    
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req,resp);
        }
    }
    
    

    //step2.jsp里面的代码
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <style type="text/css">
            body, html,#allmap {
                width: 100%;
                height: 100%;
                overflow: hidden;
                margin:0;
            }
        </style>
        <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.4"></script>
        <title>step2</title>
    </head>
    <body>
    <div id="allmap"></div>
    </body>
    </html>
    
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    
    <script type="text/javascript">
    
        var map = new BMap.Map("allmap");// 创建地图实例
        var point = new BMap.Point(116.10 ,38.98);// 创建点坐标
        map.centerAndZoom(point, 13);//设初始化地图。 如果center类型为Point时,zoom必须赋值,范围3-19级,若调用高清底图(针对移动端开发)时,zoom可赋值范围为3-18级。如果center类型为字符串时,比如“北京”,zoom可以忽略,地图将自动根据center适配最佳zoom级别
        map.addControl(new BMap.NavigationControl());//缩放平移控件
        map.enableScrollWheelZoom();//利用鼠标滚轮控制大小
    
    	/**********   Begin  **********/
    	//1.获取后台传过来的数据 调用已写好的change函数清理数据
       //根据固定格式直接照搬照抄
        var start_longitude = change('<%=request.getAttribute("start_longitude") %>');  
        var start_latitude = change('<%=request.getAttribute("start_latitude") %>');  
        var stop_longitude = change('<%=request.getAttribute("stop_longitude") %>');  
        var stop_latitude = change('<%=request.getAttribute("stop_latitude") %>');  
        var start_address = change('<%=request.getAttribute("start_address") %>');   //起点
        var stop_address = change('<%=request.getAttribute("stop_address") %>');    //终点
    
        //2.初始化路程线
    
        for (var i=0;i<start_latitude.length;i++){  
        var polyline = new BMap.Polyline([  
            new BMap.Point(start_longitude[i], start_latitude[i]),  
            new BMap.Point(stop_longitude[i], stop_latitude[i])  
        ], {strokeColor:"red", strokeWeight:3, strokeOpacity:0.5});  //还是从左侧照搬照抄
    
            //3.将线添加到地图上
    
             map.addOverlay(polyline);    //又从左侧抄过来
    
            //4.调用绘制箭头线函数
    
            addArrow(polyline,10,Math.PI/7);  //怎么还是抄左侧的呀
    
            //5.设置起始点标注
    
            //这一部分可以参考第一关来写。
    
            var marker = new BMap.Marker(new BMap.Point(start_longitude[i],start_latitude[i]));  
            var label = new BMap.Label(start_address[i],{offset: new BMap.Size(20, 0)});  
            marker.setLabel(label);  
            map.addOverlay(marker);  
            var marker = new BMap.Marker(new BMap.Point(stop_longitude[i],stop_latitude[i]));  
            var label = new BMap.Label(stop_address[i], {offset: new BMap.Size(20, 0)});  
            marker.setLabel(label);  
            map.addOverlay(marker);  
    
           //其中前四部分表示的是起点的位置获取,后四部分表示的是终点的位置获取
     
        }
    
    //结束啦!!!
    
    	/**********   End   **********/
    
    
        //数据转化函数
        function change(obj) {
            obj = obj.substring(1,obj.length - 1).split(",");
            return obj;
        }
    
        //绘制箭头的函数
        function addArrow(polyline,r,angle){
            var linePoint=polyline.getPath();//线的坐标串(里面存的就是起始点的坐标点)
            var arrowCount=linePoint.length;
            for(var i =1;i<arrowCount;i++){ //在拐点处绘制箭头
                var pixelStart=map.pointToPixel(linePoint[i-1]);
                var pixelEnd=map.pointToPixel(linePoint[i]);
                var pixelTemX,pixelTemY;//临时点坐标
                var pixelX,pixelY,pixelX1,pixelY1;//定义箭头两个点坐标
                var delta=(pixelEnd.y-pixelStart.y)/(pixelEnd.x-pixelStart.x);//主线斜率,垂直时无斜率
                var param=Math.sqrt(delta*delta+1);//代码简洁考虑
                if((pixelEnd.x-pixelStart.x)<0){ //第二、三象限
                    pixelTemX=pixelEnd.x+ r/param;
                    pixelTemY=pixelEnd.y+delta*r/param;
                }else{ //第一、四象限
                    pixelTemX=pixelEnd.x- r/param;
                    pixelTemY=pixelEnd.y-delta*r/param;
                }
                //已知直角三角形两个点坐标及其中一个角,求另外一个点坐标算法
                pixelX=pixelTemX+ Math.tan(angle)*r*delta/param;
                pixelY=pixelTemY-Math.tan(angle)*r/param;
                pixelX1=pixelTemX- Math.tan(angle)*r*delta/param;
                pixelY1=pixelTemY+Math.tan(angle)*r/param;
                var pointArrow=map.pixelToPoint(new BMap.Pixel(pixelX,pixelY));
                var pointArrow1=map.pixelToPoint(new BMap.Pixel(pixelX1,pixelY1));
                var Arrow = new BMap.Polyline([
                    pointArrow,linePoint[i],pointArrow1
                ], {strokeColor:"blue", strokeWeight:3, strokeOpacity:0.5});
                map.addOverlay(Arrow);
                return Arrow;
            }
        }
    
    </script>
    

     

     最后,最后,respect 各位!

    展开全文
  • 基于纽约的共享单车使用数据可视化和建模.zip
  • 共享单车是近年来流行起来的新兴产业,发展具有重要价值。本项目通过对租车数据进行统计以及可视化分析,对单车运营维护团队提出改善性意见。

    一、项目背景

    自行车共享系统是一种租赁自行车的方式,其中获得会员资格、租赁和归还自行车的过程是通过遍布城市的站点网络自动完成的。使用这些系统,人们可以从一个地方租用自行车,并根据需要将其归还到另一个地方。
    共享单车是近年来流行起来的新兴产业,发展具有重要价值。本项目通过对租车数据进行统计以及可视化分析,对单车运营维护团队提出改善性意见。(数据来自Kaggle)

    二、数据处理

    2.1 数据字段

    • datetime - hourly date + timestamp
    • season - 1 = 春, 2 = 夏, 3 = 秋, 4 = 冬
    • holiday - 是否是节假日(0否 1是)
    • workingday - 是否是工作日(0否 1是)
    • weather - 1 = 晴天, 2 = 雾天, 3 = 雪天, 4 = 雨天
    • temp - 实际温度
    • atemp - 体感温度
    • humidity - 湿度
    • windspeed - 风速
    • casual - 未注册用户
    • registered - 注册用户
    • count - 租借数量

    2.2 查看数据

    导入库

    import datetime
    import numpy as np
    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    from pyecharts.charts import *
    import pyecharts.options as opts
    from pyecharts.faker import Faker
    from pyecharts.commons.utils import JsCode

    导入数据

    df=pd.read_csv('train.csv')

    2.2.1 查看数据信息 

    df.info()
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 10886 entries, 0 to 10885
    Data columns (total 12 columns):
     #   Column      Non-Null Count  Dtype  
    ---  ------      --------------  -----  
     0   datetime    10886 non-null  object 
     1   season      10886 non-null  int64  
     2   holiday     10886 non-null  int64  
     3   workingday  10886 non-null  int64  
     4   weather     10886 non-null  int64  
     5   temp        10886 non-null  float64
     6   atemp       10886 non-null  float64
     7   humidity    10886 non-null  int64  
     8   windspeed   10886 non-null  float64
     9   casual      10886 non-null  int64  
     10  registered  10886 non-null  int64  
     11  count       10886 non-null  int64  
    dtypes: float64(3), int64(8), object(1)
    memory usage: 1020.7+ KB
    
    df.dtypes
    datetime       object
    season          int64
    holiday         int64
    workingday      int64
    weather         int64
    temp          float64
    atemp         float64
    humidity        int64
    windspeed     float64
    casual          int64
    registered      int64
    count           int64
    dtype: object
    
    df.head()
    datetimeseasonholidayworkingdayweathertempatemphumiditywindspeedcasualregisteredcount
    02011-01-01 00:00:0010019.8414.395810.031316
    12011-01-01 01:00:0010019.0213.635800.083240
    22011-01-01 02:00:0010019.0213.635800.052732
    32011-01-01 03:00:0010019.8414.395750.031013
    42011-01-01 04:00:0010019.8414.395750.0011
    # 查看count数量是否等于casual+registed
    df[(df.casual+df.registered)!=df['count']].count()
    datetime      0
    season        0
    holiday       0
    workingday    0
    weather       0
    temp          0
    atemp         0
    humidity      0
    windspeed     0
    casual        0
    registered    0
    count         0
    dtype: int64

    2.2.2 查看重复值

    # 查看重复值
    df.duplicated().sum()
    0

    2.2.3 查看缺失值

    # 查看缺失值
    df.isnull().sum()
    datetime      0
    season        0
    holiday       0
    workingday    0
    weather       0
    temp          0
    atemp         0
    humidity      0
    windspeed     0
    casual        0
    registered    0
    count         0
    dtype: int64

    数据不需要再进行重复值和缺失值处理,下面进行数据预处理和特征提取。

    2.3 特征提取

    #数据预处理
    data['season'] = data['season'].map({1:'spring',2:'summer',3:'fall',4:'winner'})
    data['weather'] = data['weather'].map({1:'Good',2:'Normal',3:'Bad',4:'ver Bad'})
    #特征衍生
    data['datetime'] = pd.to_datetime(data['datetime'])
    
    data['year'] = data.datetime.apply(lambda d:d.year)
    data['month'] = data.datetime.apply(lambda d:d.month)
    data['day'] = data.datetime.apply(lambda d:d.day)
    data['hour'] = data.datetime.apply(lambda d:d.hour)
    data['minute'] = data.datetime.apply(lambda d:d.minute)
    data.head()

    Out[6]:

    datetimeseasonholidayworkingdayweathertempatemphumiditywindspeedcasualregisteredcountyearmonthdayhourminute
    02011-01-01 00:00:00spring00Good9.8414.395810.03131620111100
    12011-01-01 01:00:00spring00Good9.0213.635800.08324020111110
    22011-01-01 02:00:00spring00Good9.0213.635800.05273220111120
    32011-01-01 03:00:00spring00Good9.8414.395750.03101320111130
    42011-01-01 04:00:00spring00Good9.8414.395750.001120111140

    三、数据可视化

    通过Matplotlib、Seaborn等工具可视化理解数据,分析特征与标签之间的相关性。

    1. 标签特征的整体分布

    sns.set_style('ticks')
    plt.figure(figsize=(10,6))
    sns.kdeplot(data['count'])
    sns.despine(left=True)
    plt.grid(linestyle='--',alpha=0.5,axis='y')
    plt.title('Demand Distribution',fontsize=15)
    plt.xlabel('Demand',fontsize=13)
    plt.ylabel('Frequence',fontsize=13)

    可见count(租借数量)分布呈右偏,主要集中在0~400这个区间。

    2. 月份维度看需求趋势

    数据含括了两年的跨度,因此按年分分开绘制每月的骑行需求。

    Month_tendency_2011 = data[data['year'] == 2011].groupby('month')[['casual','registered','count']].sum()
    Month_tendency_2012 = data[data['year'] == 2012].groupby('month')[['casual','registered','count']].sum()
    
    #绘制图像
    fig,[ax1,ax2] = plt.subplots(2,1,figsize=(12,15))
    plt.subplots_adjust(hspace=0.3)
    Month_tendency_2011.plot(kind='line',linestyle='--',linewidth=2,colormap='Set1',ax=ax1)
    ax1.set_title('2011 Demand Tendency',fontsize=15)
    ax1.grid(linestyle='--',alpha=0.8)
    ax1.set_ylim(0,150000)
    ax1.set_xlabel('Month',fontsize=13)
    ax1.set_ylabel('Count',fontsize=13)
    
    Month_tendency_2012.plot(kind='line',linestyle='--',linewidth=2,colormap='Set1',ax=ax2)
    ax2.set_title('2012 Demand Tendency',fontsize=15)
    ax2.grid(linestyle='--',alpha=0.8)
    ax2.set_ylim(0,150000)
    ax2.set_xlabel('Month',fontsize=13)
    ax2.set_ylabel('Count',fontsize=13)
    sns.despine(left=True)

    整体上可见2012年相较于2011年,骑行的需求有了大幅的增长。从月份角度可知:6月~9月是骑行旺季,12月~2月是骑行淡季。此外,总需求和注册用户需求的变化最为明显,而非注册用户提升效果一般,这说明:经过一年运营,越来越多使用者在平台上注册,注册用户提升显著。

    3. 小时维度看需求趋势

    提取出每个小时的骑行需求均值。

    Hour_tendency = data.groupby('hour')[['casual','registered','count']].mean()
    
    Hour_tendency.plot(kind='line',linestyle='--',linewidth=2,colormap='Set1',figsize=(12,6))
    plt.grid(linestyle='--',alpha=0.8)
    plt.ylim(0,500)
    plt.xlabel('Hour',fontsize=13)
    plt.ylabel('Count',fontsize=13)
    sns.despine(left=True)

    在24小时内,存在6am~7am以及5pm~6pm两个峰值,中午12am有一个小峰值,符合通勤规律,注册用户特征更为明显,而非注册用户则变化平缓。

    4. 工作日和非工作日小时维度看需求趋势

    #工作人和非工作日每小时的骑行是否有差异
    plt.figure(figsize=(12,6))
    sns.pointplot(x='hour',y='count',hue='workingday',data=data,ci=None,palette='Spectral')
    sns.despine(left=True)
    plt.xlabel('Hour',fontsize=13)
    plt.ylabel('Count',fontsize=13)
    plt.grid(linestyle='--',alpha=0.5)
    plt.title('workdday/holiday Demand Tendency',fontsize=15)

    工作日与非工作日的骑行需求规律反差巨大,非工作日的骑行需求高峰出现在12am~3pm的这段时间内,另外凌晨0am~4am的骑行需求大于工作日。

    5. 天气维度

    Weather_Demand=data.groupby(['weather','day'])[['count']].sum()
    Weather_Demand.reset_index(inplace=True)
    
    plt.figure(figsize=(12,6))
    sns.stripplot(x='weather',y='count',data=Weather_Demand,palette='Set2',jitter=True,alpha=1.0)
    sns.despine(left=True)
    plt.xlabel('Season',fontsize=13)
    plt.ylabel('Count',fontsize=13)
    plt.title('Demand Distribution by Weather',fontsize=15)

     可见,天气状况越糟糕,骑行数量需求越少,极端天气尚未形成趋势线。

    6. 气温与体表温度

    plt.figure(figsize=(10,8))
    sns.kdeplot(data['temp'],data['atemp'],shade=True,shade_lowest=False,cut=10,cmap='YlGnBu',cbar=True)
    sns.despine(left=True)
    plt.grid(linestyle='--',alpha=0.4)
    plt.xlim(0,50)
    plt.ylim(0,50)
    plt.xlabel('Temperature',fontsize=13)
    plt.ylabel('Atemp',fontsize=13)
    plt.title('correlation of temp and atemp',fontsize=15)

    气温和体表温度呈现正相关分布,并且颜色最深的分布最为集中,最适宜的气温27℃~28℃、体表温度31℃左右的骑行需求是最密集的。

    7. 气温与风速

    # 温度与风速的关系度量
    plt.figure(figsize=(10,8))
    sns.kdeplot(data['temp'],data['windspeed'],shade=True,shade_lowest=False,cut=10,cmap='YlGnBu',cbar=True)
    sns.despine(left=True)
    plt.grid(linestyle='--',alpha=0.4)
    plt.xlim(0,50)
    plt.ylim(-10,40)
    plt.xlabel('Temperature',fontsize=13)
    plt.ylabel('Windspeed',fontsize=13)
    plt.title('correlation of temp and windspeed',fontsize=15)

    风速的分布存在断层,初步推断可能是异常数据;此外,通过上图得知气温27℃~28℃,风速8~9骑行需求是最密集的。

    8. 气温与湿度

    # 温度与湿度的关系度量
    plt.figure(figsize=(10,8))
    sns.kdeplot(data['temp'],data['humidity'],shade=True,shade_lowest=False,cut=10,cmap='YlGnBu',cbar=True)
    sns.despine(left=True)
    plt.grid(linestyle='--',alpha=0.4)
    plt.xlim(0,40)
    plt.ylim(0,110)
    plt.xlabel('Temperature',fontsize=13)
    plt.ylabel('Humidity',fontsize=13)
    plt.title('correlation of temp and humidity',fontsize=15)

    通过图片得知,气温27℃~28℃,湿度80~90,骑行需求是最密集的。

    9. 天气因素与骑行需求

    1. 将气温和风速作为天气因素分析骑行需求,使用散点图绘制,散点的大小和颜色深浅代表了骑行量,每个散点代表一天。

    plt.figure(figsize=(12,6))
    plt.scatter(x='temp',y='windspeed',
                s=data['count']/2,
                c='count',cmap='RdBu_r',
                edgecolors='black',linestyle='--',linewidth=0.2,alpha=0.6,
                data=data)
    plt.title('Count distribution by temp and windspeed',fontsize=15)
    plt.xlabel('Temperature',fontsize=13)
    plt.ylabel('Windspeed',fontsize=13)
    sns.despine(left=True)

    骑行需求较多的分布范围:气温20℃~35℃,风速40以下;人们更热衷于温暖天气骑行,炎热天气需求也大的原因推测因为相对于公共交通,骑行更加灵活方便。

    2. 将气温和湿度作为天气因素分析骑行需求,使用散点图绘制,散点的大小和颜色深浅代表了骑行量,每个散点代表一天。

    plt.figure(figsize=(12,6))
    plt.scatter(x='temp',y='humidity',
                s=data['count']/2,
                c='count',cmap='RdBu_r',
                edgecolors='black',linestyle='--',linewidth=0.2,alpha=0.6,
                data=data)
    plt.title('Count distribution by temp and windspeed',fontsize=15)
    plt.xlabel('Temperature',fontsize=13)
    plt.ylabel('Windspeed',fontsize=13)
    sns.despine(left=True)

    骑行需求较多的分布范围:气温20℃~35℃,湿度20~80。

    10. 注册用户与未注册用户

    # 衍生特征
    data['dif']=data['registered']-data['casual'] # 衍生特征注册用户与非注册用户的骑行需求差值
    fig,axes=plt.subplots(2,2,figsize=(20,8))
    plt.subplots_adjust(hspace=0.3,wspace=0.1)
    
    # 绘制子图1:月度差异
    Month_Dif =data.groupby('month')[['casual','registered']].mean()
    Month_Dif.plot(kind='line',linestyle='--',linewidth=2,colormap='Set1',ax=axes[0,0])
    axes[0,0].set_title('Month Demand Tendency Dif',fontsize=15)
    axes[0,0].grid(linestyle='--',alpha=0.8)
    axes[0,0].set_xlabel('Month',fontsize=13)
    axes[0,0].set_ylabel('Count',fontsize=13)
    #绘制子图2:小时差异
    Hour_Dif = data.groupby('hour')[['casual','registered']].mean()
    Hour_Dif.plot(kind='line',linestyle='--',linewidth=2,colormap='Set1',ax=axes[0,1])
    axes[0,1].set_title('Hour Demand Tendency Dif',fontsize=15)
    axes[0,1].grid(linestyle='--',alpha=0.8)
    axes[0,1].set_xlabel('Hour',fontsize=13)
    axes[0,1].set_ylabel('Count',fontsize=13)
    # 绘制子图3:工作日差异
    H2_1 = data[data.workingday==1].groupby('hour')[['casual','registered']].mean() # 工作日
    H2_0 = data[data.workingday==0].groupby('hour')[['casual','registered']].mean() # 非工作日
    H2_1.plot(kind='line',linestyle='--',linewidth=2,colormap='Set1',ax=axes[1,0])
    axes[1,0].set_title('Workingday Hour Demand Dif',fontsize=15)
    axes[1,0].grid(linestyle='--',alpha=0.8)
    axes[1,0].set_xlabel('Hour',fontsize=13)
    axes[1,0].set_ylabel('Count',fontsize=13)
    # 绘制子图4:非工作日差异
    H2_0.plot(kind='line',linestyle='--',linewidth=2,colormap='Set1',ax=axes[1,1])
    axes[1,1].set_title('Holiday Hour Demand Dif',fontsize=15)
    axes[1,1].grid(linestyle='--',alpha=0.8)
    axes[1,1].set_xlabel('Hour',fontsize=13)
    axes[1,1].set_ylabel('Count',fontsize=13)
    sns.despine(left=True)
     
    

    上面四幅为注册用户与非注册用户在各因素下的差异组合图(从左到右排序):

    p1是月度差异图,整体趋势相同,注册用户远高于非注册用户;

    p2是小时差异图,注册用户的小时规律明显,非注册用户则只在12am~5pm存在峰值,整体差异较大;

    p3是工作日差异图,注册用户工作日小时规律明显,二非注册用户趋势平缓;

    p4是非工作日差异图,非工作日两者差异相较于其他因素差异较小,且趋势相同。

    总体来说,注册用户需求远高于非注册用户,注册用户的使用规律明显,而非注册用户受其他因素的影响相对较弱。

    四、分析结论

    1. 共享单车由注册用户与非注册用户构成,而主要群体以注册用户为主。

    2. 共享单车的用户总数主要受实际温度、体感温度、湿度、时刻影响比较明显。

    五、策略建议

    1. 用户总数随时间在持续上升,可以增加共享单车的投放数量以满足业务需求;

    2. 用户总数工作日的上下班时段达到高峰期,因此在此时间段前进行车辆调度集中投放在地铁口、公交站台、小区出口等附近以供人们方便使用,提高用户量; 但在假期,则在白天时刻集中投放在各小区出口、地铁口、景点等附近以供人们方便使用,用以提供用户量;

    3. 用户总数在温度达到20-25摄氏度之间达到高峰期,因为温度较舒服,人们喜欢骑单车出行,因此可以在这种天气时增大投放量。

    展开全文
  • //设初始地图。 如果center类型为Point时,zoom必须赋值,范围3-19级,若调用高清底图(针对移动端开发)时,zoom可赋值范围为3-18级。如果center类型为字符串时,比如“北京”,zoom可以忽略,地图将自动根据...

    <%@ page language="java" contentType="text/html; charset=utf-8"

             pageEncoding="utf-8"%>

    <html>

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

        <style type="text/css">

            body, html,#allmap {

                width: 100%;

                height: 100%;

                overflow: hidden;

                margin:0;

            }

        </style>

        <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.4"></script>

        <title>step1</title>

    </head>

    <body>

    <div id="allmap"></div>

    </body>

    </html>

    <script type="text/javascript">

        var map = new BMap.Map("allmap");// 创建地图实例

        var point = new BMap.Point(116.10 ,38.98);// 创建点坐标

        map.centerAndZoom(point, 13);//设初始化地图。 如果center类型为Point时,zoom必须赋值,范围3-19级,若调用高清底图(针对移动端开发)时,zoom可赋值范围为3-18级。如果center类型为字符串时,比如“北京”,zoom可以忽略,地图将自动根据center适配最佳zoom级别

        map.addControl(new BMap.NavigationControl());//缩放平移控件

        map.enableScrollWheelZoom();//利用鼠标滚轮控制大小

        var start_longitude=116.233093;//开始经度

        var start_latitude=39.04607;//开始纬度

        var stop_longitude=116.235352;//结束经度

        var stop_latitude=39.041691;//结束纬度

        var address=["乡里乡情铁锅炖南228米","擎天矿用材料有限公司北609米"];

        /**********   Begin   **********/

        //1.初始化路程线

        var start_longitude=116.233093;//开始经度

        var start_latitude=39.04607;//开始纬度

        var stop_longitude=116.235352;//结束经度

        var stop_latitude=39.041691;//结束纬度

        var polyline = new BMap.Polyline([  

           new BMap.Point(start_longitude, start_latitude),  

           new BMap.Point(stop_longitude, stop_latitude)  

        ],{strokeColor:"red",strokeWeight:3,strokeOpacity:0.5});//创建一条宽度为3外边框透明度为0.5的红色线  

        //2.将线添加到地图上

    map.addOverlay(polyline);//将线添加到地图上  

        //3.调用绘制箭头线函数

    addArrow(polyline,10,Math.PI/7);

        //4.设置起始点标注

    var marker = new BMap.Marker(new BMap.Point(start_longitude,start_latitude)); //创建开始位置标注  

    var marker1 = new BMap.Marker(new BMap.Point(stop_longitude,stop_latitude)); //创建开始位置标注  

    var label = new BMap.Label(address[0], {offset: new BMap.Size(20, 0)});//给标注设置文字描述  

    var label1 = new BMap.Label(address[1], {offset: new BMap.Size(20, 0)});//给标注设置文字描述

    marker.setLabel(label);//将文字描述设置到标注上  

    map.addOverlay(marker);//将标注添加到地图中  

    marker1.setLabel(label1);

    map.addOverlay(marker1);

        /**********   End   **********/

        //绘制箭头的函数

        function addArrow(polyline,r,angle){

            var linePoint=polyline.getPath();//线的坐标串(里面存的就是起始点的坐标点)

            var arrowCount=linePoint.length;

            for(var i =1;i<arrowCount;i++){ //在拐点处绘制箭头

                var pixelStart=map.pointToPixel(linePoint[i-1]);

                var pixelEnd=map.pointToPixel(linePoint[i]);

                var pixelTemX,pixelTemY;//临时点坐标

                var pixelX,pixelY,pixelX1,pixelY1;//定义箭头两个点坐标

                var delta=(pixelEnd.y-pixelStart.y)/(pixelEnd.x-pixelStart.x);//主线斜率,垂直时无斜率

                var param=Math.sqrt(delta*delta+1);//代码简洁考虑

                if((pixelEnd.x-pixelStart.x)<0){ //第二、三象限

                    pixelTemX=pixelEnd.x+ r/param;

                    pixelTemY=pixelEnd.y+delta*r/param;

                }else{ //第一、四象限

                    pixelTemX=pixelEnd.x- r/param;

                    pixelTemY=pixelEnd.y-delta*r/param;

                }

                //已知直角三角形两个点坐标及其中一个角,求另外一个点坐标算法

                pixelX=pixelTemX+ Math.tan(angle)*r*delta/param;

                pixelY=pixelTemY-Math.tan(angle)*r/param;

                pixelX1=pixelTemX- Math.tan(angle)*r*delta/param;

                pixelY1=pixelTemY+Math.tan(angle)*r/param;

                var pointArrow=map.pixelToPoint(new BMap.Pixel(pixelX,pixelY));

                var pointArrow1=map.pixelToPoint(new BMap.Pixel(pixelX1,pixelY1));

                var Arrow = new BMap.Polyline([

                    pointArrow,linePoint[i],pointArrow1

                ], {strokeColor:"blue", strokeWeight:3, strokeOpacity:0.5});

                map.addOverlay(Arrow);

                return Arrow;

            }

        }

    </script>

    展开全文
  • 今天选取的地图是前几天利用数字中国创新大赛提供的共享单车数据做的一个可视化效果。很多人询问制作方法,今天给大家介绍下。自古有云,巧妇难为无米之炊,要做这种数据可视化,数据是关键。数据去哪里...
  • Python共享单车数据可视化(时间、空间、频次三维度分析)
  • 我们借分析国外共享单车数据,看看是否能为我们国内的共享单车市场指明一条道路。1.收集数据数据下载自KaggleBike Sharing Demand | Kaggle​www.kaggle.com1.1 项目说明Bike sharing systems are a...
  • 共享单车项目数据可视化展示1. 数据收集https://www.kaggle.com/c/bike-sharing-demand/data1.1 数据说明及问题分析数据内容包括两年内的每小时租赁数据,包括有: datetime(日期时间) - hourly date + ...
  • Python数据分析实战项目-共享单车有效的解决了“走路累,公交挤,开车堵,打车贵”的苦恼。一夜之间,北上广深、甚至部分二线城市,共享单车大街小巷随处可见。
  • 头歌(educoder)平台实战项目——共享单车数据分析
  • 大纲一、研究目的二、分析思路1、加载数据2、理解数据3、数据清洗4、相关性分析5、数据可视化一、研究目的分析不同因素对租车人数的影响情况,根据分析的结果,给运营提供数据支撑。二、分析思路1、加载数据①加载...
  • 单车数据 Bike Sharing Demand | Kaggle​www.kaggle.com在分析问题前,利用之前学过的Excel数据处理方法对获得的数据进行简单清洗,包括删除重复值:全选唯一列,数据--删除重复值查看并处理缺失值:选中一列--开始...
  • Hi,大家好,今天给大家介绍一个大数据可视化项目,大家...今天要分享的是:基于大数据的共享单车可视化平台大数据大屏可视化系列:基于大数据的共享单车可视化平台可搭载任意自己想用的数据,动态效果不错项目源码: ...
  • 共享单车数据可视化

    千次阅读 2019-07-26 11:45:17
    拿到了一份共享单车骑行数据,利用Python进行数据可视化。 数据下载地址:链接: https://pan.baidu.com/s/11DiPR0LjT5xNgic4wrpLGg   提取码:g7bc  数据的理解 使用XLS表格打开 Datetime:时间 ...
  •  摩拜是最早进入成都的共享单车,每天我从地铁站下来的时候,在APP中能看到很多单车,但走到那里的时候,才发现车并不在那里。有些车不知道藏到了哪里;有些车或许是在高楼的后面,由于有GPS的误差而找不到了;有些...
  • (原本这个项目的目的是预测华盛顿地区的共享单车的租赁需求量,在这里我们主要任务是将共享单车数据进行可视化分析,不着重选择合适的机器学习模型来预测需求量。)三、理解数据:import pandas as pd import n.....
  • 共享单车项目数据分析报告.pptx
  • 共享单车使用Tableau创建可视化文件以分析纽约自行车共享数据。监督项目在此分析中,我们使用了Pandas将“ tripduration”列从整数更改为日期时间数据类型。 然后,使用转换后的数据类型,您将创建一组可视化效果,...
  • 共享单车

    2021-02-14 13:50:44
    共享单车 抽象的 我使用Tableau和Python,使用纽约市Citibike数据创建了业务计划和演示文稿,希望该计划可以在得梅因市中部署。 结果 请参阅以下内容,了解我使用Tableau Story可视化的结果以及每幅图像随附的相关...
  • 一、因为分析的是共享单车数据里有每台单车起点和终点的坐标,所以要有轨迹,就要先连接地图 我用的是百度地图 (19条消息) html网页heatmap.js调用百度地图api做热力图调用百度地图API显示热力图_tian_jiangnan...
  • 共享单车之租赁需求预估第1关:数据探索与可视化
  • 数据集和python程序代码
  • 此示例说明如何使用从传感器获得的数据分析共享单车交通模式,来预处理带时间戳的数据数据来自传感器。 此示例展示了如何执行各种数据清理、调整和预处理任务,例如删除缺失值和同步具有不同时间步长的时间戳数据...
  • 项目数据来源于kaggle项目 Bike Share Demand,使用Python对数据进行了可视化分析:共享单车项目分析_页面_01.jpg共享单车项目分析_页面_02.jpg共享单车项目分析_页面_03.jpg共享单车项目分析_页面_04.jpg共享单车...
  • python爬取摩拜单车API数据并做可视化分析(源码)
  • 需要分析的问题结合数据集中天气、温度、日期等因素,分析美国某城市共享单车使用情况。二. 理解数据使用pandas.read_csv方法读取数据集,查看其前五行。我们可以看到数据集拥有12个标签:datetime:时间(年-月-日 ...
  • 共享单车数据可视化分析

    千次阅读 2019-08-26 09:49:52
    数据分析与可视化 1.不同月份的骑行人数    每个月份的平均骑行人数   把count 列按照降序排列的结果    柱状图 2.一周内不同时间的骑行人数      一周内不同时间的骑行...
  • 文章目录前言一、数据采集与处理1、数据来源2、数据预处理二、可视化分析(统计学)1.特征分解2.整体关系图(pairplot)3.相关性分析(heatmap)4.参看各因素与count的关系3、模型预测4.GUI界面设计总结 前言 本项目...
  • 项目描述:利用kaggle网站项目(Bike Sharing Demand | Kaggle)中提供的2011年到2012年美国某城市的共享单车数据集,其中包括了租车日期,天气,季节,气温,体感温度,空气湿度,风速等数据。通过对数据进行清洗,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,554
精华内容 621
热门标签
关键字:

共享单车之数据可视化