移動平均(numpy.convolve利用)1次元
関連記事に乗せている2次元よりは1次元のほうが使い勝手がよさそうなので書き換え。
起点からwindowsizeの範囲で合計するだけではなくて、起点側を,ignoresize個を無視して合計するような形にしている。
np.convolveの2つ目の引数の割当たりかたが想像の逆なので、v=np.flip(v) で反転している。
ソースコード
import numpy as np def np_moving_sum(data_1d,windowsize=3,ignoresize=0): ''' 1次元のリスト or np.array ''' if data_1d is None: data_1d = [1,2,3,5,8,13,21,34,55,89] if type(data_1d) == np.ndarray: np_data_1d=data_1d elif type(data_1d) == list: np_data_1d=np.array(data_1d) # np_data_1d.shape は、(10,) answer = np.zeros(np_data_1d.shape) answer[:] = np.nan # vの長さが3の時 # v[0]=0 3番目にマッピングされる # v[1]=1 2番目にマッピングされる # v[2]=0 1番目にマッピングされる v = np.ones(windowsize) v[0:ignoresize]=0 v=np.flip(v) answer[: np_data_1d.shape[0] - windowsize + 1 ]=np.convolve(np_data_1d, v, mode = "valid") return answer def np_moving_average(data_1d,windowsize=3,ignoresize=0): return np_moving_sum(data_1d,windowsize,ignoresize)/(windowsize-ignoresize) if __name__ == "__main__": data_1d = [1,2,3,5,8,13,21,34,55,89] print(data_1d,'\n') print(np_moving_sum(data_1d=data_1d,windowsize=3,ignoresize=2)) print(np_moving_sum(data_1d=data_1d,windowsize=3,ignoresize=1)) print(np_moving_sum(data_1d=data_1d,windowsize=3,ignoresize=0)) print('\n') print(np_moving_sum(data_1d=data_1d,windowsize=4,ignoresize=3)) print(np_moving_sum(data_1d=data_1d,windowsize=4,ignoresize=2)) print(np_moving_sum(data_1d=data_1d,windowsize=4,ignoresize=1)) print(np_moving_sum(data_1d=data_1d,windowsize=4,ignoresize=0)) print('\n') print(np_moving_average(data_1d=data_1d,windowsize=3,ignoresize=2)) print(np_moving_average(data_1d=data_1d,windowsize=3,ignoresize=1)) print(np_moving_average(data_1d=data_1d,windowsize=3,ignoresize=0)) print('\n') print(np_moving_average(data_1d=data_1d,windowsize=4,ignoresize=3)) print(np_moving_average(data_1d=data_1d,windowsize=4,ignoresize=2)) print(np_moving_average(data_1d=data_1d,windowsize=4,ignoresize=1)) print(np_moving_average(data_1d=data_1d,windowsize=4,ignoresize=0))
実行結果
(base) C:\>python lib_moving_calcs_np.py [1, 2, 3, 5, 8, 13, 21, 34, 55, 89] [ 3. 5. 8. 13. 21. 34. 55. 89. nan nan] [ 5. 8. 13. 21. 34. 55. 89. 144. nan nan] [ 6. 10. 16. 26. 42. 68. 110. 178. nan nan] [ 5. 8. 13. 21. 34. 55. 89. nan nan nan] [ 8. 13. 21. 34. 55. 89. 144. nan nan nan] [ 10. 16. 26. 42. 68. 110. 178. nan nan nan] [ 11. 18. 29. 47. 76. 123. 199. nan nan nan] [ 3. 5. 8. 13. 21. 34. 55. 89. nan nan] [ 2.5 4. 6.5 10.5 17. 27.5 44.5 72. nan nan] [ 2. 3.33333333 5.33333333 8.66666667 14. 22.66666667 36.66666667 59.33333333 nan nan] [ 5. 8. 13. 21. 34. 55. 89. nan nan nan] [ 4. 6.5 10.5 17. 27.5 44.5 72. nan nan nan] [ 3.33333333 5.33333333 8.66666667 14. 22.66666667 36.66666667 59.33333333 nan nan nan] [ 2.75 4.5 7.25 11.75 19. 30.75 49.75 nan nan nan]