【scipy 基礎】--插值

来源:https://www.cnblogs.com/wang_yb/archive/2023/11/07/17814420.html
-Advertisement-
Play Games

插值運算是一種數據處理方法,主要用來填補數據之間的空白或缺失值。因為在實際應用中,數據往往不是完整的,而是存在著空白或缺失值,這些空白或缺失值可能是由於數據採集困難、數據丟失或數據處理錯誤等原因造成的。如果直接使用這些空白或缺失值進行分析和預測,將會對結果造成很大的影響。 插值運算可以用來填補這些空 ...


插值運算是一種數據處理方法,主要用來填補數據之間的空白或缺失值。
因為在實際應用中,數據往往不是完整的,而是存在著空白或缺失值,這些空白或缺失值可能是由於數據採集困難、數據丟失或數據處理錯誤等原因造成的。
如果直接使用這些空白或缺失值進行分析和預測,將會對結果造成很大的影響。

插值運算可以用來填補這些空白或缺失值,從而恢復完整的數據集。
通過插值運算,可以估算出空白或缺失值的值,從而提高數據的完整性和準確性。
此外,插值運算還可以用來預測未來的數據趨勢或結果,對於數據分析和預測具有重要的意義。

本篇介紹Scipy為我們提供的插值處理方法。

1. 主要功能

Scipy中,關於插值的子模塊是:scipy.interpolate
其中又細分為:

類別 說明
單變數插值 主要包含interp1d等12個函數
多變數插值 主要包含griddata等11個函數
一維樣條函數 主要包含BSpline等16個函數
二維樣條函數 主要包含RectBivariateSpline等9個函數
其他函數 一些輔助計算的函數

插值效果的好壞,有個重要的因素在於是否根據數據的情況選擇了合適的插值演算法。
Scipy庫中已經實現的插值演算法有:

  1. linear:線性插值演算法
  2. nearest:最近鄰插值演算法
  3. nearest-up:改進型最近鄰插值演算法
  4. zero:零階樣條插值演算法(等同於 previous
  5. slinear:一階樣條插值演算法(等同於 linear
  6. quadratic:五階樣條插值演算法
  7. cubic:三階樣條插值演算法
  8. previous:前點插值演算法
  9. next:後點插值演算法

我們可以根據數據情況選擇合適的演算法,下麵用一些測試數據演示不同演算法的插值效果:

from scipy.interpolate import interp1d

x = np.linspace(0, 20, 20)
y = x * np.cos(x)
plt.scatter(x,y)
plt.show()

image.png
上圖是插值之前,直接由20個數據點連接起來的折線。

接下來,應用9種不同的插值演算法將20個點補充為100個點,然後看看插值之後各種曲線的效果。

interp_types = [
    "linear",
    "nearest",
    "nearest-up",
    "zero",
    "slinear",
    "quadratic",
    "cubic",
    "previous",
    "next",
]

fig = plt.figure(figsize=[12, 9])
fig.subplots_adjust(hspace=0.4)

for idx, typ in enumerate(interp_types):
    f = interp1d(x, y, kind=typ)
    x_dense = np.linspace(0, 20, 100)
    y_dense = f(x_dense)

    ax = fig.add_subplot(330 + idx+1)
    ax.scatter(x, y)
    ax.plot(x_dense, y_dense, color='g')
    ax.set_title("插值演算法-{}".format(typ))


plt.show()

image.png

2. 一維插值示例

在我自己實際接觸的項目中,氣象數據的處理經常會用到插值。
因為氣象數據常常存在缺失值,這可能是由於感測器故障,數據傳輸問題,或者在某些情況下,由於天氣現象使得數據無法收集。
對於這些缺失值,我們可以使用Scipy的一維插值功能來進行填充。

比如下麵是南京市某年的各個月的平均氣溫:

import pandas as pd

# 南京一年中每個月平均氣溫
df = pd.DataFrame({
    "月份": ["一月", "二月", "三月", 
           "四月", "五月", "六月", 
           "七月", "八月", "九月", 
           "十月", "十一月", "十二月"],
    "平均最低氣溫": [-1.6, 0.0, 4.4, 
               np.nan, 15.7, 20.4, 
               np.nan, 24.6, 19.1, 
               12.6, 6.1, -0.1],
    "平均最高氣溫": [7.0, 8.4, np.nan, 
               20.1, 25.3, 29.0, 
               32.0, 32.2, 27.2, 
               np.nan, 16.9, 9.7],
})

df

image.png
由於採集或者傳輸的原因,導致缺失了一些數據。
這樣的數據不僅繪製出來的折線圖會有斷開的地方,而且不利於後續的分析。

plt.plot(df["月份"], df["平均最低氣溫"], label="平均最低氣溫")
plt.plot(df["月份"], df["平均最高氣溫"], label="平均最高氣溫")
plt.legend()

plt.show()

image.png

這時,可以用Scipy的插值演算法來補充缺失數據。

from scipy.interpolate import interp1d

# 過濾掉缺失的 平均最低氣溫 數據
df_low =df[df["平均最低氣溫"].notna()]
# 根據已有的數據生成插值函數
f = interp1d(df_low.index, df_low["平均最低氣溫"], kind="cubic")
# 用插值函數補充缺失數據
df["平均最低氣溫"] = f(range(12))

# 平均最高氣溫 的缺失數據處理同上
df_high =df[df["平均最高氣溫"].notna()]
f = interp1d(df_high.index, df_high["平均最高氣溫"], kind="cubic")
df["平均最高氣溫"] = f(range(12))

df.round(1)

plt.plot(df["月份"], df["平均最低氣溫"], label="平均最低氣溫")
plt.plot(df["月份"], df["平均最高氣溫"], label="平均最高氣溫")
plt.legend()

plt.show()

image.png
處理之後,數據的連續性更好了。

3. 二維插值示例

當自變數有2個的時候,就要用到二維插值了。
仍然以氣象上的數據舉例,上面示例是氣溫和時間的關係,我們把時間作為自變數,只要一維插值即可。
如果是和地點關聯的話,那麼地點作為自變數就有2個值(一般是經度和緯度)。

比如下麵截取了項目中一段降水量的數據:

# 數據是二維數組:
# 每一行代表經度相同,緯度不同的地點
# 每一列代表緯度相同,經度不同的地點
data = np.array([
    [9, 9, 5, 9, 10, 9, 8, 7, 11, 1],
    [54, 36, 54, 32, 46, 51, 35, 33, 36, 11],
    [35, 34, 34, 45, 52, 35, 34, 36, 41, 9],
    [117, 112, 113, 133, 126, 127, 119, 96, 116, 23],
    [110, 67, 91, 85, 94, 69, 77, 81, 65, 13],
    [9, 7, 13, 12, 9, 6, 8, 9, 21, 3],
    [50, 21, 24, 32, 36, 26, 28, 30, 24, 3],
    [65, 41, 63, 67, 58, 50, 54, 45, 48, 16],
    [36, 29, 32, 28, 38, 29, 41, 27, 29, 9],
    [37, 61, 57, 35, 56, 51, 40, 58, 100, 34],
])

顯示降水量的分佈情況。

plt.imshow(data, cmap=plt.cm.GnBu)
plt.colorbar()
plt.xticks([])
plt.yticks([])
plt.show()

image.png
data中只有100個數據,所以每個格子一個值,看起來不是那麼連續,
而實際的降水情況不會像這樣離散的,區域之間的降水量應該是逐漸連續變化的。

所以,需要在data的基礎上進行二維插值:

from scipy.interpolate import RectBivariateSpline

# 原始數據是 10x10 
x = np.linspace(0, 10, 10, endpoint=False)
y = np.linspace(0, 10, 10, endpoint=False)

# 插值後的數據是 500x500
x_new = np.linspace(0, 10, 500, endpoint=False)
y_new = np.linspace(0, 10, 500, endpoint=False)

# 從原始數據生成插值函數
f = RectBivariateSpline(x, y, data.T)
# 用插值函數計算新的數據
data_new = f(x_new, y_new)

# 顯示插值後的結果
plt.imshow(data_new.T, cmap=plt.cm.GnBu)
plt.colorbar()
plt.xticks([])
plt.yticks([])
plt.show()

image.png
這是插值到 500x500 的效果,值越大,連續性越好。
有興趣的話,可以調整上面代碼中 x_newy_new 的個數,看看不同的效果。

4. 總結

插值作為一種常見的數據處理方法,應用的領域和場景非常多,比如:

  1. 數據預測:通過插值技術,可以預測未來的數據趨勢或結果。
  2. 圖像處理:插值可以用於圖像處理和圖像分析,以提高圖像的解析度或質量。
  3. 機器學習:插值技術也可以用於機器學習和人工智慧領域。用於構建回歸模型或分類模型,以便對未知數據進行預測或分類。

本文主要介紹了Scipy庫的插值子模塊,其內置的插值演算法,以及兩個應用插值的小例子。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 左值、右值、左值引用以及右值引用 左值:一般指的是在記憶體中有對應的存儲單元的值,最常見的就是程式中創建的變數 右值:和左值相反,一般指的是沒有對應存儲單元的值(寄存器中的立即數,中間結果等),例如一個常量,或者表達式計算的臨時變數 int x = 10 int y = 20 int z = x ...
  • eclipse下載 官網下載:https://www.eclipse.org/downloads/packages/ 打開後,找到Eclipse IDE for Java Developers點擊進入 進入後點擊右側電腦適配的版本,進入到下載界面點擊“>> Select Another Mirror ...
  • 1 任務調度整體流程 2 組件 調度器 :工廠類創建Scheduler,根據觸發器定義的時間規則調度任務 任務:Job表示被調度的任務 觸發器:Trigger 定義調度時間的元素,按啥時間規則執行任務。一個Job可被多個Trigger關聯,但是一個Trigger 只能關聯一個Job import o ...
  • 進行支付寶開發的第一步就是:配置密鑰。 但是有很多小伙伴都不知道怎麼配置,這篇文章將手把手幫你從頭開始捋清如何配置支付寶密鑰~ ...
  • 在"zookeeper源碼(03)集群啟動流程"中介紹了leader選舉的入口,本文將詳細分析leader選舉組件和流程。 leader選舉流程(重要) quorumPeer的start階段使用startLeaderElection()方法啟動選舉 LOOKING狀態,投自己一票 createEle ...
  • 準備 我是小C同學編寫得一個java文件,如何實現我的功能呢?需要去JVM(Java Virtual Machine)這個地方旅行。 變身 我高高興興的來到JVM,想要開始JVM之旅,它確說:“現在的我還不能進去,需要做一次轉換,生成class文件才行”。為什麼這樣呢? JVM不能直接載入java文 ...
  • 配置文件yml # phantomjs的位置地址 phantomjs: binPath: windows: binPath-win linux: binPath-linux jsPath: windows: jsPath-win linux: jsPath-linux imagePath: wind ...
  • 定時任務簡介 定時任務是指按照預定的時間間隔或特定時間點自動執行的計劃任務或操作。這些任務通常用於自動化重覆性的工作,以減輕人工操作的負擔,提高效率。在電腦編程和應用程式開發中,定時任務是一種常見的編程模式,用於周期性地執行某些操作、處理數據或觸發事件。 以下是一些關於定時任務的重要概念: 時間間 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...