精华内容
下载资源
问答
  • 对于从事数据领域的小伙伴来说,当...提到数据可视化,我们会想到 Plotly、Matplotlib、Pyecharts等可视化库,或者一些商用软件Tableau、FineBI等等。如果你希望操作更简单、展现效果更强大,那么这款工具 big_scr...

    eb00bbdf-668c-4a35-ac44-6fbf633cdbfb.jpg

    对于从事数据领域的小伙伴来说,当需要阐述自己观点、展示项目成果时,我们需要在最短时间内让别人知道你的想法。我相信单调乏味的语言很难让别人快速理解。最直接有效的方式就是将数据进行可视化展现。

    提到数据可视化,我们会想到 Plotly、Matplotlib、Pyecharts等可视化库,或者一些商用软件Tableau、FineBI等等。如果你希望操作更简单、展现效果更强大,那么这款工具 big_screen 更适合你了,本文介绍具体如下:

    •big_screen 特点•安装环境•输入数据•结果展示•在线部署•代码领取

    big_screen 特点

    便利性工具, 结构简单, 你只需传数据就可以实现数据大屏展示。

    安装环境

    pip install-i https://pypi.tuna.tsinghua.edu.cn/simple flask

    输入数据

    在文件夹 data.py 中更新你需要展示的数据即可,如下为部分数据展示:

    self.echart1_data={'title':'行业分布','data':[{"name":"商超门店","value":47},{"name":"教育培训","value":52},{"name":"房地产","value":90},{"name":"生活服务","value":84},{"name":"汽车销售","value":99},{"name":"旅游酒店","value":37},{"name":"五金建材","value":2},]}self.echart2_data={'title':'省份分布','data':[{"name":"浙江","value":47},{"name":"上海","value":52},{"name":"江苏","value":90},{"name":"广东","value":84},{"name":"北京","value":99},{"name":"深圳","value":37},{"name":"安徽","value":150},]}self.echarts3_1_data={'title':'年龄分布','data':[{"name":"0岁以下","value":47},{"name":"20-29岁","value":52},{"name":"30-39岁","value":90},{"name":"40-49岁","value":84},{"name":"50岁以上","value":99},]}self.echarts3_2_data={'title':'职业分布','data':[{"name":"电子商务","value":10},{"name":"教育","value":20},{"name":"IT/互联网","value":20},{"name":"金融","value":30},{"name":"学生","value":40},{"name":"其他","value":50},]}

    本地运行

    cd big_screen-master;python app.py;

    结果展示

    在线部署

    你可以直接像在本地一样运行脚本,这样可以运行成功,如果我们想让它一直运行,我们可以在线部署。使用命令如下:

    nohup python app.py

    这时你可以查看进程

    ps-ef|grep python

    就会看到我们刚才 app.py 代码已经运行起来了,这个就是在后台运行,关闭连接之后一样会运行,这下就放心了。

    但是,如果发生错误的话,我们是无法知道哪里出错的,这时我们指定日志输出文件

    nohup python-u app.py>robot.log2>&1&

    还有一个问题,我想停止在线运行怎么办?可以使用这个命令

    kill PID

    代码领取

    长按扫码,发消息[大屏]

    cbca0ae1-ec72-4527-8cea-5071fa894667.jpg

    展开全文
  • 展示中国新冠疫情数据,建立时间序列模型分析预测未来30天新增,通过flask,echarts进行大屏展示
  • Python 应用实战-Python实现大屏数据可视化
  • 近年来,数据可视化大屏的出现,掀起一番又一番的浪潮,众多企业主纷纷想要打造属于自己的 “酷炫吊炸天” 的霸道总裁大屏驾驶舱。今天为大家分享的是 【厦门市某医院大数据展示案例】。 话不多说,开始分享干货,...

    目录

    精彩案例汇总

    效果展示

    1、首先看动态效果图 

    2、再看实时分片数据图

    一、 确定需求方案

    1、确定产品上线部署的屏幕LED分辨率

    2、功能模块

    3、部署方式 

    二、整体架构设计

    三、编码实现 (基于篇幅及可读性考虑,此处展示部分关键代码)

    1、前端html代码 

    2、前端JS代码

    3、后端python代码

    四、上线运行

    五、源码下载

    精彩案例汇总


    近年来,数据可视化大屏的出现,掀起一番又一番的浪潮,众多企业主纷纷想要打造属于自己的 “酷炫吊炸天” 的霸道总裁大屏驾驶舱。今天为大家分享的是 【厦门市某医院大数据展示案例】。

    之前小伙伴们建议我出一些视频课程来学习Echarts,这样可以更快上手,所以我就追星赶月的录制了《Echarts - 0基础入门课程》Echarts-0基础入门--其他视频教程-编程语言-CSDN程序员研修院 ,希望小伙伴们多多支持。

    精彩案例汇总

    YYDatav的数据可视化《精彩案例汇总》_YYDataV的博客-CSDN博客

    话不多说,开始分享干货,欢迎讨论!微信号: 6550523

    效果展示

    1、首先看动态效果图 

    2、再看实时分片数据图

    一、 确定需求方案

    1、确定产品上线部署的屏幕LED分辨率

    1280px*768px,F11全屏后占满整屏且无滚动条;其它分辨率屏幕均可自适应显示。

    2、功能模块

    • 总采集数据量
    • 当月采集数据量
    • 总门诊数
    • 当月门诊数
    • 总住院数
    • 当月住院数
    • 各医院采集数据量
    • 各医院门诊住院费用
    • 厦门市地图

    • 数据采集条数(当日)

    • 就诊人数(当日)

    3、部署方式 

    • 基于免安装可执行程序:支持Windows、Linux、Mac等各种主流操作系统;将可执行程序exe复制到服务器上即可,无需其它环境依赖;
    • 观看方式:既可在服务器上直接观看程序界面,也可远程使用浏览器打开播放,支持Chrome浏览器、360浏览器等主流浏览器。

    二、整体架构设计

    1. 前端基于Echarts开源库设计,使用WebStorm编辑器;
    2. 后端基于Python Web实现,使用Pycharm编辑器;
    3. 数据传输格式:JSON;
    4. 数据源类型:目前已支持PostgreSQL、MySQL、Oracle、Microsoft SQL Server、SQLite、Excel表格等,还可以定制HTTP API接口方式或其它类型数据库。
    5. 数据更新方式:摒弃了前端页面定时拉取的方式(这种方式带来严重的资源浪费),采用后端数据实时更新,实时推送到前端展示;

    三、编码实现 (基于篇幅及可读性考虑,此处展示部分关键代码)

    1、前端html代码 

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>数据可视化demo</title>
        <link href="../styles/common.css" rel="stylesheet">
        <script src="../scripts/Plugin/jquery-3.3.1.min.js"></script>
        <script src="../scripts/Plugin/echarts.min.js"></script>
        <script src="../scripts/Plugin/bmap.min.js"></script>
        <script src="http://api.map.baidu.com/api?v=2.0&ak=AgasQmKK2z6YZjy4w5dFPY93c6uPw7RI"></script>
        <script src="../scripts/common.js"></script>
        <script src="../scripts/index.js"></script>
        <script src="../scripts/Plugin/laydate/laydate.js"></script>
    </head>
    <body>
    <!--顶部-->
    <header class="header left">
        <div class="left nav">
            <ul>
                <li class="nav_active"><i class="nav_1"></i><a href="index.html">采集概况</a> </li>
                <li><i class="nav_2"></i><a href="quota.html">指标分析</a> </li>
                <li><i class="nav_3"></i><a href="trend.html">趋势分析</a> </li>
                <li><i class="nav_4"></i><a href="chronic.html">慢病病人列表</a> </li>
                </ul>
        </div>
        <div class="header_center left" style="position:relative">
            
            <h2><strong>厦门市某医院大数据展示案例</strong></h2>
    
        </div>
        <div class="right nav text_right">
            <ul>
    
            </ul>
        </div>
    
    </header>
    <!--内容部分-->
    <div class="con left">
        <!--数据总概-->
        <div class="con_div">
            <div class="con_div_text left">
                <div class="con_div_text01 left">
                    <img src="../images/info_1.png" class="left text01_img"/>
                    <div class="left text01_div">
                        <p>总采集数据量(G)</p>
                        <p id="t0">1235</p>
                    </div>
                </div>
                <div class="con_div_text01 right">
                    <img src="../images/info_2.png" class="left text01_img"/>
                    <div class="left text01_div">
                        <p>当月采集数据量(G)</p>
                        <p id="t1">235</p>
                    </div>
                </div>
            </div>
            <div class="con_div_text left">
                <div class="con_div_text01 left">
                    <img src="../images/info_3.png" class="left text01_img"/>
                    <div class="left text01_div">
                        <p>总门诊数(人)</p>
                        <p id="t2" class="sky">12356</p>
                    </div>
                </div>
                <div class="con_div_text01 right">
                    <img src="../images/info_4.png" class="left text01_img"/>
                    <div class="left text01_div">
                        <p>当月门诊数(人)</p>
                        <p id="t3" class="sky">12356</p>
                    </div>
                </div>
            </div>
            <div class="con_div_text left">
    
                <div class="con_div_text01 left">
                    <img src="../images/info_5.png" class="left text01_img"/>
                    <div class="left text01_div">
                        <p>总住院数(人)</p>
                        <p id="t4"  class="org">12356</p>
                    </div>
                </div>
                <div class="con_div_text01 right">
                    <img src="../images/info_6.png" class="left text01_img"/>
                    <div class="left text01_div">
                        <p>当月住院数(人)</p>
                        <p id="t5" class="org">12356</p>
                    </div>
                </div>
            </div>
        </div>
        <!--统计分析图-->
        <div class="div_any">
            <div class="left div_any01">
                <div class="div_any_child">
                    <div class="div_any_title"><img src="../images/title_1.png">各医院采集数据量</div>
                    <p id="pieChart1" class="p_chart"></p>
                </div>
                <div class="div_any_child">
                    <div class="div_any_title"><img src="../images/title_2.png">各医院门诊住院费用</div>
                    <p id="histogramChart" class="p_chart"></p>
                </div>
            </div>
            <div class="div_any02 left ">
                <div class="div_any_child div_height">
                    <div class="div_any_title any_title_width"><img src="../images/title_0.png">厦门市地图 </div>
                    <div id="mapChart" style="width:97.5%;height:95%;display: inline-block;padding-left: 1.25%;padding-top:2.2%"></div>
                </div>
            </div>
            <div class="right div_any01">
                <div class="div_any_child">
                    <div class="div_any_title"><img src="../images/title_3.png">数据采集条数(当日)</div>
                    <p id="lineChart" class="p_chart"></p>
                </div>
                <div class="div_any_child">
                    <div class="div_any_title"><img src="../images/title_4.png">就诊人数(当日)</div>
                    <p id="lineChart2" class="p_chart"></p>
                </div>
            </div>
        </div>
    
        <div id="el-dialog" class="">
            <div class="xc_layer"></div>
            <div class="popBox" id="printView">
                <div class="ttBox"><span class="tt" id="reportTitle">第一医院</span><img src="../images/close.png" style="width: 30px;float: right;cursor: pointer;" title="关闭弹窗" class="close"/></div>
                <div class="txtBox" id="el-dialog_body">
                 <div style="height:100%;width: 98%;margin-left: 1%;">
                   <div class="left div_any01" style="width: 64%;">
                       <div class="div_any_child">
                           <div class="div_any_title"><div type="text" class="demo-input" id="date1" style="display: inline-block;cursor: pointer;margin-right: 16px;"></div><img src="../images/title_4.png">门诊住院人次</div>
                           <p id="lineChart3" class="p_chart"></p>
                       </div>
                       <div class="div_any_child">
                           <div class="div_any_title"><div type="text" class="demo-input" id="date2" style="display: inline-block;cursor: pointer;margin-right: 16px;"></div><img src="../images/title_7.png">医疗费用</div>
                           <p id="lineChart4" class="p_chart"></p>
                       </div>
                   </div>
                   <div class="left div_any01"  style="width: 32%;">
                       <div class="div_any_child">
                           <div class="div_any_title"><div type="text" class="demo-input" id="date3" style="display: inline-block;cursor: pointer;margin-right: 16px;"></div><img src="../images/title_18.png">病人年龄段分布</div>
                           <p id="pieChart2" class="p_chart"></p>
                       </div>
                       <div class="div_any_child">
                           <div class="div_any_title"><div type="text" class="demo-input" id="date4" style="display: inline-block;cursor: pointer;margin-right: 16px;"></div><img src="../images/title_20.png">医疗费用组成</div>
                           <p id="pieChart3" class="p_chart"></p>
                       </div>
                   </div>
    
                 </div>
                </div>
            </div>
        </div>
    
    </div>
    <script>
        function async_data() {
            async_map_data();
            // async_chart_1();
            // async_chart_2();
            // async_chart_3();
            // async_chart_4();
            // async_chart_5();
            // async_chart_6();
    
        }
        async_data() ;
    </script>
    </body>
    </html>
    

    2、前端JS代码

    var symptomName = last_month_day();
    
    $(function(){
    
    
      init();
      init2();
        $("#el-dialog").addClass("hide");
      $(".close").click(function(event) {
        $("#el-dialog").addClass("hide");
      });
    
      var date = new Date();
         var numble = date.getDate();
         var today = getFormatMonth(new Date());
         $("#date1").html(today);
         $("#date2").html(today);
         $("#date3").html(today);
         $("#date4").html(today);
    
    
      lay('.demo-input').each(function(){
         laydate.render({
            type: 'month',
             elem: this,
             trigger: 'click',
             theme: '#95d7fb',
             calendar: true,
             showBottom: true,
             done: function () {
                console.log( $("#startDate").val())
    
             }
         })
     });
    
    })
    function init(){
      //地图
      var mapChart = echarts.init(document.getElementById('mapChart'));
      mapChart.setOption({
          bmap: {
              center: [118.104103,24.477761],
              zoom: 15,
              roam: true,
    
          },
          tooltip : {
              trigger: 'item',
              formatter:function(params, ticket, callback){
                  console.log(params)
                  return params.value[2] + ":<br>" + params.value[3]
              }
          },
          series: [{
              type: 'scatter',
              coordinateSystem: 'bmap',
              symbolSize: 20,
              data: [
                [118.096435, 24.485408, '厦门市'] ,
                [118.094564, 24.457358, '厦门第一医院'] ,
                [118.104103, 24.477761, '厦门中山医院'],
                [118.14748, 24.506295, '厦门中医院'],
                [118.254841, 24.665349, '厦门第五医院'],
               ]
          }]
      });
      mapChart.on('click', function (params) {
          $("#el-dialog").removeClass('hide');
          $("#reportTitle").html(params.value[2]);
      });
    
      var bmap = mapChart.getModel().getComponent('bmap').getBMap()
      bmap.addControl(new BMap.MapTypeControl({mapTypes: [BMAP_NORMAL_MAP,BMAP_SATELLITE_MAP ]}));
      bmap.setMapStyle({style:'midnight'})
    
    
      var pieChart1 = echarts.init(document.getElementById('pieChart1'));
      pieChart1.setOption({
    
        color:["#87cefa","#ff7f50","#32cd32","#da70d6",],
    
        legend: {
            y : '260',
            x : 'center',
            textStyle : {
                color : '#ffffff',
    
            },
             data : ['厦门第一医院','厦门中山医院','厦门中医院','厦门第五医院',],
        },
        tooltip : {
            trigger: 'item',
            formatter: "{a}<br/>{b}<br/>{c}G ({d}%)"
        },
        calculable : false,
        series : [
            {
                name:'采集数据量',
                type:'pie',
                radius : ['40%', '70%'],
                center : ['50%', '45%'],
                itemStyle : {
                    normal : {
                        label : {
                            show : false
                        },
                        labelLine : {
                            show : false
                        }
                    },
                    emphasis : {
                        label : {
                            show : true,
                            position : 'center',
                            textStyle : {
                                fontSize : '20',
                                fontWeight : 'bold'
                            }
                        }
                    }
                },
                data:[
                    {value:335, name:'厦门第一医院'},
                    {value:310, name:'厦门中山医院'},
                    {value:234, name:'厦门中医院'},
                    {value:135, name:'厦门第五医院'}
    
                ]
            }
        ]
        });
    
    
        var lineChart = echarts.init(document.getElementById('lineChart'));
        lineChart.setOption({
    
          color:["#87cefa","#ff7f50","#32cd32","#da70d6",],
          legend: {
              y : '260',
              x : 'center',
              textStyle : {
                  color : '#ffffff',
    
              },
               data : ['厦门第一医院','厦门中山医院','厦门中医院','厦门第五医院',],
          },
          calculable : false,
          tooltip : {
              trigger: 'item',
              formatter: "{a}<br/>{b}<br/>{c}条"
          },
          yAxis: [
                {
                    type: 'value',
                    axisLine : {onZero: false},
                    axisLine:{
                        lineStyle:{
                            color: '#034c6a'
                        },
                    },
    
                    axisLabel: {
                        textStyle: {
                            color: '#fff'
                        },
                        formatter: function (value) {
                            return value + "k条"
                        },
                    },
                    splitLine:{
                        lineStyle:{
                            width:0,
                            type:'solid'
                        }
                    }
                }
            ],
            xAxis: [
                {
                    type: 'category',
                    data : ['8:00','10:00','12:00','14:00','16:00','18:00','20:00','22:00'],
                    axisLine:{
                        lineStyle:{
                            color: '#034c6a'
                        },
                    },
                    splitLine: {
                        "show": false
                    },
                    axisLabel: {
                        textStyle: {
                            color: '#fff'
                        },
                        formatter: function (value) {
                            return value + ""
                        },
                    },
                    splitLine:{
                        lineStyle:{
                            width:0,
                            type:'solid'
                        }
                    },
                }
            ],
            grid:{
                    left: '5%',
                    right: '5%',
                    bottom: '20%',
                    containLabel: true
            },
            series : [
              {
                  name:'厦门第一医院',
                  type:'line',
                  smooth:true,
                  itemStyle: {
                      normal: {
                          lineStyle: {
                              shadowColor : 'rgba(0,0,0,0.4)'
                          }
                      }
                  },
                  data:[15, 0, 20, 45, 22.1, 25, 70, 55, 76]
              },
              {
                  name:'厦门中山医院',
                  type:'line',
                  smooth:true,
                  itemStyle: {
                      normal: {
                          lineStyle: {
                              shadowColor : 'rgba(0,0,0,0.4)'
                          }
                      }
                  },
                  data:[25, 10, 30, 55, 32.1, 35, 80, 65, 76]
              },
              {
                  name:'厦门中医院',
                  type:'line',
                  smooth:true,
                  itemStyle: {
                      normal: {
                          lineStyle: {
                              shadowColor : 'rgba(0,0,0,0.4)'
                          }
                      }
                  },
                  data:[35, 20, 40, 65, 42.1, 45, 90, 75, 96]
              },
              {
                  name:'厦门第五医院',
                  type:'line',
                  smooth:true,
                  itemStyle: {
                      normal: {
                          lineStyle: {
                              shadowColor : 'rgba(0,0,0,0.4)'
                          }
                      }
                  },
                  data:[45, 30, 50, 75, 52.1, 55, 100, 85, 106]
              }
          ]
        });
    
        var histogramChart = echarts.init(document.getElementById('histogramChart'));
        histogramChart.setOption({
    
          color:["#87cefa","#ff7f50","#32cd32","#da70d6",],
          legend: {
              y : '250',
              x : 'center',
              data:['厦门第一医院', '厦门中山医院','厦门中医院','厦门第五医院'],
              textStyle : {
                  color : '#ffffff',
    
              }
          },
    
          calculable :false,
    
    
          grid:{
                  left: '5%',
                  right: '5%',
                  bottom: '20%',
                  containLabel: true
          },
    
          tooltip : {
              trigger: 'axis',
              axisPointer : {
                  type : 'shadow'
              }
          },
    
          xAxis : [
              {
                  type : 'value',
                  axisLabel: {
                      show: true,
                      textStyle: {
                          color: '#fff'
                      }
                  },
                  splitLine:{
                      lineStyle:{
                          color:['#f2f2f2'],
                          width:0,
                          type:'solid'
                      }
                  }
    
              }
          ],
    
          yAxis : [
              {
                  type : 'category',
                  data:['门诊人数(人)', '住院人次(人)','人均费用(元)'],
                  axisLabel: {
                      show: true,
                      textStyle: {
                          color: '#fff'
                      }
                  },
                  splitLine:{
                      lineStyle:{
                          width:0,
                          type:'solid'
                      }
                  }
              }
          ],
    
          series : [
              {
                  name:'厦门第一医院',
                  type:'bar',
                  stack: '总量',
                  itemStyle : { normal: {label : {show: true, position: 'insideRight'}}},
                  data:[320, 302, 301]
              },
              {
                  name:'厦门中山医院',
                  type:'bar',
                  stack: '总量',
                  itemStyle : { normal: {label : {show: true, position: 'insideRight'}}},
                  data:[120, 132, 101]
              },
              {
                  name:'厦门中医院',
                  type:'bar',
                  stack: '总量',
                  itemStyle : { normal: {label : {show: true, position: 'insideRight'}}},
                  data:[220, 182, 191]
              },
              {
                  name:'厦门第五医院',
                  type:'bar',
                  stack: '总量',
                  itemStyle : { normal: {label : {show: true, position: 'insideRight'}}},
                  data:[150, 212, 201]
              }
    
          ]
       });
    
       var lineChart2 = echarts.init(document.getElementById('lineChart2'));
       lineChart2.setOption({
    
         color:["#87cefa","#ff7f50","#32cd32","#da70d6",],
         legend: {
             y : '260',
             x : 'center',
             textStyle : {
                 color : '#ffffff',
    
             },
              data : ['厦门第一医院','厦门中山医院','厦门中医院','厦门第五医院',],
         },
         calculable : false,
         tooltip : {
             trigger: 'item',
             formatter: "{a}<br/>{b}<br/>{c}条"
         },
         yAxis: [
               {
                   type: 'value',
                   axisLine : {onZero: false},
                   axisLine:{
                       lineStyle:{
                           color: '#034c6a'
                       },
                   },
    
                   axisLabel: {
                       textStyle: {
                           color: '#fff'
                       },
                       formatter: function (value) {
                           return value + "k条"
                       },
                   },
                   splitLine:{
                       lineStyle:{
                           width:0,
                           type:'solid'
                       }
                   }
               }
           ],
           xAxis: [
               {
                   type: 'category',
                   data : ['8:00','10:00','12:00','14:00','16:00','18:00'],
                   axisLine:{
                       lineStyle:{
                           color: '#034c6a'
                       },
                   },
                   splitLine: {
                       "show": false
                   },
                   axisLabel: {
                       textStyle: {
                           color: '#fff'
                       },
                       formatter: function (value) {
                           return value + ""
                       },
                   },
                   splitLine:{
                       lineStyle:{
                           width:0,
                           type:'solid'
                       }
                   },
               }
           ],
           grid:{
                   left: '5%',
                   right: '5%',
                   bottom: '20%',
                   containLabel: true
           },
           series : [
             {
                 name:'厦门第一医院',
                 type:'line',
                 smooth:true,
                 itemStyle: {
                     normal: {
                         lineStyle: {
                             shadowColor : 'rgba(0,0,0,0.4)'
                         }
                     }
                 },
                 data:[15, 0, 20, 45, 22.1, 25,].reverse()
             },
             {
                 name:'厦门中山医院',
                 type:'line',
                 smooth:true,
                 itemStyle: {
                     normal: {
                         lineStyle: {
                             shadowColor : 'rgba(0,0,0,0.4)'
                         }
                     }
                 },
                 data:[25, 10, 30, 55, 32.1, 35, ].reverse()
             },
             {
                 name:'厦门中医院',
                 type:'line',
                 smooth:true,
                 itemStyle: {
                     normal: {
                         lineStyle: {
                             shadowColor : 'rgba(0,0,0,0.4)'
                         }
                     }
                 },
                 data:[35, 20, 40, 65, 42.1, 45, ].reverse()
             },
             {
                 name:'厦门第五医院',
                 type:'line',
                 smooth:true,
                 itemStyle: {
                     normal: {
                         lineStyle: {
                             shadowColor : 'rgba(0,0,0,0.4)'
                         }
                     }
                 },
                 data:[45, 30, 50, 75, 52.1, 55, 6].reverse()
             }
         ]
       });
    
    
    
    }
    
    function init2(){
      var lineChart3 = echarts.init(document.getElementById('lineChart3'));
      lineChart3.setOption({
    
        color:["#87cefa","#ff7f50",],
        legend: {
            y : 'top',
            x : 'center',
            textStyle : {
                color : '#ffffff',
    
            },
             data : ['门诊人次','住院人次'],
        },
        calculable : false,
        tooltip : {
            trigger: 'item',
            formatter: "{a}<br/>{b}<br/>{c}人"
        },
        dataZoom: {
             show: true,
             realtime : true,
             start: 0,
             end: 18,
             height: 20,
             backgroundColor: '#f8f8f8',
             dataBackgroundColor: '#e4e4e4',
             fillerColor: '#87cefa',
             handleColor: '#87cefa',
         },
        yAxis: [
              {
                  type: 'value',
                  axisLine : {onZero: false},
                  axisLine:{
                      lineStyle:{
                          color: '#034c6a'
                      },
                  },
    
                  axisLabel: {
                      textStyle: {
                          color: '#fff'
                      },
                      formatter: function (value) {
                          return value + "人"
                      },
                  },
                  splitLine:{
                      lineStyle:{
                          width:0,
                          type:'solid'
                      }
                  }
              }
          ],
          xAxis: [
              {
                  type: 'category',
                  data : symptomName,
                  boundaryGap : false,
                  axisLine:{
                      lineStyle:{
                          color: '#034c6a'
                      },
                  },
                  splitLine: {
                      "show": false
                  },
                  axisLabel: {
                      textStyle: {
                          color: '#fff'
                      },
                      formatter: function (value) {
                          return value + ""
                      },
                  },
                  splitLine:{
                      lineStyle:{
                          width:0,
                          type:'solid'
                      }
                  },
              }
          ],
          grid:{
                  left: '5%',
                  right: '5%',
                  bottom: '20%',
                  containLabel: true
          },
          series : [
            {
                name:'门诊费用',
                type:'line',
                smooth:true,
                itemStyle: {
                    normal: {
                        lineStyle: {
                            shadowColor : 'rgba(0,0,0,0.4)'
                        }
                    }
                },
                data:[1150, 180, 2100, 2415, 1212.1, 3125,1510, 810, 2100, 2415, 1122.1, 3215,1510, 801, 2001, 2245, 1232.1, 3245,1520, 830, 2200, 2145, 1223.1, 3225,150, 80, 200, 245, 122.1, 325]
            },
            {
                name:'住院费用',
                type:'line',
                smooth:true,
                itemStyle: {
                    normal: {
                        lineStyle: {
                            shadowColor : 'rgba(0,0,0,0.4)'
                        }
                    }
                },
                data:[2500, 1000, 3000, 5005, 3200.1, 3005, 2500, 1000, 3000, 5005, 3200.1, 3005,2500, 1000, 3000, 5005, 3200.1, 3005,2500, 1000, 3000, 5005, 3200.1, 3005, 2500, 1000, 3000, 5005, 3200.1, 3005,2500, 1000, 3000, 5005, 3200.1, 3005,]
            },
        ]
      });
    
    
      var lineChart4 = echarts.init(document.getElementById('lineChart4'));
      lineChart4.setOption({
    
        color:["#87cefa","#ff7f50",],
        calculable : false,
        tooltip : {
            trigger: 'item',
            formatter: "{a}<br/>{b}<br/>{c}元"
        },
        dataZoom: {
             show: true,
             realtime : true,
             start: 0,
             end: 18,
             height: 20,
             backgroundColor: '#f8f8f8',
             dataBackgroundColor: '#e4e4e4',
             fillerColor: '#87cefa',
             handleColor: '#87cefa',
         },
        yAxis: [
              {
                  type: 'value',
                  axisLine : {onZero: false},
                  axisLine:{
                      lineStyle:{
                          color: '#034c6a'
                      },
                  },
    
                  axisLabel: {
                      textStyle: {
                          color: '#fff'
                      },
                      formatter: function (value) {
                          return value + "元"
                      },
                  },
                  splitLine:{
                      lineStyle:{
                          width:0,
                          type:'solid'
                      }
                  }
              }
          ],
          xAxis: [
              {
                  type: 'category',
                  data : symptomName,
                  boundaryGap : false,
                  axisLine:{
                      lineStyle:{
                          color: '#034c6a'
                      },
                  },
                  splitLine: {
                      "show": false
                  },
                  axisLabel: {
                      textStyle: {
                          color: '#fff'
                      },
                      formatter: function (value) {
                          return value + ""
                      },
                  },
                  splitLine:{
                      lineStyle:{
                          width:0,
                          type:'solid'
                      }
                  },
              }
          ],
          grid:{
                  left: '5%',
                  right: '5%',
                  bottom: '20%',
                  containLabel: true
          },
          series : [
            {
                name:'医疗费用',
                type:'line',
                smooth:true,
                itemStyle: {
                    normal: {
                        lineStyle: {
                            shadowColor : 'rgba(0,0,0,0.4)'
                        }
                    }
                },
                data:[1500, 800, 1200, 2450, 1122.1, 1325,1150, 180, 1200, 1245, 1122.1, 1325,150, 180, 1200, 2145, 1212.1, 3215,1510, 180, 2100, 2415, 122.1, 325,150, 80, 200, 245, 122.1, 325].reverse()
            },
        ]
      });
    
      //年龄分布
      var pieChart2 = echarts.init(document.getElementById('pieChart2'));
      pieChart2.setOption({
        color:["#32cd32","#ff7f50","#87cefa","#FD6C88","#4b5cc4","#faff72"],
        tooltip : {
         trigger: 'item',
         formatter: "{a}<br/>{b}<br/>{c}人"
        },
        calculable : true,
        series : [
            {
                name:'发病人数',
                type:'pie',
                radius : [30, 110],
                center : ['50%', '50%'],
                roseType : 'area',
                x: '50%',
    
    
    
                sort : 'ascending',
                data:[
                    {value:10, name:'婴儿(1-3岁)'},
                    {value:5, name:'少儿(4-10岁)'},
                    {value:15, name:'少年(10-18岁)'},
                    {value:25, name:'青年(18-45岁)'},
                    {value:125, name:'中年(45-60岁)'},
                    {value:175, name:'老年(60岁以上)'},
                ]
            }
        ]
      })
    
      //医疗费用组成
      var pieChart3 = echarts.init(document.getElementById('pieChart3'));
      pieChart3.setOption({
        color:["#32cd32","#ff7f50","#87cefa","#FD6C88","#4b5cc4","#faff72"],
        tooltip : {
         trigger: 'item',
         formatter: "{a}<br/>{b}<br/>{c}元"
        },
        calculable : true,
        series : [
            {
                name:'发病人数',
                type:'pie',
                radius : [30, 110],
                center : ['50%', '50%'],
                roseType : 'area',
                x: '50%',
    
    
    
                sort : 'ascending',
                data:[
                    {value:10, name:'诊察费用'},
                    {value:500, name:'检查费用'},
                    {value:150, name:'检验费用'},
                    {value:250, name:'西药费用'},
                    {value:125, name:'中药费用'},
                    {value:1750, name:'手术费用'},
                ]
            }
        ]
      })
    }
    
    
    var chartMapElementId = 'mapChart';
    // var chartMapElement = document.getElementById(chartMapElementId); 这种有问题,不显示图
    //相对路径,页面的当前目录
    // var jsonFileName = 'json/map.json';
    
    //绝对路径,根目录
    var jsonFileName = '/json/map.json';
    var jsonFileNamechart_1 = '/json/chart_1.json';
    var jsonFileNamechart_2 = '/json/chart_2.json';
    
    function get_legend(data) {
        var listLegend = new Array();
    
        for (i=0; i<data.length; i++) {
            n = data[i]["name"];
            listLegend.push(n);
        }
        console.log("get_legend", listLegend);
        return listLegend
    }
    
    function get_value(data) {
        var listLegend = new Array();
        var listValue = new Array();
        for (i=0; i<data.length; i++) {
            n = data[i][2];
            v = data[i][3];
            tmp = {"name": n, "value": v};
            listLegend.push(n);
            listValue.push(tmp);
        }
        console.log("get_value", listLegend, listValue);
        return [listLegend, listValue]
    }
    
    function get_value2(data) {
        var listLegend = new Array();
        var listValue = new Array();
        for (i=0; i<data.length; i++) {
            n = data[i][2];
            v = [data[i][3], data[i][4], data[i][5]];
            tmp = {"name": n, "data": v};
            listLegend.push(n);
            listValue.push(tmp);
        }
        console.log("get_value2", listLegend, listValue);
        return [listLegend, listValue]
    }
    
    
    function get_value3(data) {
        var listLegend = new Array();
        var listValue = new Array();
        for (i=0; i<data.length; i++) {
            n = data[i][2];
            v = [data[i][3], data[i][4], data[i][5], data[i][3], data[i][4], data[i][5], data[i][3], data[i][4], data[i][5]];
            tmp = {"name": n, "data": v};
            listLegend.push(n);
            listValue.push(tmp);
        }
        console.log("get_value3", listLegend, listValue);
        return [listLegend, listValue]
    }
    
    
    function async_map_data() {
    
        // 异步加载数据
        $.getJSON(jsonFileName).done(function (data) {
            // 1
            var chartMapElement = document.getElementById(chartMapElementId);
            console.log(chartMapElementId, "async_data")
            var myChart = echarts.init(chartMapElement);
            console.log(data)
            myChart.setOption({
                series: [{
                    data: data
                }]
            });
    
            // 2
            var pieChart1Element = document.getElementById("pieChart1");
            var pieChart1 = echarts.init(pieChart1Element);
            rs = get_value(data);
            console.log(rs);
            pieChart1.setOption({
                legend: {
                    data: rs[0]
                },
                series: [{
                    data: rs[1]
                }]
            })
    
            //3
            var histogramChartElement = document.getElementById('histogramChart');
            var histogramChart = echarts.init(histogramChartElement);
            rs = get_value2(data);
            console.log(rs);
            histogramChart.setOption({
                legend: {
                    data: rs[0]
                },
                series: rs[1]
            })
            // 4
            var lineChart = echarts.init(document.getElementById('lineChart'));
            rs = get_value3(data);
            lineChart.setOption({
                legend: {
                    data: rs[0]
                },
                series: rs[1]
            })
    
            // end
        });//end $.getJSON
    
        // 异步加载数据
        $.getJSON(jsonFileNamechart_1).done(function (data) {
            console.log(data);
    
            var lineChart2 = echarts.init(document.getElementById('lineChart2'));
            lineChart2.setOption({
                legend: {
                    data: get_legend(data)
                },
                series: data
            })
        });//end $.getJSON
    
        $.getJSON(jsonFileNamechart_2).done(function (data) {
            t0 = document.getElementById('t0');
            t0.innerText = data[0];
    
            t1 = document.getElementById('t1');
            t1.innerText = data[1];
    
            t2 = document.getElementById('t2');
            t2.innerText = data[2];
    
            t3 = document.getElementById('t3');
            t3.innerText = data[3];
    
            t4 = document.getElementById('t4');
            t4.innerText = data[4];
    
            t5 = document.getElementById('t5');
            t5.innerText = data[5];
        });//end $.getJSON
    
    }

    3、后端python代码

    # -*- coding:utf-8 -*-
    
    import io
    import os
    import shutil
    import sys
    import urllib
    import json
    from http.server import HTTPServer, SimpleHTTPRequestHandler, ThreadingHTTPServer
    
    ip = "localhost"   # 监听IP,配置项
    port = 8811       # 监听端口,配置项
    index_url = "http://%s:%d/views/index.html" %(ip, port)  # 监听主页url,配置项
    
    # C:\Users\zll\AppData\Local\python  缓存目录,shit
    
    class MyRequestHandler(SimpleHTTPRequestHandler):
        protocol_version = "HTTP/1.0"
        server_version = "PSHS/0.1"
        sys_version = "Python/3.7.x"
        target = "./"  # 监听目录,配置项
    
        def do_GET(self):
            if self.path.find("/json/") > 0:
                print(self.path)
                req = {"success": "true"}
                self.send_response(200)
                self.send_header("Content-type", "json")
                self.end_headers()
                with open(self.path, 'r', encoding="utf-8") as f:
                    data = json.load(f)
                    rspstr = json.dumps(data)
                    self.wfile.write(rspstr.encode("utf-8"))
    
            else:
                SimpleHTTPRequestHandler.do_GET(self);
    
        def do_POST(self):
            if self.path == "/signin":
                print("postmsg recv, path right")
            else:
                print("postmsg recv, path error")
                data = self.rfile.read(int(self.headers["content-length"]))
                data = json.loads(data)
                self.send_response(200)
                self.send_header("Content-type", "text/html")
                self.end_headers()
                rspstr = "recv ok, data = "
                rspstr += json.dumps(data, ensure_ascii=False)
                self.wfile.write(rspstr.encode("utf-8"))
    
    def del_dir(filepath):
        """
        删除某一目录下的所有文件或文件夹
        :param filepath: 路径
        :return:
        """
        del_list = os.listdir(filepath)
        for f in del_list:
            file_path = os.path.join(filepath, f)
            if os.path.isfile(file_path):
                os.remove(file_path)
            elif os.path.isdir(file_path):
                shutil.rmtree(file_path)
    
    def HttpServer():
        try:
            cache = "C:/Users/zll/AppData/Local/python/cache"
            del_dir(cache)
            server = HTTPServer((ip, port), MyRequestHandler)
            print("服务器监听地址: ", index_url)
            server.serve_forever()
        except KeyboardInterrupt:
            server.socket.close()
    

    四、上线运行

    五、源码下载

    【源码】数据可视化:基于Echarts+Python实现的动态实时大屏范例4-医院大屏.zip_python做大屏数据可视化-管理软件文档类资源-CSDN下载

    注:源码包括python的webserver + json数据源码 + echarts

    启动命令:打开cmd命令行,切换到案例根目录,运行 python httpserver.py

    感谢:本项目引用了互联网大牛的前端代码,然后定制开发实现了后端服务器,最终实现了可视化大屏的完整方案。

    精彩案例汇总

    YYDatav的数据可视化《精彩案例汇总》_YYDataV的博客-CSDN博客

    本次分享结束,欢迎讨论!QQ微信同号: 6550523

    展开全文
  • python 一个动态可视化交互大屏

    千次阅读 多人点赞 2020-06-08 17:11:00
    你可能经常会在公司前台、展会、路演时看到可视化数据的交互大屏。今天我们就来用 python 一个动态可视化的交互大屏图。一、项目背景随着科技的飞速发展,数据呈现爆发式的增长,任何人都摆...

    你可能经常会在公司前台、展会、路演时看到可视化数据的交互大屏。今天我们就来用 python 做一个动态可视化的交互大屏图。

    一、项目背景

    随着科技的飞速发展,数据呈现爆发式的增长,任何人都摆脱不了与数据打交道,社会对于“数据”方面的人才需求也在不断增大。因此了解当下企业究竟需要招聘什么样的人才?需要什么样的技能?不管是对于在校生,还是对于求职者来说,都显得很有必要。

    本文基于这个问题,针对51job招聘网站,爬取了全国范围内大数据、数据分析、数据挖掘、机器学习、人工智能等相关岗位的招聘信息。

    分析比较了不同岗位的薪资、学历要求;分析比较了不同区域、行业对相关人才的需求情况;分析比较了不同岗位的知识、技能要求等。

    二、效果展示

    本次数据分析的特点在于:使用Tableau将数据分析的结果做成 可视化交互大屏,效果如下:

    三、爬取数据

    基于51job招聘网站,我们搜索全国对于“数据”岗位的需求,大概有2000页。

    1. 爬取岗位:大数据、数据分析、机器学习、人工智能等相关岗位。

    2. 爬取字段:公司名、岗位名、工作地址、薪资、发布时间、工作描述、公司类型、员工人数、所属行业。

    我们爬取的字段,既有一级页面的相关信息,还有二级页面的部分信息,大概爬取思路为:先针对某一页数据的一级页面做一个解析,然后再进行二级页面做一个解析,最后再进行翻页操作

    使用工具:Python+requests+lxml+pandas+time+Xpath

    1.导入相关库

    import requests
    import pandas as pd
    from pprint import pprint
    from lxml import etree
    import time
    import warnings
    warnings.filterwarnings("ignore")
    

    2.关于翻页的说明

    # 第一页的特点
    https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE,2,1.html?
    # 第二页的特点
    https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE,2,2.html?
    # 第三页的特点
    https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE,2,3.html?
    

    注意:通过对于页面的观察,可以看出,就一个地方的数字变化了,因此只需要做字符串拼接,然后循环爬取即可。

    3.完整的爬取代码

    import requests
    import pandas as pd
    from pprint import pprint
    from lxml import etree
    import time
    import warnings
    warnings.filterwarnings("ignore")
    
    for i in range(1,1501):
        print("正在爬取第" + str(i) + "页的数据")
        url_pre = "https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE,2,"
        url_end = ".html?"
        url = url_pre + str(i) + url_end
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
        }
        web = requests.get(url, headers=headers)
        web.encoding = "gbk"
        dom = etree.HTML(web.text)
        # 1、岗位名称
        job_name = dom.xpath('//div[@class="dw_table"]/div[@class="el"]//p/span/a[@target="_blank"]/@title')
        # 2、公司名称
        company_name = dom.xpath('//div[@class="dw_table"]/div[@class="el"]/span[@class="t2"]/a[@target="_blank"]/@title')
        # 3、工作地点
        address = dom.xpath('//div[@class="dw_table"]/div[@class="el"]/span[@class="t3"]/text()')
        # 4、工资
        salary_mid = dom.xpath('//div[@class="dw_table"]/div[@class="el"]/span[@class="t4"]')
        salary = [i.text for i in salary_mid]
        # 5、发布日期
        release_time = dom.xpath('//div[@class="dw_table"]/div[@class="el"]/span[@class="t5"]/text()')
        # 6、获取二级网址url
        deep_url = dom.xpath('//div[@class="dw_table"]/div[@class="el"]//p/span/a[@target="_blank"]/@href')
        RandomAll = []
        JobDescribe = []
        CompanyType = []
        CompanySize = []
        Industry = []
        for i in range(len(deep_url)):
            web_test = requests.get(deep_url[i], headers=headers)
            web_test.encoding = "gbk"
            dom_test = etree.HTML(web_test.text)
            # 7、爬取经验、学历信息,先合在一个字段里面,以后再做数据清洗。命名为random_all
            random_all = dom_test.xpath('//div[@class="tHeader tHjob"]//div[@class="cn"]/p[@class="msg ltype"]/text()')
            # 8、岗位描述性息
            job_describe = dom_test.xpath('//div[@class="tBorderTop_box"]//div[@class="bmsg job_msg inbox"]/p/text()')
            # 9、公司类型
            company_type = dom_test.xpath('//div[@class="tCompany_sidebar"]//div[@class="com_tag"]/p[1]/@title')
            # 10、公司规模(人数)
            company_size = dom_test.xpath('//div[@class="tCompany_sidebar"]//div[@class="com_tag"]/p[2]/@title')
            # 11、所属行业(公司)
            industry = dom_test.xpath('//div[@class="tCompany_sidebar"]//div[@class="com_tag"]/p[3]/@title')
            # 将上述信息保存到各自的列表中
            RandomAll.append(random_all)
            JobDescribe.append(job_describe)
            CompanyType.append(company_type)
            CompanySize.append(company_size)
            Industry.append(industry)
            # 为了反爬,设置睡眠时间
            time.sleep(1)
        # 由于我们需要爬取很多页,为了防止最后一次性保存所有数据出现的错误,因此,我们每获取一夜的数据,就进行一次数据存取。
        df = pd.DataFrame()
        df["岗位名称"] = job_name
        df["公司名称"] = company_name
        df["工作地点"] = address
        df["工资"] = salary
        df["发布日期"] = release_time
        df["经验、学历"] = RandomAll
        df["公司类型"] = CompanyType
        df["公司规模"] = CompanySize
        df["所属行业"] = Industry
        df["岗位描述"] = JobDescribe
        # 这里在写出过程中,有可能会写入失败,为了解决这个问题,我们使用异常处理。
        try:
            df.to_csv("job_info.csv", mode="a+", header=None, index=None, encoding="gbk")
        except:
            print("当页数据写入失败")
        time.sleep(1)
    print("数据爬取完毕,是不是很开心!!!")
    

    这里可以看到,我们爬取了1000多页的数据做最终的分析。因此每爬取一页的数据,做一次数据存储,避免最终一次性存储导致失败。同时根据自己的测试,有一些页数进行数据存储,会导致失败,为了不影响后面代码的执行,我们使用了“try-except”异常处理。

    在一级页面中,我们爬取了“岗位名称”,“公司名称”,“工作地点”,“工资”,“发布日期”,“二级网址的url”这几个字段。

    在二级页面中,我们爬取了“经验、学历信息”,“岗位描述”,“公司类型”,“公司规模”,“所属行业”这几个字段。

    四、数据预处理

    从爬取到的数据中截取部分做了一个展示,可以看出数据很乱。

    杂乱的数据并不利于我们的分析,因此需要根据研究的目标做一个数据预处理,得到我们最终可以用来做可视化展示的数据。

    1.相关库的导入及数据的读取

    df = pd.read_csv(r"G:\8泰迪\python_project\51_job\job_info1.csv",engine="python",header=None)
    # 为数据框指定行索引
    df.index = range(len(df))
    # 为数据框指定列索引
    df.columns = ["岗位名","公司名","工作地点","工资","发布日期","经验与学历","公司类型","公司规模","行业","工作描述"]
    

    2.数据去重

    我们认为一个公司的公司名和和发布的岗位名一致,就看作是重复值。因此,使用drop_duplicates(subset=[])函数,基于“岗位名”和“公司名”做一个重复值的剔除。

    # 去重之前的记录数
    print("去重之前的记录数",df.shape)
    # 记录去重
    df.drop_duplicates(subset=["公司名","岗位名"],inplace=True)
    # 去重之后的记录数
    print("去重之后的记录数",df.shape)
    

    3.岗位名字段的处理

    1)岗位名字段的探索

    df["岗位名"].value_counts()
    df["岗位名"] = df["岗位名"].apply(lambda x:x.lower())
    

    首先我们对每个岗位出现的频次做一个统计,可以看出“岗位名字段”太杂乱,不便于我们做统计分析。接着我们将岗位名中的大写英文字母统一转换为小写字母,也就是说“AI”和“Ai”属于同一个东西。

    2)构造想要分析的目标岗位,做一个数据筛选

    job_info.shape
    target_job = ['算法', '开发', '分析', '工程师', '数据', '运营', '运维']
    index = [df["岗位名"].str.count(i) for i in target_job]
    index = np.array(index).sum(axis=0) > 0
    job_info = df[index]
    job_info.shape
    

    首先我们构造了如上七个目标岗位的关键字眼。然后利用count()函数统计每一条记录中,是否包含这七个关键字眼,如果包含就保留这个字段;不过不包含就删除这个字段,最后查看筛选之后还剩余多少条记录。

    3)目标岗位标准化处理

    由于目标岗位太杂乱,我们需要统一一下

    job_list = ['数据分析', "数据统计","数据专员",'数据挖掘', '算法',
                '大数据','开发工程师', '运营', '软件工程', '前端开发',
                '深度学习', 'ai', '数据库', '数据库', '数据产品',
                '客服', 'java', '.net', 'andrio', '人工智能', 'c++',
                '数据管理',"测试","运维"]
    job_list = np.array(job_list)
    def rename(x=None,job_list=job_list):
        index = [i in x for i in job_list]
        if sum(index) > 0:
            return job_list[index][0]
        else:
            return x
    job_info["岗位名"] = job_info["岗位名"].apply(rename)
    job_info["岗位名"].value_counts()
    # 数据统计、数据专员、数据分析统一归为数据分析
    job_info["岗位名"] = job_info["岗位名"].apply(lambda x:re.sub("数据专员","数据分析",x))
    job_info["岗位名"] = job_info["岗位名"].apply(lambda x:re.sub("数据统计","数据分析",x))
    

    首先我们定义了一个想要替换的目标岗位job_list,将其转换为ndarray数组。然后定义一个函数,如果某条记录包含job_list数组中的某个关键词,那么就将该条记录替换为这个关键词,如果某条记录包含job_list数组中的多个关键词,我们只取第一个关键词替换该条记录。接着使用value_counts()函数统计一下替换后的各岗位的频次。最后,我们将“数据专员”、“数据统计”统一归为“数据分析”。

    4.工资水平字段的处理

    工资水平字段的数据类似于“20-30万/年”、“2.5-3万/月”和“3.5-4.5千/月”这样的格式。我们需要做一个统一的变化,将数据格式转换为“元/月”,然后取出这两个数字,求一个平均值。

    job_info["工资"].str[-1].value_counts()
    job_info["工资"].str[-3].value_counts()
    
    index1 = job_info["工资"].str[-1].isin(["年","月"])
    index2 = job_info["工资"].str[-3].isin(["万","千"])
    job_info = job_info[index1 & index2]
    
    def get_money_max_min(x):
        try:
            if x[-3] == "万":
                z = [float(i)*10000 for i in re.findall("[0-9]+\.?[0-9]*",x)]
            elif x[-3] == "千":
                z = [float(i) * 1000 for i in re.findall("[0-9]+\.?[0-9]*", x)]
            if x[-1] == "年":
                z = [i/12 for i in z]
            return z
        except:
            return x
    
    salary = job_info["工资"].apply(get_money_max_min)
    job_info["最低工资"] = salary.str[0]
    job_info["最高工资"] = salary.str[1]
    job_info["工资水平"] = job_info[["最低工资","最高工资"]].mean(axis=1)
    

    首先我们做了一个数据筛选,针对于每一条记录,如果最后一个字在“年”和“月”中,同时第三个字在“万”和“千”中,那么就保留这条记录,否则就删除。接着定义了一个函数,将格式统一转换为“元/月”。最后将最低工资和最高工资求平均值,得到最终的“工资水平”字段。

    5.工作地点字段的处理

    由于整个数据是关于全国的数据,涉及到的城市也是特别多。我们需要自定义一个常用的目标工作地点字段,对数据做一个统一处理。

    #job_info["工作地点"].value_counts()
    address_list = ['北京', '上海', '广州', '深圳', '杭州', '苏州', '长沙',
                    '武汉', '天津', '成都', '西安', '东莞', '合肥', '佛山',
                    '宁波', '南京', '重庆', '长春', '郑州', '常州', '福州',
                    '沈阳', '济南', '宁波', '厦门', '贵州', '珠海', '青岛',
                    '中山', '大连','昆山',"惠州","哈尔滨","昆明","南昌","无锡"]
    address_list = np.array(address_list)
    
    def rename(x=None,address_list=address_list):
        index = [i in x for i in address_list]
        if sum(index) > 0:
            return address_list[index][0]
        else:
            return x
    job_info["工作地点"] = job_info["工作地点"].apply(rename)
    

    首先我们定义了一个目标工作地点列表,将其转换为ndarray数组。接着定义了一个函数,将原始工作地点记录,替换为目标工作地点中的城市。

    6.公司类型字段的处理

    这个很容易,就不详细说明了。

    job_info.loc[job_info["公司类型"].apply(lambda x:len(x)<6),"公司类型"] = np.nan
    job_info["公司类型"] = job_info["公司类型"].str[2:-2]
    

    7.行业字段的处理

    每个公司的行业字段可能会有多个行业标签,但是我们默认以第一个作为该公司的行业标签。

    # job_info["行业"].value_counts()
    job_info["行业"] = job_info["行业"].apply(lambda x:re.sub(",","/",x))
    job_info.loc[job_info["行业"].apply(lambda x:len(x)<6),"行业"] = np.nan
    job_info["行业"] = job_info["行业"].str[2:-2].str.split("/").str[0]
    

    8.经验与学历字段的处理

    关于这个字段的数据处理,我很是思考了一会儿,不太好叙述,放上代码自己下去体会。

    job_info["学历"] = job_info["经验与学历"].apply(lambda x:re.findall("本科|大专|应届生|在校生|硕士",x))
    def func(x):
        if len(x) == 0:
            return np.nan
        elif len(x) == 1 or len(x) == 2:
            return x[0]
        else:
            return x[2]
    job_info["学历"] = job_info["学历"].apply(func)
    

    9.工作描述字段的处理

    对于每一行记录,我们去除停用词以后,做一个jieba分词。

    with open(r"G:\8泰迪\python_project\51_job\stopword.txt","r") as f:
        stopword = f.read()
    stopword = stopword.split()
    stopword = stopword + ["任职","职位"," "]
    
    job_info["工作描述"] = job_info["工作描述"].str[2:-2].apply(lambda x:x.lower()).apply(lambda x:"".join(x))\
        .apply(jieba.lcut).apply(lambda x:[i for i in x if i not in stopword])
    job_info.loc[job_info["工作描述"].apply(lambda x:len(x) < 6),"工作描述"] = np.nan
    

    10.公司规模字段的处理

    #job_info["公司规模"].value_counts()
    def func(x):
        if x == "['少于50人']":
            return "<50"
        elif x == "['50-150人']":
            return "50-150"
        elif x == "['150-500人']":
            return '150-500'
        elif x == "['500-1000人']":
            return '500-1000'
        elif x == "['1000-5000人']":
            return '1000-5000'
        elif x == "['5000-10000人']":
            return '5000-10000'
        elif x == "['10000人以上']":
            return ">10000"
        else:
            return np.nan
    job_info["公司规模"] = job_info["公司规模"].apply(func)
    

    11.构造新数据

    我们针对最终清洗干净的数据,选取需要分析的字段,做一个数据存储。

    feature = ["公司名","岗位名","工作地点","工资水平","发布日期","学历","公司类型","公司规模","行业","工作描述"]
    final_df = job_info[feature]
    final_df.to_excel(r"G:\8泰迪\python_project\51_job\词云图.xlsx",encoding="gbk",index=None)
    

    五、字段的特殊处理

    由于我们之后需要针对不同的岗位名做不同的词云图处理,并且是在tableau中做可视化展示,因此我们需要按照岗位名分类,求出不同岗位下各关键词的词频统计。

    import numpy as np
    import pandas as pd
    import re
    import jieba
    import warnings
    warnings.filterwarnings("ignore")
    
    df = pd.read_excel(r"G:\8泰迪\python_project\51_job\new_job_info1.xlsx",encoding="gbk")
    df
    
    def get_word_cloud(data=None, job_name=None):
        words = []
        describe = data['工作描述'][data['岗位名'] == job_name].str[1:-1]
        describe.dropna(inplace=True)
        [words.extend(i.split(',')) for i in describe]
        words = pd.Series(words)
        word_fre = words.value_counts()
        return word_fre
    
    zz = ['数据分析', '算法', '大数据','开发工程师', '运营', '软件工程','运维', '数据库','java',"测试"]
    for i in zz:
        word_fre = get_word_cloud(data=df, job_name='{}'.format(i))
        word_fre = word_fre[1:].reset_index()[:100]
        word_fre["岗位名"] = pd.Series("{}".format(i),index=range(len(word_fre)))
        word_fre.to_csv(r"G:\8泰迪\python_project\51_job\词云图\bb.csv", mode='a',index=False, header=None,encoding="gbk")
    

    六、tableau可视化展示

    1. 热门城市的用人需求TOP10

    2. 热门城市的岗位数量TOP10

    3. 不同工作地点岗位数量的气泡图

    4. 热门岗位的薪资待遇

    5. 热门行业的薪资待遇

    6. 可视化大屏的“动态”展示

    这里最终就不做结论分析了,因为结论通过上图,就可以很清晰的看出来。想学习实践的同学可以下载源码自己分析哦!

    源码链接:

    https://pan.baidu.com/s/1ZF_r8FKGeYxalqvz25IQwA 

    提取码:hbix

    作者:黄伟呢 

    来源:凹凸数据

    不同的是,print和pprint是python的内置模块,而 beeprint 需要额外安装。

      延伸阅读  

    Python:

    ☞ 这是我看过的最好的Python零基础Pandas教程(可下载)

    ☞ 我用 pyhton 做了款可开淘宝店赚钱的工具

    ☞ 一个超有意思的 Python 综合能力测试网站

    技能GET:

    ☞ 立刻、马上对你的电脑做这三件事!

    ☞ 专为技术人员打造的搜索引擎,提升n倍搜索效率!

    ☞ 一个聚合全网热点信息的神网站

    展开全文
  • 现在制作可视化大屏的方法我遇见的主要有两种:一是使用Python flask+ajax+ECharts绘图库,二就是使用tableau。当然使用power bi和fine bi的话应该也是可以绘制的,感兴趣的小伙伴可以尝试一下。 第一种方法的话:在...
  • Python数据可视化大屏最全教程(全)

    千次阅读 多人点赞 2021-06-25 00:53:26
    适用人群:Python初学者,数据分析师,或有志从事数据分析工作的人员。 准备软件:Anaconda(Spyder:代码编译)、Navicat Premium 12(数据库)。 从事IT项目管理这么多年,基本上已经遗弃编程技能,但从2019年...
    阅读本文大约需要3分钟

    主要内容:数据分析。

    适用人群:Python初学者,数据分析师,或有志从事数据分析工作的人员。

    准备软件:Anaconda(Spyder:代码编译)、Navicat Premium 12(数据库)。

    从事IT项目管理这么多年,基本上已经遗弃编程技能,但从2019年开始接触Python,深深地迷上了这门语言,像硬件集成、数据分析,我都会用python来写。晓风想通过本文,让初学者们学会以下内容:

    1、Pyecharts图表;

    2、连接数据库;

    3、大屏看板-监控中心。

    今天,我们讲:3、大屏看板如何布局

    首先,我们自己先拟个大屏的草稿(如上图),把大屏分割成8个部分(Part0-7)。

    大屏内容设计好后,接上文,我们把图表的函数都用代码写出来

    from pyecharts import options as opts
    from pyecharts.charts import Bar,Gauge,Pie,Page,Funnel,Geo,Scatter3D
    import random
    
    
    def bar(): #柱状图
        cate = ['1月', '2月', '3月', '4月', '5月', '6月']
        c = (      
             Bar()
                .add_xaxis(cate)
                .add_yaxis("订单数", [random.randint(100, 200) for _ in cate])
                .add_yaxis("完成数", [random.randint(50, 100) for _ in cate])
                .set_series_opts(
                                 label_opts=opts.LabelOpts(is_show=True,color="#2CB34A")
                                 
                )
                .set_global_opts(title_opts=opts.TitleOpts(title="2021年订单推移图",
                                                           title_textstyle_opts=opts.TextStyleOpts(color="#2CB34A"),
                                                           pos_left="5%"),
                                 legend_opts=opts.LegendOpts(textstyle_opts=opts.TextStyleOpts(color="#2CB34A")),
                                 xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color="#2CB34A")),
                                 yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color="#2CB34A"))
                                                         
                )
                .set_colors(["blue", "green"])
                #.render("bar_stack0.html")
        )
        return c
    
    
    def tab0(name,color): #标题
        c = (Pie().
            set_global_opts(
            title_opts=opts.TitleOpts(title=name,pos_left='center',pos_top='center',
                                    title_textstyle_opts=opts.TextStyleOpts(color=color,font_size=20))))
        return c
    
    
    def tab1(name,color): #标题
        c = (Pie().
            set_global_opts(
            title_opts=opts.TitleOpts(title=name,pos_left='center',pos_top='center',
                                    title_textstyle_opts=opts.TextStyleOpts(color=color,font_size=25))))
        return c
    
    
    def gau():#仪表图
        c = (
            Gauge(init_opts=opts.InitOpts(width="400px", height="400px"))
                .add(series_name="库位利用率", data_pair=[["", 90]])
                .set_global_opts(
                legend_opts=opts.LegendOpts(is_show=False),
                tooltip_opts=opts.TooltipOpts(is_show=True, formatter="{a} <br/>{b} : {c}%"),
                
            )
                #.render("gauge.html")
        )
        return c
    
    
    def radius():
        cate = ['客户A', '客户B', '客户C', '客户D', '客户E', '其他客户']
        data = [153, 124, 107, 99, 89, 46]
        c=Pie()
        c.add('', [list(z) for z in zip(cate, data)],
                radius=["30%", "75%"],
                rosetype="radius")
        c.set_global_opts(title_opts=opts.TitleOpts(title="客户销售额占比", padding=[1,250],title_textstyle_opts=opts.TextStyleOpts(color="#FFFFFF")),
                          legend_opts=opts.LegendOpts(textstyle_opts=opts.TextStyleOpts(color="#FFFFFF"),type_="scroll",orient="vertical",pos_right="5%",pos_top="middle")
                          )
        c.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
        c.set_colors(['red',"orange", "yellow", "green", "Cyan", "purple"])
        
        return c
    
    
    def funnel():
        cate = ['访问', '注册', '加入购物车', '提交订单', '付款成功']
        data = [30398, 15230, 10045, 8109, 5698]
        c = Funnel()
        c.add("用户数", [list(z) for z in zip(cate, data)], 
                   sort_='ascending',
                   label_opts=opts.LabelOpts(position="inside"))
        c.set_global_opts(title_opts=opts.TitleOpts(title=""))
    
    
        return c
    
    
    def geo():
        city_num = [('武汉',105),('成都',70),('北京',99),
                ('西安',80),('杭州',60),('贵阳',34),
                ('上海',65),('深圳',54),('乌鲁木齐',76),
                ('哈尔滨',47),('兰州',56),('信阳',85)]
        start_end = [('宁波','成都'),('武汉','北京'),('武汉','西安'),
                 ('长沙','杭州'),('武汉','贵阳'),('武汉','上海'),
                 ('甘肃','深圳'),('北京','乌鲁木齐'),('上海','哈尔滨'),
                 ('武汉','兰州'),('西藏','信阳')]
        c = Geo()
        c.add_schema(maptype='china', 
                    itemstyle_opts=opts.ItemStyleOpts(color='#323c48', border_color='white'))
        # 4.添加数据
        c.add('', data_pair=city_num, color='white')
        c.add('', data_pair=start_end, type_="lines",label_opts=opts.LabelOpts(is_show=False),
             effect_opts=opts.EffectOpts(symbol="arrow", 
                                         color='gold', 
                                         symbol_size=7))
        c.set_global_opts(
            title_opts = opts.TitleOpts(title=""))
        
        return c
    
    
    def scatter3D():
        data = [(random.randint(0, 100), random.randint(0, 100), random.randint(0, 100)) for _ in range(80)]
        c = (Scatter3D()
                .add("", data)
                .set_global_opts(
                  title_opts=opts.TitleOpts(""),
                )
            )
        

    接下来,我们引用Page函数,将所有图表堆积在一个页面中,代码如下

    from pyecharts.charts import Page
    page = Page() 
    page.add(
             tab0("OFFICETOUCH","#2CB34A"), 
             bar(),
             tab1("数据可视化大屏","#2CB34A"),
             gau(),
             radius(),
             funnel(),
             geo(),
             scatter3D()
             )
    page.render("datacenter.html")

    我们运行下上述两段代码,发现布局是按照从上到下一个个呈现的,到此我们完成了一半的编码

    为了将图表按照我们的草稿布局,我们再引用HTML(from bs4 import BeautifulSoup)

    from bs4 import BeautifulSoup
    with open("datacenter.html", "r+", encoding='utf-8') as html:
        html_bf = BeautifulSoup(html, 'lxml')
        divs = html_bf.select('.chart-container')
        divs[0]["style"] = "width:10%;height:10%;position:absolute;top:0;left:2%;"
        divs[1]["style"] = "width:40%;height:40%;position:absolute;top:12%;left:0;"  
        divs[2]["style"] = "width:35%;height:10%;position:absolute;top:2%;left:30%;"
        divs[3]["style"] = "width:40%;height:40%;position:absolute;top:10%;left:28%;"
        divs[4]["style"] = "width:40%;height:35%;position:absolute;top:12%;left:55%;"
        divs[5]["style"] = "width:30%;height:35%;position:absolute;top:60%;left:2%;"
        divs[6]["style"] = "width:60%;height:50%;position:absolute;top:45%;left:15%;"
        divs[7]["style"] = "width:35%;height:40%;position:absolute;top:50%;left:60%;"
        body = html_bf.find("body")
        body["style"] = "background-image: "  # 背景颜色
        html_new = str(html_bf)
        html.seek(0, 0)
        html.truncate()
        html.write(html_new)
        html.close()

    代码中的divs[0]["style"] = "width:10%;height:10%;position:absolute;top:0;left:2%;" 即是我们对Part0的宽度、高度、位置、上边距、左边距的定义,这里我们用百分比以达到屏幕自适应的效果。

    最后,我们还可以设置一张背景图,代码合起来如下

    from pyecharts import options as opts
    from pyecharts.charts import Bar,Gauge,Pie,Page,Funnel,Geo,Scatter3D
    import random
    
    
    
    
    def bar(): #柱状图
        cate = ['1月', '2月', '3月', '4月', '5月', '6月']
        c = (      
             Bar()
                .add_xaxis(cate)
                .add_yaxis("订单数", [random.randint(100, 200) for _ in cate])
                .add_yaxis("完成数", [random.randint(50, 100) for _ in cate])
                .set_series_opts(
                                 label_opts=opts.LabelOpts(is_show=True,color="#2CB34A")
                                 
                )
                .set_global_opts(title_opts=opts.TitleOpts(title="2021年订单推移图",
                                                           title_textstyle_opts=opts.TextStyleOpts(color="#2CB34A"),
                                                           pos_left="5%"),
                                 legend_opts=opts.LegendOpts(textstyle_opts=opts.TextStyleOpts(color="#2CB34A")),
                                 xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color="#2CB34A")),
                                 yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(color="#2CB34A"))
                                                         
                )
                .set_colors(["blue", "green"])
                #.render("bar_stack0.html")
        )
        return c
    
    
    def tab0(name,color): #标题
        c = (Pie().
            set_global_opts(
            title_opts=opts.TitleOpts(title=name,pos_left='center',pos_top='center',
                                    title_textstyle_opts=opts.TextStyleOpts(color=color,font_size=20))))
        return c
    
    
    def tab1(name,color): #标题
        c = (Pie().
            set_global_opts(
            title_opts=opts.TitleOpts(title=name,pos_left='center',pos_top='center',
                                    title_textstyle_opts=opts.TextStyleOpts(color=color,font_size=25))))
        return c
    
    
    
    
    
    
    def gau():#仪表图
        c = (
            Gauge(init_opts=opts.InitOpts(width="400px", height="400px"))
                .add(series_name="库位利用率", data_pair=[["", 90]])
                .set_global_opts(
                legend_opts=opts.LegendOpts(is_show=False),
                tooltip_opts=opts.TooltipOpts(is_show=True, formatter="{a} <br/>{b} : {c}%"),
                
            )
                #.render("gauge.html")
        )
        return c
    
    
    def radius():
        cate = ['客户A', '客户B', '客户C', '客户D', '客户E', '其他客户']
        data = [153, 124, 107, 99, 89, 46]
        c=Pie()
        c.add('', [list(z) for z in zip(cate, data)],
                radius=["30%", "75%"],
                rosetype="radius")
        c.set_global_opts(title_opts=opts.TitleOpts(title="客户销售额占比", padding=[1,250],title_textstyle_opts=opts.TextStyleOpts(color="#FFFFFF")),
                          legend_opts=opts.LegendOpts(textstyle_opts=opts.TextStyleOpts(color="#FFFFFF"),type_="scroll",orient="vertical",pos_right="5%",pos_top="middle")
                          )
        c.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
        c.set_colors(['red',"orange", "yellow", "green", "Cyan", "purple"])
        
        return c
    
    
    def funnel():
        cate = ['访问', '注册', '加入购物车', '提交订单', '付款成功']
        data = [30398, 15230, 10045, 8109, 5698]
        c = Funnel()
        c.add("用户数", [list(z) for z in zip(cate, data)], 
                   sort_='ascending',
                   label_opts=opts.LabelOpts(position="inside"))
        c.set_global_opts(title_opts=opts.TitleOpts(title=""))
    
    
        return c
    
    
    def geo():
        city_num = [('武汉',105),('成都',70),('北京',99),
                ('西安',80),('杭州',60),('贵阳',34),
                ('上海',65),('深圳',54),('乌鲁木齐',76),
                ('哈尔滨',47),('兰州',56),('信阳',85)]
        start_end = [('宁波','成都'),('武汉','北京'),('武汉','西安'),
                 ('长沙','杭州'),('武汉','贵阳'),('武汉','上海'),
                 ('甘肃','深圳'),('北京','乌鲁木齐'),('上海','哈尔滨'),
                 ('武汉','兰州'),('西藏','信阳')]
        c = Geo()
        c.add_schema(maptype='china', 
                    itemstyle_opts=opts.ItemStyleOpts(color='#323c48', border_color='white'))
        # 4.添加数据
        c.add('', data_pair=city_num, color='white')
        c.add('', data_pair=start_end, type_="lines",label_opts=opts.LabelOpts(is_show=False),
             effect_opts=opts.EffectOpts(symbol="arrow", 
                                         color='gold', 
                                         symbol_size=7))
        c.set_global_opts(
            title_opts = opts.TitleOpts(title=""))
        
        return c
    
    
    def scatter3D():
        data = [(random.randint(0, 100), random.randint(0, 100), random.randint(0, 100)) for _ in range(80)]
        c = (Scatter3D()
                .add("", data)
                .set_global_opts(
                  title_opts=opts.TitleOpts(""),
                )
            )
        return c
    
    
    page = Page() 
    page.add(
             tab0("OFFICETOUCH","#2CB34A"), 
             bar(),
             tab1("数据可视化大屏","#2CB34A"),
             gau(),
             radius(),
             funnel(),
             geo(),
             scatter3D()
             )
    page.render("datacenter.html")
    #os.system("scatter.html")
    
    
    from bs4 import BeautifulSoup
    with open("datacenter.html", "r+", encoding='utf-8') as html:
        html_bf = BeautifulSoup(html, 'lxml')
        divs = html_bf.select('.chart-container')
        divs[0]["style"] = "width:10%;height:10%;position:absolute;top:0;left:2%;"
        divs[1]["style"] = "width:40%;height:40%;position:absolute;top:12%;left:0;"  
        divs[2]["style"] = "width:35%;height:10%;position:absolute;top:2%;left:30%;"
        divs[3]["style"] = "width:40%;height:40%;position:absolute;top:10%;left:28%;"
        divs[4]["style"] = "width:40%;height:35%;position:absolute;top:12%;left:55%;"
        divs[5]["style"] = "width:30%;height:35%;position:absolute;top:60%;left:2%;"
        divs[6]["style"] = "width:60%;height:50%;position:absolute;top:45%;left:15%;"
        divs[7]["style"] = "width:35%;height:40%;position:absolute;top:50%;left:60%;"
        body = html_bf.find("body")
        body["style"] = "background-image: url(bgd.jpg)"  # 背景颜色
        html_new = str(html_bf)
        html.seek(0, 0)
        html.truncate()
        html.write(html_new)
       

    效果图如下:

    学习到了这里,你是否能独立完成数据可视化的工作了啊?晓风终于不辱使命,向大家完整地介绍了如何使用Python绘制数据可视化大屏。晓风还会继续努力,为大家带来更多有趣、实用、简单地Python功能,愿我们一起成长!

    另两篇教程,如下:

    1、Python大屏看板最全教程之Pyecharts图表https://blog.csdn.net/weixin_42341655/article/details/118078089

    2、Python大屏看板最全教程之数据库连接https://blog.csdn.net/weixin_42341655/article/details/118096691

    如果觉得有用的话,请帮忙点赞、关注、收藏哦,感谢您的支持!

    展开全文
  • Python 和 Echart 实现的酷炫可视化大屏。 详细手册参考我的博文: https://blog.csdn.net/lildkdkdkjf/article/details/107083274
  • Python 和 Echart 实现的酷炫可视化大屏。 详细手册参考我的博文: https://blog.csdn.net/lildkdkdkjf/article/details/119801899
  • 龙源期刊网http://www.qikan.com.cn基于Python数据可视化大屏的设计与实现作者:胡明星来源:《科学与财富》2020年第17期摘要:数据可视化是指将数据以视觉形式来呈现,如图表或地图,以帮助人们了解这些数据的...
  • 淘宝销售数据地理图 from pyecharts import options as opts from pyecharts.globals import ThemeType #导入主题库 from pyecharts.globals import SymbolType #主题库 from pyecharts.charts import Pie,Bar,Map...
  • Python爬虫、Flask框架与ECharts实现数据可视化,源码无错误!希望大家可以好好学习,用好资源,原创,搬运请表明来源,谢谢!又不足请大佬们指正!
  • python数据可视化:基于pyecharts的BI数据大屏

    万次阅读 多人点赞 2019-02-11 09:03:00
    作为公司负责搜索和推荐的部门,很多业务数据都需要进行可视化展示:一方面是方便团队成员进行监控和分析,另一方面也是为了和业务部门共享分析成果,让数据产生更多的价值。虽然公司已经准备部署Tableau,但我们...
  • 有钱的人会使用阿里云全家桶的DataV或者商业化的大屏解决方案,但是在国内还是小公司比较多,本人50年大数据开发经验,精通数据可视化,曾经处理过百万亿级别的数据,现在就让我带领大家一个开源的大数据可视化...
  • 点击上方“Python爬虫与数据挖掘”,进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤洛阳亲友如相问,一片冰心在玉壶。大家好,我是小F~在数据时代,销售数据分析...
  • echarts-python数据可视化大屏展示

    千次阅读 多人点赞 2021-06-25 18:51:29
    持续完善中。。。。。 关注公众号: 我是TIME0101 回复:浙江省农产品数据可视化获取源代码
  • 一:数据准备阶段 此次数据所有来源均从这两个地方得到 ...5.pyecahrts 主要功能:数据可视化制作地图等 版本1.7.0 环境 python3.7 浏览器:Chrome浏览器 三:具体功能实现 1.数据获取 def get_data(self):
  • Python 和 Echart 实现的酷炫可视化大屏。 详细手册参考我的博文: https://blog.csdn.net/lildkdkdkjf/article/details/107022263
  • Python 动态实时大屏范例(DataBase数据源)- 可视大屏案例】。另外,很多实际展示场景下需要自动播放效果,本案例也展示了Events和DispatchAction触发的饼图和地图高亮效果,非常实用。 ...
  • #index.html商品与销量数据可视化// Step:3 为模块加载器配置echarts的路径,从当前页面链接到echarts.js,定义所需图表路径require.config({paths: {echarts: './static',}});// Step:4 动态加载echarts然后在回调...
  • 大数据可视化展板通用模板 全国企业大数据 厦门招聘大数据 项目简介 项目名称:big_screen 项目地址:https://github.com/TurboWay/big_screen 应用环境: Python 3.8.8 flask 1.1.2 echarts ...
  • 关于转载授权编译|黄念校对|丁一引言艺术之美根植...他们用数据可视化的方式绘画,试图展现数据内隐藏的模式或表达对数据的见解。更有趣的是,一旦接触到任何可视化的内容、数据时,人类会有更强烈的知觉、认知和交...
  • 目录 WebSocket 握手协议 优点 效果展示 一、确定需求方案 ...1、确定产品上线部署的屏幕分辨率 ...三、编码实现 (基于篇幅及...(3)监听数据事件 (4)连接断开事件 4、前端 Echarts 更新 option 中3个图表的dat...
  • 今天我就来给大家介绍一款非常便利的可视化工具:big_screen,直接传入数据即可,有了它,小白也能做数据大屏。文末将完整代码附上,需要的小伙伴速取!技术畅聊加技术交流群。 相比与Plotly、Matplotlib、...
  • python爬取拉勾网存excel+数据可视化web分析(条形图、饼图、词云,等数据分析可视化)用pyecharts生成仪表盘--将多张图片汇总到一个页面,大屏可视化数据展示
  • 闲来无事,打开知乎和某搜索引擎,搜索可视化大屏: 这么火?甚至有些人都用上了“最可怕”这三个字,不是我说,虽然可视化大屏很强,但是你这么说真的就有点过分了。 阿里的datav我知道,一个存在了几年的...
  • 数据大屏可视化 功能 便利性工具,结构简单,直接传数据就可以实现数据大屏 安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask 运行 cd big_screen; python app.py; 大数据可视化展板通用模板 ...
  • Python 和 Echart 实现的酷炫可视化大屏。 详细手册参考我的博文: https://blog.csdn.net/lildkdkdkjf/article/details/106571356
  • 整理了一波数据可视化大屏模板,而且都是B格很高的。下载到本地后,直接运行文件夹中的index.html,即可看到大屏。以下是部分截图,大家根据自己的需要去获取吧。01 智慧物流服务中心主要...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,946
精华内容 1,178
关键字:

python做大屏数据可视化

python 订阅