组合时间序列中的相似信号
Combining similar signals in timeseries
假设我有这样一个信号。我已经试了好几轮了,现在可以更轻松地管理信号了。
但无论出于何种原因,我似乎无法消除一些细微差别。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
a = [0.5]*20
b = [0.4]*20
c = [0.503]*20
d = [0.4]*20
signal = pd.Series(np.concatenate([a,b,c,d]))
plt.figure(figsize = (7,3))
plt.plot(signal, color = "firebrick")
plt.axhline(0.5, linestyle = ":")
plt.show()
# Identify the four different intensities, so they can be grouped
id = signal.transform(lambda x: (abs(x.diff()) > 0).cumsum())
我在想一个解决方案是将所有信号从低到高排列
[0.4, 0.4, 0.5, 0.503]
然后通过它们,同时忽略微小的差异,例如0.010
,所以
id = signal.transform(lambda x: (abs(x.diff()) > 0.010).cumsum())
那么我只能正确识别 2 种不同的强度。对于微小的差异,我可以取平均值或中位数。这并没有什么区别。重要的是我计算的强度不超过 2 个。
我该怎么做?
这里是我在评论中提出的想法的详细说明。
使用信号的平均值作为阈值。然后计算高于阈值和低于阈值的信号部分的中值。使用这些来转换您的数据。
med_high = signal[signal > signal.mean()].median()
med_low = signal[signal < signal.mean()].median()
print (med_low, med_high)
new_signal = signal.transform(lambda x: med_low if x < signal.mean() else med_high)
plt.figure(figsize = (7,3))
plt.plot(new_signal, color = "firebrick")
plt.axhline(0.5, linestyle = ":")
plt.show()
结果:
假设我有这样一个信号。我已经试了好几轮了,现在可以更轻松地管理信号了。
但无论出于何种原因,我似乎无法消除一些细微差别。
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
a = [0.5]*20
b = [0.4]*20
c = [0.503]*20
d = [0.4]*20
signal = pd.Series(np.concatenate([a,b,c,d]))
plt.figure(figsize = (7,3))
plt.plot(signal, color = "firebrick")
plt.axhline(0.5, linestyle = ":")
plt.show()
# Identify the four different intensities, so they can be grouped
id = signal.transform(lambda x: (abs(x.diff()) > 0).cumsum())
我在想一个解决方案是将所有信号从低到高排列
[0.4, 0.4, 0.5, 0.503]
然后通过它们,同时忽略微小的差异,例如0.010
,所以
id = signal.transform(lambda x: (abs(x.diff()) > 0.010).cumsum())
那么我只能正确识别 2 种不同的强度。对于微小的差异,我可以取平均值或中位数。这并没有什么区别。重要的是我计算的强度不超过 2 个。
我该怎么做?
这里是我在评论中提出的想法的详细说明。
使用信号的平均值作为阈值。然后计算高于阈值和低于阈值的信号部分的中值。使用这些来转换您的数据。
med_high = signal[signal > signal.mean()].median()
med_low = signal[signal < signal.mean()].median()
print (med_low, med_high)
new_signal = signal.transform(lambda x: med_low if x < signal.mean() else med_high)
plt.figure(figsize = (7,3))
plt.plot(new_signal, color = "firebrick")
plt.axhline(0.5, linestyle = ":")
plt.show()
结果: