Перейти к главному содержимому

Работаем с тем, что есть

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

First of all

В посте про поздравляшки я радовался тому, что долгое время не одинок. Но через какое-то время с девушкой наши противоречия достигли критических значений, на данный момент уже более чем 2 недели как мы расстались. Не буду углубляться в подробности, но всё прошло ужасно, и во многом там моя вина. Очень жаль, что так вышло, но сейчас ничего не поделаешь.

В течение всего этого времени после события я "залёг на дно", чтобы хоть немного успокоиться и порешать разные другие срочные и несделанные дела, в основном, по учёбе и работе. Думаю, банальная цитатка вроде "что нас не убивает, делает нас сильнее" тут не подойдёт. Но зато подойдёт, что я выкарабкаюсь и восстановлюсь несмотря ни на что, потому что стою на плечах гигантов.

Короче, всем спасибо, все свободны. У этой мыльной оперы начинается новый сезон.

Но у тебя же есть работа

И правда, ведь у меня осталась моя работа в ИСЗФ, куда я очень хотел попасть и где очень хотел работать. Большую часть свободного времени сейчас именно там и провожу, засиживаясь допоздна. Потихоньку привыкаю к рабочему месту и к коллективу, решаю возникающие проблемы. По факту, занимаюсь тем же, чем и занимался раньше: пишу статью и диплом, улучшаю некоторые вещи в обработке данных.

Совсем-совсем недавно у нас в отделе случилось замечательное событие: с Сибирского Радиогелиографа, точнее, с его основной решётки из 48 антенн СРГ-48 впервые за 5 лет сумели синтезировать изображения высокого качества. И основная заслуга в этом моего научного руководителя, который реализовал так называемую процедуру самокалибровки.

На 2 курсе я писал курсовую работу по алгоритму CLEAN, используемому в радиоастрономии, который позволяет из дифракционной картины с кучей побочных максимумов восстановить оригинальный радиоисточник. По сути своей, CLEAN - это задача обращения двумерной свёртки. У алгоритма CLEAN есть некоторые недостатки, которые не позволяют получать идеально чистые изображения, просто "втупую" взяв и применив его с параметрами по умолчанию: надо знать, как эти параметры подбирать. Смысл самокалибровки заключается в том, что CLEAN запускается на изображении несколько раз, чтобы выяснить наиболее оптимальные параметры. Кстати, в том коде для самокалибровки СРГ есть и немножко моего кода, написанного раньше.

Ниже показано изображение с СРГ-48 на частоте 4.3 ГГц, наблюдение от 21 марта 2021 года. На данный момент это самый настоящий эксклюзив. Обывателю такая картинка покажется не очень интересной на первый взгляд, но учёные могут получить оттуда много ценных данных. Кстати, если выкрутить хорошенько контраст, то можно обнаружить волокна и корональные дыры на Солнце. Максимальное разрешение там вроде как 6 угловых секунд на пиксель.

srh48 Sun image

Так что в ИСЗФ сейчас все очень-очень радуются, особенно у меня в отделе, потому что это всё очень круто.

Что делаю по диплому

Тема моего диплома - это моделирование трёхмерной структуры магнитных полей в солнечных активных областях с использованием микроволновых наблюдений. Проблема выяснения структуры магнитного поля в том, что магнитограммы для Солнца у нас имеются только для самого нижнего слоя - фотосферы, а выше, в хромосфере и короне, никто поле не знает. Чтобы выяснить поле выше фотосферы, придумали кучу разных моделей дифференциальных уравнений со своими граничными условиями (основная трудность подобрать именно эти граничные условия). На данном этапе уже имеется готовый софт для просчёта каждой из моделей, но стыковка расчётов на моделях с реальными данными вызывает огромные трудности.

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

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

Ещё больше фишек Jupyter, или на чём всё это держится

Чтобы как можно более эффективно анализировать данные и быстро строить нужные визуализации, я пользуюсь ipywidgets. Впервые здесь в блоге они были упомянуты вот в этом посте. Но, согласитесь, демка там была малость громоздкой, и она могла отпугнуть читателя.

interact

Существует способ делать визуализации на ipywidgets с гораздо меньшим количеством кода - с помощью декоратора @interact. Вы просто пишете функцию, принимающую на вход несколько параметров, обёртываете её декоратором, и рядом с ячейкой автоматом генерируются все GUI-элементы, позволяющие менять параметры в реальном времени. Вот пример графика, который мгновенно перестраивается, реагируя на движение ползунков:

z=np.arange(0, 20, 0.1)

@ipywidgets.interact(v=(0, 10, 1), v1=(0, 10, 1))
def plot_Jv(v, v1):
    fig, ax = plt.subplots(1, 1, figsize=(10, 4))
    func_output = special.jv(v, z)
    func_output1 = special.jv(v1, z)

    ax.plot(z, func_output)
    ax.plot(z, func_output1)

    plt.fill_between(z,func_output, color="blue", alpha=0.5)
    plt.fill_between(z,func_output1, color="green", alpha=0.5)

    ax.set_title("Наложение функций Бесселя")
    ax.set_ylim(-0.75, 0.75)
    plt.show()

interact example

Кроме чисел в качестве параметров можно задавать списки, текстовые поля и любые другие виджеты, см. документация. Если же в процессе происходят долгие вычисления, то внутри декоратора достаточно указать continuous_update=False, и тогда функция построения графика будет вызываться только после фиксации некоторого значения, а не в реальном времени.

voila и voila-gridstack

Теперь представим, что мы сделали какое-то исследование или демку на базе Jupyter. Это может быть аналитическая модель с формулами и графиками, сложная карта общественного транспорта или путинских дворцов на базе ipyleaflet. И мы хотим превратить наш Jupyter-файл в веб-приложение в браузере, чтобы любой человек мог зайти по ссылке и увидеть что-то вроде панели управления с виджетами, графиками, текстом и так далее.

Для этого существует инструмент voila, которому можно натравить файл .ipynb и заставить его крутиться на определённом порту сервера в качестве веб-приложения.

voila myfile.ipynb --port=228

[Voila] Using /tmp to store connection files
[Voila] Storing connection files in /tmp/voila_diqc6yb_.
[Voila] Serving static files from /home/user/.local/lib/python3.9/site-packages/voila/static.
[Voila] Voilà is running at:
http://localhost:228/

Voila поддерживает кучу настроек, в частности, тёмную тему оформления и скрытие (или наоборот отображение) кода ячеек. Также есть надстройка voila-gridstack, позволяющая сделать что-то вроде панели управления, где можно расставлять ячейки с виджетами и кодом в произвольное место на странице, а не просто друг за другом.

gridstack demo

papermill

А что если нам не нужно веб-приложение, а нужно просто запустить блокнот Jupyter в фоне с какими-то вычислениями как скрипт? Или чтобы несколько блокнотов отработали последовательно друг за другом. Проект papermill призван решить эту проблему. Кроме запуска на локальной машине он ещё умеет запускать блокноты в Google Cloud и Amazon AWS.

papermill ./myfile.ipynb ./output.ipynb

Потом можно при желании написать crontab, в котором нужные вычисления или отчёты будут генерироваться по расписанию, например, раз в час. Дальше уже через nbconvert можно автоматом сгенерировать PDF с графиками, HTML-страницу или даже презентацию со слайдами. Примечание: для генерации PDF требуется установленный pandoc + LaTeX и немножко подправленный шаблон с поддержкой русских шрифтов

jupyter nbconvert ./output.ipynb --to pdf
jupyter nbconvert ./output.ipynb --to slides

С инструментами, про которые рассказал выше (а ещё и с фактом поддержки других языков, например, C++ и R) экосистема Jupyter становится самодостаточной и может удовлетворить практически любые хотелки исследователей данных и автоматизаторов. Все эти пакеты я недавно добавил в свой репозиторий zaebis-скриптов в "научную" конфигурацию.

И напоследок

Недавно начал пилить проект по работе с API проекта ГосЗатраты, можете посмотреть его на Github. ГосЗатраты пользуются ежедневными выгрузками сайта Госзакупок, засовывают данные себе в базу и позволяют независимым исследователям вроде нас с вами делать к этой базе автоматизированные запросы. Благодаря этому можно удобно отслеживать всех жуликов и воров покупки любого государственного учреждения. Надеюсь, что затея получит развитие и поможет людям.

Ещё я успешно привился обеими прививками от коронавируса, пусть и испытав на себе побочные эффекты. Сделал это по собственному желанию и считаю, что лучше денёк полежать с температурой, чем заболеть настоящим ковидом.

В общем, "не падаем духом" и работаем с тем, что есть. Show must go on...