在Python中平滑

时间:2016-01-27 13:39:52

标签: python numpy convolution smoothing

我经常对我的数据使用时间平均视图,以便在绘制时减少噪音。例如,如果我的数据每1分钟一次,那么我有两个数组tsys。然后我创建了fs,它是ys中60个最近点的局部平均值。我通过简单计算60个最近点的平均值来自己进行卷积,所以我不使用numpy或其他任何模块。

我有新数据ts稍微稀疏。也就是说,有时我会错过一些数据点,因此我不能简单地取60个最近点的平均值。如果我的自变量ts在几分钟内,我如何计算我的因变量ys的每小时平均值,以在{{1}中创建小时平均函数fs }}?

3 个答案:

答案 0 :(得分:2)

  

如果我的自变量ts在几分钟内,我如何计算我的因变量ys的每小时平均值,以便在python中创建小时平均函数fs?

这是一个复杂的问题,可能的答案因“小时平均”的含义而有很大差异。

处理不规则间隔数据的一种方法是重新采样。重新采样可以通过插值完成,然后生成的重采样数据可用于您喜欢的任何滤波方法。

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import savgol_filter
%matplotlib inline

def y(t):
    # a function to simulate data
    return np.sin(t/20.) + 0.05*np.random.randn(len(t))

four_hours = np.arange(240)
random_time_points = np.sort(np.random.choice(four_hours, size=30, replace=False))

simulated_data = y(random_time_points)
resampled_data = np.interp(four_hours, random_time_points, simulated_data)

# here I smooth with a Savitzky-Golay filter, 
#  but you could use a moving avg or anything else
#  the window-length=61 means smooth over a 1-hour (60 minute) window
smoothed_data = savgol_filter(resampled_data, window_length=61, polyorder=0)

# plot some results
plt.plot(random_time_points, simulated_data, '.k', 
         four_hours, smoothed_data, '--b',
         four_hours, y(four_hours), '-g')

# save plot
plt.savefig('SO35038933.png')

Plot of data

该图显示原始“稀疏”数据(黑点),原始“真实”数据(绿色曲线)和平滑数据(蓝色虚线曲线)。

答案 1 :(得分:0)

如果我理解正确,我认为这样的事情可能有用。

import threading    

hours_worth_of_data = []    
def timer():
  threading.Timer(3600, timer).start()  #3600 seconds in an hour
  smooth = sum(hours_worth_of_data) / len(hours_worth_of_data)
  # do something with smooth here
  del hours_worth_of_data[:]  #Start over with fresh data for next hour
timer()

每当您获取数据时,也会将数据加载到" hours_worth_of_data。"每小时它会对数据进行平均,然后删除列表中的数据。

答案 2 :(得分:0)

我最终根据我感兴趣的时间单位创建了一个表示数据的数组,然后对该数组执行统计。例如,将“分钟”时间创建为“小时”时间,并在该小时内使用ys的平均值:

for i in range(len(ts0)):
    tM = ts0[i] # time in minutes
    tH = tM/60.0 # time in hours

    tHs[i] = int(tH) # now this is the data within hour tH

tHs0 = tHs[:] # keep a record of the original hourly times, there are repeats here
tHs = list(set(tHs0)) # now we have a list of the hours with no repeats

for i in range(len(ts0)):
    y0 = ys0[i]
    t0 = ts0[i]
    tH = int(t0/60.0)
    ys[tHs.index(tH)] += R0
    Cs[tHs.index(tH)] += 1 # keep a record of how many times this was seen

for i in range(len(ys)):
    ys[i] = ys[i]/Cs[i]