geolife 笔记:将所有轨迹放入一个DataFrame

 单条轨迹的处理:geolife笔记:整理处理单条轨迹-CSDN博客

 1 加载数据

import pandas as pd
import numpy as np
import datetime as dt
import os

data_dir = 'Geolife Trajectories 1.3/Data/'

1.1 列出所有文件夹

dirlist = os.listdir(data_dir)
dirlist
'''
['133',
 '079',
 '173',
 '020',
 '003',
 '004',
 '014',
 '074',
...
'''

1.2 拼接出所有绝对路径

folder_dirs = []
for dir in dirlist:  
  folder_dirs.append(data_dir + '/' + dir+'/'+'Trajectory')
folder_dirs
'''
['data/Geolife Trajectories 1.3/Data//133/Trajectory',
 'data/Geolife Trajectories 1.3/Data//079/Trajectory',
 'data/Geolife Trajectories 1.3/Data//173/Trajectory',
 'data/Geolife Trajectories 1.3/Data//020/Trajectory',
 'data/Geolife Trajectories 1.3/Data//003/Trajectory',
...
'''

1.3 列出所有文件

file_dirs=[]
for dir in folder_dirs:
    for file in os.listdir(dir):
        file_dirs.append(dir+'/'+file)
len(file_dirs),file_dirs
'''
(18670,
 ['data/Geolife Trajectories 1.3/Data//133/Trajectory/20110130143621.plt',
  'data/Geolife Trajectories 1.3/Data//133/Trajectory/20110419143237.plt',
  'data/Geolife Trajectories 1.3/Data//133/Trajectory/20110421082008.plt',
  'data/Geolife Trajectories 1.3/Data//133/Trajectory/20110420024807.plt',
...
'''

2  读取所有文件,并拼接到一个DataFrame中

2.1 计算haversine距离的函数

def haversine_distance(lat1, lon1, lat2, lon2):
    R = 6371  # Earth radius in kilometers
    dlat = np.radians(lat2 - lat1)
    dlon = np.radians(lon2 - lon1)
    a = np.sin(dlat/2) * np.sin(dlat/2) + np.cos(np.radians(lat1)) * np.cos(np.radians(lat2)) * np.sin(dlon/2) * np.sin(dlon/2)
    c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1-a))
    return R * c

2.2 读取文件

所有对应的操作都在单条轨迹处理中已经说明

import pandas as pd
import numpy as np
traj=pd.DataFrame()
traj
num=0
for file in file_dirs:
    #read data:
    data = pd.read_csv(file,
                   header=None, 
                   skiprows=6,
                   names=['Latitude', 'Longitude', 'Not_Important1', 'Altitude', 'Not_Important2', 'Date', 'Time'])
    '''
    merge date and time
    '''
    data['Datetime'] = pd.to_datetime(data['Date'] + ' ' + data['Time'])
    data=data[['Latitude', 'Longitude', 'Altitude', 'Datetime']]

    '''
    retain positions in Beijing city
    '''
    data=data[(data['Latitude']>B1[0]) & (data['Latitude']<B2[0]) & (data['Longitude']>B1[1]) & (data['Longitude']<B2[1])] 

    '''
    time gap to 5s, and remain first record every 5s
    '''
    data['Datetime_5s']=data['Datetime'].dt.floor('5s')
    data=data.drop_duplicates(subset=['Datetime_5s'],keep='first')

    '''
    remove stopping point
    '''
    data['is_moving'] = (data['Latitude'] != data['Latitude'].shift()) | (data['Longitude'] != data['Longitude'].shift())
    data=data[data['is_moving']==True]
    data=data[['Latitude','Longitude','Datetime_5s']]


    '''
    split trajs without records in 10min into 2 trajs (and update id)
    '''
    data['time_diff']=data['Datetime_5s'].diff()
    data['split_id']=0
    mask=data['time_diff']>pd.Timedelta(minutes=10)
    data.loc[mask,'split_id']=1
    data['split_id']=data['split_id'].cumsum()

    
    data['id']=str(num)
    num+=1
    data['id']=data['id']+'_'+data['split_id'].astype(str)


    '''
    calc each traj's length, filter out short trajs and truncate long ones
    '''
    #calculate nearby location's lon and lat gap
    lat_lon_diff = data.groupby('id',group_keys=False).apply(lambda group: group[['Latitude', 'Longitude']].diff())
    #calc nearby locationn's distance
    distance = lat_lon_diff.apply(lambda row: haversine_distance(row['Latitude'], row['Longitude'], 0, 0), axis=1)
    data['distance']=distance
    #calculate each id's accumulated distance
    data['accum_dis']=data.groupby('id')['distance'].cumsum()
    #split those trajs longer than 10km into 2 trajs
    data['split_traj_id']=data['accum_dis']//10
    data['split_traj_id']=data['split_traj_id'].fillna(0)
    data['split_traj_id']=data['split_traj_id'].astype(int).astype(str)
    #get new id
    data['id']=data['id']+'_'+data['split_traj_id']
    #remove those shorter than 1km
    iid=data.groupby('id')['accum_dis'].max()
    iid=iid.reset_index(name='distance')
    iid=iid[iid['distance']>1]
    data=data[data['id'].isin(iid['id'])]


    '''
    filter trajs shorter than 10  records
    '''
    iid=data.groupby('id').size()
    iid=iid.reset_index(name='count')
    iid=iid[iid['count']>=10]
    data=data[data['id'].isin(iid['id'])]

    '''
    remove 'staypoints'
    '''
    latlon=pd.DataFrame()
    latlon['max_lat']=data.groupby('id')['Latitude'].max()
    latlon['min_lat']=data.groupby('id')['Latitude'].min()
    latlon['max_lon']=data.groupby('id')['Longitude'].max()
    latlon['min_lon']=data.groupby('id')['Longitude'].min()
    latlon['max_dis']=latlon.apply(lambda row: haversine_distance(row['max_lat'],row['max_lon'],row['min_lat'],row['min_lon']),axis=1)
    latlon=latlon[latlon['max_dis']>=1]


    data=data[data['id'].isin(latlon.index)]
    data=data[['Latitude','Longitude','Datetime_5s','id']]
    #print(data)
    traj=pd.concat([traj,data])
traj

2.3 保存文件

traj.to_csv('geolife_processed.csv')

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Qt开发的闹钟

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);speecher new QTextToSpeech(this); }Widget::~Widget() {delete ui; }//定时器超时时&#xff0c;自动执行的…

Ubuntu22.04中用户的全名

概要&#xff1a; 用户的全名有别于用户名username username可以理解为账户名&#xff0c;或者说用户ID&#xff0c;用于确定身份&#xff0c;显然是必需的 用户全名则不是必需的&#xff0c;用户全名也叫做注释&#xff0c;是一种辅助信息&#xff0c;如果没有填写用户全名…

docker 资源控制

Docker的资源控制 对容器使用宿主机的资源进行限制&#xff0c;如cpu&#xff0c;内存&#xff0c;磁盘I/O Docker使用linux自带的功能cgroup(control grouos)是linux内核系统提供的一种可以限制&#xff0c;记录&#xff0c;隔离进程组使用的物理资源 Docker借助这个机制&…

MySQL执行流程_执行一条select语句,期间发生了什么

文章目录 执行一条select语句&#xff0c;期间发生了什么MySQL执行流程第一步&#xff1a;连接器第二步&#xff1a;查询缓存第三步&#xff1a;解析SQL第四步&#xff1a;执行SQL 执行一条select语句&#xff0c;期间发生了什么 MySQL执行流程 server层负责建立连接、分析和执…

Banana Pi BPI-R4 SBC/路由器推出,带双 10G SFP+ 端口+Wifi7支持

Banana Pi BPI-R4 wifi7路由器开发板 香蕉派 Banana Pi BPI-R4 根据著名Banana Pi品牌背后的公司Sinovoip提供的初步信息&#xff0c;他们即将推出的Banana Pi BPI-R4路由器板目前已经正式发售。与之前的 Banana Pi R3 板相比&#xff0c;这在规格上将有显着提升。这就是我们…

99基于matlab的小波分解和小波能量熵函数

基于matlab的小波分解和小波能量熵函数&#xff0c;通过GUI界面导入西储大学轴承故障数据&#xff0c;以可视化的图对结果进行展现。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 99小波分解和小波能量熵函数 (xiaohongshu.com)https://www.xiaohongshu.co…

【离散数学】——期末刷题题库( 二元关系)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

eclipse的日志文件放在什么位置

eclipse的日志文件放在<workspace的目录>/.metadata目录下面&#xff0c;例如&#xff1a;

Java基础语法之访问修饰限定符

private 表示私有的&#xff0c;只能在同一个包中的同一个类使用 像这样就是在同一个包中的不同类用了private修饰的变量&#xff0c;这是非法的&#xff0c;那到底该如何给a赋值呢&#xff1f;可以在定义时就赋值&#xff0c;但这样的代码就没有可操作性&#xff0c;所以我们…

Nginx的location匹配和rewrite重写

一、location匹配 常用的正则表达式 ^ &#xff1a;匹配输入字符串的起始位置 $ &#xff1a;匹配输入字符串的结束位置 * &#xff1a;匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”&#xff1a;匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll…

java--HashMap、LinkedHashMap、TreeMap底层原理

1.HashMap集合的底层原理 ①HashMap跟HashSet的底层原理是一模一样的&#xff0c;都是基于哈希表实现的。 ②实际上&#xff1a;原来学的Set系列集合的底层原理就是基于Map实现的&#xff0c;只是Set集合中的元素只要键数据&#xff0c;不要值数据而已。 2.哈希表 ①JDK8之前…

原创度检测,在线文章原创度检测

原创度检测&#xff0c;作为数字时代中内容创作者和学术界广泛关注的话题&#xff0c;正逐渐成为保障知识产权、促进创新发展的不可或缺的工具。今天&#xff0c;我们将深入介绍原创度检测的定义、意义、技术原理、应用领域以及未来趋势。 一、什么是原创度检测&#xff1f; 原…

社区分享|宋月冉:大数据下的联邦学习隐私安全问题

“隐语”是开源的可信隐私计算框架&#xff0c;内置 MPC、TEE、同态等多种密态计算虚拟设备供灵活选择&#xff0c;提供丰富的联邦学习算法和差分隐私机制 开源项目 github.com/secretflow gitee.com/secretflow 本文根据隐语开源社区 Contributor 西安电子科技大学网络与信息…

Gemini与GPT-4的巅峰对决:AI界的双壁之战

随着人工智能技术的飞速发展&#xff0c;AI领域的竞争越来越激烈。在这个充满挑战与机遇的时代&#xff0c;两个备受瞩目的AI巨头——Gemini Pro和GPT-4&#xff0c;成为了人们关注的焦点。这两者都以其强大的功能和卓越的性能&#xff0c;引领着AI领域的发展潮流。本文将详细介…

【Android】完美解决Cannot resolve method ‘subscribe(Observer<T>)‘

问题截图&#xff1a; 解决方法&#xff1a; 如上图&#xff0c;看我标123的三个地方&#xff0c;2标注的地方提示我们我方法实际返回的值是Observer<Res_GetCellCode>,而我想要返回的结果是&#xff1a;3标记的结果&#xff1a;Observer<Res_QueryCTInfo>&#xf…

做为一个产品经理带你了解Axure元件

1. Axure元件简介 2.基本元件 2.1 矩形 2.2 图片 2.3 占位符 2.4 按钮 2.5 标题 ​编辑 2.6 水平线&#xff0c;垂直线 2.7 热区 3.表单元件及表格元件简介 3.1 表单元件简介 3.2 表格元件简介 4.表单案例 4.1 登录界面的制作 4.2 个人简介的制作 1. Axure元件简…

简单自动弃流装置工作原理

电动弃流装置 规格分为&#xff1a;直通式&#xff08;不锈钢外壳&#xff09;、三通式&#xff08;不锈钢外壳&#xff09;、井座式&#xff08;PE外壳&#xff09; 1、直通式规格型号&#xff1a;LLQLKZ-200、LLQLKZ-300、LLQLKZ-400 2、三通式规格型号&#xff1a;LLQLK-…

搭建个人博客攻略

文章目录 碎碎念一、下载 g i t git git 和 N o d e . j s Node.js Node.js二、安装 h e x o hexo hexo 1. 1. 1.在非 C C C 盘新建一个文件夹 b l o g blog blog&#xff0c;右键打开 g i t b a s h git bash gitbash 2. 2. 2.在 g i t git git 创建文件 hexo 3. 3. 3.he…

【SpringBoot】分层解耦

1. 三层架构 Controller&#xff1a;控制层。接收前端发送的请求&#xff0c;调用Service层来进行逻辑处理&#xff08;Service层处理完后&#xff0c;把处理结果返回给Controller层&#xff09;Service&#xff1a;业务逻辑层。处理具体的业务逻辑。调用Dao层&#xff08;逻辑…

现代物流系统的分析与设计

目 录 引言 3一、系统分析 4 &#xff08;一&#xff09;需求分析 4 &#xff08;二&#xff09;可行性分析 4 二、 总体设计 4 &#xff08;一&#xff09;项目规划 4 &#xff08;二&#xff09;系统功能结构图 5 三、详细设计 6 &#xff08;一&#xff09;系统登录设计 6 …