3 заметки с тегом

#python

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

Все мы любим строить гистограммы и/или плотности распределения в своих любимых инструментах (matplotlib/seaborn/plotly/…. — выбрать чем пользуетесь). И все бы ничего, вызвал метод — получил результат, но тут столкнулся с интересным поведением.

Задача: Есть массив чисел (измерения некоего параметра), общее распределение представлено на рисунке 1 (сгенерировано с помощью python). В массиве выделяются категории величины и необходимо построить гистограмму по категориям.

import random

smp = pd.Series([random.gauss(100, 25) for _ in range(10000)])
smp.hist(bins=31)

Рис 1 Распределение некоего параметра

Для решения вышестояшей задачи нам необходимы категории параметра, например:

  • < 80
  • 80 — 125
  • > 125

Пишем функцию:

def categorize(value):
    if value < 80:
        return '< 80'
    elif value >= 80 and value <= 125:
        return '80 - 125'
    else:
        return '> 125'

Применяем к данным, на выходе категории:

smp_new['sample_category'].value_counts()

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

smp_new\
    .groupby('sample_category').apply(lambda gr: plt.hist(gr['sample'], bins=21, density=False))

Но результат:

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

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

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

UPD

Нашелся ответ тут

Спасибо, Петр Гонин

_, _, bars = plt.hist(smp_new['sample'], bins = 33, color="C0")
for bar in bars:
    if bar.get_x() < 80:
        bar.set_facecolor(color_triads[1][0])
    elif bar.get_x() <= 125 and bar.get_x() >= 80:
        bar.set_facecolor(color_triads[1][1])
    else:
        bar.set_facecolor(color_triads[1][2])
        
plt.ylabel("samples")
plt.grid(True)
plt.show()

Результат

 59   14 дн   #analytics   #histogramm   #python

Погодный монитор или Google SpreadSheets Dashboard

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

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

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

  • датчик освещенности
  • радиационный фон
  • скорость ветра
  • был и успел исчезнуть датчик пыли

Также станция обзавелась комнатным модулем (который связан по радиоканалу с уличным модулем и по последовательному интерфейсу с компьютером, где и происходит вся магия 🧙‍♂️) и в конце 2019 года появился дисплейный модуль

Цветовой индикатор отображает среднюю скорость роста давления за последние 3 часа (3 часа разбиваются на интервалы по 30 минут и считается среднее), имеет следующие цвета:

  • красный

    Рост свыше 1.8 мм/час — Quickly rising High Pressure System, not stable
  • желтый

    Рост выше 0.37 мм/час менее 1.8 мм/час — Slowly rising High Pressure System, stable good weather
  • зеленый

    Рост выше -0.37 мм/час и менее 0.37 мм/час — Stable weather condition
  • синий

    Рост более -0.37 мм/час — Slowly falling Low Pressure System, stable rainy weather
  • фиолетовый

    Рост более -1.8 мм/час — Quickly falling Low Pressure, Thunderstorm, not stable

За основу взят алгоритм компании NXP https://www.nxp.com/docs/en/application-note/AN3914.pdf.

После появления метеостанции естественным образом захотелось собирать данных и что еще более естественно их анализировать — это и стало мотиватором к изучению программирования. Были опробованы многие языки (processing (аля С++), php, bash, R). Но когда я открыл для себя python — почувствовал, вот оно!

Был написан скрипт, который запрашивает данные с комнатного модуля, принимает, проверяет и записывает в файл, таким образом начальная база файловая, она и осталась до сих пор. Иерархия такова Папка YYYYMM -> Файл YYYYMMDD.txt. Как говорится, цыплят по осени считают и пока учился в Яндекс.Практикуме, решил что надо весь погодный архив положить в базу данных и продолжить её наполнять и все это в облаке (модно/популярно/хайпово). Все прошло быстро, настройка виртуальной машины Ubuntu 18, установка PostgreSQL 10, создание схем/таблиц/пользователей/прав. В процессе решил не отказываться от хранения файлового архива, а параллельно записывать и в файл и в бд.

Все настроено — данные копятся (на данный момент, в погодной таблице 6.5 млн строк).

Я очень люблю всякие визуализации и с момента появления первых данных с метеостанции всегда хотел иметь приятную глазу картинку. Были разные варианты, но я не силен во фронтэнде, чтобы делать хоть какую-нибудь красоту🤷‍♂️. Не так давно попалась мне статья про дашборды с помощью google таблиц и тут я решил совместить приятное с полезным: SQL + python + Google Sheets.

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

  • SQL запрос, который формирует поминутные данные скользящих средних (окно около 3 минут) температуры, влажности, давления, скорости ветра и порывов ветра (максимальная скорость за 15 минут) и радиационный фон
  • python скрипт, который подключается к бд, выполняет запрос, осуществляет необходимую предобработку данных для google таблиц и апдейтит данные в нужном листе goolge таблиц
  • cron запускает python скрипт раз в 5 минут

Внешний вид дашборда (показатели и график температуры)

Там еще давление и скорость ветра с порывами есть, заходите

Weather Dashboard

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

 948   6 мес   #dashboard   #data   #google   #python   #weather

Data-view 2.0

...начало

Лето 2018. Анализ данных в R. Часть 1, Анализ данных в R. Часть 2
Осень 2018. Основы статистики. Часть 1, 2 и ... ну 3 не было, пока!

Кому-то эти курсы на stepik.org будут знакомы, кто-то проходит их сейчас, кто-то прошел давно, почти классика. В общем много было прочитано, просмотрено и изучено.
В апреле-мае 2019 курс «Введение в машинное обучение» окончательно дал понять, что тема da/ds/ml мне очень интересна. Процесс глобального поиска ресурсов по интересующим темам привел в Яндекс.Практикум https://praktikum.yandex.ru.

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

...модуль

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

  • размерность
  • кол-во пропусков
  • дубликаты
  • описательные статистики
  • ...

В какой-то момент мне надоело писать это в ручную и была предпринята попытка написать парочку функций, чтобы автоматизировать этот процесс. Сие увлекательное занятие привело к написанию великолепной функции view. Из-за особенностей jupyter, в котором мы работали, ставить свои пакеты было не выгодно, они могли самоизолироваться при перезагрузке сервера, поэтому в проектах приходилось работать сочетанием клавиш Ctrl-C/Ctrl-V.
А для себя решил написать модуль и оформить его в виде пакета, чтобы можно было устанавливать на любой машине.

О, дивный новый мир git/github/pypi — освоили, запушили. И вот пакет data-view готов к употреблению!
Текущая версия 0.2.0 умеет:

  • совместный вывод head() + tail()
  • вывод метода info()
  • вывод метода describe()
  • кол-во дубликатов
  • кол-во пропусков в данных (кол-во пропущенных значений и процент от общего кол-ва), выделенных цветовым градиентом
  • гистограмма для каждого числового признака
  • топ-5 значений для категориальных признаков
  • матрица корреляций
  • топ-5 пар с наибольшей корреляцией

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

Вся красота устанавливается привычным образом

pip3 install data-view

Красивый пример найдете здесь https://github.com/urevoleg/data-view

А я расскажу вам о естественных курьезах.

Если у вас многоколоночные данные и все данные числовые (например более 15 столбцов), то вот такую красоту вы увидите на гистограммах👇

Чертовски приятно, что работает, но сплошной винегрет)))

Порой можно получить разъезжающееся info()

ps: если кто-то знает как решить, буду благодарен)

Если уникальных элементов более 5, то группировки вы не увидите

...планы

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

  • pandas_profiling
  • autoEDA
  • holoviews
  • bamboolib (вообще шикарная штука😃)

Но какие-то показались мне громоздкими, где-то есть много лишнего, bamboolib, например очень интересная и прикольно-интерактивная, но вот рука как-то не тянется к ее использованию. Для себя хотелось чего-то простого, без наворотов, самого простого, реализовал и пользуюсь, большего пока и не надо...

Хотя, как не надо, переписать все классами и пользоваться всеми их преимуществами! Ну это в следующей серии!

 815   7 мес   #analytics   #data   #github   #python