之前使用scrapy
抓取了优信二手车的数据,经过这几天的努力,终于把这些数据进行了清洗,并用echarts
进行了可视化处理
1.观察数据
可以看到由于抓取的时候没有进行处理,所以整个标题都拿了下来,并且价格也包含了文字,所以需要对这些进行处理
2.修改数据
通过观察发现,可以通过以空格为分隔符,进行截取,这里只取出前面的第一部分,即:‘宝马’二字,并通过MongoDB
的update
方法进行修改
for car in car_item.find(): title = car['title'].split()[0] car_item.update({'_id':car['_id']}, {'$set': {'title': title}})
同样,价格,可以通过正则表达式取出数值部分
for car in car_item.find(): price= re.findall(r'\d+.\d+',car['price']) car_item.update({'_id':car['_id']}, {'$set': {'price': price}})
如果MongoDB不是很了解的可以去 菜鸟教程 看看
修改之后,可以看到数据库的数据已经变成我们想要的样子了
PS:由于抓取的时候没有改善方法,所以这里的get_car_time
(提车天数)出现了小误差,这里就不管了
3.进入jupyter
-
引入相应的模块
如果出现Server running in the folder D:\JupyterNotebook\PythonProject at 127.0.0.1:51316
说明可以进行下面的步骤了,如果不行,可以参考我之前的文章,传送门
- 使用管道
aggregate
首先,定义一个函数输出想要的数据,这里先处理displacement
(排量)信息,统计相应的排量,并归类
def getpipe(): pipeline= [ {'$group':{'_id':'$displacement','count':{'$sum':1}}} ] for i in car_item.aggregate(pipeline): yield [i['_id'],i['count']] option={ 'chart':{'zoomType':'xy'}, 'title':{'text':'优信二手车排量比例'}, 'subtitle':{'text':'数据来源:优信二手车'}, 'plotOptions':{'pie':{'dataLabels':{'enabled':True}}}, } series = [{ 'type' :'pie', 'name':'数量', 'data':[i for i in getpipe()] }] charts.plot(series,options = option,show ='inline')
执行之后可以看到
从这里可以看出,市面上的二手车以 2.0L 为主,当然数据可能有偏差,毕竟数据量不是很大
3. 统计车辆品牌
同样运用管道的方法
def get_name(): pipeline= [ {'$group':{'_id':'$title', 'count':{'$sum':1}, } }, {'$sort':{'count':-1}} ] for i in car_item.aggregate(pipeline): yield [i['_id'], i['count'] ] option={ 'chart':{'zoomType':'xy'}, 'title':{'text':'优信二手品牌比例'}, 'subtitle':{'text':'数据来源:优信二手车'}, 'plotOptions':{'column':{'dataLabels':{'enabled':True}}}, } series = [{ 'type' :'pie', 'name':'数量', 'data':[i for i in get_name()] }] charts.plot(series,options = option,show ='inline')
执行后出现下图,可以看出市面上常见的品牌有哪些
4. 统计价格
在统计价格这里有个小坑,那就是使用$avg
的时候会出现很长的小数位,所以这里使用了round()
来限制小数位数
pipeline_car_name =[ {"$group":{"_id":"$title","avg_price":{"$avg":'$price'}}}, ] car_list=list(car_item.aggregate(pipeline_car_name)) for i in car_list: i['avg_price']=round(i['avg_price'],2)
def get_name_and_avgprice (types): length = 0 if length < len(car_list): for car in car_list: data ={ 'name':[car['_id']], 'data':[car['avg_price']], 'type':types, 'barWidth':70 } yield data length += 1
name_list = [] for i in car_list: name_list.append(i['_id'])
option={ 'chart':{'zoomType':'xy'}, 'title':{'text':'优信二手价格表'}, 'subtitle':{'text':'数据来源:优信二手车'}, 'xAxis ' { 'type ': 'category', 'data' : name_list, 'show': 'false', }, 'axisLabel': { 'interval':20,'rotate': 30}, 'yAxis' : {'title':{'text':'平均价格:/万元'}}, 'plotOptions':{'column':{'dataLabels':{'enabled':True}}}, } series =[data for data in get_name_and_avgprice('column')] charts.plot(series,show ='inline', options=option)
这里的信息排版,有点乱,是因为我使用echarts
的功力不够的原因,以后会加强学习,如果你有好的方法,可以留言
ps:还是玛莎拉蒂
牛批,均价65万,像我这样的人,还是开低调奢华的五菱
好点,虽然倒数第一,5万起步
4.总结
做完这些工作,感觉还是图像牛批呀,毕竟谁都不想面对一大堆的文字.虽然这个小栗子有点简单,但是在过程中,发现了自身的很多小问题.希望对大家能够有所帮助吧
ps:源码已经放上GitHub,有兴趣的可以看一下,如果还有什么想法请留言
原文链接:https://blog.csdn.net/stormdony/article/details/80129898?ops_request_misc=&request_id=2d52581443084ffaaa58ab06150268a5&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~koosearch~default-4-80129898-null-null.268%5Ev1%5Econtrol&utm_term=%E6%BE%B3%E6%B4%B2%E4%BA%8C%E6%89%8B%E9%97%B2%E7%BD%AE