用Python采集上海3000家医院数据,并进行可视化分析
优采云 发布时间: 2022-04-28 21:06用Python采集上海3000家医院数据,并进行可视化分析
大家好,我是J哥。
细心的朋友应该已经发现,我昨天在视频号更新了一个有意思的视频,还没观看的阔以戳下方
:
很多小伙伴非常感兴趣,纷纷私信J哥教程。其实整个内容还是比较简单的,用到的技巧在本公众号都能找到文章与之对应,包括爬虫、pandas数据处理、自动化办公、数据可视化等内容。
一、数据采集
数据来源于高德开放平台的POI数据,需要提前在高德开放平台注册并创建应用,获取你的专属key。
高德地图开放平台当然,你也可以通过百度地图开放平台或腾讯地图开放平台获取相关数据,方法都差不多。
POI数据很多,你可以自定义地理区域和类别进行数据采集,这里我只采集了上海16个区的综合医院地理数据。
# -*- coding: utf-8 -*-<br />import requests<br />import json<br />from urllib.parse import quote<br />import xlwt<br />from fake_useragent import UserAgent<br />from Coordin_transformlat import gcj02towgs84<br /><br />def get_data(key, city, types, page):<br /> '''调用POI '''<br /> headers= {'User-Agent':str(UserAgent().random)}<br /> url = f'https://restapi.amap.com/v3/place/text?key={key}&types={types}&city={quote(city)}&page={page}&output=josn'<br /> r = requests.get(url, headers=headers,timeout=2)<br /> r.encoding = 'utf-8'<br /> data = r.text<br /> return data<br /><br />def get_num(key, city, types):<br /> '''控制申请次数'''<br /><br /><br />def save_data(poilist, city,types):<br /> '''保存到excel'''<br /> <br /><br />if __name__ == "__main__":<br /> #高德密钥<br /> key = '你自己的key' #高德开放平台申请即可<br /> types = ['综合医院']<br /> city_list = ['黄浦区','徐汇区','长宁区','静安区','普陀区','闸北区','虹口区','杨浦区','浦东新区',<br /> '奉贤区','青浦区','松江区','嘉定区','金山区','闵行区','宝山区']<br /> for city in city_list:<br /> for type in types:<br /> poi = get_num(key,city,type)<br /> print(f'{city}的{type}共有{len(poi)}条数据')<br /> save_data(poi,city,type)<br /> print(f'{city}的{type}写入成功')<br /> print('数据获取完成')
整个数据采集逻辑比较简单,带着你的key和关键字向高德平台请求数据,保存为excel即可。这里需要注意的是平台对普通开发者有请求次数限制,咱们可以通过遍历行政区(而非整个城市)的方式,尽可能获取更全面的数据。
数据请求完后,共采集到大概3000条数据,得到16个excel表格:
二、数据处理
为了便于分析,咱们需要将16个excel表格数据合并为一个df,自然少不了pandas大法。excel合并的操作其实前年J哥就进行了详细讲解:
import pandas as pd<br />from pathlib import Path<br /><br />files = Path("./").glob("*.xls")<br />dfs = [pd.read_excel(f) for f in files]<br />df = pd.concat(dfs)
另外,我发现数据集存在缺失值,5个异常值,这会影响后面的地图可视化,因此,咱们用0填充缺失值,筛选出需要的字段和数据(纬度小于32)。
<p>df = df.fillna(0) #填充缺失值<br />df = df[['lon','lat','name','address','adname']] #筛选需要的字段<br />df = df[(df['lat']