У меня есть два временных ряда данных о температуре.Оба имеют (если они находятся в одном и том же часовом поясе очень похожие базовые функции (годовой и дневной сезоны)
Сигнал A измеряется в UTC0 с ежечасной частотой. Измерение, например, 5 ° C в 13:00, означает, что среднее значениетемпература между полуднем и 13 часами составила 5 ° C.
Часовой пояс сигнала B. неизвестен, и его измеряют с интервалами в 10 минут. Измерение, например, 5 ° C в 1 час, означает, что средняя температура между 12,50 и 13 часами была5 ° C. Кроме того, сигнал B может иметь многократные изменения часового пояса.
Я хотел бы написать алгоритм, который способен определять часовой пояс (ы) сигнала B.
IМысль о взаимной корреляции нескольких интервалов могла бы стать способом решения этой проблемы, поэтому я попробовал следующее:
Я агрегировал сигнал B на почасовой частоте, используя среднее значение каждого часа.
Я подгоняю модель к Сигналу A, чтобы получить остатки от Сигнала A.
Я вычел модель Сигнала A из Сигнала Bчтобы получить остатки сигнала B.
Я провел перекрестную корреляцию для нескольких лагов по двум остаткам для последовательных интервалов (я пробовал несколько интервалов здесь от нескольких недель до трех месяцев)
К сожалению, результаты, которые я получаю, довольно дикие и, кажется, повсюду.
'''
For this example I am making the assumption that the signal consists of two sine waves.
'''
# Creating the two signals
x = np.arange(0, 4*math.pi, 0.01)
signalA = np.sin(x) + np.sin(x*10) + np.random.randn(len(x))*0.1
signalB = np.sin(x) + np.sin(x*10) + np.random.randn(len(x))*0.1
data = pd.DataFrame()
data['A'] = signalA
data['B'] = signalB
data.loc[500:, 'B'] = data.loc[500:, 'B'].shift(10)
data.loc[800:, 'B'] = data.loc[800:, 'B'].shift(-15)
# Pre-whiten
data['Aw'] = data.A - (np.sin(x) + np.sin(x*10))
data['Bw'] = data.B - (np.sin(x) + np.sin(x*10))
# Find max cross correlation
def crosscorr(d1, d2, lag):
return d1.corr(d2.shift(lag))
def max_lag(d1, d2):
d = {}
for i in range(-30, 31):
d[crosscorr(d1, d2, i)] = i
return d[max(d)]
d_index = []
d_lag = []
for i in range(100, len(x), 10):
d_index.append(i)
d_lag.append(max_lag(data[i-100:i].Aw, data[i-100:i].Bw))
# Plot result
plt.scatter(d_index, d_lag)
Я хотел бы получить argmax от ccf от 0:500 - 0, 500: 800 - 10, а 800 - конец -5, но результаты, которые я получаю, совершенно одинаковы.