我经常对我的数据使用时间平均视图,以便在绘制时减少噪音。例如,如果我的数据每1分钟一次,那么我有两个数组ts
和ys
。然后我创建了fs
,它是ys
中60个最近点的局部平均值。我通过简单计算60个最近点的平均值来自己进行卷积,所以我不使用numpy
或其他任何模块。
我有新数据ts
稍微稀疏。也就是说,有时我会错过一些数据点,因此我不能简单地取60个最近点的平均值。如果我的自变量ts
在几分钟内,我如何计算我的因变量ys
的每小时平均值,以在{{1}中创建小时平均函数fs
}}?
答案 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')
该图显示原始“稀疏”数据(黑点),原始“真实”数据(绿色曲线)和平滑数据(蓝色虚线曲线)。
答案 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]