如何處理時間序列的缺失數據

您是否應該刪除、插入或估算?

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.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/15850.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15850.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/15850.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java-MySql:JDBC

目錄 JDBC概述 JDBC搭建 1、導入mysql開發商提供的jar包 2、注冊驅動 3、與數據庫連接 注解: Statement: 代碼 運行 PreparedStatement: 代碼 運行 PreparedStatement和Statement Statement 增 代碼 運行 刪 代碼 運…

九、圖形化腳本

多年來, shell腳本一直都被認為是枯燥乏味的。但如果你準備在圖形化環境中運行腳本時,就未必如此了。有很多與腳本用戶交互的方式并不依賴read和echo語句。 9.1 創建文本菜單 創建交互式shell腳本最常用的方法是使用菜單。提供各種選項可以幫助腳本用戶…

AI遇上遙感,未來會怎樣?

隨著航空、航天、近地空間等多個遙感平臺的不斷發展,近年來遙感技術突飛猛進。由此,遙感數據的空間、時間、光譜分辨率不斷提高,數據量也大幅增長,使其越來越具有大數據特征。對于相關研究而言,遙感大數據的出現為其提…

初識GPT

初識GPT GPT(Generative Pre-trained Transformer)是一種基于Transformer架構的預訓練語言模型,由人工智能研究公司OpenAI開發。GPT模型使用了一種稱為“自回歸”(autoregressive)的方法來生成文本,這意味…

Oracle執行DELETE語句后,回滾(還原)數據

--第一步:刪除數據 DELETE FROM "EMPLOYEER" WHERE id 123 --第二步:查看數據列表(判斷第一步中數據是否被刪除) SELECT * FROM "EMPLOYEER" AS OF timestamp to_timestamp( 2024-05-22 11:51:00, yyyy-mm-dd hh24:mi:ss ) --第…

基于MetaGPT構建LLM多智能體

前言 你好,我是GISer Liu,在上一篇文章中,我們用了兩萬多字詳細拆解了單個Agent的組成,并通過Github Trending訂閱智能體理解MetaGPT框架的訂閱模塊如何解決應用問題,但是對于復雜,并行的任務,單…

【vue】el-select選擇器實現寬度自適應

選擇器的寬度根據內容長度進行變化 <div class"Space_content"><el-selectv-model"value":placeholder"$t(bot.roommessage)"class"select"size"small"style"margin-right: 10px"change"selectcha…

JavaSE——集合框架二(1/6)-前置知識-可變參數、Collections工具類

目錄 可變參數 Collections工具類 Collections的常用靜態方法 實例演示 可變參數 可變參數 就是一種特殊形參&#xff0c;定義在方法、構造器的形參列表里&#xff0c;格式是&#xff1a;數據類型...參數名稱 可變參數的特點和好處 特點&#xff1a;可以不傳數據給它&am…

SQL常用基礎語句(一)-- ABCDE開頭

AS 將列名從 count(*) 修改為 total select count(*) as total from users where status0 將列名 username 改為 uname&#xff0c; password 改為 upwd select username as uname, password as upwd from users BETWEEN AND 說明&#xff1a;BETWEEN 篩選的是 >value1且 &l…

小程序主體變更是通過遷移嗎?是需要2個小程序嗎?

小程序遷移變更主體有什么作用&#xff1f;好多朋友都想做小程序遷移變更主體&#xff0c;但是又不太清楚具體有啥用&#xff0c;今天我就來詳細說說。首先&#xff0c;小程序遷移變更主體最重要的作用就是可以修改主體。比如你的小程序原來是 A 公司的&#xff0c;現在 A 公司…

并發編程筆記8--ThreadLocal結構詳解

ThreadLocal&#xff0c;即線程變量&#xff0c;是一個以ThreadLocal對象為鍵&#xff0c;任意對象為值的存儲結構。這個結構被附帶在線程上&#xff0c;也就是說一個線程可以根據一個ThreadLocal對象查詢到綁定在這個線程上的值。可以通過set(T)方法來設置一個值&#xff0c;在…

標識符的命名規則和規范

標識符概念 Java對各種變量, 方法和類等命名時使用的字符序列稱為標識符凡是自己可以起名字的地方都叫標識符 int num1 90; 標識符的命名規則(必須遵守) 由26個英文字母大小寫, 0-9, _或$組成數字不可以開頭. int 3ab 1;不可以使用關鍵字和保留字, 但能包含關鍵字和保留字…

操作系統實驗四:多線程與信號量編程

操作系統實驗上機 更多技術請訪問&#xff1a;www.xuanworld.top 部分審核不通過的文章將發至個人博客&#xff1a;www.xuanworld.top 歡迎來52破解論壇閱讀帖子&#xff1a;https://www.52pojie.cn/thread-1891208-1-1.html 實驗名稱實驗序號實驗日期實驗人多線程與信號量…

010-Linux磁盤介紹

文章目錄 1、名詞 2、類型 3、尺寸 4、接口/協議/總線 5、命名 6、分區方式 MBR分區 GPT分區 1、名詞 磁盤是計算機主要的存儲介質&#xff0c;可以存儲大量的二進制數據&#xff0c;并且斷電后也能保持數據不丟失。早期計算機使用的磁盤是軟磁盤&#xff08;Floppy D…

普通測試工程師與測試開發工程師:為何年薪存在15萬與30萬+的差距?

普通測試工程師想要轉型為測試開發工程師&#xff08;簡稱測開&#xff09;&#xff0c;需要學習一系列的知識和技能。以下是一些關鍵的學習領域&#xff1a; 編程能力&#xff1a;測試開發工程師需要具備一定的編程能力&#xff0c;能夠編寫自動化測試腳本和測試工具。因此&a…

基于yolov5和desnet的貓咪識別模型

前言 前段時間給學校的貓咪小程序搭建了識貓模型&#xff0c;可以通過貓咪的照片辨別出是那只貓貓&#xff0c;這里分享下具體的方案&#xff0c;先看效果圖&#xff1a; 源代碼在文末 模型訓練 在訓練服務器&#xff08;或你的個人PC&#xff09;上拉取本倉庫代碼。 圖片數…

[力扣題解] 200. 島嶼數量

題目&#xff1a;200. 島嶼數量 思路 深度優先搜索、廣度優先搜索、并查集&#xff1b; 代碼 廣度優先搜索 class Solution { public:int dir[4][2] {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};queue<pair<int, int>> que;void bfs(vector<vector<char>&g…

10款免費黑科技軟件,強烈推薦!

1.AI視頻生成——巨日祿 網頁版https://aitools.jurilu.com/ "巨日祿 "是一款功能強大的文本視頻生成器&#xff0c;可以快速將文本內容轉換成極具吸引力的視頻。操作簡單&#xff0c;用戶只需輸入文字&#xff0c;選擇喜歡的樣式和模板&#xff0c; “巨日祿”就會…

Day39貪心算法part06

LC738單調遞增的數字&#xff08;未掌握&#xff09; 思路分析&#xff1a;一旦出現strNum[i - 1] > strNum[i]的情況&#xff08;非單調遞增&#xff09;&#xff0c;首先想讓strNum[i - 1]–&#xff0c;然后strNum[i]給為9字符串是不可變的&#xff0c;不可以使用s.char…

嵌入式交叉編譯:OpenCV

編譯ffmpeg 嵌入式交叉編譯&#xff1a;ffmpeg及相關庫-CSDN博客 下載 LINUX編譯opencv_linux 編譯opencv 模塊-CSDN博客 解壓編譯 penCV自帶編譯配置&#xff0c;十分方便。 BUILD_DIR${HOME}/build_libsCROSS_NAMEaarch64-mix210-linuxFFMPEG_DIR${BUILD_DIR}/libmkdir…