中国各高校数据分析
一、爬取数据
爬取的网站:中国教育在线
对应的网址:https://gkcx.eol.cn/school/search
打开网址,按F12打开开发者工具
- 切换页数发现网址的参数page在发生变化,
所以想获取某一页的数据集,首先需将url的page参数改为这一页的页数,找到对应的url; - 需遍历多少页才能获得整个数据集呢?
页面数 = 总个数/每页的个数
- 获取总个数
import json
import pandas as pd
import numpy as np
import warnings
import requests
url = "https://api.eol.cn/gkcx/api/?access_token=&admissions=¢ral=&department=&dual_class=&f211=&f985=&is_doublehigh=&is_dual_class=&keyword=&nature=&page=1&province_id=&ranktype=&request_type=1&school_type=&signsafe=&size=2&sort=view_total&top_school_id=[2941]&type=&uri=apidata/api/gk/school/lists"
headers={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"}
res = requests.post(url, headers = headers)
data = json.loads(res.text)
size=data["data"]["numFound"]
- 爬取数据集
- 利用总个数,求取总页数(集总请求数)
- 遍历请求次数,构造每一次的请求 url,其实主要是更新page参数
- 解析每一页的数据
# 构建爬取函数
def get_university_info(size, page_size=20):
page_cnt = int(size/page_size) if size%page_size==0 else int(size/page_size)+1
print('一共{0}页数据,即将开始爬取...'.format(page_cnt))
df_result = pd.DataFrame()
for index in range(1,page_cnt+1):
print('正在爬取第 {0}/{1} 页数据'.format(index, page_cnt))
url = "https://api.eol.cn/gkcx/api/?access_token=&admissions=¢ral=&department=& \
dual_class=&f211=&f985=&is_doublehigh=&is_dual_class=&keyword=&nature=&page={0} \
&province_id=&ranktype=&request_type=1&school_type=&signsafe=&size=20&sort=view_total \
&top_school_id=[2941]&type=&uri=apidata/api/gk/school/lists".format(index)
res = requests.post(url, headers = headers)
data = json.loads(res.text)
if data["message"] == "成功":
df_data = pd.DataFrame(data["data"]["item"])
df_result = df_result.append(df_data)
return df_result
#爬取数据
df_data = get_university_info(size)
df_data.head()
df_data.to_excel("11.xlsx") #保存数据
结果如下:
二、数据分析思维
数据包含字段:地点,官网,所属部门,城市,区域,是否双一流,是否211,是否985,是否招生,普通本科还是专科(高职),校名,性质,省份,类别,总浏览,周浏览,月浏览,年浏览
三、数据分析
- 月浏览 / 总浏览 / 周浏览 / 年浏览前十高校条形图
# 读取数据,删除多余的列
data=pd.read_excel("11.xlsx")
data=data.drop("Unnamed: 0",axis=1)
data.head()
#导入库
import pyecharts
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
- 绘制周浏览量前十高校柱形图
#数据准备
view_week_number=data[["name","view_week_number"]].sort_values(by = "view_week_number",ascending = False).head(10) #获取周浏览量前十高校
view_week_number
在绘图之前需整理数据,数据结果如下:
#图形绘制
bar = (Bar()
.add_xaxis(view_week_number["name"].tolist())
.add_yaxis("",view_week_number["view_week_number"].tolist())
.set_series_opts(label_opts=opts.LabelOpts(is_show=True,
position='outsideLeft',
font_style='italic'),
itemstyle_opts=opts.ItemStyleOpts(
color=JsCode("""new echarts.graphic.LinearGradient(1, 0, 0, 0,
[{
offset: 0,
color: 'rgb(255,99,71)'
}, {
offset: 1,
color: 'rgb(32,178,170)'
}])""")) #柱体颜色配置
)
.set_global_opts(
title_opts=opts.TitleOpts(title="top10周浏览量的学校",
# subtitle='数据截止日期:2021年5月'
),
# xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))
)
.reversal_axis()
)
- 绘制月浏览量前十高校柱形图
#数据准备
view_month_number=data[["name","view_month_number"]].sort_values(by = "view_month_number",ascending = False).head(10)
#图形绘制
bar1 = (Bar()
.add_xaxis(view_month_number["name"].tolist())
.add_yaxis("",view_month_number["view_month_number"].tolist())
.set_series_opts(label_opts=opts.LabelOpts(is_show=True,
position='outsideLeft',
font_style='italic'),
itemstyle_opts=opts.ItemStyleOpts(
color=JsCode("""new echarts.graphic.LinearGradient(1, 0, 0, 0,
[{
offset: 0,
color: 'rgb(255,99,71)'
}, {
offset: 1,
color: 'rgb(32,178,170)'
}])"""))
)
.set_global_opts(
title_opts=opts.TitleOpts(title="top10月浏览量的学校",
# subtitle='数据截止日期:2021年5月',
pos_right="35%"),
# xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))
)
.reversal_axis()
)
- 绘制年浏览量前十高校柱形图
#数据准备
view_year=data[["name","view_year"]].sort_values(by = "view_year",ascending = False).head(10)
#图形绘制
bar2 = (Bar()
.add_xaxis(view_year["name"].tolist())
.add_yaxis("",view_year["view_year"].tolist())
.set_series_opts(label_opts=opts.LabelOpts(is_show=True,
position='outsideLeft',
font_style='italic'),
itemstyle_opts=opts.ItemStyleOpts(
color=JsCode("""new echarts.graphic.LinearGradient(1, 0, 0, 0,
[{
offset: 0,
color: 'rgb(255,99,71)'
}, {
offset: 1,
color: 'rgb(32,178,170)'
}])""")) #颜色配置
)
.set_global_opts(
title_opts=opts.TitleOpts(title="top10年浏览量的学校",
# subtitle='数据截止日期:2021年5月',
pos_top="50%"),
# xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45))
)
.reversal_axis()
)
- 绘制总浏览量前十高校柱形图
#数据准备
view_total_number=data[["name","view_total_number"]].sort_values(by = "view_total_number",ascending = False).head(10)
#图形绘制
bar3 = (Bar()
.add_xaxis(view_total_number["name"].tolist())
.add_yaxis("",view_total_number["view_total_number"].tolist())
.set_series_opts(label_opts=opts.LabelOpts(is_show=True,
position='outsideLeft',
font_style='italic'),
itemstyle_opts=opts.ItemStyleOpts(
color=JsCode("""new echarts.graphic.LinearGradient(1, 0, 0, 0,
[{
offset: 0,
color: 'rgb(255,99,71)'
}, {
offset: 1,
color: 'rgb(32,178,170)'
}])"""))
)
.set_global_opts(
title_opts=opts.TitleOpts(title="top10总浏览量的学校",
# subtitle='数据截止日期:2021年5月',
pos_top="50%",pos_right="35%"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=25))
)
.reversal_axis()
)
- 将四个部分的图形组合
grid = (Grid(init_opts=opts.InitOpts(theme='dark', width=1000))
.add(bar, grid_opts=opts.GridOpts(pos_left="15%",pos_right="50%",pos_top="5%",pos_bottom="55%"))
.add(bar1, grid_opts=opts.GridOpts(pos_left="60%",pos_right="5%",pos_top="5%",pos_bottom="55%"))
.add(bar2, grid_opts=opts.GridOpts(pos_left="15%",pos_right="50%",pos_top = "55%",pos_bottom="5%"))
.add(bar3, grid_opts=opts.GridOpts(pos_left="60%",pos_right="5%",pos_top = "55%",pos_bottom="7%"))
)
grid.render_notebook()
结果如下:
厦门大学和四川大学在总浏览量,年浏览量,月浏览量和周浏览量都处于前十,是相当热门和引人关注的大学;
武汉大学,北京大学,清华大学和中山大学在top10总浏览量学校榜,top10年浏览量学校榜靠前位置,但没在top10周浏览量学校榜,top10月浏览量学校榜,属于长期稳定热点大学,长期受广大学子家长关注,但是并不是在每个月的关注量十分突出。
- 高校性质,类别,普通本科还是专科(高职)饼图
- 高校本专科分布饼图
#数据准备
temp = data.groupby('level_name')['name'].count().reset_index()
temp.columns = ['类别','计数']
data_pair = [(row['类别'], row['计数']) for _, row in temp.iterrows()]
data_pair = sorted(data_pair, key=lambda x: x[1], reverse=True)
data_pair
在绘图之前需整理数据,数据结果如下:
#图形绘制
pie = (Pie(init_opts=opts.InitOpts(theme='dark', width=400))
.add('', data_pair,
radius=["30%", "45%"],
center=["15%", "50%"],#圆心位置,第一个坐标点为横轴位置,第二个坐标点为纵轴位置
rosetype="radius")
.set_global_opts(title_opts=opts.TitleOpts(title="高校本专科分布",
pos_left = "8%",pos_top = "15%"),
legend_opts=opts.LegendOpts(is_show=False),)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%",position='inside')) # 显示在图形的标签形式
)
- 高校性质分布饼图
#数据准备
temp = data.groupby('nature_name')['name'].count().reset_index()
temp.columns = ['性质','计数']
data_pair = [(row['性质'], row['计数']) for _, row in temp.iterrows()]
data_pair = sorted(data_pair, key=lambda x: x[1], reverse=True)
#图形绘制
pie1 = (Pie(init_opts=opts.InitOpts(theme='dark', width=400))
.add('', data_pair,
radius=["30%", "45%"],
center=["45%", "50%"],
rosetype="radius")
.set_global_opts(title_opts=opts.TitleOpts(title="高校性质分布",
pos_left = "39%",pos_top = "15%"),
legend_opts=opts.LegendOpts(is_show=False),)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%",position='inside'))
)
- 高校类别分布饼图
#数据准备
temp = data.groupby("type_name")["name"].count().reset_index()
temp.columns = ["类别","计数"]
data_pair = [(row["类别"],row["计数"]) for i,row in temp.iterrows()]
data_pair = sorted(data_pair,key = lambda x:x[1],reverse = True)
#图形绘制
pie2 = (Pie(init_opts=opts.InitOpts(theme='dark', width=400))
.add('', data_pair,
radius=["30%", "45%"],
center=["80%", "50%"],
rosetype="radius")
.set_global_opts(title_opts=opts.TitleOpts(title="高校类别分布",
pos_left = "72%",pos_top = "15%"),
legend_opts=opts.LegendOpts(is_show=False),)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))
)
- 将三部分图形组合
grid = (Grid(init_opts=opts.InitOpts(theme='dark', width=1000))
.add(pie, grid_opts=opts.GridOpts())
.add(pie1, grid_opts=opts.GridOpts())
.add(pie2, grid_opts=opts.GridOpts())
)
grid.render_notebook()
结果如下:
本科高校占总体高校47.51%,专科高职高校占总体高校52.49%,各约占据全体高校半壁江山;
公办高校占据总体高校72.55%,民办高校占据总体高校26.75%,中外合作办学高校占据总体高校0.7%;
在所有高校类别中,理工类高校占比最高,占据全体高校30.61%,其次是综合类29.3%,师范类8.56%,医药类7.65%,财经类7.64%等。
- 各省份高校数量
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
#数据准备
coord = {
'湖北': [114.31667, 30.51667],
'广东': [113.23333, 23.16667],
'北京': [116.41667, 39.91667],
'上海': [121.48, 31.22],
'辽宁': [123.38, 41.8],
'江西': [115.90000, 28.68333],
'四川': [104.06, 30.67],
'安徽': [117.27, 31.86],
'广西': [108.33, 22.84],
'新疆': [87.68, 43.77],
'江苏': [118.78, 32.04],
'河北': [114.48, 38.03],
'浙江': [120.19, 30.26],
'湖南': [113, 28.21],
'甘肃': [103.82, 36.07],
'福建': [119.28000, 26.08],
'贵州': [106.71, 26.57],
'海南': [110.35, 20.02],
'河南': [113.65, 34.76],
'黑龙江': [126.63, 45.75],
'吉林': [125.35, 43.88],
'内蒙古': [111.65, 40.82],
'宁夏': [106.27, 38.47],
'山东': [117, 36.65],
'山西': [112.53, 37.87],
'陕西': [108.95, 34.27],
'天津': [117.2, 39.13],
'西藏': [91.11, 29.97],
'云南': [102.73, 25.04],
'重庆': [106.54, 29.59],
'青海': [101.74, 36.56],
'澳门': [113.5,22.2],
'香港':[114.1,22.2]}
temp = data.groupby('province_name')['name'].count().reset_index()
temp.columns = ['地区','计数']
data_pair = []
for idx, row in temp.iterrows():
name = row['地区']
value = coord[name]
value.append(row['计数'])
data_pair.append([name, value])
data_pair
数据结果如下:
#图形绘制
chart = Map3D(init_opts=opts.InitOpts(
width='1000px',
height='600px',
theme='dark')
)
# 引用添加的地图
chart.add_schema(
maptype="china",
shading="lambert", ## 三维地理坐标系组件中三维图形的着色效果,通过经典的 lambert 着色表现光照带来的明暗。
emphasis_label_opts=opts.LabelOpts(is_show=True),
itemstyle_opts=opts.ItemStyleOpts(
color="#00BFFF",
opacity=1,
border_width=0.5, #地图边界深浅
border_color="rgb(0,0,0)", #地图边界颜色
),
light_opts=opts.Map3DLightOpts(
main_color ="#fff", # 主光源的颜色
main_shadow_quality='high', # 阴影的质量。可选'low', 'medium', 'high', 'ultra'
is_main_shadow=True,# 主光源是否投射阴影。默认为关闭。
main_intensity=1,# 主光源的强度。
main_alpha=30, # 主光源绕 x 轴,即上下旋转的角度。
),
post_effect_opts=opts.Map3DPostEffectOpts(
is_enable=True,# 是否开启后处理特效。默认关闭。
)
)
chart.add(
"学校数量",
data_pair=data_pair,
type_="bar3D",# 叠加图的类型(目前只支持 Bar3D,Line3D,Lines3D,Scatter3D)
bar_size=1.5, # 设置柱子的大小
min_height=3, # 最小柱子高度
bevel_size = 0.5, # 柱子的倒角尺寸。支持设置为从 0 到 1 的值。默认为 0,即没有倒角。
bevel_smoothness = 5, # 柱子倒角的光滑/圆润度,数值越大越光滑/圆润
shading="lambert", # 三维地图中三维图形的着色效果。
label_opts=opts.LabelOpts(
is_show=False,
formatter=JsCode(
"function(data){return data.name + ': ' + data.value[2];}"),
) #设置标签显示
)
chart.set_global_opts(
visualmap_opts=opts.VisualMapOpts(
is_show=False,
type_='color',
dimension=2,
range_color=[
'#313695',
'#4575b4',
'#74add1',
'#abd9e9',
'#e0f3f8',
'#ffffbf',
'#fee090',
'#fdae61',
'#f46d43',
'#d73027',
'#a50026']
),
title_opts=opts.TitleOpts(
title="全国各省学校统计",
pos_left="2%",
pos_top='1%',
title_textstyle_opts=opts.TextStyleOpts(color='#00BFFF', font_size=20)
),
tooltip_opts=opts.TooltipOpts(is_show=False),
legend_opts=opts.LegendOpts(is_show=False)
)
chart.render_notebook()
结果如下:
江苏高校数量在全国各省份中,位居第一,共174个高校,其次广东,共163个高校,后面分别是山东160,河南158,四川137,湖南134,湖北129,安徽128,河北126。
- 省份与是否211,是否985,是否双一流结合 柱形图
- 省份与是否211关系图
#数据准备
data_2111=data[data["f211"]==1].groupby("province_name")["f211"].count().reset_index()
data_2112=data[data["f211"]==2].groupby("province_name")["f211"].count().reset_index()
data_211=data_2111.merge(data_2112,how="outer",on="province_name")
data_211.columns = ["省份","211","非211"]
data_211=data_211.fillna(0)
data_211["总数"]=data_211["211"]+data_211["非211"]
data_211["211"] = round(data_211["211"]/data_211["总数"]*100,2)
data_211["非211"] = round(data_211["非211"]/data_211["总数"]*100,2)
data_211.sort_values(by='211', inplace=True)
data_211
在绘图之前需整理数据,数据结果如下:
#图形绘制
bar = Bar(
init_opts=opts.InitOpts(
width='1000px',
height='1000px',
bg_color='#d6e7ff')
)
bar.add_xaxis(
data_211['省份'].tolist()
)
bar.add_yaxis(
'211',
data_211['211'].tolist(),
stack=1,
label_opts=opts.LabelOpts(is_show=True, formatter='{c}%', position='insideLeft'),
itemstyle_opts={
'normal': {
'shadowColor': 'rgba(0, 0, 0, .5)', # 阴影颜色
'shadowBlur': 5, # 阴影大小
'shadowOffsetY': 2, # Y轴方向阴影偏移
'shadowOffsetX': 2, # x轴方向阴影偏移
'borderColor': '#fff'
}
}
)
bar.add_yaxis(
'非211',
data_211['非211'].tolist(),
stack=1,
label_opts=opts.LabelOpts(is_show=True, formatter='{c}%', position='insideLeft'),
itemstyle_opts={
'normal': {
'shadowColor': 'rgba(0, 0, 0, .5)', # 阴影颜色
'shadowBlur': 5, # 阴影大小
'shadowOffsetY': 2, # Y轴方向阴影偏移
'shadowOffsetX': 2, # x轴方向阴影偏移
'borderColor': '#fff'
}
}
)
bar.set_global_opts(
xaxis_opts=opts.AxisOpts(is_show=False, max_=100),
yaxis_opts=opts.AxisOpts(
axisline_opts=opts.AxisLineOpts(is_show=False),
axistick_opts=opts.AxisTickOpts(is_show=False)),
legend_opts=opts.LegendOpts(is_show=True, pos_top='1%', pos_right='10%'),
title_opts=opts.TitleOpts(
title="全国各省211学校分布",
pos_left="5%",
pos_top='1%',
title_textstyle_opts=opts.TextStyleOpts(font_size=20)
),
)
bar.reversal_axis()
bar.set_colors(['red', 'blue'])
bar.render_notebook()
结果如下:
- 省份与是否985关系图
#数据准备
data_9851=data[data["f985"]==1].groupby("province_name")["f985"].count().reset_index()
data_9852=data[data["f985"]==2].groupby("province_name")["f985"].count().reset_index()
data_985=data_9851.merge(data_9852,how="outer",on="province_name")
data_985.columns = ["省份","985","非985"]
data_985=data_985.fillna(0)
data_985["总数"]=data_985["985"]+data_985["非985"]
data_985["985"] = round(data_985["985"]/data_985["总数"]*100,2)
data_985["非985"] = round(data_985["非985"]/data_985["总数"]*100,2)
data_985.sort_values(by='985', inplace=True)
#图形绘制
bar = Bar(
init_opts=opts.InitOpts(
theme='dark',
width='1000px',
height='1000px',
bg_color='#000')
)
bar.add_xaxis(
data_985['省份'].tolist()
)
bar.add_yaxis(
'985',
data_985['985'].tolist(),
stack=1,
label_opts=opts.LabelOpts(is_show=True, formatter='{c}%', position='insideLeft'),
itemstyle_opts={
'normal': {
'shadowColor': 'rgba(0, 0, 0, .5)', # 阴影颜色
'shadowBlur': 5, # 阴影大小
'shadowOffsetY': 2, # Y轴方向阴影偏移
'shadowOffsetX': 2, # x轴方向阴影偏移
'borderColor': '#fff'
}
}
)
bar.add_yaxis(
'非985',
data_985['非985'].tolist(),
stack=1,
label_opts=opts.LabelOpts(is_show=True, formatter='{c}%', position='insideLeft'),
itemstyle_opts={
'normal': {
'shadowColor': 'rgba(0, 0, 0, .5)', # 阴影颜色
'shadowBlur': 5, # 阴影大小
'shadowOffsetY': 2, # Y轴方向阴影偏移
'shadowOffsetX': 2, # x轴方向阴影偏移
'borderColor': '#fff'
}
}
)
bar.set_global_opts(
xaxis_opts=opts.AxisOpts(is_show=False, max_=100),
yaxis_opts=opts.AxisOpts(
axisline_opts=opts.AxisLineOpts(is_show=False),
axistick_opts=opts.AxisTickOpts(is_show=False)),
legend_opts=opts.LegendOpts(is_show=True, pos_top='1%', pos_right='10%'),
title_opts=opts.TitleOpts(
title="全国各省985学校分布",
pos_left="5%",
pos_top='1%',
title_textstyle_opts=opts.TextStyleOpts(font_size=20)
),
)
bar.reversal_axis()
bar.set_colors(['red', 'blue'])
bar.render_notebook()
结果如下:
- 省份与是否双一流关系图
#数据准备
data["dual_class_name"] = data["dual_class_name"].fillna("非双一流")
data_dual_class_name1=data[data["dual_class_name"]=="双一流"].groupby("province_name")["dual_class_name"].count().reset_index()
data_dual_class_name2=data[data["dual_class_name"]=="非双一流"].groupby("province_name")["dual_class_name"].count().reset_index()
data_dual_class_name=data_dual_class_name1.merge(data_dual_class_name2,how="outer",on="province_name")
data_dual_class_name.columns = ["省份","双一流","非双一流"]
data_dual_class_name=data_dual_class_name.fillna(0)
data_dual_class_name["总数"]=data_dual_class_name["双一流"]+data_dual_class_name["非双一流"]
data_dual_class_name["双一流"] = round(data_dual_class_name["双一流"]/data_dual_class_name["总数"]*100,2)
data_dual_class_name["非双一流"] = round(data_dual_class_name["非双一流"]/data_dual_class_name["总数"]*100,2)
data_dual_class_name.sort_values(by='双一流', inplace=True)
#图形绘制
bar = Bar(
init_opts=opts.InitOpts(
theme='dark',
width='1000px',
height='1000px',
bg_color='#000')
)
bar.add_xaxis(
data_dual_class_name["省份"] .tolist()
)
bar.add_yaxis(
'双一流',
data_dual_class_name["双一流"] .tolist(),
stack=1,
label_opts=opts.LabelOpts(is_show=True, formatter='{c}%', position='insideLeft'),
itemstyle_opts={
'normal': {
'shadowColor': 'rgba(0, 0, 0, .5)', # 阴影颜色
'shadowBlur': 5, # 阴影大小
'shadowOffsetY': 2, # Y轴方向阴影偏移
'shadowOffsetX': 2, # x轴方向阴影偏移
'borderColor': '#fff'
}
}
)
bar.add_yaxis(
'非双一流',
data_dual_class_name["非双一流"] .tolist(),
stack=1,
label_opts=opts.LabelOpts(is_show=True, formatter='{c}%', position='insideLeft'),
itemstyle_opts={
'normal': {
'shadowColor': 'rgba(0, 0, 0, .5)', # 阴影颜色
'shadowBlur': 5, # 阴影大小
'shadowOffsetY': 2, # Y轴方向阴影偏移
'shadowOffsetX': 2, # x轴方向阴影偏移
'borderColor': '#fff'
}
}
)
bar.set_global_opts(
xaxis_opts=opts.AxisOpts(is_show=False, max_=100),
yaxis_opts=opts.AxisOpts(
axisline_opts=opts.AxisLineOpts(is_show=False),
axistick_opts=opts.AxisTickOpts(is_show=False)),
legend_opts=opts.LegendOpts(is_show=True, pos_top='1%', pos_right='10%'),
title_opts=opts.TitleOpts(
title="全国各省双一流分布",
pos_left="5%",
pos_top='1%',
title_textstyle_opts=opts.TextStyleOpts(font_size=20)
),
)
bar.reversal_axis()
bar.set_colors(['red', 'blue'])
bar.render_notebook()
结果如下:
- 地图打点
- 获取各高校经纬度
#读取数据
df_data=pd.read_excel("11.xlsx")
df_data.drop("Unnamed: 0",axis=1,inplace=True)
df_data.head()
#构建获取经纬度函数
def get_data(url):
res = requests.get(url,headers = headers)
data = json.loads(res.text)
if len(data["results"])>0:
df_data = pd.DataFrame(data["results"])
df_data["lat"] = df_data["location"].apply(lambda x:x["lat"])
df_data["lng"] = df_data["location"].apply(lambda x:x["lng"])
bd_lng = df_data.loc[0,"lng"]
bd_lat = df_data.loc[0,"lat"]
return bd_lng,bd_lat
#遍历各高校,获取各高校经纬度
for row_index,data_row in df_data.iterrows():
region = data_row["province_name"]+data_row['city_name']
query = data_row["name"]
url = "http://api.map.baidu.com/place/v2/search?query={0}&tag={1}®ion={2}&output=json&ak={3}".format(query,"高等院校",region,"")
try:
bd_lng,bd_lat = get_data(url)
df_data.loc[df_data["name"]==query,'bd经度'] = bd_lng
df_data.loc[df_data["name"]==query,'bd维度'] = bd_lat
except:
print("{0} 爬取失败,请注意!".format(query))
print(url)
continue
#将数据保存
df_data.to_excel("55.xlsx")
- 绘制散点地图
#读取数据
data = pd.read_excel("55.xlsx")
#绘制图形
#使用pyecharts中的Geo类绘制散点图
from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.globals import GeoType
city = 'china'
#实例化一个Geo类
geo = Geo(init_opts=opts.InitOpts(theme='dark', width=1000))
#中国地图为底景
geo.add_schema(maptype=city)
# 添加地点坐标至坐标库中
for i in range(len(data["name"])):
geo.add_coordinate(data.iloc[i]['name'],data.iloc[i]['bd经度'],data.iloc[i]['bd维度'])
data_pair = [(data.iloc[i]['name'],int(data.iloc[i]['view_month_number'])) for i in range(len(data["name"]))]
# 将数据添加到地图上
geo.add('',data_pair,type_=GeoType.EFFECT_SCATTER, symbol_size=5)
# 设置样式
geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
#自定义分级
pieces = [
{'min': 0, 'max': 50, 'label': '1', 'color': '#FFFFF4'},
{'min':500, 'max': 100, 'label': '1', 'color': '#FFFF93'},
{'min': 100, 'max': 250, 'label': '2', 'color': '#F9F900'},
{'min': 250, 'max': 500, 'label': '2', 'color': '#FFD306'},
{'min': 500, 'max': 750, 'label': '2', 'color': '#FFA042'},
{'min': 750, 'max': 1000, 'label': '2', 'color': '#FF8040'},
{'min': 1000, 'max': 10000, 'label': '3', 'color': '#2828FF'},
{'min': 10000, 'label': '4', 'color': '#3700A4'}
]
#是否自定义分段
geo.set_global_opts(
visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pieces=pieces),
title_opts=opts.TitleOpts(title='各高校可视化'),
)
geo.render_notebook()
结果如下:
- 利用聚类,找出高校几个集群
a. 采用肘方法来选取一个恰当的K值
from sklearn.cluster import KMeans
inertia = []
for i in range(1,21):
kmeans = KMeans(n_clusters=i,
init='k-means++',
n_jobs=1)
X = data[['bd经度','bd维度']]
kmeans.fit(X)
inertia.append(kmeans.inertia_)
#绘制误差和随K值的变化曲线图
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
plt.figure(figsize=(12,6))
plt.plot(range(1,21),inertia)
plt.title('The Elbow Method')
plt.xlabel('K')
plt.ylabel('inertia')
plt.show()
结果如下:
b. 根据图形,将数据分为5组
kmeans = KMeans(n_clusters=5,
init='k-means++',
n_jobs=1)
X = data[['bd经度','bd维度']]
kmeans.fit(X)
y_pred = kmeans.predict(X)
c. 绘制地图,查看分组结果
from pyecharts.charts import Geo
from pyecharts import options as opts
from pyecharts.globals import GeoType
city = 'china'
#实例化一个Geo类
geo = Geo()
geo.add_schema(maptype=city)
# #添加地点坐标至坐标库中
for i in range(len(data["name"])):
geo.add_coordinate(data.iloc[i]['name'],data.iloc[i]['bd经度'],data.iloc[i]['bd维度'])
data_pair = [(data.iloc[i]['name'],int(y_pred[i])) for i in range(len(data["name"]))]
# 将数据添加到地图上
geo.add('',data_pair,type_=GeoType.EFFECT_SCATTER, symbol_size=5)
# 设置样式
geo.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
#自定义分级
pieces = [
{'min': 0, 'max': 0, 'label': '1', 'color': '#50A3BA'},
{'min': 0, 'max': 1, 'label': '2', 'color': '#DD0200'},
{'min': 1, 'max': 2, 'label': '3', 'color': '#E2C568'},
{'min': 2, 'max': 3, 'label': '4', 'color': '#FFD306'},
{'min': 3, 'max': 4, 'label': '5', 'color': '#FFFF93'}
]
#是否自定义分段
geo.set_global_opts(
visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pieces=pieces),
title_opts=opts.TitleOpts(title='中国高校分组可视化'),
)
geo.render_notebook()
结果如下:
d. 获取聚类中心坐标
center_ = kmeans.cluster_centers_
center_
结果如下:
这五个经纬度对应的地址:
江西省上饶市余干县
河北省衡水市冀州区
新疆维吾尔自治区巴音郭楞蒙古自治州轮台县
重庆市江津区油溪长江大桥
吉林省四平市铁东区四平服务区
由此可见,这五个高校群的中心点可视为江西省,河北省,新疆,重庆市,吉林省。