论文辅助笔记:处理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;&…

Labview2024安装包(亲测可用)

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

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&#…

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

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

URL GET +号后台接收成空格

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

Redis中的事务(二)

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

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; 然后…

【Qt】设置QT标准对话框为中文字体

设置QT标准对话框为中文字体 一、问题二、解决方法1、找到Qt内置的翻译文件 qt_zh_CN.qm2、在代码中加载该文件 一、问题 在Qt中我们使用的标准对话框都是英文&#xff0c;例如下面的 字体选择对话框&#xff0c;但是实际中我们需要构建的是中文对话框。 所以我们需要使用Qt官…

js自动缩放页面,html自动缩放页面,大屏自动缩放页面,数字看板自动缩放页面,大数据看板自动缩放页面

js自动缩放页面&#xff0c;html自动缩放页面&#xff0c;大屏自动缩放页面&#xff0c;数字看板自动缩放页面&#xff0c;大数据看板自动缩放页面 由纯JS实现 html代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"…

【数据结构】单链表的头节点与尾节点

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

玄子Share-计算机网络参考模型

玄子Share-计算机网络参考模型 分层思想 利用七层参考模型&#xff0c;便于在网络通信过程中&#xff0c;快速的分析问题&#xff0c;定位问题并解决问题 将复杂的流程分解为几个功能相对单一的子过程 整个流程更加清晰&#xff0c;复杂问题简单化 更容易发现问题并针对性的…

【Java开发指南 | 第十七篇】Java 方法

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 简介语法实例构造方法 简介 Java中的方法是用来执行特定任务的一组语句&#xff0c;可以重复使用。它们包含在类或对象中&#xff0c;并通过调用来执行。 举个例子&#xff0c;println() 是一个方法&#xff…

动态内存管理 柔性数组

文章目录 动态内存函数 malloc freecallocrealloc 重新开辟空间realloc 也可以第一个参数为NULL&#xff0c;则是直接开辟内存&#xff0c;类似于malloc用法 常见的动态内存错误对空指针进行解引用操作对开辟的内存越界访问对非动态开辟的内存使用free释放使用free释放动态开辟…

(四)相关性分析 学习简要笔记 #统计学 #CDA学习打卡

目录 一. 相关性分析简介 二. 相关性分析方法 1&#xff09;连续型变量vs连续型变量&#xff1a;Pearson/Spearman &#xff08;a&#xff09;Pearson &#xff08;b&#xff09;Spearman等级相关系数 2&#xff09;二分类变量&#xff08;自然&#xff09;vs连续型变量&…