Обнаружение нескольких временных сдвигов между двумя сигналами - PullRequest
1 голос
/ 22 апреля 2019

У меня есть два временных ряда данных о температуре.Оба имеют (если они находятся в одном и том же часовом поясе очень похожие базовые функции (годовой и дневной сезоны)

Сигнал A измеряется в UTC0 с ежечасной частотой. Измерение, например, 5 ° C в 13:00, означает, что среднее значениетемпература между полуднем и 13 часами составила 5 ° C.

Часовой пояс сигнала B. неизвестен, и его измеряют с интервалами в 10 минут. Измерение, например, 5 ° C в 1 час, означает, что средняя температура между 12,50 и 13 часами была5 ° C. Кроме того, сигнал B может иметь многократные изменения часового пояса.

Я хотел бы написать алгоритм, который способен определять часовой пояс (ы) сигнала B.

IМысль о взаимной корреляции нескольких интервалов могла бы стать способом решения этой проблемы, поэтому я попробовал следующее:

  1. Я агрегировал сигнал B на почасовой частоте, используя среднее значение каждого часа.

  2. Я подгоняю модель к Сигналу A, чтобы получить остатки от Сигнала A.

  3. Я вычел модель Сигнала A из Сигнала Bчтобы получить остатки сигнала B.

  4. Я провел перекрестную корреляцию для нескольких лагов по двум остаткам для последовательных интервалов (я пробовал несколько интервалов здесь от нескольких недель до трех месяцев)

К сожалению, результаты, которые я получаю, довольно дикие и, кажется, повсюду.

'''
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, но результаты, которые я получаю, совершенно одинаковы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...