處理過與時間有關的數據的人都知道,差分變化經常用來使得結果更加直觀。在這篇文章里將會教你如何用Python來實現這一目的,讀完這篇文章,你將會掌握以下技能:
創新互聯長期為1000多家客戶提供的網站建設服務,團隊從業經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯網生態環境。為臨淄企業提供專業的成都做網站、網站建設,臨淄網站改版等技術服務。擁有10年豐富建站經驗和眾多成功案例,為您定制開發。
1、知道什么是差分變換以及滯后差分和差分階數的設置
2、如何手動計算差分
3、怎樣使用Pandas內置的差分函數
所以,讓我們趕緊開始吧!
為什么要對時間序列數據進行差分?
首先來看下為什么要對數據進行差分變化,差分變化可以消除數據對時間的依賴性,也就是降低時間對數據的影響,這些影響通常包括數據的變化趨勢以及數據周期性變化的規律。進行差分操作時,一般用現在的觀測值減去上個時刻的值就得到差分結果,就是這么簡單,按照這種定義可以計算一系列的差分變換。
滯后差分
連續觀測值之間的差分變換叫做一階滯后差分。滯后差分的步長需要根據數據的時間結構做調整,例如對于周期性變化的數據,這個時間步長就是數據變化的周期。
差分階數
在進行一次差分之后,時間項的作用并沒有完全去掉,將會繼續對差分結果進行差分變化,直到完全消除時間項的影響因素為止,這個過程中進行的差分操作次數就稱為差分階數。
洗發水銷售數據
這份數據是三年來每月洗發水的銷售情況,總共有36個數據記錄,原始數據來自Makridakis, Wheelwright和 Hyndman (1998).,可以從下面的地址下到數據:
下面的代碼將會導入數據并將結果畫成折線圖,如下所示:
手動差分
在這一部分中,我們將會自定義一個函數來實現差分變換,這個函數將會對提供的數據進行遍歷并根據指定的時間間隔進行差分變換。具體代碼如下:
從上面的代碼中可以看到該函數將會根據指定的時間間隔來對數據進行變換,一般來說,通常會計算間隔一個數據的差分,這樣的結果比較可靠。當然,我們也可以將上面的函數進行一定的改進,加入差分階數的指定。
下面將這函數應用到上面洗發水銷售的數據中去,運行之后繪出下面的圖,具體如下:
自動差分
Pandas庫里提供了一個函數可以自動計算數據的差分,這個函數是diff(),輸入的數據是“series'或”DataFrame'類型的,像前面自定義函數那樣,我們也可以指定差分的時間間隔,不過在這里這個參數叫做周期。
下面的例子是用Pandas內置函數來計算差分的,數據類型是series的,使用Pandas內置函數的好處是代碼工作量減少了不少,而且繪出的圖中包含更詳細的信息,具體效果如下:
總結
讀完本文想必你已經學會用python來實現對數據的差分了,尤其是對差分的概念,手動差分,以及使用Pandas內置函數進行差分都有所了解了。如果有什么好的想法歡迎在評論欄里留下。
python的求
標準差
的函數是std,是numpy庫的成員,
如果非要
用sd函數求標準差,也不是不行(from
numpy
import
std
as
sd)。其參數是所需求標準差的矩陣或列表,
返回值
即標準差。示范如下:
import
numpy
as
np;
from
numpy
import
std
as
sd;
print([1,
2,3],"的標準差是);
print(sd([1,2,3]));
1. 常用函數庫
? scipy包中的stats模塊和statsmodels包是python常用的數據分析工具,scipy.stats以前有一個models子模塊,后來被移除了。這個模塊被重寫并成為了現在獨立的statsmodels包。
?scipy的stats包含一些比較基本的工具,比如:t檢驗,正態性檢驗,卡方檢驗之類,statsmodels提供了更為系統的統計模型,包括線性模型,時序分析,還包含數據集,做圖工具等等。
2. 小樣本數據的正態性檢驗
(1) 用途
?夏皮羅維爾克檢驗法 (Shapiro-Wilk) 用于檢驗參數提供的一組小樣本數據線是否符合正態分布,統計量越大則表示數據越符合正態分布,但是在非正態分布的小樣本數據中也經常會出現較大的W值。需要查表來估計其概率。由于原假設是其符合正態分布,所以當P值小于指定顯著水平時表示其不符合正態分布。
?正態性檢驗是數據分析的第一步,數據是否符合正態性決定了后續使用不同的分析和預測方法,當數據不符合正態性分布時,我們可以通過不同的轉換方法把非正太態數據轉換成正態分布后再使用相應的統計方法進行下一步操作。
(2) 示例
(3) 結果分析
?返回結果 p-value=0.029035290703177452,比指定的顯著水平(一般為5%)小,則拒絕假設:x不服從正態分布。
3. 檢驗樣本是否服務某一分布
(1) 用途
?科爾莫戈羅夫檢驗(Kolmogorov-Smirnov test),檢驗樣本數據是否服從某一分布,僅適用于連續分布的檢驗。下例中用它檢驗正態分布。
(2) 示例
(3) 結果分析
?生成300個服從N(0,1)標準正態分布的隨機數,在使用k-s檢驗該數據是否服從正態分布,提出假設:x從正態分布。最終返回的結果,p-value=0.9260909172362317,比指定的顯著水平(一般為5%)大,則我們不能拒絕假設:x服從正態分布。這并不是說x服從正態分布一定是正確的,而是說沒有充分的證據證明x不服從正態分布。因此我們的假設被接受,認為x服從正態分布。如果p-value小于我們指定的顯著性水平,則我們可以肯定地拒絕提出的假設,認為x肯定不服從正態分布,這個拒絕是絕對正確的。
4.方差齊性檢驗
(1) 用途
?方差反映了一組數據與其平均值的偏離程度,方差齊性檢驗用以檢驗兩組或多組數據與其平均值偏離程度是否存在差異,也是很多檢驗和算法的先決條件。
(2) 示例
(3) 結果分析
?返回結果 p-value=0.19337536323599344, 比指定的顯著水平(假設為5%)大,認為兩組數據具有方差齊性。
5. 圖形描述相關性
(1) 用途
?最常用的兩變量相關性分析,是用作圖描述相關性,圖的橫軸是一個變量,縱軸是另一變量,畫散點圖,從圖中可以直觀地看到相關性的方向和強弱,線性正相關一般形成由左下到右上的圖形;負面相關則是從左上到右下的圖形,還有一些非線性相關也能從圖中觀察到。
(2) 示例
(3) 結果分析
?從圖中可以看到明顯的正相關趨勢。
6. 正態資料的相關分析
(1) 用途
?皮爾森相關系數(Pearson correlation coefficient)是反應兩變量之間線性相關程度的統計量,用它來分析正態分布的兩個連續型變量之間的相關性。常用于分析自變量之間,以及自變量和因變量之間的相關性。
(2) 示例
(3) 結果分析
?返回結果的第一個值為相關系數表示線性相關程度,其取值范圍在[-1,1],絕對值越接近1,說明兩個變量的相關性越強,絕對值越接近0說明兩個變量的相關性越差。當兩個變量完全不相關時相關系數為0。第二個值為p-value,統計學上,一般當p-value0.05時,可以認為兩變量存在相關性。
7. 非正態資料的相關分析
(1) 用途
?斯皮爾曼等級相關系數(Spearman’s correlation coefficient for ranked data ),它主要用于評價順序變量間的線性相關關系,在計算過程中,只考慮變量值的順序(rank, 值或稱等級),而不考慮變量值的大小。常用于計算類型變量的相關性。
(2) 示例
(3) 結果分析
?返回結果的第一個值為相關系數表示線性相關程度,本例中correlation趨近于1表示正相關。第二個值為p-value,p-value越小,表示相關程度越顯著。
8. 單樣本T檢驗
(1) 用途
?單樣本T檢驗,用于檢驗數據是否來自一致均值的總體,T檢驗主要是以均值為核心的檢驗。注意以下幾種T檢驗都是雙側T檢驗。
(2) 示例
(3) 結果分析
?本例中生成了2列100行的數組,ttest_1samp的第二個參數是分別對兩列估計的均值,p-value返回結果,第一列1.47820719e-06比指定的顯著水平(一般為5%)小,認為差異顯著,拒絕假設;第二列2.83088106e-01大于指定顯著水平,不能拒絕假設:服從正態分布。
9. 兩獨立樣本T檢驗
(1) 用途
?由于比較兩組數據是否來自于同一正態分布的總體。注意:如果要比較的兩組數據不滿足方差齊性, 需要在ttest_ind()函數中添加參數equal_var = False。
(2) 示例
(3) 結果分析
?返回結果的第一個值為統計量,第二個值為p-value,pvalue=0.19313343989106416,比指定的顯著水平(一般為5%)大,不能拒絕假設,兩組數據來自于同一總結,兩組數據之間無差異。
10. 配對樣本T檢驗
(1) 用途
?配對樣本T檢驗可視為單樣本T檢驗的擴展,檢驗的對象由一群來自正態分布獨立樣本更改為二群配對樣本觀測值之差。它常用于比較同一受試對象處理的前后差異,或者按照某一條件進行兩兩配對分別給與不同處理的受試對象之間是否存在差異。
(2) 示例
(3) 結果分析
?返回結果的第一個值為統計量,第二個值為p-value,pvalue=0.80964043445811551,比指定的顯著水平(一般為5%)大,不能拒絕假設。
11. 單因素方差分析
(1) 用途
?方差分析(Analysis of Variance,簡稱ANOVA),又稱F檢驗,用于兩個及兩個以上樣本均數差別的顯著性檢驗。方差分析主要是考慮各組之間的平均數差別。
?單因素方差分析(One-wayAnova),是檢驗由單一因素影響的多組樣本某因變量的均值是否有顯著差異。
?當因變量Y是數值型,自變量X是分類值,通常的做法是按X的類別把實例成分幾組,分析Y值在X的不同分組中是否存在差異。
(2) 示例
(3) 結果分析
?返回結果的第一個值為統計量,它由組間差異除以組間差異得到,上例中組間差異很大,第二個返回值p-value=6.2231520821576832e-19小于邊界值(一般為0.05),拒絕原假設, 即認為以上三組數據存在統計學差異,并不能判斷是哪兩組之間存在差異 。只有兩組數據時,效果同 stats.levene 一樣。
12. 多因素方差分析
(1) 用途
?當有兩個或者兩個以上自變量對因變量產生影響時,可以用多因素方差分析的方法來進行分析。它不僅要考慮每個因素的主效應,還要考慮因素之間的交互效應。
(2) 示例
(3) 結果分析
?上述程序定義了公式,公式中,"~"用于隔離因變量和自變量,”+“用于分隔各個自變量, ":"表示兩個自變量交互影響。從返回結果的P值可以看出,X1和X2的值組間差異不大,而組合后的T:G的組間有明顯差異。
13. 卡方檢驗
(1) 用途
?上面介紹的T檢驗是參數檢驗,卡方檢驗是一種非參數檢驗方法。相對來說,非參數檢驗對數據分布的要求比較寬松,并且也不要求太大數據量。卡方檢驗是一種對計數資料的假設檢驗方法,主要是比較理論頻數和實際頻數的吻合程度。常用于特征選擇,比如,檢驗男人和女人在是否患有高血壓上有無區別,如果有區別,則說明性別與是否患有高血壓有關,在后續分析時就需要把性別這個分類變量放入模型訓練。
?基本數據有R行C列, 故通稱RC列聯表(contingency table), 簡稱RC表,它是觀測數據按兩個或更多屬性(定性變量)分類時所列出的頻數表。
(2) 示例
(3) 結果分析
?卡方檢驗函數的參數是列聯表中的頻數,返回結果第一個值為統計量值,第二個結果為p-value值,p-value=0.54543425102570975,比指定的顯著水平(一般5%)大,不能拒絕原假設,即相關性不顯著。第三個結果是自由度,第四個結果的數組是列聯表的期望值分布。
14. 單變量統計分析
(1) 用途
?單變量統計描述是數據分析中最簡單的形式,其中被分析的數據只包含一個變量,不處理原因或關系。單變量分析的主要目的是通過對數據的統計描述了解當前數據的基本情況,并找出數據的分布模型。
?單變量數據統計描述從集中趨勢上看,指標有:均值,中位數,分位數,眾數;從離散程度上看,指標有:極差、四分位數、方差、標準差、協方差、變異系數,從分布上看,有偏度,峰度等。需要考慮的還有極大值,極小值(數值型變量)和頻數,構成比(分類或等級變量)。
?此外,還可以用統計圖直觀展示數據分布特征,如:柱狀圖、正方圖、箱式圖、頻率多邊形和餅狀圖。
15. 多元線性回歸
(1) 用途
?多元線性回歸模型(multivariable linear regression model ),因變量Y(計量資料)往往受到多個變量X的影響,多元線性回歸模型用于計算各個自變量對因變量的影響程度,可以認為是對多維空間中的點做線性擬合。
(2) 示例
(3) 結果分析
?直接通過返回結果中各變量的P值與0.05比較,來判定對應的解釋變量的顯著性,P0.05則認為自變量具有統計學意義,從上例中可以看到收入INCOME最有顯著性。
16. 邏輯回歸
(1) 用途
?當因變量Y為2分類變量(或多分類變量時)可以用相應的logistic回歸分析各個自變量對因變量的影響程度。
(2) 示例
(3) 結果分析
?直接通過返回結果中各變量的P值與0.05比較,來判定對應的解釋變量的顯著性,P0.05則認為自變量具有統計學意義。
def fangcha(): a=float(raw_input("請輸入a:")) b=float(raw_input("請輸入b:")) c=float(raw_input("請輸入C:")) d=(a+b+c)/3.0 e=((a-d)**2+(b-d)**2+(c-d)**2)/3.0 print "平均數是:%f方差是:%f" %(d,e) fangcha() Python2.7可用
極差是指一組數據內的最大值和最小值之間的差異。
平均差是說明集中趨勢的,標準差是說明一組數據的離中趨勢的。
一組數據中各數據與平均數的差的平方和的平均數叫做這組數據的方差;
極差越大,平均差的代表性越小,反之亦然;標準差越大,平均差的代表性越小,反之亦然。
方差的算術平方根=標準差
python作為數據分析的利器,求極差、平均數、中位數、眾數與方差是很常用的,然而,在python進行統計往往要使用外部的python庫numpy,這個庫不難裝,然而,如果單純只是求極差、平均數、中位數、眾數與方差,還是自己寫比較好,因為,給一個.py程序別人的機器,別人的機器上沒有python庫numpy,又要別人折騰一番,這很不好。不過看情況咯,如果你要處理上億級的數據,還是配置一下外部的python庫numpy吧。
先給大家回歸一下極差、平均數、中位數、眾數與方差是什么鬼:
1、極差:最大值與最小值之差。它是標志值變動的最大范圍。英文:range
公式:R=Xmax-Xmin(其中,Xmax為最大值,Xmin為最小值)
2、平均數:一組數據中所有數據之和再除以數據的個數。反映數據集中趨勢的一項指標。英文:average
公式:
3、中位數:對于有限的數集,可以通過把所有觀察值高低排序后找出正中間的一個作為中位數。如果觀察值有偶數個,通常取最中間的兩個數值的平均數作為中位數。英文:median
公式:從小到大排序為??則N為奇數時,N為偶數時,?
4、眾數:眾數是樣本觀測值在頻數分布表中頻數最多的那一組的組中值,主要應用于大面積普查研究之中。英文:mode
例如:1,2,3,3,4的眾數是3。
但是,如果有兩個或兩個以上個數出現次數都是最多的,那么這幾個數都是這組數據的眾數。
例如:1,2,2,3,3,4的眾數是2和3。
還有,如果所有數據出現的次數都一樣,那么這組數據沒有眾數。
例如:1,2,3,4,5沒有眾數。
5、方差:方差是實際值與期望值之差平方的平均值,方差是在概率論和統計方差衡量隨機變量或一組數據是離散程度的度量。英文:variance
公式:或者(就是在《概率論與數理統計》中那條,方差就是平方的期望-期望的平方)
因此,根據上述的理論,得到如下的代碼:
[python]?view plain?copy
#-*-coding:utf-8-*-
import?time;
import?random;
class?Math:
#求極差
@staticmethod
def?range(l):
return?max(l)-min(l);
#求平均數
@staticmethod
def?avg(l):
return?float(sum(l))/len(l);
#求中位數
@staticmethod
def?median(l):
l=sorted(l);#先排序
if?len(l)%2==1:
return?l[len(l)/2];
else:
return?(l[len(l)/2-1]+l[len(l)/2])/2.0;
#求眾數
@staticmethod
def?mode(l):
#統計list中各個數值出現的次數
count_dict={};
for?i?in?l:
if?count_dict.has_key(i):
count_dict[i]+=1;
else:
count_dict[i]=1;
#求出現次數的最大值
max_appear=0
for?v?in?count_dict.values():
if?vmax_appear:
max_appear=v;
if?max_appear==1:
return;
mode_list=[];
for?k,v?in?count_dict.items():
if?v==max_appear:
mode_list.append(k);
return?mode_list;
#求方差
@staticmethod
def?variance(l):#平方的期望-期望的平方
s1=0;
s2=0;
for?i?in?l:
s1+=i**2;
s2+=i;
return?float(s1)/len(l)-(float(s2)/len(l))**2;
#求方差2
@staticmethod
def?variance2(l):#平方-期望的平方的期望
ex=float(sum(l))/len(l);
s=0;
for?i?in?l:
s+=(i-ex)**2;
return?float(s)/len(l);
#主函數,測試
arr=[1,2,3,2,3,1,4];
print?"極差為:{0}".format(Math.range(arr));
print?"平均數為:{0:.2f}".format(Math.avg(arr));
print?"中位數為:{0}".format(Math.median(arr));
print?"眾數為:{0}".format(Math.mode(arr));
print?"方差為:{0:.2f}".format(Math.variance(arr));
print?"方差為:{0:.2f}".format(Math.variance2(arr));
print;
#性能測試
arraylist=[];
for?i?in?range(1,1000000):
arraylist.append(i);
random.shuffle(arraylist);
time_start=time.time();
print?"方差為:{0:.2f}".format(Math.variance(arraylist));
time_end=time.time();
print?"{0}s".format(time_end-time_start);
time_start=time.time();
print?"方差為:{0:.2f}".format(Math.variance2(arraylist));
time_end=time.time();
print?"{0}s".format(time_end-time_start);
運行結果如下:
關于這個程序有幾點說明的:
(1)開頭引入time與random主要是為了最后部分測試兩種求方差的方式那種性能較優使用,一般情況下使用上述我自定義的Math類,無須引入任何python包。
(2)求任何一個統計量,用到除法,注意先將int先轉float,否則精度損失嚴重,你是得到不到最后的正確答案的。
(3)python中自帶有求list所有元素之和的sum,求list中的最值max,min,對list中的元素進行從小到大的排序sort()都用了,其余只能讓我們自己現實了。
(4)這里無須考慮如果形式參數被傳入一個字符串數組怎么辦,因為這些工具類都是我們自己使用了,自己控制好要傳遞的數值,無須考慮這么多。
(5)求眾數最艱難,因為用不到任何python自帶的方法,還要返回一個list,因為眾數的個數不定,統計數組中出現次數最多的數的時候,用到了python中的字典dict,《【Python】容器類》(點擊打開鏈接),這個字典中,key是list中的數字,values是該數字出現的次數。然后要求出現次數的最大值,最后再求出改最大值對應的key。其中用count_dict.items()返回字典中的key-value對的數組集,count_dict.values()返回字典中的value集,當然同時也有count_dict.keys()返回key集。
(6)由于求方差的方法有兩種,此程序在最后部分生成了一個百萬級、打亂順序的list,對兩種求方差的方法進行測試,令人吃驚的是,萬萬沒想到是我們愚蠢的人類最不愛用,也最難用的,最不好用的平方-期望的平方的期望,優于更好記憶的、更常用的平方的期望-期望的平方:。。從上述的運行結果可以看出這種求方差的方法速度是的一倍!這就是聰明的計算機與愚蠢的人類的區別吧~
(7)最后,python的打印到控制臺,其實你完全可以print得更好的,你不換行還要在print后面補逗號嗎,再print一個什么東東,或者將數值用str先轉字符串才能與純正的字符串連接起來,而字符串的format方法,配合print相當于C語言的printf,同時python的format用{0},{1}...代表后面的第0、1……參數。{0:.2f}代表這個參數以保留2位小數的方式輸出。
閱讀全文
版權聲明:本文為博主原創文章,未經
分享標題:python數據極差函數,用python曲線函數的極值
網址分享:http://vcdvsql.cn/article24/heojce.html
成都網站建設公司_創新互聯,為您提供網站建設、靜態網站、網站設計公司、全網營銷推廣、營銷型網站建設、網站收錄
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯