Каков наилучший метод для сопоставления функции косинуса с большим набором данных в Python? - PullRequest
0 голосов
/ 26 февраля 2019

У меня большой набор данных (~ 17 000 значений), состоящий из массива объектов datetime и другого массива связанных значений с плавающей запятой.Я пытаюсь сопоставить грубую функцию косинуса со всеми точками данных, чтобы помочь проанализировать схемы сна.Я пытался найти лучший способ сопоставить кривую косинуса со всеми этими данными.Я исследовал несколько методов и обнаружил некоторые похожие ситуации, но одна из проблем, с которыми я столкнулся, состоит в том, чтобы выяснить, как выполнять вычисления, используя datetime вместо некоторого другого произвольного значения.

Кодя написал до сих пор извлекает необходимые данные в 2 массива.Один с плавающей точкой, а другой с соответствующими значениями даты и времени.

Пример данных:

Вот пример данных, с которыми я работаю, скопированных из отладчика.Первый массив содержит datetime, а второй массив содержит целочисленные значения.Я нашел несколько способов подгонки кривых к данным, но у меня возникли проблемы с определением даты и времени.Я нашел этот метод здесь и попытался преобразовать дату и время в число с плавающей запятой, используя функцию timestamp ().

Array 1:
00000 = {datetime} 2017-11-30 11:04:00
00001 = {datetime} 2017-11-30 11:05:00
00002 = {datetime} 2017-11-30 11:06:00
00003 = {datetime} 2017-11-30 11:07:00
00004 = {datetime} 2017-11-30 11:08:00
00005 = {datetime} 2017-11-30 11:09:00
00006 = {datetime} 2017-11-30 11:10:00
00007 = {datetime} 2017-11-30 11:11:00
00008 = {datetime} 2017-11-30 11:12:00
00009 = {datetime} 2017-11-30 11:13:00
00010 = {datetime} 2017-11-30 11:14:00

Array 2:
00000 = {int} 847
00001 = {int} 684
00002 = {int} 3602
00003 = {int} 1029
00004 = {int} 1114
00005 = {int} 2701
00006 = {int} 3469
00007 = {int} 2445
00008 = {int} 538
00009 = {int} 425
00010 = {int} 115

Пример кода

В этом случае data 1 - это массив dateTimes (Array 1), а data [2] - массив целочисленных значений (Массив 2).Я попытался изменить код из потока стека, с которым я связывался ранее, но это просто приводит к пустому графику.Я не уверен, что это лучший подход, он выглядел максимально похожим на то, что я пытался сделать.Вероятно, есть какой-то лучший метод, о котором я не знаю.

x = np.array(data[1])                   #Array of integers
y = mdates.date2num(np.array(data[0]))  #Array with datetime Objects
def form(theta, I_0, theta0, offset):
    return I_0 * np.cos(np.radians(theta - theta0)) ** 2 + offset

yAverage= ((y[np.argmax(y)]- y[0]) / 2) + y[0] #Find average value
param, covariance = optimize.curve_fit(form, x, y, [3000, y, 0])
print
'I_0: {0:e} / theta_0: {1} degrees / offset: {2:e}'.format(*param)
print
covariance

plt.scatter(x, y, label='data')
plt.ylim(0, 5000)
plt.xlim(y[0], y[np.argmax(y)])
plt.plot(x, form(x, *param), 'b-')
plt.ticklabel_format(style='sci', axis='y', scilimits=(0, 0))
plt.axes().xaxis.set_major_locator(mdates.AutoDateLocator())
plt.show()

1 Ответ

0 голосов
/ 26 февраля 2019

Вы можете использовать Дифференциальные уравнения для достижения этого.Используя преобразование Фурье, вы сможете разложить сигнал в простые известные последовательности .convert datetime В секунды с 1970

...