Защото всичко е забавление и игри, докато ъгълът не се промени от 355 на 5 градуса

В моя бизнес (офшорна вятърна енергия) прекарвам много време в анализиране на данни за вятъра, но едва наскоро се опитах да използвам Python, за да анализирам промяната на посоката на вятъра във времето. Така че едва наскоро осъзнах, че нямам представа как да го направя.

Изглежда просто, ако посоката се промени от 350 градуса на 320 градуса, извадете едното от другото, вземете абсолютната стойност и това е промяна от 30 градуса. Но чакай малко...

Промяната от 350 градуса на 5 градуса е промяна от 15 или 345 градуса в зависимост от посоката, в която се извършва промяната. По същия начин промяната от 250 градуса на 200 градуса може да бъде 50 или може да бъде 450. Ако работите с големи набори от данни (или просто цените времето си), просто не е възможно да отваряте огромни файлове, ръчно проверете всеки един и редактирайте за правилния резултат. И вие, и вашият компютър вероятно ще хвърлите кърпата, така че е необходимо автоматизирано решение.

Ще използвам посоките на вятъра като пример в тази част, но това е приложимо за всичко, което използва градуси или радиани и се търси промяна във времето.

Съдържание

1. Необходимото предположение

«2. Кодът"

3. Обяснението

Необходимото предположение

Както споменахме, когато посоката минава през север или нула градуса, нашият прост метод пада. Преобразуването на градуси в радиани също няма да реши проблема (повярвайте ми, опитах). Вместо това трябва да направим предположение за насоченото поведение.

Ако посоката се е променила от 350 на 5, това е промяна от 15 градуса, ако и самоаковърви по посока на часовниковата стрелка. Т.е.ако посоката на вятъра се променя от 350, до 351, 352 ….. 359, 0, 1 … 5 градуса. Има също така възможността посоката на вятъра да се е променила от 350, надолу до 349, 348, …. 6, 5 градуса или обратно на часовниковата стрелка. Двете опции са показани по-долу.

Дали и двете ситуации са действително възможни ще зависи от типа на данните и детайлността на данните. Например, възможно ли е посоката на кораба да се промени на 190 градуса за три секунди? Може ли екстремното време да причини екстремна промяна на посоката на вятъра?

За да работи предложеното решение, трябва да приемем, че не е възможна промяна на посоката от над 180 градуса в дадения период. т.е. ако данните са времеви серии с детайлност от една минута, от минута 1 до минута 2 е невъзможна истинска промяна на посоката с над 180 градуса.

Ако това не работи за вашия набор от данни, бъдете изключително внимателни! Обмислете всички други данни, които имате, които могат да докажат или опровергаят тази теория и, ако е възможно, извлечете данни с по-висока честота, така че това предположение да стане валидно.

Кодът

Това не е перфектно решение за питон, но за моя случай на употреба върши работа. Фрагментът по-долу използва pandas libray, документацията за която може да бъде намерена тук.

# find diff between min and max wind direction
df['delta'] = df.max_winddirection - df.min_winddirection
    
# check for if difference minimun < max - 180, if so, use different equation to get degree change
  
df.loc[df.min_winddirection < df.max_winddirection - 180, 'delta'] = 360 - df.max_winddirection + df.min_winddirection

Обяснението

Вземете примера от 350 до 5 градуса.

  1. Кодът по-горе първо разпределя на всички редове основното делта уравнение „максимален ъгъл — минимален ъгъл“. Това ще приложи 350 като делта за този ред.
  2. Кодът проверява дали критериите за тези случаи „през север“ са изпълнени. Това ще провери дали:„минимален ъгъл‹ максимален ъгъл— 180“. В този случай 5 е по-малко от (350–180), така че е ВЯРНО.
  3. Кодът прилага ново уравнение за делта, когато е ВЯРНО като „360 — максимален ъгъл + минимален ъгъл“. Резултатът е 15 градуса.

Когато критериите „през север“ не са изпълнени, формулата за основен максимум минус минимум ще се приложи без проблеми.

Надяваме се, че сте намерили това за полезно. Ако имате по-чисто, алтернативно решение, което бих искал да се науча от него, не се колебайте да го пуснете в коментарите.