To bardzo interesujący problem. Pierwotnie chciałem zaproponować rozwiązanie oparte na korelacji krzyżowej podobne do user948652. Jednak z opisem problemu, istnieją dwa problemy z tego rozwiązania:
- Rozdzielczość danych jest większy niż przesunięciem czasowym, a
- W niektóre dni, przewidywana wartość i wartości pomiarowe mają bardzo niska korelacja siebie
w wyniku tych dwóch kwestii, myślę, że bezpośrednio stosując rozwiązanie cross-korelacji może rzeczywiście zwiększyć przesunięcie czasu, zwłaszcza w dniach, w których przewidywane i zmierzone wartości mają bardzo niska korelacja względem siebie.
W powyższym komentarzu zapytałem, czy miałeś jakieś wydarzenia, które występują w obu szeregach czasowych, i powiedziałeś, że nie. Jednak na podstawie domeny, myślę, że rzeczywiście mają dwa:
- Sunrise
- Sunset
Nawet jeśli reszta sygnału jest słabo skorelowane, wschody i zachody słońca powinien być nieco skorelowane, ponieważ monotonicznie wzrosną one od/poniżej poziomu podstawowego w nocy. Oto potencjalne rozwiązanie, oparte na tych dwóch zdarzeniach, które powinno zarówno zminimalizować potrzebną interpolację, jak i nie być zależne od korelacji krzyżowej słabo skorelowanych sygnałów.
1. Znajdź przybliżona Sunrise/Sunset
ta powinna być na tyle łatwe, po prostu podjąć pierwsze i ostatnie punkty danych, które są wyższe niż płaskiej linii nocnej i oznaczyć te przybliżoną wschód i zachód słońca. Następnie, chciałbym skupić się na tych danych, a także natychmiast punkty po obu stronach, tj .:
width=1
sunrise_index = get_sunrise()
sunset_index = get_sunset()
# set the data to zero, except for the sunrise/sunset events.
bitmap = zeros(data.shape)
bitmap[sunrise_index - width : sunrise_index + width] = 1
bitmap[sunset_index - width : sunset_index + width] = 1
sunrise_sunset = data * bitmap
Istnieje kilka sposobów, aby wdrożyć get_sunrise()
i get_sunset()
w zależności od tego, ile trzeba rygoru w swojej analizie. Chciałbym użyć numpy.diff
, ustawić go na określoną wartość i przyjąć pierwszy i ostatni punkt powyżej tej wartości. Można również odczytać dane nocne z dużej liczby plików, obliczyć średnie odchylenie standardowe i odszukać pierwsze i ostatnie punkty danych, które przekraczają, powiedzmy, 0.5 * st_dev
danych nocnych. Można również wykonać dopasowanie oparte na klastrze, w szczególności jeśli różne klasy dnia (np. Słoneczne lub częściowo zachmurzone lub bardzo słabe) mają wysoce stereotypowe zdarzenia wschodu i zachodu słońca.
2. Resample danych
Nie sądzę, że istnieje jakiś sposób, aby rozwiązać ten problem bez jakiejś interpolacji. Chciałbym użyć ponownie próbki danych do wyższej częstotliwości próbkowania niż przesunięcie. Jeśli przesunięcie jest w skali minut, a następnie wzrośnie do 1 minuty lub 30 sekund.
num_samples = new_sample_rate * sunrise_sunset.shape[0]
sunrise_sunset = scipy.signal.resample(sunrise_sunset, num_samples)
Alternatywnie, możemy użyć sześcienny splajn do interpolacji danych (patrz here).
3. Gaussa Splot
Ponieważ istnieją pewne interpolacja, to nie wiemy, jak dokładnie faktyczny wschodu i zachodu słońca były przewidywane. Tak więc możemy skonfigwać sygnał za pomocą gaussa, aby przedstawić tę niepewność.
gaussian_window = scipy.signal.gaussian(M, std)
sunrise_sunset_g = scipy.signal.convolve(sunrise_sunset, gaussian_window)
4. Cross-Korelacja
pomocą metody korelacji krzyżowej w odpowiedzi user948652 do uzyskania przesunięcia czasowego.
Istnieje wiele pytań bez odpowiedzi w tej metodzie, które wymagałyby zbadania i eksperymentowania z danymi w celu dokładniejszego ich umiejscowienia, np. Jaka jest najlepsza metoda określania wschodu/zachodu słońca, jak szerokie powinno być okno gaussowskie, itp. Ale w ten sposób zacznę atakować problem. Powodzenia!
(+1) Nicea pytanie. Ciekawe, dlaczego zakazujesz używania interpolacji? – NPE
Po prostu pomyślałem, że jeśli chcesz oszacować przesunięcie do wysokiej dokładności, musisz interpolować do bardzo wysokiej rozdzielczości. a ponieważ mam dużo danych, chciałem tego uniknąć. – omar
Wydaje mi się, że serie Fouriera mogą być pomocne, jeśli dane są z grubsza okresowe ... – mgilson