• 安居客scrapy房产信息爬取到数据可视化(下)-可视化代码


    接上篇:安居客scrapy房产信息爬取到数据可视化(下)-可视化代码,可视化的实现~

    先看看保存的数据吧~

    本人之前都是习惯把爬到的数据保存到本地json文件,

    这次保存到数据库后发现使用mongodb的聚合统计省去了好多自己用python写计算逻辑的步骤,好方便啊~~

     

    第一张图柱状图

    第一张图代码解析:

    #encoding:utf-8
    import random
    from pyecharts import Bar
    from pymongo import MongoClient
    
    
    conn = MongoClient('127.0.0.1',27017)  #创建于MongoDB的连接
    db = conn.anjuke  #选择数据库
    collection=db.AnjukeItem  #选择数据库下的集合
    all = []
    res = collection.aggregate([
            {'$group':{'_id':'$city',
                       'count':{'$sum':1}}},
            {'$sort':{'count':-1}},])
    conn.close()
    #上面是mongodb聚合统计的语句
    #$group:按照给定表达式组合结果,这里的_id字段表示你要基于哪个字段来进行分组,这里的$city就表示要基于city字段来进行分组
    #下面的count字段的值$sum: 1表示的是获取--满足city字段相同的这一组的数量--乘以后面给定的值(本例为1,那么就是同组的数量)。
    #$sort:按照给定的字段排序结果,即按计算好的count排序,-1为降序来排列
    
    for i in res:
        #print(i)
        #{'_id': '成都', 'count': 2074}
        all.append((i['_id'].strip(),i['count']))
    
    attr = [i[0] for i in all[:30] ]  #取前三十城市的名字
    v1 = [i[1] for i in all[:30]]  #取前三十城市的值
    print(attr)
    bar = Bar('新房分布柱状图')  #柱状图
    bar.add('各城市新楼盘数',attr,v1,is_label_show=True,is_datazoom_show=True,xaxis_rotate=65, label_color=['#87CEEB',])
    #attr  下面的城市名
    #v1  数值
    #is_label_show -> bool  是否正常显示标签,默认不显示。即各柱上的数字
    #is_datazoom_show -> bool  是否使用区域缩放组件,默认为 False
    #xaxis_rotate -> int  x 轴刻度标签旋转的角度,默认为 0,即不旋转。旋转的角度从 -90 度到 90 度。
    #label_color  柱的颜色
    bar.render('bar.html')  #html生成

    第二张图柱状图

    第二图代码解析:

    #encoding:utf-8
    from pymongo import MongoClient
    from pyecharts import Bar
    
    
    conn = MongoClient('127.0.0.1',27017)
    db = conn.anjuke
    collection=db.AnjukeItem
    res = collection.find()
    conn.close()
    #连接mongodb的逻辑,同上~
    
    all = {}
    for i in res:
        city = i['city']  #获取城市名
        try:
    
            if i['price'][1].isdecimal():  #判断i['price'][1]是不是数字型的价格
                price_type = i['price'][0]  #获取价格类型
                price = i['price'][1]
                price = int(price)  #str价格转int价格
            elif i['price'][2].isdecimal():  #判断i['price'][2]是不是数字型的价格
                price_type = i['price'][1]  #获取价格类型
                price = i['price'][2]
                price = int(price)  #str价格转int价格
        except:
            continue
    
    
        if '均价' in price_type:  #只取均价
            if city in all:
                all[city].append(price)
            else:
                all[city] = [price,]
    print(all)
    #{'_id': '黑河', 'count': 17}
    #{'_id': '甘南', 'count': 17}
    #{'_id': '陇南', 'count': 16}
    all_avg = []
    for city,prices in all.items():
        all_avg.append((city,sum(prices)/len(prices)))  #计算所有的城市房价平均值,all_avg里的元素为元组(城市名,均价)
    all_avg = sorted(all_avg,key=lambda x:x[1],reverse=True)  #降序排序 
    
    print(all_avg)
    #[('深圳', 59192.21692307692), ('上海', 50811.7504091653), ...
    
    
    
    attr = [i[0] for i in all_avg[:30] ]  #获取前30城市名
    v1 = ['{:.1f}'.format(i[1]) for i in all_avg[:30]]  #获取前30名的值
    bar = Bar('各城市房价平均值')
    bar.add('单位面积价格(元/平米)',attr,v1,is_label_show=True,is_datazoom_show=True)
    #画图逻辑,同上
    bar.render('bar2.html')

    第三张图玫瑰图

    第三张图代码解析:

    from pyecharts import Pie
    from pymongo import MongoClient
    
    conn = MongoClient('127.0.0.1',27017)
    db = conn.anjuke
    collection=db.AnjukeItem
    #Mongodb的连接
    all = []
    res = collection.aggregate(
        [
        {
            '$unwind': '$type_'
        },{
            '$group': {
                '_id': '$type_',
                'count': {'$sum': 1}
            }
        }
        ]
    )
    #上面是mongodb聚合统计的语句
    #'$unwind': '$type_'因为type_是一个列表这里是将type_拆分了,用以下面的计算
    #$group:按照给定表达式组合结果,这里的_id字段表示你要基于哪个字段来进行分组,这里的$type_就表示要基于type_字段来进行分组
    #下面的count字段的值$sum: 1表示的是获取--满足type_字段相同的这一组的数量--乘以后面给定的值(本例为1,那么就是同组的数量)。
    conn.close()
    
    all = []
    for i in res:
        print(i)
        #{'_id': '商业', 'count': 337}
        #{'_id': '商办', 'count': 158}
        #{'_id': '8室', 'count': 76}
        if '' in i['_id']:  #只取有'室'关键字的数据
            all.append((i['_id'],i['count']))
    all = sorted(all,key=lambda x:x[1],reverse=True)  #以数量进行排序
    print(all)
    
    
    attr = [i[0] for i in all][:6]  #取前六的类型名
    v1 = [i[1] for i in all][:6]  #取前六的数值
    
    pie =Pie("户型比例", title_pos='center', width=900)
    #pie.add("商品A", attr, v1, center=[25, 50], is_random=True, radius=[30, 75], rosetype='radius')
    pie.add("商品B", attr, v1, is_random=True, radius=[30, 75], rosetype='area', is_legend_show=False, is_label_show=True)
    #is_random为是否随即排列颜色列表
    #radius为半径,第一个为内半径,第二个是外半径;
    #rosetype为是否展示成南丁格尔图( 'radius' 圆心角展现数据半分比,半径展现数据大小;'area' 圆心角相同,为通过半径展现数据大小)
    #is_label_show为是否显示标签(各个属性的数据信息)
    #is_legend_show:是否显示图例
    pie.render('pie.html')

    第四张图地理热力图

     第四张图代码解析:

    #coding=utf-8
    from pymongo import MongoClient
    from pyecharts import Geo
    import json
    
    conn = MongoClient('127.0.0.1',27017)
    db = conn.anjuke
    collection=db.AnjukeItem
    #res=collection.distinct("city")
    all = []
    res = collection.aggregate([
            {'$group':{'_id':'$city',
                       'count':{'$sum':1}}},
            {'$sort':{'count':-1}},])
    for i in res:
        all.append((i['_id'].strip(),i['count']))
    conn.close()
    #连接查询,和图一一样
    
    
    new_all =[]
    with open('city_coordinates.json','r',encoding='utf-8') as f:
        #这里是复制到pyecharts的地理json数据和爬到的城市名对比,因为好多爬到的城市其实在pyecharts是没有记录的,直接绘图会报错
        #位置在Python36Libsite-packagespyechartsdatasetscity_coordinates.json
        all_city = json.loads(f.read(),encoding='utf-8')
    for i in all:
        if i[0] in all_city:
            new_all.append(i)
    
    geo = Geo(
        "全国新房分布",  #图标题
        "",  #副标题
        title_color="#fff",  #标题颜色
        title_pos="center",  #标题位置
        width=1200,  #图宽
        height=600,  #
        background_color="#404a59",  #背景颜色
    )
    attr, value = geo.cast(new_all)  #分开城市名和数值
    
    
    geo.add(
    "",
    attr,
    value,
    visual_range=[100, 1200],  #显示的数值范围
    visual_text_color="#fff",  #鼠标放上去后显示的文字颜色
    symbol_size=15,  #标记的大小
    type='heatmap',  #类型为热力图
    is_visualmap=True,
    )
    
    geo.render()

    End...

  • 相关阅读:
    tomcat中如何处理http协议的属性Connection和Tansfer-Encoding
    Tomcat中特殊字符串过滤
    Tomcat源码解析系列(十一)ProtocolHandler
    Tomcat配置强制https端口变成8443的解决办法
    深入理解Tomcat(十)Connector
    web应用程序中解决Request和Response只能获取一次的问题
    CocosCreator之打包android
    如何通过配置tomcat或是web.xml让ie直接下载文件
    从安装PHP到第一个tomcat执行的hello world其实没那么难
    Tomcat安装、配置和部署笔记
  • 原文地址:https://www.cnblogs.com/byadmin/p/10841673.html
Copyright © 2020-2023  润新知