论文辅助笔记:处理geolife数据

论文笔记:Context-aware multi-head self-attentional neural network model fornext location prediction-CSDN博客

 对应命令行里

    python preprocessing/geolife.py 20

这一句

1 读取geolife数据

pfs, _ = read_geolife(config["raw_geolife"], print_progress=True)

2  生成staypoint 数据

根据geolife数据,使用滑动窗口的方法获取staypoint
    
   同时geolife DataFrame加一列staypoint

pfs, sp = pfs.as_positionfixes.generate_staypoints(gap_threshold=24 * 60, include_last=True, print_progress=True, dist_threshold=200, time_threshold=30, n_jobs=-1)

 

2.1  判断staypoint是否是活动对应的staypoint

sp = sp.as_staypoints.create_activity_flag(method="time_threshold", time_threshold=25)

如果staypoint停留时间>25min,那么是为一个活跃的staypoint

3 在两个stypoint之间的部分创建行程段

在两个stypoint之间的部分创建行程段
【如果两个非staypoint之间的时间间隔大于阈值的话,视为两个行程段】

pfs, tpls = pfs.as_positionfixes.generate_triplegs(sp)

4 根据停留点和行程段创建trip数据集

sp, tpls, trips = generate_trips(sp, tpls, add_geometry=False)

staypoint之前的trip_id,之后的trip_id

行程和行程的trip_id

行程和行程的始末staypoint_id

5 每个用户时间跟踪质量相关内容

quality_path = os.path.join(".", "data", "quality")
quality_file = os.path.join(quality_path, "geolife_slide_filtered.csv")
quality_filter = {"day_filter": 50, "window_size": 10}
valid_user = calculate_user_quality(sp.copy(), trips.copy(), quality_file, quality_filter)
'''array([  0,   2,   3,   4,   5,  10,  11,  12,  13,  14,  15,  17,  20,22,  24,  25,  26,  28,  30,  34,  35,  36,  37,  38,  39,  40,41,  42,  43,  44,  45,  46,  50,  51,  52,  55,  56,  58,  59,62,  63,  65,  66,  67,  68,  71,  73,  74,  78,  81,  82,  83,84,  85,  89,  91,  92,  95,  96,  97,  99, 101, 102, 104, 110,111, 112, 114, 115, 119, 122, 125, 126, 128, 130, 131, 132, 133,134, 140, 142, 144, 147, 153, 155, 163, 167, 168, 172, 174, 179,181], dtype=int64)
'''
'''valid_user——有记录天数大于day_filter天的那些user_id这个函数同时返回了一个csv文件,记录了这些user_id的的时间跟踪质量'''

这个函数的原理如下: 

5.0 准备部分

trips["started_at"] = pd.to_datetime(trips["started_at"]).dt.tz_localize(None)
trips["finished_at"] = pd.to_datetime(trips["finished_at"]).dt.tz_localize(None)
sp["started_at"] = pd.to_datetime(sp["started_at"]).dt.tz_localize(None)
sp["finished_at"] = pd.to_datetime(sp["finished_at"]).dt.tz_localize(None)sp["type"] = "sp"
trips["type"] = "tpl"
df_all = pd.concat([sp, trips])

 

5.1  横跨多天的staypoint/行程段进行拆分

df_all = _split_overlaps(df_all, granularity="day")
'''
如果一个trips/staypoint横跨多天了,那么就拆分成两个trips/staypoint
'''

5.2 更新每个trips/staypoint的持续时

df_all["duration"] = (df_all["finished_at"] - df_all["started_at"]).dt.total_seconds()

5.3 计算每个用户的时间跟踪质量

trackintel 笔记:generate_staypoints,create_activity_flag-CSDN博客

total_quality = temporal_tracking_quality(df_all, granularity="all")

某一用户从第一条记录~最后一条记录 这一段时间内,有多少比例的时间是在staypoint/trip的范围内的

【但这个好像没啥用?】

5.4  计算每个用户第一条&最后一条记录之间的天数跨度

total_quality["days"] = (df_all.groupby("user_id").apply(lambda x: (x["finished_at"].max() - x["started_at"].min()).days).values)

5.5 筛选时间跨度>阈值的user id

user_filter_day = (total_quality.loc[(total_quality["days"] > quality_filter["day_filter"])].reset_index(drop=True)["user_id"].unique())

5.6 user_id,每window_size周的时间跟踪质量

sliding_quality = (df_all.groupby("user_id").apply(_get_tracking_quality, window_size=quality_filter["window_size"]).reset_index(drop=True))

 

5.6.1 _get_tracking_quality

def _get_tracking_quality(df, window_size):weeks = (df["finished_at"].max() - df["started_at"].min()).days // 7'''一个user有几周有数据'''start_date = df["started_at"].min().date()quality_list = []# construct the sliding week gdffor i in range(0, weeks - window_size + 1):curr_start = datetime.datetime.combine(start_date + datetime.timedelta(weeks=i), datetime.time())curr_end = datetime.datetime.combine(curr_start + datetime.timedelta(weeks=window_size), datetime.time())#这里window_size=10,也即10周# the total df for this time windowcAll_gdf = df.loc[(df["started_at"] >= curr_start) & (df["finished_at"] < curr_end)]#这10周这个用户的记录if cAll_gdf.shape[0] == 0:continuetotal_sec = (curr_end - curr_start).total_seconds()quality_list.append([i, cAll_gdf["duration"].sum() / total_sec])#这10周有记录的比例ret = pd.DataFrame(quality_list, columns=["timestep", "quality"])ret["user_id"] = df["user_id"].unique()[0]return ret

5.7 有记录天数大于50天的那些user_id,每window_size周的时间跟踪质量

filter_after_day = sliding_quality.loc[sliding_quality["user_id"].isin(user_filter_day)]
filter_after_day

5.8 每个筛选后的user_id的平均滑动时间跟踪质量

filter_after_user_quality = filter_after_day.groupby("user_id", as_index=False)["quality"].mean()

5.9 函数结束

filter_after_user_quality.to_csv(file_path, index=False)
#平均滑动时间跟踪质量保存至本地
return filter_after_user_quality["user_id"].values
#返回持续时间大于50天的数据

6 筛选staypoint

6.1 筛选在valid_user里面的

sp = sp.loc[sp["user_id"].isin(valid_user)]

6.2 筛选活跃的

sp = sp.loc[sp["is_activity"] == True]
sp

7 聚合staypoint(成为station)

sp, locs = sp.as_staypoints.generate_locations(epsilon=50, num_samples=2, distance_metric="haversine", agg_level="dataset", n_jobs=-1)

7.1 去除不在station里面的staypoint(因为这个任务是next station prediction)

sp = sp.loc[~sp["location_id"].isna()].copy()

7.2 station去重

不同user 可能共享一个location,相同位置的location只保留一个

locs = locs[~locs.index.duplicated(keep="first")]

 

7.2 将station信息保存至locations_geolife.csv

8 合并时间阈值内的staypoint

sp_merged = sp.as_staypoints.merge_staypoints(triplegs=pd.DataFrame([]), max_time_gap="1min", agg={"location_id": "first"})

如果两个停留点之间的最大持续时间小于1分钟,则进行合并

9 每个staypoint的持续时间

sp_merged["duration"] = (sp_merged["finished_at"] - sp_merged["started_at"]).dt.total_seconds() // 60

10 添加和计算新的时间相关字段

sp_time = enrich_time_info(sp_merged)
sp_time

10.1 enrich_time_info(sp)

def enrich_time_info(sp):sp = sp.groupby("user_id", group_keys=False).apply(_get_time)#使用 groupby 根据 user_id 对数据进行分组,并应用辅助函数 _get_time 处理每个组的数据。sp.drop(columns={"finished_at", "started_at"}, inplace=True)#删除 finished_at 和 started_at 列sp.sort_values(by=["user_id", "start_day", "start_min"], inplace=True)#对数据进行排序sp = sp.reset_index(drop=True)# sp["location_id"] = sp["location_id"].astype(int)sp["user_id"] = sp["user_id"].astype(int)# final cleaning, reassign idssp.index.name = "id"sp.reset_index(inplace=True)return sp

10.2 _get_time(df)

def _get_time(df):min_day = pd.to_datetime(df["started_at"].min().date())#将 started_at 的最小日期(min_day)作为基准点,用于计算其他时间点相对于此日期的差异df["started_at"] = df["started_at"].dt.tz_localize(tz=None)df["finished_at"] = df["finished_at"].dt.tz_localize(tz=None)df["start_day"] = (df["started_at"] - min_day).dt.daysdf["end_day"] = (df["finished_at"] - min_day).dt.days#计算 start_day 和 end_day 字段,这两个字段表示相对于 min_day 的天数差异。df["start_min"] = df["started_at"].dt.hour * 60 + df["started_at"].dt.minutedf["end_min"] = df["finished_at"].dt.hour * 60 + df["finished_at"].dt.minute#计算 start_min 和 end_min 字段,这些字段表示一天中的分钟数,用于精确到分钟的时间差异计算df.loc[df["end_min"] == 0, "end_min"] = 24 * 60#如果 end_min 等于 0,表示结束时间为午夜,为了避免计算错误,手动将其设置为 1440(即24小时*60分钟)df["weekday"] = df["started_at"].dt.weekday#计算 weekday 字段,表示 started_at 所在的星期几(0代表星期一,6代表星期日)return df

11 sp_time 存入sp_time_temp_geolife.csv

12 _filter_sp_history(sp_time)

这一部分写的有点繁琐,有一些语句都是没有必要的,我精简一下

12.0 辅助函数

12.0.1 split_dataset

12.0.2 get_valid_sequence

12.1 划分训练、验证、测试集

train_data, vali_data, test_data = split_dataset(sp_time)

每一个user 前60%天 训练,中间20%天验证,后20%天测试

12.2 获取所有“valid”的行id

所谓valid,指的是那些在给定时间窗口(previous_day 天,这里例子中是7天)内,在当前记录之前有至少三条记录的行ID

previous_day_ls = [7]
all_ids = sp[["id"]].copy()for previous_day in previous_day_ls:valid_ids = get_valid_sequence(train_data, previous_day=previous_day)valid_ids.extend(get_valid_sequence(vali_data, previous_day=previous_day))valid_ids.extend(get_valid_sequence(test_data, previous_day=previous_day))all_ids[f"{previous_day}"] = 0all_ids.loc[all_ids["id"].isin(valid_ids), f"{previous_day}"] = 1
all_ids.set_index("id", inplace=True)
final_valid_id = all_ids.loc[all_ids.sum(axis=1) == all_ids.shape[1]].reset_index()["id"].values
#这一行写的很复杂,其实就是
'''
all_ids[all_ids['7']==1].index.values
'''

筛选所有valid的行id

12.3 筛选train、valid、test中valid的行对应的user_id

valid_users_train = train_data.loc[train_data["id"].isin(final_valid_id), "user_id"].unique()
valid_users_vali = vali_data.loc[vali_data["id"].isin(final_valid_id), "user_id"].unique()
valid_users_test = test_data.loc[test_data["id"].isin(final_valid_id), "user_id"].unique()
valid_users_train

12.4 在train、test、valid上都有的user

valid_users = set.intersection(set(valid_users_train), set(valid_users_vali), set(valid_users_test))len(valid_users)
#47

12.5 筛选对应的staypoint

filtered_sp = sp_time.loc[sp_time["user_id"].isin(valid_users)].copy()

12.5 valid_user_id和staypoint 分别保存

data_path = f"./data/valid_ids_geolife.pk"
with open(data_path, "wb") as handle:pickle.dump(final_valid_id, handle, protocol=pickle.HIGHEST_PROTOCOL)
filtered_sp.to_csv(f"./data/dataset_geolife.csv", index=False)

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

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

相关文章

Qt gsl库配置踩坑记录

想求解非线性方程组&#xff0c;之前使用拟牛顿法写过相关的matlab代码&#xff0c;这次想移植到C代码&#xff0c;网上说gsl库挺好用的&#xff0c;于是我也想试一下。相关参考&#xff1a; 【C】GSL(GNU Scientific Library) 的安装及在 Visual Studio 2017 中的使用 QT5使用…

深度学习VGG16网络构建(Pytorch代码从零到一精讲,帮助理解网络的参数定义)

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…

CentOS常见的命令

CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个基于Red Hat Enterprise Linux源代码构建的开源企业级Linux发行版。在日常的系统管理和维护中&#xff0c;掌握一些常见的CentOS命令是非常必要的。本文将介绍一些CentOS系统中常用的命令&#xff0…

Labview2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 LabVIEW是一种由美国国家仪器&#xff08;NI&#xff09;公司开发的程序开发环境&#xff0c;它显著区别于其他计算机语言&#xff0c;如C和BASIC。传统的计算机语言是基于文本的语言来产生代码&#xff0c;而LabVIEW则采用图形化…

【nvm环境变量】第一次成功和第二次不成功的区别

当您在终端安装 nvm&#xff08;Node Version Manager&#xff09;或类似的程序时&#xff0c;它通常会在安装过程中自动向当前终端会话添加必要的环境变量配置。这意味着&#xff0c;在安装过程中打开的那个终端会话能够识别 nvm 命令&#xff0c;因为安装脚本可能会临时修改环…

CERLAB无人机自主框架: 1-环境搭建

前言&#xff1a;更多更新文章详见我的个人博客主页【MGodmonkeyの世界】 描述&#xff1a;欢迎来到CERLAB无人机自主框架&#xff0c;这是一个用于自主无人飞行器 (UAV) 的多功能模块化框架。该框架包括不同的组件 (模拟器&#xff0c;感知&#xff0c;映射&#xff0c;规划和…

Day23_学点儿JSON_定义、数据格式、和XML比较、插件

1 JSON定义 定义&#xff1a;是一种轻量级的数据交换格式 JSON是JavaScript Object Notation缩写 特点&#xff1a; 易于程序员阅读和编写。易于计算机解析和生成。其实是javascript的子集&#xff1a;原生javascript支持JSON <script type"text/javascript">…

B-树 B+树与数据库原理

B树 引入 概念和性质 插入分析 总结 B树 B*树&#xff08;了解&#xff09; 数据库原理 数据库与B树的关系

【深度学习实战(10)】图像推理之预处理

一、预处理流程 在把一张图像送入模型进行推理时&#xff0c;需要先进行预处理&#xff0c;预处理流程包括&#xff1a; &#xff08;1&#xff09;读取图像 &#xff08;2&#xff09;尺寸调整&#xff0c;letter_box&#xff08;不失真&#xff09; &#xff08;3&#xff0…

小红的排列构造(dp优化)

题目描述 小红拿到了一个长度为n的数组a&#xff0c;她希望你构造两个排列p和q&#xff0c;满足对于i∈[1,n],ai∈[1,n]pi或qi二选一。你能帮帮她吗&#xff1f;定义排列是一个长度为n的数组&#xff0c;其中1到n每个元素恰好出现1次。 输入描述:第一行输入一个正整数n&#…

Linux平台Alsa库移植

嵌入式Linux平台Alsa库移植 1. Alsa-lib2. Alsa-utilsAplay播放避坑 1. Alsa-lib alsa-lib下载地址&#xff1a;https://www.alsa-project.org/files/pub/lib/ 这里使用的版本是alsa-lib-1.0.29 下载完成并解压&#xff0c;进入alsa-lib-1.0.29目录 编译配置如下&#xff1a; …

关于selenium各种操作语句(方便查询便携版)

定位方法 #功能from selenium import webdriver#载入驱动 from selenium.webdriver.common.by import By #新版载入by,旧版的find_element_by_id语句一般会被划掉&#xff0c;然后给你提示说语句已淘汰&#xff0c;不过目前还是可以运行&#xff0c;只是代码不好看。#启动驱动的…

解释RocketMQ的“消息顺序”特性

RocketMQ的“消息顺序”特性指的是它能按照发送方的预期&#xff0c;保持消息在生产和消费过程中的顺序一致性。这一特性对于某些特定的应用场景至关重要&#xff0c;比如金融交易、订单处理等&#xff0c;在这些场景中&#xff0c;消息的顺序性对于业务逻辑的正确性有着决定性…

解析OceanBase v4.2 Oracle 语法兼容之 LOCK TABLE

背景 在OceanBase V4.1及之前的版本中&#xff0c;尽管已经为Oracle租户兼容了LOCK TABLE相关的语法&#xff0c;包括单表锁定操作&#xff0c;和WAIT N&#xff0c; NOWAIT 关键字。但使用时还存在一些限制。例如&#xff1a;LOCK TABLE只能针对单表进行锁定&#xff0c;并不…

Leetcode287_寻找重复数

1.leetcode原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2.题目描述 给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复…

URL GET +号后台接收成空格

问题&#xff1a;参数spdmwhbs001 其中包含URL特殊符号 如果用GET请求方式不做任何不处理那么浏览器自动将转为%20 请求链接为 details?spdmwhbs%20001&limitKcysType1 后台接收到的参数为 whbs 001 &#xff0c;自动将号转成空格了。 尝试解决&#xff08;失败&#…

Redis中的事务(二)

事务 事务的实现 执行事务 当一个处于事务状态的客户端向服务器发送EXEC命令时&#xff0c;这个EXEC命令将立即被服务器执行&#xff0c;服务器会遍历这个客户端的事务队列&#xff0c;执行队列中保存的所有命令&#xff0c;最后将执行命令所得的结果全部返回给客户端。 例…

kubernets 节点数量限制修改

kubelet节点pod数量限制 在 Kubernetes 中&#xff0c;kubelet 的 --max-pods 参数默认值是 110。这意味着每个节点上最多可以运行 110 个 Pod。这个默认值是为了在大多数情况下提供一个合理的默认限制&#xff0c;以避免节点资源被过度占用。 如果需要修改默认的 --max-pods…

STM32学习和实践笔记(17):STM32外部中断(EXTI)的整体介绍

1.外部中断介绍 1.1 EXTI简介 STM32F10x外部中断/事件控制器&#xff08;EXTI&#xff09;包含多达 20 个用于产生事件/中断请求的边沿检测器。&#xff08;事件与中断的区别&#xff0c;可参看STM32---中断与事件的区别_中断和事件的区别-CSDN博客&#xff09; 具体有哪些&a…

C语言结课实战项目_贪吃蛇小游戏

目录 最终实现效果&#xff1a; 实现基本的功能&#xff1a; 根据游戏进程解释代码&#xff1a; 游戏初始化&#xff1a; 首先进入游戏&#xff0c;我们应该将窗口名称改为 “贪吃蛇” 并将光标隐藏掉。再在中间打印游戏信息。 之后我们要把地图打印出来&#xff1a; 然后…