Category: Математика

20
Июл
2021

Как склеить элементы массива в один, суммировав некоторое значение, при определенных условиях в js?

Есть массив, где каждый элемент тоже массив:
let arr = [
[‘orange’, ‘2021-07-01’, 100],
[‘apple’, ‘2021-07-01’, 100],
[‘orange’, ‘2021-07-01’, 400],
[‘apple’, ‘2021-07-06’, 100],
[‘apple’, ‘2021-07-01’, 400],
];

Необходимо все п…

15
Июл
2021

🎮 27 актуальных ресурсов для игрового аналитика: сайты, курсы, книги, блоги и подкасты

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

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

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

Онлайн-курсы


Если есть возможность сразу вложить деньги в обучение, не стоит игнорировать курсы онлайн-университетов. Они предложат готовую программу обучения, возможность индивидуальных консультаций с преподавателями, а самое главное – практику и общение с другими слушателями. Выпускники получают дипломы и/или сертификаты, а в некоторых случаях и помощь в поиске работы.

  • Нетология. Российская площадка обещает курс, рассчитанный на 9 месяцев. За это время слушателей познакомят с навыками аналитика (психологией, метриками, игровой индустрией в целом, воронками и прочим), научат работать с SQL и использовать данные с помощью Python. Выпускникам выдадут дипломы и сертификаты. Есть помощь в трудоустройстве (подыщут вакансию и устроят собеседование) и 5 проектов в портфолио.
  • Skillbox. Ограничения по времени прохождения нет, при покупке курса доступ к учебным материалам приобретается навсегда с возможностью повторного прохождения. Учат тому же Data Science с использованием Python и SQL для работы с данными. В качестве бонуса предлагают 2 доп. курса: продуктовый аналитик (работа с конкретным товаром компании, чуть шире игровой версии) и геймдизайнер. Выпускникам выдают дипломы и помогают организовать собеседование в нескольких компаниях.
  • GeekBrains. В качестве уникального преимущества онлайн-платформа предлагает трудоустройство или возврат денег, если оно не удалось. Преподают на курсах действующие аналитики, а рассчитана программа на год. Навыки схожие: Python, SQL, мат. статистика, визуализация и прочие инструменты аналитика. Выпускникам выдают дипломы о профессиональной переподготовке. Бонусами предлагают подписки на сервис изучения английского языка JetBrains (IDE) и к собственной базе разных мастер-классов.
  • DataCamp. Предлагающий огромное количество уроков по обращению с данными сайт работает по подписочной модели.

Игровой аналитик – это в первую очередь аналитик. Для освоения профессии подойдут и обычные курсы для аналитиков данных. Например, у Udemy есть неплохой буткемп с использованием Python, Seaborn и Pandas.

Книги


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

Блоги

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

  • GameAnalytics.Тут куча всего нужного и полезного: блоги, статьи, новости и прочее.
  • datanami. Ресурс, посвящённый аналитике, данным и ИИ.

Прочие полезные ресурсы


Аналитику всегда есть где посмотреть полезную информацию. Здесь можно найти неплохую картинка от devtodev, рассказывающую о метриках.

***

Заинтересовались, но не знаете с чего начать? Обратите внимание на факультет игровой аналитики образовательной онлайн-платформы GeekBrains. Здесь вы получите все необходимые навыки для начала карьеры: геймеры смогут превратить хобби в работу мечты, начинающие специалисты лучше изучат отрасль, а практикующие гейм-дизайнеры научатся создавать более продуманные игры. Благодаря практическим занятиям на примере реальных игровых продуктов вы не только получите нужный для старта в профессии опыт, но и сможете добавить интересные кейсы в портфолио. Эксперты-практики с большим стажем откроют перед вами двери в профессиональный мир Gamedev, а HR-специалисты помогут с трудоустройством. Удачи в обучении!

10
Июл
2021

Точки пересечения эллипса и прямой

Собственно цель в названии вопроса. У меня имеются координаты верхнего левого угла и нижнего правого угла ограничивающего прямоугольника для эллипса (другими словами эллипс вписан в этот прямоугольник). Также, имеются две точки прямой. Коо…

30
Июн
2021

👨‍🎓️ Школа анализа данных – плюсы и минусы

Школа анализа данных – двухгодичная программа обучения от Яндекса. Основной упор в ней делается на данные и методы работы с ними. В небольшом обзоре мы разберём плюсы и минусы учёбы в ШАД.

Как поступить?

Итак, ШАД – полноценное обучение на протяжении двух лет, с нагрузкой по 30 часов в неделю. Обучение бесплатное, но сначала требуется пройти онлайн-тестирование, затем экзамен и собеседование в филиалах ШАД.

Как и в университете, здесь есть возможность платного поступления, но для этого нужно хорошо показать себя на собеседовании. Стоит учёба 150 000 рублей в семестр. Если закончить семестр на хорошо и отлично, цена уменьшится наполовину. А если два раза подряд закончить хорошистом или отличником, обучение станет бесплатным.

Онлайн-тестирование – обычное заполнение анкеты с тестовыми вариантами задач. После него есть два варианта: для москвичей следует прибыть в отделение ШАД и сдать экзамен по математике, алгоритмам, а затем по программированию и основам анализа данных. Заочники или учащиеся в региональных отделениях сдают онлайн-экзамен.

В конце пройдёт собеседование – очный экзамен по тому же программированию, математике и алгоритмам.

Все задачи выбираются в рамках общей программы (в документе даже указаны все необходимые книги для подготовки). Кстати, у нас есть статья, полностью посвящённая подготовке к поступлению в ШАД.

В 2020 году появился вариант поступления для тех, кто уже давно в программировании. В этом случае потребуется вместо математики продемонстрировать умение программировать, а также участие в проектах, различных статьях и прочем.

Кому это нужно?

Во-первых, выпускники получают диплом о профессиональной переподготовке. Во-вторых, любовь к Data Science и желание глубоко-глубоко нырнуть в эту отрасль. При этом, если вас интересует чистая научная теория, то место найдётся – регулярные семинары и различные исследовательские проекты.

В целом, целевую аудиторию можно описать так: хочется попасть в сферу Data Science, сделать это максимально эффективно и интересно. К тому же, обучение проходит по вечерам.

ШАД: Плюсы обучения

  • Знания. Преподаватели в ШАДе частенько в “первую смену” работают в различных вузах Москвы, а затем читают лекции на свою любимую тему в школе Яндекса. Квалификация у них точно на высоте.
  • Вечерняя программа. Учёба по вечерам отлично стимулирует освоение тайм-менеджмента: нужно и задания успеть выполнить, и подготовиться к следующему дню, и время на сон оставить.
  • Математика, данные и программирование. Здесь всё сосредоточено на этих предметах. Нужно знать математику, чтобы с помощью математической же культуры уметь работать с данными. Нужно знать и понимать данные, выявляя среди них закономерности и прочее. И программирование потребуется, чтобы это всё автоматизировать.
  • Интенсивная нагрузка. Слоган ШАДа: «Будет сложно, но интересно». Стимул к обучению студенты получают за счёт интересных задач. Им также предоставляют все необходимые инструменты для подготовки. Можно даже постоянно мучить преподавателей вопросами.

ШАД: Минусы обучения

  • Вечерняя программа. Если ваша жизнь уже загружена, то добавлять к ней вечерние курсы – стрелять себе в ногу. При этом, обучение действительно интенсивное и требует внимательности.
  • Серьёзная нагрузка. Так как здесь учат анализировать, то мозги будут работать на полную катушку. А то потребуется их перегружать их. Следует заранее прокачать выносливость и… умение отдыхать.
***

Зачем стремиться в ШАД? Первое – возможность целиком погрузиться в пучину данных, математических идей и алгоритмов целиком. Второе – полноценная программа обучения в сфере Data Science, диплом и рекомендации, которые помогут получить желанную работу (или сразу отправиться в Яндекс). Третье – высокий уровень самоорганизованности (в основном, для молодых людей), который обязательно разовьётся в ШАДе и при любом исходе будет очень ценным навыком во всей жизни.

«Библиотека программиста» желает вам удачного поступления! Для подготовки к экзаменам записывайтесь на наши курсы по математике в Data Science.

26
Июн
2021

В Python собираю функцию решения уравнения методом дихотомии

Ищу решение уравнения. Функция состоит из двух частей:

отделение корня;
уточнение корня.

На первом этапе формируем сетку и строим словарь: значение Х: значение Y. Если от одного значения к другому Y меняет знак на противоположный, мы зна…

26
Июн
2021

В Python собираю функцию решения уравнения методом дихотомии

Ищу решение уравнения. Функция состоит из двух частей:

отделение корня;
уточнение корня.

На первом этапе формируем сетку и строим словарь: значение Х: значение Y. Если от одного значения к другому Y меняет знак на противоположный, мы зна…

20
Июн
2021

При вычислении углов сторон треугольника возникает ошибка math domain error

Решаю задачу на степике. Вычислить стороны, периметр, площадь и углы треугольника. Все вычисляется за исключением углов. Выдает ошибку. Искал в интернете, не нашел. Когда доходит до вычисления углов, в консоли выдает ошибку Value Error: ma…

16
Июн
2021

Нахождение трех четных делителя в промежутке

Найдите все натуральные числа, принадлежащие отрезку [101 000 000; 102 000 000], у которых ровно 3 различных чётных делителей (количество нечётных делителей может быть любым). В ответе перечислите найденные числа в порядке возрастания.
Отв…

13
Июн
2021

Математическая ошибка языка JavaScript (баг) [дубликат]

Давно уже сталкивался с такой проблемой, интересна природа этих аномалий, и как их решать, когда требуются подобные вычисления, например:
let a = 0.9;
let b = 0.3 * 3; // должно быть тоже 0.9
let result = a – b; // 0.9 – 0.9 = 0
console.lo…

11
Июн
2021

🐍 Конфигурационные файлы как инструмент управления приложениями на Python

В руководстве рассматривается общий шаблон и конкретные примеры управления Python-приложением с использованием конфигурационных файлов в роли текстовых интерфейсов.

Вводные замечания о форматах конфигурационных файлов

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

К наиболее распространенным форматам конфигурационных файлов, которые находят применение в контексте управления приложениями на Python, можно отнести INI, JSON, TOML и YAML.

  • INI – самый простой формат из рассмотренных. С одной стороны чем проще читать конфигурационный файл, тем лучше, но с другой – файлы *.INI могут оперировать только одномерными структурами, т.е. структурами с простой одноуровневой иерархией. В большинстве прикладных задач, когда приходится иметь дело с моделями объектов, допускающих представление в виде списков, ассоциативных массивов и т.п., возможностей INI оказывается недостаточно.
  • JSON-файл выглядит как обычный словарь Python и может включать сложные иерархические зависимости, однако с точки зрения читаемости проигрывает и YAML, и TOML. Кроме того, JSON не поддерживает комментарии, а они часто могут значительно упростить сопровождение кода.
  • В отличие от предыдущих, формат TOML обладает несоизмеримой гибкостью и широтой арсенала поддерживаемых типов данных. TOML поддерживает простые пары «ключ-значение», массивы, классические и встроенные таблицы, массивы таблиц, булевы значения, а также локальные временные метки и временные метки со смещением.

Для сравнения рассмотрим одну и ту же модель объекта, описанного с помощью TOML и JSON.

Вот TOML-представление модели объекта:

view_obj.toml
        [[fruits]]
name = "apple"

[fruits.physical]  # подтаблица
color = "red"
shape = "round"

[[fruits.varieties]]  # вложенный массив таблиц
name = "red delicious"

[[fruits.varieties]]
name = "granny smith"

[[fruits]]
name = "banana"

[[fruits.varieties]]
name = "plantain"
    

А вот JSON-представление:

view_obj.json
        {
  "fruits": [
    {
      "name": "apple",
      "physical": {
        "color": "red",
        "shape": "round"
      },
      "varieties": [
        { "name": "red delicious" },
        { "name": "granny smith" }
      ]
    },
    {
      "name": "banana",
      "varieties": [
        { "name": "plantain" }
      ]
    }
  ]
}
    

Синтаксические особенности JSON – избыточные фигурные и квадратные скобки – делают сложноструктурные JSON-файлы «размазанными».

Формат YAML обладает схожими с форматом TOML возможностями (в смысле гибкости представления моделей объектов и разнообразия поддерживаемых типов данных), но на сложных структурах выглядит компактнее.

Вопрос выбора формата конфигурационного файла зависит больше от сложности описания модели объекта, но, в большинстве случаев для задач, связанных с управлением Python-приложениями, выбор падает на YAML.

Python-библиотеки для работы с конфигурационными файлами

Из всего многообразия предназначенных для работы с конфигурационными файлами библиотек – ориентированных на какой-то конкретный формат или «всеядных» – можно выделить следующие:

  • configparser: это элемент стандартной библиотеки Python, предназначенный для работы с INI-файлами Microsoft Windows. В распоряжении пользователя есть класс ConfigParser, который реализует базовые возможности библиотеки.
  • PyYAML: элемент не входит в стандартную библиотеку, поэтому его нужно установить с помощью менеджера пакетов pip pip install pyyaml. В Python-сценарии обращение к библиотеке выглядит как import yaml.
  • toml: этот элемент тоже представляет собой стороннее решение для работы с форматом TOML и требует установки с помощью pip install toml.
  • dynaconf: это очень гибкая библиотека, которая 1) позволяет работать со всеми популярными форматами конфигурационных файлов (*.toml, *.yaml, *.json, *.ini, *.py), 2) поддерживает мультипрофили, т.е. конфигурационный файл может содержать несколько заголовков, относящихся к различным стадиям готовности программного продукта (например, default, development, production и т.д.), а нужный набор настроек затем вызывается с указанием соответствующего заголовка, 3) умеет работать с переменными окружения («работает из коробки» с библиотекой dotenv), 4) предлагает утилиту командной строки для выполнения операций общего назначения (init, list, write, validate и т.д.). Устанавливается библиотека с помощью менеджера пакетов pip pip install dynaconf.
  • hydra: это, строго говоря, не просто библиотека, а полноценная платформа, предназначенная для решения широкого круга задач, связанных с конфигурацией сложных приложений. Установить hydra можно либо с помощью менеджера пакетов pip pip install hydra-core --upgrade, либо с помощью менеджера пакетов conda conda install -c conda-forge hydra-core.

В основном, выбор библиотеки определяется следующими аспектами:

  • сложностью задачи и ее особенностями. К примеру, конфигурация маршрута подготовки моделей машинного обучения для развертывания на облачной платформе может быть выполнена и с помощью PyYAML/toml, а вот управление сложным web-проектом скорее всего потребует продвинутых возможностей dynaconf или hydra;
  • требованиями к показателю переиспользования кода. С этой точки зрения преимущества на стороне библиотеки hydra;
  • гибкостью решения и одновременно простотой сопровождения кода. Здесь чаще используются библиотеки PyYAML и toml.
Обобщая сказанное выше и учитывая класс задач, которые призваны решать конфигурационные файлы в контексте управления Python-приложениями, далее будем использовать YAML-файлы и библиотеку PyYAML.

Несколько слов о синтаксисе YAML

Синтаксис YAML прост и лаконичен, но есть несколько особенностей. Практически каждый YAML-файл строится на базе списка. Каждый элемент списка это список пар «ключ-значение», который обычно называют словарем. То есть представление модели объекта с помощью YAML сводится к тому, чтобы описать эту модель в терминах списков и словарей.

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

Все элементы списка располагаются на одном и том же уровне и начинаются с - (тире и пробел):

start_end.yaml
        --- # Начало файла
# Список фруктов
- Apple
- Orange
- Strawberry
- Mango
... # Конец файла
    

Словари YAML представляют собой, как в и Python, наборы пар «ключ-значение» (за двоеточием должен следовать пробел):

dict.yaml
        # Запись о сотруднике
martin:
  name: Martin Johnson
  job: Developer
  skill: Elite
    

YAML поддерживает стандартные типы данных: целочисленный (int), вещественный (float), булев (boolean), строковый (string) и null:

types.yaml
        integer: 25
float: 25.0
exponent: 12.3015e+05
boolean: Yes
string: "25"
infinity: .inf # бесконечность
neginf: -.inf  # минус бесконечность
    

При необходимости можно явно указывать тип данных значения с помощью конструкции !![тип данных], например:

  • pi: !!float 3.14159,
  • flag: !!bool false и т.д.

Булевы значения, могут иметь разные варианты записи, но рекомендуется использовать true и false, чтобы YAML-файл был совместим с настройками по умолчанию большинства YAML-линтеров:

supported_bools.yaml
        create_key: yes
needs_agent: no
knows_oop: True
likes_emacs: TRUE
uses_cvs: false
    

В YAML необязательно заключать строковые константы в кавычки, но в ситуациях, когда требуется явно подчеркнуть строковую природу значения, кавычки не помешают. Допускается использовать как одинарные, так и двойные кавычки. Единственное отличие заключается в том, что двойные кавычки разрешают использовать управляющие коды строковых констант – их еще называют экранированными последовательностями – \t (символ горизонтальной табуляции), \r (символ возврата каретки), \n (символ перехода на новую строку) и т.д.

Для работы с длинными строками используют символы | и >

multilines_and_one_long_line.yaml
        include_newlines: |
            это действительно
            три отдельные
            строки
fold_newlines: >
            а это на самом деле одна
            длинная строка, которая
            выглядит как три отдельные
    

Бывает, что отдельные фрагменты YAML-файла требуется повторить несколько раз. Для решения такого рода задач используются якоря & и псевдонимы *. Пример:

anchor_alias.yaml
        hello: &hi 'hello' # вводится якорь hi
greeting:
  audience: 'world'
  hello: *hi # применение якоря; hello получит строку 'hello'
    

Псевдонимы можно задавать и для блоков:

anchor_for_block.yaml
        foo:
  bar: &bar # псевдоним для блока
    qux: 'quxqux'
    baz: 'bazbaz'
greeting:
  audience: 'world'
  bar: *bar # *bar развернется в словарь с ключами qux и baz
    

С помощью ключа слияния <<: можно «наследовать» и переопределять разделы:

merge_key.yaml
        bar: &bar # вводится псевдоним блока
  qux: 'quxqux'
  baz: 'bazbaz'
greeting:
  audience: 'world'
  bar:
    <<: *bar # *bar развернется в словарь qux и baz
    baz: 'notbaz' # НО baz перезапишется новым значением notbaz
    

Для редактирования YAML-файлов подойдет любой текстовый редактор, но важен следующий момент. Не всегда есть возможность использовать современный редактор с красивым графическим интерфейсом пользователя, а вот текстовый редактор Vim предустановлен на большинстве UNIX-подобных операционных систем.

Порог входа высок, но за счет огромного количества плагинов и продуманной концепции редактора эффективность разработки увеличивается многократно. Детали работы с редактором можно узнать, например, из книгиНейла, Дрю «Практическое использование Vim».

Проверка типов управляющих параметров конфигурационного файла

В простых сценариях использования, когда можно ограничиться контролем типа данных на уровне конфигурационного файла, будет достаточно использовать явное указание типа с помощью !![тип данных].

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

Проверку типов можно организовать с помощью стандартной библиотеки Python dataclasses и сторонней библиотеки marshmallow_dataclass.

Рассмотрим простой пример использования marshmallow_dataclass, заимствованный со страницы проекта:

simple_example_marshmallow.py
        from dataclasses import dataclass, field
from typing import List, Optional

import marshmallow_dataclass
import marshmallow.validate


@dataclass
class Building:
    height: float = field(
       metadata = {
           "validate": marshmallow.validate.Range(min=0)
        }
    )
    name: str = field(default="anonymous")


@dataclass
class City:
    name: Optional[str]
    buildings: List[Building] = field(default_factory=list)



# создаем экземпляр схемы
city_schema = marshmallow_dataclass.class_schema(City)()
# city_schema => <City(many=False)>
# загружаем словарь
city = city_schema.load(
    {
        "name": "Paris",
        "buildings": [{
            "name": "Eiffel Tower",
            "height": 324
        }]
    }
)
# city => City(
        name='Paris',
        buildings=[
            Building(
                height=324.0,
                name='Eiffel Tower'
            )
        ]
     )

city.buildings
# => [Building(height=324.0, name='Eiffel Tower')]
city.buildings[0].height # 324.0
    

Здесь класс Building содержит всего два атрибута: вещественный height и строковый name. С помощью метода marshmallow.validate выполняется проверка на минимальное значение атрибута height, а с помощью field атрибут name получает значение по умолчанию.

Класс City содержит опциональный атрибут name, который ожидает получить либо объект строкового типа, либо None. Атрибут buildings ожидает принять список объектов типа Building.

Далее создаем экземпляр схемы city_schema на базе объекта класса City, а затем загружаем словарь. Схема ожидает получить строку для атрибута name и список объектов Building, то есть список объектов, которые описываются строковым атрибутом name и вещественными атрибутом height.

Используя точечную нотацию и нотацию списков можно добраться до значений атрибутов.

Шаблон применения конфигурационных файлов как инструмента управления Python-приложениями

Разобравшись с основными понятиями и концепциями, перейдем к рассмотрению связки «конфигурационный файл + Python-приложение».

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

Сильная сторона такого представления задачи заключается в возможности явным образом декомпозировать приложение на:

  • изменяющийся блок управляющих параметров, или другими словами на динамическую часть инфраструктуры кода, с которой разработчик будет взаимодействовать в будущем,
  • неизменяющийся блок базовой логики – статичную часть кода, которая не требует внесения изменений в программный код напрямую.
<i>Высокоуровневая схема взаимодействия конфигурационного файла с Python-приложением</i>
Высокоуровневая схема взаимодействия конфигурационного файла с Python-приложением

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

Этот шаблон распространяется на приложения произвольной сложности, но у него есть естественные ограничения.

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

В этом вопросе могут помочь:

  • DearPyGui: библиотека для разработки настольных приложений с графическим интерфейсом пользователя;
  • Streamlit: мощная библиотека для прототипирования браузерных решений с графическим интерфейсом.
Важно понимать, что рассмотренный шаблон не может покрыть всех задач по-настоящему сложных приложений (например, с микросервисной архитектурой), но потенциально способен «закрыть» какое-то подмножество этих задач в пределах отдельно взятого микросервиса.

Пример связки «конфигурационный YAML-файл + Python-приложение»

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

Для простоты гипотеза о выбросах проверяется с помощью классической стандартизованной Z-оценки и модифицированной робастной Z-оценки (англ.) на медиане. Для моделирования псевдослучайных процессов с гауссовским распределением ординат и корреляционными функциями заданного типа использовались алгоритмы, заимствованные из книги Быкова, В.В. «Цифровое моделирование в статистической радиотехнике».

Полный код примера с пояснениями и деталями реализации доступен в github-репозитории.

Вот его структура:

struct_repo.md
        .
configs/
  `- gauss_processes_acf.yaml
figure_exapmples/
  `- gauss_exp_acf.pdf
  `- ...
figures/
  `- *.pdf
python_scripts
  `- main.py
  `- helper_funcs_and_class_schema.py
README.md

    

В каталоге configs располагается шаблон конфигурационного файла, который можно использовать в качестве отправной точки для разработки своих собственных более сложных конфигураций приложения.

gauss_proc_acf.yaml
        ---
# *** MENU ***
# Types of ACF (for `kind_acf`):
# 1: exp type,
# 2: exp-cos type,
# 3: exp-cos-sin type (plus),
# 4: exp-cos-sin type (minus)

# *** MAIN CONTROL PARAMETERS ***
sigma: !!float 2            # standard deviation
w_star: !!float 1.25        # model parameter
w0: !!float 2.5             # model parameter
alpha: !!float 0.05         # smoothing factor for EWMA
window_width: !!int 14     # width of window in MA
delta_t: !!float 0.05       # time step
N: !!int 1000               # number of counts
kind_acf: !!int 1           # ACF type


# *** OTHERS APP SETTINGS ***
visibility:
  ma_show: !!bool true

colors:
  white: !!str &white "#FDFDFD"
  grey: !!str &grey "#52616B"
  blue_purple: !!str &blue_purple "#8785A2"
  terakotta: !!str &terakotta "#E84A5F"
  pearl_night: !!str &pearl_night "#112D4E"
  krayola_green: !!str &krayola_green "#1CAC78"

figure_settings:
  height_main_fig: !!int 7
  width_main_fig: !!int 18
  left_xlim_acf: !!float 0.
  right_xlim_acf: !!float 4.
  left_xlim_pdf: !!float -9
  right_xlim_pdf: !!float 9
...
    

В figure_examples хранятся демонстрационные примеры работы сценария python_scripts/main.py, а прямые результаты его работы в – каталоге figures.

Управлять типом корреляционной функции процесса можно с помощью параметра kind_acf. Смысл остальных управляющих параметров (w_star, w0, alpha и т.д.) должен быть понятен из комментариев.

Для запуска приложения следует перейти в корневой каталог проекта и выполнить:

start_app.sh
        $ python python_scripts/main.py \
    --config-path configs/gauss_processes_acf.yaml \
    --output-fig-path figures/your_output_image_name.pdf

    

Функция cmd_line_parser из модуля helper_funcs_and_class_schema.py прочитает значения флагов (--config-path, --output-fig-path), а затем вернет путь до конфигурационного файла и путь до файла с результатами анализа псевдослучайного процесса.

Затем, функция read_yaml_file прочитает конфигурационный файл и проверит типы управляющих параметров. Если типы управляющих параметров корректны и ошибок нет, то функция вернет объект типа Params, к атрибутам которого можно будет обратиться с помощью точечной нотации. Остается только построить сводку с использованием функции draw_graph.

Повысить эффективность работы с конфигурационными YAML-файлами можно с помощью различных утилит (например, с помощью легковесной yq), но потоковый редактор sed, как правило, «из коробки» доступен на большинстве операционных систем.

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

sed_example.sh
        $ sed 's/w0: !!float 3.0/w0: !!float 3.15' \
    configs/gauss_processes_acf.yaml \
        > configs/gauss_expacf_w0=3.15.yaml
    

Здесь sed ищет строку «w0: !!float 3.0», заменяет ее строкой «w0: !!float 3.15» и записывает результат (>) в новый конфигурационный файл.

На рисунках ниже приведены результаты работы Python-приложения с различными комбинациями управляющих параметров.

<i>Сводка по анализу выбросов стационарного гауссовского псевдослучайного процесса с корреляционной функцией экспоненциального типа</i>
Сводка по анализу выбросов стационарного гауссовского псевдослучайного процесса с корреляционной функцией экспоненциального типа
<i>Сводка по анализу выбросов стационарного гауссовского псевдослучайного процесса с корреляционной функцией экспоненциально-косинусного типа</i>
Сводка по анализу выбросов стационарного гауссовского псевдослучайного процесса с корреляционной функцией экспоненциально-косинусного типа
<i>Сводка по анализу выбросов стационарного гауссовского псевдослучайного процесса с корреляционной функцией экспоненциально-косинусно-синусного типа (минус)</i>
Сводка по анализу выбросов стационарного гауссовского псевдослучайного процесса с корреляционной функцией экспоненциально-косинусно-синусного типа (минус)
<i>Сводка по анализу выбросов стационарного гауссовского псевдослучайного процесса с корреляционной функцией экспоненциально-косинусно-синусного типа (плюс)</i>
Сводка по анализу выбросов стационарного гауссовского псевдослучайного процесса с корреляционной функцией экспоненциально-косинусно-синусного типа (плюс)

Заключение

Из руководства вы узнали:

  • какие из существующих форматов конфигурационных файлов могут пригодится в роли текстового интерфейса к Python-приложениям;
  • какие существуют библиотеки для работы с конфигурационными файлами и где проходит граница области применимости каждой из них;
  • как использовать выразительный синтаксис YAML-файлов – якоря, псевдонимы, ключи слияния – для упрощения описания модели объектов;
  • в каких сценариях имеет смысл использовать связку «конфигурационный файл + Python-приложение» и в чем сильная сторона такого подхода;
  • как может выглядеть пример использования текстовых интерфейсов в задаче обнаружения выбросов;
  • а также, как «винтажные» инструменты – Vim и sed – могут повысить эффективность редактирования текстовых файлов.

Полезные источники:

Связные материалы с платформы Proglib:

11
Июн
2021

🐍 Конфигурационные файлы как инструмент управления приложениями на Python

В руководстве рассматривается общий шаблон и конкретные примеры управления Python-приложением с использованием конфигурационных файлов в роли текстовых интерфейсов.

Вводные замечания о форматах конфигурационных файлов

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

К наиболее распространенным форматам конфигурационных файлов, которые находят применение в контексте управления приложениями на Python, можно отнести INI, JSON, TOML и YAML.

  • INI – самый простой формат из рассмотренных. С одной стороны чем проще читать конфигурационный файл, тем лучше, но с другой – файлы *.INI могут оперировать только одномерными структурами, т.е. структурами с простой одноуровневой иерархией. В большинстве прикладных задач, когда приходится иметь дело с моделями объектов, допускающих представление в виде списков, ассоциативных массивов и т.п., возможностей INI оказывается недостаточно.
  • JSON-файл выглядит как обычный словарь Python и может включать сложные иерархические зависимости, однако с точки зрения читаемости проигрывает и YAML, и TOML. Кроме того, JSON не поддерживает комментарии, а они часто могут значительно упростить сопровождение кода.
  • В отличие от предыдущих, формат TOML обладает несоизмеримой гибкостью и широтой арсенала поддерживаемых типов данных. TOML поддерживает простые пары «ключ-значение», массивы, классические и встроенные таблицы, массивы таблиц, булевы значения, а также локальные временные метки и временные метки со смещением.

Для сравнения рассмотрим одну и ту же модель объекта, описанного с помощью TOML и JSON.

Вот TOML-представление модели объекта:

view_obj.toml
        [[fruits]]
name = "apple"

[fruits.physical]  # подтаблица
color = "red"
shape = "round"

[[fruits.varieties]]  # вложенный массив таблиц
name = "red delicious"

[[fruits.varieties]]
name = "granny smith"

[[fruits]]
name = "banana"

[[fruits.varieties]]
name = "plantain"
    

А вот JSON-представление:

view_obj.json
        {
  "fruits": [
    {
      "name": "apple",
      "physical": {
        "color": "red",
        "shape": "round"
      },
      "varieties": [
        { "name": "red delicious" },
        { "name": "granny smith" }
      ]
    },
    {
      "name": "banana",
      "varieties": [
        { "name": "plantain" }
      ]
    }
  ]
}
    

Синтаксические особенности JSON – избыточные фигурные и квадратные скобки – делают сложноструктурные JSON-файлы «размазанными».

Формат YAML обладает схожими с форматом TOML возможностями (в смысле гибкости представления моделей объектов и разнообразия поддерживаемых типов данных), но на сложных структурах выглядит компактнее.

Вопрос выбора формата конфигурационного файла зависит больше от сложности описания модели объекта, но, в большинстве случаев для задач, связанных с управлением Python-приложениями, выбор падает на YAML.

Python-библиотеки для работы с конфигурационными файлами

Из всего многообразия предназначенных для работы с конфигурационными файлами библиотек – ориентированных на какой-то конкретный формат или «всеядных» – можно выделить следующие:

  • configparser: это элемент стандартной библиотеки Python, предназначенный для работы с INI-файлами Microsoft Windows. В распоряжении пользователя есть класс ConfigParser, который реализует базовые возможности библиотеки.
  • PyYAML: элемент не входит в стандартную библиотеку, поэтому его нужно установить с помощью менеджера пакетов pip pip install pyyaml. В Python-сценарии обращение к библиотеке выглядит как import yaml.
  • toml: этот элемент тоже представляет собой стороннее решение для работы с форматом TOML и требует установки с помощью pip install toml.
  • dynaconf: это очень гибкая библиотека, которая 1) позволяет работать со всеми популярными форматами конфигурационных файлов (*.toml, *.yaml, *.json, *.ini, *.py), 2) поддерживает мультипрофили, т.е. конфигурационный файл может содержать несколько заголовков, относящихся к различным стадиям готовности программного продукта (например, default, development, production и т.д.), а нужный набор настроек затем вызывается с указанием соответствующего заголовка, 3) умеет работать с переменными окружения («работает из коробки» с библиотекой dotenv), 4) предлагает утилиту командной строки для выполнения операций общего назначения (init, list, write, validate и т.д.). Устанавливается библиотека с помощью менеджера пакетов pip pip install dynaconf.
  • hydra: это, строго говоря, не просто библиотека, а полноценная платформа, предназначенная для решения широкого круга задач, связанных с конфигурацией сложных приложений. Установить hydra можно либо с помощью менеджера пакетов pip pip install hydra-core --upgrade, либо с помощью менеджера пакетов conda conda install -c conda-forge hydra-core.

В основном, выбор библиотеки определяется следующими аспектами:

  • сложностью задачи и ее особенностями. К примеру, конфигурация маршрута подготовки моделей машинного обучения для развертывания на облачной платформе может быть выполнена и с помощью PyYAML/toml, а вот управление сложным web-проектом скорее всего потребует продвинутых возможностей dynaconf или hydra;
  • требованиями к показателю переиспользования кода. С этой точки зрения преимущества на стороне библиотеки hydra;
  • гибкостью решения и одновременно простотой сопровождения кода. Здесь чаще используются библиотеки PyYAML и toml.
Обобщая сказанное выше и учитывая класс задач, которые призваны решать конфигурационные файлы в контексте управления Python-приложениями, далее будем использовать YAML-файлы и библиотеку PyYAML.

Несколько слов о синтаксисе YAML

Синтаксис YAML прост и лаконичен, но есть несколько особенностей. Практически каждый YAML-файл строится на базе списка. Каждый элемент списка это список пар «ключ-значение», который обычно называют словарем. То есть представление модели объекта с помощью YAML сводится к тому, чтобы описать эту модель в терминах списков и словарей.

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

Все элементы списка располагаются на одном и том же уровне и начинаются с - (тире и пробел):

start_end.yaml
        --- # Начало файла
# Список фруктов
- Apple
- Orange
- Strawberry
- Mango
... # Конец файла
    

Словари YAML представляют собой, как в и Python, наборы пар «ключ-значение» (за двоеточием должен следовать пробел):

dict.yaml
        # Запись о сотруднике
martin:
  name: Martin Johnson
  job: Developer
  skill: Elite
    

YAML поддерживает стандартные типы данных: целочисленный (int), вещественный (float), булев (boolean), строковый (string) и null:

types.yaml
        integer: 25
float: 25.0
exponent: 12.3015e+05
boolean: Yes
string: "25"
infinity: .inf # бесконечность
neginf: -.inf  # минус бесконечность
    

При необходимости можно явно указывать тип данных значения с помощью конструкции !![тип данных], например:

  • pi: !!float 3.14159,
  • flag: !!bool false и т.д.

Булевы значения, могут иметь разные варианты записи, но рекомендуется использовать true и false, чтобы YAML-файл был совместим с настройками по умолчанию большинства YAML-линтеров:

supported_bools.yaml
        create_key: yes
needs_agent: no
knows_oop: True
likes_emacs: TRUE
uses_cvs: false
    

В YAML необязательно заключать строковые константы в кавычки, но в ситуациях, когда требуется явно подчеркнуть строковую природу значения, кавычки не помешают. Допускается использовать как одинарные, так и двойные кавычки. Единственное отличие заключается в том, что двойные кавычки разрешают использовать управляющие коды строковых констант – их еще называют экранированными последовательностями – \t (символ горизонтальной табуляции), \r (символ возврата каретки), \n (символ перехода на новую строку) и т.д.

Для работы с длинными строками используют символы | и >

multilines_and_one_long_line.yaml
        include_newlines: |
            это действительно
            три отдельные
            строки
fold_newlines: >
            а это на самом деле одна
            длинная строка, которая
            выглядит как три отдельные
    

Бывает, что отдельные фрагменты YAML-файла требуется повторить несколько раз. Для решения такого рода задач используются якоря & и псевдонимы *. Пример:

anchor_alias.yaml
        hello: &hi 'hello' # вводится якорь hi
greeting:
  audience: 'world'
  hello: *hi # применение якоря; hello получит строку 'hello'
    

Псевдонимы можно задавать и для блоков:

anchor_for_block.yaml
        foo:
  bar: &bar # псевдоним для блока
    qux: 'quxqux'
    baz: 'bazbaz'
greeting:
  audience: 'world'
  bar: *bar # *bar развернется в словарь с ключами qux и baz
    

С помощью ключа слияния <<: можно «наследовать» и переопределять разделы:

merge_key.yaml
        bar: &bar # вводится псевдоним блока
  qux: 'quxqux'
  baz: 'bazbaz'
greeting:
  audience: 'world'
  bar:
    <<: *bar # *bar развернется в словарь qux и baz
    baz: 'notbaz' # НО baz перезапишется новым значением notbaz
    

Для редактирования YAML-файлов подойдет любой текстовый редактор, но важен следующий момент. Не всегда есть возможность использовать современный редактор с красивым графическим интерфейсом пользователя, а вот текстовый редактор Vim предустановлен на большинстве UNIX-подобных операционных систем.

Порог входа высок, но за счет огромного количества плагинов и продуманной концепции редактора эффективность разработки увеличивается многократно. Детали работы с редактором можно узнать, например, из книгиНейла, Дрю «Практическое использование Vim».

Проверка типов управляющих параметров конфигурационного файла

В простых сценариях использования, когда можно ограничиться контролем типа данных на уровне конфигурационного файла, будет достаточно использовать явное указание типа с помощью !![тип данных].

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

Проверку типов можно организовать с помощью стандартной библиотеки Python dataclasses и сторонней библиотеки marshmallow_dataclass.

Рассмотрим простой пример использования marshmallow_dataclass, заимствованный со страницы проекта:

simple_example_marshmallow.py
        from dataclasses import dataclass, field
from typing import List, Optional

import marshmallow_dataclass
import marshmallow.validate


@dataclass
class Building:
    height: float = field(
       metadata = {
           "validate": marshmallow.validate.Range(min=0)
        }
    )
    name: str = field(default="anonymous")


@dataclass
class City:
    name: Optional[str]
    buildings: List[Building] = field(default_factory=list)



# создаем экземпляр схемы
city_schema = marshmallow_dataclass.class_schema(City)()
# city_schema => <City(many=False)>
# загружаем словарь
city = city_schema.load(
    {
        "name": "Paris",
        "buildings": [{
            "name": "Eiffel Tower",
            "height": 324
        }]
    }
)
# city => City(
        name='Paris',
        buildings=[
            Building(
                height=324.0,
                name='Eiffel Tower'
            )
        ]
     )

city.buildings
# => [Building(height=324.0, name='Eiffel Tower')]
city.buildings[0].height # 324.0
    

Здесь класс Building содержит всего два атрибута: вещественный height и строковый name. С помощью метода marshmallow.validate выполняется проверка на минимальное значение атрибута height, а с помощью field атрибут name получает значение по умолчанию.

Класс City содержит опциональный атрибут name, который ожидает получить либо объект строкового типа, либо None. Атрибут buildings ожидает принять список объектов типа Building.

Далее создаем экземпляр схемы city_schema на базе объекта класса City, а затем загружаем словарь. Схема ожидает получить строку для атрибута name и список объектов Building, то есть список объектов, которые описываются строковым атрибутом name и вещественными атрибутом height.

Используя точечную нотацию и нотацию списков можно добраться до значений атрибутов.

Шаблон применения конфигурационных файлов как инструмента управления Python-приложениями

Разобравшись с основными понятиями и концепциями, перейдем к рассмотрению связки «конфигурационный файл + Python-приложение».

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

Сильная сторона такого представления задачи заключается в возможности явным образом декомпозировать приложение на:

  • изменяющийся блок управляющих параметров, или другими словами на динамическую часть инфраструктуры кода, с которой разработчик будет взаимодействовать в будущем,
  • неизменяющийся блок базовой логики – статичную часть кода, которая не требует внесения изменений в программный код напрямую.
<i>Высокоуровневая схема взаимодействия конфигурационного файла с Python-приложением</i>
Высокоуровневая схема взаимодействия конфигурационного файла с Python-приложением

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

Этот шаблон распространяется на приложения произвольной сложности, но у него есть естественные ограничения.

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

В этом вопросе могут помочь:

  • DearPyGui: библиотека для разработки настольных приложений с графическим интерфейсом пользователя;
  • Streamlit: мощная библиотека для прототипирования браузерных решений с графическим интерфейсом.
Важно понимать, что рассмотренный шаблон не может покрыть всех задач по-настоящему сложных приложений (например, с микросервисной архитектурой), но потенциально способен «закрыть» какое-то подмножество этих задач в пределах отдельно взятого микросервиса.

Пример связки «конфигурационный YAML-файл + Python-приложение»

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

Для простоты гипотеза о выбросах проверяется с помощью классической стандартизованной Z-оценки и модифицированной робастной Z-оценки (англ.) на медиане. Для моделирования псевдослучайных процессов с гауссовским распределением ординат и корреляционными функциями заданного типа использовались алгоритмы, заимствованные из книги Быкова, В.В. «Цифровое моделирование в статистической радиотехнике».

Полный код примера с пояснениями и деталями реализации доступен в github-репозитории.

Вот его структура:

struct_repo.md
        .
configs/
  `- gauss_processes_acf.yaml
figure_exapmples/
  `- gauss_exp_acf.pdf
  `- ...
figures/
  `- *.pdf
python_scripts
  `- main.py
  `- helper_funcs_and_class_schema.py
README.md

    

В каталоге configs располагается шаблон конфигурационного файла, который можно использовать в качестве отправной точки для разработки своих собственных более сложных конфигураций приложения.

gauss_proc_acf.yaml
        ---
# *** MENU ***
# Types of ACF (for `kind_acf`):
# 1: exp type,
# 2: exp-cos type,
# 3: exp-cos-sin type (plus),
# 4: exp-cos-sin type (minus)

# *** MAIN CONTROL PARAMETERS ***
sigma: !!float 2            # standard deviation
w_star: !!float 1.25        # model parameter
w0: !!float 2.5             # model parameter
alpha: !!float 0.05         # smoothing factor for EWMA
window_width: !!int 14     # width of window in MA
delta_t: !!float 0.05       # time step
N: !!int 1000               # number of counts
kind_acf: !!int 1           # ACF type


# *** OTHERS APP SETTINGS ***
visibility:
  ma_show: !!bool true

colors:
  white: !!str &white "#FDFDFD"
  grey: !!str &grey "#52616B"
  blue_purple: !!str &blue_purple "#8785A2"
  terakotta: !!str &terakotta "#E84A5F"
  pearl_night: !!str &pearl_night "#112D4E"
  krayola_green: !!str &krayola_green "#1CAC78"

figure_settings:
  height_main_fig: !!int 7
  width_main_fig: !!int 18
  left_xlim_acf: !!float 0.
  right_xlim_acf: !!float 4.
  left_xlim_pdf: !!float -9
  right_xlim_pdf: !!float 9
...
    

В figure_examples хранятся демонстрационные примеры работы сценария python_scripts/main.py, а прямые результаты его работы в – каталоге figures.

Управлять типом корреляционной функции процесса можно с помощью параметра kind_acf. Смысл остальных управляющих параметров (w_star, w0, alpha и т.д.) должен быть понятен из комментариев.

Для запуска приложения следует перейти в корневой каталог проекта и выполнить:

start_app.sh
        $ python python_scripts/main.py \
    --config-path configs/gauss_processes_acf.yaml \
    --output-fig-path figures/your_output_image_name.pdf

    

Функция cmd_line_parser из модуля helper_funcs_and_class_schema.py прочитает значения флагов (--config-path, --output-fig-path), а затем вернет путь до конфигурационного файла и путь до файла с результатами анализа псевдослучайного процесса.

Затем, функция read_yaml_file прочитает конфигурационный файл и проверит типы управляющих параметров. Если типы управляющих параметров корректны и ошибок нет, то функция вернет объект типа Params, к атрибутам которого можно будет обратиться с помощью точечной нотации. Остается только построить сводку с использованием функции draw_graph.

Повысить эффективность работы с конфигурационными YAML-файлами можно с помощью различных утилит (например, с помощью легковесной yq), но потоковый редактор sed, как правило, «из коробки» доступен на большинстве операционных систем.

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

sed_example.sh
        $ sed 's/w0: !!float 3.0/w0: !!float 3.15' \
    configs/gauss_processes_acf.yaml \
        > configs/gauss_expacf_w0=3.15.yaml
    

Здесь sed ищет строку «w0: !!float 3.0», заменяет ее строкой «w0: !!float 3.15» и записывает результат (>) в новый конфигурационный файл.

На рисунках ниже приведены результаты работы Python-приложения с различными комбинациями управляющих параметров.

<i>Сводка по анализу выбросов стационарного гауссовского псевдослучайного процесса с корреляционной функцией экспоненциального типа</i>
Сводка по анализу выбросов стационарного гауссовского псевдослучайного процесса с корреляционной функцией экспоненциального типа
<i>Сводка по анализу выбросов стационарного гауссовского псевдослучайного процесса с корреляционной функцией экспоненциально-косинусного типа</i>
Сводка по анализу выбросов стационарного гауссовского псевдослучайного процесса с корреляционной функцией экспоненциально-косинусного типа
<i>Сводка по анализу выбросов стационарного гауссовского псевдослучайного процесса с корреляционной функцией экспоненциально-косинусно-синусного типа (минус)</i>
Сводка по анализу выбросов стационарного гауссовского псевдослучайного процесса с корреляционной функцией экспоненциально-косинусно-синусного типа (минус)
<i>Сводка по анализу выбросов стационарного гауссовского псевдослучайного процесса с корреляционной функцией экспоненциально-косинусно-синусного типа (плюс)</i>
Сводка по анализу выбросов стационарного гауссовского псевдослучайного процесса с корреляционной функцией экспоненциально-косинусно-синусного типа (плюс)

Заключение

Из руководства вы узнали:

  • какие из существующих форматов конфигурационных файлов могут пригодится в роли текстового интерфейса к Python-приложениям;
  • какие существуют библиотеки для работы с конфигурационными файлами и где проходит граница области применимости каждой из них;
  • как использовать выразительный синтаксис YAML-файлов – якоря, псевдонимы, ключи слияния – для упрощения описания модели объектов;
  • в каких сценариях имеет смысл использовать связку «конфигурационный файл + Python-приложение» и в чем сильная сторона такого подхода;
  • как может выглядеть пример использования текстовых интерфейсов в задаче обнаружения выбросов;
  • а также, как «винтажные» инструменты – Vim и sed – могут повысить эффективность редактирования текстовых файлов.

Полезные источники:

Связные материалы с платформы Proglib:

07
Июн
2021

Линейный сплайн.Скорость убывния погрешности

Нужно вычислить скорость убывания погрешности при уменьшении шага. Приблизительно понимаю как это сделать, ввести time.h и воспользоваться теоремой. Но нужна помощь по точной реализации этой идеи. Помогите, пожалуйста,если Вас не затруднит…

05
Июн
2021

Задача из E-Olymp: минимальная сумма для покупки дисков

Условие задачи:

Чистые компакт-диски продают в трёх видах упаковок. Упаковка из 100 дисков стоит 100 грн., из 20 дисков – 30 грн., а один диск стоит 2 грн. Какую минимальную сумму нужно истратить для покупки n таких дисков?

Вроде бы зада…

03
Июн
2021

Прошу помочь с расчетом по формуле

Только начал изучать Питон. Написал простенькую программку по аналогии примерам из книжки.
При всей неправильности, по моему мнению, формулы full_price считается правильно, хотя на мой взгляд в формула должна выглядеть таким образом:
full_…

01
Июн
2021

Дано положительное действительное число X. Выведите его дробную часть [дубликат]

Элементарная задача, казалось бы.
Но как бы я ни бился, ответ выводится странный.
Вот, например:
import math

x = float(input(‘Enter X’))

y = x – math.floor(x)

print(y)

Почему при вводе
12.99 в ответе не "0.99", а "0.9900…

01
Июн
2021

Дано положительное действительное число X. Выведите его дробную часть [дубликат]

Элементарная задача, казалось бы.
Но как бы я ни бился, ответ выводится странный.
Вот, например:
import math

x = float(input(‘Enter X’))

y = x – math.floor(x)

print(y)

Почему при вводе
12.99 в ответе не "0.99", а "0.9900…

25
Май
2021

Аппроксимация функции с помощью функционала scipy.optimize.minimize

Пытаюсь аппроксимировать функцию с помощью полинома.
Допустим реальные данные задаются следующей функцией:
# Функция генерирует реальные значения
def data_gen(x, alpha=1, beta=10, gama=5, per=1.75):
data = alpha*x + beta*np.sin(per*x)…

18
Май
2021

Построить интерференционную картину

Есть код – интерференция света. Здесь в качестве длины волны значения 5. Но хотелось бы взять видимый спектр значения. Как можно реализовать?
from math import sqrt,sin,pi
from numpy import empty
from pylab import imshow,gray,show

waveleng…

15
Май
2021

Вручную обучить модель методами nesterov momentum и rmsprop на Python

Есть готовые методы TensorFlow, которые реализуют тот и другой функционал. Однако пытаюсь посмотреть, как это можно сделать руками для модели логистической регрессии (классификация). Использую датасет Iris, оставив 2 класса.
Реализовал обу…

11
Май
2021

Поиск коэффициентов уравнения

В уравнении вида y = alpha + k*x^n необходимо найти коэффициенты alpha, k, n. Показатель степени n от 0 до 1.
При использовании функции curve_fit из scipy получаются совсем некорректные значения.
Тестовые данные x = [1021.998 10.21998 5.10…

10
Май
2021

Простая геометрическая задачка

Эта задача из E-Olymp.https://www.e-olymp.com/ru/problems/924
Впринципе я все сделал, но программа работает не правильно.При любом значении,постоянно выводит 1,несмотря на то,что все необходимое уже написано(мне кажется).Не понимаю где оши…

08
Май
2021

Построить обратную матрицу методом Гаусса

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

27
Апр
2021

Сумма чисел должна быть равна определенному числу

Нужно найти определенную формулу где сумма чисел должна быть равна 600 где минимальным числом в ряде будет 2, а максимальным 20. Диапазон между числами должен быть одинаковый
Буду очень благодарна за любую помощь.