交通拥堵演变模式关键点挖掘_数据处理
毕设已经开始两周了,但是我现在还没有自己成型的研究方法,因此要加把劲
1. 数据来源
通过对高德地图API的访问请求,利用Python对数据进行爬取,每隔两分钟获得一次对应的信息,主要字段包括
然后进行正则匹配获得对应的字段。
根据矩形区域进行对应的爬取和分析,以上海市的中心为基准,8*8的格子进行处理
#coding=utf-8
def request_map_one_minute():
Times = time.strftime('%Y_%m_%d %H:%M:%S',time.localtime())
global Lines, Names, Speeds, Status, Lenghts, Lcodes, Timestamps, locs, key
# all_datas = []
for i in locs:
url = BASE_URL.format(loc=i, k=keys[3])
# print(url)
res = requests.get(url)
datas = res.json()
# all_datas.append(datas)
if datas['status'] == '1':
for road in datas['trafficinfo']['roads']:
if 'speed' in road:
s = int(road['speed']))
else:
s = -1
for code in road['lcodes']:
lcode.append[code]
Timestamps.append(Times)
Status.append(road['status'])
Speeds.append(s)
# polyline = road['polyline']
# polylines = [
# (float(y[0]), float(y[1])) for y in
# [x.split(',') for x in [i for i in polyline.split(';')]]
# ]
# line = LineString(polylines)
# Lines.append(line)
# Names.append(road['name'])
# Lcodes.append(road['lcodes'])
# Timestamps.append(Times)
# if 'speed' in road: Speeds.append(int(road['speed']))
# else: Speeds.append(100)
# Status.append(road['status'])
# Lenghts.append(line.length)
else:
if datas['infocode'] == '10003':
key_flag = (key_flag + 1)%len(keys)
if datas['infocode'] == '20003':
continue
else:
print("Error of status",datas['infocode'])
# with open("record.json","w") as f:
# json.dump(all_datas,f)
# print("加载入文件完成...")
def plot_show(pds_dict):
ShangHai = geopandas.GeoDataFrame(pds_dict)
# ShangHai.to_file("shanghai.shp")
# ShangHai = geopandas.read_file("shanghai.shp")
ShangHai.plot(column='speed', cmap='RdYlGn', legend=True)
plt.figure(dpi=400)
plt.show()
def save_to_file(data):
datas = geopandas.GeoDataFrame(data)
ti = "Shanghai_" + str(
str(time.localtime()[1]) + '_' + str(time.localtime()[2]) + '_' +
str(time.localtime()[3]))
datas.to_file(ti,encoding='utf-8')
2. 数据处理
比较棘手的一点就是高德并没有对应的路网信息给我们进行查询,而且里面的路网信息每次传递的时候也不是一致的,因此需要对传递回来的路段进行匹配,然后进行对的方法研究,主要是对利用拆分的思想对其进行分割,利用已有的点去得到并没有的点的信息。然后将路段信息存储到.shapfile中
这里可以使用 geopandas对其进行处理,直接使用plot就可以得到比较好的数据
2.1 Pandas 处理笔记
这部分真的烦死我了,很多看起来很简单的操作都还是不会,还是需要好好学习一下。
将数据存放在csv文件中,然后可以通过pandas的groupby函数对其进行分析和画图
2.2 Pyecharts 可视化笔记
这部分,其实比较简单,但是刚开始还是会遇到一些错。
官方文档如下:https://pyecharts.org/#/zh-cn/intro
我主要把柱状图,还有折线图进行了实现
1
2
3
4
5
6
7
8
9
def bar_base(name_y, x, y, title=None, subtitle=None) -> Bar:
l = (
Bar()
.add_xaxis(x)
.add_yaxis(name_y[0],y[0])
.add_yaxis(name_y[1], y[1])
.add_yaxis(name_y[2], y[2])
.set_global_opts(title_opts=opts.TitleOpts(title=title))
)
def line_base(name_y, x, y, y_c, number = 0,title=None, subtitle=None) -> Line:
if number != 0:
y = [i + number for i in y]
y_c = [i + number for i in y_c]
l = (
Line()
.add_xaxis(x)
.add_yaxis(name_y[0], y ,is_smooth=True,
markline_opts=opts.MarkLineOpts(
data=[opts.MarkLineItem(type_="average")]),)
.add_yaxis(name_y[0]+"_congestion", y_c,is_smooth=True,
markline_opts=opts.MarkLineOpts(
data=[opts.MarkLineItem(type_="average")]),)
# .set_series_opts(
# areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
# label_opts=opts.LabelOpts(is_show=False),
# )
# .set_global_opts(
# title_opts=opts.TitleOpts(title=title),
# xaxis_opts=opts.AxisOpts(
# axistick_opts=opts.AxisTickOpts(is_align_with_label=True),
# is_scale=False,
# boundary_gap=False,
# ),
# )
)
# s = (
# Scatter()
# .add_xaxis(x)
# .add_yaxis(name_y[0], y_c)
# .set_global_opts(
# title_opts=opts.TitleOpts(title="Scatter-VisualMap(Color)"),
# visualmap_opts=opts.VisualMapOpts(max_=150),
# )
# )
# l.overlap(s)
return l
2.3 Folium 地图可视化
主要是对point进行集合选定,然后就使用map将这些经纬度的点连接起来。最后返回一个html进行展示
def get_Road_info(lcode):
route = []
avg_lat,avg_lon =0,0
count = 0
for code in lcode:
try :
s = Roads[Roads['Lcode'] == code]
for m in s['geometry'].values:
q = list(m.coords)
count += len(q)
for i in q:
avg_lat += i[0]
avg_lon += i[1]
route.append([i[1],i[0]])
except:
print("Not Found",code)
avg_lat = avg_lat / count
avg_lon = avg_lon / count
return route,avg_lat,avg_lon
def line_map(all_data,x,y):
line_map = folium.Map(location=[y, x],
zoom_start=13,)
folium.PolyLine(all_data,
weight=5, # 粗细
opacity=0.8, # 透明度
color='orange').add_to(line_map)
return line_map
打开的html
3. 数据案例分析
查看11-26号 上海市抚顺路附近的拥堵发生和演变情况