Показаны сообщения с ярлыком Python. Показать все сообщения
Показаны сообщения с ярлыком Python. Показать все сообщения

понедельник, 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


пятница, 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)

суббота, 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.


пятница, 3 августа 2018 г.

Быстрая замена в 3D массиве по признаку

Дан трёхмерный массив z (time, lat, lon), в котором необходимо по условию cond заменить значения на undef.
Собственно решение с помощь numpy.where

import numpy as np

undef = -99
ishape = (3, 4, 5)
z = (np.arange(-30 ,30, 1)).reshape(ishape)   # 3D-array
print('Before', z)
tz0 = z.mean(axis=0)   # 2D-array
cond = (tz0 < -5.)
zz = np.where(~cond, z, undef)   # Тильда
print('After', zz)

P.S. Тильда (~) инверсирует логическую маску: превращает все True в False. И наоборот

понедельник, 30 января 2017 г.

Гидропитоника. Hydropythonica

Дорогие читатели научно-популярного блога progeoru (ПРОфессионально о ГЕОграфии по-РУсски).
Совсем скоро стартует второй сезон курса "Программирование на python в науках о Земле". И надеюсь, что в этом году курс, пройдя КМБ, станет более зрелым, как французский сыр.

Ко мне поступало много обращений с разных сторон (студенты, выпускники, представители кафедр) о возможности посещать занятия очно. К сожалению, в этом году формат будет иной - строго группа не более 10 человек. Это связано с целым рядом причин: отсутствие большой аудитории, необходимость курирования именно студентов, переход качества при скачке количества в сторону увеличения.

К тому же в прошлом году я серьёзно "подсел" с другими делами на время ведения курса. Это было тяжело, но я не о чём не жалею. Как длинный и интересный поход требует подготовки и перенесения тягот во время его прохождения, также и в преподавания. Особенно нового материала.

Учтя пожелания, исправив ошибки и послушав предыдущий курс студентов-магистров, я решил в этом году изменить концепцию курса, сделать её менее теоретической. Больше практики и плясок от практических нужд.

Вероятность 90%, что съёмок не будет. Будет публикация ipython notebooks с рабочими материалами. И будет онлайн канал для общения. В каком виде - пока не ясно до конца.
В любом случае желаю учиться и учить (в хорошем смысле, когда тебя просят)! А пока у студентов каникулы, есть время и пройтись напильничком по рабочим материалам.

понедельник, 22 февраля 2016 г.

Python курс

Добрый день, дорогие читатели моего блога!

Уже несколько недель полным ходом идёт отработка курса по python. Признаться, это давняя задумка - сделать учебник по python для пользователей разного уровня подготовки.
Для начального уровня мною был даже подготовлен в LaTex рукопись страниц на 40. Но дальше процесс забуксовал.
А в этом году благодаря Alma Mater (геофак МГУ) удалось "пристроить птеничка", то есть получить возможность провести курс по python для начинающих в науках о Земле среди магистров и аспирантов.

воскресенье, 13 декабря 2015 г.

Релиз Rubib

Пролог.

Команда супер героев во главе с капитаном Непобедимым врывается в здание секретной лаборатории мистера X, одного из самых великих супер злодеев вселенной CD.
Мистер X сидит в роскошном кожаном кресле, потягивает вино из бокала и скучающим взором смотрит на группу взъерошенный и взмыленных героев. Капитан Непобедимый крепко сжимает в руках орудие возмездия и говорит:
"Твоим планам не суждено сбыться, мистер X! Мы пришли остановить тебя и положить конец твоим гнусным планам!"
После секундной паузы Мистер X заливается совсем не злодейским смехом и отвечает своему давнему сопернику:
"Ты что же, думал, что я буду сидеть здесь, пить вино и ждать, пока ваше стадо примчится меня останавливать! Ты в своём уме, капитан! Весь мой весьма коварный план приведён в действие уже как стуки!"
Мистер X смеётся: "Ха-ха-ха, чтоб я ждал, ха-ха-ха!"

Итак, дорогие читатели! Сегодня я презентую вам Rubib! Что такое Rubib? Читайте!

UPD 14.12.2015 - добавлена отдельная страница в блоге для приложения RuBib.


пятница, 4 декабря 2015 г.

Подарок на Новый Год

Дорогие читатели!

Как давече заметил коллега, что мой блог не очень часто обновляется, зато когда обновляется, то ого-го! Что ж, против правды не попрёшь, это так.
К Дню знаний я выложил электронный учебник по matplotlib "Научная графика в python". С тех пор нового материала особо не было, за исключением анонса удобного установщика Cartopy и Iris под Anaconda. Поэтому к Новому Году, а может быть и сильно раньше, постараюсь порадовать вас одним интересным проектом над которым я работал последний месяц, пока был в отпуске. Что это конкретно - пока сюрприз, всё-таки Новый Год как-никак.
Поэтому следите за блогом и "усё будет". А вот рисунок-подсказка. =)


P.S. К католическому Рождеству будет железно!

вторник, 1 сентября 2015 г.

Keep calm and code python

Введение

Когда мне задают вопрос "Чем python лучше Matlab(c), да и лучше ли?", то я, признаюсь, прихожу в некоторое замешательство.
У меня с Matlab(c) не сложилось, весь мой личный опыт работы с ним окрашен в тёмные тона. Он жутко долго устанавливается, он нелегальный, он подвисает и тормозит, куча окошек, постоянные вектора-столбцы. Вдобавок он не мог прочитать крупный файл в netcdf  формате, и картографический пакет мне скачать с torrents также не удалось.
А с python у меня сложилось так, что я бросил программировать на фортране, удалил grads, легко перехожу с Linux на Windows, читаю, анализирую и визуализирую netcdf файлы в одной среде и чувствую себя великолепно!
Поэтому мне трудно дать объективный обзор, сравнить беспристрастно "слона" с "китом". Но я попытаюсь и предлагаю следующую схему: свойство и краткое его освещение в обеих системах. Поехали.


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

Подарок к 1 сентября

Дорогие читатели!

Скоро 1 сентября, страна будет праздновать День Знаний.

В этот замечательный день на моём канале GitHub будет опубликована бета-версия проекта, над которым я трудился с переменным успехом в течение последних 10 месяцев.

Итак, в разделе Scientific_graphics_in_python будет опубликован УЧЕБНИК "Научная графика в python" на русском языке! Возможно, он будет появляться постепенно, по частям, но я обещаю, что в течение этой недели (31.08 - 06.09) я выложу все главы.

Учебник реализован в виде серии ipython notebooks. Примеры python-кода из учебника можно будет скачать. Для ознакомления или поиска справочной информации, материалы можно будет просмотреть из этого поста через ссылки в оглавлении (см. ниже), которые отображают notebook-просмоторщик nbviewer.


Оглавление


Часть I Основы matplotlib

Глава 1 Библиотека matplotlib. Pyplot

Глава 2 Основные графические команды

Глава 3 Работа с текстом и шрифтами

Глава 4 Цвет и цветовая палитра

Часть II Структура рисунка в matplotlib

Глава 5 Рисунок Figure

Глава 6 Область рисования Axes

Глава 7 Мультиоконные рисунки

Глава 8 Координатные оси Axis

Глава 9 Деления координатных осей Ticks

Часть III Специальные элементы рисунка в matplotlib

Глава 10 Особенности координатных осей

Глава 11 Графики в полярной системе координат

Глава 12 Легенда

Глава 13 Цветовая шкала

четверг, 11 июня 2015 г.

Write 3D data into ASCII (text) file with metadata. Как записать 3D данные в текстовый формат "аля" фортран


Аннотация

Рассматривается способ записи данных из 3D массива в текстовый файл блоками с разделителями, состоящими из строк


Данный ноутбук посвящён проблеме записи данных по формату в текстовый файл. Приведённый в примере формат упаковки данных легко было сделать на фортране (правда я уже с трудом помню как). А вот на python это можно сделать с помощью конструкции "with". По сути рецепт подсмотрен и утащен с stackoverflow.

пятница, 27 марта 2015 г.

Запись данных в формат MS Excel (xls). Writing data to MS Excel files

ABSTRACT

Приводится пример записи данных, представленных в виде числовых матриц и векторов, в файл формата xls.

Этот пост сделан в виде ipython notebook.

В нём приводится примеры записи матриц данных в файлы формата MS Excel (xls). В конце заметки приводится пример функции для записи матрицы-вектора в отдельный файл. С её помощью можно сделать для коллег, которые предпочитают работать в MS Excel, файл с вашими данными. Это легко вам и удобно пользователям MS Excel. Мостик дружбы.

понедельник, 1 декабря 2014 г.

Python: возможности и перспективы в гидрометеорологии

Представляю мой постер на юбилейной конференции "50 лет ВНИИГМИ-МЦД". Он о пользе и преимуществах языка python в гидрометеорологии. Копирайт стоит, но можно свободно его скачивать, распространять и печатать.
Вот кстати, попалась ссылка на новый пакет для рисования результатов статистической обработки данных - Seaborn.

Вот примеры работы  Seaborn:


Как перевести 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...