2014-08-27 30 views
3

我有一段時間以來的Internet測量實驗結果,如下圖所示。我正在做大熊貓的時間序列分析。數據有一定的下降,這是由於服務器中斷。我正在尋找平滑數據的好方法。用已知傾斜平滑時間序列的函數

在較簡單的內置平滑函數中,pd.rolling_max()提供了相當好的估計。然而它高估了一點。我還嘗試編寫自己的平滑函數,當下降> 20%時,函數會傳遞值。這也提供了相當好的估計,但是閾值是任意設定的。

def my_smooth(win, thresh = 0.80): 
    win = win.copy() 
    for i, val in enumerate(win): 
     if i > 1 and val < win[i-1] * thresh: 
      win[i] = win[i-1]  
    return win[-1] 

ts = pd.rolling_apply(ts, 6, my_smooth) 

我的問題是,這種類型的時間序列具有更好的平滑功能,具體的特點是什麼? (即,它是事件的計數,並且在特定時間計數下的主要測量誤差很大)。另外,我建議的平滑功能可以減少臨時或優化嗎?

enter image description here

+0

的[HP-濾波器(http://statsmodels.sourceforge.net/devel/generated/statsmodels.tsa.filters.hp_filter.hpfilter.html#statsmodels.tsa.filters.hp_filter.hpfilter)或來自statsmodels的[kalman過濾器](http://statsmodels.sourceforge.net/devel/generated/statsmodels.tsa.kalmanf.kalmanfilter.Kalmanfilter.html#statsmodels.tsa.kalmanf.kalmanfilter.KalmanFilter)應該很好。 – TomAugspurger 2014-08-27 12:39:57

+0

濾波器/平滑器的適當選擇取決於您要對平滑數據執行的操作。話雖如此,你也可以嘗試'rolling_median'。 – 2014-08-27 12:49:36

+0

@WarrenWeckesser,謝謝,除其他外,我想將趨勢線擬合成部分數據。我已經嘗試過'rolling_median'(添加圖片到帖子);在窗口很小的情況下會出現幾個不好的測量結果,這樣做效果不好。如果窗口被放大,它會消耗太多。 – Hadi 2014-08-27 12:57:44

回答

3

我想補充的是如何我終於解決了這個問題對任何人感興趣。最重要的是,在研究了許多平滑技術後,由於它改變了數據,我最終決定不進行平滑處理。相反,我選擇將10%的點作爲離羣值進行濾除,這是機器學習和信號處理中的常用技術。

我們的例子中的異常值是測量記錄失敗導致的低測量值。有許多技術可以檢測異常值,其中流行的是在NIST的Engineering Statistics Handbook中命名的。鑑於我的數據有明顯的趨勢,我選擇了「中值絕對偏差」的變化:將測量系列中的每個點與滾動中值進行比較,產生差異,並適當選擇一個截止點。

# 'data' are the weekly measurements, in a Pandas series 
filtered = data.copy() 
dm = pd.rolling_median(data, 9, center=True) 
df = sorted(np.abs(data - dm).dropna(), reverse=True) 
cutoff = df[len(df) // 10] 
filtered[np.abs(data - dm) > cutoff] = np.nan