Визуализация и контроль
Наглядное представление данных — задача, которую ежедневно решают питонисты из самых разных областей науки: от экономики до биологии. Сегодня поговорим про инструменты визуализации и поделимся полезными трюками языка.
Управляем компьютером через Telegram
Вместо разминки начнём с удалённого управления. Первым на ум приходит, разумеется, TeamViewer. Системные администраторы постарше вспомнят про Radmin, к созданию которого приложил руку наш DevRel Григорий Петров. Любители экзотики обязательно упомянут NoMachine, позволяющий вытворять немыслимые штуки, такие как управление современной macOS на Μ1 с хоста на Windows XP x32.
В большинстве своём эти приложения обладают избыточными возможностями. Если надо сделать что-либо простое, например, заблокировать экран, снять скриншот или отправить компьютер в перезагрузку, то проще написать собственную серверную часть на Python. Вместо клиента можно использовать мессенджер Telegram.
В код сразу вызовем нужные библиотеки:
from telegram.ext import *
from telegram import KeyboardButton, ReplyKeyboardMarkup
from mss import mss # Для снятия скриншотов
import tempfile
import os
import psutil # Вывод списка процессов и возможность управления ими
import ctypes # Блокирование экрана
import webbrowser # Для открытия веб-сайтов
import pyperclip # Доступ к буферу обмена
import subprocess # Выполнение консольных команд
import json
Отдельно отметим telegram.ext — шикарный дополнительный модуль, расширяющий возможности стандартного бота для Telegram. Далее создаём бота через аккаунт BotFather и получаем API-токен.
Общение с любым ботом в Telegram начинается с команды /start. Собственно, для отправки чего-либо, надо знать токен и ID-чата.
class telegramBOT:
def __init__(self):
f = open('auth.json')
auth = json.load(f)
self.TOKEN = auth["TOKEN"]
self.CHAT_ID = auth["CHAT_ID"]
Теперь формируем главное меню:
def start_command(self, update, context):
buttons = [[KeyboardButton("⚠ Screen status")], [KeyboardButton("🔒 Lock screen")], [KeyboardButton("📸 Take screenshot")],
[KeyboardButton("✂ Paste clipboard")], [KeyboardButton(
"📄 List process")], [KeyboardButton("💤 Sleep")],
[KeyboardButton("💡 More commands")]]
context.bot.send_message(
chat_id=self.CHAT_ID, text="I will do what you command.", reply_markup=ReplyKeyboardMarkup(buttons))
Из всех возможностей настроить «интерфейс» только смайлики — с ними вы быстрее найдёте нужные функции, да и мессенджер их корректно воспринимает.
Далее нужно будет создать код для каждого элемента меню. Здесь можно импровизировать или же заглянуть в оригинальную статью Control your Windows computer using Telegram.
Seaborn для красивых графиков
Везде есть место искусству, даже если стоит скучная задача построить пару графиков из статистических данных. Делимся секретом — крутая библиотека Seaborn для стильных графиков. Она уже заслужила любовь специалистов по анализу данных.
Основа библиотеки — matplotlib, а также она использует numpy и pandas.
Seaborn даёт более простой вариант построения графиков, чем matplotlib и имеет несколько уникальных фич. Прежде всего, это прямая визуализация объектов dataframe из pandas. В комплекте с seaborn идёт набор встроенных датасетов, которые можно использовать прямо из кода. Прекрасная возможность понять, как будет выглядеть приложение, ещё не имеющее реальных данных.
Хорошим приёмом будет использование возможностей matplotlib. Например, если нужно построить несколько диаграмм в одном графике seaborn, то можно задействовать функцию subplot. В этой статье собрано много примеров использования. Рекомендуем попробовать.
Twitter-боты для визуализации данных
Раз уж речь зашла о визуализации данных, расскажем ещё об одной замечательной идее. Мы можем соединить красоту графиков seaborn и использовать микроблог в Twitter как средство доставки. Илон Маск вряд ли обрадовался бы очередному боту на Tweepy. Это простейшая библиотека, реализующая доступ к API Twitter. Вот так будет выглядеть «Hello, world»:
import tweepy
auth = tweepy.OAuth1UserHandler(
consumer_key, consumer_secret, access_token, access_token_secret
)
api = tweepy.API(auth)
public_tweets = api.home_timeline()
for tweet in public_tweets:
print(tweet.text)
Этот пример, взятый из официальной документации, демонстрирует, насколько просто использовать tweepy в приложении. Класс api предоставляет полный доступ к RESTful API Twitter. Вызывая его, мы получаем экземпляр класса модели tweepy и можем его использовать в приложении без «лишних телодвижений».
Взяв любой встроенный в seaborn датасет, можно написать простой код и обнаружить готовый результат в своей ленте Twitter. В этом поможет детальное руководство Using Twitter bots for data visualization. Там выложен пример кода и дополнительные трюки, вроде написания функции, облегчающей жизнь людям с особыми потребностями.
Отладка бота может сначала вызвать недоумение у тех, кто раньше не использовал твиттер. Продублировать свой твит нельзя, равно как и отредактировать. Учитывайте это при тестировании.
Используем многоточие в Python
В русском языке принято обозначать недосказанность, незавершённость мысли тремя точками. Символ троеточие носит название ellipsis, что в переводе с греческого означает «недостаток». В языке Python мы тоже можем использовать троеточие, но не каждый знает для чего именно оно нужно.
Стоит запомнить, что троеточие … является константой и может вызываться по имени:
>>> ...
Ellipsis
>>> Ellipsis
Ellipsis
>>> ... is Ellipsis
True
Троеточие прекрасно подходит на роль заглушки. Это своего рода lorem ipsum для Python. Так что если в вашем приложении есть ненаписанный код, смело используйте троеточие вместо pass и при запуске не возникнет ошибок. Минимум беспорядка и прекрасное указание на то, что код можно дополнить.
Ещё один замечательный способ использования троеточия — в роли подсказки типов. Так, например, можно объявить кортеж numbers: tuple[int, ...], в котором будут все целые числа, но их количество может быть любым. Если в коде задействуется аннотация Callable(), то при помощи троеточия можно снять ограничения, заменив список аргументов вызываемого объекта:
def calculate(i: int, action: Callable[..., int], *args: int) -> int:
return action(i, *args)
В вышеуказанном примере action будет вызван с целочисленным i и любыми другими переданными аргументами.
Кроме того, троеточие отлично подходит для «нарезки» многомерных массивов в numpy. Примеры кода и подробности вы найдёте в туториале RealPython.
Митапы
Python meetup
19:00
Мы отдохнули после Ruby Russia и готовы провести отличный Python Meetup. Детальная информация о мероприятии будет опубликована позже, следите за нашими новостями. Программа митапа формируется.
Пропустили наш предыдущий митап? Не беда! Все доклады есть на нашем YouTube-канале в 4K.
Если вам есть, что рассказать и опыт, которым вы хотите поделиться, то смело пишите нам на почту andy@evrone.com или предложите доклад через форму.
Вакансии
Evrone
Мы открыты для новых Python-разработчиков. В Evrone можно работать удалённо с первого дня, мы поддерживаем и оплачиваем участие в Open-source проектах и выступления на конференциях, а расти в грейдах можно с помощью честной системы проверки навыков и менторства.