pythonにunixtime、値:
[(1301672429, 274), (1301672430, 302), (1301672431, 288)...]
時間は常に1秒ずつ進みます。タイムスタンプが毎秒になるようにこのデータを減らすにはどうすればよいですか?ただし、値は周囲の10個の値の平均です。
より派手な移動平均も良いでしょうが、このデータはグラフ化されているので、ほとんどの場合、グラフを滑らかにすることです。
( 時間グループのTSQL移動平均 SQLでこれを実行しようとすると苦痛のルートであるという結論に達した後のフォローアップ)。
numpy
にアクセスできる場合は、次のレシピを試すことができます。
使用 http://www.scipy.org/Cookbook/SignalSmooth :
import numpy
def smooth(x,window_len=11,window='hanning'):
if x.ndim != 1:
raise ValueError, "smooth only accepts 1 dimension arrays."
if x.size < window_len:
raise ValueError, "Input vector needs to be bigger than window size."
if window_len<3:
return x
if not window in ['flat', 'hanning', 'hamming', 'bartlett', 'blackman']:
raise ValueError, "Window is on of 'flat', 'hanning', 'hamming', 'bartlett', 'blackman'"
s=numpy.r_[2*x[0]-x[window_len-1::-1],x,2*x[-1]-x[-1:-window_len:-1]]
if window == 'flat': #moving average
w=numpy.ones(window_len,'d')
else:
w=eval('numpy.'+window+'(window_len)')
y=numpy.convolve(w/w.sum(),s,mode='same')
return y[window_len:-window_len+1]
私は(数学を理解しているわけではありませんが)良い結果が得られるようです:
if form_results['smooth']:
a = numpy.array([x[1] for x in results])
smoothed = smooth(a,window_len=21)
results = Zip([x[0] for x in results], smoothed)