数据集笔记:Uber Movement (Speed)【python 处理数据集至时空矩阵】

news2024/11/28 0:42:07

Uber Movement: Let's find smarter ways forward, together.

以伦敦威斯敏斯特的一个小区域为例

1 导入库

import osmnx as ox
import pandas as pd

2 读入数据

这里选取了6个月的数据

df1=pd.read_csv('movement-speeds-hourly-london-2019-10.csv.zip')
df2=pd.read_csv('movement-speeds-hourly-london-2019-11.csv.zip')
df3=pd.read_csv('movement-speeds-hourly-london-2019-12.csv.zip')
df4=pd.read_csv('movement-speeds-hourly-london-2020-1.csv.zip')
df5=pd.read_csv('movement-speeds-hourly-london-2020-2.csv.zip')
df6=pd.read_csv('movement-speeds-hourly-london-2020-3.csv.zip')

合并成一块

df=pd.concat([df1,df2,df3,df4,df5,df6])

3 导入提取区域的open street map

G1=ox.graph_from_point((51.499998, -0.1333328), dist=500,network_type='drive')
ox.plot.plot_graph(G1)

 

 这是威斯敏斯特的一小部分:

edge_color_lst=[]
G2 = ox.graph_from_place('Westminster', network_type='drive')
for i in G2.edges():
    if i in G1.edges:
        edge_color_lst.append('red')
    else:
        edge_color_lst.append('black')
ox.plot.plot_graph(G2,edge_color=edge_color_lst,figsize=(100,25))

 

 

3.1 从OpenStreeetMap中提取 node和edge的GeoDataFrame

nodes, edges = ox.graph_to_gdfs(G1, nodes=True, edges=True)
nodes

nodes['osmid'] = nodes.index.values
#nodes添加一列 osmid

edges['osmid'] = edges.osmid.map(lambda x: x if isinstance(x, list) else [x])
#edges的osmid都变成list

u, v, _ = list(zip(*edges.index))
'''
目前edges的index是

MultiIndex([(    108094,    25632144, 0),
            (    108094,   610884816, 0),
            (    108097,      108293, 0),
            (    108097,      109849, 0)],
           names=['u', 'v', 'key'], length=284)

上面这一行代码的作用是把u,v,key分离出来
'''

edges["u"] = u
edges["v"] = v
edges['id'] = np.arange(edges.shape[0])
edges.set_index('id', inplace=True, drop=False)
#将id作为edges的活跃列(从0开始的数字)

3.2 获取OSM对应的邻接矩阵(边之间的邻接矩阵)

triple = pd.concat([pd.DataFrame({'id': edges.id, 'u': edges.u, 'v': edges.v}),
                        pd.DataFrame({'id': edges.id, 'u': edges.v, 'v': edges.u})],
                       ignore_index=True)
triple
#从u射出来的边/从v射出来的边

 

#一条边两个方向
pairs = []
for (_, g) in triple.groupby('u'):
        pairs += [(u, v) for u in g.id for v in g.id if u != v]
for (_, g) in triple.groupby('v'):
        pairs += [(u, v) for u in g.id for v in g.id if u != v]
#同时从一个点出发\同时到达一个点的边

G = Graph()
G.add_edges_from(pairs)
#根据点对关系确定图

import networkx as nx
nx.laplacian_matrix(G)
#获得拉普拉斯矩阵

 

pairs那边,做一个解释
for (a,b) in triple.groupby('u'):
    print(a)
    print('*'*100)
    print(b)
    print('*'*100)
    print(b.id)
    break
'''
108094
****************************************************************************************************
      id       u           v
0      0  108094    25632144
1      1  108094   610884816
466  182  108094    25632144
506  222  108094  1782020093
****************************************************************************************************
0        0
1        1
466    182
506    222
Name: id, dtype: int32
'''

这里把每一条边看成“新图”的“点”,如果两条边在原图中有一个共同的交点,那么他们在新图中就是相邻的点

我们分别根据射出点u和射入点v进行groupby,那么每条groupby的结果,第一项就是u/v,第二项的id就是每个点所连接的边的id。

 

4 根据OpenstreetMap过滤GeoDataFrame

4.1 首末节点是否在nodes里面

sdf = df[df.osm_start_node_id.isin(nodes.osmid)&df.osm_end_node_id.isin(nodes.osmid)].copy()

sdf

 只选择首尾边在openstreet map 中的GeoDataFrame(可以发现item数量少了很多)

sdf.drop(["segment_id", "start_junction_id", "end_junction_id"], axis=1, inplace=True)
#丢弃这三列

4.2 首末节点和osmid,三个item唯一决定了一条路径

edgeidmap = {(u, v): (osmid, edgeid) for (u, v, osmid, edgeid) in 
                 zip(edges.u, edges.v, edges.osmid, edges.id)}
edgeidmap
'''
{(108094, 25632144): ([4255600], 0),
 (108094, 610884816): ([48046842, 416441990], 1),
 (108097, 108293): ([4258085], 2),
 (108097, 109849): ([39547935], 3),
 (108097, 108299): ([1106511807, 39547935], 4),
 (108102, 25378086): ([102950257], 5),
 (108102, 25378077): ([102950257], 6),
 (108103, 25378086): ([102950257], 7),
...
)}
'''
#辅助函数:根据u和v(起止节点),判断是否有对应的osmid,有的话返回edgeid
def getedgeid(u,v,osmid):
    osmid_tmp,edgeid_tmp=edgeidmap.get((u,v),[-1],-1)
    #根据起止节点id,找寻对应的osmid和edgeid(如果没有返回-1)
    if(osmid in osmid_tmp):
        #表示起止节点id,对应的osmid三个可以唯一确定一个节点
        return edgeid_tmp
        #此时就返回这个节点的id
    else:
        return -1
        '''
        osmid_tmp=[-1] 表示根据起止节点找不到对应的osmid
        osmid不在osmid_tmp中,三者没法确定一段edge
        '''
sdf['edgeid']=sdf[['osm_start_node_id', 'osm_end_node_id', 'osm_way_id']].apply(lambda x:getedgeid(*x),axis=1)
sdf = sdf[sdf.edgeid >= 0]
sdf
'''
剔除掉:
1,起止节点在edges中找不到对应的osmid
2,起止节点和osmid和edges中的这三项并不是完美匹配
'''

 item更少了

5 转化成时空矩阵

sdf['datetime'] = sdf[['year', 'month', 'day', 'hour']].apply(lambda x: datetime(*x), axis=1)
##每一行的年月日小时合并(eg,2019-07-01 14:00:00)

sdf= sdf[['edgeid', 'datetime', 'speed_mph_mean']].set_index(['edgeid', 'datetime'])
sdf

 

import xarray as xa
x=xa.DataArray.from_series(sdf.speed_mph_mean)
#将DataFrame的内容转换成时空矩阵
x

 此时edgeid和datatime虽然都是递增的,但是此时edgeid的数量是比open street map中的要小

len(x.edgeid),edges.shape[0]
#(176, 284)

所以把缺失的边的数据用nan补进来

missed_edges = np.setdiff1d(np.arange(edges.shape[0]), x.edgeid.values)
#一直没有出现过的边id

z = xa.DataArray(np.float32(np.nan), [('edgeid', missed_edges), 
                                          ('datetime', x.datetime.values)])

##一直没有出现过的边id组成的时空矩阵,数据都是NaN

x = xa.concat([x, z], dim='edgeid').rename({'edgeid': 's', 'datetime': 't'})
#两个DataArray 拼起来


x.sel(s=np.arange(edges.shape[0]))
##上面虽然合并了,但是edgeid的顺序不是从小到大排的,这里sel相当于重新排序

 

arr=x.sel(s=np.arange(edges.shape[0])).values
arr

import numpy as np
np.save('London_6mon.npy',arr)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/331638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据---浅谈Hadoop工作原理

浅谈Hadoop工作原理 文章目录浅谈Hadoop工作原理Hadoop核心组件HDFS读写原理HDFS读文件HDFS写文件MapReduce原理Map流程Reduce流程Shuffle机制(无序--->有序)Hadoop核心组件 Hadoop HDFS(分布式存储系统):解决海量数据存储 Hadoop YARN(集…

target31对传感器采样率限制

target31谷歌做了一些列的适配,其中对看似无关紧要的传感器采用率做了限制,最近几年很火的摇一摇开屏广告就是基于传感器去实现的。这篇文章,我们就一起去看一下target31对传感器采样频率的限制。 一、背景 先说一下背景:近期&am…

使用 QuTrunk+Amazon Deep Learning AMI(TensorFlow2)构建量子神经网络

量子神经网络是基于量子力学原理的计算神经网络模型。1995年,Subhash Kak 和 Ron Chrisley 独立发表了关于量子神经计算的第一个想法,他们致力于量子思维理论,认为量子效应在认知功能中起作用。然而,量子神经网络的典型研究涉及将…

103-并发编程详解(下篇)

这里还是续写上一章博客 线程池与Future: 线程池的实现原理: 下图所示为线程池的实现原理:调用方不断地向线程池中提交任务,线程池中有一组线程,不断地从队列中取 任务,这是一个典型的生产者—消费者模型…

python基于django的高校招生管理系统

目录 1 绪论 1 1.1课题背景 1 1.2课题研究现状 1 1.3初步设计方法与实施方案 2 1.4本文研究内容 2 2 系统开发环境 4 2.1 使用工具简介 4 2.2 环境配置 4 2.3 B/S结构简介 4 2.4 MySQL数据库 5 2.5 框架介绍 5 3 系统分析 6 3.1系统可行性分析 6 3.1.1经济可行性 6 3.1.2技术可…

Linux驱动开发基础__mmap

目录 1 引入 2 内存映射现象与数据结构 3 ARM 架构内存映射简介 3.1 一级页表映射过程 3.2 二级页表映射过程 4 怎么给 APP 新建一块内存映射 4.1 mmap 调用过程 ​编辑4.2 cache 和 buffer 4.3 驱动程序要做的事 5 编程 5.1 app编程 5.2 hello_drv_test…

操作符——“C”

各位CSDN的uu们你们好呀,今天,总算是要到我们的操作符啦,在C语言中,操作符是一个极为复杂的东西,下面,就让我们进入操作符的世界吧 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符…

Spring Data JPA和Mybatis介绍

上一篇博客中简要介绍了如何通过Spring Data JPA操作数据库,并提供了Demo,从Demo中可以看到,Spring data JPA提供了很多Repository,继承这些Repository或者直接使用Repository中提供的方法,即可对数据进行增删改查操作…

【刷题笔记】--二叉搜索树--查找,插入

二叉搜索树的性质: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。两道力扣题:①查找二叉搜索树中的某个根节点。②在二叉搜索树中插入某个结点 题目①leedcode700&#x…

大数据技术架构(组件)26——Spark:Shuffle

2.1.6、Shuffle2.1.6.0 Shuffle Read And WriteMR框架中涉及到一个重要的流程就是shuffle,由于shuffle涉及到磁盘IO和网络IO,所以shuffle的性能直接影响着整个作业的性能。Spark其本质也是一种MR框架,所以也有自己的shuffle实现。但是和MR中的shuffle流程…

九龙证券|军工股全线走强!中航电测又涨停,这一板块所有个股都在涨

今天早盘,A股全体低开高走,到午间收盘,主要股指均红盘报收,两市成交仍旧低迷。 盘面上,国防军工、酒店餐饮、芯片、钙钛矿电池等板块涨幅居前,文教休闲、锂矿、水产品、供销社等板块跌幅居前。北上资金净流…

使用openai-whisper 语音转文字

前言:最近由于ChatGPT 的大热,AI 应用领域再次进入大众的视线,今天介绍一款AI应用whisper 可以较为准确的将人声转换为文字(支持多国语言)一、安装安装有两种方式pip 和源码编译安装,这里介绍pip安装方式安…

尚医通(八) Nginx

目录一、项目中的服务地址二、配置nginx反向代理1、安装window版的nginx2、配置nginx代理3、重启nginx4、测试三、配置开发环境1、修改文件内2、重启前端程序一、项目中的服务地址 只有一个api地址的配置位置,而我们实际的后端有很多微服务,所以接口地址…

C#【必备技能篇】序列化与反序列化(json、xml、二进制文件)

文章目录一、序列化为json1、序列化与反序列化【基本使用】实例代码:2、封装成泛型方法【可以公用】实例代码:二、序列化为xml1、序列化与反序列化【基本使用】实例代码:2、封装成泛型方法【可以公用】实例代码:三、序列化为二进制…

Windows sshfs挂载远程文件夹

Windows sshfs挂载远程文件夹 Windows系统通过sshfs,远程挂载文件服务,实现远程文件夹共享的功能 目录 Windows sshfs挂载远程文件夹 1.安装WinFsp 2.安装SSHFS-Win 3.挂载Linux文件服务 4.断开Linux文件服务 1.安装WinFsp 下载地址:…

Vue3配置路由(vue-router)

文章目录前言一、配置路由(vue-router)1、安装路由2、新建页面3、创建路由配置文件4.特殊报错!前言 紧接上篇文章,vue3的配置与vue2是有所差别的,本文就讲述了如何配置,如果本文对你有所帮助请三连支持博主…

2023-02-09 Elasticsearch 模糊搜索

1 prefix 前缀搜索 以前缀开头的搜索,不计算相关度得分 前缀搜索匹配的是term,而不是field。 前缀搜索的性能很差 前缀搜索没有缓存 前缀搜索尽可能把前缀长度设置的更长 针对于中文分词器 index_prefixes: 默认 “min_chars” : 2, “max_chars” : …

CMMI落地常见4大问题及改进措施

(一)、CMMI落地常见的4大问题: 1、组织成员并非全部认可与参与 在CMMI推行过程中,过程改进小组EPG负责整个改进工作,但组织其他成员并不是全部认可和自愿参与,甚至有些成员认为与自己无关。从而造成EPG在推…

Spring-Data-Jpa实现继承实体类

写在前面:从2018年底开始学习SpringBoot,也用SpringBoot写过一些项目。现在对学习Springboot的一些知识总结记录一下。如果你也在学习SpringBoot,可以关注我,一起学习,一起进步。 相关文章: 【Springboot系…

ZooKeeper 避坑实践: Zxid溢出导致选主

作者:子葵 背景 线上 flink 用户使用 ZooKeeper 做元数据中心以及集群选主,一些版本的 flink 在 ZooKeeper 选主时,会重启 Job,导致一些非预期的业务损失。而 ZooKeeper 在 zxid溢出时,会主动触发一次选主&#xff0…