2014-10-09 3 views
0

Я хочу разработать код python для выравнивания наборов данных, полученных разными инструментами, записывающих одно и то же событие.Выравнивание двух наборов данных в Python

В качестве примера, скажем, у меня есть два набора измерений:

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

# Define some data 
data1 = pd.DataFrame({'TIME':[1.1, 2.4, 3.2, 4.1, 5.3],\ 
         'VALUE':[10.3, 10.5, 11.0, 10.9, 10.7],\ 
       'ERROR':[0.2, 0.1, 0.4, 0.3, 0.2]}) 

data2 = pd.DataFrame({'TIME':[0.9, 2.1, 2.9, 4.2],\ 
         'VALUE':[18.4, 18.7, 18.9, 18.8],\ 
       'ERROR':[0.3, 0.2, 0.5, 0.4]}) 

# Plot the data  
plt.errorbar(data1.TIME, data1.VALUE, yerr=data1.ERROR, fmt='ro') 
plt.errorbar(data2.TIME, data2.VALUE, yerr=data2.ERROR, fmt='bo') 
plt.show() 

Результат строится здесь: enter image description here

То, что я хотел бы сделать сейчас, чтобы выровнять второй набор данных (data2) к первому (данные1). то есть для этого: enter image description here

Второй набор данных должен быть сдвинут в соответствии с первым, вычитая константу (которая будет определена) из всех ее значений. Все, что я знаю, это то, что наборы данных коррелируют, поскольку два инструмента измеряют одно и то же событие, но с разными частотами выборки.

На этом этапе я не хочу делать какие-либо предположения о том, какая функция лучше всего описывает данные (установка будет выполнена после выравнивания).

Я с осторожностью отношусь к использованию средств для выполнения сдвигов, так как это может привести к плохим результатам в зависимости от того, как производится выборка данных. Я рассматривал возможность ввода данных2 [TIME_i] и разработки кратчайшего расстояния до data1 [~ TIME_i]. Тогда минимизируем их сумму. Но я не уверен, что это тоже сработает.

Есть ли у кого-нибудь предложения по хорошему методу использования? Я посмотрел на mlpy, но, похоже, работает только на 1D массивах.

Спасибо.

+1

Должно быть перенесено на http: // stats. stackexchange.com/ Это не место для итерации всеми возможными способами согласования двух наборов данных. Когда вы знаете, что хотите, вернитесь сюда, чтобы реализовать его. – tom10

ответ

2

Вы можете вычислить смещение среднего и вычесть из каждого значения. Если вы делаете это для каждого значения, то они должны хорошо относиться. Это предполагает, что оба набора данных выглядят относительно похожими, поэтому он может не работать наилучшим образом.

Хотя этот вопрос не MatLab связан, вы все еще можете быть в этом заинтересованы: Remove unknown DC Offset from a non-periodic discrete time signal

3

Вы можете вычесть среднее значение разности: data2.VALUE-(data2.VALUE - data1.VALUE).mean()

import pandas as pd 
import matplotlib.pyplot as plt 

# Define some data 
data1 = pd.DataFrame({ 
    'TIME': [1.1, 2.4, 3.2, 4.1, 5.3], 
    'VALUE': [10.3, 10.5, 11.0, 10.9, 10.7], 
    'ERROR': [0.2, 0.1, 0.4, 0.3, 0.2], 
}) 

data2 = pd.DataFrame({ 
    'TIME': [0.9, 2.1, 2.9, 4.2], 
    'VALUE': [18.4, 18.7, 18.9, 18.8], 
    'ERROR': [0.3, 0.2, 0.5, 0.4], 
}) 

# Plot the data 
plt.errorbar(data1.TIME, data1.VALUE, yerr=data1.ERROR, fmt='ro') 
plt.errorbar(data2.TIME, data2.VALUE-(data2.VALUE - data1.VALUE).mean(), 
      yerr=data2.ERROR, fmt='bo') 
plt.show() 

aligned error bars

Другой возможность - вычесть среднее значение для каждой серии

+0

Я немного осторожен в реализации чего-то подобного, потому что он не всегда будет хорошим решением. Рассмотрим следующую ситуацию: data1 и data2 являются выборкой по гауссовскому распределению, но данные 1 соответствуют измерениям, полученным главным образом на крыльях распределения и данных2 вокруг пика. Использование средств для выполнения сдвигов может не дать лучших результатов в этом случае. Я думал о том, чтобы разбить оба набора данных по х и развить расстояния до ближайших соседей. Тогда минимизируем их сумму. Но я не уверен, что это сработает. – Hooloovoo

+0

@ Hooloovoo: Единственная спецификация, которую вы дали, была двумя графиками, и этот ответ математически обоснован и выглядит точно так же, как вы говорите, что вы хотели (так +1). Если бы вы знали о среднем решении и не любили его, вы должны были сказать это в своем первоначальном вопросе.Требуется время, чтобы ответить на вопросы, и это пустая трата времени, чтобы вы могли сказать, что уже знаете о очевидном ответе и ищете что-то более тонкое. Среднее взвешенное значение ошибки возможно, но если вы знали, что это именно то, что вы хотели, попросите его. – tom10

+0

Хорошо, спасибо за ответ. – Hooloovoo

Смежные вопросы