2016-07-14 46 views
0

我需要使用移動平均來平滑我的數據,所以我使用卷積編寫了一個函數。但與我的原始數據相比,結果是左移。所以我用熊貓的內置rolling_mean(),它工作得很好。問題是我不想使用熊貓,我試圖重寫這個函數,但是源代碼並沒有解釋它是如何工作的(或者只是我)。pandas rolling_mean()如何工作?

我最初的功能是大熊貓rolling_mean()

def moving_average(data, window): 
    return np.convolve(data, np.ones(window)/window, mode='valid') 

的源代碼是:

def f(arg, window, min_periods=None, freq=None, center=False, how=how, 
     **kwargs): 
    def call_cython(arg, window, minp, args=(), kwargs={}, **kwds): 
     minp = check_minp(minp, window) 
     return func(arg, window, minp, **kwds) 
    return _rolling_moment(arg, window, call_cython, min_periods, freq=freq, 
          center=center, how=how, **kwargs) 

的關鍵是論證「中心」,但我不知道它是如何工作。 Picture what I mean 藍色是原始數據,綠色是我的嘗試,紅色(正確)版本來自熊貓。

回答

1

有沒有一種正確的方法來平滑數據,即使你使用的意思是仍然有很多變化。儘管簡單的滾動手段,移動是一個非常普遍的結果。

您從pandas.rolling_mean發佈的代碼位不顯示操作;您可以看到它指定的位置,例如,how=how它傳遞了一個參數,該參數未包含在片段中以確定它使用的方法。它也引用cython,所以我認爲命令的內容是用C編寫的,而不是用Python編寫的(通用因爲它速度更快)。

我沒有去尋找底層代碼,因爲rolling_mean沒有太多的文檔已被棄用引導。請從Pandas的最新版本看看rolling,它會告訴你它可以做什麼類型的平滑器。您可以嘗試將這些參數傳遞給rolling函數,並查看哪個函數執行了您想要的操作;那麼你可以從你選擇的源頭查看它後面的數學,以再現其他地方。

我不知道原始海報的經驗水平,但對於任何閱讀此文的人來說,他們可能不太熟悉信號處理或數據平滑,從趨勢中分離噪音是一個巨大的研究領域。當你這樣做時要非常小心,因爲結果對方法非常敏感。除了熊貓提供的所有滾動功能之外,還有其他一些功能,請查看Holt-Winters,Baxter-King或Hodrick-Prescott。他們都以不同的方式解決問題,結果非常不同,長處和短處。