一個簡單的例子學明白用Python插值

2021-01-10 高效工作的方法

這篇文章嘗試通過一個簡單的例子來為讀者講明白怎樣使用Python實現數據插值。總共分3部分來介紹:

為什麼需要做插值這種事?通過拉格朗日插值法來看看插值這個事的理論要怎麼理解?Python實現拉格朗日插值的一個例子。為什麼需要做插值這種事?

這個答案很簡單,無非兩條:

首先,這個點上它沒有數據或者數據不能用:(1)沒採集到這個點上的數據;(2)採集到這個點上的數據了,但是數據明顯是錯誤的。

其次,如果這個點上它沒有數據的話呢,會對我們的建立的數據模型產生不好的影響,我們不得不想辦法在這個缺失的點上給它想辦法插上一個數據。

這個事,有點像下面這個桶桶,它少一個板就沒法用,那我們想辦法再找一個板板給它插到原來的地方,雖然可能沒有原裝的板板那麼美觀好看,但好歹這個桶桶它能用了呀。

那我們又不是神仙,怎樣知道不存在數據的那個點上它的數據是個什麼鬼呢?好在世間萬物都不是孤立存在的,都會存在或多或少的聯繫,說的直白一點我們就靠這些聯繫來把這個缺少的值給猜出來。

還是以上面那個桶為例,我們要插入的多高多長的板子才能保證桶子盛的水最多且不漏出來呢?我們可以量一量缺少的那個板子它前後的板子的高度,然後取這兩個高度的中間值作為插入的板子的高度,或者用整個桶的板子的平均高度,還有什麼眾數啊、固定值啊什麼的能整的都可以整。

或者我們定義一個看上去比較NB的算法公式來確定這個板子的高度,比如用回歸方法、拉格朗日插值法。那接下來我們一起看看拉格朗日插值,它其實也是一個非常簡單的事。

通過拉格朗日插值法來看看插值這個事的理論要怎麼理解?

我覺得用外國數學家的人名來命名一些方法、數學定理什麼的是一件非常cd的事情,這極大的提高了我們中國學生的學習門檻,讓很多簡單的不能再簡單的數學問題看上去那麼高深莫測。好比我們說歐幾裡得空間,聽著挺高大上的,讓人望而生畏,其實它也就是種向量空間而已。

同樣的,拉格朗日插值法實質上就是一種多項式插值法。而多項式插值法說的是,如果有n個點,每個點都有個x值對應的y值。那就必然能找到一個n-1次多項式使得這n個點的(x,y)值代入這個多項式成立。最簡單的,好比說平面坐標上的兩個點,必然能找的一個1次的式子y=kx+b滿足這兩個點的坐標值,更直白一點說,平面坐標上兩點決定了一條直線。

那麼,如果我們手上有n+1個點,但是只有其中n個點的(x,y)值,有一個點呢只知道它的x值,不知道它的y值。如果我們能找到滿足已知的n個點的n-1次多項式(即插值公式),那我們就可以用這個多項式來算剩下的一個點的y值了。

拉格朗日先生呢,找到一種操作性比較強的辦法確定這個多項式,所以我們把這個辦法叫做拉格朗日插值法。

關於這個公式確定辦法我會另外寫文章講,這裡不再重複。

而且,對於實際工程應用來說,其實只要能夠知道插值的思想,然後知道插值函數的調用方法即可,不需要記這些複雜的公式,畢竟我們主要目標是解決問題而不是去做數學家。

下面通過一個例子來說明Python進行數據插值的一般步驟。

Python實現拉格朗日插值的一個例子。

我們以後面參考資料中的一組數據為例來說明,需要數據源的朋友可以留言或私信我。

這組數據呢,是一個餐廳某段時間內的銷量情況。數據源在excel中,我們使用pandas的read_excel方法將它讀出來,放到一個dataframe中。實現代碼如下:

importpandasaspdfromscipy.interpolateimportlagrange#導入拉格朗日插值函數importmatplotlib.pyplotasplt"""讀Excel文件"""inputfile='../data/catering_sale.xls'#注意數據源excel文件的存放路徑data=pd.read_excel(inputfile)然後呢,我們粗暴地假設這些銷量中小於400或者大於5000的都是異常值,把它們置為空。

data[u'銷量'][(data[u'銷量']<400)|(data[u'銷量']>5000)]=None#過濾異常值,將其變為空Nonedata_original=data.copy()#我們把原始數據保存一下當然這個上下限400、5000,我們可以使用箱型圖法等一些數據分布分析的辦法來確定。

下面的代碼就是對預設的值進行插值了,你看其實代碼很少。我們來分析一下。

前面這個ployinterp_column函數,是我們定義的插值函數,真正插值的操作是在後面的那兩個嵌套的for循環中。

#定義列向量的插值函數defployinterp_column(s,n,k=4):y=s[list(range(n-k,n))+list(range(n+1,n+1+k))]#取一部分輸入參數的值y=y[y.notnull()]#空值剔除掉returnlagrange(y.index,list(y))(n)foriindata.columns:forjinrange(len(data)):if(data[i].isnull())[j]:#如果為空data[i][j]=ployinterp_column(data[i],j)上面代碼外層的for循環中,for i in data.columns,是對data的每一列進行遍歷,實質上我們這裡只有兩列,而且我們只需要對銷量數據進行插值,所以我們這層可以省略。改成下面這個樣子效果也是一樣的:

forjinrange(len(data)):if(data[u'銷量'].isnull())[j]:#如果為空data[u'銷量'][j]=ployinterp_column(data[u'銷量'],j)我們遍歷「銷量」這一列,如果某個單元上為空,我們就調用ployinterp_column函數來對它進行插值。

注意到這個插值函數有3個參數,一個是我們要插值的整個列s,另一個是這列中為空的那個單元格的坐標n,還有一個k是我們取的整列中控制坐標n附近的幾個值來進行插值(這裡默認為4)。

插值前後的dataframe的比較如下圖所示,我們在原來nan的位置上都自動的插入了一個值,而且這個值看上去還挺像那麼回事的。

插值前後的對比python裡面實現拉格朗日插值很簡單,直接調用scipy.interpolate裡面的lagrange函數即可,但是需要注意的是我們在ployinterp_column函數中對k的取值的選擇,k不宜取值過大或過小,過大的話會出現所謂的龍格現象。如下面兩個圖所示,k分別取4和5之後插值的效果,取5時有一個值時-70000多,明顯是一個錯誤的。

k取4時的插值結果

k取5時的插值結果所以,k的取值會影響插值的效果,而k具體取什麼值合適,一般都是通過經驗反覆嘗試幾次來確定。

參考資料:

張良均等著,《Python與數據挖掘實踐》

相關焦點

  • Python 腳本案例:為流域插值雨量計
    PCSWMM對IronPython的即開即用支持(版本2.7.8)免去了用戶在安裝PCSWMM之後再進行任何額外配置或設置的麻煩。用戶可以在腳本編輯器中直接創建、管理和執行腳本,並提供腳本示例來幫助您入門。通過提供對所有GIS、模型和時間序列數據的直接訪問(從PCSWMM7.2版本開始,將支持所有任何格式的數據導入!及導出到任意格式,處理任意的結果分析!)
  • 拉格朗日插值定理的理論基礎
    常用的方法有:上圖表中的均值、中位數、眾數、固定值什麼的都比較好理解,看上去比較高大上的一個是回歸方法,另一個就是插值法。回歸方法,我們後面另外起文討論。插值法裡面常用的就是拉格朗日插值、牛頓插值兩類,我們重點看看拉格朗日插值法。拉格朗日插值,是一種多項式插值,那多項式插值定理怎麼一回事呢?
  • Python趣味打怪:60秒學會一個例子,147段代碼助你從入門到大師
    入門簡單如十進位轉二進位,盡顯Python簡潔之美:In [1]: bin(10)Out[1]: '0b1010'冬天到了,就算沒有點亮手繪技能,也能用簡單幾行代碼繪出漫天雪花:python 機器學習,包括機器學習的基礎概念和十大核心算法以及Sklearn和Kaggle實戰的小例子PyQt製作GUIFlask前端開發Python數據分析:NumPy, Pandas, Matplotlib, Plotly等教程開篇,先用82段簡單易懂的代碼,介紹了Python的基礎語法、功能。
  • 人生苦短,我用Python,那麼問題來了,普通人要學python嗎?
    話說在金融和IT行當混跡了多年,python一直是被我隨手拿來當個小工具用用,有時候偷懶用python弄個excel自動化整理工具,有時候拿來上各種網站爬蟲搜集點信息,有時候也會拿來寫點量化小工具。那麼到底什麼是python?
  • 最鄰近插值&&雙線性內插值!
    寫在最前:用最簡單的方式,講述最深刻的知識。%%%%%%% %%%%%%% %%%%%%% %%%%%%% %%%%%%% %%%%%%%圖像的縮放,對於大家來說一定是個非常熟悉的過程了:最簡單直接的,就是雙手按住觸屏手機,手指外滑/內滑,就可以實現了。
  • 普通人學Python有意義嗎?學Python有前途嗎?-開課吧Python
    Pythonpython憑藉著第三方庫數量的龐大,其幾乎可以說是萬能的,對於普通人來說,數據表格excel基本上都有需要製作,而有一些編程基礎的,就可以使用庫openpyxl來實現excel表格的自動處理和生成,同時除了excel之外,針對word,ppt等python都有對應的庫。
  • 如何在 FPGA 上實現雙線性插值的計算?
    雙線性插值顧名思義是線性插值Pro,為了說明白什麼是雙線性插值,首先得先從線性插值說起。那麼什麼又是線性呢?用數學課本上的話來說,兩個變量之間存在一次方函數關係,就稱它們之間存在線性關係。可能這麼說有些太抽象,下面舉個生活中的例子來形象地說明一下線性插值。如下圖所示,女朋友每周生氣次數和男生的直男程度是線性相關的。已知A男生直男程度為1,女朋友每周生氣次數為4千次。
  • 不學Python哪來的月入過萬?
    學什麼Python,小學生學的! Python這麼簡單,還要學嗎 ?看到這些評論也讓我一度懷疑Python到底值不值得學? 我們今天就來說一說到底Python值不值得學呢!#python書中自有黃金屋姐姐比我大十幾歲,很早就一個人出去闖蕩了,零幾年就一個人出遠門做手術,再到後來出國留學,就目前我的眼界可能還達不到她的十分之一,她總是用她走過的彎路提醒這我們
  • python是什麼,python能幹什麼,為什麼大家都學pyhon一起來看看吧
    相信大家如果經常上網,就會看到各種學python的教程,那麼python究竟是什麼意思,學會了可以用來幹什麼那,我們一起來看一下吧。首先大家要明白python是一種跨平臺的程式語言,python編程的特點易讀、易維護,所以被大量的用戶所歡迎,python最大的特點是開發速度快,因為編程開發效率一直很低,python有很多第三方庫,所以開發起來事半功倍,很流行的一句話,人生苦短,我學python,可謂是把python特點完整的詮釋出來。
  • 223個Python小例子(1-60)
    如果轉載本庫小例子、小案例,請備註下方連結:Python小例子:https
  • 如何用python在工作中「偷懶」?
    Excel自動化處理Excel合併在實際應用中可能會有不同月份的數據或者不同周的報告等等的Excel數據,都是單個獨立的文件,如果想要整體使用的話就需要合併一下,那麼如何利用python把指定目錄下的所有Excel數據合併成一個文件呢?
  • 常用的十大 python 圖像處理工具
    1.scikit-imagescikit-image是一個開源的Python包,適用於numpy數組。它實現了用於研究,教育和工業應用的算法和實用工具。即使是那些剛接觸Python生態系統的人,它也是一個相當簡單直接的庫。此代碼是由活躍的志願者社區編寫的,具有高質量和同行評審的性質。
  • 財務管理插值法的學習技巧
    插值法主要是求出相應自變量下的因變量。這個計算過程其實很簡單,其實質就是解一個一元一次方程。但這個一元一次方程在考場上會變得讓人煩躁。
  • 從零開始學 Python 之輸入與輸出
    這裡有兩種方式輸出一個平方與立方的表:注意:在第一個例子中, 每列間的空格由 print() 添加。這個例子展示了字符串對象的 rjust() 方法, 它可以將字符串靠右, 並在左邊填充空格。下面的例子將 Pi 保留到小數點後三位:在 ':' 後傳入一個整數, 可以保證該域至少有這麼多的寬度。 用於美化表格時很有用。如果你有一個很長的格式化字符串, 而你不想將它們分開, 那麼在格式化時通過變量名而非位置會是很好的事情。
  • Python 拓展之推導式
    我是完全自學的 Python,所以很是明白自學對於一個人的考驗,所以在這裡我會盡我最大的努力,把 Python 儘可能簡單的表述清楚,讓更多想要學習 Python 的朋友能夠入門。同時寫這個教程也算是對自己之前所學知識的一個鞏固和提高,喜歡的朋友們可以點個關注,有問題歡迎隨時和我交流。本文所有的代碼編寫均是Python3 版本。
  • 財管學習中繞不開的插值法,到底怎麼用?
    經常看到有小夥伴在論壇問,什麼是插值法?怎麼運用插值法計算折現率?求細節、詳細解答!今天的帖子,豆哥用計算到期收益率的題來舉例插值法該如何使用。插值法還不明白的小夥伴,速速get啦!但在債券價格和面值不相等的時候,需要用插值法計算到期收益率。2、債券的價格>面值,即溢價購買:  例題:ABC公司20×1年2月1日用溢價購買一張面額為1000元的債券,買價1105元,其票面利率為8%,每年2月1日計算並支付一次利息,並於5年後的1月31日到期。
  • 魅力python——添加新元素、刪除元素、替換元素
    堅持每天更新,一起學習python小夥伴們大家好,今天我們繼續學習python中的list。昨天我們學習了這麼創建list、正序、倒序訪問list中的元素。今天我們繼續一起來學習list其他的一些操作。
  • 編程界新晉「網紅」Python到底是什麼?學Python真的有用嗎?
    怎麼好像一夜之間網上到處都在吹捧Python有多神奇的樣子···我的理解簡單一點來說,Python是一門程式語言,能夠幫助我們更好地與計算機「溝通」,提高工作效率。當然,Python的實際應用價值遠不止這些的哦!
  • python基礎教程之python是什麼?
    這是最近10年最常用的10種程式語言的變化圖:python是什麼--python的功能總的來說,這幾種程式語言各有千秋。當你用一種語言開始作真正的軟體開發時,你除了編寫代碼外,還需要很多基本的已經寫好的現成的東西,來幫助你加快開發進度。比如說,要編寫一個電子郵件客戶端,如果先從最底層開始編寫網絡協議相關的代碼,那估計一年半載也開發不出來。
  • 從0開始學python-6.2 用python讀寫文件
    我們還學習了用python來查找、重命名一個文件。這節課,我們一起學習一下怎麼用python操作一個文件的內容。文件操作對一個文件,我們可以1)讀取裡面的內容、2)往文件裡寫內容、3)追加文件內容。我們來看看用python怎麼做這些事情。打開文件在對文件內容操作之前,我們首先要打開文件。