如何处理时间序列的缺失数据

您是否应该删除、插入或估算?

img

世界上没有完美的数据集。每个数据科学家在数据探索过程中都会有这样的感觉:

df.info()

看到类似这样的内容:

img

大多数 ML 模型无法处理 NaN 或空值,因此如果您的特征或目标包含这些值,则在尝试将模型拟合到数据之前对它们进行适当处理非常重要。

在本文中,我将探讨处理时间序列数据集中的空值/缺失数据的 3 种简单方法。

1. 删除空值

这可能是处理缺失数据最简单、最直接的方法:将其删除。

# 删除所有列中的所有空值
df.dropna(inplace=True)

默认情况下,pandas 的dropna 函数会全面搜索(所有列)空值,并删除任何列中存在空值的行**。**但是,可以使用各种参数进行修改。

在本数据集中,请注意 NMHC(GT) 列只有 914 个非空值。因此,如果我们删除所有空值,我们的模型最终最多只能得到 914 行(可能更少)。这与原来的 9,357 行相比大幅下降!

通过指定列的子集 ,pandas 将仅删除数据框中特定列为空的行。

df.dropna(subset=['CO(GT)','PT08.S1(CO)'], inplace=True)

这样,我们可以对方法进行混合和搭配,在某些列中删除空值,并以不同的方式处理其他列。

您还可以通过将参数how设置为“all”来指定是否仅删除所有列都为空的行。how 的默认值为“any”。

2. 插值空值

填充空值的另一种简单方法是通过插值。Pandas 的 interpolate 方法默认使用线性插值。

线性插值基本上取空值前后的两个值,并在两者之间创建一条线。然后使用这条线来估计缺失数据点的值。Pandas**的插值方法假设每个数据点的间距相等。**如果您没有针对每个可能的时间戳设置一行,只要您有日期时间索引,就可以将插值方法设置为“时间”。这样,如果您有两行相隔 >1 个间隔(例如 >1 天或 1 小时),插值将考虑这个距离。

如果这是第一个索引,由于空值前面没有值,因此不会进行插值。

img

在这种情况下,插值很简单,因为在两个已知值的中间正好有 1 个空值。所有值都以 1 小时为间隔。索引 10 处的空值将只是前后值的平均值 (0.65)。

如果存在 2 个或更多连续的 NaN,则将根据它们与已知值之间的距离对它们进行插值。

**您可以通过limit**关键字参数设置要插入的连续 NaN 数量限制。如果有大量连续 NaN,您可能希望在某个插值点之后删除它们,因为*每次插值都会给算法带来不确定性。*插值越多 = 不确定性越大,尤其是在时间序列的情况下。

3. 归纳空值

我要介绍的最后一种方法是归纳法。归纳法本质上意味着用数据的平均值或中位数填充空值。

最简单的方法是使用 pandas 的 fillna 并取整列的中值。

df.fillna(df['CO(GT)'].median())

但对于时间序列,整个数据集的中值通常并不准确。时间序列数据通常具有季节性模式,使用情况会根据一天中的小时、星期几、月份等而变化。

对于这个例子,我决定使用该小时的中位数来估算 CO(GT) 列**。**

为了能够用中位数进行估算,我想出了自己的解决方案,因为没有直接的方法或库可以做到这一点(据我所知)。 我必须首先创建一个数据框,其中包含各个小时的所有中位数。

# 创建包含按小时分组的每列中位数的数据框
hour_df = pd.DataFrame(df.groupby([df.index.hour]).median())
hour_df.reset_index(inplace=True)

按小时对中位数进行分组的结果数据框。仅显示前 5 小时 + 3 列。

接下来,我创建了一个名为 get_hour_median 的函数。虽然我仅针对 CO(GT) 列展示了该函数,但我使该函数足够灵活,以便它可以处理任何列名。

def get_hour_median(hour,col_name):
    median = hour_df[hour_df['Datetime']==hour][col_name].values[0]
    return median

然后我使用 apply 和另一个自定义函数将此函数应用于 CO(GT) 列。

# 重置日期时间索引以便在下面的函数中更轻松地处理
df.reset_index(inplace=True)

# 获取数据框行并返回中值(如果行为空),否则返回原始值。
def fill_with_hourly_median(row,col_name):
    if pd.isnull(row[col_name]):
        return get_hour_median(row['Datetime'].hour,col_name)
    else:
        return row[col_name]

# 将 fill_with_hourly_median 应用于 CO(GT) 列
df['CO(GT)'] = df.apply(fill_with_hourly_median, axis=1, col_name='CO(GT)')

CO(GT) 列现在应该填写相应小时的中值而不是 NaN。

选择哪一个?

很多时候,您会针对不同的列使用不同方法的组合。例如,由于线性插值不会填充列中的第一个值,因此如果数据框开头有空行,则可以在数据框中间的行被插值后删除这些行。

如果您有大量数据,且空值不多,则删除几行不会产生太大影响。在这种情况下,删除通常是我的首选方法,因为我将输入模型的所有数据都是实际数据。

对于数据集中偶尔出现的小间隙(1-2 行缺失),我通常会使用插值法。但是,如果间隙较大,且存在大量连续的空值,我会考虑使用中位数,直到达到某个阈值(>6-10,但可能取决于数据的粒度和模式的一致性),之后我会开始删除行。

如您所见,虽然处理缺失数据是一种常见现象,但处理方法有很多考虑因素。我提到的方法绝不是唯一的方法,但仅使用这 3 种方法就可以做很多事情。

我建议 彻底探索您的时间序列数据,方法是绘制图表并确定零点在哪里、差距是大还是小以及存在哪些类型的季节性模式。随着时间和实践,您将对如何最好地处理数据中的差距有更好的直觉。

参考

  1. Vito,Saverio. (2016). Air Quality. UCI Machine Learning Repository. https://doi.org/10.24432/C59K5F.

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

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

相关文章

Java开发大厂面试第22讲:Redis 是如何保证系统高可用的?它的实现方式有哪些?

高可用是通过设计,减少系统不能提供服务的时间,是分布式系统的基础也是保障系统可靠性的重要手段。而 Redis 作为一款普及率最高的内存型中间件,它的高可用技术也非常的成熟。 我们今天分享的面试题是,Redis 是如何保证系统高可用…

mysql - 索引原理

mysql索引原理 文中的查询, 以该表结构为例 CREATE TABLE user (id int NOT NULL COMMENT id,name varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT 姓名,age int NOT NULL COMMENT 年龄,sex tinyint(1) NOT NULL COMMENT 性别,phone varchar(255) CHARACTER SET utf8mb4…

源码编译安装LAMP

1.LAMP介绍 LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词,具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、PHP(…

公安知识学习与题目练习系统

一、系统概述 系统采用C用户小程序端、管理员Web端架构。通过UniappVueSpringboot主流技术实现。具体功能分为,管理侧:可以维护学习知识点、更新知识点详情;C端用户:可以学习知识点、在线刷题练习的功能。次系统在公安专业知识学习…

ChatGLM2-6B 模型基于 [P-Tuning v2]的微调

ChatGLM2-6B-PT 一、介绍 1、本文实现对于 ChatGLM2-6B 模型基于 [P-Tuning v2](https://github.com/THUDM/P-tuning-v2) 的微调 2、运行至少需要 7GB 显存 3、以 [ADGEN](https://aclanthology.org/D19-1321.pdf) (广告生成) 数据集为例介绍代码的使用方法。 模型部署参考…

安装termux遇到的问题-逍遥模拟器

问题一 做一次更新即可解决问题,pkg update 问题二 sshd:no hostkeys available -- exiting. 尝试了网上提供的方法 ssh-keygen -t rsa -f /data/data/com.termux/files/usr/etc/ssh/ssh_host_rsa_key ssh-keygen -t dsa -f /data/data/com.termux/…

OTA在线旅行社系统架构:连接世界的科技纽带

随着互联网的快速发展和人们对旅行需求的不断增长,OTA(Online Travel Agency)在线旅行社成为了现代旅行业中的重要一环。OTA系统架构的设计和实现将对旅行行业产生深远影响。本文将探讨OTA在线旅行社系统架构的重要性和关键组成部分&#xff…

【论文阅读|cryoET】ICE-TIDE

简介 三维cryoET重建的保真度进一步受到采集过程中物理扰动的影响。这些扰动以各种形式表现出来,例如连续采集之间的样本漂移,导致连续投影未对准,或者由于未散射的电子而导致二维投影中的局部变形。 传统的冷冻电子断层扫描工作流程需要对…

论文阅读--ActionCLIP

原来的动作识别问题在于标注太难太贵,将动作表示为短语的latent space太大 本文的贡献:(1)将CLIP的image encoder换成video encoder,方法与CLIP4Clip几乎一样 (2)CLIP的ground truth来自于文本…

销量翻倍不是梦!亚马逊速卖通自养号测评实战技巧分享!

在亚马逊、速卖通这些跨境电商平台上,卖家们都在想各种办法让自己的产品卖得更好。现在,有一种叫做“自养号测评”的方法特别火。简单来说,就是自己养一些买家账号,然后让这些账号来给你的产品写好评。这样,你的产品就…

绘制t-SNE图

什么是t-SNE图? 如下图,下图来源于论文Contrastive Clustering 一般用于分类问题/对比学习。 作用? 体现出经过层层训练,类内越来越紧密,类间差异越来越大;或者也可以做消融可视化。 怎么画&#xff1f…

【spring】@PathVariable注解学习

PathVariable介绍 PathVariable是Spring框架中的一个注解,主要用于处理RESTful风格URL中的路径变量。在RESTful接口设计中,我们经常将资源的ID或者其他标识信息直接放在URL路径中,而不是作为查询参数。PathVariable注解使得控制器方法能够轻…

【Linux】如何优雅的检查Linux上的用户登录、关机和重启日志

在诸如Ubuntu、Debian、Linux Mint、Fedora和Red Hat等广受欢迎的Linux发行版中,系统会忠实记录用户的登录、关机、重启以及运行时长信息。这些信息对管理员调查事件、排查故障或汇总用户活动报告极为宝贵。 Linux系统及应用程序日志通常保存在/var/log/目录下&…

RuoYI框架集成Sqlite与Mybatis-plus

一、RuoYi 中集成 SQLite 、MyBatis-Plus RuoYi 是一个基于 Spring Boot 的权限管理系统,它默认使用 MySQL 作为数据库。如果你想在 RuoYi 中集成 SQLite 数据库,并使用 MyBatis-Plus 作为 ORM 框架,你需要进行一些配置和代码更改。以下是集成的基本步骤: 添加依赖:在项目…

Java进阶学习笔记19——内部类

1、 内部类: 是类中五大成分之一(成员变量、方法、构造函数、内部类、代码块),如果一个类定义在另一个 类的内部,这个类就是内部类。 场景:当一个类的内部,包含了一个完整的事物,且…

Linux服务升级:Predixy 升级代理 Redis-cluster 集群

目录 一、实验 1.环境 2. 启动Redis服务 3.Predixy 升级代理 Redis-cluster 集群 二、问题 1. Predixy进行set操作报错 2.如何创建脚本启动predixy 3.Redis代理对比 一、实验 1.环境 (1)主机 表1 主机 系统版本节点软件IP备注CentOS7.9Redis…

JavaFX学习教程二

一、JavaFX 体系结构 JavaFX 场景图(Scene Graph)是构建 JavaFX 应用程序的起点,一种树状数据结构,用于排列(和分组)图形对象,以便于逻辑表示。 stage:舞台,操作系统窗口的 JavaFX 表示,是所有…

网络编程的基础知识(适合新手)

网络编程 在Java中,网络编程是指使用Java语言进行网络通信的编程技术。这种技术使得位于不同地理位置的计算机能够通过网络进行通信,实现资源共享和信息传递。 一、定义 Java网络编程是Java语言在网络通信方面的应用,它利用Java提供的网络…

恢复Android数据的综合指南:适用于Android的数据恢复工具

随着存储空间的快速增长,智能手机已成为我们最可靠的个人数据库。我们的 Android 手机不亚于我们自己的延伸,包含各种重要文件、照片、文档、视频、联系人、通话记录等等。由于这些智能 Android 设备上存储了如此多有价值的信息,意外删除或丢…

Java进阶学习笔记22——泛型方法、通配符和上下限

泛型方法: package cn.ensource.d11_generics_method;public class Test {public static void main(String[] args) {// 泛型方法String res test("Java");System.out.println(res);Dog dog1 test(new Dog());System.out.println(dog1);}// 泛型方法pub…