Python для начинающих
1.06K subscribers
280 photos
3 videos
232 files
61 links
Python для начинающих
Download Telegram
Быстрая обработка гигантских наборов данных с использованием библиотеки Vaex.
🚀 Быстрая обработка гигантских наборов данных с использованием библиотеки Vaex

Обработка миллионов строк данных за секунды — звучит как фантастика? Для pandas — возможно, но не факт. А вот для Vaex — это его стихия. В этом посте я расскажу о том, как справляться с большими объёмами данных с помощью библиотеки Vaex — легковесного и ультрабыстрого инструмента для анализа данных на Python.

🧠 Что такое Vaex?

Vaex — это библиотека для обработки больших табличных данных, созданная с фокусом на производительность. В отличие от pandas, она использует ленивые вычисления (lazy evaluation), memory-mapping и мультиядерные вычисления для обработки данных в десятки раз быстрее. Миллионы строк? Подумаешь. Даже миллиард — не предел.

Вот ключевые фишки Vaex:
- Обработка данных, которые не помещаются в оперативную память.
- Поддержка ленивых операций (т.е. ничего не считается до тех пор, пока не попросишь).
- Использование zero-copy memory access — данные читаются прямо с диска без загрузки в RAM.
- Интеграция с файловыми форматами Arrow, HDF5 и Parquet.

📦 Установка

Устанавливаем библиотеку:

pip install vaex


🚀 Быстрый старт

Допустим, у нас есть CSV-файл с 50 миллионами строк. Попробуем прочитать его и посмотреть средние значения по колонке:

import vaex

# Быстрая загрузка большого файла
df = vaex.from_csv('big_data.csv', convert=True, chunk_size=5_000_000)

# Просмотр первых строк, как в pandas
print(df.head())

# Вычисление средней температуры, к примеру
mean_temp = df['temperature'].mean()
print(f"Mean temperature: {mean_temp}")


Метод from_csv с параметром convert=True один раз конвертирует CSV в более быстрый бинарный формат Arrow/HDF5, чтобы в будущем грузиться мгновенно.

🧪 Где быстрее, чем в pandas?

Vaex особенно хорош для агрегаций и фильтраций. Сравним простую агрегацию:

# Средняя цена по категориям
df.groupby('category', agg={'avg_price': vaex.agg.mean('price')})


Огромный набор категорий и десятки миллионов цен — Vaex справляется без напряжения.

🎯 Фильтрация на лету

Vaex не гонит весь датафрейм через фильтры. Он выполняет их лениво, максимально эффективно:

# Отфильтруем дорогие продукты
df_filtered = df[df.price > 1000]

# Считаем средний рейтинг у дорогих товаров
print(df_filtered['rating'].mean())


🔥 Визуализация огромных данных

Vaex умеет делать биннинг (разбиение по диапазонам), что особенно полезно при визуализации плотных scatter-плотов:

df.plot(df.x, df.y, f='log1p', shape=512)


Да, прямо так. Интерактивное, быстрое, работает на миллионах точек.

📁 Разделение и экспорт

Вы можете экспортировать уже отфильтрованные или агрегированные данные обратно в Parquet или CSV:

df_filtered.export_parquet('filtered_data.parquet')


🧩 Vaex против pandas

Время выполнения задачи агрегации в pandas: десятки секунд или даже минуты (и возможный MemoryError). В Vaex — доли секунды. И не нужно думать, достаточно ли у тебя оперативки.

📌 Используй тогда, когда:

- Твои данные занимают десятки или сотни ГБ
- pandas падает с ошибками памяти
- Требуется быстрая агрегация, фильтрация, группировка
- Нужно делать всё это без громоздких кластеров Spark/Dask

Вывод

Vaex — отличный инструмент, когда речь идёт о больших объемах данных и важна скорость. Он не заменяет pandas как основной инструмент работы с данными, но для heavy-duty аналитики — просто must-have. Попробуй использовать его в своём следующем дата-проекте — и удивишься, насколько это быстро.
👍1
Как выстраивать непрерывную интеграцию и доставку (CI/CD) для Python проектов.
🚀 Как выстраивать непрерывную интеграцию и доставку (CI/CD) для Python-проектов

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

Что такое CI/CD?

- Continuous Integration (CI) — это процесс автоматической сборки и проверки кода при каждом коммите.
- Continuous Delivery (CD) — автоматическая доставка протестированного кода в staging или даже production.

Вместе они превращают “внезапный релиз” в “предсказуемое событие”.

Платформы: GitHub Actions, GitLab CI, CircleCI и др. Мы разберем GitHub Actions — мощный и удобный инструмент, прямо внутри GitHub.

📦 Структура Python-проекта

Типовая структура проекта:

my_project/
├── app/
│ └── main.py
├── tests/
│ └── test_main.py
├── requirements.txt
└── .github/
└── workflows/
└── ci.yml


Файл ci.yml — сердце нашего процесса CI.

🔧 Простой CI pipeline (GitHub Actions)

name: Python CI

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]

jobs:
test:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt

- name: Run tests
run: |
pytest tests/


Что происходит:
- Workflow запускается на push или pull request в ветку main.
- На виртуальной машине ставится Python.
- Устанавливаются зависимости.
- Запускаются тесты с помощью pytest.

🛠️ Добавляем Code Quality: linters

Проверка стиля важна не меньше тестов.

    - name: Run linter
run: |
pip install flake8
flake8 app/


Ошибка форматирования — fail pipeline. Чистота — залог стабильности.

🚢 Непрерывная доставка: CD

Допустим, у нас есть staging-сервер и GitHub уже подключен к нему через секреты (например, SSH-ключ, API token и т.д.). Ниже пример, как можно деплоить через SCP:

  deploy:
needs: test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'

steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Deploy via SCP
run: scp -r ./app user@staging-host:/app-folder
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}


Реализация зависит от вашего хостинга. Можно использовать Docker, Heroku, DigitalOcean, AWS — что угодно.

🔥 Бонус: кэш зависимостей

Чтобы ускорить pipeline:

    - name: Cache pip
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-


При повторном запуске зависимости не будут скачиваться заново — экономим минуты и нервы.

🎯 Вывод

CI/CD превращает ваш Python-проект из “хаоса” в “машину”, где каждый коммит — шаг вперед, а не на грабли. Даже простая автоматизация сборки и тестов — огромный шаг к качеству и стабильности. Начните с малого, добавляйте шаг за шагом. Пусть ваш код работает, пока вы спите!
Использование библиотеки dash для создания интерактивных веб-приложений.
Если вы когда-нибудь задумывались, как превратить скрипт на Python в красивое и интерактивное веб-приложение, не вникая в HTML, CSS и JavaScript, то библиотека Dash — это то, что вам нужно. Она позволяет собирать интерактивные сайты с панелями управления (dashboards), графиками и формами буквально из нескольких строчек кода. Всё, что нужно — знание Python и немного фантазии.

Dash создана разработчиками Plotly, и в её основе — Flask, React.js и Plotly.js. Однако всё это скрыто за удобным API, который говорит с вами исключительно на Python.

Начнём с простого примера:

📦 Установка:

pip install dash


📈 Минимальное приложение:

import dash
from dash import html

app = dash.Dash(__name__)

app.layout = html.Div([
html.H1("Hello, Dash!"),
html.P("Build interactive web apps with pure Python.")
])

if __name__ == '__main__':
app.run_server(debug=True)


После запуска откройте в браузере http://127.0.0.1:8050 — и увидите вашу первую HTML-страницу, сгенерированную Python-кодом.

Но Dash действительно раскрывает свой потенциал, когда вы интегрируете графику и взаимодействие.

🎯 Добавим графики с Plotly:

import dash
from dash import dcc, html
import plotly.express as px
import pandas as pd

df = px.data.iris()

fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species")

app = dash.Dash(__name__)

app.layout = html.Div(children=[
html.H1("Iris Data Visualization"),
dcc.Graph(
id='iris-graph',
figure=fig
)
])

if __name__ == '__main__':
app.run_server(debug=True)


Всё, что вы знали о графиках в Jupyter Notebook, теперь работает и в вебе. Идём дальше — добавим интерактивность.

🕹️ Используем callbacks:

from dash.dependencies import Input, Output

app.layout = html.Div([
dcc.Input(id='user-input', type='text', value='Dash', debounce=True),
html.H2(id='output')
])

@app.callback(
Output('output', 'children'),
Input('user-input', 'value')
)
def update_output(value):
return f'Hello, {value}!'


Теперь всё живое. Меняете текст — и приложение реагирует. Без JS и без боли. Это может быть input-поле, выпадающий список, слайдер и многое другое.

👨‍💻 Dash особенно полезен для аналитиков данных и инженеров, которым надо собрать визуальную панель или форму для управления расчётами, не отвлекаясь на фронтенд.

Бонус: всё, что вы делаете в Dash, может быть развёрнуто на любой платформе: от Heroku до Docker-контейнера.

📚 Полезно знать:

- dash.html — набор базовых HTML-компонентов
- dash.dcc — продвинутые компоненты: графики, слайдеры, dropdown
- @app.callback — магия, связывающая данные и визуал

Dash — это мост между анализом данных и веб-интерфейсом. Это Python-код, который оживает в браузере. Попробуйте — и удивитесь, как просто стало делать сложное.
👍1
Эффективная обработка JSON-LD данных с использованием библиотеки RDFLib.
Привет! Сегодня я расскажу тебе о том, как эффективно работать с JSON-LD в Python с помощью библиотеки RDFLib. Звучит академично? А на деле — это практичный инструмент, если ты хочешь работать с семантическими данными, структурированными знаниями и файлами, которые часто встречаются в современных API и открытых данных.

🎯 Немного теории: JSON-LD (JSON for Linking Data) — это способ сериализации Linked Data в формате JSON. Используется для представления семантической информации: описания сущностей, связей между ними и контекста. Обычно это можно встретить в open data от правительств, научных институтов, Википедии (через Wikidata) и в структурированных данных на сайтах.

А теперь самое интересное — практика.

📦 RDFLib — это мощная Python-библиотека для работы с RDF-графами. Она поддерживает различные форматы (Turtle, XML, JSON-LD и другие), позволяет парсить, сериализовать RDF и выполнять запросы SPARQL.

Установим библиотеку:

pip install rdflib


🛠️ Представим, что у нас есть следующий JSON-LD документ:

{
"@context": {
"name": "http://schema.org/name",
"homepage": { "@id": "http://schema.org/url", "@type": "@id" }
},
"@id": "http://example.org/person#me",
"name": "Ivan Petrov",
"homepage": "http://example.org/"
}


Давайте загрузим и обработаем его с помощью RDFLib:

from rdflib import Graph

jsonld_data = '''
{
"@context": {
"name": "http://schema.org/name",
"homepage": { "@id": "http://schema.org/url", "@type": "@id" }
},
"@id": "http://example.org/person#me",
"name": "Ivan Petrov",
"homepage": "http://example.org/"
}
'''

g = Graph()
g.parse(data=jsonld_data, format='json-ld')

for subj, pred, obj in g:
print(f"{subj} -- {pred} --> {obj}")


Вывод будет примерно такой:

http://example.org/person#me -- http://schema.org/url --> http://example.org/
http://example.org/person#me -- http://schema.org/name --> Ivan Petrov


🎯 Что здесь важно? RDFLib превращает JSON-LD в RDF-граф, с которым ты можешь работать с той же легкостью, что и с обычным Python-объектом.

🔍 Запросы к данным? Легко, с помощью SPARQL:

from rdflib.namespace import Namespace

SCHEMA = Namespace("http://schema.org/")

query = """
SELECT ?name
WHERE {
?person <http://schema.org/name> ?name .
}
"""

qres = g.query(query)

for row in qres:
print(row.name)


Вывод:

Ivan Petrov


Да, это похоже на SQL, только графовый стиль. Такой подход особенно хорошо себя проявляет, когда ты работаешь с большими онтологиями или данными из Wikidata.

💡 Совет: RDFLib поддерживает сериализацию обратно в JSON-LD, Turtle и другие форматы. То есть можно использовать её как конвертер:

print(g.serialize(format="json-ld", indent=2))


📌 Такой фреймворк делает Python удобной средой для работы с современными структурированными данными, где важны не только значения, но и связи между ними.

Надеюсь, теперь JSON-LD и RDFLib звучат не как абстрактные академические термины, а как инструменты, которые реально можно и нужно использовать. Experiment, explore, и пусть граф знаний будет с тобой!
2👍1
Как настраивать и использовать OAuth аутентификацию в Python-приложениях.
Если вы когда-либо хотели дать своим пользователям доступ к сервисам вроде Google, GitHub или Facebook, не заставляя их вбивать пароли — добро пожаловать в мир OAuth.

OAuth (Open Authorization) — это стандарт авторизации, который позволяет получать ограниченный доступ к защищённым ресурсам без передачи логина и пароля. Звучит круто? Ещё бы. И сегодня мы посмотрим, как реализовать OAuth-аутентификацию на Python, используя библиотеку Authlib — одна из самых простых и эффективных для этой задачи.

📦 Установка библиотек:

pip install Authlib Flask


Мы будем строить небольшой Flask-сервер, через который пользователь сможет авторизоваться через, например, GitHub.

⚙️ Базовая настройка Flask и OAuth-клиента

from flask import Flask, redirect, url_for, session
from authlib.integrations.flask_client import OAuth

app = Flask(__name__)
app.secret_key = 'your-secret-key'
oauth = OAuth(app)

github = oauth.register(
name='github',
client_id='GITHUB_CLIENT_ID',
client_secret='GITHUB_CLIENT_SECRET',
access_token_url='https://github.com/login/oauth/access_token',
authorize_url='https://github.com/login/oauth/authorize',
api_base_url='https://api.github.com/',
client_kwargs={'scope': 'user:email'},
)


Вам нужно будет взять значения client_id и client_secret в настройках своего GitHub OAuth-приложения.

🌐 Маршруты Flask:

@app.route('/')
def homepage():
return '<a href="/login">Login with GitHub</a>'

@app.route('/login')
def login():
redirect_uri = url_for('authorize', _external=True)
return github.authorize_redirect(redirect_uri)

@app.route('/authorize')
def authorize():
token = github.authorize_access_token()
resp = github.get('user', token=token)
user_info = resp.json()
session['user'] = user_info
return f"Hello, {user_info['login']}!"


🔐 Что происходит:

1. Пользователь заходит на /login.
2. Перебрасывается на страницу авторизации GitHub.
3. После логина возвращается на /authorize.
4. Приложение получает access token и может запрашивать данные.

Теперь, не зная паролей пользователей, мы получаем информацию о них. Максимально безопасно. А если access token протухнет — можно запросить новый, не беспокоя пользователя.

🧠 Полезный совет:

Храните client_id и client_secret не в коде, а в переменных окружения:

import os

client_id = os.getenv('GITHUB_CLIENT_ID')
client_secret = os.getenv('GITHUB_CLIENT_SECRET')


🔄 А если нужен другой провайдер? Просто поменяйте ссылки и scopes. Authlib поддерживает Google, Facebook, Twitter и даже кастомные OAuth-провайдеры.

В целом, настройка OAuth через Authlib не такая уж и страшная, как может показаться на первый взгляд. Зато какой уровень удобства и безопасности! Если ваше приложение хоть как-то связано с пользователями — OAuth точно стоит освоить.
Простейшие графические редакторы с использованием библиотеки tkinter.
🎨 Простейшие графические редакторы с использованием библиотеки tkinter

Каждому программисту когда-то хочется превратить консольную рутину во что-то более… зрелищное. Если вы только начинаете осваивать Python – отличной отправной точкой может стать создание собственного графического редактора с помощью tkinter, стандартной библиотеки GUI в Python.

Да-да, самый настоящий Paint в несколько десятков строк!

tkinter поставляется в комплекте с Python, так что ничего дополнительно устанавливать не нужно. Запускаем редактор – и рисуем прямо мышкой. Прекрасная демонстрация того, как события и интерактивность работают в Python.

Разберем базовую версию редактора — с возможностью рисования линий мышкой.

Вот простой пример:

import tkinter as tk

class SimplePaint:
def __init__(self, root):
self.root = root
self.root.title("Mini Paint")
self.canvas = tk.Canvas(root, bg="white", width=600, height=400)
self.canvas.pack(fill=tk.BOTH, expand=True)

self.last_x, self.last_y = None, None

self.canvas.bind("<Button-1>", self.start_draw)
self.canvas.bind("<B1-Motion>", self.draw_line)

def start_draw(self, event):
self.last_x, self.last_y = event.x, event.y

def draw_line(self, event):
x, y = event.x, event.y
self.canvas.create_line(self.last_x, self.last_y, x, y, fill="black", width=2)
self.last_x, self.last_y = x, y

root = tk.Tk()
app = SimplePaint(root)
root.mainloop()


Что здесь происходит:

- Мы создаем окно и холст (canvas), на котором можно рисовать.
- Событие <Button-1> (нажатие левой кнопки мыши) отслеживает начало рисования.
- <B1-Motion> ловит перемещения мыши при нажатой кнопке и соединяет координаты линиями.

Теперь добавим выбор цвета — немного разнообразия:

from tkinter.colorchooser import askcolor

def choose_color():
color = askcolor()[1]
if color:
app.current_color = color

color_btn = tk.Button(root, text="Color", command=choose_color)
color_btn.pack()


Добавим в класс:

self.current_color = "black"
...
self.canvas.create_line(self.last_x, self.last_y, x, y, fill=self.current_color, width=2)


Хотите очистить холст? Пожалуйста:

def clear_canvas():
app.canvas.delete("all")

clear_btn = tk.Button(root, text="Clear", command=clear_canvas)
clear_btn.pack()


В результате — у нас простенький редактор с выбором цвета и кнопкой очистки. Интересно? На основе такой базы можно реализовать:

- выбор толщины линии;
- сохранение в PNG (с помощью PIL);
- разные инструменты (овал, прямоугольник, ластик — да, просто белая линия!);
- undo/redo с помощью хранения команд;
- и даже распознавание фигур, если вы фанат ML.

tkinter — отличный способ перейти из мира print('Hello') в более наглядный и живой Python. Начните с мини-графредактора, а дальше — рамки только в вашем воображении.
Создание собственных графических эффектов для веб-приложений с помощью Python.
🎨 Создание собственных графических эффектов для веб-приложений с помощью Python

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

Начнём с основ: Pillow — это форк знаменитой библиотеки PIL (Python Imaging Library). Она позволяет создавать и редактировать изображения прямо на сервере. Например, вы можете генерировать карточки товаров, баннеры, визуальные паттерны, аватары или фоновые текстуры прямо в момент запроса.

Установка:

pip install pillow


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

from PIL import Image, ImageDraw
import random

width, height = 800, 400
image = Image.new("RGB", (width, height))
draw = ImageDraw.Draw(image)

for y in range(height):
color = (int(255 * (y / height)), 100, 200)
draw.line([(0, y), (width, y)], fill=color)

for _ in range(10000):
x = random.randint(0, width - 1)
y = random.randint(0, height - 1)
noise_color = (random.randint(200, 255), random.randint(200, 255), random.randint(200, 255))
image.putpixel((x, y), noise_color)

image.save("gradient_noise.png")


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

Теперь представим, что вы хотите добавить эффект текста с тенью:

from PIL import ImageFont

font = ImageFont.truetype("arial.ttf", 48)
text = "Hello, Web!"

draw.text((52, 152), text, font=font, fill=(0,0,0)) # Shadow
draw.text((50, 150), text, font=font, fill=(255,255,255)) # Main text


Вы можете встроить это изображение прямо в ваше веб-приложение на Flask:

from flask import Flask, send_file
import io

app = Flask(__name__)

@app.route("/banner")
def banner():
img = Image.new("RGB", (600, 200), color=(30, 30, 30))
draw = ImageDraw.Draw(img)
draw.text((50, 80), "Welcome!", fill=(255, 255, 255))
buf = io.BytesIO()
img.save(buf, format="PNG")
buf.seek(0)
return send_file(buf, mimetype='image/png')


Этот эндпоинт отдаёт сгенерированное изображение при каждом запросе. Можно играться с параметрами URL (например, передавать текст или цвет) и получать кастомизированные баннеры под каждого пользователя. Даже SVG или фильтры постобработки можно внедрять — хотя они больше подойдут для frontend'а, но и на сервере через библиотеки Cairo или Wand (обёртка ImageMagick) можно зажечь любую искру фантазии.

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

Такой подход идеально подойдёт для тех, кто хочет поднять визуальный уровень своего веб-приложения без тяжёлой артиллерии вроде Photoshop или Canvas API. А ведь это только начало.
👍1
Автоматизация ETL процессов с использованием Apache Nifi и Python.
Если вы работаете с данными, то, скорее всего, не раз сталкивались с необходимостью обрабатывать большие объемы информации: забирать файлы из хранилищ, преобразовывать их, фильтровать, грузить в базу данных. Весь этот процесс называется ETL — Extract, Transform, Load. И если делать его вручную — это скучно, ошибкоопасно и просто не масштабируется. А вот автоматизация… вот здесь всё действительно интересно.

Сегодня расскажу, как совместить мощную визуальную платформу Apache Nifi и Python-скрипты, чтобы создать эффективный, гибкий и надёжный ETL-пайплайн. Да, можно обойтись одним Python, но Nifi значительно упрощает потоковую обработку данных, а Python добавляет нужной гибкости.

🔧 Что такое Apache Nifi?

Это open-source инструмент от Apache для автоматической передачи и обработки данных в режиме реального времени. Работает через веб-интерфейс: «нажал, соединил, запустил». Поддерживает более 300 встроенных процессоров (загрузка FTP, HTTP, базы данных, фильтрация, устранение дубликатов и т.д.)

Теперь представьте: у вас есть CSV-файлы с данными, ежедневно падающие на удалённый сервер, и вам нужно:

- Скачивать их
- Преобразовывать
- Загружать в PostgreSQL

Разберём, как это сделать с помощью Apache Nifi и Python.

🛠 Пример пайплайна с Python-скриптом в Nifi

1. Используем процессор GetFile или ListFTP + FetchFile, чтобы забирать CSV.
2. Далее применим ExecuteScript — здесь встроим Python-обработчик CSV.
3. Последний шаг — PutDatabaseRecord для загрузки данных в базу.

💡 Пример Python-обработки CSV в ExecuteScript:

# Используется Jython (Python 2.7), встроенный в Nifi
import csv
import io
from org.apache.commons.io import IOUtils
from java.nio.charset import StandardCharsets

flow_file = session.get()
if flow_file is not None:
try:
content = IOUtils.toString(session.read(flow_file), StandardCharsets.UTF_8)
reader = csv.DictReader(io.StringIO(content))

transformed = []
for row in reader:
row['full_name'] = f"{row['first_name']} {row['last_name']}"
row['age'] = int(row['age'])
transformed.append(row)

output = io.StringIO()
writer = csv.DictWriter(output, fieldnames=transformed[0].keys())
writer.writeheader()
writer.writerows(transformed)

flow_file = session.write(flow_file, lambda out: out.write(output.getvalue().encode('utf-8')))
session.transfer(flow_file, REL_SUCCESS)
except Exception as e:
session.transfer(flow_file, REL_FAILURE)


⚠️ Важно: ExecuteScript использует Jython, где модулей вроде pandas нет, но для базовых трансформаций его хватает. Для более сложных случаев можно использовать ExecuteStreamCommand, передав управление вашему внешнему Python 3 скрипту.

🎯 Заключение

Apache Nifi позволяет «рисовать» ETL-пайплайны — быстро, надёжно, наглядно. Python, в свою очередь, расширяет возможности и точечно применим там, где встроенных средств Nifi не хватает. Вместе эти инструменты дают почти безграничную мощность в обработке данных. В следующем посте покажу, как подключить мониторинг и логирование пайплайна, чтобы спать спокойно.
Как интегрировать Machine Learning модели в мобильные приложения с Python.
Когда программисты слышат «машинное обучение» и «мобильные приложения» в одном предложении, у многих в голове сразу возникает вопрос: «А как это вообще возможно с Python?» Ведь Python — язык высокоуровневый, не самый быстрый, а приложения должны быть легкими и быстрыми! Но — спешу вас удивить — Python отлично подходит для подготовки и даже частичной интеграции моделей машинного обучения в мобильные приложения. Главное — грамотно подключить инструменты.

Сегодня разберём, как внедрить ML-модели, написанные на Python, в мобильное приложение: от обучения до запуска на смартфоне.

📦 Подготовка модели в Python

Нам понадобится scikit-learn, tensorflow или pytorch — выбор зависит от задачи. Допустим, мы хотим обучить простую модель для распознавания рукописных цифр с помощью TensorFlow.

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten

(x_train, y_train), (x_test, y_test) = mnist.load_data()

model = Sequential([
Flatten(input_shape=(28, 28)),
Dense(128, activation='relu'),
Dense(10, activation='softmax')
])

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)

model.save('mnist_model.h5')


Итак, модель обучена и сохранена. Но .h5 — не совсем мобильный формат. Дальше — оптимизация.

🔧 Конвертация модели для мобильного применения

В случае с TensorFlow используем TensorFlow Lite — формат, специально созданный для мобильных и встроенных устройств.

import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model('mnist_model.h5')
tflite_model = converter.convert()

with open('mnist_model.tflite', 'wb') as f:
f.write(tflite_model)


Теперь у нас есть файл mnist_model.tflite, который можно встроить в Android или iOS-приложение.

📱 Внедрение в Android-приложение

Если вы используете Android (например, пишете UI на Kotlin), то подключаете TensorFlow Lite через зависимость implementation "org.tensorflow:tensorflow-lite:2.x.y", кладёте .tflite файл в assets и вызываете модель прямо из Java/Kotlin-кода. Это уже не Python, но вся машинная логика осталась нашей.

А что если хочется Python'а и на уровне мобильного приложения? Есть выход — Kivy.

🐍 Kivy — Python на мобильных

Kivy позволяет создавать кроссплатформенные мобильные приложения на Python. С ML-моделями он тоже дружит, но есть нюанс: модели должны быть в легковесном формате, желательно .tflite или сериализованные NumPy-объекты.

Пример сопровождения модели в Kivy:

import numpy as np
import tensorflow as tf
from kivy.app import App
from kivy.uix.label import Label

class MLApp(App):
def build(self):
interpreter = tf.lite.Interpreter(model_path="mnist_model.tflite")
interpreter.allocate_tensors()

input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

# dummy input
input_data = np.random.rand(1, 28, 28).astype(np.float32)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
prediction = interpreter.get_tensor(output_details[0]['index'])

return Label(text=f'Prediction: {np.argmax(prediction)}')

MLApp().run()


Запустить такой код можно на Android, если собрать приложение используя buildozer.

🎯 Итог

Python отлично подходит для подготовки и оптимизации ML-моделей. После этого вы можете:

- Преобразовать модель в tflite и встроить её в нативные Android/iOS-приложения;
- Использовать фреймворки (Kivy, BeeWare) для написания мобильных приложений на Python с ML;
- Или же организовать backend на Flask/FastAPI, а мобильное приложение будет слать туда запросы (но это уже другая история).

Так что, машинное обучение и мобильная разработка — совместимы. А Python — это не только про расчёты, но и про реальные приложения прямо в ваших карманах.
Работа с сериями изображений с использованием библиотеки scikit-image.
🎨 Работа с сериями изображений в Python с помощью scikit-image

Python — незаменимый инструмент для обработки изображений. Когда дело доходит до работы с несколькими изображениями — будь то слайд-шоу, кадры с камеры или серия снимков для ML-проекта — нам нужно что-то мощное и удобное. И тут на сцену выходит scikit-image.

Scikit-image — это библиотека на базе NumPy, предназначенная для обработки изображений. Она умеет всё: от базовой фильтрации до сложного анализа форм и объектов. А ещё — она умеет работать с сериями изображений.

📦 Установка:

Если вы ещё не установили библиотеку:

pip install scikit-image


🔍 Загрузка серии изображений

Допустим, у вас есть папка с изображениями .png или .jpg. Вместо того чтобы грузить каждое вручную, используем skimage.io.imread_collection.

from skimage.io import imread_collection

images = imread_collection('images/*.png') # Загружаем все .png из папки images


Теперь images — это коллекция, с которой можно обращаться как со списком. Например, images[0] — первое изображение, а len(images) — общее количество.

🛠️ Обработка серии

Допустим, вы хотите перевести все кадры в оттенки серого. Можно использовать skimage.color.rgb2gray:

from skimage.color import rgb2gray

gray_images = [rgb2gray(img) for img in images]


Хотите применить фильтр Гаусса ко всем изображениям?

from skimage.filters import gaussian

blurred = [gaussian(img, sigma=1) for img in gray_images]


📊 Построим гистограммы яркости

Иногда нужно проанализировать распределение яркости в серии. Используем skimage.exposure.histogram:

from skimage.exposure import histogram
import matplotlib.pyplot as plt

for i, img in enumerate(gray_images[:3]):
hist, hist_centers = histogram(img)
plt.plot(hist_centers, hist, label=f'Image {i}')

plt.legend()
plt.title("Brightness histograms")
plt.show()


🎞️ Построение таймлапса

Допустим, вы обработали серию и теперь хотите сохранить новую последовательность:

from skimage.io import imsave
import os

output_dir = 'processed'

if not os.path.exists(output_dir):
os.makedirs(output_dir)

for i, img in enumerate(blurred):
imsave(f'{output_dir}/frame_{i:03d}.png', img)


🧠 Идеи для практики:

- Сделайте маску объектов на каждом кадре с помощью skimage.filters.threshold_otsu.
- Выделите контуры с skimage.feature.canny.
- Сравните движение объектов между изображениями.

Scikit-image — настоящий швейцарский нож в мире изображений. Он понятен, лаконичен и отлично дружит с NumPy. Работать с сериями изображений с его помощью — одно удовольствие, а возможности практически безграничны.