import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng()
# Adapted from https://scipy-cookbook.readthedocs.io/items/SignalSmooth.html
# Expects the NumPy library to be available as 'np'
def smooth(x, window_len=11, window='flat'):
if x.ndim != 1:
raise ValueError("Not a 1-dimensional array.")
if x.size < window_len:
raise ValueError("Input size smaller than window size.")
if window_len < 3:
return x
allowed = ['flat', 'hanning', 'hamming', 'bartlett', 'blackman']
if not window in allowed:
raise ValueError("Window not in ['" + "', '".join(allowed) + "'].")
s = np.r_[x[window_len - 1:0:-1], x, x[-2:-window_len - 1:-1]]
if window == 'flat':
w = np.ones(window_len, 'd')
else:
w = eval('np.' + window + '(window_len)')
y = np.convolve(w / w.sum(), s, mode='valid')
return y
# Make integer array
def rounda(a):
return np.round(a).astype(int)
avg = 100
dev = 10
siz = 1000
win = 51
uni = rounda(rng.integers(low=avg - dev, high=avg + dev + 1, size=siz))
nrm = rounda(rng.normal(loc=avg, scale=dev / 3, size=siz))
uni_mov = rounda(smooth(uni, win, 'flat'))
uni_han = rounda(smooth(uni, win, 'hanning'))
uni_blk = rounda(smooth(uni, win, 'blackman'))
nrm_mov = rounda(smooth(nrm, win, 'flat'))
nrm_han = rounda(smooth(nrm, win, 'hanning'))
nrm_blk = rounda(smooth(nrm, win, 'blackman'))
fig, ax = plt.subplots(figsize=(14, 10))
fig.suptitle('Uniform Distribution', size='xx-large')
ax.plot(uni, '.')
ax.plot(uni_mov, label='Moving average')
ax.plot(uni_han, label='Hanning window')
ax.plot(uni_blk, label='Blackman window')
ax.set_yticks(np.arange(avg - dev, avg + dev + 1, dev / 2))
ax.axhline(avg, color='grey', linestyle=':')
ax.axhline(avg - dev, color='grey', linestyle=':')
ax.axhline(avg + dev, color='grey', linestyle=':')
ax.legend()
fig.tight_layout()
plt.show()
fig, ax = plt.subplots(figsize=(14, 10))
fig.suptitle('Normal Distribution', size='xx-large')
ax.plot(nrm, '.')
ax.plot(nrm_mov, label='Moving average')
ax.plot(nrm_han, label='Hanning window')
ax.plot(nrm_blk, label='Blackman window')
ax.set_yticks(np.arange(avg - dev, avg + dev + 1, dev / 2))
ax.axhline(avg, color='grey', linestyle=':')
for i in range(-3, 4):
ax.axhline(avg + i * dev / 3, color='grey', linestyle=':')
ax.legend()
fig.tight_layout()
plt.show()