Русский
Русский
English
Статистика
Реклама

Визуализация данных

Перевод Визуализация списка женщин-лауреатов Нобелевской премии в виде кристаллов в 3d с использованием Vue, WebGL, three.js

13.06.2020 22:23:27 | Автор: admin
image

Год 1 | вдохновение


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

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


1 неделя | данные


После формирования концепции, возник следующий вопрос как собрать необходимые данные? Я быстро пришла к идее использовать Википедию, попытаться спарсить лучших женщин оттуда. Я понятия не имела, как определить лучших (просмотры страницы? длина страницы? ссылки на страницу?). Хотя я посмотрела статью на The Pudding про визуализацию на основе данных википедии, я все еще не была уверена, что хочу двигаться в эту сторону. А еще мне очень не хватало свободного времени.

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

image

С этого момента я начала изучать разные методы использования API Википедии. Разобраться было непросто (я не была уверена, нужно ли мне использовать Wikidata или MediaWiki, это те варианты, которые возникали при поиске Wikipedia API в Google), но, к счастью, уже упомянутая выше статья на Pudding помогла мне закрыть эти вопросы. Быстрый просмотр их репозитория wiki-billboard-data привел меня к выбору одного из скриптов с wikijs, и я могла просто воспользоваться этим пакетом.

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

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


Затем я экспортировала электронную таблицу как CSV, потом использовала онлайн-конвертер, чтобы получить данные в формате JSON.

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

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

неделя 2 | скетч


Не буду врать, я так долго думала об этом проекте, что даже не могу вспомнить все идеи, которые у меня возникали в процессе. Все, что я помню, это то, что я просматривала номинантов премии Information is Beautiful, когда решила, что мне нужно как-то выделить те записи, которые мне действительно нравятся в моих сохранениях. Это заставило меня осознать, что я должна лучше организовать свою доску на Pinterest, так как раньше я сваливала все мои идеи и видение на одну доску. В процессе чистки, я наткнулась на эту великолепную картину с кристаллами художника Ребекки Шаперон, которую я сохранила на будущее несколько лет назад. Почти сразу я поняла, что я хочу программно воссоздать их. Ведь было бы прекрасно визуализировать этих выдающихся женщин в качестве ярких разноцветных кристаллов?

image

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

После этого я продумала другие детали: размер кристаллов должен отражать влияние женщины количество ссылок на ее страницу в Википедии. Число граней на кристалле будет сопоставлено с количеством источников в нижней части ее страницы (поскольку она многогранна), а цвет будет определяться категорией премии. Единственное, что мне пока было непонятно, это как расположить кристаллы. Я долго думала, что мне надо просто выложить их в 2-х измерениях по x / y и заставить читателя прокручивать их.

А потом я приняла участие в семинаре Мэтта ДесЛориерса по креативному кодингу, где он преподавал canvas, three.js и WebGL. Семинар открыл мне концепт третьего измерения, и я сразу поняла, что собираюсь использовать год получения награды в качестве оси z. Далее один мой друг предложил сделать потоки-нити, связывающие тех, кто сотрудничал друг с другом таким образом, чтобы их положение тоже менялось в зависимости от этого (но в итоге у меня не было времени на реализацию этой идеи).

Вся концепция пришла ко мне так быстро и естественно, что я не сделала ни одного наброска в процессе. Я просмотрела свой блокнот, но там вообще ничего нет.

неделя 3 & 4 | кодинг


Это был отличный месяц для кодинга.

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

И вот однажды меня осенило (я не уверена, что послужило причиной), что я не умею думать в трехмерном физическом пространстве, как раз потому, что я постоянно работаю в плоском диджитальном формате. Если бы я смогла научиться работать с 3D в цифре, то смогла бы мыслить в объеме и в физическом мире. Я добавила three.js и WebGL вверх своего списка для изучения.

В конце октября я прошла семинар Мэтта по креативному кодингу и изучила основы three.js, введение в фрагментированные и вершинные шейдеры. Я выучила правило буравчика: используйте большой палец для оси X (увеличивается вправо), указательный палец для оси Y (увеличивается вверх, что противоположно SVG и canvas) и средний палец для оси Z (для увеличения экрана и приближения его). Я узнала, что WebGL работает не в пикселях, а в единицах (похожая ассоциация футы или метры).

Затем в ноябре я вписалась в один конкурс по WebGL. Хотя я раньше не имела с ним дела, я надеялась, что дедлайн даст мне мотивацию, необходимую для завершения проекта. Я начала 1-го декабря и поставила себе цель делать чуть-чуть каждый будний день, пока не смогу дойти до чего-то презентабельного 23-го декабря (финал конкурса).

Сперва я прочла первые две главы Руководства по программированию на WebGL, в котором рассказывалось, как настроить WebGL. Затем я повторила свои знания по three.js. После я запустила блокнот из Observable, чтобы понять минимально-необходимые настройки для рисования чего-либо в three.js (рендерер, камера и сцена, а затем вызвать renderer.render(scene, camera) для отображения ). Мне всегда нравилось понимать самые основы работы кода, так что это было очень полезно.

После настройки я решила создать форму кристалла. Я использовала PolyhedronGeometry, потому что так я могла просто определить набор вершин, а затем указать вершины, которые будут составлять треугольную грань. В первый день мне удалось создать только один треугольник.

image

А во второй день кристалл (на который потребовалось две попытки, потому что в первый раз я налажала с математикой).

image

А потом, в конце концов, форма кристалла, который был у меня в голове.

image

Позже я поняла, что есть лучшие способы делать то, что я хотела (и на самом деле PolyhedronGeometry это довольно утомительный способ делать это), но я была очень рада возможности попрактиковаться в координатах x / y / z в WebGL.

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

image

Следующей задачей стало научиться использовать фрагментный шейдер для окрашивания кристалла. Здесь мне пришлось немного отклониться от плана, потому что я не могла понять, как использовать glslify (узловая модульная система для GLSL, на которой написаны шейдеры, которые я взяла в качестве образца). Вместо этого я начала изучать различные инструменты компоновки/сборки, чтобы в конечном итоге развернуть свой код в Интернете. В конце концов, я решила использовать Parcel (вместо Vue CLI, который я регулярно использую последние полгода), потому что он имеет встроенную поддержку как Vue, так и GLSL.

Вот такой кристалл с наложением того же паттерна шума у меня получился.

image

Результат мне не нравился, поэтому я решила, что мне нужно больше узнать о шейдерах и использовании цветов в шейдерах. Именно в этот момент я обратилась к Books of Shaders Патрисио Гонсалеса Виво и, в частности, к главе Shaping Functions. Я узнала о синусах, косинусах, полиномах и экспонентах функциях, которые могут брать число (или набор чисел) и выводить на их основе другие. Я также узнала о смешивании цветов и о том, как мы можем взять два цвета, и не только получить новый цвет посередине между этими двумя, но также смешивать цвета в формате RGB и создавать совершенно новые на их основе. Если мы объединим это с функциями формы, то сможем получить градиенты и формы:

image
Эти были получены путем смешивания синего и желтого, а также изменения значений RGB в каждой позиции с помощью степеней, синусов, абсолютных значений, шагов и сглаживаний

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

image

Но результат мне не понравился по двум причинам:
  • Я жестко задавала формы каждой фигуры, поэтому у меня было только три разных фигуры: прямоугольник, прямоугольник с треугольником сверху и прямоугольник с треугольником сверху и снизу. Это означало, что большинство кристаллов были просто прямоугольниками.
  • Я также хотела, чтобы цвет для каждой категории выбирался из шести базовых цветов, поэтому для каждого кристалла я использовала только один цвет. Цвета мне совсем не нравились.


Примерно в это же время я наткнулась на демо Bloom (эффект постобработки для создания свечения), и в нем были круглые, похожие на драгоценные камни объекты, которые выглядели довольно похоже на кристаллы, которые я и хотела получить:

image

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

Поэтому я заменила PolyhedronGeometry на SphereGeometry, установила высоту на 4 и ширину на свои данные, растянула фигуру, установив вертикальный масштаб в два раза больше по горизонтали, добавила jitter (дрожание) для каждой вершины, и у меня получились гораздо более интересные формы:

image

Теперь, когда я определилась с формами, настало время вернуться к цвету. На этот раз я использовала два цвета и смешивала их с функциями формы:

image
image
Мне нравится первый вариант выглядит как картофель

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

image
Код для добавления нормалей сторон.

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

image

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

image

В конце я добавила звездочки, которые визуализируют всех мужчин, которые выиграли премию за тот же период времени, а также аннотации для каждого кристалла и для десятилетий. Это было сложно, потому что с тем текстом, который у меня был, использовать TextGeometry было практически бесполезно. Решение, которое я нашла после поиска в интернете, визуализировать текст в HTML5 Canvas, создать PlaneGeometry и использовать этот Canvas в качестве текстуры для заполнения PlaneGeometry. Очень интересный подход.

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

image

Вот ссылка на финальный результат на GitHub

И видео c демонстрацией результата:



Если вы хотите попробовать еще что-то или начать с более простых проектов:

Подробнее..

Перевод Использование микрофона для создания произведений искусства, реагирующих на звук, на Javascript

18.06.2020 16:09:14 | Автор: admin
Несколько приёмов для создания произведений процедурального (генеративного) искусства.

image

Настройка объекта для микрофона вещь достаточно лёгкая, хоть и сначала может показаться сложной. Не надо волноваться. Даже если вы это не очень понимаете, то и не нужно. Потому что когда всё настроено и работает, вам больше никогда не придётся проделывать это всё снова



Куча туториалов могут объяснить это более подробно, но я что-то не видел советов, как перейти с Hello world на следующий уровень. Об этом я и хочу вам рассказать.

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


И ещё заметьте: с прошлого года нужно https соединение, чтобы использовать микрофон. Если вы используете что-то вроде Live Server от Atom (а его использовать стоит, поверьте мне), микрофон настроится автоматически.

Итак, сначала очень скучное дело, настройка микрофона Только не пугайтесь

function Microphone (_fft) {  var FFT_SIZE = _fft || 1024;  this.spectrum = [];  this.volume = this.vol = 0;  this.peak_volume = 0;  var self = this;  var audioContext = new AudioContext();  var SAMPLE_RATE = audioContext.sampleRate;    // это просто проверка браузера на то,   // поддерживает ли он AudioContext и getUserMedia  window.AudioContext = window.AudioContext ||  window.webkitAudioContext;  navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;  //теперь просто ждите запуска микрофона  window.addEventListener('load', init, false);  function init () {      try {        startMic(new AudioContext());      }      catch (e) {        console.error(e);        alert('Web Audio API is not supported in this browser');      }  }  function startMic (context) {    navigator.getUserMedia({ audio: true }, processSound, error);    function processSound (stream) {     //анализатор определяет частоту, колебательный сигнал и т. д.     var analyser = context.createAnalyser();     analyser.smoothingTimeConstant = 0.2;     analyser.fftSize = FFT_SIZE;     var node = context.createScriptProcessor(FFT_SIZE*2, 1, 1);     node.onaudioprocess = function () {       // число битов возвращает массив, а это половина FFT_SIZE       self.spectrum = new Uint8Array(analyser.frequencyBinCount);       // getByteFrequencyData выдаёт амплитуду для каждой ячейки       analyser.getByteFrequencyData(self.spectrum);       // getByteTimeDomainData определяет громкость за определённое время       // analyser.getByteTimeDomainData(self.spectrum);       self.vol = self.getRMS(self.spectrum);       // get peak  костыль, если громкость низкая       if (self.vol > self.peak_volume) self.peak_volume = self.vol;       self.volume = self.vol;     };     var input = context.createMediaStreamSource(stream);     input.connect(analyser);     analyser.connect(node);     node.connect(context.destination);  }  function error () {     console.log(arguments);  }}//////// SOUND UTILITIES ..... потом вставим сюда ещё чего-нибудь....return this;};var Mic = new Microphone();


Это даст нам массив амплитуд на наших частотах (использую 512 по умолчанию), представленные как Mic.spectrum. Окей, давайте начнём играть

Получение полной громкости.



image
Пошумим!

Я нечасто это использую, но это удобно и можно использовать в куче других утилит. Чтобы получить полную громкость или уровни, мы используем функцию getRMS(). RMS лучше указывает громкость входящего звука, он суммирует все громкости всех частот спектра. Итак, функция, которую мы добавим в Mic() выглядит так:

// A more accurate way to get overall volumethis.getRMS = function (spectrum) {var rms = 0;  for (var i = 0; i < vols.length; i++) {    rms += spectrum[i] * spectrum[i];  }  rms /= spectrum.length;  rms = Math.sqrt(rms);  return rms; }


И мы можем сделать простенькую анимацию, как ту, что выше, так:
var ctx = createCanvas("canvas1");ctx.background(235);function draw(){var s = Mic.getRMS();  ctx.fillStyle = rgb(s*2);  ctx.HfillEllipse(w/2, h/2, s*5, s*5);}


Получение спектра звука



image

Наш Mic() выдаёт Mic.spectrum, массив амплитуд или громкостей по всему спектру (или FFT_SIZE, у меня 512 по умолчанию). Мы можем использовать их как есть, вот так:

var ctx = createCanvas("canvas1");// сделайте сетку 200 по ширине// Как создавать сетки я показал тут [https://hackernoon.com/creative-coding-grids-2e6bcaa07596#.u4zyrccxr]var grid = new Grid(200, 1);function draw(){ctx.background(235);for (var i = 0; i < grid.length; i++) {    var s = Mic.spectrum[i];    ctx.fillStyle = hsl(map(i, 0, grid.length, 0, 360), 80, 50);    ctx.fillRect(grid.x[i], h - s, grid.spacing_x-1, s);  }}


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

Отображение звука.



image

Если бы у нас было, к примеру, только 20 объектов, но наш спектр выдавал 512 частот (что является значением по умолчанию для объекта Mic()), было бы разумно распределить амплитуды, чтобы получить более чёткое отображение того, что происходит с нашим звуком. Поэтому давайте переотобразим наш спектр.

Чтоб начинающим было легче, я буду достаточно часто использовать простую map() функцию, которая хранится в моем главном файле creative_coding.js, и выглядит вот так:
function map(value, min1, max1, min2, max2) {var returnvalue = ((value-min1) / (max1 - min1) * (max2-min2)) + min2;return returnvalue;};


Основываясь на этом, мы можем сделать mapSound() функцию, чтобы равномерно распределять значения. Это, скорее всего, самый ценный инструмент анализа звука. Я использую его почти каждый день. Супер удобно и просто.

this.mapSound = function(_me, _total, _min, _max){if (self.spectrum.length > 0) {   // обозначьте значения по умолчанию, если другие не даны   var min = _min || 0;   var max = _max || 100;   //actual new freq   var new_freq = Math.floor(_me * self.spectrum.length /_total);   // обозначьте громкость до хороших значений   return map(self.spectrum[new_freq], 0, self.peak_volume, min, max);  } else {    return 0;  }      }


Мы затем можем легко создать спектр вот так:

image
Тест, тест, 1, 2, 3.

Визуализация спектра сделана из сетки, звук обозначается по длине сетки. Я также обозначил выданные значения (_min и _max) как 5 и высоту/4, чтобы лучше выглядело:

var ctx = createCanvas("canvas1");// make a grid 200 widevar grid = new Grid(200, 1);function draw(){ctx.clearRect(0,0,w,h);for (var i = 0; i < grid.length; i++) {    // Mic.mapSound(_me, _total, _min, _max)    var s = Mic.mapSound(i, grid.length, 5, h/4);    ctx.fillStyle = rgb(0);    ctx.fillRect(grid.x[i], grid.y[i] - s/2, grid.spacing_x-0.5, s);  }}


На самом деле, mapSound() сможет позаботиться о всех нуждах, связанных с анализом звука. Чаще всего, именно простота лучше всего работает для визуализация звука. Фишка творческого кодинга просто выстраивать простые биты друг на друге, чтобы получились сложно выглядящие творения. Так, например, мы можем использовать некоторые приёмы Math.cos и Math.sin, чтобы сделать красивый круглый спектр:

image
Мам, смотри, круглый спектр

Вот код-пример: просто создать кучи частиц и распределить длину каждой линии частицы к соответствующей громкости:

var ctx = createCanvas("canvas1");var num_items = 200;var radius = 100;ctx.lineWidth = 2;var particles = [];// работаем над углами for (var i = 0; i < num_items; i++) {  var angle = radians(distributeAngles(i, num_items));  particles[i] = {    x: w/2 + Math.cos(angle) * radius,    y: h/2 + Math.sin(angle) * radius,    angle: angle  }}function draw(){ ctx.background(0); for (var i = 0; i < num_items; i++) {  var p = particles[i];  var s = Mic.mapSound(i, num_items, 5, 100);  // map to greyscale  //ctx.strokeStyle = rgb(map(i, 0, num_items, 0, 255));      x2 = w/2 + Math.cos(p.angle) * (s + radius);  y2 = h/2 + Math.sin(p.angle) * (s + radius);  ctx.line(p.x, p.y, x2, y2); }}


И этот код может быть адаптирован в нечто типа этого это одно из моих первых визуально-звуковых творений на Javascript.

image

Вот и всё. Конец. Как-нибудь мы можем добавить кучу полезных утилит, чтобы добавить басы, средние и высокие частоты, тон и ещё много чего, сделав визуализацию звука ещё проще

Как всегда, полный код можно найти у меня на github.

Счастливого кодинга!
Подробнее..

Скрипт выборки российских облигаций по параметрам

22.06.2020 06:23:18 | Автор: admin
Уже несколько лет я пользуюсь облигациями в качестве замены депозита, потому что процент дохода, который можно получить со вклада стабильно падает. В отличии от ситуации с депозитом, в облигациях всегда можно найти большую доходность. И в этой ситуации меня не устраивало только количество времени на механическую работу по поиску подходящих вариантов бумаг.


Работа скрипта по поиску облигаций на Московской бирже

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

Сделал это на Node.js с выводом полученных результатов в локальный html файл с интерактивной таблицей от Google Charts (а в случае, если JavaScript отключен в браузере, что например происходит при открытии этого html файла из мессенджера на iPhone, то отображается статическая версия таблицы, также сгенерированная скриптом).

Существующие сервисы и мои параметры для поиска


Существующих сервисов довольно много:


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

Мой желаемый результат актуальная выборка из всех российских облигаций по следующим параметрам:

  1. Заданный диапазон текущей доходности.
  2. Заданный диапазон текущих цен.
  3. Заданный диапазон дюрации.
  4. Объем сделок за последние n дней больше порогового.
  5. Ответ на вопрос есть ли налоговая льгота для корпоративных облигаций, выпущенных после 1 января 2017 года?

Конкретные цифры диапазонов могут быть любыми, например:

  • 5% < Доходность < 11%
  • 98% < Цена < 101%
  • 4 мес. < Дюрация < 15 мес.
  • Объем сделок за n дней > 15 000 шт.

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

Облигации на Московской бирже доступны внутри основных режимов торгов:

  • Т0: Основной режим безадрес. (до 22.05.2020: 1443 бумаг, в июне 131 шт.).
  • Т+: Основной режим безадрес. (до 22.05.2020: 295 бумаг, в июне 1638 шт.).
  • Т+: Основной режим (USD) безадрес. (до 22.05.2020: 125 бумаг, в июне 128 шт.).

Облигаций много, именно потому автоматизированное решение поиска мне кажется правильным шагом.

Мой скрипт поиска облигаций на Московской бирже


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

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

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

Если говорить про поиск облигаций, то сразу после открытия торгов значения доходности по средневзвешенной цене (YIELDATWAPRICE) обнуляются.


Схема определения средневзвешенной цены (WAPRICE)

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

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


Схема определения цены закрытия (LEGALCLOSEPRICE)

Чтобы уменьшить количество обращений к API Московской биржи я использую значение дюрации (DURATION), а не беру готовое значение количества дней до погашения (DAYSTOREDEMPTION), ведь я пользуюсь собственным скриптом только в личных целях.

Распишу подробно все шаги которые нужны для работы моего скрипта.

Самое главное что понадобится для работы скрипта Node.js. Это среда выполнения JavaScript. Если раньше JavaScript можно было запустить только в браузере, но однажды разработчики расширили его, и теперь можно запускать JS на своем компьютере в качестве отдельного приложения.

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

Поиск облигаций под Windows


Это будет самый подробный раздел, потому что большинство пользователей, которым это интересно, скорее всего, работают под Windows.

Для Windows доступен установщик Node.js в разделе загрузить официального сайта.


Раздел загрузки сайта проекта Node.js

Далее скачиваем установщик для Windows и запускаем его.


Выбор компонентов для установки Node.js

Кроме компонентов, находящихся на этом экране, больше ничего устанавливать не надо.

Скачиваем код скрипта с гитхаба.


Ссылка на скачивание с GitHub

После этого переходим каталог /SilverFir-Investment-Report-master/Node.js Release/bond_search_v2/, где находятся скачанные файлы:


Каталог с необходимыми для запуска проекта файлами

И запускаем файл first start.bat, который содержит указание показать установленную текущую версию Node.js и установить необходимую для запуска проекта зависимость node-fetch:

node -vpausenpm install node-fetch

Несмотря на такое короткое содержание Защитник Windows проявляет бдительность, но если нажать подробнее, то можно увидеть кнопку Выполнить в любом случае:


Первоначальная настройка запуска проекта


Во время выполнения bat файла

После нажатия любой клавиши зависимость будет установлена в эту же папку:


Каталог вместе с добавленными файлами

После этого всё готово для запуска скрипта поиска облигаций. Для этого запускаем файл start.bat:


Выполнение скрипты поиска облигаций. После запуска файла start.bat

Менее чем за минуту будет создан HTML файлов с текущей датой и временем в имени он и содержит в себе найденные результаты.

Поиск облигаций под macOS


Для macOS доступен установщик Node.js в разделе загрузить официального сайта.

Сам процесс похож на установку под Windows и Linux.

Поиск облигаций под Linux


Если на вашем компьютере установлен Linux, скорее всего вы и сами знаете как лучше сделать. Код скрипта доступен на гитхабе. Перейдите в каталог /SilverFir-Investment-Report-master/Node.js Release/bond_search_v2/.

Проверьте что Node.js установлена:
$ node -v

Проверьте что пакетный менеджер npm для Node.js установлен:
$ npm -v

Установите зависимости (в данном случае это только node-fetch):
$ npm install

Запустите файл скрипта:
$ npm start

Примерно за минуту html файл под именем файл bond_search_${new Date().toLocaleString().replace(/\:/g, '-')}.html будет создан.


Выполнение работы скрипта под Linux

Выборка облигаций


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

Получились следующие виды:


На компьютере


На Android


На iPhone

Редактирование параметров выборки


Самое важное настроить именно те параметры, которые важны именно вам, а не те, которые указал я для примера. Сделать это можно в файле index.js, со строки 39.


Задаваемые параметры поиска

Указываете нужные вам цифры, запускаете скрипт заново и примерно за минуту выборка готова.

Итог


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

Скрипт работает только за счет API Московской биржи, которое предоставляет широкие возможности. Также хочу отметить, что я никак не связан с Московской биржей и использую ИСС Мосбиржи только в личных интересах.

Автор: Михаил Шардин,

22 июня 2020 г.
Подробнее..

Рекурсия сознания ловушка мышления и барьер прогрессу. Исторический очерк

23.06.2020 02:20:15 | Автор: admin
С момента появления языка как второй сигнальной системы инструмента для мышления и общения, человечество получило критическое преимущество перед всеми другими живыми существами, поведение которых управляется системами первого уровня и поэтому принципиально ограничено в уровнях абстрагирования.
Но, давая человеку инструмент огромной силы, язык и абстрактное мышления в то же время создают ограничения и ловушки, ведущие к проблемам, конфликтам и деструктивному поведению. Чем человечество последние 5000 лет в основном и занимается. (Может и 500 000, но нет письменных свидетельств).
90-99% всех войн, конфликтов, ссор и убийств происходят по идейным, идеологическим, религиозным, политическим и другим абстрактным причинам, лежащим в сфере идей и информации, а не материального мира. И прежде чем война, конфликт, ссора приводит к реальным действиям, ей всегда предшествует этап намерения, замысла, подготовки, планирования, нагнетания, организации, проходящий на уровне слов и информации.
Источник и инструмент всех войн, убийств, дискриминации, инквизиции, угнетения язык.
Но он же инструмент науки, культуры, прогресса, развития, цивилизации.
И виноват в проблемах не инструмент, а незрелое мышление, сознание и культура тех, кто его использует.
Еще с античных времен лучшие умы это понимали и пытались исправить.
Aristotle Altemps Inv8575
Наибольший вклад в развитие цивилизации внес, конечно, Аристотель. Разработка формальной логики дала хоть и простой, но все-же общепризнанный и легко применимый инструмент разрешения споров и поиска истины. По сути, это создало основу, фундамент всей Западной цивилизации.
Хотя до сих пор формальную логику понимает и умеет пользоваться, по разным оценкам, не более 1-10% населения планеты.
И уже в те времена философы и мыслители, используя этот инструмент, натолкнулись на ловушку рекурсии, лежащую в основе значительной части парадоксов, апорий и логических противоречий.
Парадокс лжеца, апории Зенона, множество других парадоксов в основе всех одна и та же мыслительная ошибка. Считать, что высказывание, направленное само на себя, ничем не отличается от высказываний, имеющих другое основание.
Это высказывание написано на русском языке, Это высказывание истинное рекурсивные высказывания без парадокса.
Это высказывание ложное пример парадоксальной рекурсии.
Некоторые античные мыслители даже сошли с ума или покончили жизнь самоубийством, пытаясь разрешить такие загадки.
Но выхода так и не нашли.
Философы средневековья и Возрождения потратили тысячи часов на решения подобных и еще более схоластических вопросов, но единственным продуктом были все более и более абстрактные теории, в которых авторы избретали новые названия для старых категорий и все больше в них запутывались.
Как ехидно заметил Пуанкаре,
"все, что ученый на самом деле создает это язык, которым он это возвещает."

Выходы из логического тупика начали находить только по мере развития естественных и точных наук где-то к началу XX века. Нашлись они, как и можно было ожидать, представителями самой формальной и точной науки математики.
Bertrand Russell transparent bg
Б. Рассел в своих Основаниях математики (1903) показал, что класс не может включать сам себя в виде элемента класса, а тип не может быть сам себе подтипом. Аналогично множество, включающее само себя в качестве подмножества, обладает особыми свойствами и не может рассматриваться в ряду обычных множеств, не приводя к логическим ошибкам указанного типа.
1925 kurt gdel
Наиболее полно и красиво разобрался с этой проблемой Курт Гёдель, опубликовавший в 1931 году свои знаменитые теоремы о неполноте:
Любая формальная система аксиом содержит неразрешенные предположения

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

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

Работы Гёделя оказали серьезное влияние на все точные науки, не только математику.
Einstein 1921 by F Schmutzer - restoration
Его идеи продолжил в физике Альберт Эйнштейн, утверждавший, что
"невозможно решить проблему на том же уровне, на котором она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень".
По сути, это та же теорема о неполноте, выраженная в более абстрактной форме.
Не обошли вниманием эту тему и отечественные исследователи.
Ivan Pavlov 1934
Великий ученый и мыслитель Иван Петрович Павлов еще в далеком 1918 году предвосхитил на много лет Структурный Дифференциал А. Коржибского, исследователя уровней абстрагирования, в своих лекциях Об уме вообще, о русском уме в частности:
"действительность, понять которую ставит своей задачей ум, эта действительность является в значительной степени скрытой от него. Она, как говорится, спрятана за семью замками. Между действительностью и умом стоит и должен стоять целый ряд сигналов, которые совершенно
заслоняют эту действительность."

"Что такое наши слова, которыми мы описываем факты, как не новые сигналы, которые могут, в свою очередь, затемнить, исказить истину."

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

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


Alfred Korzybski
Это описание тех же уровней абстрагирования, и принципов отношения реальности, языка и сознания, что показаны А. Коржибским на его Структурном Дифференциале в книге Science and Sanity в 1933 году, и даже почти теми же самыми словами.
Но, благодаря картинкам и материальной модели, идеи Коржибского все-таки поняли в тот момент несколько человек, (как, впрочем, и Эйнштейна сразу после публикации Теории Относительности) и в результате этого появились и НЛП, и Дианетика с Сайентологией, и некоторые направления позитивной психологии, маркетинга, рекламы, политтехнологий, пропаганды и других инструментов работы с сознанием. К сожалению, на первоисточник авторы этих разработок предпочитают не ссылаться, чтобы не палить тему.
Но, по крайней мере, идея Карта не территория вышла за рамки научных статей и стала достоянием широкого круга людей и достаточно общепринятым фактом.
А И. Павлов опередил эпоху, и в то непростое время, его глубоко не понял, наверное, вообще никто.
И даже сейчас, через почти 100 лет после этих исследований, публикаций и выступлений, контролировать свое абстрагирование, отслеживать уровни, избегать рекурсии и не попадать в уровневые ловушки умеет не так много людей, на порядки меньше, чем владеют формальной логикой.
Хорошо, что на этом ресурсе собираются люди, близкие к ИТ и программированию, которых с первых шагов в профессии обучают логике, структуре и строгости мышления и которые знают, что программа не должна вызывать сама себя в качестве подпрограммы, массив не может включать сам себя в качестве элемента массива, а переменная не может принимать в качестве значения сама себя.
Но то, что для программистов самоочевидно, совсем не так в других областях науки и деятельности.
Миллионы людей продолжают пытаться выучить язык с помощью языкового описания языка (грамматики), не замечая, что они попадают в логическую ловушку рекурсии без шанса выбраться оттуда.
Когда вы не знаете, как построить предложение на другом языке, чтобы выразить нужную вам мысль, вы сказать этого не можете.
Но когда вы выучили правило и знаете, как построить это предложение, вы все равно сказать это не сможете.
Потому что та зона мозга, которая должна управлять этим действием, занята мыслями о том, как это сделать (правилами).
Это подобно попытке укусить себя за зубы или перерезать нож ножом. Причем этим самым ножом.
Рекурсия в чистом виде.
Но этого почти никто не замечает, кроме психологов-физиологов, которые давно используют такой механизм блокировки речи для исследований языка и мышления.
Психолингвист и методист Стивен Крашен сформулировал эту идею в виде Гипотезы грамматического монитора. Он утверждает, что грамматика не может служить инструментом для порождения устной речи, а только как монитор для последующего контроля и коррекции. Но, исходя из фактов, полученных другими науками, это никакая не гипотеза, а аксиома, следующая из законов логики, математики, психологии, физиологии. И только фрагментация и сегментация наук и все более узкая специализация ученых не позволяет это заметить.
Аналогичные проблемы с бесконтрольным абстрагированием и злоупотреблением рекурсией можно найти в сфере психологии, когда начинают исследовать мышление с помощью мышления, в методологии, когда пытаются управлять управлением с помощью управления, в философии, которая множит абстрактные сущности без всякого страха перед Оккамом, и во многих других сферах человеческой деятельности.
И задача технарей, айтишников, представителей точных наук помочь выбраться из рекурсивной ловушки, дать инструменты структурирования мышления, научить избегать рекурсии и совместно с гуманитариями разработать новые продукты и инструменты, решающие насущные задачи и лишенные рекурсивных замыканий.
Одним из таких инструментов может быть Структурно-Визуальный метод, разработанный автором этой статьи. Он предлагает для структурирования знаний в некоторой предметной области использовать визуальное представление структуры с использованием цвета для кодирования ограниченного количества смыслов самого верхнего уровня абстракции.
С помощью этого метода были получены некоторые интересные схемы и модели для разных предметных областей ИТ, управления, психологии, лингвистики, педагогики, изучения иностранных языков, а их практическое применение оказалось довольно результативным и перспективным.
Но об этом в следующих статьях, если это будет интересно читателям Хабра.

Успехов вам в любой деятельности и осознанного абстрагирования!
Подробнее..

Хабрастатистика как Хабр пережил самоизоляцию

19.06.2020 20:14:58 | Автор: admin
Привет, Хабр.

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



Для тех, кому интересно, что получилось, продолжение под катом.

Для начала традиционный disclaimer. Данная статистика, как и рейтинг, являются неофициальными, и не исключаю что я нигде не ошибся. Если кто-то не нашел себя в топе статей, но уверен, что должен там быть, пишите в личные сообщения, поправлю. Данные по статьям собирались с помощью парсера на Python, который был запущен в один поток, чтобы не нагружать сервер. Такой сбор данных занимает примерно 8 часов, чтобы не держать ПК включенным все это время, код был запущен на роутере с dd-wrt. Теперь вернемся к статистике.

На первом графике было показано общее количество опубликованным в 2020 году материалов. Тут по сравнению с 2019 годом обошлось без особых изменений для постоянных авторов карантин на производительности не сказался (может они и до него из дома не часто выходили ;). Кстати, как можно видеть, в среднем в день на Хабр выкладывается порядка 60 публикаций. Примерно половина из них это корпоративные блоги, и наверно это хорошо для Хабра с точки зрения прибыли, но грустно с точки зрения читателя все же материалы от независимых авторов лично мне нравятся больше. Есть, конечно, интересные корпоративные блоги, но в основном, рекламный материал есть рекламный. Там не будет исходников, каких-то know-how, а текст будет выверен службой безопасности, чтобы не дай бог не сболтнуть ничего лишнего. Судя по графику, достаточно регулярно публикуются новости, ну а англоязычный хабр пока не взлетел, больше про него ничего нельзя сказать.

Раз уж речь зашла об авторах, отметим тех, чье количество статей за эти полгода превышает 100: maybe_elf (464 статьи), denis-19 (349 статей), avouner (244 статей), AnnieBronson (229 статей), MaxRokatansky (170 статей), ru_vds (169), SLY_G (149) и PatientZero (107). Это примерно одна статья или новость в день, спасибо, что благодаря вам (и остальным авторам конечно тоже) есть что почитать в свободное время.

Однако, вернемся к нашей самоизоляции. Посмотрим на число просмотров, оно уже интереснее:



Для сравнения можно сказать, что ни одна статья 2019 года не набрала и полумиллиона просмотров (даже статья про минет), а здесь мне впервые пришлось поменять форматирование чисел по вертикальной оси. И понятное дело, все статьи из топа посвящены, разумеется, коронавирусу. Отдельно стоит отметить первую статью, набравшую рекордные за всю историю Хабра 5млн просмотров.

Итак, топ-10 статей по числу просмотров

  1. Коронавирус: почему надо действовать прямо сейчас, перевод от five, 5526000 просмотров, 2067 комментариев
  2. Ликбез по респираторам. Помогает ли респиратор от заражения вирусом. Обзор 11 респираторов от spygates, 1168000 просмотров, 133 комментария
  3. Коронавирус: опасная иллюзия смертности от ilusha_sergeevich, 959000 просмотров, 2162 комментария
  4. Коронавирус: как мы себя обманываем от ilusha_sergeevich, 669000 просмотров, 1048 комментариев
  5. Коронавирус 2019-nCoV. FAQ по защите органов дыхания и дезинфекции от steanlab, 547000 просмотров, 408 комментариев
  6. Сервисы, которые стали бесплатными на время карантина: курсы, радио, книги, кино и сериалы от baragol, 358000 просмотров, 61 комментарий
  7. Задержать COVID-19. Все про фильтрацию воздуха на случай пандемии от steanlab, 320000 просмотров, 284 комментария
  8. Коронавирусы: от SARS к 2019-nCoV от Meklon, 309000 просмотров, 1975 комментариев
  9. Коронавирус COVID-19: только факты, без паники от baragol, 289000 просмотров, 220 комментариев
  10. Коронавирус: филогения, курение, летальность и снижение рисков заболеть от elena_pastukhova, 254000 просмотров, 195 комментариев.

Думаю, Хабр и всех авторов вполне можно поздравить с вкладом в борьбе с эпидемией возможно эти тексты спасли кому-то здоровье, а то и жизнь суммарно почти 10 млн просмотров, это внушает. Кстати, на Хабре за эти полгода всего было написано 304 статьи, в названии которых встречается covid:



Можно посмотреть распределение просмотров по хабам. Так было в 2019:



А так стало в 2020:



Раздел health переместился с 10й позиции на первую, потеснив информационную безопасность, вместе с ним поднялись в рейтинге popular science и biotech, которого в топе просмотров до этого вообще не было.

Впрочем, справедливости ради, если отсортировать статьи по числу комментариев, то Linux все же обошел коронавирус, что даже радует.

Топ-10 самых комментируемых статей

  1. Главная причина, почему не Linux от mrtux, 2401 комментарий, 139000 просмотров
  2. Коронавирус: опасная иллюзия смертности от ilusha_sergeevich, 2162 комментария, 959000 просмотров
  3. Коронавирус: почему надо действовать прямо сейчас от five, 2067 комментариев, 5526000 просмотров
  4. Разработчики- никакая не элита, а голые короли индустрии от chapuza, 1985 комментариев, 147000 просмотров
  5. Динамическая типизация это не инструмент для разработки. Это чепуха (паршивая) от fillpackart, 1977 комментариев, 66500 просмотров
  6. Коронавирусы: от SARS к 2019-nCoV от Meklon, 1975 комментариев, 309000 просмотров
  7. Пользователю все это не нужно! Хватит пропагандировать Линукс от tmat, 1365 комментариев, 81100 просмотров
  8. В софте всё восхитительно, но все недовольны от phillennium, 1288 комментариев, 41700 просмотров
  9. Пора на свалку от 0xd34df00d, 1245 комментариев, 125000 просмотров
  10. Заметки о жизни в США от pavgra, 1207 комментариев, 110000 просмотров.

Многим авторам наверно будет интересно посмотреть распределение рейтинга статей:



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

Вернемся к рейтингу. Интересно посмотреть на топ-10 статей по добавлению в закладки. Тут слава богу, про covid уже ни слова:

  1. Подготовка к собеседованиям в IT-гиганты: как я преодолела проклятье алгоритмического собеседования от greenEkatherine, 124000 просмотров, 1355 закладок
  2. Какие английские слова IT-лексикона мы неправильно произносим чаще всего от YuriyIvon, 143000 просмотров, 1135 закладок
  3. Как я чуть не выкинул 150к на ветер или история установки приточной вентиляции в квартире от jirfag, 168000 просмотров, 1028 закладок
  4. Как стать долларовым миллионером за 30 лет, лежа на диване от SergioShpadi, 161000 просмотров, 1010 закладок
  5. Полная домашняя автоматизация в новостройке от empenoso, 163000 просмотров, 949 закладок
  6. Как научиться разработке на Python: новый видеокурс Яндекса от orlovdl, 80100 просмотров, 908 закладок
  7. 10 интересных репозиториев на GitHub, полезных любому разработчику от Plarium, 57300 просмотров, 894 закладки
  8. 70 вопросов по JavaScript для подготовки к собеседованию от aio350, 94900 просмотров, 857 закладок
  9. Zip-файлы: история, объяснение и реализация от AloneCoder, 50400 просмотров, 703 закладки.
  10. Практическое руководство поразработке бэкенд-сервиса на Python от alvassin, 41400 просмотров, 677 закладок

И наконец, последний рейтинг по соотношению добавлений в закладки к числу просмотров.

  1. Руководство по FFmpeg libav от ThomasAlva, 268 закладок, 11700 просмотров
  2. Как облегчить себе жизнь при использовании Git (а также подборка материалов для глубокого погружения) от pxeno, 369 закладок, 17100 просмотров
  3. Современные стандарты идентификации: OAuth 2.0, OpenID Connect, WebAuthn от AlexeySushkov, 225 закладок, 11100 просмотров
  4. 9 четких инструментов для изучения и прокачки английской лексики от EnglishDom, 230 закладок, 11900 просмотров
  5. Имитируем сетевые проблемы в Linux от azakharenko, 343 закладки, 18100 просмотров
  6. Отслеживаем прогресс выполнения в Python от germn, 430 закладок, 23000 просмотров
  7. Простое обнаружение проблем производительности в PostgreSQL от puyol_dev2, 212 закладок, 11400 просмотров
  8. 45 youtube-каналов на английском языке для ИТ-специалистов от vesyolkinaolga, 209 закладок, 11300 просмотров
  9. 10 React-компонентов на все случаи жизни от ru_vds, 306 закладок, 17400 просмотров
  10. Визуальная теория информации (часть 1) от stabuev, 214 закладок, 12200 просмотров.

Заключение


С уверенностью можно сказать, что наверное как и многие другие ИТ-сервисы, Хабр и его авторы, пережили пандемию без существенных потерь. Всех кто попал в топ поздравляю, следующий рейтинг будет в конце 2020 года. Ну а читателям, надеюсь, есть что пересмотреть, если какие-то материалы были пропущены.
Подробнее..

Перевод Красивая и подробная геологическая карта Марса, сделанная на Python, GDAL

14.06.2020 18:20:27 | Автор: admin
image

На этой неделе творческое переосмысление геологической (или все же ареологической?) карты Марса на основе карты, сделанной USCS. Использовалась те же геологические данные, что и для оригинальной, но было добавлено больше топонимов и подписей, проведен редизайн визуального стиля, а термины из легенды карты упрощены для общего понимания.



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

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

image
Некоторые из особо-примечательных геологических объектов на Марсе. 1: Гора Олимп, самый большой вулкан в Солнечной системе. 2: Долины Маринер, система глубоких каньонов длиной более 4000 км. 3: Равнина Эллада, самый большой видимый ударный кратер в Солнечной системе. 4: Марс геологически разделен на Северную низменность (бледно-зеленую) и Южную горную местность (коричневая). Ударные кратеры, образованные падающими астероидами и кометами (неоново-желтые), разбросаны по всей планете.

image
Для карты использовались следующие отдельные слои. 1-3: Геологические элементы, геологические контакты и геологические особенности из набора данных USGS. 4-5: уровень наклона и из двух источников USGS. 6: Номенклатура от IAU (Международный Астрономический Союз). 7-8: линии сетки и 3D-эффект, разработанный в Photoshop.

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

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

image
1: Равнопромежуточная. 2: Экерт IV. 3-5: Ортографические проекции с центром на разных долготах и широтах


Рассказ о реализации



В данном проекте использовались открытые данные USGS, IAU и NASA.
Стек технологий: Python 3.7.1, GDAL 2.4.1, Illustrator CC 2019 и Photoshop CC 2019 (можно заменить на бесплатные Gimp и Inkscape, например).
Также нужно установить пакеты: matplotlib numpy, pandas, cartopy, jupyter.


Сбор и обработка данных



Создание модели рельефа (DEM)



Модель рельефа это данные, содержащие информацию о высоте различных точек на планете. В проекте использовались данные, полученные из Геологической Службы США. Каждый пиксель в файле GeoTIFF это 16-битное число, которое описывает высоту точки.

Примечание: многие программы не могут нормально прочитать этот файл, так что то, что он выглядит странно в формате предпросмотра или в других неспециализированных программах это нормально. В рамках проекта работа с ними шла через GDAL (англ. Geospatial Data Abstraction Library библиотека абстракции гео-пространственных данных).

Создание проекций карты



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

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

gdalwarp -t_srs "+proj=eck4" ./path_to_intif.tif ./path_to_outtif.tif


Потом уменьшаем разрешение DEM, просто сокращая размер каждого пикселя до 1500x1500 метров, используя метод average. Это позволит сократить время обработки, да и уменьшение разрешения в этот момент сделать проще, чем потом.

gdalwarp -tr 1500 1500 -r average ./path_to_intif.tif ./path_to_outtif.tif


Отмывка и карта склонов



Дальше мы используем получившийся файл для создания карты с отмывкой и карты склонов для каждого полушария планеты.

Карта после отмывки показывает тени из воображаемого источника света, свет падает на карту сверху. Он воображаемый, потому что в реальном мире так не бывает одиночный источник света создаст тени под разными углами в разных частях шара. Встроенная функция hillshade в GDAL устанавливает угол падения света одинаковый для всей карты. Для данного проекта z, вертикальное увеличение, поставили равным 20. Это увеличивает каждое значение высоты в 20 раз, чтобы сделать рельеф более контрастным и обеспечить отображение теней.

gdaldem hillshade -z 20 ./path_to_intif.tif ./path_to_hillshade.tif


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

gdaldem slope ./path_to_intif.tif ./path_to_slope.tif

image

Ортографические проекции



В дополнение к карте в проекции Эккерт IV также сделаны четыре карты полушарий Марса. Проекция Эккерт IV плохо подходит для отображения Северного и Южного полюсов, поэтому эти две врезки очень полезны для их понимания. Для получения отмывки и карты склонов повторяем код с небольшими изменениями ortho вместо eck4 и обозначаем центр долготы и широты для каждой карты (North:+lat_0=90 +lon_0=90, South :+lat_0=-90 +lon_0=90, East:+lat_0=0 +lon_0=90, West:+lat_0=0 +lon_0=270).

gdalwarp -t_srs "+proj=ortho +lat_0=90 +lon_0=0" ./path_to_intif.tif ./path_to_outtif.tif
gdalwarp -tr 1500 1500 -r average ./path_to_intif.tif ./path_to_outtif.tif
gdaldem hillshade -z 20 ./path_to_intif.tif ./path_to_hillshade.tif
gdaldem slope ./path_to_intif.tif ./path_to_slope.tif

image

Легенда карты


Международный Астрономический Союз отвечает за присвоение имен внеземным объектам. Можно просто скачать файл в формате CSV, содержащий все объекты для каждой планеты прямо с их сайта. Для этого надо использовать функцию Advanced Search (расширенного поиска), чтобы скачать All Feature Types (все типы объектов) для вашей планеты Target (Mars), но только с Approval Status of Adopted by IAU одобренные МАС. В разделе Columns to Include section (столбцы для включения) выберите Feature ID, Feature Name, Clean Feature Name, Target, Diameter, Center Lat/Lon, Feature Type и Feature Type Code. Также можно включить Origin (происхождение), если хотите добавить в проект дополнительную информацию об объектах, такую как, например, в честь кого он был назван.

Геологические структуры и элементы


Геологическая карта показывает различные типы пород и другие особенности, такие как линии разломов и русла рек. У USGS есть красивая геологическая карта Марса, которую мы и используем в качестве исходной. Для работы с этими данными загрузите архив базы данных (790 МБ) с USGS Geologic Map. В следующем разделе, посвященному дизайну карты в Python, объясняется, как получить доступ и отобразить каждый тип данных в этой базе данных.

Дизайн карты в Python



Мы создаем шесть чертежей (plots) с геологическими элементами, структурами, особенностями, двумя видами текстовых подписей и сеткой. Часто стоит разделять данные для обработки, чтобы легко применять при необходимости эффекты из Photoshop или Illustrator. В matplotlib использовался gridspec, чтобы настроить все элементы так, чтобы каждый subplot занимал конкретное место в пределах декоративной рамки.

image

Геологические элементы это различные виды рельефа, составляющие поверхность планеты. Разные скальные элементы обычно представлены разными цветами. Набор данных USGS помечает каждую породу 23 буквенным кодом, обозначающим тип элемента. Назначаем цвет каждому буквенному коду, составив таблицу пар код-цвет в Mars_geologic_units.csv. Мы обращаемся к этому файлу при построении каждого элемента в cartopy и matplotlib. Сохранение графических параметров в отдельном файле облегчает использование различных цветовых схем и обособляет дизайн от кода.

image

Геологические контакты это границы между геологическими породами. Некоторые геологические границы являются приблизительными или скрыты под пылью. Как и для геологических пород, используем файл конфигурации Mars_geologic_boundaries.csv, чтобы отобразить каждый тип геологического контакта в другом цвете. На окончательной карте настраиваем отображение некоторых геологических контактов в виде пунктирных линий, просто открыв PDF в Illustrator и выбрав все объекты одного цвета (Select -> Same -> Stroke color).

image

Геологические особенности это другие видимые линии на поверхности планеты, такие как каналы, края кратеров или гребни гор. В датасете есть 13 различных типов. Чтобы отобразить каждый из них в особом стиле, каждый отобразили в другом цвете, а затем стилизовали линии в Illustrator. Это позволило применить специальных эффекты, такие как градиентные хвосты, чтобы показать направление движения каналов оттока и лавовых потоков.

image

Условные обозначения



Для карты использовалось два набора данных для меток. Первый это официальный от IAU. Размеры меток создаются в соответствии с размером объекта, хотя все равно финальную настройку размеров необходимо делать в Illustarator.

image

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

image

Места высадки: чтобы отобразить места высадки марсоходов и других космических аппаратов, использовалось улучшенное цифровое изображение от NASA в качестве фона. Чтобы показывать все 4 полушария планеты, пришлось поменять проекцию landing_sites.ipynb.

Сохранение результатов из Matplotlib



Обычно результаты сохраняются в формате pdf, чтобы провести финальные правки текста и форм в Illustrator. Вот пара стандартных команд, которые облегчают последующую редактуруt:

import matplotlibimport matplotlib.pyplot as pltimport matplotlib.backends.backend_pdf as pdf# Выгружает текст в редактируемом формате, а не в формате формы:matplotlib.rcParams['pdf.fonttype'] = 42# Сохраняет вертикальное положение для картинокmatplotlib.rcParams['image.composite_image'] = False# Удаляет границы и тики из subplotax.axis('off')# Убирает padding и margins отовсюдуplt.margins(0,0)plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0)plt.gca().xaxis.set_major_locator(plt.NullLocator())plt.gca().yaxis.set_major_locator(plt.NullLocator())#Сохраняет в pdfpp = pdf.PdfPages('./savename.pdf', keep_empty=False)pp.savefig(fig)pp.close()# если не нужно сохранять в векторах# можно делать сразу в PNG и правит сразу в Photoshop:plt.savefig('./savename.png', format='png', dpi=600, pad_inches=0, transparent=True)


После сохранения PDF его нужно отредактировать так, чтобы каждый объект можно было редактировать независимо. В Illustrator выберите все в файле и идите в Object --> Clipping Mask --> Release. В этот момент стоит также удалить бэкграунд и границы, если вы их делали раньше.

Дизайн в Illustrator и Photoshop



Экспортирование из Python в PDF позволяет использовать некоторые функции графических редакторов, которых или нет, или их реализация гораздо более трудозатратна.
В этом проекте не так много особых текстовых эффектов, так что редактирование было минимально.

Создание теней под текстом в Photoshop


Для создания этого эффекта нужно скопировать слой с подписями и зайти в Filter --> Blur Gallery --> Field Blur. Для теней хорошо создавать два слоя с blur на 20% прозрачности один с Blur равным 4px, а другой 10px.

Цвета и шрифты


Чтобы карты выглядела продумано, для карты выбирались цвета из заранее продуманной палитры на 70 цветов. Два шрифта (Redflowers and Moon).
image
image

Разработка цветовой схемы


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

Декоративные иллюстрации


В проекте хотелось комбинировать большие датасеты и ручные элементы в стиле художников William Morris или Alphonse Mucha. Для этого перед разработкой была собрана большая коллекция картин для вдохновения.

image

На старте хотелось попробовать разные вариации рамок для карты. Была создана коллекция из 18 разных паттернов.

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

Итоговый результат:
image

Ссылка на github: github.com/eleanorlutz/mars_geology_atlas_of_space

Реферальные ссылки:
Astronomy. Andrew Fraknoi, David Morrison, Sidney C. Wolff et al. OpenStax 2016.
Gazetteer of Planetary Nomenclature. International Astronomical Union (IAU) Working Group for Planetary System Nomenclature (WGPSN) 2019.
Planetary Symbology Mapping Guidelines. Federal Geographic Data Committee.
Mars HRSC MOLA Blended DEM Global 200m v2. NASA PDS and Derived Products Annex. USGS Astrogeology Science Center 2018.
Geologic Map of Mars SIM 3292. Kenneth L. Tanaka, James A. Skinner, Jr., James M. Dohm, Rossman P. Irwin, III, Eric J. Kolb, Corey M. Fortezzo, Thomas Platz, Gregory G. Michael, and Trent M. Hare. USGS 2014.
Viking Global Color Mosaic 925m v1. NASA PDS, 2019
Missions to Mars. The Planetary Society.
Fonts: Moon by Jack Harvatt and RedFlower by Type & Studio.
Advice: Thank you to Henrik Hargitai, Oliver Fraser, Thomas Mohren, Chris Liu, Chloe Pursey, and Leah Willey for their helpful advice in making this map.
Подробнее..

Перевод Высокопроизводительный TSDB benchmark VictoriaMetrics vs TimescaleDB vs InfluxDB

26.06.2020 12:10:59 | Автор: admin

VictoriaMetrics, TimescaleDB и InfluxDB были сравнены в предыдущей статье по набору данных с миллиардом точек данных, принадлежащих 40K уникальным временным рядам.


Несколько лет назад была эпоха Zabbix. Каждый bare metal сервер имел не более нескольких показателей использование процессора, использование оперативной памяти, использование диска и использование сети. Таким образом метрики с тысяч серверов могут поместиться в 40 тысяч уникальных временных рядов, а Zabbix может использовать MySQL в качестве бэкенда для данных временных рядов :)


В настоящее время один node_exporter с конфигурациями по умолчанию предоставляет более 500 метрик на среднем хосте. Существует множество экспортеров для различных баз данных, веб-серверов, аппаратных систем и т. д. Все они предоставляют множество полезных показателей. Все больше и больше приложений начинают выставлять различные показатели на себя. Существует Kubernetes с кластерами и pod-ами, раскрывающими множество метрик. Это приводит к тому, что серверы выставляют тысячи уникальных метрик на хост. Таким образом, уникальный временной ряд 40K больше не является высокой мощностью. Он становится мейнстримом, который должен быть легко обработан любой современной TSDB на одном сервере.


Что такое большое количество уникальных временных рядов на данный момент? Наверное, 400К или 4М? Или 40м? Давайте сравним современные TSDBs с этими цифрами.


Установка бенчмарка


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


  • 400K уникальный временной ряд, 60 секунд интервал между точками данных, данные охватывают полные 3 дня, ~1.7B общее количество точек данных.


  • 4M уникальный временной ряд, интервал 600 секунд, данные охватывают полные 3 дня, ~1.7B общее количество точек данных.


  • 40M уникальный временной ряд, интервал 1 час, данные охватывают полные 3 дня, ~2.8 B общее количество точек данных.



Клиент и сервер были запущены на выделенных экземплярах n1-standard-16 в облаке Google. Эти экземпляры имели следующие конфигурации:


  • vCPUs: 16


  • ОЗУ: 60 ГБ


  • Хранение: стандартный жесткий диск емкостью 1 ТБ. Он обеспечивает пропускную способность чтения/записи 120 Мбит/с, 750 операций чтения в секунду и 1,5К операций записи в секунду.



TSDBs были извлечены из официальных образов docker и запущены в docker со следующими конфигурациями:


  • VictoriaMetrics:


    docker run -it --rm -v /mnt/disks/storage/vmetrics-data:/victoria-metrics-data -p 8080:8080 valyala/victoria-metrics
    

  • Значения InfluxDB (- e необходимы для поддержки высокой мощности. Подробности смотрите в документации):


    docker run -it --rm -p 8086:8086 \-e INFLUXDB_DATA_MAX_VALUES_PER_TAG=4000000 \-e INFLUXDB_DATA_CACHE_MAX_MEMORY_SIZE=100g \-e INFLUXDB_DATA_MAX_SERIES_PER_DATABASE=0 \-v /mnt/disks/storage/influx-data:/var/lib/influxdb influxdb
    

  • TimescaleDB (конфигурация была принята из этого файла):



MEM=`free -m | grep "Mem" | awk {print $7}`let "SHARED=$MEM/4"let "CACHE=2*$MEM/3"let "WORK=($MEM-$SHARED)/30"let "MAINT=$MEM/16"let "WAL=$MEM/16"docker run -it  rm -p 5432:5432 \--shm-size=${SHARED}MB \-v /mnt/disks/storage/timescaledb-data:/var/lib/postgresql/data \timescale/timescaledb:latest-pg10 postgres \-cmax_wal_size=${WAL}MB \-clog_line_prefix="%m [%p]: [%x] %u@%d" \-clogging_collector=off \-csynchronous_commit=off \-cshared_buffers=${SHARED}MB \-ceffective_cache_size=${CACHE}MB \-cwork_mem=${WORK}MB \-cmaintenance_work_mem=${MAINT}MB \-cmax_files_per_process=100

Загрузчик данных был запущен с 16 параллельными потоками.


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


400К уникальных временных рядов


Давайте начнем с простых элементов 400К. Результаты бенчмарка:


  • VictoriaMetrics: 2,6М точек данных в секунду; использование оперативной памяти: 3 ГБ; окончательный размер данных на диске: 965 МБ


  • InfluxDB: 1.2M точек данных в секунду; использование оперативной памяти: 8.5 GB; окончательный размер данных на диске: 1.6 GB


  • Timescale: 849K точек данных в секунду; использование оперативной памяти: 2,5 ГБ; окончательный размер данных на диске: 50 ГБ



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


Ниже приведены графики использования процессора (CPU) для каждого из TSDBs во время бенчмарка:



Выше скриншот: VictoriaMetrics Загрузка CPU при тесте вставки для уникальной метрики 400K.



Выше скриншот: InfluxDB Загрузка CPU при тесте вставки для уникальной метрики 400K.



Выше скриншот: TimescaleDB Загрузка CPU при тесте вставки для уникальной метрики 400K.


VictoriaMetrics использует все доступные vCPUs, в то время как InfluxDB недостаточно использует ~2 из 16 vCPUs.


Timescale использует только 3-4 из 16 vCPUs. Высокие доли iowait и system на TimescaleDB графике временных масштабов указывают на узкое место в подсистеме ввода-вывода (I/O). Давайте посмотрим на графики использования пропускной способности диска:



Выше скриншот: VictoriaMetrics Использование пропускной способности диска при тесте вставки для уникальных показателей 400K.



Выше скриншот: InfluxDB Использование пропускной способности диска при тесте вставки для уникальных показателей 400K.



Выше скриншот: TimescaleDB Использование пропускной способности диска при тесте вставки для уникальных показателей 400K.


VictoriaMetrics записывает данные со скоростью 20 Мбит/с с пиками до 45 Мбит/с. Пики соответствуют большим частичным слияниям в дереве LSM.


InfluxDB записывает данные со скоростью 160 МБ/с, в то время как 1 ТБ диск должен быть ограничен пропускной способностью записи 120 МБ/с.


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


Давайте посмотрим на графики использования ввода-вывода (I/O):



Выше скриншот: VictoriaMetrics Использование ввода-вывода при тесте вставки для 400K уникальных метрик.



Выше скриншот: InfluxDB Использование ввода-вывода при тесте вставки для 400K уникальных метрик.



Выше скриншот: TimescaleDB Использование ввода-вывода при тесте вставки для 400K уникальных метрик.


Теперь ясно, что TimescaleDB достигает предела ввода-вывода, поэтому он не может использовать оставшиеся 12 vCPUs.


4M уникальные временные ряды


4M временные ряды выглядят немного вызывающе. Но наши конкуренты успешно сдают этот экзамен. Результаты бенчмарка:


  • VictoriaMetrics: 2,2М точек данных в секунду; использование оперативной памяти: 6 ГБ; окончательный размер данных на диске: 3 ГБ.


  • InfluxDB: 330К точек данных в секунду; использование оперативной памяти: 20,5 ГБ; окончательный размер данных на диске: 18,4 ГБ.


  • TimescaleDB: 480K точек данных в секунду; использование оперативной памяти: 2,5 ГБ; окончательный размер данных на диске: 52 ГБ.



Производительность InfluxDB упала с 1,2 млн точек данных в секунду для 400К временного ряда до 330 тыс. точек данных в секунду для 4M временного ряда. Это значительная потеря производительности по сравнению с другими конкурентами. Давайте посмотрим на графики использования процессора, чтобы понять первопричину этой потери:



Выше скриншот: VictoriaMetrics Использование CPU при тесте вставки для уникального временного ряда 4M.



Выше скриншот: InfluxDB Использование CPU при тесте вставки для уникального временного ряда 4M.



Выше скриншот: TimescaleDB Использование CPU при тесте вставки для уникального временного ряда 4M.


VictoriaMetrics использует почти всю мощность процессора (CPU). Снижение в конце соответствует оставшимся LSM слияниям после вставки всех данных.


InfluxDB использует только 8 из 16 vCPUs, в то время как TimsecaleDB использует 4 из 16 vCPUs. Что общего у их графиков? Высокая доля iowait, что, опять же, указывает на узкое место ввода-вывода.


TimescaleDB имеет высокую долю system. Полагаем, что высокая мощность привела ко многим системным вызовам или ко многим minor page faults.


Давайте посмотрим на графики пропускной способности диска:



Выше скриншот: VictoriaMetrics Использование полосы пропускания диска для вставки 4M уникальных метрик.



Выше скриншот: InfluxDB Использование полосы пропускания диска для вставки 4M уникальных метрик.



Выше скриншот: TimescaleDB Использование полосы пропускания диска для вставки 4M уникальных метрик.


VictoriaMetrics достигали предела 120 МБ/с в пик, в то время как средняя скорость записи составляла 40 МБ/с. Вероятно, во время пика было выполнено несколько тяжелых слияний LSM.


InfluxDB снова выжимает среднюю пропускную способность записи 200 МБ/с с пиками до 340 МБ/с на диске с ограничением записи 120 МБ/с :)


TimescaleDB больше не ограничена диском. Похоже, что он ограничен чем-то еще, связанным с высокой долей системной загрузки CPU.


Давайте посмотрим на графики использования IO:



Выше скриншот: VictoriaMetrics Использование ввода-вывода во время теста вставки для уникального временного ряда 4M.



Выше скриншот: InfluxDB Использование ввода-вывода во время теста вставки для уникального временного ряда 4M.



Выше скриншот: TimescaleDB Использование ввода-вывода во время теста вставки для уникального временного ряда 4M.


Графики использования IO повторяют графики использования полосы пропускания диска InfluxDB ограничен IO, в то время как VictoriaMetrics и TimescaleDB имеют запасные ресурсы ввода-вывода IO.


40М уникальные тайм серии


40М уникальные временные ряды были слишком большими для InfluxDB :(


Результаты бечмарка:


  • VictoriaMetrics: 1,7М точек данных в секунду; использование оперативной памяти: 29 ГБ; использование дискового пространства: 17 ГБ.


  • InfluxDB: не закончил, потому что для этого требовалось более 60 ГБ оперативной памяти.


  • TimescaleDB: 330К точек данных в секунду, использование оперативной памяти: 2,5 ГБ; использование дискового пространства: 84GB.



TimescaleDB показывает исключительно низкое и стабильное использование оперативной памяти 2,5 ГБ столько же, сколько и для уникальных метрик 4M и 400K.


VictoriaMetrics медленно увеличивались со скоростью 100 тысяч точек данных в секунду, пока не были обработаны все 40М метрических имен с метками. Затем он достиг устойчивой скорости вставки 1,5-2,0М точек данных в секунду, так что конечный результат составил 1,7М точек данных в секунду.


Графики для 40М уникальных временных рядов аналогичны графикам для 4М уникальных временных рядов, поэтому давайте их пропустим.


Выводы


  • Современные TSDBs способны обрабатывать вставки для миллионов уникальных временных рядов на одном сервере. В следующей статье мы проверим, насколько хорошо TSDBs выполняет выбор по миллионам уникальных временных рядов.


  • Недостаточная загрузка процессора обычно указывает на узкое место ввода-вывода. Кроме того, это может указывать на слишком грубую блокировку, когда одновременно может работать только несколько потоков.


  • Узкое место ввода-вывода действительно существует, особенно в хранилищах без SSD, таких как виртуализированные блочные устройства облачных провайдеров.


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



Загрузите односерверный образ VictoriaMetrics и попробуйте его на своих данных. Соответствующий статический двоичный файл доступен на GitHub.


Подробнее о VictoriaMetrics читайте в этой статье.


Обновление: опубликована статья, сравнивающая производительность вставки VictoriaMetrics с InfluxDB с воспроизводимыми результатами.


Обновление#2: Читайте также статью о вертикальной масштабируемости VictoriaMetrics vs InfluxDB vs TimescaleDB.


Обновление #3: VictoriaMetrics теперь с открытым исходным кодом!


Телеграм чат: https://t.me/VictoriaMetrics_ru1

Подробнее..

MLHCI что исследуют на стыке машинного обучения и человеко-компьютерного взаимодействия

03.07.2020 16:05:03 | Автор: admin
Многие убеждены, что область Human Computer Interaction (HCI или человеко-компьютерное взаимодействие) сводится только к проектированию сайтов или приложений, а основная задача специалиста удовлетворить пользователей, увеличивая на несколько пикселей кнопку лайка. В посте мы хотим показать, что это совсем не так, и рассказать, что происходит в HCI на стыке с исследованиями машинного обучения и искусственного интеллекта. Возможно, это позволит читателям посмотреть на эту область с новой для себя стороны.

Для обзора мы взяли труды конференции CHI: Conference on Human Factors in Computing Systems за 10 лет, и с помощью NLP и анализа сетей социтирования посмотрели на темы и области на пересечении дисциплин.




В России особенно силен фокус на прикладных задачах проектирования UX. Многие события, которые помогали росту HCI за рубежом, у нас не произошли: не появилось iSchools, ушли из науки многие специалисты, занимавшиеся близкими аспектами инженерной психологии, и т. д. В результате профессия возникала заново, отталкиваясь от прикладных задач и исследований. Один из результатов этого виден даже сейчас это крайне низкая представленность российских работ по HCI на ключевых конференциях.

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

Время от времени мы слышим вопросы, как это направление связано (и связано ли вообще) с машинным обучением и анализом данных. Чтобы ответить на них, мы обратились к исследованиям последних лет, представленным на конференции CHI.

В первую очередь мы расскажем, что происходит в таких областях, как xAI и iML (eXplainable Artificial Intelligence и Interpretable Machine Learning) со стороны интерфейсов и пользователей, а также как в HCI изучают когнитивные аспекты работы специалистов data science, и приведем примеры интересных работ последних лет в каждой области.

xAI и iML


Методы машинного обучения интенсивно развиваются и что важнее с точки зрения обсуждаемой области активно внедряются в автоматизированное принятие решений. Поэтому исследователи все чаще обсуждают вопросы: как пользователи, не являющиеся специалистами в машинном обучении, взаимодействуют с системами, где подобные алгоритмы применяются? Один из важных вопросов такого взаимодействия: как сделать, чтобы пользователи доверяли решениям, принятым на основе моделей? Поэтому с каждым годом все более горячей становится тематика интерпретируемого машинного обучения (Interpretable Machine Learning iML) и объяснимого искусственного интеллекта (eXplainable Artificial Intelligence XAI).

При этом, если на таких конференциях, как NeurIPS, ICML, IJCAI, KDD, обсуждают сами алгоритмы и средства iML и XAI, на CHI в фокусе оказываются несколько тем, связанных с особенностями дизайна и опытом использования этих систем. Например, на CHI-2020 этой тематике были посвящены сразу несколько секций, включая AI/ML & seeing through the black box и Coping with AI: not agAIn!. Но и до появления отдельных секций таких работ было достаточно много. Мы выделили в них четыре направления.

Дизайн интерпретирующих систем для решения прикладных задач


Первое направление это дизайн систем на основе алгоритмов интерпретируемости в различных прикладных задачах: медицинских, социальных и т. д. Такие работы возникают в очень разных сферах. Например, работа на CHI-2020 CheXplain: Enabling Physicians to Explore and Understand Data-Driven, AI-Enabled Medical Imaging Analysis описывает систему, которая помогает врачам исследовать и объяснять результаты рентгенографии органов грудной клетки. Она предлагает дополнительные текстовые и визуальные пояснения, а также снимки с таким же и противоположным результатом (поддерживающие и противоречащие примеры). Если система предсказывает, что на рентгенографии видно заболевание, то покажет два примера. Первый, поддерживающий, пример это снимок легких другого пациента, у которого подтверждено это же заболевание. Второй, противоречащий, пример это снимок, на котором заболевания нет, то есть снимок легких здорового человека. Основная идея сократить очевидные ошибки и уменьшить число обращений к сторонним специалистам в простых случаях, чтобы ставить диагноз быстрее.


CheXpert: автоматизированное выделение областей + примеры (unlikely vs definitely)



Разработка систем для исследования моделей машинного обучения


Второе направление разработка систем, которые помогают интерактивно сравнивать или объединять несколько методов и алгоритмов. Например, в работе Silva: Interactively Assessing Machine Learning Fairness Using Causality на CHI-2020 была представлена система, которая строит на данных пользователя несколько моделей машинного обучения и предоставляет возможность их последующего анализа. Анализ включает построение причинно-следственного графа между переменными и вычисление ряда метрик, оценивающих не только точность, но и честность (fairness) модели (Statistical Parity Difference, Equal Opportunity Difference, Average Odds Difference, Disparate Impact, Theil Index), что помогает находить перекосы в предсказаниях.


Silva: граф связей между переменными + графики для сравнения метрик честности + цветовое выделение влиятельных переменных в каждой группе

Общие вопросы интерпретируемости моделей


Третье направление обсуждение подходов к задаче интерпретируемости моделей в целом. Чаще всего это обзоры, критика подходов и открытые вопросы: например, что понимать под интерпретируемостью. Здесь хотелось бы отметить обзор на CHI-2018 Trends and Trajectories for Explainable, Accountable and Intelligible Systems: An HCI Research Agenda, в котором авторы рассмотрели 289 основных работ, посвященных объяснениям в искусственном интеллекте, и 12 412 публикаций, цитирующих их. С помощью сетевого анализа и тематического моделирования они выделили четыре ключевых направления исследований 1) Intelligent and Ambient (I&A) Systems, 2) Explainable AI: Fair, Accountable, and Transparent (FAT) algorithms and Interpretable Machine Learning (iML), 3) Theories of Explanations: Causality & Cognitive Psychology, 4) Interactivity and Learnability. Кроме того, авторы описали основные тренды исследований: интерактивное обучение и взаимодействие с системой.

Пользовательские исследования


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

Инструментов и алгоритмов интерпретации появилось очень много, поэтому возникает вопрос: как понять, какой же алгоритм выбрать? В работе Questioning the AI: Informing Design Practices for Explainable AI User Experiences как раз обсуждаются вопросы мотивации использования объясняющих алгоритмов и выделяются проблемы, которые при всем многообразии методов еще не решены в достаточной степени. Авторы приходят к неожиданному выводу: большинство существующих методов построены так, что отвечают на вопрос почему (почему у меня такой результат), в то время как пользователям для принятия решений нужен еще и ответ на вопрос почему нет (почему не другой), а иногда что сделать, чтобы результат изменился.

В работе говорится также о том, что пользователям нужно понимать, каковы границы применимости методов, какие у них есть ограничения и это нужно явно внедрять в предлагаемые инструменты. Более ярко эта проблема показана в статье Interpreting Interpretability: Understanding Data Scientists' Use of Interpretability Tools for Machine Learning. Авторы провели небольшой эксперимент со специалистами в области машинного обучения: показали им результаты работы нескольких популярных инструментов для интерпретации моделей машинного обучения и предложили ответить на вопросы, связанные с принятием решения на основе этих результатов. Оказалось, что даже специалисты слишком доверяют подобным моделям и не относятся к результатам критически. Как любой инструмент, объясняющие модели можно использовать неправильно. При разработке инструментария важно учитывать это, привлекая накопленные знания (или специалистов) в области человеко-компьютерного взаимодействия, чтобы учитывать особенности и потребности потенциальных пользователей.

Data Science, Notebooks, Visualization


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

Поэтому предметом этой области HCI становится разработка новых способов визуализации неопределенности в предсказаниях моделей, создание систем для сравнения анализа, проведенного разными способами, а также анализ работы аналитиков с инструментами, например с Jupyter notebooks.

Визуализация неопределенности


Визуализация неопределенности одна из особенностей, которые отличают научную графику от презентационной и бизнес-визуализации. Довольно долго ключевым в последних считался принцип минималистичности и фокуса на основных трендах. Однако это приводит к чрезмерной уверенности пользователей в точечной оценке величины или прогноза, что может быть критичным, особенно, если мы должны сравнивать прогнозы с разной степенью неопределенности. Работа Uncertainty Displays Using Quantile Dotplots or CDFs Improve Transit Decision-Making анализирует, насколько способы визуализации неопределенности в предсказании для точечных графиков и кумулятивных функций распределения помогают пользователям принимать более рациональные решения на примере задачи оценки времени прибытия автобуса по данным мобильного приложения. Что особенно приятно, один из авторов поддерживает пакет ggdist для R с различными вариантами визуализации неопределенности.


Примеры визуализации неопределенности (https://mjskay.github.io/ggdist/)

Однако часто встречаются и задачи визуализации возможных альтернатив, например, для последовательностей действий пользователя в веб-аналитике или аналитике приложений. Работа Visualizing Uncertainty and Alternatives in Event Sequence Predictions анализирует, насколько графическое представление альтернатив на основе модели Time-Aware Recurrent Neural Network (TRNN) помогает экспертам принимать решения и доверять им.

Сравнение моделей


Не менее важный, чем визуализация неопределенности, аспект работы аналитиков сравнение того, как часто скрытый выбор исследователем разных подходов к моделированию на всех его этапах может вести к различным результатам анализа. В психологии и социальных науках набирает популярность предварительная регистрация дизайна исследования и четкое разделение эксплораторных и конфирматорных исследований. Однако в задачах, где исследование в большей степени основано на данных, альтернативой могут стать инструменты, позволяющие оценить скрытые риски анализа за счет сравнения моделей. Работа Increasing the Transparency of Research Papers with Explorable Multiverse Analyses предлагает использовать интерактивную визуализацию нескольких подходов к анализу в статьях. По сути, статья превращается в интерактивное приложение, где читатель может оценить, что изменится в результатах и выводах, если будет применен другой подход. Это кажется полезной идеей и для практической аналитики.

Работа с инструментами организации и анализа данных


Последний блок работ связан с исследованием того, как аналитики работают с системами, подобными Jupyter Notebooks, которые стали популярным инструментом организации анализа данных. Статья Exploration and Explanation in Computational Notebooks анализирует противоречия между исследовательскими и объясняющими целями, изучая найденные на Github интерактивные документы, а в Managing Messes in Computational Notebooks авторы анализируют, как эволюционируют заметки, части кода и визуализации в итеративном процессе работы аналитиков, и предлагают возможные дополнения в инструменты, чтобы поддерживать этот процесс. Наконец, уже на CHI 2020 основные проблемы аналитиков на всех этапах работы, от загрузки данных до передачи модели в продакшн, а также идеи по улучшению инструментов обобщены в статье Whats Wrong with Computational Notebooks? Pain Points, Needs, and Design Opportunities.


Преобразование структуры отчетов на основе логов выполнения (https://microsoft.github.io/gather/)

Подводя итог


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

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

Геология XXI века как наука данных о Земле

17.06.2020 22:05:08 | Автор: admin

Сразу оговорюсь, что деление на века немного условно. Например, спутниковая интерферометрия используется с конца 1980-х годов, при этом высококачественные данные стали общедоступными только в 2000-х годах. Трехмерные модели тоже отнюдь не новинка, и делали их ну очень давно ведь и плоская Земля на трех китах вполне себе объемная модель. Так в чем же разница геологии века прежнего и настоящего?



Слева фрагмент геологической карты США, справа 3D геологическая модель с интерферограммой на поверхности рельефа по данным радарной спутниковой съемки (на шкале Density Gradient,% является характеристикой неоднородности геологической плотности, а Band Magnitude обозначает разность фаз отраженного сигнала радара для пары разновременных снимков)


Геология: ремесло или наука


Как нам подсказывает википедия:


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

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


Век XX


Как мы обсудили выше, физика или математика или наука о данных (data science) сами по себе ценности для геологов не представляют все зависит от того, насколько каждый геолог способен понять их и интерпретировать имеющиеся данные. Общедоступны ли геологические данные в условиях, когда для их получения нужен доступ к специальным архивам (бумажным) и, зачастую, авторам этих данных для получения объяснений? Повторимы ли результаты геологических обследований, выполняемых геологоразведывательными группами из десятков и даже сотен специалистов годами и даже десятилетиями? Может ли физик или математик или специалист по данным получить геологически значимые результаты без участия геолога? За редким исключением, ответ очевиден.


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


Век XXI


Что изменилось в нашем веке? Многое, или даже почти все. Данные стали как общедоступными, так и регулярными благодаря дистанционному зондированию Земли с искусственных спутников Земли. В предыдущей статье я перечислил лишь некоторые из общедоступных наборов данных Общедоступные данные дистанционного зондирования Земли: как получить и использовать и многие из них обновляются для каждой точки поверхности планеты каждые несколько дней, так что мы можем проанализировать изменения, их динамику, оценить зашумленность данных, да и просто работать с этими данными с помощью всей мощи статистических методов. Вместо работы со статичной моделью без возможности ее валидации стали доступны динамические модели и разнообразные методы их оценки.


На картинке до хабраката справа на поверхности рельефа показана интерферограмма (смещение каждой точки земной поверхности в единицах длины волны радара), полученная по разновременной паре радарных снимков Sentinel-1 (до и после близкого к поверхности землетрясения в центре). Сама модель посчитана методом инверсии по данным точного рельефа США, подробности смотрите в предыдущей статье Методы компьютерного зрения для решения обратной задачи геофизики. Поскольку нам известны точные координаты как спутниковых снимков, так и участка рельефа, мы легко совмещаем их. На интерферограмме мы видим разломы как линии разрыва значений фазы, отражающие поверхности как резкие границы, позиции максимального смещения геологических блоков как центры колец Добавим, что направления и значения смещений также вычисляются по радарным данным. На картинке внизу слева показана статичная модель и справа к ней добавлены (черным пунктиром) линии смещения геологических блоков:



Разломы можно выделять старым добрым геологическим методом линеаментным анализом. Линеаменты представляют собой геологически значимые штрихи, получаемые с помощью преобразования Хафа на рельефе или космических снимках. Преобразование Хафа выполняется легко (также доступно во множестве библиотек, например, OpenCV), а вот геологически значимые штрихи это те, которые сочтет значимыми геолог. Мда. Так вот теперь мы можем выделенные штрихи просто сравнить с интерферограммой для выделения из них геологически значимых.


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



Откуда мы это знаем? Да мне знакомый геолог сказал. Серьезно. А еще мы можем посчитать значения вертикального смещения (в миллиметрах, кстати, это к слову о точности) и убедиться в этом без помощи геолога. На картинке выше хаброката показана фазовая картинка, обратите внимание на порядок чередования окраски полос (желтым или красным к центру) и поведение рельефа для работающих с интерферограммой специалистов достаточно первого, а для опытного геолога достаточно второго. А можно просто взять и программно посчитать вертикальное смещение поверхности в каждой точке (vertical displacement). Кстати, для анализа смещения при наличии шумов и разрывов используются алгоритмы роутинга на растре задача нетривиальная, поскольку при миллиметровой точности измерений в результате землетрясений возможны вертикальные разрывы поверхности Земли в метры и десятки метров.


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

Подробнее..

Перевод Как заставить генеративные изображения выглядеть естественно при помощи математических алгоритмов

16.06.2020 18:07:02 | Автор: admin
image

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

Этот пост не о языке и не о фреймворке. Мы будем говорить только о технике.

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



Ведущий принцип: моделируйте свои работы на основе реальности



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

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

Линии


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

1. Выбрать начальную точку
2. Выбрать конечную точку
3. Провести черту между точками

В результате получается что-то такое:

image

По-моему, слишком идеально!

Случайный наклон



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

image

Волнообразное колебание



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

Например, это можно сделать так:

1. Выбрать N точек между конечными точками отрезка, чтоб создать новую линию.
2. Сместить каждую точку.
3. Смягчить линию и нарисовать её.

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

image

Влияние соседних точек



Хорошо, у нас начало что-то получаться. Изменение параметров стандартного отклонения позволяет нам контролировать колебания нашей линии. Однако, вы, наверное, заметили, что колебания независимы друг от друга. Линия может колебаться, то приближаясь к соседней верхней, то к нижней линиям. Чтобы уберечься от этого, я предлагаю такой вариант.

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

image

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

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

Текстурирование линий



Теперь наша линия выглдяит достаточно естественно. Но мы всё ещё рисуем идеально точной ручкой, когда мы вызываем функцию stroke(). В реальном мире, когда мы используем различные инструменты для рисования, у них есть различия в текстуре. Один из способов внести эти различия использовать технику песчаных сплайнов, популяризованную Андерсом Хоффом (a.k.a inconvergent). Идея проста:

1. Совсем чуть-чуть скорректируйте каждую точку линии, используя нормальное распределение.
2. Сгенерируйте ещё несколько точек, между каждой соседней парой точек, и нарисуйте их в виде крошечных точечек.
3. Повторите несколько раз.

Если ваши точки супер маленькие, то получится такая текстура:

image

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

image
Сон о пустыне (2018) Текстурированные линии основа многих моих работ.

Формы



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

Мы можем просто нарисовать квадрат.

image

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

image

Можно выбрать и сгладить точки между каждой соседней координатой, чтобы получить кривой квадрат.

image

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

image

Ничего из этого не ново. Мы здесь, по сути, говорим только о замкнутых отрезках, поскольку мы просто сглаживаем углы. А что насчёт заполнения пространства? Мы можем использовать функцию fill(), но это немного скучно.

image

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

image

* Примечание: можно это сделать, поделив квадрат на 2 треугольника и сгенерировав точку в каждом при помощи равномерного распределения.

Хотя выглядит это немного неаккуратно, поскольку равномерное распределение не настолько интуитивно понятно, как кажется. Для более естественного распределения точек, можем взять значения из одной из моих любимых последовательностей Последовательности Хальтона (2.3)[можно почитать про нее в классной статье].

Последовательность Хальтона (2.3) генерируют точки в промежутке (0, 1) (0, 1) в R2. Чтобы заполнить квадрат точками, сгенерированными в этой последовательности, мы можем:

1. Найти минимальный ограничивающий квадрат, содержащий в себе Прямоугольник.
2. Сгенерировать N точек в (2.3) последовательности Хальтона.
3. Градуировать каждую точку по ширине (или высоте) минимального ограничивающего квадрата.
4. Переместить точку по верхней левой координате квадрата.
5. Отфильтровать все точки, которые не лежат в Квадрате.

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

В общем, (2.3) последовательность Хальтона генерируется просто; прочитайте про псевдокод в википедии (eng). Вот заполнение штрихом на 10000 точек.

image

Поскольку (2.3) последовательность Хальтона генерируется не рандомно, она создаёт одинаково выглядящие текстуры. Пара способов обойти это:

1. Градуирование и (по желанию) лёгкое раскачивание ограничительного квадрата, чтобы сместить центр последовательности.
2. Отбрасывание N точек с начала последовательности.
3. Рандомное отбрасывание малой части точек из последовательности (но осторожно, это создает больше шума).

Конечно, эти подходы можно совмещать. Экспериментируйте!

Ещё один привычный способ генерации таких текстур использование избыточной выборки сглаживания. Это стохастический процесс, но он ещё и более требователен к ресурсам для вычисления и внедрения. Но он очень хорош. Я использовал этот способ в моей серии Провод, вот одна из работ.

image
Провод Т


Конечно же, это не единственный подход к текстурированию.

Цвет


Чувствовать, какие цвета сочетаются друг с другом очень, очень сложно. Легко выбрать цвета, которые по твоему мнению хорошо сочетаются, но потом понять, что они совершенно не сочетаются и заставляют твою работу выглядеть в 10 раз хуже, чем в чёрно-белом варианте.

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

Вот мой подход, который я переделал из идеи Джошуа Дэвиса [https://joshuadavis.com/]. Вся суть:

1. В отдельной программе (я, например, использую AutoDesk SketchBook) сконструировать горизонтальную градиентную линию и сохранить в png.
2. Открыть png как пиксели в программе для создания генеративного искусства, и интерполировать между началом и концом градиента, используя функции плавности (функции с диапазоном выхода [0,1])

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

Мы будем использовать вот этот градиент для закрашивания точек в предыдущем примере (только точек в 20 раз больше).

image

Используемая нами функция плавности линейна по значению y. 0 обозначен на значении y верхней части квадрата, а 1 в нижней. Стоит заметить, что результат функции плавности (между 0 и 1) слегка смещается вместе с нормально распределённым случайным значением. Это помогает сформировать менее однородную структуру.

image

Отлично. И это всего лишь абсурдно простая функция плавности (и градиент, который я сделал за 5 минут). Представьте себе возможности!

Используем шум с пользой



Раз уж мы говорим о функциях плавности, а что там с шумом? Шум Перлина не совсем соответствует подходит для этой функции, так как его значения варьируются от -1 до 1. Но с умным mapping`ом, ограничением посторонних значений, модульной арифметикой с плавающей запятой и/или другими хитростями, конечно, мы можем сузить диапазон до [0,1].

Вот одна из моих серий Modular, в которой я использовал 2D шум как функцию плавности в цвете.

image

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

Если взглянуть внимательно, то можно заметить, что штрихованная структура тоже часть шума.

image

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

Ощутимость



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

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

Например, в картине Слащавая сыворотка на мяч влияет гравитация, который скачет по каждому квадратику в сетке. Направление гравитации определено дополнительным полем шума, и шарик оставляет след.

image

В основе Пылевой чаши лежит симуляция рвущейся резинки.

image

Как по мне, эти картины живые. И неудивительно, правда. Они тесно связаны с нашим ведущим принципом:

Моделируйте свои работы на основе реальности

Когда мы фокусируемся на симуляции естественных процессов в коде, мы получаем более естественную работу.

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

P. S. Здесь не было никакого кода не просто так. Эти идеи достаточно общие и применимые во многих языках и средах разработки, я не хотел бы никого отталкивать, заставляя перейти на что-то другое.
Подробнее..

Сколько инструкций процессора использует компилятор?

16.06.2020 20:21:53 | Автор: admin
Месяц назад я попытался сосчитать, сколько разных инструкций поддерживается современными процессорами, и насчитал 945 в Ice Lake. Комментаторы затронули интересный вопрос: какая часть всего этого разнообразия реально используется компиляторами? Например, некто Pepijn de Vos в 2016 подсчитал, сколько разных инструкций задействовано в бинарниках у него в /usr/bin, и насчитал 411 т.е. примерно треть всех инструкций x86_64, существовавших на тот момент, не использовались ни в одной из стандартных программ в его ОС. Другая любопытная его находка что код для x86_64 на треть состоит из инструкций mov. (В общем-то известно, что одних инструкций mov достаточно, чтобы написать любую программу.)

Я решил развить исследование de Vos, взяв в качестве эталонного кода компилятор LLVM/Clang. У него сразу несколько преимуществ перед содержимым /usr/bin неназванной версии неназванной ОС:

  1. С ним удобно работать: это один огромный бинарник, по размеру сопоставимый со всем содержимым /usr/bin среднестатистического линукса;
  2. Он позволяет сравнить разные ISA: на releases.llvm.org/download.html доступны официальные бинарники для x86, ARM, SPARC, MIPS и PowerPC;
  3. Он позволяет отследить исторические тренды: официальные бинарники доступны для всех релизов начиная с 2003;
  4. Наконец, в исследовании компиляторов логично использовать компилятор и в качестве подопытного объекта :-)

Начну со статистики по мартовскому релизу LLVM 10.0:
ISA Размер бинарника Общее число инструкций Число разных инструкций
AArch64 97 МБ 13,814,975 195
ARMv7A 101 МБ 15,621,010 308
i386 106 МБ 20,138,657 122
PowerPC64LE 108 МБ 17,208,502 288
SPARCv9 129 МБ 19,993,362 122
x86_64 107 МБ 15,281,299 203
В прошлом топике комментаторы упомянули, что самый компактный код у них получается для SPARC. Здесь же видим, что бинарник для AArch64 оказывается на треть меньше что по размеру, что по общему числу инструкций.

А вот распределение по числу инструкций:


Неожиданно, что код для SPARC на 11% состоит из nop-ов, заполняющих branch delay slots. Для i386 среди самых частых инструкций видим и int3, заполняющую промежутки между функциями, и nop, используемую для выравнивания циклов на строки кэша. Наблюдение de Vos о том, что код на треть состоит из mov, подтверждается на обоих вариантах x86; но даже и на load-store-архитектурах mov оказывается если не самой частой инструкцией, то второй после load.

А как набор используемых инструкций менялся со временем?

Единственная ISA, для которой в каждом релизе есть официальный бинарник это i386:


Серая линия, отложенная на правой оси это число разных инструкций, использованных в компиляторе. Как мы видим, некоторое время назад компилятор компилировался гораздо разнообразнее. int3 стала использоваться для заполнения промежутков только с 2018; до этого использовались такие же nop, как и для выравнивания внутри функций. Здесь же видно, что выравнивание внутри функций стало использоваться с 2013; до этого nop-ов было гораздо меньше. Ещё интересно, что до 2016 mov-ы составляли почти половину компилятора.

Самые первые версии LLVM, до появления clang, выпускались ещё и с бинарниками для SPARC. Потом поддержка SPARC утратила актуальность, и вновь она появилась лишь через 14 лет с на порядок увеличившимся числом nop-ов:


Исторически следующая ISA, для которой выпускались бинарники LLVM это PowerPC: сначала для Mac OS X и затем, после десятилетнего перерыва, для RHEL. Как видно из графика, переход после этого перерыва к 64-битному варианту ISA сопровождался заменой большинства lwz на ld, и вдобавок удвоением разнообразия инструкций:


В бинарниках для x86_64 и ARM частота использования разных инструкций почти не изменялась:




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

Наконец, самая недавняя ISA, для которой публикуются официальные бинарники это AArch64. Здесь интересно то, что orr с прошлого года почти перестала использоваться:


PowerPC и AArch64 оказались единственными ISA, для которых число разных используемых инструкций всё растёт и растёт.
Подробнее..

Что общего у научной визуализации данных и геймдева обсуждаем в новом подкасте ITMO Research_

20.06.2020 12:14:32 | Автор: admin
Это вторая часть интервью с Андреем Карсаковым (kapc3d), к.т.н., старшим научным сотрудником Национального центра когнитивных разработок, доцентом Факультета цифровых трансформаций.

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


Фото Hello Lightbulb (Unsplash.com)

В первой части беседы мы обсудили опыт AR-сопровождения массовых мероприятий:




Научная визуализация данных и моделирование процессов


Таймкод (в Apple Podcasts) 40:00



dmitrykabanov: Вы же занимались не только AR, у вас много вещей, связанных с визуализацией данных, начиная с обучения магистров и заканчивая проектами для крупных заказчиков?

kapc3d: Даже скажем так: вот эти проекты, они хоть и крупные, и достаточно громкие, но это 20% из всего объёма задач, которые мы делаем. Мы команда визуализации. Занимались именно научной визуализацией и разрабатывали (и до сих пор разрабатываем) различные инструменты для визуализации данных, связанных с исследованиями. По этой ветке продолжаем работать с крупными заказчиками и с небольшими частными, назовём так, нашими внутренними заказчиками ребятами из других научных групп, которым нужен инструментарий. Например, для визуализации данных, чтобы с ними было удобно работать. К дополненной реальности мы пришли благодаря тому, что используем технологии игровой индустрии для работы с серьёзной визуализацией.


Дмитрий: Стоит пояснить, что можно подразумевать под визуализацией данных для самых разных проектов. Например, расчёт движения людей на определённой станции.

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

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


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

Ещё одна из дополнительных веток научной деятельности в нашей лаборатории разработка систем искусственного интеллекта как раз для пешеходной мобильности. Мы занимаемся визуализацией подобных физических процессов. У нас был проект по инструментарию и визуализации гидрометеорологических данных. Занимались прогнозированием уровня,температуры, течения нашего моря, океана, осадков, ветра, геомагнитной обстановки. Работаем с урбанистикой, девелопментом. Ввиду того, что мы делаем визуальную часть, мы исполняем роль неких интеграторов, сборщиков всего в одну кучу, потому что мы предоставляем конечный пользовательский интерфейс. Поэтому какая-то конкретная предметная область для нас не сильно принципиальна, мы с большим количеством отраслей поработали: медицина, урбанистика, с финтехом сейчас крупный проект идёт.



Геймдев и магистерская программа


Таймкод (в Apple Podcasts) 48:52



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

kapc3d: Да.

Дмитрий: Вы к этому пришли исходя из общего тренда на междисциплинарные программы в университете или стали заниматься это темой, исходя из своих интересов?

Андрей: Скорее второе. Это эволюционное развитие, нежели какое-то подстраивание под тренды. Раньше ветка с научной визуализацией, с симуляторами, тренажёрами, и ветка потребительской индустрии компьютерных игр достаточно далеко друг от друга жили. Разные технологии, разный уровень оборудования. Для serious games нудны определённые компьютерные мощности, чтобы всё по-честному считалось, это какие-то реальные симуляторы, построенные на реальных моделях (например, тренажёры боевых действий). С другой стороны, компьютерные игры работают на упрощение в угоду оптимизации. Не всегда нужно достоверно что-то воспроизводить, чтобы не терять интерес игрока. Но последние три года эти области приблизились друг к другу, начали смешиваться.

Инструменты, которые используются в разработке игр, активно пошли в научную область. И очень много наукоёмких вещей из серьёзной разработки начали попадать в игрострой. Это системы искусственного интеллекта, генеративные методы. Мы естественным образом туда попали. Занимались научной визуализацией, но всегда хотелось принимать участие и в разработке компьютерных игр. Возникла мысль, почему бы это не начать смешивать. Почему бы не начать учить ребят, которые хотят в игровую индустрию пойти, и именно с уровня магистратуры давать им те компетенции, которые есть у нас с точки зрения академической части. То есть то, что зачастую кадрам высшей квалификации не хватает: больше свободы в принятии решений, постоянно учиться, изучать, искать новые способы решения. Компаниям как раз этого не хватает. Они ищут джунов, чтобы научить их под себя, либо профессиональных лидов уровня топ-менеджмента.

Дмитрий: Возникает логичный вопрос. Обыватель представляет себе работу над играми, как некий творческий процесс и для него научная составляющаязанимает процентов 5-10% максимум. Как у вас обстоят дела с этим? Как вы объясняете людям, что эта часть имеет вес?

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

С другой стороны, есть бизнес, который приносит немаленькие деньги. В прошлом году игровая индустрия в два раза превысила по объёму выручки киноиндустрию. Это огромные деньги. Нужно делать конкретные шаги, чтобы отбить стоимость этой разработки. Для этого нужны квалифицированные кадры, чтобы выстроить процессы правильно, эффективно и принимать в нужный момент оптимальные решения. Без науки здесь никуда. Всё, что мы видим в интересных игровых проектах, всё, что нас там цепляет, за всем этим есть очень мощная база R&D.


Диснеевская и пиксаровская команда внесла огромный вклад в развитие компьютерной графики. У них в каждом новом мультфильме или фильме есть новые фишки и технологии, которые они выпускают на SigGraph именно как научные публикации. Например, диснеевская команда придумала метод симуляции снега в Холодном сердце, чтобы он корректно скатывался, следы оставлял. На это тратится невероятное количество человеко-часов, а если ты сделал систему, которая позволяет это воспроизводить, то сразу сокращается стоимость производства, но ты сразу потратился на R&D.

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

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

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

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


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

Не нужно ехать на природу, чтобы снять красивые кадры. Достаточно поставить перед гринскрином человека, плюс-минус правильно выставить свет. Кстати, и с этим поможет инструментарий условного игрового движка, когда ты знаешь, какое окружения у тебя будет. Так ты уменьшаешь дальнейшие трудозатраты по постпродакшену. В кинопроизводстве это заметно. И даже на примере профессиональных мероприятий. Раньше конференции вроде CG Event были посвящены преимущественно кинопроизводству, спецэффектам, телевизионным фишкам. Последние годы активно заходит блок производства компьютерных игр и блок игровых технологий в цифровых медиа. Например, в Москве чуть ли не отдельная секция была под Unreal Engine.

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

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

Всё, ты попал в индустрию. Дальше ты понимаешь, как ты хочешь развиваться, учишься, двигаешься, куда угодно. С другой стороны, у нас отсутствует система образования для индустрии игр в России, хотя в Европе и США это давно вполне себе академическая ветка в бакалавриате, магистратуре. У нас это пока серьезно не воспринимали. Когда игровая индустрия начала активно развиваться, у нас были лихие 90-е, где в академии не развивалось ничего. Многие хотят учиться, но не понимают зачем.

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

Главное не быть ленивым. У нас есть возможность поступления по портфолио, если есть проекты, участие в конференциях, шоукейсы или опыт работы в области, связанной с играми, интерактивными технологиями. Достаточно жёстко отбираем, смотрим мотивацию. В этом году 2-3 человека прошло по портфолио, и мы не жалеем. Ребята замотивированные.

Послушать и поддержать нас можно тут:






Тем временем на англоязычной версии Хабра: memory, cyberpunk and startups.


Подробнее..

Перевод Визуализация генеративных алгоритмов гифа, деревья, повторяющиеся и дифференциальные линии (на Python)

22.06.2020 02:19:54 | Автор: admin
image

ВВЕДЕНИЕ


Паттерны всегда меня очаровывали. Даже не важно какие. Я экспериментировал со многими: сети, листья и их переплетения, ветви, молнии, флокирование, очертания фигур, реки, скальный осадок, пейзажи, слизистая плесень, лишайники, взаимодействие и расплавление, клеточные автоматы, некоторые фракталы и другие штуки. Мне кажется, что самое приятное это то, как сложные и затейливые результаты можно получить от набора простых правил.

image

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

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



ПРИЗНАНИЕ


Буду честным перед вами, я иногдаберу идею для своей работы из работ других художников. Особенно Джареда Тарбелла и Nervous System. К примеру, алгоритм, который я назвал Орбиталь (изображение ниже) сделан с очень сильной опорой на Happy Place Тарбелла.

image

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

INCONVERGENT (НЕСОСРЕДОТОЧЕННЙ)


Я начал работать с генеративными алгоритмами, когда должен был готовиться к экзаменам в университете. Именно поэтому я купил домен inconvergent.net, насмехаясь над тем, как я уклоняюсь от учёбы. Первое, что я сделал скопировал несколько алгоритмов Тарбелла с помощью Javascript/Canvas. Через некоторое время ко мне начали приходить уже собственные идеи.

image

Первым моим работающим алгоритмом, помимо Orbitals, был Hyphae. Он получился, когда я пытался воссоздать поведение гифы, сделанное Nervous System. На тот момент я не понимал, насколько сложный этот алгоритм на самом деле, и я потратил очень много времени, тщетно пытаясь сделать что-то сносное. Я все же смог сделать его, а еще вы можете прочитать работу Зигграфа (ENG) по этой теме, если интересно. Увлекательное чтиво!

КОД


Я выкладываю почти весь свой код на Github. Все следующие разделы имеют ссылку на соответствующий репозиторий. К сожалению, не все из них хорошо документированы или обновлены.

HYPHAE (ГИФА) [GITHUB]


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

image

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

image

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

ДЕРЕВЬЯ [GITHUB]


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

image

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

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

image

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

ПОВТОРЯЮЩИЕСЯ ЛИНИИ [GITHUB]


В отличие от Гифы, на которую меня вдохновила биология, и от алгоритмов деревьев, следующий пример основан на картинах, нарисованных рукой Джона Френзена. По большому счёту, Френзен рисует линии, где каждая линия следует по контуру ранее нарисованной линии. Каждая последующая линия будет немножко изменяться, и вскоре появляются интересные узоры.

Рисовать фигуры на компьютере довольно легко. Линия состоит из ряда вершин (точек) с ребром (сегментом) между ними. Для создания треугольника вам нужно взять три ребра и соединить их тремя вершинами. Чтобы нарисовать круг, нужно сделать то же самое, только нужно достаточно много вершин, чтобы было невозможно увидеть, что это на самомо деле не круг. Если у вас появилсиь сомнения в подходе, то сразу скажу, что есть более сложные и точные способы рисования форм, но этот достаточно прост и точен.

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

image

Чтобы проследить контур, можно выбрать некоторые из соседних рёбер в предыдущей линии, рассчитать среднее направление этих рёбер и добавить вершину к текущей линии вдоль этого направления. Затем добавить несколько случайных движений для имитации рисунка от руки. Некоторое время такой подход работает довольно хорошо, но есть некоторая инертность, которую можно увидеть в результатах, форма адаптируется слишком медленно.
Количество шума, которое вы добавляете к каждой вершине, имеет решающее значение. Этот шум является тем, что заставляет всю систему создавать интересные формы, ибо коррекция формы вынуждает в процессе пытаться повторить как общее движение, так и некоторые случайные искажения.
Далее идет несколько более сложная система, которая тоже включает в себя линии.

ДИФФЕРЕНЦИАЛЬНАЯ ЛИНИЯ [GITHUB]


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

Прежде чем я начал прикидывать способы, я видел только Floraform, созданный Nervous System, но вам стоит увидеть ещё Cellular Forms Энди Ломаса. Другой важный документ, который я обнаружил гораздо позже, находится здесь.

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

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

image

Есть ряд факторов, которые могут повлиять на поведение этой системы. Один из них то, как часто мы вводим новые узлы. Другой максимальное расстояние, в пределах которого узлы будут избегать друг друга. И самое интересное (на мой взгляд) то, как мы выбираем, куда вставлять новые узлы. Мы можем сделать это равномерно, как в гифке выше, или мы можем расставить приоритетные места, где изгибы кривой будут более острыми, как в гифке ниже.

image

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

image

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

image

image

А если генеративное искусство и визуализация данных, вас заинтересовали посмотрите другие посты degenerative_art, вот самые популярные на данный момент:

Подробнее..

Интерактивные финансовые данные в 20 строках кода

25.06.2020 10:15:49 | Автор: admin
Статьи на финансовые темы появляются на Хабре регулярно. Во многих из них в качестве источника первичных данных используется неофициально открытое API Yahoo finance. В этой статье я покажу три способа добыть данные (включая Yahoo) а также как напилить из них простое вэб-приложение в 20 строк и выдать его клиенту, не умеющему в CLI.





Ванильный Yahoo

Итак, начнем с получения данных. Классический путь в этом случае API Yahoo. Недостатком является что это API не публичное, и по словам пользующихся людей постоянно что-то меняется и будет отваливаться. Боль на эту тему можно найти, например, там. Если нас такое не страшит то вперед, навстречу приключениям.
Обширная статья с описанием yahoo finance API недавно была на Хабре, есть где разгуляться
тем, кто любит Node.js. Мы же будем теребить питона, поэтому чтобы упростить себе жизнь вместо прямого обращения к API используем библиотеку yfinance. Будем надеяться, что перемены в исходном API будут отслежены создателями библиотеки, а нам останется только поддерживать актуальность используемой версии. Помимо упрощения жизни это допущение грозит в один прекрасный день превратить ваше приложение в неработающий кирпич, поэтому для долгосрочной перспективы я бы смотрел на два варианта обсуждаемых позже в статье.

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

Возьмем данные американской комиссии по ценным бумагам для сопоставлеия имен и тикеров. JSON можно стащить с их сайта. Я воспользовался удобной csv-шкой добытой в другом месте основанной на тех же данных. Ахтунг, в подобых списках могут быть компании снятые с торгов, поэтому рекоммендуются дополнительные проверки.
Например, в скачанном листе есть произодитель оборудования для полупроводниковой промышленности VSEA которую скупил AMAT и убрали с рынка лет 10 назад.

Для простоты создания интерфейса мы пилим его в стримлите. Это красиво и ОЧЕНЬ быстро в плане написания. Но если мы запихаем весь лист в 14 000 позиций в стримлитный селект бокс то интерфейс будет тормозить просто невероятно. Поэтому сделаем предварительную фильтрацию по вводу пользователя.

Если, например, ввести Microsoft то вас сразу перекинет в нужное, а если therapeutics то вас ждет лист с длинным скроллом, зато все просто летает по скорости. Готовый интерфейс незатейлив и прост, на все про все с импортом и проверками ушло 40 строчек. Если несколько упростить как в следующем примере, то выходит как раз 20, никакого кликбейта все честно.



Внутренности
import yfinance as yfimport streamlit as stimport pandas as pdfrom datetime import datetime# read SEC registered comaniessec_list = pd.read_csv('cik_ticker.csv', sep='|',                       names=['CIK', 'Ticker', 'Name', 'Exchange', 'SIC', 'Business', 'Incorporated', 'IRS'])name_options = ['Microsoft Corp']name_hint = st.sidebar.text_input(label='Company name contains')if name_hint is not None:    name_options = sec_list[sec_list['Name'].str.contains(name_hint, case=False)]['Name'].tolist()if not name_options:    name_options = ['Microsoft Corp']# get ticker from company name and dates from UIcompany_name = st.sidebar.selectbox('SEC listed companies', name_options)ticker = sec_list.loc[sec_list['Name'] == company_name, 'Ticker'].iloc[0]tickerData = yf.Ticker(ticker)end_date = st.sidebar.date_input('end date', value=datetime.now()).strftime("%Y-%m-%d")start_date = st.sidebar.date_input('start date', value=datetime(2010, 5, 31)).strftime("%Y-%m-%d")# make API queryticker_df = tickerData.history(period='1d', start=start_date, end=end_date)md_chart_1 = f"Price of **{ticker}** "md_chart_2 = f"Volume of **{ticker}** "if len(ticker_df) == 0:    tickerData = yf.Ticker('MSFT')    ticker_df = tickerData.history(period='1d', start=start_date, end=end_date)    md_chart_1 = f"Invalid ticker **{ticker}** showing **MSFT** price"    md_chart_2 = f"Invalid ticker **{ticker}** showing **MSFT** volume"# Add simple moving averageticker_df['sma 15'] = ticker_df.Close.rolling(window=15).mean()# plot graphsst.markdown(f"Demo app showing **Closing price** and **trade volume** of a selected ticker from Yahoo! finance API")st.markdown(md_chart_1)st.line_chart(ticker_df[['Close', 'sma 15']])st.markdown(md_chart_2)st.line_chart(ticker_df.Volume)



Иcxодники можно найти в репозитории, а поиграть с живым интерфейсом на heroku, ну если ничего не отвалится.

Альтернатива 1

Теперь рассмотрим альтернативы. Если нас не устраивает непубличный API Yahoo, которому сложно доверять в долгосрочном плане? Отличной алтернативой может быть API предлагаемое Quandl.

Этот вариант интерсен тем, что API официальное, платное только за премиум данные, и имеет интерфейсы на R и Python от самих же создателей. API очень щедрое для пользователей с бесплатным ключом, можно сделать 300 запросов за 10 секунд, 2000 за 10 минут и 50 000 в день. Аттракциона такой невиданной щедрости трудно найти в наши дни. Знакомьтесь- Quandl

Из недостатков некоторые довольно тривиальные данные вроде S&P 500 попали в премиальные. Пилим тот же нехитрый дашборд на 20 строк кода. Все так же просто. Для менее чем 50 запросов в день не нужен даже бесплатный ключ. Если запросов больше то надо регистрировать. Несколько упростив исходное приложение умещаемся в 20 строк (не забудьте вставить API key, бесплатно регистрируется там)

Чудеса компактности
import quandlimport streamlit as stfrom datetime import datetimequandl.ApiConfig.api_key = "YOUR_API_KEY"ticker = st.sidebar.text_input("Ticker", 'MSFT')end_date = st.sidebar.date_input('end date', value=datetime.now())start_date = st.sidebar.date_input('start date', value=datetime(2010, 5, 31))ticker_df = quandl.get("WIKI/" + ticker, start_date=start_date, end_date=end_date)ticker_df['sma 15'] = ticker_df.Close.rolling(window=15).mean()# plot graphsst.markdown(f"Demo app showing **Closing price** and **trade volume** of a selected ticker from Quandl API")st.markdown(f"Price of **{ticker}** ")st.line_chart(ticker_df[['Close', 'sma 15']])st.markdown(f"Volume of **{ticker}** ")st.line_chart(ticker_df['Volume'])






Далее можно повышать градус неадеквата анализа неограниченно, пандас вам в руки.
Например, добавить классические метрики вроде корреляции с рынком (за рынок берем S&P 500). Для пущей научности добавляем сравнение с безрисковым инструментом (трехмесячные трежерис) и вычисляем альфу, бету и соотношение Шарпа. Это мы будем делать на примере другого источника, где на бесплатной подписке ограничивают не доступность групп данных, а только число запросов (хотя quandl нам тоже пригодится, данные про трежерис мы возьмем именно там).

Альтернатива 2

Наш второй конкурсант Alpha Vantage. Alpha Vantage API предлагает дневные и внутридневные данные по фондовым рынкам, технические индикаторы в готовом виде, данные рынков валют и даже крипты. По внутридневным доступны интервалы до 1 минуты. Если вы не занимаетесь лотереей внутридневной торговлей и прочим скальпингом, то 500 запросов в день которые дает вам бесплатный ключ вам вполне хватит. Ну а если вы настоящий биржевой воротила, то премиум ключ стоит меньше чем масло в вашем Бентли поменять, о чем беспокоиться? Зарегистрировать бесплатный ключ можно там

Смена источника данных требует минимальной коррекции кода, потому что все варианты умеют выдавать пандасовские датафреймы. Покрытие рынков вполне достойное, американским не ограничивается, по тикерам вроде GAZP.ME, SBER.ME вполне можно следить за нашим посконным. Из недостатков для Питона вам все равно понадобится некоторый обвес для работы с API если не хотите писать его сами. Он есть, но источник его не связан с авторами API и документированность оставляет желать лучшего.

Кроме того, если начать теребить API часто, то выясняется что бесплатно 500 запросов в день и 5 в минуту (пролистайте вверх и сравните с цифрами quandl, про невиданную щедрость я писал вполне серьезно!). Так что для всякой мелочи типа изменения временного диапазона или постоянно запрашиваемого тикера (вроде S&P 500) рекомендуется воспользоваться кешированием в стримлите, чтоб не дергать API понапрасну. Помните, что стримлит без кеширования перезапускает скрипт целиком после взаимодействия пользователя с интерфейсом, даже если он просто поменял границы отображаемого временного отрезка уже скачанных данных. Запрос с параметром outputsize='full' выдает всю историю за 20 лет, фильтрование по датам делаем уже на своей стороне, тоже помогает снизить число обращений.
Главное отличие от предыдущих случаев будет в том, что обращение к API теперь надо обернуть в функцию и навесить на нее кеширующий декоратор

@st.cache(suppress_st_warning=True, allow_output_mutation=True)def get_ticker_daily(ticker_input):    ticker_data, ticker_metadata = ts.get_daily(symbol=ticker_input, outputsize='full')    return ticker_data, ticker_metadata


В готовом виде наш новый апп с первичными признаками некой аналитики будет выглядеть примерно так:


Потроха нехитрой аналитики
import streamlit as stfrom alpha_vantage.timeseries import TimeSeriesfrom datetime import datetimeimport quandlimport pandas as pdquandl.ApiConfig.api_key = "YOUR_QUANDL_API_KEY"ts = TimeSeries(key='YOUR_ALPHA_VANTAGE_API_KEY', output_format='pandas')st.markdown(f"Demo app showing **Closing price** and  daily **APR change** of a selected ticker from alpha vantage API")ticker = st.sidebar.text_input("Ticker", 'MSFT').upper()end_date = st.sidebar.date_input('end date', value=datetime.now()).strftime("%Y-%m-%d")start_date = st.sidebar.date_input('start date', value=datetime(2015, 5, 31)).strftime("%Y-%m-%d")@st.cache(suppress_st_warning=True, allow_output_mutation=True)def get_ticker_daily(ticker_input):    ticker_data, ticker_metadata = ts.get_daily(symbol=ticker_input, outputsize='full')    return ticker_data, ticker_metadatatry:    price_data, price_meta_data = get_ticker_daily(ticker)    market_data, market_meta_data = get_ticker_daily('SPY')    md_chart_1 = f"Price of **{ticker}** "    md_chart_2 = f"APR daily change of **{ticker}** "except:    price_data, price_meta_data = get_ticker_daily('MSFT')    market_data, market_meta_data = get_ticker_daily('SPY')    md_chart_1 = f"Invalid ticker **{ticker}** showing **MSFT** price"    md_chart_2 = f"Invalid ticker **{ticker}** showing **MSFT** APR daily change of"def apr_change(pandas_series_input):    return ((pandas_series_input - pandas_series_input.shift(periods=-1,                                                             fill_value=0)) / pandas_series_input) * 100 * 252price_data['change'] = apr_change(price_data['4. close'])market_data['change'] = apr_change(market_data['4. close'])price_data_filtered = price_data[end_date:start_date]market_data_filtered = market_data[end_date:start_date]stock_market_correlation = price_data_filtered['change'].corr(market_data_filtered['change'], method='pearson')# estimate risk free return via 3 months treasury bondstreasury_yield = quandl.get("FRED/TB3MS", start_date=start_date, end_date=end_date)rfr = treasury_yield['Value'].mean()  # mean treasury yield over periodstock_volatility = price_data_filtered['change'].std()market_volatilidy = market_data_filtered['change'].std()stock_excess_return = price_data_filtered['change'].mean() - rfrmarket_excess_return = market_data_filtered['change'].mean() - rfrbeta = stock_market_correlation * stock_volatility / market_volatilidyalpha = stock_excess_return - beta * market_excess_returnsharpe = stock_excess_return / stock_volatilitymetrics_df = pd.DataFrame(    data={'mkt correlation': [stock_market_correlation], 'alpha': [alpha], 'beta': [beta], 'Sharpe ratio': [sharpe]})metrics_df.index = [ticker]st.markdown(md_chart_1)st.line_chart(price_data_filtered['4. close'])st.markdown(md_chart_2)st.line_chart(price_data_filtered['change'])st.table(metrics_df)




Судя по хорошей корреляции индекса с самим собой и нулевой альфе грубой лажи удалось избежать. На всякий случай напомнбю альфа это превышение доходности инструмента над рынком, здесь и далее в процентах в годовом исчислении. Чем положительнее и больше тем бодрее растет акция по сравнению с рынком. Интервал сравнения для всех с 1 января 2010 года. Можно видеть на примере последних 10 лет, что Майкрософт (MSFT) растет не сильно выше рынка,



а вот Фейсбук (FB) или Амазон (AMZN) все еще существенно обгоняют.





Можно также убедиться, что, например, частные тюрьмы и прочий коммерческий ГУЛАГ (CXW, GEO)





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

Доставка streamlit аппа на дом

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

Просим пользователя установить ContainDS и Докера. Ставим себе. Запускаем базовый стримлит образ, указав папку с нашим поделием, кликнув на CMD доставляем нужные зависимости из requirements.txt. И наконец экспортируем все это добро в один *.containds файл. Сохраняем и шлем клиенту (не по емейлу конечно, наш образ весит без малого 600 мегабайт)



От клиента требуется загрузить файл и мышкой кликнуть на WEB. Никаких хакерных консолей, можно научить хоть тетенек в бухгалтерии. Будете потом гордиться, что у вас тетеньки в бухгалтерии гоняют сервисы в докерных контейнерах. Пошаговая инструкция.

Бонус

Ну и наконец для тех чтитателей или их клиентов, кто заинтересовался данными, но считает все эти докеры с жаваскриптами поверх питонов излишними свистелками и перделками. Для акул старой школы эксельный плагин для импорта данных из alpha vantage. Аналогичное для Quandl. Всем кто недавно ностальгировал в юбилейной трибьют-теме чуваки, про вас помнят!

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

Из моего короткого знакомства с тремя API мне показалось, что в целом самый щедрый это Quandl, особенно для платных клиентов. Если запросов мало, а платность не вариант то alpha vantage сгодится тоже. С yahoo настораживает вопрос кто же платит за угощение для всех, не исчезнет ли оно в один прекрасный день. Много примеров работы с Quandl и аналитики вообще можно найти во втором издании Mastering Python for Finance (есть на Либрусеке). Делитесь своими находками в области, в комментах статьи про yahoo finance API писали про Тинькова и другие варианты, но без подробностей

Фото на обложке поста Photo by M. B. M. on Unsplash
Подробнее..

Перевод Интерактивная визуализация данных при помощи Plotly строим красивые графики с Express и Cufflinks

25.06.2020 22:10:00 | Автор: admin
image


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

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

Вот камни преткновения, которые могут появиться на пути авантюристов, решивших покорить эту гору:

  • непонятная начальная настройка для работы оффлайн без аккаунта;
  • неимоверное количество строк кода;
  • устаревшая документация;
  • множество различных инструментов Plotly, в которых можно заблудиться (Dash, Express, Chart Studio и Cufflinks).

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

Plotly


Данная программа была создана одноименной компанией, владеющей множеством программ с открытым исходным кодом для создания интерактивных графиков и чартов. Зарабатывает компания за счет предоставления расширенного пакета функций своих программ. Также за отдельную плату она предлагает настроить Ваш собственный хостинг. Компания базируется в Монреале с офисом в Бостоне.

Plotly.py основывается на JavaScript-библиотеке D3.js. Также в Plotly есть API-обертки для R, Julia и многих других языков программирования. Стоит отметить, что документация представлена не на всех языках.

image

Примеры библиотек от Plotly

В этой статье мы остановимся на опциях, которые используют Python. Я использую Python 3.7 и последующие версии библиотеки в данном руководстве.

cufflinks                0.15jupyterlab             0.35.5plotly                   3.8.1     plotly-express       0.1.7


Убедитесь, что используется cufflinks 0.15 (0.13 не очень дружит с последними обновлениями Plotly).
ПРАВКА (май 2020): самая свежая версия Plotly 4.7.1. Большая часть представленных ниже инструкций все так же применима к последней версии программы. Обратите внимание, что экспресс-модуль импортируется как часть пакета Plotly.

plotly.py


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

Установите простой модуль plotly.py с conda или воспользуйтесь pip install plotly.

Импортируйте модуль и сконфигурируйте его для использования в оффлайн-режиме:

import plotly.offline as pypy.init_notebook_mode(connected=False)


Теперь программа не будет требовать у Вас создать аккаунт. Так мы и преодолели первую преграду на пути к вершине горы Plotly.

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

image

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

import pandas as pdimport numpy as npimport plotly.offline as pyimport plotly.graph_objs as goimport jsonpy.init_notebook_mode(connected=False)izip = zipdf = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/globe_contours.csv')df.head()contours = []scl = ['rgb(213,62,79)','rgb(244,109,67)','rgb(253,174,97)',\       'rgb(254,224,139)','rgb(255,255,191)','rgb(230,245,152)',\       'rgb(171,221,164)','rgb(102,194,165)','rgb(50,136,189)']def pairwise(iterable):    a = iter(iterable)    return izip(a, a)i=0for lat, lon in pairwise(df.columns):    contours.append( dict(        type = 'scattergeo',        lon = df[lon],        lat = df[lat],        mode = 'lines',        line = dict(            width = 2,            color = scl[i]        )    ) )    i = 0 if i+1 >= len(df.columns)/4 else i+1    layout = dict(        margin = dict( t = 0, l = 0, r = 0, b = 0 ),        showlegend = False,                 geo = dict(            showland = True,            showlakes = True,            showcountries = True,            showocean = True,            countrywidth = 0.5,            landcolor = 'rgb(230, 145, 56)',            lakecolor = 'rgb(0, 255, 255)',            oceancolor = 'rgb(0, 255, 255)',            projection = dict(                 type = 'orthographic',                rotation = dict(lon = 0, lat = 0, roll = 0 )                        ),            lonaxis = dict(                 showgrid = True,                gridcolor = 'rgb(102, 102, 102)',                gridwidth = 0.5            ),            lataxis = dict(                 showgrid = True,                gridcolor = 'rgb(102, 102, 102)',                gridwidth = 0.5            )        )    )sliders = []lon_range = np.arange(-180, 180, 10)lat_range = np.arange(-90, 90, 10)sliders.append(     dict(        active = len(lon_range)/2,        currentvalue = {"prefix": "Longitude: "},        pad = {"t": 0},        steps = [{                'method':'relayout',                 'label':str(i),                'args':['geo.projection.rotation.lon', i]} for i in lon_range]    )      )sliders.append(     dict(        active = len(lat_range)/2,        currentvalue = {"prefix": "Latitude: "},        pad = {"t": 100},        steps = [{                'method':'relayout',                 'label':str(i),                'args':['geo.projection.rotation.lat', i]} for i in lat_range]    )      )projections = [ "equirectangular", "mercator", "orthographic", "natural earth","kavrayskiy7",                "miller", "robinson", "eckert4", "azimuthal equal area","azimuthal equidistant",                "conic equal area", "conic conformal", "conic equidistant", "gnomonic", "stereographic",                "mollweide", "hammer", "transverse mercator", "albers usa", "winkel tripel" ]buttons = [ dict( args=['geo.projection.type', p], label=p, method='relayout' ) for p in projections ]annot = list([ dict( x=0.1, y=0.8, text='Projection', yanchor='bottom',                     xref='paper', xanchor='right', showarrow=False )])# Update Layout Objectlayout[ 'updatemenus' ] = list([ dict( x=0.1, y=0.8, buttons=buttons, yanchor='top' )])layout[ 'annotations' ] = annotlayout[ 'sliders' ] = slidersfig = dict( data=contours, layout=layout )py.iplot( fig)

Не уверена, как этот пример сюда запихнуть, не размазав его по нескольким страницам.

Главное, почему стоит избегать работы с ванильным модулем plotly.py, громоздкость данных. Процесс вбивания кода выходит очень длительным и часто приводит к ошибкам. К счастью, из данной ситуации есть два выхода.

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

Следующие два продукта от Plotly, на которые мы обратим внимание, предлагают высокоуровневые обертки, упрощающие программный интерфейс plotly.py. Они помогут сэкономить время, если вы работаете с библиотекой Pandas. Давайте рассмотрим их поподробнее.

Express


Модуль Plotly Express был выпущен в марте 2019 года и находится в процессе активной разработки. Компания работает над созданием условий поддержки новых графиков и собирается выпустить Plotly 4.0 летом 2019 года.

Express позволяет уменьшить код, необходимый для создания датафреймов Pandas в 10 раз. Загружать свою таблицу нужно в виде опрятных данных, где каждый столбец соответствует одной переменной, а каждая строка одному наблюдению.

Установите Express с помощью pip install plotly_express.

Чтобы использовать эту библиотеку в записной книжке Jupyter, введите следующий код в командную строку:

jupyter labextension install @jupyterlab/plotly-extension

Данный код позволит создать гистограмму из таблицы с традиционным Express импортом:

import plotly_express as px         px.bar(my_df, x='my_x_column', y='my_y_column')


Вуаля! Вы получили гистограмму по данным таблицы (вставьте свои значения там, где у меня в коде дано my_.

Вы можете настроить множество значений. Например, добавьте заголовок, изменив свое определение следующим образом:

px.bar(my_df, x='my_x_column', y='my_y_column', title='My Chart Title")


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

_my_fig = px.bar(my_df, x='my_x_column', y='my_y_column', title='My Chart Title')_my_fig.data[0].update(    text=my_df['my_y_column'],      textposition='inside',    textfont=dict(size=10))_my_fig.iplot()


Внимание: я нашел документацию Express! Она не отобразилась у меня на первой странице поиска в гугле, поэтому я не сразу смог ее прикрепить. Теперь она есть. Всегда пожалуйста!
Express позволяет быстро создавать разного вида диаграммы, но доступны могут быть не те, что Вам требуются. Например, нормальную гистограмму с накоплением вы сейчас врядли сможете собрать. А если очень надо, то придется подниматься в гору по другой тропинке в этот раз с Cufflinks.

Cufflinks


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

Установите ее с помощью pip install cufflinks.

Импортируйте модуль и настройте файл для автономного использования.

import cufflinks as cfcf.set_config_file(offline=True)


С Cufflinks для создания многих видов диаграмм нужна лишь одна строчка кода. К примеру, сделать гистограмму с накоплением с этой библиотекой проще простого.

image

Пример гистограммы с накоплением, созданной с помощью Cufflinks.

А вот и сам код:

df = pd.DataFrame(np.random.rand(6, 3), columns=['A', 'B', 'C'])df.iplot(kind='bar', barmode='stack', title='Stacked Bar Chart with Random Data')


Обратите внимание, что для создания диаграмм с помощью Cufflinks Вам нужно использовать .iplot().

Как и Express, Cufflinks возвращает исходные данные, чтобы Вы могли вносить мелкие поправки. Но в отличие от Cufflinks, Вам нужно уточнить переменную asFigure=True, чтобы вернуть информацию. После этого можно обновить график точно так же, как в Express. Вот как это будет выглядеть, если Вы захотите изменить название и диапазон осей.

my_fig = df.iplot(kind='bar', barmode='stack', title='Stacked Bar Chart with Random Data', asFigure=True)_fig.layout.yaxis = dict(title='Members', range=[0, 600])

Вот документация Cufflinks.

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

Сравнение трех вариантов


Далее Вы можете наблюдать сравнение кода со схожей структурой для графиков, созданных с помощью plotly.py, Express и Cufflinks.

plotly.py


image

Пример диаграммы рассеяния, выполненной с plotly.py

fig = {    'data': [        {            'x': df2007.gdpPercap,             'y': df2007.lifeExp,             'text': df2007.country,             'mode': 'markers',             'name': '2007'},    ],    'layout': {        'title': "Example Scatter Plot with Vanilla plotly.py"    }}py.iplot(fig)


Express


image

Пример диаграммы рассеяния, выполненной с Plotly Express

px.scatter(    df2007,     x="gdpPercap",     y="lifeExp",     title='Example Scatter Plot with Plotly Express')


Выглядит просто и лаконично! Форматирование по умолчанию немного отличается, а названия осей генерируются автоматически. Теперь предлагаю взглянуть на тот же график в Cufflinks.

Cufflinks


image

Пример диаграммы рассеяния, выполненной с Cufflinks

df2007.iplot(    kind='scatter',     mode='markers',     x='gdpPercap',     y='lifeExp',     title='Example Scatter Plot with Cufflinks')


Код похож на Express, но у графика немного другие значения по умолчанию. Определенно, с Express и Cufflinks Вам не придется часами выстукивать коды, что особенно важно при создании более сложных графиков.

Давайте посмотрим, как можно вернуть и обратиться к основной информации.

Обновление графиков Cufflinks и Express


Давайте перейдем к макету графика, созданного с Cufflinks, и добавим названия осей.

image

Пример диаграммы рассеяния, выполненной с Cufflinks Доступ к исходному графику

fig = df2007.iplot(    kind='scatter',     mode='markers',     x='gdpPercap',     y='lifeExp',     asFigure=True,    title='Example Scatter Plot with Cufflinks - Access Underlying Figure')fig.layout.xaxis.title = "GDP per Capita"fig.layout.yaxis.title = "Life Expectancy"fig.iplot()


Вот как сделать то же самое с Express. Не забывайте, что в данной библиотеке не нужно уточнять asFigure=True.

image

Пример диаграммы рассеяния, выполненной с Plotly Express Доступ к исходному графику

fig = px.scatter(    df2007,     x="gdpPercap",     y="lifeExp",     title='Example Scatter Plot with Plotly Express - Access Underlying Figure')fig.layout.xaxis.title = "GDP per Capita"fig.layout.yaxis.title = "Life Expectancy"fig.iplot()


Вы можете обратиться к исходным данным, чтобы добавить текстовые метки следующего вида:

fig.data[0].update(text=df2007['gdpPercap'],textposition=inside,textfont=dict(size=10))


Что выбрать: Plotly.py, Express или Cufflinks


Выбирать всегда сложно. Один раз я думал, что работал над частью проекта в Express, а потом понял, что это был Cufflinks!

Мне очень нравится выражение из Zen of Python: Должен существовать один и, желательно, только один очевидный способ сделать это. Как только появляются варианты появляются и необходимость долгого поиска информации, и усталость от необходимости выбирать, и ошибки.

К сожалению, ни один высокоуровневый API на данный момент не дает возможность создавать графики любого типа. Однако лично я точно постараюсь максимально избегать использования ванильного python.py и предпочту Cufflinks или Express.

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

Форматирование по умолчанию у двух библиотек может сильно отличаться. Например, создав датафрейм со случайными данными для столбцов X, Y и Z и используем следующий код, в Cufflinks мы получим следующую диаграмму:

df.iplot(kind=scatter, mode=markers, x=X, y=Y, title=Random Data, categories=Z)


image

Диаграмма рассеяния по умолчанию с Cufflinks

А вот что мы получим с Express-кодом:

px.scatter(df, x=X, y=Y, color=Z, title=Random Data)


image

Другие пресеты с Express

Заметная разница!

Сохранение файлов


Закончив работы с диаграммой, Вы можете навести на нее мышку и щелкнуть по значку камеры, чтобы экспортировать ее в формате .png, или нажать Экспортировать в plot.ly, чтобы сохранить интерактивное изображение на сервер Plotly. Помимо этого, Вы можете скачать файлы в интерактивном HTML-формате следующим образом:

py.offline.plot(my_fig, filename=my_example_file.html)


Если нужны другие форматы изображения, Вы можете воспользоваться пакетом orca и скачивать файлы в форматах .png, .jpg и .pdf. Данный пакет на данный момент недоступен на pypi.org, поэтому установить его с помощью pip не получится. Вы можете управлять пакетом с помощью conda или установить ОС-специфичную версию orca со страницы GitHub. После этого Вам не нужно будет импортировать библиотеку orca. Узнать больше о программе orca можно здесь.

Вот код для создания png-файла после установки orca:

import plotly as plotlyplotly.io.write_image(fig, file='my_figure_file.png', format='png')


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

Dash


С Plotly Dash Вы можете создавать дашборды для своей команды или для других людей. Есть версия с открытым кодом доступа, у которой к 1 мая 2019 года насчитывалось практически 9000 звезд GitHub. Plotly также предлагает целый ряд дополнений. Может, в будущем я напишу статью и об этом. Подписывайтесь, чтобы не пропустить.

Chart Studio


Plotly Chart Studio позволяет легко создавать и редактировать графики в браузере. Plotly рекламирует данную программу как самый умный редактор для создания D3.js- и WebGL-диаграмм. Не надо ничего кодировать вручную. Есть бесплатная версия, но если хотите сохранить свои графики, то придется отдать 99$ за год использования.

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

Бонус: другие варианты библиотек визуализации данных от Python


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

image

Хотите делать графики по старинке обратитесь к ванильной библиотеке Matplotlib API.

image

Pandas Matplotlib позволяет создавать неплохие простенькие графики. Может создавать стандартные Matplotlib объекты.

image

Seaborn отличная высокоуровневая обертка, основанная на Matplotlib, которая позволяет создавать различные графики визуализации статистических данных. К сожалению, из-за довольно старой базы Matplotlib, использовать ее не очень удобно.

image

Bokeh конкурент Plotly. Программа с открытым исходным кодом, интерактивная, работает с Python.

image

Holoviews высокоуровневая обертка, работающая с Matplotlib, Bokeh, а теперь и с Plotly. Знаю ребят, которые пользуются именно ей.

image

Специалистам, работающим с языком R, нравится использовать Shiny от RStudio. Оно позволяет пользователям R создавать интерактивные визуализации для веб-приложений.

image

Tableau и Microsoft PowerBI две популярные опции с системой перетаскивания данных визуализации, которые работают с Python. Tableau очень даже хорошая библиотека, но за нее придется заплатить, если не хотите, чтобы Ваша работа была в открытом доступе.

image

На мой взгляд, PowerBI обладает менее интуитивно понятным интерфейсом, но программа все равно очень мощная и популярная.

Большинство ПО для создания интерактивных графиков используют библиотеку D3.js. Она очень популярна.

Выводы и полезные ресурсы


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

Возможно, когда-нибудь появится универсальная библиотека, позволяющая создавать все, что захотите, используя высокоуровневые API-опции Plotly. А пока, если хотите сэкономить время и сделать крутые графики, предлагаю обращаться к Pandas с Cufflinks или Express.



Совет: когда используете в графиках цвет, не забывайте про людей с дальтонизмом. Воспользуйтесь палитрой, удобной для дальтоников. Я использую палитру от ggplot.

image

Образец цветов

color_list = ["#E69F00", "#56B4E9", "#009E73", "#F0E442", "#D55E00", "#0072B2",  "#CC79A7"]


image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Убийства и анализ данных

26.06.2020 12:10:59 | Автор: admin
Алексей Кнорре

23 июня, 2020

Привет, Хабр.

Меня зовут Алексей Кнорре, и я криминолог, аспирант в UPenn и аффилированный научный сотрудник в ЕУСПб. Подумал, что сейчас, после месяцев карантина, самое время рассказать о преступности. Неясная экономическая ситуация, рост безработицы, ухудшение общественного здоровья все это вызывает опасения в завтрашнем дне. Что будет с преступностью в России? Как криминолог, я использую статистические методы и программирование для того, чтобы эмпирически исследовать преступность, поэтому я постоянно работаю с данными, о которых сегодня и хотел бы рассказать доступным языком. На Хабре было всего два поста по тегу криминология, поэтому надеюсь, мой рассказ будет интересным.

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

В науке преступность измеряют разными способами. Два года назад мы с коллегами, например, провели первый в России репрезентативный виктимизационный опрос, обзвонив 16 тыс. человек. Данные мы открыли для общего пользования. Основной вывод уровень реальной преступности где-то в 8 раз выше регистрируемой правоохранительными органами. Вот визуализация процесса от Марии Бублик и Натальи Тогановой, вошедшая в шорт-лист премии Information is Beautiful 2019.







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

Управление ООН по наркотикам и преступности (UNODC) ежегодно выпускает аналитический отчёт по убийствам в странах мира. Стандартная метрика количество убийств на 100 000 человек населения, или homicide rate. По состоянию на 2017 г., меньше всего убийств в Японии и Сингапуре (0,2 убийства на 100 000), Гонконге (0,3), Индонезии (0,4) и Норвегии (0,5). Больше всего в Сальвадоре (61 убийств на 100 000 человек), Ямайке (57), Гондурасе (41,7) и Бразилии (30,5). Россия сильно внизу этого международного рейтинга, с 9 убийствами на 100 000 человек, в компании с Угандой (11), Уругваем (8,2), Перу (7,7) и Афганистаном (7,1).

Интересно посмотреть на гетерогенность: где в России убивают больше или меньше, чем в среднем? С этими мыслями я открыл RStudio и начал писать код.

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

С сайта Росстата я взял файл с населением России с разбивкой по населённым пунктам за 2016 г. Год был выбран не случайно: это единственный год, где для каждой единицы, будь то субъект РФ, городской округ или муниципальный район, был идентификатор ТЕРСОН-МО, копирующий ОКТМО. ОК, население есть.

С убийствами оказалось сложнее. Открытой статистики по убийствам на уровне городов в России нет. В нашей научной работе мы используем данные обо всех возбужденных уголовных делах в России в 20132014 гг. Это огромный деперсонифицированный массив из примерно 5,5 млн. оцифрованных статистических карточек, которые в обязательном порядке заполняют следователи или дознаватели в момент возбуждения уголовного дела. Вот так выглядит первая страница карточки на выявленное преступление:







Любые административные данные немного грязные. В нашем случае в этих данных целиком отсутствовало несколько регионов, а у некоторых был пустой ОКТМО. Кроме того, иногда проблемой было то, что в некоторых городах единственный отдел полиции отвечал и за город, и за прилегающий муниципальный район, а его идентификатор ОКТМО был районный. Иными словами, это проблема муниципальный округ-административный центр: в зоне ответственности многих отделов, например, МВД находятся и город, в котором они расположены, и муниципальный район, который подчинён этому городу. Сличение по 5 знаку ОКТМО завысило бы удельное количество убийств, поскольку для города N в числителе будут убийства и в городе N, и в N-ском муниципальном районе, а в знаменателе население только города N. Поэтому я агрегировал все данные об убийствах на уровне первых 6 цифр ОКТМО отделов правоохранительных органов.

Получилось два набора данных убийства и численность с общим ключом ОКТМО. Сличив их, я оставил города с населением больше 100 000 человек, таких городов получилось 176. Нижняя граница в 100 тыс. выбрана по трём соображениям: во-первых, спорадический характер преступности делает оценку на меньших населенных пунктах нестабильной. Во-вторых, точность сличения уменьшается с размером населённого пункта. В-третьих, сама логика удельного количества убийств на 100 000 человек подсказывает нам отсечку.

Из 176 городов я нахожу данные по убийствам для 140 городов. В наших данных полностью отсутствуют сведения для Чечни и отсутствует маппинг между отделом полиции и ОКТМО для Башкортостана, Кемеровской области, Хакасии, Сахалина, Ярославской области, Костромской области, Камчатского края. Кроме того, из-за проблемы муниципальный район-административный центр я также теряю большинство городов Московской области. Тем не менее, 140 городов это уже что-то. Получаем homicide rate: делим количество убийств на 2 (потому что данные за два года), а потом на население города. И всё бы хорошо, да только данные по убийствам за 20132014 гг.

С 1990-х гг. по всём мире происходит великое падение преступности, в англоязычном мире известное как the great crime drop. Грубо говоря, люди перестают красть, бить и убивать. Криминологи выделяют ряд возможных причин, таких, как развитие систем безопасности (видеокамеры, охранные системы и т.п.), рост уровня жизни, прекращение использования свинцовых красок, которые отрицательно влияют на когнитивное развитие детей и снижают способность к самоконтролю. Теорий много. Это падение характерно и для России.

К счастью, у Генеральной прокуратуры РФ есть сайт с открытыми данными о преступности на региональном уровне. Путём несложных манипуляций я выгрузил данные об убийствах (учитывая и статью 105 УК РФ, и статью 111 ч. 4 УК РФ обе на самом деле квалифицируют умышленное насилие, которое привело к смерти) за последние 10 лет по регионам и рассчитал динамику удельной убийственности по регионам:







Мы видим почти двухкратное падение количества убийств за 10 лет. Используя эти данные, я предсказал, как изменится убийственность каждого региона в России с 2014 к 2020 г. Для каждого региона получается множитель-мультипликатор, который мы умножаем на удельную убийственность по данным 5,5 млн. карточек, и получаем спрогнозированную удельную убийственность в 2020 г. Важное предположение здесь в том, что тренд снижения преступности в городах следует тренду на уровне региона. Кроме того, прогнозы всегда неточны, поэтому мы рассчитали доверительные интервалы.







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

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







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







Наконец, можно сделать еще одну интересную вещь. Я сматчил данные Мирового банка о среднем удельном количестве убийств на 100 тыс. человек населения по странам мира за 2017 г. (или ближайший доступный) и получил страны, которые ближе всего находятся к российским городам по уровню убийств. Это не совсем корректное сравнение, поскольку, во-первых, разные годы, и мы знаем, что со временем убийств становится меньше, во-вторых, удельные количества в микрогосударствах, таких, как Багамы, не всегда годятся для сравнений. Здесь может быть экологическая ошибка, связанная с агрегацией данных на уровне стран. Тем не менее, это забавное сравнение. В таблице ниже подобранные страны для 14 городов-миллионников России. Мой родной город Красноярск, и теперь я могу говорить, что с точки зрения статистики убийств я родом из Королевства Свазиленд.

Город Убийств на 100К населения Ближайшая страна по уровню убийств
Москва 2.26 Albania
Санкт-Петербург 2.73 Hungary
Новосибирск 9.65 Panama
Екатеринбург 12.01 Costa Rica
Нижний Новгород 8.34 Philippines
Казань 11.75 Dominican Republic
Челябинск 12.94 Costa Rica
Омск 10.39 Barbados
Самара 7.49 Peru
Ростов-на-Дону 5.88 Ecuador
Красноярск 9.38 Eswatini
Пермь 6.87 Afghanistan
Воронеж 5.73 Ecuador
Волгоград 7.70 Peru
Краснодар 6.74 Afghanistan


Приглашаю вас брать эти данные для своих изысканий. Мой университет недавно запустил совместно с Яндексом программу Пандан, на которой мы будем совмещать знания из общественных наук с навыками исследователей данных. Как раз в криминологии добавленная стоимость такого альянса очевидна.
Подробнее..

Категории

Последние комментарии

© 2006-2020, personeltest.ru