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

news2024/12/22 18:11:37

 单条轨迹的处理: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')

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

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

相关文章

golang游戏服务器 - tgf系列课程06

游戏配置 使用框架提供的游戏配置工具,只要两步,开箱即用需求描述 沿用上一节课的案例, 创建道具表,通过道具id在道具服中获取配置中道具的名称Excel 创建配置表根据项目文档中进阶教程目录下ExcelToJson的教程文档,创建指定格式的Excel文件. 脚本 生成脚本 func main() {//…

luceda ipkiss教程 48:求线路中波导的总长度

当线路中有多条波导时&#xff0c;可以一次输出所有波导的总长度&#xff1a; 如&#xff1a; 代码如下&#xff1a; from si_fab import all as pdk from ipkiss3 import all as i3class MZI_Lattice(i3.Circuit):mmi i3.ChildCellProperty()mmi_spacing i3.PositiveNumb…

C++ 对象的初始化和清理:构造函数和析构函数

目录 构造函数和析构函数 构造函数 析构函数 构造函数的分类及调用 括号法 显示法 隐式转换法 拷贝构造函数的调用时机 使用一个已经创建完毕的对象来初始化一个新对象 值传递的方式给函数参数传值 以值方式返回局部对象 构造函数调用规则 初始化列表 类对象作…

JAVA:深入了解Java中的Synchronized关键字

1、简述 在Java中&#xff0c;多线程编程是一项常见的任务&#xff0c;然而&#xff0c;它也伴随着一系列潜在的问题&#xff0c;比如竞态条件&#xff08;Race Condition&#xff09;和数据不一致性。为了解决这些问题&#xff0c;Java提供了一种同步机制&#xff0c;即synch…

项目一:IIC读写EEPROM AT24C02

回头想了想在工作中调过的EEPROM还挺多的&#xff0c;有M24M02 、M28010 、AT24C02等&#xff0c;今天讲一下AT24C02吧 一、AT24C02简介 1.1 特点 文档已经上传了&#xff0c;需要的同学可以自行下载哈&#xff0c;晚点我会把下载链接附上来。 我大概照着文档翻译了一下&am…

总线一:I2C简介(介绍看这一篇就够啦)

本节主要介绍以下内容&#xff1a; I2C协议简介 STM32的I2C特性及架构 I2C初始化结构体详解 一、I2C协议简介 I2C 通讯协议(Inter&#xff0d;Integrated Circuit)是由Phiilps公司开发的&#xff0c;由于它引脚少&#xff0c;硬件实现简单&#xff0c;可扩展性强&#xff…

2000-2021年全国各省环境规制水平数据

2000-2021年全国各省环境规制水平数据 1、时间&#xff1a;2000-2021年 2、范围&#xff1a;30省市 3、指标&#xff1a;工业污染治理完成投资、工业增加值、环境规制强度 4、计算说明&#xff1a;环境规制工业污染治理完成投资/工业增加值 5、来源&#xff1a;国家统计局…

LLM之RAG理论(一)| CoN:腾讯提出笔记链(CHAIN-OF-NOTE)来提高检索增强模型(RAG)的透明度

论文地址&#xff1a;https://arxiv.org/pdf/2311.09210.pdf 检索增强语言模型&#xff08;RALM&#xff09;已成为自然语言处理中一种强大的新范式。通过将大型预训练语言模型与外部知识检索相结合&#xff0c;RALM可以减少事实错误和幻觉&#xff0c;同时注入最新知识。然而&…

Linux - 进程间通信(中)- 管道的应用场景

前言 在上篇博客当中&#xff0c;对Linux 当中的进程通信&#xff0c;做了详细阐述&#xff0c;主要是针对父子进程的通信来阐述的同时&#xff0c;也进行了模拟实现。 对于管道也有了初步了解&#xff0c;但是这仅仅是 进程间通信的一部分&#xff0c;Linux 当中关于进程间通…

散点图,盒须图,折线图混放在一个echarts

散点图&#xff0c;何须图&#xff0c;折线图混放在一个echarts option {tooltip: {trigger: axis,axisPointer: {type: cross,crossStyle: {color: #999}}},legend: {data:[盒须图1,盒须图2,折线图,散点图]},xAxis: [{type: category,data: [周一,周二,周三,周四,周五,周六…

智能优化算法应用:基于萤火虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于萤火虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于萤火虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.萤火虫算法4.实验参数设定5.算法结果6.参考文…

官宣 | HelpLook已入驻企业微信应用市场

HelpLook正式入驻企业微信第三方应用市场。 HelpLook支持自定义域名与AI站内搜索&#xff0c;能够帮助企业微信用户搭建所见即所得的企业知识库、产品帮助中心、用户手册、企业博客。 | 怎么找到HelpLook并开始使用 在企业微信的第三方应用就可直接搜索HelpLook&#xff0c;添…

mysql数据库损坏后重装,数据库备份

重装 先卸载 sudo apt-get remove --purge mysql-server mysql-client mysql-common sudo apt-get autoremove sudo apt-get autoclean 然后重新安装MySQL: sudo apt-get install mysql-server mysql-client 首先要先使用无密码登录数据库一定要使用 sudo mysql -uroo…

新手上路:盘点「性能测试」必须掌握的技术点

前段时间&#xff0c;有一些小伙伴提出希望我们推送点性能测试的技术干货。所以&#xff0c;小编今天通过上网查资料&#xff0c;结合项目实操过程中的一些问题&#xff0c;总结了一些关于性能测试的内容&#xff0c;希望是大家想要了解的内容哈。 1、性能测试的目的 首先&am…

分布式环境认证和授权-基于springboot+JWT+拦截器实现-实操+源码下载

1、功能概述&#xff1f; 1、当用户登录的时候&#xff0c;将用户的信息通过JWT进行加密和签名&#xff0c;并将JWT产生了token信息保存到当前浏览器的localStoragee中,即本地存储中。 2、当用户登录成功后&#xff0c;访问其他资源的时候&#xff0c;程序从localStorage中获…

linux(4):linux基础命令第三弹

在linux基础命令第二弹中http://t.csdnimg.cn/JPNYY我们讲了有关路径&#xff0c;创建目录和文件、文件夹&#xff0c;以及如何查看文件内容的问题&#xff0c;第三弹我们将学习有关文件操作和查找以及过滤关键字、展示文件字节&#xff0c;行数的命令&#xff0c;还有一个很重…

【程序员的自我修养04】目标文件生成可执行文件过程

绪论 大家好&#xff0c;欢迎来到【程序员的自我修养】专栏。正如其专栏名&#xff0c;本专栏主要分享学习《程序员的自我修养——链接、装载与库》的知识点以及结合自己的工作经验以及思考。编译原理相关知识本身就比较有难度&#xff0c;我会尽自己最大的努力&#xff0c;争…

.Net中的集合

所有的集合都是继承自IEnumerable。集合总体可以分为以下几类&#xff1a;关联/非关联型集合&#xff0c;顺序/随机访问集合&#xff0c;顺序/无序集合&#xff0c;泛型/非泛型集合&#xff0c;线程集合。 各集合类底层接口关系图 泛型与非泛型集合类的分析 泛型集合是类型安…

自动化测试基础知识:什么是自动化测试?需要学习哪些知识与工具!

1、自动化测试概念 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常&#xff0c; 在设计了测试用例并通过评审之后&#xff0c;由测 试人员根据测试用例中描述的规程一步步执行测试&#xff0c;得到实际结果与期望结果的比较。简言之&#xff0c;自动化测试…

【操作系统导论】比例份额调度

本文介绍一种 比例份额&#xff08;proportional-share&#xff09; 调度程序&#xff0c;也称为 公平份额&#xff08;fair-share&#xff09;。 彩票调度 简介 彩票调度 的基本思想&#xff1a; 每隔一段时间&#xff0c;都会举行一次彩票抽奖&#xff0c;以确定接下来应该…