Python для начинающих
1.06K subscribers
285 photos
3 videos
232 files
61 links
Python для начинающих
Download Telegram
Привет! Сегодня поговорим о том, как с помощью Python и библиотеки OpenCV сделать собственное приложение для черепичной сшивки изображений (image tiling & stitching). Эта задача особенно актуальна в сфере обработки спутниковых снимков, работы с изображениями высокой чёткости или при создании панорам.

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



Что такое черепичная сшивка?

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

1. Найти ключевые точки (keypoints) в каждом изображении.
2. Сопоставить соответствующие точки между изображениями.
3. Посчитать матрицу преобразования (гомографию).
4. Трансформировать изображения и сшить в финальную панораму.

Теперь перейдем к коду.

Первым делом, необходимые модули:

import cv2
import numpy as np


Теперь загрузим два изображения:

image_1 = cv2.imread("tile_left.jpg")
image_2 = cv2.imread("tile_right.jpg")


Далее — извлечение ключевых точек и дескрипторов с помощью ORB:

orb = cv2.ORB_create(nfeatures=2000)

kp1, des1 = orb.detectAndCompute(image_1, None)
kp2, des2 = orb.detectAndCompute(image_2, None)


Для поиска совпадений используем BFMatcher:

bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)


Отфильтруем и найдем гомографию:

src_pts = np.float32([kp1[m.queryIdx].pt for m in matches[:50]]).reshape(-1,1,2)
dst_pts = np.float32([kp2[m.trainIdx].pt for m in matches[:50]]).reshape(-1,1,2)

H, mask = cv2.findHomography(dst_pts, src_pts, cv2.RANSAC, 5.0)


И наконец — применим гомографию и объединим изображения:

height, width = image_1.shape[:2]
image_2_warped = cv2.warpPerspective(image_2, H, (width * 2, height))
image_2_warped[0:height, 0:width] = image_1

cv2.imwrite("stitched_output.jpg", image_2_warped)




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

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

Бонус: если изображения GRID-подобные (например, каждая плитка — квадрат одной мозаики), можно автоматизировать позиции сшивки заранее, что даст прирост скорости. А если вы работаете с гигабайтными изображениями — добавьте Pillow или Dask для потоковой обработки.

С OpenCV и всего сотней строк кода на Python вы можете превратить десятки скучных фрагментов в полноценную мозаику мира.
Введение в web scraping с использованием библиотек Scrapy и Selenium
Введение в web scraping с использованием библиотек Scrapy и Selenium
🏗 Введение в web scraping с использованием Scrapy и Selenium

Собирать данные с сайтов — это почти как добывать золото: кто вовремя начал, тот и нашёл сокровища. Web scraping позволяет автоматизировать сбор информации с сайтов, и в Python для этого есть мощные инструменты. Сегодня мы взглянем на два самых популярных — Scrapy и Selenium.

📌 Scrapy: паук, который знает, куда ползти

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

Установка:

pip install scrapy


Как выглядит простейший Scrapy-паук:

import scrapy

class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = ["http://quotes.toscrape.com/"]

def parse(self, response):
for quote in response.css("div.quote"):
yield {
"text": quote.css("span.text::text").get(),
"author": quote.css("small.author::text").get(),
}


Запуск:

scrapy runspider quotes_spider.py -o quotes.json


Scrapy быстро, удобно и экономно вытянет нужные данные из HTML — пока сайт не вставляет всё содержимое с помощью JavaScript. Тогда на сцену выходит Selenium.

🚘 Selenium: браузерный пилот-робот

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

Установка:

pip install selenium


Пример: как с помощью Selenium вытащить цитаты со страницы с динамическим контентом:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time

options = Options()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)

driver.get("http://quotes.toscrape.com/js/")
time.sleep(2) # подождём, пока JS подгрузит контент

quotes = driver.find_elements(By.CLASS_NAME, "quote")
for q in quotes:
text = q.find_element(By.CLASS_NAME, "text").text
author = q.find_element(By.CLASS_NAME, "author").text
print({"text": text, "author": author})

driver.quit()


🔥 Scrapy против Selenium

| Характеристика | Scrapy | Selenium |
|----------------------|-------------------------------|-------------------------|
| Скорость | Высокая (асинхронная) | Низкая (имитирует браузер) |
| Поддержка JS | Нет | Да |
| Использование памяти | Экономное | Тяжёлое |
| Удобство отладки | Лучше для парсинга | Лучше для автотестов и сложной логики |

🧩 Идеальный сценарий — совмещать: использовать Selenium для получения HTML со сложных JS-страниц, а дальнейший парсинг делать с помощью Scrapy или BeautifulSoup.

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

Следите за "золотыми правилами" scraping-а: соблюдайте robots.txt, не перегружайте сервер запросами, и, конечно, уважайте условия использования сайта.

В следующем посте мы разберём, как Scrapy можно расширять — добавим логин на сайт и парсинг нескольких уровней ссылок.
👍3🤩1
Как соединять различные веб-сервисы с помощью Apache Camel и Python
Как соединять различные веб-сервисы с помощью Apache Camel и Python
📡 Как соединять различные веб-сервисы с помощью Apache Camel и Python

Иногда программы требуют больше, чем просто «считать файл» или «отправить e-mail». Представим ситуацию: у вас есть Python-приложение, сервис на REST API, очередь сообщений RabbitMQ и какой-нибудь FTP-сервер. Все эти элементы нужно интегрировать в единый рабочий поток. Здесь на сцену выходит Apache Camel — не самый известный герой в мире Python, но крайне мощный, если знать, как с ним работать.

Что такое Apache Camel?
Это интеграционный фреймворк на Java, который позволяет соединять разные системы по принципу "роутеров". Основная идея: определить маршрут (route), по которому сообщение будет двигаться от источника к получателю, проходя через возможные трансформации и фильтры. Camel — это своего рода логист при передаче данных между сервисами.

Какой же тут Python?
Прямой интеграции нет — но Camel поддерживает REST, WebSocket, JMS, Kafka, FTP и десятки других компонентов. А на стороне Python — всё, что угодно (Flask, aiohttp, pika, requests, pandas). Нам достаточно определить логичный интерфейс взаимодействия. Обычно — это REST API или очередь сообщений.

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

🧩 Интеграция:

- Camel забирает данные с внешнего OpenWeather API (через HTTP).
- Camel отправляет POST-запрос на Python REST-сервис для анализа.
- Camel получает ответ и публикует сообщение в Telegram через HTTP.

🎯 Пример маршрутного файла Apache Camel (route.xml):

<routes xmlns="http://camel.apache.org/schema/spring">
<route id="weather-to-telegram">
<from uri="timer://weatherTimer?fixedRate=true&period=60000"/>
<setHeader headerName="CamelHttpMethod">
<constant>GET</constant>
</setHeader>
<to uri="https://api.openweathermap.org/data/2.5/weather?q=London&amp;appid=YOUR_API_KEY"/>
<to uri="http4://localhost:5000/analyze_weather"/>
<to uri="https://api.telegram.org/botYOUR_BOT_TOKEN/sendMessage?chat_id=YOUR_CHAT_ID"/>
</route>
</routes>


Здесь три простой цепочки: таймер (каждую минуту), вызов погоды, отправка на Python, результат — в Telegram.

🧠 Python Flask-приложение, которое анализирует погоду:

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/analyze_weather', methods=['POST'])
def analyze_weather():
data = request.get_json()
temp = data.get('main', {}).get('temp', 0)
message = ""
if temp < 273:
message = "❄️ Холодно! Одевайтесь теплее."
elif temp > 298:
message = "🔥 Жарковато! Не забудьте воду."
else:
message = "🌤️ Погода норм, можно гулять."
return jsonify({'text': message})

if __name__ == '__main__':
app.run(port=5000)


Camel сам отправит в наш сервис JSON с погодой. Наш Python-анализатор вернёт сообщение, и Camel сразу бросит его в Telegram.

⚙️ Почему такой подход удобен?

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

🧪 Альтернатива — писать всё в Python вручную. Но тогда мы получим связку requests, sched, threading, json, urllib, time, и это быстро обернётся технодолгом.

🛠 Заключение

Apache Camel + Python — отличная связка для микросервисной интеграции. Camel решает задачу маршрутизации и оркестрации данных, Python — реализует «ум» бизнес-логики. Пускай Camel и из мира Java, но он отлично дрессируется даже под сценарии с Flask, FastAPI, Celery и другими Python-инструментами. Главное — понимать, где проходят границы ответственности.
👍1
Работа с облачными хранилищами данных и аналитикой с помощью Python.
Если вы не живёте в пещере, то наверняка сталкивались с "облаками": Google Drive, Dropbox, Amazon S3 и другие — это то место, куда современные приложения сбрасывают гигигабайты данных, чтобы потом что-то с ними делать. Сегодня мы поговорим, как Python помогает не только достучаться до облака, но и прокачать аналитические навыки при помощи этих данных.

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

Начнем с самого популярного хранилища — Amazon S3. Библиотека boto3 позволяет удобно и быстро взаимодействовать с ним:

import boto3

s3 = boto3.client('s3')
s3.download_file('my-bucket', 'sales/q1_report.csv', 'q1_report.csv')


После скачивания данных — аналитика. Pandas и Matplotlib — наши верные помощники:

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('q1_report.csv')
summary = df.groupby('region')['sales'].sum()

summary.plot(kind='bar')
plt.title('Sales by Region - Q1')
plt.tight_layout()
plt.savefig('q1_summary.png')


Теперь результат — обратно в облако:

s3.upload_file('q1_summary.png', 'my-bucket', 'reports/q1_summary.png')


Если вы работаете с Google Drive — удобней всего использовать библиотеку pydrive или Google API. С Dropbox — dropbox SDK. Вот пример, как загрузить файл в Dropbox:

import dropbox

dbx = dropbox.Dropbox('YOUR_ACCESS_TOKEN')
with open('q1_summary.png', 'rb') as f:
dbx.files_upload(f.read(), '/reports/q1_summary.png', mode=dropbox.files.WriteMode.overwrite)


И да, облака — это не только про хранение. Google BigQuery и Amazon Redshift позволяют выполнять SQL-запросы к огромным объемам данных. Попробуем подключиться к BigQuery через pandas-gbq:

from pandas_gbq import read_gbq

query = """
SELECT region, SUM(sales) as total_sales
FROM `project.dataset.sales_data`
GROUP BY region
"""
df = read_gbq(query, project_id='your-project-id')
print(df.head())


Секунды — и у вас на руках сводка за год по всем регионам. Всё это без скачивания гигабайт данных.

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

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

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

🧠 Что такое "навык"?
Навык (skill) — это модуль, который расширяет функциональность голосового ассистента. Например, навык "напомни покормить кота" или "включи успокаивающую музыку" — это код, который получает запрос от пользователя, обрабатывает его и отдает результат в естественном языке.

🎯 Где применимо?
Самые популярные платформы — это Amazon Alexa, Google Assistant и Mycroft AI. Первые две требуют сторонних SDK и облачных сервисов, а вот Mycroft — open-source и идеален для хобби-проектов. Именно на нем и сосредоточимся.

🔧 Установка Mycroft и разработка навыка
Mycroft — это система на Python, легко разворачивается на Linux, Raspberry Pi или в Docker. Навыки для него пишутся с использованием Mycroft Skill SDK.

Проще всего начать с шаблона. Установи SDK:

git clone https://github.com/MycroftAI/mycroft-skills-kit
cd mycroft-skills-kit
./msk create


Тебя проведут по созданию скелета навыка. После этого появится директория с Python-файлом, который выглядит примерно так:

from mycroft import MycroftSkill, intent_file_handler

class CatFeederSkill(MycroftSkill):
def __init__(self):
super().__init__()

@intent_file_handler('feed.cat.intent')
def handle_feed_cat(self, message):
self.speak('Don\'t forget to feed the cat!')


📝 Что здесь происходит?
- Мы унаследовали класс MycroftSkill, переопределили инициализацию
- Через декоратор @intent_file_handler мы связали фразу "feed the cat" с функцией
- self.speak() — это то, что прозвучит в ответ

Чтобы навык заработал, нужно отдельно указать список ключевых фраз, запускающих его. В файле vocab/en-us/feed.cat.intent пишем, например:

feed the cat
remind me to feed the cat


💥 Расширяем: подключаем API
Допустим, мы хотим, чтобы навык узнавал, какое сейчас время кормления, из Google Calendar. Используем библиотеку google-api-python-client.

Установим:

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib


(Подразумевается, что вы уже получили доступ к календарю через OAuth 2.0).

Пример запроса к API:

from googleapiclient.discovery import build

def get_next_feeding_event():
service = build('calendar', 'v3', credentials=creds)
now = datetime.utcnow().isoformat() + 'Z'
events_result = service.events().list(calendarId='primary', timeMin=now,
maxResults=1, singleEvents=True,
orderBy='startTime').execute()
events = events_result.get('items', [])
if events:
return events[0]['start'].get('dateTime', 'No dateTime')
return 'No upcoming events'


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

🧪 Тестирование
Тестировать можно через терминал или же загрузить навык на устройство с Mycroft. Есть поддержка логирования и горячей перезагрузки.

🚀 Заключение
Создание голосовых навыков — это не только шаг в мир ИИ, но и реальная возможность автоматизировать повседневность. Python делает это просто: минимум кода, максимум смысла. Хотите умного помощника? Начните с одной команды — а закончите персональным ИИ-дворецким.
1
Как использовать библиотеки для автоматического тестирования веб-приложений.
🔥 Как использовать библиотеки для автоматического тестирования веб-приложений

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

Да, автоматизация тестирования — это не только для корпораций с огромным QA-отделом. Даже если ты пишешь свой первый сайт на Flask — запускать тесты «по кнопке» и быть уверенным, что ничего не сломано после очередного коммита — бесценно.

Давайте рассмотрим две популярные библиотеки: Selenium и pytest, плюс кратко затронем requests и BeautifulSoup для API и контентных проверок.

🎯 Selenium — когда надо кликать мышкой и вводить текст

Selenium позволяет имитировать поведение пользователя в браузере: запустить сайт, заполнить поля, нажать кнопки и проверить, как всё работает. Вот простой пример с использованием Chrome WebDriver:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://example.com/login")

username_input = driver.find_element(By.NAME, "username")
password_input = driver.find_element(By.NAME, "password")

username_input.send_keys("test_user")
password_input.send_keys("secure_pass")
password_input.send_keys(Keys.RETURN)

assert "Dashboard" in driver.title
driver.quit()


Этот код удобно запускать в рамках pytest или unittest. Selenium особенно полезен, когда нужно протестировать интерфейс, JavaScript и формы.

🤖 Pytest — быстрые и читаемые тесты

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

Пример интеграции с requests для проверки REST API:

import requests

def test_api_status():
response = requests.get("https://api.example.com/status")
assert response.status_code == 200

def test_login_api():
data = {"username": "test_user", "password": "secure_pass"}
response = requests.post("https://api.example.com/login", json=data)
assert response.json().get("token") is not None


Иногда этого достаточно — особенно если ты делаешь SPA с разделённым backend.

🍜 Bonus: BeautifulSoup для проверки содержимого

Допустим, приходит HTML, и хочется убедиться, что нужный блок отрисовался:

from bs4 import BeautifulSoup

html = "<html><body><div id='welcome'>Hello, test_user!</div></body></html>"
soup = BeautifulSoup(html, "html.parser")
welcome_div = soup.find("div", id="welcome")
assert welcome_div.text == "Hello, test_user!"


Не затыкай нос — HTML можно парсить, не страдая.

📦 Как собрать вместе?

Обычно автоматика выглядит так: ты пишешь тесты на pytest, которые используют библиотеки вроде requests для API и selenium для UI. Запуск происходит через команду:

pytest tests/


Или, если хочется сборку в CI/CD — используется GitHub Actions или GitLab CI. Всё по-взрослому.

Итог

Автоматизированное тестирование — это не роскошь. Это важный инструмент, который экономит время и нервы. Python предоставляет для этого весь необходимый инструментарий: от selenium до requests и pytest. Начни с простого, а потом постепенно автоматизируй всё, что можно.

Тестируй умно — пиши код с уверенностью.
Быстрая обработка гигантских наборов данных с использованием библиотеки 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