понедельник, 17 мая 2021 г.

Как перевести UV в направление и скорость ветра? How to convert wind UV-components to direction and velocity?

 Всё просто. 


def uv2dir(u, v):

    '''

    Источник:

    https://github.com/blaylockbk/Ute_WRF/blob/master/functions/wind_calcs.py

    '''

    import numpy as np    

    direction = (270 - np.rad2deg(np.arctan2(v, u))) % 360

    veloctity = np.sqrt(np.square(u) + np.square(v))

    return direction, velocity


Дъявол в мелочах))

Во-первых, нужно передавать аргументы в arctan2 именно в порядке V, U (сначала Y, потом X). Об этом написано в строке документации функции. Дополнительно можно прочитать на странице Wind Direction Quick Reference от NCAR/UCAR. Вот цитата оттуда:


"This discussion assumes that the two-argument arctangent function, atan2(y,x), returns the arctangent of y/x in the range -π to π radians, -180 to 180 degrees.  C, C++,  Python, Fortran, Java, IDL, MATLAB and R all follow this convention.

Warning: Spreadsheets, including Microsoft Excel, LibreOffice Calc and Google Docs switch the arguments, so that atan2(x,y) is the arctangent of y/x.

To check your software, compute atan2(1,-1). If it equals 2.36 radians (135 degrees) then your software uses the programming language convention and you can use these formulas unchanged. If it equals -0.79 radians (-45 degrees) then your software follows the spreadsheet convention and you must switch the arguments of atan2 in the following equations." и сначала python-овская функция arctan2."

Во-вторых, повороты координатных осей с целью получить именно метеорологическое направление ветра. По традиции в метеорологии:

  • название ветра указывает ОТКУДА он дует. Так южный ветер дуют с юга, а восточный - с востока. Напомню, что для морских течений наоборот;
  • Южный и западный ветра ассоциируются с положительными направлениями компонент ветра V и U соответственно.
Поэтому возникает 270 - это поворот на 90 градусов (в тригонометрическом круге, на котором считаем в радианах, ноль находится на "3ч/востоке", тогда как географический азимут отсчитывается от "12ч/севера").



Также нужно сделать разворот на 180 градусов чтобы получить направление "как в метеорологии" (см. выше).

В-третьих, самый изящный момент - % 360, т.е. остаток от деления на 360. Это лаконичное применение оператора "%" решает проблему выхода расчётов за пределы 360 градусов. В случае, когда направлеие ветра от 0 до 360, этот оператор фактически игнорируется. Но в случае выхода за предел 360 в большую сторону, берётся остаток, т.е. из значения просто вычитается 360. Очень изящное решение - никаких условий и дополнительных проверок! Bravo!
 


понедельник, 12 апреля 2021 г.

Прочитать GRIB с помощью python. Grib format reading using python

Отличная новость для тех, кто активно использует и python и данные в GRIB формате.

"Happy to announce the release of @ECMWF cfgrib 0.9.9.0, the library to access climate and meteo GRIB files with xarray and Python. Highlights: much better performance on big files (10k+ messages), use the official and faster ecCodes bindings."

Ссылка на модуль cfgrib

Для установки через pip: pip install cfgrib==0.9.9.0


суббота, 11 января 2020 г.

PROGEORU в VK

Краткая аннотация моего нового проекта на базе платформы VK: progeoru

===================================
Ясно и коротко. Климат и программирование.

Изучаем климат нашей планету. 
Компьютерные науки и технологии помогают нам в этом.
Актуальная научная информация об изменениях климата, новости об общественных инициативах в сфере климата.
О программировании на python как универсальном инструменте анализа данных.

===================================

Скорее всего проект "ICEKING" переедет туда. Насчёт контента здесь пока неясно, так как в планах на 2020 ясно и чётко стоит ряд jupyter notebooks, которые будут опубликованы на GitHub. Какая-то поддержка сохранится, но что именно - неясно. Следите за новостями, более подробно будет в следующем сообщении))


среда, 4 декабря 2019 г.

ICEKING #1

Всем привет!

Так как в последнее время я активно мигрирую от "climate scientist" к "arctic climate scientist", то неплохо бы начать собирать не только классные и полезные заметки про python, который я очень нежно люблю и уважаю (а также гоняю в хвост и гриву), но и что-то про морской лёд, изменения климата в Арктике и перспективы СМП.

Сегодня первая подборка интересных и полезных заметок о морском льде (sea ice).

0) Узучите основы для понимания и исследования #climate data вместе с Climate Data Primer.

1) Начнём с терминологии в теме морского льда: что к чему и как. И не забудем о спутниках (микроволновой радиометрии), которые позволяют нам измерять концентрации льда в любое время суток.

2) На Kaggle есть материал на основе данных sea ice NSIDC. Имя Kaggle говорит само за себя;

3)  Хорошая "базовая" статья  A long-term and reproducible passive microwave sea ice concentration data record for climate studies and monitoring (Peng et al., 2013) по созданию базы данных морского льда от NSIDC.

4) Новости за октябрь о состоянии морского льда в Арктике от NSIDC

5) How to calculate sea ice changes (NASA Video)

6) The Danish Arctic research institutions present updated knowledge on the condition of two major components of the Arctic: The Greenland Ice Sheet and the sea ice

P.S. Подобные посты будут сопровождаться хэштегом iceking и iceking_news.

понедельник, 26 августа 2019 г.

среда, 10 апреля 2019 г.

Набор полезных ссылок


11 апреля 2019

  1. Python Graph Gallery - примеры графики на python;



10 апреля 2019

  1. Прорабатываем навык использования группировки и визуализации данных в Python;
  2. Проект Xarray как подобие pandas от создателей NCL для климатологов;
  3. Dask provides advanced parallelism for analytics, enabling performance at scale for the tools you love;
  4. Введение в аннотации типов Python -> PEPs 484, 526, 3107;
  5. PyPy, Cython, numba
  6. тестирование с помощью pytest, mypy, pylinter и др.

пятница, 29 марта 2019 г.

NCL: pivot to Python

Это свершилось.

NCAR решил отказаться от своего собственного скриптового языка NCAR Command Language в пользу языка Python как основного скриптового инструмента визуализации и анализа данных. Новость несвежая, аж от 6 февраля 2019 года.

Универсальность победила специализацию.

вторник, 5 марта 2019 г.

ERA5

Запрос данных ERA5 о концентрации льда за 00ч за период 1979-2018 гг.

import cdsapi

c = cdsapi.Client()

c.retrieve(
    'reanalysis-era5-single-levels',
    {
        'product_type':'reanalysis',
        'format':'netcdf',
        'variable':'sea_ice_cover',
        'year':[
            '1979','1980','1981',
            '1982','1983','1984',
            '1985','1986','1987',
            '1988','1989','1990',
            '1991','1992','1993',
            '1994','1995','1996',
            '1997','1998','1999',
            '2000','2001','2002',
            '2003','2004','2005',
            '2006','2007','2008',
            '2009','2010','2011',
            '2012','2013','2014',
            '2015','2016','2017',
            '2018'
        ],
        'month':[
            '01','02','03',
            '04','05','06',
            '07','08','09',
            '10','11','12'
        ],
        'day':[
            '01','02','03',
            '04','05','06',
            '07','08','09',
            '10','11','12',
            '13','14','15',
            '16','17','18',
            '19','20','21',
            '22','23','24',
            '25','26','27',
            '28','29','30',
            '31'
        ],
        'time':'00:00'
    },
    'download.nc')

вторник, 4 декабря 2018 г.

Формат файлов JSON

Одним из широко распространённых форматов файлов для обмена данными в сети является текстовый формат json.

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

По сути json - это словарь (ассоциативный массив), элементами которых могут быть как словари (отличительный признак - {}, фигурные скобки), так и списки (отличительный признак - [], квадратные).

Пусть дан файл с расширением *.json (это обычный текстовый файл), содержащий следующее:

{
  "orderID": 12345,
  "shopperName": "Иван",
  "shopperEmail": "ivanov@example.com",
  "contents": [
    {
      "productID": 34,
      "productName": "Super product",
      "quantity": 1
    },
    {
      "productID": 56,
      "productName": "Super product",
      "quantity": 3
    }
  ],
  "orderCompleted": true
}

С помощью модуля ... json (неожиданно, неправда ли!?) в python его можно легко считать в словарь (dictionary).

Если в файле содержатся кириллические символы (русские буквы в просторечье), то не забудем вставить encoding="utf-8" в качестве аргумента для open.

Итого код для чтения json-файла выглядит так

import json

f = open('./templates/new.json',  encoding="utf-8")
dic = json.load(f)   # dic - словарь
f.close()

Т.к. dic - это просто словарь, то в него можно добавлять элементы. Добавим список с ключом "alpha". Модифицированный словарь запишем в виде json-файла.
Т.к. в словаре есть кириллица, то не забудем добавить аргумент ensure_ascii=False.

#Чтение, модификация и запись
import json

f = open('./templates/new.json',  encoding="utf-8")
dic = json.load(f)
print(dic.keys())
f.close()

dic['alpha'] = [1, 2, 4, 5]

with open('data.json', 'w') as outfile:
    json.dump(dic, outfile, ensure_ascii=False)

вторник, 6 ноября 2018 г.

суббота, 3 ноября 2018 г.

Яндекс PyData 2018


13 октября в офисе Яндекса прошел митап PyData Moscow, посвящённый анализу больших данных с использованием языка Python. Публикуем записи докладов и мастер-классов.
МАСТЕР-КЛАССЫ:
1. Решение задач классификации при помощи CatBoost – Никита Дмитриев
https://www.youtube.com/watch?v=xl1fwCza9C8&feature=youtu.be
2. Yargy-парсер. Извлечение структурированной информации из текстов на русском языке – Александр Кукушкин
https://www.youtube.com/watch?v=NQxzx0qYgK8&feature=youtu.be
ДОКЛАДЫ:
1. Процесс полуавтоматической разметки данных – Кирилл Данилюк
https://www.youtube.com/watch?v=nK2Ra0Xq0So&feature=youtu.be
2. Canary deployment, мониторинг и тестирование моделей силами одного специалиста – Александр Дмитриев
https://www.youtube.com/watch?v=h-vbysp1Tso&feature=youtu.be
3. Как мы строили автоматическую систему модерации объявлений ЦИАН – Алексей Бардышев
https://www.youtube.com/watch?v=VAGV7aqani4&feature=youtu.be
4. Нейросети в продакшене на примере NLP сервиса – Виталий Давыдов
https://www.youtube.com/watch?v=eeAH6oK_aPw&feature=youtu.be
5. Как построить собственную систему аналитики за один день – Александр Швец
https://www.youtube.com/watch?v=N7R3hmvguyE&feature=youtu.be

воскресенье, 28 октября 2018 г.

f-строки (python 3.6+)

Всё течёт и всё меняется.

Раньше строки можно было форматировать так:

name = 'John'
s = '%s is my name.' % name 

Потом так:

name = 'John'
s = '{} is my name.'.format(name) 

А начиная с версии 3.6 оказывается так:

name = 'John'
s = f'{name} is my name'

Собственно последний вариант и называется f-строками. И мне очень нравится этот синтаксис! Переменные можно теперь подставлять прямо в фигурные скобки, а вместо длинного слова format, просто ставить префикс f перед строкой. Браво!

Подробнее можно посмотреть тут.

четверг, 25 октября 2018 г.

High Performance Scientific Computing by Randall J. LeVeque



Лет пять назад на Coursera был отличный курс "High Performance Scientific Computing by Randall J. LeVeque", который включал материал о целой куче разных технологий (Linux, VM, git, shell, MPI, OpenMP, python, fortran, ipython notebooks, Bitbucket, etc.), которые сегодня стали ещё актуальнее!

Некоторые материалы этого курса до сих пор лежат на сайте университета Вашингтона.

Очень рекомендую. Это

пятница, 19 октября 2018 г.

Python Junior Podcast. Спецвыпуск с Григорием Петровым



Отличный выпуск Python Junior Podcast с Григорием Петровым, в котором разбирается статья 2013 года  "10 вещей, которые должен знать начинающий Python-разработчик" (English). Актуальность, по мнению авторов подкаста, ничуть не изменилась.
В выпуске упоминается также хардкорная статья о Юникоде, которая поможет разобраться что делать, если перед вами файл не в кодировке utf-8.

Рекомендую также другие выпуски  Python Junior Podcast. Картинка выше - лого из подкаста на осень 2018 года.

P.S. При разборе пункта 7 статьи ("Copying Structures (and Basic Memory Management)") , авторы упоминают о необходимости делать глубокие копии (deep copies) изменяемых объектов и приводят примеры из slicing-а pandas.DataFrame. Пару дней назад такой подобный пример я выкладывал на репозитарий GitHub в папке rus_pandas.


воскресенье, 16 сентября 2018 г.

XV ICRSS, Potsdam, sep 2018

С 9 по 15 сентября 2018 года в г. Потсдам проходила XV International Circumpolar Remote Sensing Symposium (ICRSS). Отлично организованная сотрудниками AWI конференция, оставила очень приятные воспоминания о community.
Хотелось бы особенно поблагодарить Guido Grosse, Benjamin Jones, Martha Raynolds, Frank Gunter, Sofia Antonova, Annet Bartsch, Ana Radovan, Bennet  Juhls. Danke schön!

Наш постер и flash-видео из серии "FrostBytes" не были отмечены жюри конференции (немного жаль, чего уж там!), но это был очень творческий период подготовки к конференции (с ночными бдениями и прочим)! Это было здорово, это однозначно up-date.

Ещё раз спасибо всем и до встречи в Fairbanks в 2000 году!

Как перевести UV в направление и скорость ветра? How to convert wind UV-components to direction and velocity?

 Всё просто.  def uv2dir(u, v):     '''     Источник:     https://github.com/blaylockbk/Ute_WRF/blob/master/functions/wind_calc...