安居客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是沒有記錄的,直接繪圖會報錯
    #位置在\Python36\Lib\site-packages\pyecharts\datasets\city_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...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM