Сглаживание переменных Звездные данные в Python - PullRequest
1 голос
/ 18 февраля 2020

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

Я пробовал несколько различных методов. , но ни один из них не работает идеально. Два наиболее перспективных - выполнить свертку с NumPy и использовать фильтр Савицкого-Голея от SciPy. Некоторый код для этого здесь:

# Define a smoothing algorithm using the convolve function in NumPy.  The function
# will use a window of 3 points surrouding each point.
window_len = 3
kernel = np.ones(window_len, dtype=float) / window_len
y_smooth = np.convolve(full_average_array, kernel, "same")
y_smooth2 = savgol_filter(full_average_array, 11, 2)

# Run the smoothing algorithm for 50 loops to better smooth annoying light curves.
for n in range(0, 50):
    y_smooth = np.convolve(y_smooth, kernel, "same")
    y_smooth2 = savgol_filter(y_smooth2, 5, 3)

Как я уже сказал, ни один не работает идеально. Вот некоторые увеличенные изображения выходных данных:

This shows the waviness of the Savitzky-Golay filter (blue) and the smoothness of the convolution (green), but the Savitzky-Golay filter method better approximates the large dip around phi = 0

Это показывает волнистость фильтра Савицкого-Голея (синего цвета) и плавность свертки (зеленый), но метод фильтра Савицкого-Голея лучше приближается к большому провалу около phi = 0

This shows that the Savitzky-Golay filter method is a much better representation of the minimum than the convolution.

Это показывает, что метод фильтра Савицкого-Голея является гораздо лучшим представлением минимума, чем свертка.

Каждый раз, когда я увеличиваю числа, чтобы сделать кривую более гладкой, кривая является худшим приближением к наблюдаемым данным. Мне нужна кривая, которая была бы достаточно гладкой и подходила бы для данных, но я не нашла хорошего метода для достижения этой цели. Какие функции / методы мне следует использовать в этом случае?

...