<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>python 3 - Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</title>
	<atom:link href="https://python.ivan-shamaev.ru/tag/python-3/feed/" rel="self" type="application/rss+xml" />
	<link>https://python.ivan-shamaev.ru/tag/python-3/</link>
	<description>Библиотеки обработки данных. Примеры. Строки, списки, файлы, числа, массивы. Язык программирования Python 3 - скачать</description>
	<lastBuildDate>Thu, 08 Sep 2022 21:32:43 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.5</generator>

<image>
	<url>https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/cropped-data_science_python3_logo-32x32.png</url>
	<title>python 3 - Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</title>
	<link>https://python.ivan-shamaev.ru/tag/python-3/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Язык программирования Python 3. Обзор библиотек принципов modules</title>
		<link>https://python.ivan-shamaev.ru/overview-python-programming-language-modules-library-principles/</link>
					<comments>https://python.ivan-shamaev.ru/overview-python-programming-language-modules-library-principles/#respond</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Thu, 30 Apr 2020 20:35:04 +0000</pubDate>
				<category><![CDATA[Введение в Python 3]]></category>
		<category><![CDATA[python 3]]></category>
		<category><![CDATA[архитектура Python]]></category>
		<category><![CDATA[библиотеки Python]]></category>
		<category><![CDATA[модули Python]]></category>
		<category><![CDATA[принципы программирования python]]></category>
		<category><![CDATA[Язык программирования Python]]></category>
		<category><![CDATA[Язык программирования Python 3]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=1033</guid>

					<description><![CDATA[<p>Привет! Эта статья является кратким справочником по различным инструментам обработки данных, построения pipelines, системам для управления процессом разработки и т.д. Моя цель &#8212; создать короткую статью-обзор, прочитав/просмотрев которую Вы будете примерно представлять весь спектр инструментов для работы с данными на языке Python. В основном упор будет сделан на обработку данных, но также будут упомянуты и [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/overview-python-programming-language-modules-library-principles/">Язык программирования Python 3. Обзор библиотек принципов modules</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&#038;title=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" data-a2a-url="https://python.ivan-shamaev.ru/overview-python-programming-language-modules-library-principles/" data-a2a-title="Язык программирования Python 3. Обзор библиотек принципов modules"></a></p><p>Привет!</p>
<p>Эта статья является кратким справочником по различным инструментам обработки данных, построения pipelines, системам для управления процессом разработки и т.д.</p>
<p><strong>Моя цель</strong> &#8212; создать короткую статью-обзор, прочитав/просмотрев которую Вы будете примерно представлять весь спектр инструментов для работы с данными на языке Python. В основном упор будет сделан на обработку данных, но также будут упомянуты и другие библиотеки (web разработка, асинхронное программирование, принципы написания кода и т.д.), которые возможно пригодятся для выполнения поставленных перед Вами задач.</p>
<blockquote>
<p>Если Вы ищите литературу по направлению Python или Power BI (разработка аналитических приложений), то загляните обязательно в <strong><a href="https://t.me/python_powerbi" target="_blank" rel="noopener noreferrer">мой Telegram канал @python_powerbi (пишу про разработку на Python, построение аналитических отчетов на Power BI)</a></strong> <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
</blockquote>
<p>Итак, приступим. Начнем с библиотек обработки данных.</p>
<h2><strong>Обзор библиотек Python для обработки данных, анализа и визуализации данных</strong></h2>
<ul>
<li><strong>Numpy</strong> &#8212; это библиотека языка Python, которая позволяет работать с многомерными массивами и матрицами, в том числе внутри библиотеки есть большой выбор математических функций для выполнения операций над массивами и матрицами.</li>
<li><strong><span style="color: #ff6600;">Pandas</span> </strong>&#8212; это библиотека для работы с данными, а именно для анализа данных, трансформации данных (обработки данных), загрузки данных из различных источников и сохранения данных в разных форматах как в файловую систему, так и в базу данных. В качестве структуры данных используется Pandas DataFrame или Pandas Series.</li>
<li><strong>pyodbc </strong>&#8212; это Python модуль/библиотека, драйвер для подключения к базе данных через ODBC.</li>
<li><strong>pymssql </strong>&#8212; это библиотека Python для подключения к базе данных на MSSQL (но можно использовать и pyodbc).</li>
<li><span style="font-size: inherit;"><strong><span style="color: #ff6600;">SQLAlchemy</span> </strong>&#8212; это очень популярная библиотека Python для работы с реляционными СУБД для выполнения SQL или для использования технологии ORM (Object-Relational Mapping или объектно-реляционное отображение). ORM необходим для объектно-ориентированных языков программирования. С помощью ORM классы могут быть сопоставлены с базой данных, что позволяет с самого начала четко связать объектную модель и схему базы данных.</span></li>
<li><strong>Alembic</strong> &#8212; это инструмент миграции баз данных, написанный автором SQLAlchemy. Также может использоваться для создания таблиц, их удаления, добавления или удаления полей таблиц.</li>
<li><strong>SciPy</strong> &#8212; это пакет прикладных математических процедур (или научных инструментов), основанный на расширении Numpy Python. Содержит модули для оптимизации, интегрирования, специальных функций, обработки сигналов, обработки изображений, генетических алгоритмов, решения обыкновенных дифференциальных уравнений и других задач, обычно решаемых в науке и при инженерной разработке.</li>
<li><strong>Plotly</strong> &#8212; это графическая библиотека Python (с открытым исходным кодом), с помощью которой можно создавать интерактивную визуализацию (scatter plots, box plots, 3D графики, bar charts, heatmaps, дендрограммы и т.д.). Если коротко, то эту библиотеку можно охарактеризовать как <em>&#171;Красочное интерактивное отображение датасета в одну строку&#187;</em>.</li>
<li><strong>Dash</strong> &#8212; это передовой web‑фреймворк Python с открытым исходным кодом, предназначенный для создания реактивных веб-приложений / аналитических веб-приложений. С помощью Dash можно создать интерактивное приложения для аналитических отчетов и просматривать приложение в браузере, при этом не нужно использовать в приложении JavaScript или HTML. Для привязки пользовательского кода анализа данных к пользовательскому интерфейсу в Dash используется реактивный декоратор. С его помощью можно фильтровать DataFrame Pandas, выполнить SQL‑запрос, запустить расчет и т.д.</li>
<li><strong>Seaborn</strong> &#8212; это</li>
<li><strong>json</strong> — это модуль python, который позволяет кодировать и декодировать данные в удобном формате. Входит в стандартную библиотеку Python и является эффективным средством взаимодействия с JSON (JavaScript Object Notation).</li>
</ul>
<h2><strong>Библиотеки Python для парсинга страниц web сайтов (Web Scraping) и работа с API сайтов</strong></h2>
<ul>
<li><strong>Requests </strong>&#8212; это библиотека, с помощью которой можно отправлять все виды HTTP-запросов к различным ресурсам в сети интернет (сайты, API различных сервисов, поисковики). После выполнения запроса Вы получите ответ от сервера (данные, контент страницы сайта). По сути, с помощью этой библиотеки Вы можете автоматизировать обмен данными с такими ресурсами, как Yandex Метрика, Bitrix24, Мой Склад, Google Analytics, Google BigQuery, AmoCRM, Binance и др.</li>
<li><strong>Beautiful Soup</strong> &#8212; это библиотека Python, парсер для синтаксического разбора файлов HTML/XML. Может преобразовать даже неправильную разметку в дерево, состоящее из тегов, элементов, атрибутов и значений.</li>
<li><strong>Selenium</strong> &#8212; это это инструмент для автоматизации действий веб-браузера. В большинстве случаев используется для тестирования Web-приложений, но этим не ограничивается. Selenium представляет собой драйвер, который управляет поведением браузера. Состоит из нескольких продуктов: Selenium WebDriver, Selenium RC, Selenium Server, Selenium Grid, Selenium IDE.</li>
<li><strong>Lxml</strong> &#8212; это библиотека для парсинга сайтов и документов с разметкой XML и HTML. С её помощью можно разложить элементы документа/страницы в дерево. Обработка производится через XPath (язык запросов к элементам xml или html документа).</li>
<li><strong>Scrapy </strong>&#8212; это быстрый бесплатный фреймворк для веб-краулинга (веб-паук, поисковый робот, т.е. для работ по перебору страниц сайта и занесения информации в базу данных) или веб-скрейпинга (получение веб-данных путем извлечения их со страниц веб-ресурсов). С его помощью можно извлечь данные с веб-страниц сайтов с помощью селекторов на основе XPath.</li>
</ul>
<h2><strong>Многопоточность, параллелизм, многопроцессорная обработка &#8212; библиотеки Python</strong></h2>
<p>В операционной системе существует два типа многозадачности:</p>
<ul>
<li><strong>На основе процессов:</strong> несколько потоков, работающих в одной ОС одновременно.</li>
<li><strong>На основе потоков:</strong> один процесс, состоящий из отдельных задач.</li>
</ul>
<ul>
<li><strong>AsyncIO</strong> &#8212; это библиотека Python для написания параллельного кода. Библиотека asyncio позволяет вам писать код, который выглядит и чувствует себя синхронно, но работает асинхронно. Модуль asyncio предоставляет инфраструктуру для написания однопоточного параллельного кода с использованием сопрограмм, мультиплексирования доступа ввода-вывода через сокеты и другие ресурсы, запуска сетевых клиентов и серверов и других связанных примитивов.</li>
<li><strong>Threading </strong>&#8212; это стандартная библиотека Python, которая содержит необходимые классы для работы с потоками. Модуль threading значительно упрощает работу с потоками и позволяет программировать запуск нескольких задач одновременно. Python содержит Global Interpreter Lock (GIL), который запускает все потоки внутри главного потока. Если Вы запустите несколько интенсивных операций с потоками, то программа будет работать достаточно медленно, т.к. запуск потоков производится только на одном процессоре.</li>
<li><strong>Multiprocessing </strong>&#8212; это Модуль multiprocessing позволяет вам создавать процессы таким же образом, как при создании потоков при помощи модуля threading, но с помощью multiprocessing Вы сможете обойти GIL и использовать несколько процессоров на вашей вычислительной машине. Т.е. в рамках библиотеки multiprocessing Вы можете задействовать несколько процессоров для выполнения ваших операций.</li>
<li><strong>Aiohttp</strong> &#8212; это фреймворк для создания асинхронных HTTP Client и/или HTTP Server. Является HTTP-клиентом / сервером для asyncio.  Пакет aiohttp также поддерживает Server WebSockets и Client WebSockets.</li>
</ul>
<h2><strong>Python Libraries / Инструменты для Machine Learning</strong></h2>
<ul>
<li><strong>TensorFlow</strong> &#8212; это это комплексная платформа для машинного обучения с открытым исходным кодом. Основной объект &#8212; это тензор, или многомерный массив чисел. TensorFlow используется для создания многослойных нейронных сетей.</li>
<li><strong>Keras </strong>&#8212; это библиотека, позволяющая на более высоком уровне работать с нейросетями, упрощает код, увеличивает быстродействие. Изначально была разработана в целях ускорения экспериментов. Keras может запускаться поверх TensoFlow, Theano или CNTK. Этот фреймворк применяется для перевода, распознавании изображений, речи и т.п.</li>
<li><strong>Theano </strong>&#8212; это библиотека Python, которая используется для разработки систем Machine Learning (ML) и Artificial Intelligence (AI) как сама по себе, так и в качестве вычислительного backend для более высокоуровневых библиотек (например для Keras, Lasagne или Blocks). Библиотека построена поверх NumPy. Theano позволяет достигать больших скоростей, которые конкурируют с кодом C, написанным вручную, для задач, связанных с большими объемами данных. Theano компилируется на архитектурах CPU и GPU.</li>
<li><strong>Scikit-Learn</strong> &#8212; это инструмент для обработки изображений и имитации искусственного интеллекта. Библиотека построена на SciPy (Scientific Python). Библиотека Scikit-Learn использует в своей реализации NumPy массивы. Она предоставляет широкий выбор алгоритмов обучения с учителем и без учителя. В этой библиотеке находится большое количество алгоритмов для задач, связанных с классификацией и машинным обучением в целом.</li>
<li><strong>PyTorch </strong>&#8212; это machine learning framework или библиотека для решения задач с помощью машинного обучения, используется для приложений по обработке естественного языка. PyTorch считается Pythonic, т.е. плавно интегрируется со стеком данных Python. С помощью PyTorch можно построить динамический вычислительный граф. PyTorch сейчас используется в таких компаниях как Twitter, Facebook, NVIDIA и др. PyTorch создана на базе Torch (MATLAB-подобная библиотека для языка программирования Lua). Вокруг фреймворка PyTorch выстроена экосистема из различных библиотек: Fast.ai (упрощающая процесс обучения моделей), Pyro (модуль для вероятностного программирования от Uber), Flair (для обработки естественного языка) и Catalyst (для обучения DL и RL моделей).</li>
<li><strong>LightGBM (Light Gradient Boosted Machine)</strong> — это быстрая, распределенная, высокопроизводительная библиотека для повышения градиента, основанная на алгоритмах обучения на основе дерева решений. Используется для решения задач ранжирования, классификации, популярен для задач структурированного прогнозного моделирования, регрессия табличных данных и др. Разработана Microsoft. Справочно: Повышение градиента &#8212; это мощный алгоритм машинного обучения.</li>
<li><strong>XGBoost</strong> — это оптимизированная распределенная библиотека повышения градиента (GBM, GBRT, GBDT) с открытым исходным кодом. Доступна для языков программирования C++, Java, Python, R, Julia, Perl и Scala. Работает на Linux, Windows и macOS. Код работает в распределенной среде (Hadoop, SGE, MPI) и может решать проблемы с миллиардами примеров. В последнее время он приобрел большую популярность и внимание как алгоритм выбора для команд-победителей соревнований по машинному обучению.</li>
<li><strong>VowpalWabbit</strong> — это библиотека машинного обучения для онлайн интерактивного обучения, разработанная в Yahoo. К разработке и развитию подключилась команда Microsoft Research. Используются методы: online, hashing, allreduce, reductions, learning2search, active and interactive learning.</li>
<li><strong>CatBoost</strong> — это высокопроизводительная библиотека с открытым исходным кодом для повышения градиента в деревьях решений. Библиотека разработана компанией Яндекс, использует одну из оригинальных схем градиентного бустинга (boosting — улучшение). Библиотека является преемником алгоритма MatrixNet, который широко используется в компании для ранжирования задач, прогнозирования и выработки рекомендаций.<br /><strong></strong></li>
<li><strong>Hyperopt</strong> — это библиотека, в которой реализован алгоритм оптимизации Tree-Structured Parzen Estimators (TPE). Используется байесовская оптимизация для настройки параметров модели.</li>
<li><strong>fastText</strong> — это бесплатная, легковесная библиотека с открытым исходным кодом, которая позволяет пользователям изучать текстовые представления и классификаторы текста. Инструмент поддерживает несколько языков, включая английский, немецкий, испанский, французский, чешский и русский. Библиотека разработана в лаборатории Facebook AI Research (FAIR).</li>
</ul>
<h2><strong>Python Web Frameworks &#8212; Веб-Разработка сайтов, микросервисов. Обзор фреймворков</strong></h2>
<ul>
<li><strong>Django </strong>&#8212; это фреймворк для веб-приложений, работающий на Python, считается лучшим web-framework на языке Python. Фреймворки облегчают процесс разработки и позволяют разработчикам не изобретать колесо (в Django есть набор компонентов, которые можно использовать в своем проекте), поэтому создание сайта на Django можно сравнить с конструктором Lego. Django подходит для разработки высоконагруженных веб-приложений. Django следует философии &#171;все включено&#187;, Вам только нужно найти нужный компонент для той или иной задачи.</li>
<li><strong>Flask </strong>&#8212; это легковесный и гибкий фреймворк, который используется для создания веб-приложений на языке Python. Flask реализуется с минимальными надстройками, позволяет выбирать модули под конкретные задачи и устанавливать их по мере необходимости. Вы вправе самостоятельно решить, как стоит реализовать те или иные вещи в вашем проекте. Flask стоит выбрать, если необходима тонкая настройка проекта. Flask из-за своей гибкости лучше подходит для создания REST API.</li>
<li><strong>Tornado </strong>&#8212; это веб-фреймворк Python и асинхронная библиотека для NetWorking (сетей). Используя неблокирующий сетевой ввод/вывод (I/O), Tornado может масштабироваться до десятков тысяч открытых соединений, что делает его идеальным для веб-сервисов реального времени (например для длинных опросов или long polling, WebSockets, т.е. которые требуют долгого соединения с каждым пользователем). Был создан для использования в проекте FriendFeed, который в 2009 году приобрела компания Facebook. После этого исходный код этой библиотеки разместили в открытом доступе. Есть интеграция с Amazon S3. Есть реализация сторонних схем аутентификации и авторизации (Google OpenID / OAuth, Facebook, Yahoo BBAuth, FriendFeed OpenID/OAuth, Twitter OAuth).</li>
<li><strong>Pyramid </strong>&#8212; это это самый молодой web-фреймворк Python с открытым исходным кодом для веб-проектов среди других популярных frameworks. Pyramid очень похожа на Flask (мало усилий для установки и запуска). Pyramid хорошо себя проявляет как в небольших, так и в больших проектах.</li>
<li><strong>Bottle</strong> &#8212; это быстрый, простой и легкий микро-фреймворк Python для небольших веб-приложений. Включает в себя диспетчеризацию запросов (маршрутизацию) с поддержкой параметров URL, шаблоны, имеет встроенный HTTP-сервер и адаптеры для сторонних WSGI/HTTP-серверов. <strong>Протокол WSGI</strong> &#8212; стандарт взаимодействия между Python-программой, выполняющейся на стороне сервера, и самим веб-сервером, например, Apache.</li>
<li><strong>CherryPy</strong> &#8212; это минималистичный объектно-ориентированный веб-фреймворк с открытым исходным кодом на языке Python. Является Pythonic. Спроектирован для быстрой разработки веб-приложений, используя ООП. CherryPy может быть настроек, как самостоятельный веб-сервер, или может работать под управлением другого серверного приложения, которое поддерживает протокол WSGI. CherryPy имеет собственный совместимый с HTTP веб-сервер WSGI.</li>
</ul>
<h2><strong>Фреймворки для разработки мобильных приложений, GUI Development</strong></h2>
<ul>
<li><strong>Kivy</strong> &#8212; это кросс-платформенный фреймворк Python с открытым исходным кодом для быстрой разработки межплатформенных В дополнение к стандартному вводу через клавиатуру и мышь он поддерживает мультитач. Kivy работает на Linux, Windows, OS X, Android, iOS и Raspberry Pi. Графика создается через OpenGL ES 2, что приводит к равномерному появлению в разных операционных системах.</li>
<li><strong>PyQt5 / PyQt4 / PyQt</strong> &#8212; это это библиотека Python для разработки приложений с графическим интерфейсом пользователя GUI (создано на основе набора кроссплатформенных библиотек C++). Является одной из самых мощных библиотек GUI (более 600 классов, более 6000 функций и методов). Библиотека доступна для Python 2.x и 3.x. PyQt работает на всех платформах, поддерживаемых Qt: Linux и другие UNIX-подобные ОС, Mac OS X и Windows. Существует 2 версии: PyQt5, поддерживающий Qt 5, и PyQt4, поддерживающий Qt 4.</li>
<li><strong>Tkinter </strong>&#8212; это бесплатная кросс-платформенная графическая библиотека Python, которая позволяет создавать программы с оконным интерфейсом (стандратный модуль Python для создания приложений с GUI интерфейсом). Tkinter является кроссплатформенной библиотекой и может быть использована в большинстве распространённых операционных систем (Windows, Linux, Mac OS X и др.). Функционирует на основе средств Tk (широко распространённая в мире GNU/Linux и других UNIX‐подобных систем, портирована также и на Microsoft Windows).</li>
<li><strong>WxPython </strong>&#8212; это это бесплатная кросс-платформенная библиотека Python для разработки приложений GUI (Windows, Mac OS X, Linux), поставляется вместе с Python и является альтернативой Tkinter. Библиотека написана на C++. Реализовано на основе wxWidgets &#8212; инструмент разработчика для написания настольных или мобильных приложений с графическим интерфейсом (GUI).</li>
<li><strong>PyGUI </strong>&#8212; это</li>
<li><strong>PySide </strong>&#8212; это</li>
</ul>
<h2><strong>Фреймворки Python для разработки API</strong></h2>
<ul>
<li><strong>Marchmallow</strong> &#8212; это библиотека, независимая от ORM/ODM/Framework для преобразования сложных типов данных, таких как объекты, в простые типы данных Python, а также обратная операция. Наиболее распространенное использование Marshmallow &#8212; десериализация объекта JSON в объект Python или сериализация объекта Python в объект JSON для использования в веб-API. Marshmallow делает это путем определения схемы, которую можно использовать для применения правил проверки десериализации данных или изменения способа сериализации данных.</li>
<li><strong>OpenAPI = спецификация.</strong> OpenAPI &#8212; это официальное название спецификации. Разработка спецификации поддерживается инициативой OpenAPI, в которой участвуют более 30 организаций из разных областей технического мира, включая Microsoft, Google, IBM и CapitalOne. Smartbear Software, которая является компанией, которая возглавляет разработку инструментов Swagger, также является участником инициативы OpenAPI, помогая вести эволюцию спецификации.</li>
<li><strong>Swagger = Инструменты для реализации спецификации.</strong> Swagger &#8212; это имя, связанное с некоторыми из самых известных и широко используемых инструментов для реализации спецификации OpenAPI. Набор инструментов Swagger включает в себя набор открытых, бесплатных и коммерческих инструментов, которые можно использовать на разных этапах жизненного цикла API. Инструменты Swagger &#8212; не единственные инструменты, доступные для реализации спецификации OpenAPI. <strong>Инструменты Swagger включают в себя:</strong>
<ul>
<li><span style="color: #008080;"><strong>Редактор Swagger:</strong></span> Редактор Swagger позволяет редактировать спецификации OpenAPI в YAML внутри вашего браузера и просматривать документы в реальном времени.</li>
<li><span style="color: #008080;"><strong>Swagger UI:</strong></span> Swagger UI &#8212; это набор ресурсов HTML, Javascript и CSS, которые динамически генерируют прекрасную документацию из OAS-совместимого API.</li>
<li><span style="color: #008080;"><strong>Swagger Codegen:</strong></span> позволяет автоматически генерировать клиентские библиотеки API (SDK), заглушки серверов и документацию с учетом спецификации OpenAPI.</li>
<li><span style="color: #008080;"><strong>Swagger Parser:</strong></span> автономная библиотека для анализа определений OpenAPI из Java</li>
<li><span style="color: #008080;"><strong>Swagger Core:</strong></span> Java-библиотеки для создания, использования и работы с определениями OpenAPI</li>
<li><span style="color: #008080;"><strong>Swagger Inspector (бесплатно):</strong></span> инструмент тестирования API, который позволяет проверять ваши API и генерировать определения OpenAPI из существующего API</li>
<li><span style="color: #008080;"><strong>SwaggerHub (бесплатный и коммерческий):</strong></span> API-дизайн и документация, созданные для команд, работающих с OpenAPI.</li>
</ul>
</li>
<li><strong>FastAPI</strong> &#8212; это это современная, быстрая (высокопроизводительная) веб-фреймворк для создания лаконичных и довольно быстрых HTTP API-серверов со встроенными валидацией, сериализацией и асинхронностью, работает с Python 3.6+. Работу с web в FastAPI выполняет Starlette, а валидацию &#8212; Pydantic. FastAPI интегрируется с OpenAPI-schema и автоматически генерирует документацию для API посредством Swagger и ReDoc.</li>
</ul>
<h2><strong>Python Libraries for Game Development (Библиотеки Python для разработки игр)</strong></h2>
<ul>
<li><strong>PyGame</strong> &#8212; это библиотека модулей/фреймворк Python для разработки 2D игр и мультимедиа-приложений. Pygame основывается на мультимедийной библиотеке SDL (Simple DirectMedia Layer &#8212; кроссплатформенная мультимедийная библиотека с открытым исходным кодом, которая реализует единый программный интерфейс для работы с графикой и анимацией, со звуком и музыкой, для работы с интерфейсами I/O &#8212; мышь, клавиатура, джойстик и т.д.). Pygame содержит функции и классы Python, которые позволяют вам использовать поддержку SDL.</li>
<li><strong>Pyglet </strong>&#8212; это кроссплатформенная библиотека окон и мультимедиа для Python, предназначенная для разработки игр и других мультимедийных приложений Windows, Mac OS X и Linux. Pyglet поддерживает работу с окнами, обработку событий пользовательского интерфейса, графику OpenGL, загрузку изображений и видео, а также воспроизведение звуков и музыки.</li>
<li><strong>PyOpenGL </strong>&#8212; это это большой пакет Python, который позволяет работать с функциями OpenGL, GLU, GLE и GLUT. PyOpenGL обеспечивает реализацию приложений с двухмерной и трехмерной графикой.</li>
<li><strong>Arcade </strong>&#8212; это простая в освоении библиотека Python для создания 2D видеоигр. Он идеально подходит для людей, которые учатся программировать, или для разработчиков, которые хотят написать двумерную игру, не изучая сложную структуру.</li>
<li><strong>Panda3D </strong>&#8212; это полностью бесплатный в использовании движок с открытым исходным кодом для создания 3D-игр, визуализаций, симуляций, экспериментов в реальном времени. Его богатый набор функций легко адаптируется к вашим рабочим процессам и потребностям разработки. Игровой движок включает в себя графику, звук, ввод/вывод, обнаружение и столкновение, а также другие функции, относящиеся к созданию 3D игр.</li>
</ul>
<h2><strong>Python Libraries/Tools for Image Processing</strong></h2>
<p><strong>Анализ изображений</strong> – это извлечение значимой информации из изображений. Что полезного можно получить из изображений?</p>
<ul>
<li>Медицина (выявление аномалий, диагностика заболеваний)</li>
<li>Системы безопасности (обнаружение «подозрительных» предметов)</li>
<li>Военная промышленность (системы слежения и целенаведения)</li>
<li>Обнаружение и распознавание текста</li>
</ul>
<p><span style="color: #008080;"><strong>Обзор инструментов:</strong></span></p>
<ul>
<li><strong>OpenCV (Open Source Computer Vision Library)</strong> &#8212; это библиотека алгоритмов компьютерного зрения с исходным кодом, для обработки изображений и видео, ориентирована на приложения реального времени. Реализована на C/C++, также разрабатывается для Python, Java, Ruby, Matlab, Lua и других языков. Библиотека opencv-python &#8212; неофициальный релиз пакетов OpenCV для Python.</li>
<li><strong>Mahotas</strong> — это библиотека компьютерного зрения и обработки изображений для Python, которая включает в себя множество алгоритмов, реализованных в C++ для повышения скорости при работе с большими массивами данных. Mahotas в настоящее время имеет более 100 функций для обработки изображений и компьютерного зрения и продолжает расти.</li>
<li><strong>SimpleITK (Insight Segmentation and Registration Toolkit, ITK)</strong> — это набор инструментов для анализа изображений с большим количеством компонентов, поддерживающих общие операции фильтрации, сегментации и регистрации изображений. Сам SimpleITK написан на C++, но доступен для большого количества языков программирования, включая Python.</li>
<li><strong>Pillow</strong> — это библиотека языка Python, предназначенная для работы с растровой графикой. Однако проект под названием Pillow, являющийся форком PIL, развивается и включает, в том числе, поддержку Python 3.x.</li>
<li><strong>SciKit-image</strong> — это библиотека Python, предназначенная для обработки изображений, включает в себя набор алгоритмов обработки изображений (сегментации, геометрических преобразований, управления цветовым пространством, анализа, фильтрации, морфологии, обнаружения признаков и многое другое). Библиотека доступна бесплатно и без ограничений.</li>
</ul>
<h2><strong>Python Libraries For Text Analytics &#8212; библиотеки для анализа текста / NLP</strong></h2>
<p>Обработка написанных на естественном языке текстов <strong>(Natural Language Processing, NLP)</strong>, с которой мы познакомились в предыдущей главе, и вычислительная лингвистика <strong>(Computational Linguistics, CL)</strong> — две сферы вычислительных методов изучения естественных языков.</p>
<p><strong>NLP</strong> занимается разработкой методов решения связанных с языками практических задач, таких как извлечением информации, автоматическим распознаванием речи, машинным переводом, анализом тональности высказываний, формированием ответов на вопросы и автоматическим реферированием.</p>
<p><strong>CL</strong>, с другой стороны, применяет вычислительные методы для постижения свойств естественных языков. Как мы понимаем язык? Как мы создаем языки? Как мы учим языки? Как различные языки связаны друг с другом?</p>
<ul>
<li><strong>SpaCy</strong> &#8212; это open-source библиотека для NLP, написанная на Python и Cython. В отличие от NLTK, который широко используется для преподавания и исследований, spaCy фокусируется на предоставлении программного обеспечения для разработки. spaCy поставляется с предварительно обученными статистическими моделями и векторами слов, и в настоящее время поддерживает токенизацию для 50+ языков. В нем реализована современная скорость, сверточные модели нейронных сетей для тегирования, анализа и распознавания именованных объектов, а также простая интеграция с глубоким обучением. Это коммерческое программное обеспечение с открытым исходным кодом, выпущенное под лицензией MIT.</li>
<li><strong>NLTK (Natural Language Toolkit) </strong>&#8212; это библиотека для обработки естественного языка на Python, которая позволяет создавать программы для работы с данными на человеческом языке. NLTK доступен для Windows, Mac OS X и Linux. NLTK &#8212; это бесплатный проект с открытым исходным кодом, который поддерживает и развивает сообщество специалистов.</li>
<li><strong>Flair </strong>&#8212; это мощная библиотека NLP, которая позволяет применять современные модели обработки естественного языка (NLP) к тексту, такие как распознавание именованных объектов (NER), тегирование частей речи (PoS), устранение неоднозначности смысла и классификация.</li>
<li><strong>TextBlob </strong>&#8212; это библиотека Python (2 и 3) для обработки текстовых данных. Он предоставляет простой API для погружения в общие задачи обработки естественного языка (NLP), такие как определение части речи, извлечение имен существительных, анализ настроений, классификация, перевод и многое другое.</li>
<li><strong>Gensim </strong>&#8212; это библиотека для обработки естественного языка, с помощью которой осуществляют индексацию документов, моделирование тем, поиска сходства. Целевая область применения &#8212; это natural language processing (NLP) обработка естественного языка и information retrieval (IR) поиск информации.</li>
<li><strong>Наташа</strong> &#8212; это библиотека для извлечения структурированной информации из текстов на русском языке (например извлечения имён, адресов, дат, сумм денег и других сущностей). В библиотеке собраны грамматики и словари для парсера Yargy.</li>
</ul>
<h2><strong>Инструментарий Python для автоматического тестирования</strong></h2>
<ul>
<li><strong>Исследовательское тестирование (Exploratory Testing, ET).</strong> Объединяет тестовый дизайн и тестовое выполнение. Оно направлено на изучение приложения в условиях тестирования.</li>
<li><strong>Модульные тесты (Unit Test).</strong> Определяют поведение малых частей системы, например ветвей конкретных функций. Могут быть направлены на объект или метод, вытекающий из одного или нескольких дизайнерских решений. В контексте Agile автоматизированные модульные тесты направляют программирование на низшем уровне. Как правило, код модульных тестов составляет менее двенадцати строк. Некоторые специалисты предпочитают термин &#171;микротест&#187;.</li>
<li><strong>Операционное тестирование (Operational Acceptance Testing, OAT).</strong> Используется для проведения OPS-подготовки (предвыпуска) продукта, услуги или системы как части контроля качества. OAT &#8212; стандартный тип нефункционального тестирования программного обеспечения, по большей части поддерживающий софт и проекты ПО.</li>
<li><strong>Приемочное тестирование (Acceptance Test).</strong> Тесты, определяющие бизнес-ценность и объемы каждой истории (функции). Могут определять как функциональные, так и нефункциональные требования, например, рабочие показатели или надежность. Хотя используются для разработки на основе примеров, представляют собой тесты высшего уровня, в отличие от модульных, используемых для создания кода в разработке на основе тестов. Это широкий термин, он может включать в себя бизнес-ориентированные и технологические тесты.</li>
<li><strong>Регрессионное тестирование (Regression Test).</strong> Определяет, что поведение системы в условиях тестирования не меняется. Регрессионные тесты часто пишутся как модульные, чтобы поддерживать программирование, или как приемочные, чтобы определять желаемое поведение системы. Как только проверка завершена, она становится частью набора регрессионных тестов, предотвращающих незапланированные изменения. Регрессионные тесты должны быть автоматизированы для обеспечения непрерывной обратной связи.</li>
<li><strong>Автотест (автоматизированный тест)</strong> – это скрипт, который имитирует взаимодействие бизнес-пользователя с приложением. Целью автотестов является локализация ошибок в работе системы/ПО. Конечная цель автоматического тестирования &#8212; создание набора автотестов, которые будут поочередно запускаться после нажатия на кнопку &#171;Старт&#187;. Также должны быть предусмотрены одиночные автотесты для проверки отдельной функциональности. Каждый тестовый скрипт контролирует правильность работы определенной функциональности приложения (его части) и фиксирует ошибки, если что-то пошло не так.</li>
</ul>
<p><strong>Библиотеки Python для тестирования:</strong></p>
<ul>
<li><strong>Splinter</strong> &#8212; это инструмент с открытым исходным кодом для тестирования веб-приложений с использованием Python. Позволяет автоматизировать действия браузера, такие как посещение URL-адресов и взаимодействие с их элементами. Например, 1) Посетите веб-сайт Google, 2) Введите текст поиска, 3) Нажмите кнопку поиска, 4) Узнайте, находится ли сайт вашей компании в результатах поисковой выдачи. И т.д.</li>
<li><strong>Robot (Robot Framework)</strong> &#8212; это универсальная среда автоматизации с открытым исходным кодом. Он может быть использован для автоматизации тестирования и автоматизации процессов (RPA). Robot Framework активно поддерживается, и многие ведущие компании используют его при разработке программного обеспечения. Robot Framework имеет простой синтаксис, использующий удобочитаемые ключевые слова. Его возможности могут быть расширены библиотеками, реализованными на Python или Java.</li>
<li><strong>Behave &#8212; это behavior-driven (BDD)</strong> фреймворк для тестирования, который использует тесты, написанные в стиле естественного языка, подкрепленные кодом Python. Выдаёт красивые, аккуратные и понятные отчеты. Лучше всего подходит для тестирования &#171;черного ящика&#187;. Лучше не использовать для модульного тестирования или низкоуровневого интеграционного тестирования.</li>
<li><strong>PyUnit (или unittest)</strong> &#8212; это framework для тестирования, входящий в стандартную библиотеку языка Python. Представляет собой версию JUnit на языке Python. Позволяет просто создавать программы модульного тестирования с помощью Python.</li>
<li><strong>PyTest</strong> &#8212; это фреймворк для тестирования, который позволяет легко писать небольшие тесты, а также масштабируется для поддержки сложного функционального тестирования приложений и библиотек. Это один из лучших инструментов, которые вы можете использовать для повышения производительности тестирования. Может запускать тесты параллельно. Может выполнить определенный тест или подмножество тестов.</li>
</ul>
<h2><strong>Обзор других библиотек Python (работа со временем, оперативной системой, числами и т.д.)</strong></h2>
<ul>
<li><strong>math</strong> — это модуль Python, который обеспечивает доступ к математическим функциям для работы с числами (набор функций для выполнения математических, тригонометрических и логарифмических операций и другие).</li>
<li><strong>time</strong> — это модуль Python, который предоставляет различные функции для работы со временем (смещение DST часового пояса, форматирование времени, делать задержки по таймеру и др.). Большинство функций, определенных в этом модуле, вызывают библиотечные функции платформы С с тем же именем.</li>
<li><strong>datetime</strong> — это модуль, который предоставляет классы для работы с датой и временем (формирование даты, вычисление разницы между двумя моментами времени, получение информации о временной зоне, получение текущего времени, получение даты из datetime, получение времени из datetime и др.).</li>
<li><strong>calendar</strong> — это модуль Python, который позволяет выводить календари (в виде простого текста или в HTML формате), а также предоставляет дополнительные полезные функции, связанные с календарем.</li>
<li><strong>os</strong> — это модуль, который предоставляет функции для работы с операционной системой. Модель содержит функции для работы с файлами, директориями, с переменными окружения, производить работу с путями, получать информацию об операционной системе и др.</li>
<li><strong>sys</strong> — это модуль, который предоставляет доступ к некоторым переменным и функциям для получения информации о взаимодействии интерпретатора Python с операционной системой. Модуль sys очень часто используют вместе с os модулем. С помощью sys можно получить такую информацию, как запущенная версия Питона, путь к интерпретатору Python, каталог установки Python, кодировка файловой системы, параметры командной строки и др.</li>
<li><strong>random</strong> — это модуль, который реализует генераторы псевдослучайных чисел для различных распределений (равномерного, нормального/гауссовского, логнормального, отрицательного экспоненциального, гамма- и бета-распределений).</li>
<li><strong>re</strong> — это модуль предоставляет операции сопоставления регулярных выражений (поиск с помощью «регулярных выражений» или с помощью текстовых &#171;паттернов&#187;/&#187;patterns&#187;). Другими словами это парсинг текста или поиск последовательностей символов, согласно заданным правилам, которые описываются в виде шаблонов.</li>
<li><strong>python-docx</strong> — это библиотека Python для создания и обновления/изменения файлов Microsoft Word (.docx).</li>
<li><strong>python-play</strong> — это модуль python, позволяющий воспроизводить аудиофайл в формате mp3.</li>
<li><strong>PyPDF2</strong> &#8212; это библиотека PDF на чистом python, способная разбивать, объединять, обрезать и преобразовывать страницы файлов PDF. Он также может добавлять пользовательские данные, параметры просмотра и пароли к файлам PDF. Он может извлекать текст и метаданные из PDF-файлов, а также объединять файлы целиком.</li>
</ul>
<h2><strong>Лучшие IDE (интегрированные среды разработки) и редакторы кода для Python</strong></h2>
<ul>
<li><strong>IDLE (Integrated Development and Learning Environment)</strong> &#8212; это интегрированная среда разработки и обучения на языке Python, созданная с помощью библиотеки Tkinter. Это оболочка Python, окно для ввода команд на языке Python. В Windows это поставляется с интерпретатором Python, т.е. устанавливается вместе с Python.</li>
<li><strong>Jupyter Notebook</strong> &#8212; это веб-приложение с открытым исходным кодом, которое позволяет создавать и обмениваться документами, которые содержат живой код и результат его выполнения, уравнения, визуализации и текст с пояснениями по вычислениям. Часто используется для: очистки и преобразования данных, числового моделирования, статистического моделирования, визуализации данных, машинного обучения и др.</li>
<li><strong>Anaconda</strong> &#8212; дистрибутив языков программирования Python и R, включающий набор популярных свободных библиотек, объединённых проблематиками науки о данных и машинного обучения. Основная цель — поставка единым согласованным комплектом наиболее востребованных соответствующим кругом пользователей тематических модулей (таких как NumPy, SciPy, Astropy и других) с разрешением возникающих зависимостей и конфликтов, которые неизбежны при одиночной установке. По состоянию на 2019 год содержит более 1,5 тыс. модулей.</li>
<li><strong>PyCharm</strong> &#8212; это кросс-платформенная среда (Windows, MacOS, Linux) разработки для разных языков программирования (в частности для Python). PyCharm Community Edition (бесплатная версия) находится под лицензией Apache License, а PyCharm Professional Edition(платная версия) является проприетарным ПО. PyCharm предоставляет умную проверку кода, быстрое выявление ошибок и оперативное исправление, вкупе с автоматическим рефакторингом кода, и богатыми возможностями в навигации.</li>
<li><strong>Spyder</strong> &#8212; свободная и кроссплатформенная интерактивная IDE для научных расчетов на языке Python. Используется инженерами и аналитиками данных. Spyder является частью модуля spyderlib для Python, основанного на PyQt4, pyflakes, rope и Sphinx, предоставляющего мощные виджеты на PyQt4, такие как редактор кода, консоль Python (встраиваемая в приложения), графический редактор переменных (в том числе списков, словарей и массивов).</li>
<li><strong>Visual Studio Code</strong> &#8212; редактор кода, разработанный Microsoft для Windows, Linux и macOS. Позиционируется как &#171;лёгкий&#187; редактор кода для кроссплатформенной разработки веб- и облачных приложений. Включает в себя отладчик, инструменты для работы с Git, подсветку синтаксиса, IntelliSense (технология автодополнения Microsoft) и средства для рефакторинга. Имеет широкие возможности для кастомизации: пользовательские темы, сочетания клавиш, файлы конфигурации, имеет множество полезных плагинов. Распространяется бесплатно, разрабатывается как программное обеспечение с открытым исходным кодом, но готовые сборки распространяются под проприетарной лицензией.</li>
<li><strong>Thonny</strong> &#8212; интегрированная среда разработки для Python, специально разработанная для начинающих Pythonista. Поддерживает различные способы пошагового выполнения кода, пошаговое вычисление выражений, детальную визуализацию стека вызовов и режим объяснения концепций ссылок и кучи.</li>
<li><strong>Sublime Text</strong> &#8212; легковесный текстовый редактор для программистов. Поддерживает плагины на языке программирования Python. Разработчик позволяет бесплатно и без ограничений ознакомиться с продуктом, однако программа уведомляет о необходимости приобретения лицензии.</li>
<li><strong>Atom (с плагином atom-python-run)</strong> &#8212; бесплатный текстовый редактор с открытым исходным кодом для Linux, macOS, Windows с поддержкой плагинов, написанных на Node.js, и встраиваемых под управлением Git. Большинство плагинов имеют статус свободного программного обеспечения, разрабатываются и поддерживаются сообществом. Есть плагин для Python atom-python-run.</li>
</ul>
<h2>Синхронизация. Координация распределенных приложений</h2>
<ul>
<li><strong>ZooKeeper (Apache ZooKeeper)</strong> &#8212; это высокопроизводительный сервис координации для распределенных приложений; Служба, предназначенная для хранения конфигурационной информации, имён, выполнения распределённой синхронизации процессов. Фактически выполняет важнейшие задачи многих распределённых приложений. Является важной составляющей Hadoop-инфраструктуры, но может использоваться отдельно. Поддерживается Apache Foundation, написана на Java. Для получения информации каждый клиентский компьютер связывается с одним из серверов. ZooKeeper следит за синхронизацией всего кластера. Внедрение ZooKeeper делает ставку на высокую производительность, доступность и строго упорядоченный доступ. Аспекты производительности ZooKeeper позволяют использовать его в больших распределенных системах.</li>
</ul>
<ul></ul>
<h2><strong>Реляционные базы данных (СУБД)</strong></h2>
<ul>
<li><strong>MySQL</strong> &#8212; это</li>
<li><strong>PostgreSQL</strong> &#8212; это</li>
</ul>
<h2><strong>NoSQL СУБД и Time-Series DataBase</strong></h2>
<ul>
<li><strong>Redis (Remote Dictionary Server)</strong> — это база данных in-memory (хранимая в оперативной памяти) с исходным кодом (лицензиия BSD), которая хранится на диске. База данных организована по модели &#171;ключ-значение&#187;, также можно использовать другие типы значений: строки, списки, наборы, отсортированные наборы, хэши, потоки, HyperLogLogs, растровые изображения. Redis обеспечивает время отклика на уровне долей миллисекунды и позволяет приложениям, работающим в режиме реального времени, выполнять миллионы запросов в секунду. Такие приложения востребованы в сфере игр, рекламных технологий, финансовых сервисов, здравоохранения и IoT.</li>
<li><strong>MongoDB</strong> — это кросс-платформенная, документоориентированная NoSQL система управления базами данных с открытым исходным кодом, не требующая описания схемы таблиц (schemaless). Написана на C++. Хранит данные в JSON-подобных документах, в основе БД лежит концепция коллекций и документов. Обеспечивает высокую производительность и лугкую масштабируемость. Документ &#8212; JSON-объект имеющий произвольное число полей. Коллекция (таблица)- однотипные документы хранятся в отдельной коллекции.База данных &#8212; набор коллекций. Используется в веб-разработке.</li>
<li><strong>CouchDB (Сluster Of Unreliable Commodity Hardware)</strong> — это документо-ориентированная NoSQL СУБД с открытым исходным кодом, написанная на языке Erlang, которая не требует описания схемы данных. CouchDB предоставляет REST интерфейс для работы с базой: Если мы хотим получить информацию &#8212; отправляем GET запрос, Если надо создать документ &#8212; POST, Необходимо что-то изменить &#8212; PUT, COPY для копирования, DELETE для удаления. Используется в веб-разработке.</li>
<li><strong>Cassandra</strong> — это распределенная гибридная NoSQL система управления БД, которая используется для создания высокомасштабируемых и надежных хранилищ огромных массивов данных, которые представлены в виде хэша. Cassandra разработана Facebook на языке Java, а затем СУБД передали для дальнейшего развития фонду Apache Software Foundation. Cassandra сочетает в себе модель хранения данных на базе семейства столбцов (ColumnFamily) с концепцией key-value (ключ-значение). Есть возможность организации хранения хэшей с несколькими уровнями вложенности. Относится к категории отказоустойчивых СУБД: помещённые в базу данные автоматически реплицируются на несколько узлов распредёленной сети или даже равномерно распределяются в нескольких дата-центрах, при сбое узла его функции на лету подхватываются другими узлами, добавление новых узлов в кластер и обновление версии Cassandra производится на лету, без дополнительного ручного вмешательства и переконфигурации других узлов.</li>
<li><strong>Neo4j</strong> — является ведущей в мире графовой системой управления базами данных с открытым исходным кодом, разработана на Java. Данные хранит в собственном формате, специализированно приспособленном для представления графовой информации. Программист работает с гибкой сетевой структурой узлов и отношений, а не со статическими таблицами.</li>
<li><strong>Clickhouse</strong> — это колоночная аналитическая система управления базами данных с открытым исходным кодом, разрабатывается компанией Yandex (Яндекс). Позволяет выполнять аналитические запросы в режиме реального времени на структурированных больших данных. ClickHouse использует собственный диалект SQL близкий к стандартному, но содержащий различные расширения: массивы и вложенные структуры данных, функции высшего порядка, вероятностные структуры, функции для работы с URI, возможность для работы с внешними key-value хранилищами («словарями»), специализированные агрегатные функции, функциональности для семплирования, приблизительных вычислений, возможность создания хранимых представлений с агрегацией, наполнения таблицы из потока сообщений Apache Kafka и т.д.</li>
<li><strong>VictoriaMetrics</strong> — это масштабируемая база данных временных рядов с открытым исходным кодом, которую можно использовать в качестве долгосрочного удаленного хранилища для Prometheus. Prometheus &#8212; это бесплатное программное приложение с открытым исходным кодом, используемое для мониторинга событий и оповещения. Он записывает метрики в реальном времени в базу данных временных рядов, построенную с использованием HTTP pull model, с гибкими запросами и оповещениями в реальном времени.</li>
<li><strong>InfluxDB</strong> — это база данных временных рядов с открытым исходным кодом, которая предназначена для обработки высокой нагрузки записей и запросов. Является частью стека TICK (Telegraf, InfluxDB, Chronograf, Kapacitor). Используется для IoT мониторинга и аналитики, мониторинга инфраструктуры и приложений.</li>
</ul>
<h2><strong>WebSite Search Engine &#8212; механизм поиска для веб-сайта (поисковый движок)</strong></h2>
<ul>
<li><strong>Elasticsearch</strong> — это масштабируемый поисковый движок корпоративного уровня с открытым исходным кодом, основанный на библиотеке Lucene (NoSQL с JSON REST API). Данные хранятся в формате JSON, система работает на платформе Java. Официальные клиенты доступны на Java, .NET (C#), PHP, Python, Apache Groovy, Ruby и многих других языках. Система обеспечивает полнотекстовый поиск и анализ данных.</li>
<li><strong>Sphinx</strong> — это высокоскоростная система для полнотекстового поиска, которую разработал Адрей Аксенов на языке C++. Система работает в Linux (RedHat, Ubuntu и т.д.), Windows, MacOS, Solaris, FreeBSD. Официальные реализации Sphinx API доступны для PHP, Java, Perl, Ruby и Python. Поисковый сервер Sphinx имеет двойную лицензию, поэтому он может быть лицензирован для коммерческой деятельности, а также свободно доступен для загрузки на официальном сайте (если он будет использоваться в соответствии с условиями GPL v.2).</li>
<li><strong>Solr</strong> — это платформа для полнотекстового поиска с открытым исходным кодом, написанная на Java и основана на проекте Apache Lucene. Её основные функции включают в себя полнотекстовый поиск, подсветка результатов, фасетный поиск, индексация в реальном времени, динамическую кластеризацию, интеграцию с базами данных, функции NoSQL, а также обработку документов Word, PDF и др. В основе Solr для реализации поиска и индексации лежит Lucene. Solr имеет HTTP/XML и JSON API, поэтому эту платформу можно использовать из всех популярных языков программирования.</li>
<li><strong>Xapian</strong> &#8212; это библиотека для полнотекстового поиска с открытым исходным кодом. Используется во многих ОС: Linux, MacOS, FreeBSD, NetBSD, OpenBSD, Solaris, IRIX, Windows. Может использоваться совместно с Perl, Python, PHP, Java, Tcl, C#, Ruby, Lua, Erlang, Node.js.</li>
</ul>
<h2><strong>Workflow Management системы и Брокеры сообщений</strong></h2>
<ul>
<li><strong>Apache Airflow &#8212; </strong>это open-source набор библиотек, платформа для планирования, создания и мониторинга рабочих процессов. Airflow является незаменимым инструментом для современного дата инженера как планировщик ETL/ELT-процессов, предназначен для запуска цепочек задач (data pipelines). Для создания рабочих процессов используется язык Python. Основные компоненты рабочего процесса Airflow: Направленные ациклические графы (DAG), Планировщик (Scheduler), Операторы (Operators), Задачи (Tasks).</li>
<li><strong>Kafka</strong> &#8212; это брокер сообщений, проект с открытым исходным кодом, используется для создания конвейеров данных в реальном времени и потоковых приложений. Масштабируется по горизонтали, используется паттерн Producer-Consumer, отказоустойчив. Разработана компанией LinkedIn на JVM стеке (Scala). Приложения (генераторы) посылают сообщения (записи) на узел Kafka (брокер), и указанные сообщения обрабатываются другими приложениями, так называемыми потребителями. Указанные сообщения сохраняются в теме, a потребители подписываются на тему для получения новых сообщений.</li>
<li><strong>Luigi</strong> &#8212; это пакет Python (поддерживаются версии 2.7, 3.6, 3.7 и выше), который помогает вам создавать сложные конвейеры пакетных заданий. С помощью Luigi производится управление рабочими процессами, управление зависимостями между задачами, имеется центральный планировщик задач с веб-интерфейсом, статусом выполнения задач и трекингом ошибок, CLI (есть возможность работы через командную строку), failover recovery. Разработан был инженерами из Spotify.</li>
<li><strong>Celery</strong> &#8212; это простая, гибкая и надежная распределенная система для обработки в асинхронном режиме огромного количества сообщений. Инструмент, который позволяет обрабатывать очередь задач, причем с акцентом на обработку в реальном времени, а также с поддержкой планирования задач. С помощью Celery можно запускать отложенный или выделенный код в отдельном процессе или даже на отдельном компьютере или сервере. Также Celery можно использовать для отправки электронных писем.<br /><strong></strong></li>
<li><strong>RabbitMQ</strong> &#8212; это менеджер сообщений (message broker) на основе стандарта AMQP (тиражируемое связующее программное обеспечение, ориентированное на обработку сообщений). Создан на основе системы Open Telecom Platform, написан на языке Erlang, в качестве движка базы данных для хранения сообщений использует Mnesia. Состоит из сервера, библиотек поддержки протоколов HTTP, XMPP и STOMP[en], клиентских библиотек AMQP для Java и .NET Framework и различных плагинов. Если кратко, то это платформа, которая управляет очередью сообщений и к которой могут подключатся различные приложения и передавать/получать сообщения (т.е. предназначен для передачи данных между несколькими сервисами).</li>
<li><strong>ActiveMQ</strong> -это популярный многопротокольный сервер обмена сообщениями на основе Java с открытым исходным кодом. Он поддерживает стандартные отраслевые протоколы. Доступно подключение из C, C ++, Python, .Net и других языков программирования. Работает на основе протокола AMQP. Обмен сообщениями между веб-приложениями осуществляется с помощью STOMP через веб-сокеты. Также для работы с устройствами IoT используется MQTT. Обеспечивает «Enterprise Features», такие как кластеризация, хранение сообщений, с возможностью использовать различные базы данных, кэширование и ведение журналов. Написан на Java с полноценным клиентом Java Message Service (JMS).</li>
<li><strong>Kombu</strong> &#8212; это библиотека для работы с сообщениями на языке Python. Цель Kombu &#8212; максимально упростить обмен сообщениями в Python, предоставив высокоуровневый интерфейс для протокола AMQP, а также предоставить проверенные и проверенные решения для распространенных проблем обмена сообщениями. AMQP &#8212; это расширенный протокол очереди сообщений, открытый стандартный протокол для ориентации сообщений, организации очередей, маршрутизации, надежности и безопасности.</li>
</ul>
<h2><strong>Система контроля версий</strong></h2>
<ul>
<li><strong>Git</strong> &#8212; это бесплатная распределенная система контроля версий (управления версиями) с открытым исходным кодом, предназначенная для быстрой и эффективной работы с небольшими и очень крупными проектами. Хранилище истории разработки проектов, которое содержит в себе все версии его файлов (как текущие, так и старые неактуальные). Контроль версий означает что вы храните все версии редактируемых документов и можете вернуться к любой сохраненной версии в любой момент времени.</li>
<li><strong>Git-Flow</strong> &#8212; это набор расширений git предоставляющий высокоуровневые операции над репозиторием для поддержки модели ветвления Vincent Driessen.</li>
</ul>
<h2><strong>Git Frameworks. Автоматизация CI/CD</strong></h2>
<ul>
<li><strong>GitHub</strong> &#8212; это веб-платформа (облачный сервис по бизнес-модели SaaS), которая предлагает облачный хостинг Git (для контроля версий и совместной работы для разработчиков программного обеспечения). Microsoft, крупнейший участник GitHub, инициировала приобретение GitHub за 7,5 млрд долларов в июне 2018 года. GitHub был запущен в 2008 году и был основан на Git (системе управления открытым исходным кодом, созданная Линусом Торвальдсом для ускорения сборки программного обеспечения). <strong>GitHub это «социальная сеть для разработчиков».</strong> Участникам, кроме непосредственного хранения кода, своих проектов, можно общаться, комментировать изменения друг друга, отслеживать новости знакомых. У программистов есть возможность объединять репозитории и выводить вклад участника в виде дерева.</li>
<li><strong>BitBucket</strong> &#8212; это веб-сервис для хостинга GIT репозитория для контроля версий и совместной разработки проектов, основанный на системе контроля версий Mercurial и Git. Принадлежит Atlassian. Bitbucket предлагает как коммерческие планы, так и бесплатные аккаунты. <strong>Bitbucket интегрируется с другими программами Atlassian, такими как Jira, HipChat, Confluence и Bamboo.</strong> По назначению и основным предлагаемым функциям аналогичен GitHub. Основные преимущества GitHub лежат в области социализации программирования (social coding), Bitbucket больше ориентирован на небольшие закрытые команды разработчиков. Слоган сервиса — Bitbucket is the Git solution for professional teams («Bitbucket — это Git-решение для профессиональных команд»).</li>
<li><strong>GitLab</strong> &#8212; это веб-приложение на основе базы данных, так что его установка немного сложней, чем у некоторых других серверов git. GitLab помогает разработчикам вести непрерывный процесс развертывания для тестирования, создания и деплоя кода, следить за ходом тестов, повышать контроль над качеством, фокусирования на построении продукта вместо настройки инструментов. GitLab — <strong>веб-инструмент жизненного цикла DevOps</strong> с открытым исходным кодом, представляющий систему управления репозиториями кода для Git с собственной вики, системой отслеживания ошибок, CI/CD пайплайном и другими функциями. Код изначально был написан на Ruby, а некоторые его части были позже переписаны на Go.</li>
<li><strong>Jenkins</strong> &#8212; это система с открытым исходным кодом на Java, предназначенная для обеспечения процесса непрерывной интеграции программного обеспечения. Отсоединилась в 2008 году от проекта Hudson, принадлежащего компании Oracle, основным его автором был Косукэ Кавагути. Распространяется под лицензией MIT.</li>
</ul>
<h2><strong>Создание образов, сборка и доставка контейнеров</strong></h2>
<ul>
<li><strong>Docker</strong> &#8212; это программное обеспечение для автоматизации развертывания, быстрой разработки и тестирования приложений. Docker упаковывает ПО в стандартизованные блоки, которые называются контейнерами. Каждый контейнер включает все необходимое для работы приложения: библиотеки, системные инструменты, код и среду исполнения. Благодаря Docker можно быстро развертывать и масштабировать приложения в любой среде и сохранять уверенность в том, что код будет работать. Docker – это операционная система для контейнеров. Подобно тому как виртуальная машина создает виртуальное представление аппаратного обеспечения сервера (то есть устраняет необходимость непосредственно управлять таковым), контейнеры создают виртуальное представление серверной операционной системы. После установки на каждый сервер Docker предоставляет доступ к простым командам, необходимым для сборки, запуска или остановки контейнеров. Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, который может быть перенесён на любую Linux-систему с поддержкой cgroups в ядре, а также предоставляет среду по управлению контейнерами.</li>
<li><strong>OpenShift</strong> &#8212; это открытая и расширяемая платформа приложений-контейнеров, которая позволяет использовать Docker и Kubernetes на предприятии. Разработано компанией RedHat. OpenShift включает в себя Kubernetes для оркестрации контейнеров и управления ими.</li>
<li><strong>Kubernetes</strong> (также известный как <strong>k8s</strong> или «<strong>kube</strong>») &#8212; это платформа оркестрации контейнеров с открытым исходным кодом, которая автоматизирует многие ручные процессы, связанные с развертыванием, управлением и масштабированием контейнерных приложений. Kubernetes является идеальной платформой для размещения облачных приложений, требующих быстрого масштабирования, таких как потоковая передача данных в реальном времени через Apache Kafka.</li>
</ul>
<h2><strong>SQL Based Engines</strong></h2>
<ul>
<li><strong>Apache Hive</strong> — это система управления базами данных на основе платформы Hadoop. Позволяет выполнять запросы, агрегировать и анализировать данные, хранящиеся в Hadoop. Apache Hive был создан корпорацией Facebook и передан под открытой лицензией в собственность фонду Apache Software Foundation. На сегодняшний день эта система используется компанией Netflix и доступна в Amazon Web Services через Amazon Elastic MapReduce. Hive определяет простой SQL-подобный язык запросов, называемый HiveQL (Hive Query Language), что позволяет пользователям, знакомым с SQL легко работать с запросами к данным.</li>
<li><strong>Apache Impala</strong> &#8212; это аналитическая база данных с открытым исходным кодом для Apache Hadoop. Impala обеспечивает быстрые интерактивные SQL-запросы непосредственно на ваших данных Apache Hadoop, хранящихся в HDFS, HBase или Amazon Simple Storage Service (S3). Apache Impala &#8212; это механизм SQL-запросов с открытым исходным кодом для массивно-параллельной обработки (MPP) данных, хранящихся в компьютерном кластере под управлением Apache Hadoop.</li>
<li><strong>Apache Spark</strong> – это <strong>Big Data фреймворк</strong> с открытым исходным кодом для реализации распределённой обработки неструктурированных и слабоструктурированных данных, входящий в экосистему проектов Hadoop. В отличие от классического обработчика из ядра Hadoop, реализующего двухуровневую концепцию MapReduce с хранением промежуточных данных на накопителях, Spark работает в парадигме in-memory computing — обрабатывает данные в оперативной памяти, благодаря чему позволяет получать значительный выигрыш в скорости работы для некоторых классов задач, в частности, возможность многократного доступа к загруженным в память пользовательским данным делает библиотеку привлекательной для алгоритмов машинного обучения. Проект предоставляет программные интерфейсы для языков Java, Scala, Python, R. Изначально написан на Scala, впоследствии добавлена существенная часть кода на Java для предоставления возможности написания программ непосредственно на Java. Состоит из ядра и нескольких расширений, таких как Spark SQL (позволяет выполнять SQL-запросы над данными), Spark Streaming (надстройка для обработки потоковых данных), Spark MLlib (набор библиотек машинного обучения), GraphX (предназначено для распределённой обработки графов).</li>
<li><strong>Presto</strong> &#8212; это высокопроизводительный механизм распределенных SQL-запросов для Big Data (больших данных). Архитектура Presto позволяет пользователям отправлять запросы в различные источники данных, такие как Hadoop, AWS S3, Alluxio, MySQL, Cassandra, Kafka и MongoDB. Можно даже запросить данные из нескольких источников данных в рамках одного запроса. Presto &#8212; это программное обеспечение с открытым исходным кодом для сообщества, выпущенное по лицензии Apache.</li>
</ul>
<ul></ul>
<h2><strong>Качество кода</strong></h2>
<ul>
<li><strong>PIP8</strong> &#8212; это</li>
<li><strong>code review</strong> &#8212; это</li>
<li><strong>code refactoring</strong> &#8212; это</li>
</ul>
<h2><strong>JavaScript Инструменты</strong></h2>
<ul>
<li><strong>Socket.IO</strong> &#8212; это JavaScript библиотека, которая обеспечивает двустороннюю и основанную на событиях связь между браузером и сервером в режиме реального времени. Состоит из двух частей: клиентской, которая запускается в браузере и серверной для node.js. Socket.IO главным образом использует протокол WebSocket, но если нужно, использует другие методы, например Adobe Flash сокеты, JSONP запросы или AJAX запросы. Может быть установлена через npm (node package manager).</li>
<li><strong>NodeJS</strong> — это среда выполнения кода на JavaScript, созданная на основе движка Chrome V8 JavaScript, который позволяет транслировать вызовы на языке JavaScript в машинный код. NodeJS превращает JavaScript из узкоспециализированного языка в язык общего назначения. Node.js добавляет возможность JavaScript взаимодействовать с устройствами ввода-вывода через свой API (написанный на C++), подключать другие внешние библиотеки, написанные на разных языках, обеспечивая вызовы к ним из JavaScript-кода. Node.js применяется преимущественно на сервере, выполняя роль веб-сервера, но есть возможность разрабатывать на Node.js и десктопные оконные приложения (при помощи NW.js, AppJS или Electron для Linux, Windows и macOS) и даже программировать микроконтроллеры (например, tessel, low.js и espruino). В основе Node.js лежит событийно-ориентированное и асинхронное (или реактивное) программирование с неблокирующим вводом/выводом.</li>
<li><strong>Express.js (или просто Express)</strong> &#8212; это быстрый, гибкий, минималистичный веб-фреймворк для приложений Node.js, реализованный как свободное и открытое программное обеспечение под лицензией MIT. Он спроектирован для создания веб-приложений и API. Де-факто является стандартным каркасом для Node.js. Express может являться backend&#8217;ом для программного стека MEAN, вместе с базой данных MongoDB и каркасом Vue.js, React или AngularJS для frontend&#8217;а.</li>
<li><strong>WebSocket</strong> — это протокол связи поверх TCP-соединения, предназначенный для обмена сообщениями между браузером и веб-сервером в режиме реального времени. Веб-сокеты (Web Sockets) — это передовая технология, которая позволяет создавать интерактивное соединение между клиентом (браузером) и сервером для обмена сообщениями в режиме реального времени. Веб-сокеты, в отличие от HTTP, позволяют работать с двунаправленным потоком данных. WebSocket — это своего рода канал связи, открытый в двух направлениях.</li>
<li><strong>Vue.js</strong> — open source JavaScript веб-фреймворк с открытым исходным кодом для создания пользовательских интерфейсов. Легко интегрируется в проекты с использованием других JavaScript-библиотек. Может функционировать как веб-фреймворк для разработки одностраничных приложений в реактивном стиле. С его помощью можно создавать динамические сайты и сложные одностраничные веб-приложения. Ядро фреймворка ориентировано на решение задач уровня представления, благодаря чему фреймворк несложно интегрировать в проекты совместно с дополнительными библиотеками и различными инструментами. В отличие от React.js, jQuery, AngularJS и других фреймворков, Vue.js достаточно прост для изучения. Но, как и с другими JS-фреймворками, потребуются знания основ CSS, HTML и JavaScript, поэтому советуем сначала изучить их.</li>
<li><strong>Vuex</strong> &#8212; это шаблон/паттерн управления состоянием + библиотека для приложений Vue.js. Vuex можно рассматривать как единый источник данных для всего приложения. Vuex — это библиотека управления состоянием, специально предназначенная для создания сложных крупномасштабных приложений Vue.js. Она использует глобальное централизованное хранилище для всех компонентов в приложении, используя преимущества собственной системы реактивности для мгновенных обновлений. Хранилище Vuex спроектировано таким образом, что невозможно изменить его состояние из какого-либо компонента. Это гарантирует, что состояние может быть изменено только предсказуемым образом. Таким образом, хранилище становится единственным источником истины: каждый элемент данных хранится только один раз и доступен только для чтения, чтобы предотвратить разрушение компонентами приложения состояния, к которому обращаются другие компоненты. Хранилище Vuex — реактивное.</li>
<li><strong>Vue-router</strong> &#8212; является официальным маршрутизатор для Vue.js. Он тесно интегрируется с ядром Vue.js, что позволяет без проблем создавать одностраничные приложения с Vue.js.</li>
<li><strong>React</strong> — это декларативная, эффективная и гибкая библиотека JavaScript с открытым исходным кодом для разработки пользовательских интерфейсов. React может использоваться для разработки одностраничных и мобильных приложений. Его цель — предоставить высокую скорость, простоту и масштабируемость. В качестве библиотеки для разработки пользовательских интерфейсов React часто используется с другими библиотеками, такими как MobX, Redux и GraphQL.</li>
<li><strong>Angular</strong> — это JavaScript-фреймворк с открытым исходным кодом, написанный на языке TypeScript и который разрабатывается командой из компании Google, а также сообществом разработчиков из различных компаний. Цель фреймворка — расширение браузерных приложений на основе MVC-шаблона, а также упрощение тестирования и разработки.</li>
</ul>
<h2><strong>Траблшутинг</strong></h2>
<ul>
<li><strong>Wireshark</strong> — программа-анализатор сетевых протоколов (трафика для компьютерных сетей). Имеет графический пользовательский интерфейс. Он позволяет вам видеть то, что происходит в вашей сети, на микроскопическом уровне и является стандартом де-факто (и часто де-юре) для многих коммерческих и некоммерческих предприятий, государственных учреждений и образовательных учреждений. Развитие Wireshark процветает благодаря добровольному вкладу сетевых экспертов по всему миру и является продолжением проекта, начатого Джеральдом Комбсом в 1998 году. Работает на Windows, Linux, macOS, Solaris, FreeBSD, NetBSD и многих других платформах. Имеется выгрузка данных (экспорт данных) в XML, PostScript, CSV или простой текст (txt).</li>
<li><strong>Strace</strong> &#8212; утилита для Linux, которая позволяет отследить выполнение системных вызовов (system call) и сигналов к ядру системы. Она используется для мониторинга и вмешательства во взаимодействие между процессами и ядром Linux, которое включает системные вызовы, доставку сигналов и изменения состояния процессов. Операция strace стала возможной благодаря функции ядра, известной как ptrace. Присутствует во многих дистрибутивах Linux по умолчанию. strace может использоваться для отправки багрепортов разработчикам.</li>
<li><strong>Procmon (Process Monitor)</strong> — это инструмент отслеживания для Windows. В режиме реального времени отображает активность файловой системы, реестра, а также процессов и потоков, включая расширенную и безвредную фильтрацию, всеобъемлющие свойства событий, такие как ID сессий и имена пользователей, достоверную информацию о процессах, полноценный стек потока со встроенной поддержкой всех операций, одновременный запись информации в файл и многие другие возможности. Эти уникальные возможности делают Process Monitor ключевым инструментом для устранения неполадок и избавления от вредоносных программ.</li>
<li><strong>gdb</strong> — это переносимый отладчик проекта GNU, который умеет производить отладку многих языков программирования, включая Си, C++, Free Pascal, FreeBASIC, Ada, Фортран, Python3, Swift, NASM и Rust. GDB можно подключить к VSCode и другим редакторам кода (Включая Vim, NeoVim, Emacs, Atom и др.). GDB может работать на большинстве популярных вариантов UNIX и Microsoft Windows, а также на Mac OS X.</li>
<li><strong>Syslog (system log &#8212; системный журнал)</strong> &#8212; это стандарт отправки и регистрации сообщений о происходящих в системе событиях (то есть создания событийных журналов), использующийся в компьютерных сетях, работающих по протоколу IP. Термином &#171;syslog&#187; называют как ныне стандартизированный сетевой протокол syslog, так и программное обеспечение (приложение, библиотеку), которое занимается отправкой и получением системных сообщений.</li>
<li><strong>Windows Event Log (Средство просмотра событий Windows)</strong> &#8212; отображает журнал приложений и системных сообщений, включая ошибки, информационные сообщения и предупреждения. Это полезный инструмент для устранения различных проблем Windows. Можно выгрузить журнал в текстовый файл.</li>
</ul>
<h2><strong>BI &#8212; Business intelligence. Системы бизнес-аналитики</strong></h2>
<p>Ниже будут описаны 3 bi системы, по квадранту гартнера их можно упорядочить как:</p>
<ol>
<li>Power BI</li>
<li>Tableau</li>
<li>Qlik Sense</li>
</ol>
<p>Из всех трех я бы однозначно отдал первенство Power BI, т.к. будем откровенны &#8212; ни одна компания в мире не обладает потенциалом, который есть у Microsoft для работы с данными компаний. По сути, Power BI родился из Excel, сервисов хранилищ данных Microsoft. Инструментарий очень богат, плюс есть огромное множество интеграций с другим софтом (Python, R и др.).</p>
<p><strong>Tableau</strong> на втором месте по большей части из-за очень крутой визуализации.</p>
<p>Ну а<strong> Qlik Sense</strong> занимает третье место (по инерции), т.к. когда то был лидером квадранта и многие компании до сих пор используют это ПО. У меня есть опыт работы с Qlik Sense и хочу сказать, что мне сложно его отнести к лидерам BI инструментов, т.к. QlikTech развивает свою экосистему обработки данных в ущерб функционалу BI. Что несомненно сказалось на позициях Qlik Sense на рынке. Плюс QlikTech свернул свой бесплатный софт Qlik Sense Desktop, что несомненно негативно отразилось на настроениях специалистов.</p>
<ul>
<li><strong>Power BI</strong> — это это платформа бизнес-аналитики (Business Intelligence), которая предоставляет инструменты для агрегирования, анализа, визуализации данных. Как правило все инструменты максимально адаптированы для нетехнических пользователей для построения аналитических панелей. В случае больших объемов данных или сложной логики приложений требуется более углубленный технический бэкграунд для создания приложений. С помощью Power BI Вы можете построить дашборд с нужными KPI по компании. Power BI состоит из настольного приложения Windows, которое называется Power BI Desktop (в нем Вы создаете само приложение), онлайн-служба SaaS под названием Power BI Service (туда публикуется приложение из Power BI Desktop), а также мобильное приложение Power BI, которое доступно для платформ iOS, Android и Windows.</li>
<li><strong>Tableau</strong> – BI-система интерактивной аналитики, которая позволяет в кратчайшие сроки проводить глубокий и разносторонний анализ больших массивов информации и не требующая обучения бизнес-пользователей и дорогостоящего внедрения. Tableau Online — это онлайн-сервис (функционал Tableau Desktop, но удаленно, в облаке), Tableau Prep &#8212; подготовка данных к работе в Tableau, Tableau Server &#8212; ПО для установки BI на серверах компании. Также имеется мобильное приложение.</li>
<li><strong>Qlik Sense</strong> — это платформа для анализа данных / система бизнес-аналитики (Business Intelligence), которая позволяет создавать аналитические приложения (агрегирование данных, визуализация). В отличии от Power BI, можно купить свой Enterprice сервер и поставить на сервер компании. У Power BI тоже такое есть, но вроде как за очень большие деньги (честно сказать деталей не знаю). По сравнению с Power BI больше подходит для технических пользователей. Загрузку данных нужно кодить, есть визуальные инструменты, но они более скудные по функционалу и возможностям. Хотя есть платные расширения VizLib, которые разрабатывает тот же QlikTech, но это уже за дополнительные деньги. Сервер внутри компании облегчает доступ к данным, т.к. не нужно весь массив данных компании выводить в онлайн (создавать онлайн хранилище, закачивать данные в облако и т.д.). Также Qlik Sense имеет очень мощный API, с полным доступом ко всем функциям платформы Qlik Sense. Но стоит заметить, что подобный функционал не нужен в 85% случаев. Возможно только если компания захочет сделать свой &#171;космолет&#187;, который будет стоить очень больших денег на этапе эксплуатации.</li>
</ul>
<h3><strong>Другие системы визуализации данных, которые можно использовать в своих проектах</strong></h3>
<ul>
<li><strong>Prometheus</strong> &#8212; это</li>
<li><strong>Kibana</strong> &#8212; это</li>
<li><strong>Grafana</strong> &#8212; это</li>
<li><strong>Graphite</strong> &#8212; это</li>
</ul>
<h2><strong>Принципы разработки программного обеспечения</strong></h2>
<ul>
<li><strong>SOA (Service Oriented Architecture)</strong> &#8212; это модульный подход к разработке программного обеспечения, основанный на использовании распределённых, слабо связанных заменяемых компонентов, оснащённых стандартизированными интерфейсами для взаимодействия по стандартизированным протоколам. интеграции информационной инфраструктуры компании за счет построения архитектуры, позволяющей интегрировать с максимальной гибкостью разнородные приложения.</li>
</ul>
<blockquote>
<p><strong>В основе SOA</strong> лежат принципы многократного использования функциональных элементов ИТ, ликвидации дублирования функциональности в ПО, унификации типовых операционных процессов, обеспечения перевода операционной модели компании на централизованные процессы и функциональную организацию на основе промышленной платформы интеграции.</p>
<p><strong>С помощью SOA реализуются три аспекта ИТ-сервисов:</strong></p>
<ul>
<li><em>Сервисы бизнес-функций, </em></li>
<li><em>Сервисы инфраструктуры, </em></li>
<li><em>Сервисы жизненного цикла.</em></li>
</ul>
</blockquote>
<ul>
<li><strong>Архитектура SPA (Single-Page Application или одностраничные приложения)</strong> &#8212; тип веб-приложений, состоящие из одной страницы, на которых динамически обновляется контент, в зависимости от действий пользователей. При таком подходе разработки экономится время на повторную загрузку одних и тех же элементов (библиотек JS, стилей CSS, структуры сайта, меню и т.д.). По большей части этот подход реализуется за счет инструментов JavaScript (React.js, Angular.js, Vue.js и др.).</li>
<li><strong>Архитектура MPA (Multi-Page Application или многостраничные приложения)</strong> &#8212; в многостраничных приложениях каждая страница отправляет запрос на сервер и полностью обновляет все данные. Даже если эти данные небольшие. Таким образом тратятся ресурсы как сервера, так и браузера клиента на перерисовку одних и тех же элементов. Соответственно это сказывается на работоспособности сайта. Поэтому многие разработчики, для того чтобы повысить скорость и уменьшить нагрузку, используют комбинированный подход: сайт состоит из разных страниц (главная, корзина, категории товаров, информация и т.п.), но на каждой странице есть динамическая составляющая работы, например, на странице категории товаров при работе с фильтрами товары подгружаются/обновляются/фильтруются с помощью JavaScript (без перезагрузки всей страницы).</li>
<li><strong>Паттерн (Design Pattern &#8212; Шаблон проектирования)</strong> — многократно используемые архитектурные конструкции для решения известных и распространенных проблем проектирования программного обеспечения.<br />MVC, MVP и MVVM &#8212; три популярных шаблона проектирования в разработке программного обеспечения.</li>
<li><strong>MVC &#8212; Model-View-Controller в веб-приложении:</strong> 1) Пользователь вводит URL-адрес, 2) <strong>Контроллер (Controller)</strong> получает этот запрос, 3) Контроллер использует <strong>Модель (Model)</strong> для получения всех необходимых данных, организует их, и пересылает их 4) <strong>Представлению (View)</strong>, которое затем использует эти данные, чтобы отрисовать готовую страницу для пользователя в браузере. Т.е. <strong>Модель</strong> &#8212; это механизм общения с базой данных. <strong>Контролер</strong> &#8212; это функционал, который управляет последовательностью действий, принимает данные и передает их. <strong>View</strong> &#8212; отвечает за фронтэнд (frontend), то что видит пользователь.</li>
<li><strong>Паттерн MVP (Model-View-Presenter)</strong> &#8212; шаблон проектирования, производный от MVC, который используется в основном для построения пользовательского интерфейса. Состоит из 1) Модели (данные для отображения), 2) Вида/View (отображает данные из модели, обращается к Presenter), и 3) Представитель/Presenter (реализует взаимодействие между Моделью и Видом и содержит в себе всю бизнес-логику). По сути Presenter &#8212; это контроллер MVC, за исключением того, что он вообще не привязан к View, а просто взаимодействует с интерфейсом. Это решает проблемы тестируемости, а также проблемы модульности / гибкости, которые у нас были с MVC. Presenter сидят на одном уровне с View, слушая события как из View, так и из Model, и связывает действия между ними.</li>
<li><strong>Паттерн MVVM (Model-View-View Model)</strong> &#8212; модель, представление и третий компонент – дополнительная модель под названием ViewModel. MVVM позволяет нам создавать специфичные для View подмножества модели, которые могут содержать информацию о состоянии и логике, избегая необходимости представлять всю модель для представления. Шаблон MVVM поддерживает двустороннюю привязку данных между View и View-Model. Это позволяет автоматически распространять изменения внутри состояния View-Model на View.</li>
</ul>
<blockquote>
<p><strong>И MVP, и MVVM являются производными от MVC.</strong> Основное различие между MVC и его производными заключается в зависимости каждого слоя от других уровней, а также от того, насколько тесно они связаны друг с другом.</p>
<p>MVP и MVVM лучше по сравнению с MVC, разбивают ваше приложение на модульные, специализированные компоненты, но они также увеличивают сложность вашего приложения. Для очень простого приложения с одним или двумя экранами MVC может работать очень хорошо. MVVM с привязкой данных привлекателен, поскольку он следует более реактивной модели программирования и требует меньше кода.</p>
</blockquote>
<ul>
<li><strong>ESB (Enterprise Service Bus &#171;сервисная шина предприятия&#187;)</strong> &#8212; это концепция, элемент архитектуры IT-ландшафта, используемый для решения задачи интеграции разрозненных информационных систем в единый программный комплекс с централизованным управлением передачей информации и применением сервис-ориентированного подхода. Архитектура ESB строится на 3 компонентах: набор коннекторов, очередь сообщений, платформа. Архитектура ESB заключается во взаимодействии всех приложений через единую точку. При замене одного приложения, подключенного к шине, нет необходимости перенастраивать остальные.</li>
<li><strong>SOLID </strong>&#8212; принцип, за которым скрывается рекомендация следовать 5 базовым принципам ООП:
<ul>
<li><strong><span style="color: #ff6600;">S</span>ingle Responsibility Principle (принцип единственности ответственности)</strong> &#8212; один класс отвечает за один функционал.</li>
<li><strong><span style="color: #ff6600;">O</span>pen/Closed Principle (принцип открытости/закрытости)</strong> &#8212; программные сущности должны быть открыты к расширению, но закрыты к изменению.</li>
<li><strong><span style="color: #ff6600;">L</span>iskov Substitution Principle (принцип подстановки Барбары Лисков)</strong> &#8212; сущность, которая использует объект, реализующий определенный интерфейс, должна иметь возможность использовать другой объект с тем же интерфейсом, даже не зная об этом. Подклассы не могут замещать поведения базовых классов. Подтипы должны дополнять базовые типы.</li>
<li><strong><span style="color: #ff6600;">I</span>nterface Segregation Principle (принцип разделения интерфейса)</strong> &#8212; клиенты не должны зависеть от методов, которые они не используют. Слишком &#171;толстые&#187; интерфейсы необходимо дробить на более мелкие и специфические, чтобы клиенты маленьких интерфейсов знали только о методах, которые необходимы им в работе.</li>
<li><strong><span style="color: #ff6600;">D</span>ependency Inversion Principle (принцип инверсии зависимостей)</strong> &#8212; Модули верхнего уровня не зависят от модулей нижнего уровня. И те, и другие должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.</li>
</ul>
</li>
<li><strong>KISS (&#171;Keep It Simple, Stupid&#187; или &#171;<span>Keep It Short and Simple</span>&#171;) </strong>&#8212; это принцип проектирования и программирования, согласно которому основной целью (ценностью) при разработке системы является её простота. Большинство систем работают лучше всего, если они остаются простыми, а не усложняются. Основная суть принципа: 1) нужно реализовывать только тот функционал, который необходим пользователю и описан в ТЗ, не нужно <span>закладывать в проект избыточные функции &#171;про запас&#187;</span>. 2) не нужно делать реализацию сложной универсальной бизнес-логики под все варианты поведения системы (это невозможно и с коммерческой точки зрения не принесет выгоды). 3) не стоит подключать огромную библиотеку ради пары функций.</li>
<li><strong>DRY (Don&#8217;t Repeat Yourself) </strong>&#8212; <span>не повторяйся</span>. Принцип DRY известен также как <strong>DIE (Duplication Is Evil)</strong> &#8212; дублирование это зло. Принцип состоит в том, что нужно избегать использования одного и того же кода. Дубли кода лучше заменять на универсальные свойства и/или функции.</li>
<li><strong>YAGNI (You Aren&#8217;t Gonna Need It) &#8212; &#171;Вам это не понадобится&#187;</strong> &#8212; это принцип проектирования программ/систем, согласно которому в качестве главной цели (ценности) является отказ от избыточной функциональности, которая не заявлена заказчиком. Исходя из экономики проекта можно сделать вывод, что любые реализованные &#171;фичи&#187; были оплачены либо Заказчиком, либо Исполнителем. В одном случае это завышенный бюджет проекта, в другом случае это уменьшенная прибыль. Любые дополнительные фичи в дальнейшем усложняют эксплуатацию систем/программ/проектов, увеличивают количество ошибок и снижают понимание клиентом продукта. Есть такая поговорка &#171;лучший код — это ненаписанный код&#187;. Помните, что ни одно гибкое решение никогда не будет достаточно гибким. При изменении входных параметров в системе что-то может &#171;сломаться&#187;, испортится бизнес-логика и т.д.</li>
<li><strong>GRASP (General Responsibility Assignment Software Patterns) </strong>&#8212; это шаблоны, используемые в объектно-ориентированном проектировании для решения общих задач по назначению ответственностей классам и объектам. GRASP состоит из 5 основных и 4 дополнительных шаблонов.</li>
<li><strong>SoC (Separation of Concerns)</strong> &#8212; это принцип в области разработки программного обеспечения, суть которого заключается в следующем: не пишите свою программу как один сплошной блок, вместо этого разбивайте код на куски, которые представляют собой крошечные фрагменты системы, каждый из которых способен выполнить простую отдельную работу. Разделение ответственностей &#8212; это процесс разделения компьютерной программы на функциональные блоки, которые не будут перекрывать функции друг друга.</li>
<li><strong>4C’s (Clean Code &gt; Clever Code)</strong> &#8212; дословно означает &#171;Чистый код -&gt; Умный код&#187;. Отладка в два раза сложнее написания первоначального кода.</li>
<li><strong>SLAP (Single Level Of Abstraction) &#8212; это Принцип Единого Уровня Абстракции:</strong> Идея заключается в том, что в рамках определенного метода/функции мы должны стремиться сохранить весь код на одном уровне абстракции, чтобы легче было его читать. Весь смысл заключается в том, чтобы при чтении кода нам приходилось держать в голове меньше контекста о коде и мы могли просто прочитать код и быстро понять, что происходит. Раскладывайте длинные методы/функции на более короткие методы/функции, каждый из которых несет решает одну задачу и имеет четкое название, прочитав которое станет понятно, что функция делает.</li>
</ul>
<h2><strong>Протоколы передачи финансовых данных</strong></h2>
<ul>
<li><strong>FIX (Financial Information eXchange)</strong> &#8212; открытый стандарт передачи информации в электронном виде, который передает финансовую информации и автоматизации коммуникаций на фондовом рынке. Протокол не справлялся с возросшим объёмом финансовой информации, генерируемой на фондовом рынке. При передачи больших объёмов данных с помощью FIX возникали значительные задержки в их обработке, что приносило трейдерам убытки и лишало их возможности разработки действующих торговых стратегий. Поэтому в 2004 году было решено разработать новый протокол (FAST), целью которого было добиться возможности передачи больших объёмов данных, избегая появления задержек в получении информации.<br /><strong></strong></li>
<li><strong>FAST (FIX Adapted for STreaming)</strong> &#8212; бинарный вариант протокола FIX, который был адаптирован для поточной передачи данных по сети. FAST позволяет в более компактном виде передавать большие объёмы информации о рыночных сделках, применяется в высокоскоростных торговых системах, требующих низких задержек передачи. Трейдеры могут получать по FAST таблицы финансовых инструментов (цены, объёмы торгов и т.п.), котировки, все сделки, индексы, а также информацию обо всех активных обезличенных заявках. Используется на многих мировых биржах, в том числе и на Московской бирже и Санкт-Петербургской бирже.</li>
</ul>
<h2><strong>Архитектурные подходы к проектированию модели данных</strong></h2>
<ul>
<li><strong>Kimball</strong> &#8212; это</li>
<li><strong>Inmon </strong>&#8212; это</li>
<li><strong>Data Vault</strong> &#8212; это</li>
<li><strong>Data Lake</strong> &#8212; это</li>
</ul>
<ul></ul>
<h2><strong>ETL, ELT, Data Pipeline &#8212; термины по обработке данных</strong></h2>
<h3><span style="color: #ff6600;"><strong>Что такое Data Pipeline или Конвейер данных?</strong></span></h3>
<p><strong>Data Pipeline (Конвейер данных)</strong> &#8212; это программное обеспечение, которое исключает множество ручных шагов из процесса и обеспечивает плавный, автоматизированный поток данных от одной станции к другой. Data Pipeline начинается с определения того, какие данные, откуда и как собирать. Он автоматизирует процессы, связанные с извлечением, преобразованием, объединением, проверкой и загрузкой данных для дальнейшего анализа и визуализации. Конвейер данных обеспечивает сквозную передачу данных, устраняя ошибки, узкие места или задержки. Data Pipeline может обрабатывать несколько потоков данных одновременно. Короче говоря, это абсолютная необходимость для современного data-driven предприятия.</p>
<p>Конвейер данных рассматривает все данные как потоковые данные и обеспечивает гибкие схемы. Независимо от того, поступают ли они из статических источников (например, базы данных с плоскими файлами) или из источников в реальном времени (например, онлайн розничные транзакции), конвейер данных делит каждый поток данных на более мелкие порции, которые он обрабатывает параллельно, предоставляя дополнительную вычислительную мощность.</p>
<p>Конвейер данных не требует, чтобы конечным пунктом назначения было хранилище данных. Он может направлять данные в другое приложение, такое как инструмент визуализации или Salesforce. Думайте о Data Pipeline как об окончательной сборочной линии.</p>
<h3><span style="color: #ff6600;"><strong>Чем конвейер данных отличается от ETL?</strong></span></h3>
<p><strong>ETL расшифровывается как Extract, Transform и Load.</strong> Системы ETL извлекают данные из одной системы, преобразуют их и загружают в базу данных или хранилище данных. Устаревшие конвейеры ETL обычно работают в пакетном режиме, что означает, что данные перемещаются единым большим блоком в определенное время в целевое хранилище данных. Как правило, это происходит по заданному расписанию или через регулярные запланированные интервалы. Например, вы можете настроить запуск пакетов в 00:30 каждый день, когда нагрузка на системы учета (ERP, MES и т.д.) низкая.</p>
<p><strong>&#171;Конвейер данных&#187;</strong> является более широким термином, который охватывает ETL как подмножество. Конвейер данных относится к системе для перемещения данных из одной системы в другую. Данные могут преобразовываться или не преобразовываться, и они могут обрабатываться в режиме реального времени (в потоковом режиме) вместо пакетного типа обработки. Кроме того, данные могут не загружаться в базу данных или хранилище данных. Конвейер данных может использоваться для разных целей: таких как корзина AWS (контейнеры для объектов) или озеро данных, или может запускать триггер в другой системе, например, для запуска определенного бизнес-процесса.</p>
<h3><span style="color: #ff6600;"><strong>ETL и ELT</strong></span></h3>
<p><strong>7 отличий ETL от ELT:</strong></p>
<ol>
<li><strong>ETL</strong> &#8212; это извлечение, преобразование и загрузка данных, а ELT &#8212; извлечение, загрузка и преобразование данных.</li>
<li>В <strong>ETL</strong> данные перемещаются из источника данных в промежуточное хранилище (Data Staging) и затем в хранилище данных.</li>
<li><strong>ELT</strong> использует хранилище данных для базовых преобразований. Data Staging не требуется.</li>
<li><strong>ETL</strong> обеспечивает конфиденциальность данных (data privacy), производится очистка данных и их преобразования.</li>
<li><strong>ETL</strong> может выполнять сложные преобразования данных и может быть более рентабельным, чем ELT.</li>
<li><strong>ETL</strong> применяется для работы с хранилищами данных</li>
<li><strong>ELT</strong> применяется, когда необходимо создавать озера данных.</li>
</ol>
<p><strong>Извлечение (Extract):</strong> это выгрузка исходных данных из исходной базы данных или источника данных (API, Excel, txt, csv и т.д.). При использовании ETL данные попадают во временную промежуточную область. В ELT данные сразу попадают в систему хранения озера данных.<br /><strong>Преобразование (Transform):</strong> это процесс изменения структуры информации, поэтому оно интегрируется с целевой системой данных и остальными данными в этой системе.<br /><strong>Загрузка (Load):</strong> относится к процессу внесения информации в систему хранения данных.</p>
<h4><strong>Что такое ETL?</strong></h4>
<p><strong>ETL (или Извлечение, Преобразование, Загрузка)</strong> &#8212; это сбор и обработка данных из различных источников в одно хранилище данных, где они могут быть проанализированы. Ваша компания имеет доступ ко многим источникам данных, но чаще всего эти данные представляются менее полезным для вас способом. Результаты этого анализа могут быть использованы для информирования ваших бизнес-стратегий и решений.</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/04/ETL_Process_Schema.png"><img fetchpriority="high" decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/04/ETL_Process_Schema.png" alt="" width="665" height="354" class="aligncenter size-full wp-image-1183" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/04/ETL_Process_Schema.png 665w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/04/ETL_Process_Schema-300x160.png 300w" sizes="(max-width: 665px) 100vw, 665px" /></a></p>
<h4><strong>Что такое ELT?</strong></h4>
<blockquote>
<p><strong>ELT</strong> позволяет загрузить все данные немедленно, а пользователи могут позже определить, какие данные преобразовать и анализировать.</p>
</blockquote>
<p>Для начала рассмотрим термин <strong>&#171;Озера данных&#187;</strong> &#8212; это особые виды хранилищ данных, которые, в отличие от хранилищ данных OLAP, принимают любые виды структурированных или неструктурированных данных. Озера данных не требуют от вас преобразования данных перед их загрузкой. Вы можете немедленно загрузить любую необработанную информацию в озеро данных, независимо от ее формата или отсутствия формата. Преобразование данных все еще необходимо, прежде чем анализировать данные с помощью платформы бизнес-аналитики. Однако очистка, обогащение и преобразование данных происходят после загрузки данных в озеро данных.</p>
<p><strong>ELT</strong> &#8212; это относительно новая технология, которая стала возможной благодаря современным облачным серверным технологиям. ELT в сочетании с озером данных позволяет вам сразу же получать доступ к постоянно расширяющемуся пулу необработанных данных по мере их доступности. Основное преимущество ELT перед ETL связано с гибкостью и простотой хранения новых неструктурированных данных. С ELT вы можете сохранить любой тип информации &#8212; даже если у вас нет времени или возможности сначала преобразовать и структурировать ее &#8212; обеспечивая немедленный доступ ко всей вашей информации, когда вы этого хотите. Кроме того, вам не нужно разрабатывать сложные процессы ETL до поступления данных, что экономит время разработчиков и аналитиков BI при работе с новой информацией.</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/04/ELT_Process_Schema.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/04/ELT_Process_Schema.png" alt="" width="655" height="354" class="aligncenter size-full wp-image-1184" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/04/ELT_Process_Schema.png 655w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/04/ELT_Process_Schema-300x162.png 300w" sizes="(max-width: 655px) 100vw, 655px" /></a></p>
<h3>Управление данными</h3>
<ul>
<li><strong>Управление данными</strong> &#8212; общее управление доступностью, удобством использования, целостностью и безопасностью корпоративных данных. Это процесс создания согласованных и связанных слоев данных. Управление данными обеспечивает демократизацию данных, предоставляя целостное представление о постоянно расширяющейся вселенной данных для всех клиентов данных.</li>
<li><strong>Демократия данных</strong> &#8212; помогает всем, кому необходим доступ к аналитике данных в вашей компании, сократить крутые кривые обучения, задать правильные вопросы о данных и принять участие в процессе уточнения ответов.</li>
</ul>
<h3><strong>Виды трансформации данных</strong></h3>
<ul>
<li><strong>Дедупликация (нормализация) / Deduplication (normalizing):</strong> идентифицирует и удаляет дублирующую информацию.</li>
<li><strong>Перестройка ключей / Key restructuring:</strong> создание ключевых соединений одних таблиц с другими.</li>
<li><strong>Очистка / Cleansing:</strong> включает удаление старых, неполных и дублированных данных, чтобы максимизировать точность данных &#8212; путем анализа данных для удаления синтаксических ошибок, опечаток и фрагментов записей.</li>
<li><strong>Пересмотр формата / Format revision:</strong> преобразует форматы в разных наборах данных &#8212; таких как дата / время, мужчина / женщина и единицы измерения &#8212; в один согласованный формат.</li>
<li><strong>Деривация / Derivation:</strong> создает правила преобразования, которые применяются к данным. Например, может быть, вам нужно вычесть определенные затраты или налоговые обязательства из показателей доходов бизнеса, прежде чем анализировать их.</li>
<li><strong>Агрегирование / Aggregation:</strong> собирает и ищет данные, чтобы их можно было представить в виде сводного отчета.</li>
<li><strong>Интеграция / Integration:</strong> согласовывает различные имена / значения, которые применяются к одним и тем же элементам данных в хранилище данных, так что каждый элемент имеет стандартное имя и определение.</li>
<li><strong>Фильтрация / Filtering:</strong> выбирает определенные столбцы, строки и поля в наборе данных.</li>
<li><strong>Разделение / Splitting:</strong> разбивает один столбец на несколько столбцов.</li>
<li><strong>Присоединение / Joining:</strong> связывает данные из более чем одного источника, например, добавляет информацию о расходах на более чем одну платформу SaaS.</li>
<li><strong>Суммирование / Summarization:</strong> создает различные бизнес-показатели путем вычисления итоговых значений. Например, вы можете сложить все продажи, сделанные конкретным продавцом, чтобы создать метрики общих продаж за определенные периоды.</li>
<li><strong>Валидация / Validation:</strong> устанавливает автоматические правила, которым необходимо следовать при различных обстоятельствах. Например, если первые пять полей в строке имеют значение ПУСТО (NULL), вы можете пометить строку для исследования или запретить ее обработку с остальной информацией.</li>
</ul>
<h2>Системы мониторинга баз данных, IT-инфраструктуры</h2>
<ul>
<li><strong>Sentry</strong> &#8212; это</li>
<li><strong>ELK + elastalert</strong> &#8212; это</li>
<li><strong>Prometheus </strong>&#8212; это</li>
<li><strong>newrelic </strong>&#8212; это</li>
<li><strong>Kibana </strong>&#8212; это</li>
<li><strong>Grafana </strong>&#8212; это</li>
<li><strong>Zabbix</strong> — свободно распространяемая система универсального мониторинга любой <strong>IT инфраструктуры</strong> (сервисов компьютерной сети, серверов и сетевого оборудования), облачных ресурсов, сервисов и приложений, написанная Алексеем Владышевым. Для хранения данных используется MySQL, PostgreSQL, SQLite или Oracle Database, веб-интерфейс написан на PHP.</li>
</ul>
<h2><strong>Системы/Приложения/Сервисы для проектирования пользовательских интерфейсов</strong></h2>
<ul>
<li><strong>Balsamiq</strong> &#8212; это</li>
<li><strong>Axure </strong>&#8212; это</li>
<li><strong>Pencil </strong>&#8212; это</li>
<li><strong>Visio </strong>&#8212; это</li>
<li><strong><a href="https://app.diagrams.net/" target="_blank" rel="noopener noreferrer">app.diagrams.net</a> </strong>&#8212; это</li>
</ul>
<h2><strong>Системы управления конфигурацией</strong></h2>
<ul>
<li><strong>Ansible</strong> &#8212; это</li>
</ul>
<h2><strong>Терминология для разработчика (независимо от языка программирования)</strong></h2>
<ul>
<li><strong>DevOps.</strong> Термин, объединяющий разработку и эксплуатацию. Объединяет методы и шаблоны, способствующие налаживанию сотрудничества между специалистами команды разработчиков, направляет процесс разработки высококачественного программного обеспечения. Эти методы и шаблоны помогают командам писать пригодные для тестирования и поддержания кодов пакетные продукты, развертки и сохранять развертку кода.</li>
<li><strong>Выпуск продукта (Product Release).</strong> Выпуск продукта ПО может состоять из нового продукта или функций уже существующего. В контексте Agile функция может складываться из одной и более пользовательских историй.</li>
<li><strong>Продукт с минимальным функционалом (MVP)</strong> &#8212; продукт, который имеет достаточно ключевых функций, позволяющих делать развертку на небольшие группы потенциальных клиентов. Эти люди формируют часть цикла обратной связи build-measure-learn, или проверенного обучения, направляя дальнейшую разработку и принятие решений. Продукт с минимальным функционалом также используется для представления последних внесенных изменений, которые могут повысить его привлекательность для клиентов.</li>
<li><strong>Разработка на основе наборов (Set-based Development).</strong> В процессе разработки на основе наборов несколько специалистов или команд, независимо друг от друга, предлагают варианты решения проблемы. Заинтересованные стороны, представители бизнеса или другие участники процесса оценивают результаты и выбирают наиболее подходящий.</li>
<li><strong>Разработка на основе приемочного тестирования (Acceptance-Test-Driven Development, ATDD).</strong> Командам, занимающимся разработкой на основе приемочного тестирования, выполнимые тесты помогают определять примеры, полученные во время обсуждений работы с заказчиком. Каждый пример уточняется и представляется в выполнимом формате. Программисты при разработке функций используют тесты как руководство. Когда код написан, Тестирование может проводиться как автоматизированное регрессионное, документирующее поведение функций.</li>
<li><strong>Разработка через тестирование (Test-Driven Development, TDD).</strong> При разработке через тестирование программист, прежде чем написать минимальное количество кода, который позволит провести успешную проверку, создает и автоматизирует маленькие модульные тесты, которые изначально выдают ошибки. Код проходит рефакторинг для того, чтобы соответствовать стандартам. Производственный код написан так, чтобы пропускать по одному тесту за один раз. TDD также называют дизайном на основе тестов, поскольку этот процесс больше относится к методу написания кода, чем к тестированию, и помогает создать надежный, простой в обслуживании код.</li>
<li><strong>Разработка через поведение (Behavior-Driven Development, BDD).</strong> Примеры желаемого поведения, полученные от представителей заказчика, переводятся в выполнимые тесты в формате given_when_then. Программисты автоматизируют тесты, а затем пишут код для прохождения каждого из них. Разработка через поведение может быть использована на модульном уровне для дизайна на основе проверок и бизнес-ориентированных тестов, охватывающих множество компонентов и уровней приложения.</li>
<li><strong>Технический долг (Technical Debt).</strong> Когда команда разработчиков идет по пути наименьшего сопротивления и жертвует качеством ради того, чтобы бизнес мог воспользоваться ситуацией, они образуют долг в плохо спроектированном софте, не защищенном регрессионным тестированием или провисающем по другим качественным характеристикам. Если команда не находит времени, чтобы &#171;выплатить&#187; долг с помощью рефакторинга или добавления автоматизированных регрессионных тестов, разрабатывать новые функции становится сложнее, и &#171;общий&#187; долг замедляет работу команды.</li>
<li><strong>Унаследованная система (Legacy System).</strong> Система, не поддерживаемая автоматизированными регрессионными тестами. Внесение изменений в унаследованный код или его рефакторинг может представлять риски, поскольку не существует тестов, способных уловить незапланированные изменения в поведении системы.</li>
<li><strong>Legacy Code</strong> &#8212; это ценный код, доставшийся в наследство от предыдущих разработчиков, который Вы боитесь изменить, потому что не знаете, как внести изменения и при этом не нарушить существующее поведение системы или программы. Legacy code — тяжелая наследственность, устаревший код, который более не поддерживается и не обновляется, но используется.</li>
<li><strong>IaaS, PaaS и SaaS</strong> — это основные модели предоставления облачных услуг.
<ul>
<li><strong>Инфраструктура как сервис (Infrastructure as a Service, IaaS).</strong> Модель обслуживания, следуя которой организация использует облачные сервисы для поддержки эксплуатации, включая хранение данных, оборудование, серверы и сетевые компоненты. Сервисы принадлежат провайдеру, который отвечает за их размещение, работу и поддержку. Как правило, клиент платит по факту использования. В IaaS клиент получает только инфраструктуру. <strong>Пример</strong>: «виртуальный дата-центр» от Selectel или CloudLITE.</li>
<li><strong>Платформа как услуга (Platform-as-a-Service, Paas).</strong> Разновидность ПО как услуги. Модель предоставления услуг, позволяющая заказчику арендовать виртуальные серверы и сопутствующие услуги для работы существующих приложений или разработки новых. В PaaS — инфраструктуру и подготовленное для разработки приложений ПО. <strong>Пример</strong>: Облачная среда разработки Codenvy, Microsoft Azure или AWS.</li>
<li><strong>ПО как сервис (Software-as-a-Service, SaaS).</strong> В этой модели обслуживания подрядчик или провайдер самостоятельно размещает приложения. Вместо того, чтобы установить ПО на собственное оборудование (случай &#171;ПО как продукт&#187;), клиенты получают доступ к нему на серверах провайдера по сети, используя, как правило, подключение к интернету. В SaaS — готовое работающее в облаке приложение. <strong>Пример</strong>: amoCRM, Bitrix24, МойСклад, МангоТелеком и др.</li>
</ul>
</li>
</ul>


<p></p>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&#038;title=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" data-a2a-url="https://python.ivan-shamaev.ru/overview-python-programming-language-modules-library-principles/" data-a2a-title="Язык программирования Python 3. Обзор библиотек принципов modules"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/overview-python-programming-language-modules-library-principles/">Язык программирования Python 3. Обзор библиотек принципов modules</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/overview-python-programming-language-modules-library-principles/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Функции Python 3: значение, аргументы, вызов, переменные, списки</title>
		<link>https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/</link>
					<comments>https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/#respond</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Sun, 29 Mar 2020 12:43:40 +0000</pubDate>
				<category><![CDATA[Введение в Python 3]]></category>
		<category><![CDATA[python 3]]></category>
		<category><![CDATA[Аргументы функции]]></category>
		<category><![CDATA[Вызов функции]]></category>
		<category><![CDATA[Значение функции]]></category>
		<category><![CDATA[Использование массивов в функциях Python]]></category>
		<category><![CDATA[Как написать функцию в Python 3]]></category>
		<category><![CDATA[Переменные функции Python]]></category>
		<category><![CDATA[Функции Python 3]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=795</guid>

					<description><![CDATA[<p>Функции Python 3 &#8212; Краткая шпаргалка Функции – главный и самый важный способ организации и повторного использования кода в Python. Функций не может быть слишком много. 1 функция &#8212; это блок кода, который используется для выполнения одного связанного действия. В Python есть два инструмента для создания функций: def и lambda. Сначала рассмотрим def. К lambda функции вернемся позже. Python предоставляет [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/">Функции Python 3: значение, аргументы, вызов, переменные, списки</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&#038;title=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" data-a2a-url="https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/" data-a2a-title="Функции Python 3: значение, аргументы, вызов, переменные, списки"></a></p><h1><strong>Функции Python 3 &#8212; Краткая шпаргалка</strong></h1>
<p><strong>Функции</strong> – главный и самый важный способ организации и повторного использования кода в Python. Функций не может быть слишком много. <strong>1 функция</strong> &#8212; это блок кода, который используется для выполнения одного связанного действия.</p>
<blockquote>
<p><span>В Python есть </span>два<span> инструмента для создания функций: </span><strong><em>def</em></strong><span><strong> </strong>и </span><strong><em>lambda</em></strong><span>. </span></p>
<p><span>Сначала рассмотрим <em><strong>def</strong></em>. К <em><strong>lambda</strong> </em>функции вернемся позже.</span></p>
</blockquote>
<p><strong>Python</strong> предоставляет вам множество встроенных функций, таких как print() и т.д., но вы также можете создавать свои собственные функции. Эти функции называются пользовательскими функциями.</p>
<p>Объявление функции начинается ключевым словом <strong>def</strong>, а результат возвращается в предложении <strong>return</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def my_function(x, y, z=1.5):
    if z &gt; 1:
        return z * (x + y)
    else:
        return z / (x + y)</pre>
<p>Ничто не мешает иметь в функции несколько предложений <strong>return</strong>. Если при выполнении достигнут конец функции, а предложение <strong>return</strong> не встретилось, то возвращается <strong>None</strong>.</p>
<p>У функции могут быть позиционные и именованные аргументы.</p>
<p><strong>Именованные аргументы</strong> обычно используются для задания значений по умолчанию и необязательных аргументов.</p>
<p>В примере выше:</p>
<ul>
<li>x и y – <em><strong>позиционные аргументы, </strong></em></li>
<li>а z – <em><strong>именованный. </strong></em></li>
</ul>
<p>Следующие вызовы функции эквивалентны:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">my_function(5, 6, z=0.7)
my_function(3.14, 7, 3.5)</pre>
<p>Основное ограничение состоит в том, <strong>именованные аргументы должны находиться после всех позиционных (если таковые имеются).</strong> Сами же именованные аргументы можно задавать в любом порядке, это освобождает программиста от необходимости помнить, в каком порядке были указаны аргументы функции в объявлении, важно лишь, как они называются.</p>
<h2><strong>Определение функции Python 3</strong></h2>
<p><span>Вы можете задать функции для реализации нужной вам функциональности. Вот простые правила для определения функции в Python.</span></p>
<ul class="list">
<li><span>Ключевое слово для определения функции: </span><b><span>def,</span></b><span> за которым следуют имя функции и круглые скобки () с параметрами.</span></li>
<li><span>Любые входные параметры или аргументы должны быть помещены в эти круглые скобки.</span></li>
<li><span>В качестве первой команды может быть необязательная конструкция &#8212; <strong>строка документации функции</strong> (эта часть функции &#8212; пояснение зачем функция создана, очень рекомендуется использовать для облегчения понимания кода при работе в команде или при повторном возвращении к коду через длительный промежуток времени)</span><span>.</span></li>
<li><span>Блок кода в каждой функции начинается с двоеточия <strong>:</strong> и имеет отступ.</span></li>
<li><span>Оператор <strong>return</strong> <strong>[выражение]</strong> возвращает результат из функции. Оператор <strong>return</strong> без аргументов аналогичен <strong>return None</strong>. <span style="color: #ff6600;"><strong>Функции всегда возвращают значение, хотя бы None.</strong></span></span></li>
</ul>
<h2><strong>Синтаксис функции Python</strong></h2>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def function_name( parameter1, parameter2 ):
   """function_docstring: функция Python предназначена для расчета ROI"""
   function_suite (algorithms, expressions)
   return [expression]</pre>
<p><span>По умолчанию, параметры <em><strong>parameter1, parameter2</strong></em> имеют позиционное поведение, и вам необходимо сообщить их в том же порядке, в котором они были определены.</span></p>
<h2><strong>Пример реализации функции</strong></h2>
<p>Следующая функция принимает строку в качестве входного параметра и печатает ее на стандартном экране.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def print_me( str ):
   """Выводит на печать переданную строку в эту функцию"""
   print(str)
   return</pre>
<h2><strong>Вызов функции</strong></h2>
<p>В определении функции указывается <strong>имя функции</strong>, <strong>её параметры</strong>, а также <strong>тело функции</strong> (реализация требуемой функциональности).</p>
<p>Как только базовая структура функции создана, вы можете выполнить ее, вызвав ее из другой функции или непосредственно из <span><strong>Python prompt</strong> (командной оболочки)</span>. Ниже приведен пример вызова функции <strong>printme()</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def printme( str ):
    """This prints a passed string into this function"""
    print(str)
    return

# Теперь вы можете вызвать функцию printme
printme("I'm first call to user defined function!")
printme("Again second call to the same function")</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">I'm first call to user defined function!
Again second call to the same function</pre>
<h1><strong>Аргументы функции</strong></h1>
<p><span>Вы можете вызвать функцию, используя следующие типы аргументов:</span></p>
<ul class="list">
<li><span>Обязательные аргументы</span></li>
<li><span>Ключевые аргументы</span></li>
<li><span>Аргументы по умолчанию</span></li>
<li><span>Аргументы переменной длины</span></li>
</ul>
<h2><strong>Обязательные (позиционные) аргументы</strong></h2>
<blockquote>
<p><strong>Позиционные аргументы:</strong> указываются простым перечислением</p>
</blockquote>
<p><span><strong>Обязательные аргументы</strong> &#8212; это аргументы, переданные функции в правильном позиционном порядке. Здесь количество аргументов и их порядок в вызове функции должно точно соответствовать определению функции.</span></p>
<p><span>Чтобы вызвать функцию </span><i><span>printme()</span></i><span> , вам обязательно нужно передать один аргумент, иначе она выдаст следующую синтаксическую ошибку:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def printme( str ):
   """This prints a passed string into this function"""
   print(str)
   return

# Теперь вы можете вызвать функцию printme
printme()</pre>
<p>Ошибка (в функции Printme не указан аргумент):</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Traceback (most recent call last):
  File "C:/Users/User/Desktop/CodePythonFunc.py", line 8, in &lt;module&gt;
    printme()
TypeError: printme() missing 1 required positional argument: 'str'</pre>
<p>Правильно указать аргумент так:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def printme( str ):
   """This prints a passed string into this function"""
   print(str)
   return

# Теперь вы можете вызвать функцию printme
printme("Текстовая переменная")</pre>
<h2><strong>Ключевые аргументы</strong></h2>
<blockquote>
<p><span><strong>Ключевые аргументы:</strong> указываются перечислением </span><code class="docutils literal notranslate"><span class="pre">ключ=значение</span></code></p>
</blockquote>
<p><span>Когда вы используете ключевые аргументы в вызове функции, вызывающая сторона идентифицирует аргументы по имени параметра. Плюс в определении функции у ключевого параметра можно указать значение по-умолчанию.</span></p>
<p><span>Это позволяет пропускать аргументы или размещать их не по порядку, поскольку интерпретатор Python может использовать предоставленные ключевые слова (ключи) для сопоставления значений с параметрами. Создадим ключевые слова для функции </span><i><span>printinfo()</span></i><span> следующими способами:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def printinfo( name, age ):
   "This prints a passed info into this function"
   print("Name: " + name + "|Age: " + str(age))
   return

# Вызов функции printinfo
printinfo( age=23, name="Anton" )
printinfo( name="Alena", age=20 )</pre>
<p><strong><span style="color: #000000;">Результат:</span></strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Name: Anton|Age: 23
Name: Alena|Age: 20</pre>
<blockquote>
<p><span style="color: #ff0000;"><strong>Важно!</strong></span> Позиционные и ключевые аргументы могут быть скомбинированы в одной функции. Позиционные параметры всегда идут перед ключевыми.</p>
</blockquote>
<h3><strong>Преимущества ключевых аргументов в функциях</strong></h3>
<ul>
<li>Нет необходимости отслеживать порядок аргументов;</li>
<li>У ключевых параметров есть значение по умолчанию, которое можно не передавать.</li>
</ul>
<h2><strong>Аргументы по умолчанию</strong></h2>
<p><span>Аргумент по умолчанию &#8212; это аргумент, который принимает значение по умолчанию (задается в описании функции), если при вызове функции аргументу не передается значение.</span></p>
<p><span>Следующий пример дает представление об аргументах по умолчанию, он печатает возраст по умолчанию, если он не был передан:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def printinfo( name, age = 35 ):
   "This prints a passed info into this function"
   print("Name: " + name + "|Age: " + str(age))
   return

# Вызов функции printinfo
printinfo( age=19, name="Семен" )
printinfo( name="Николай" )</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Name: Семен|Age: 19
Name: Николай|Age: 35</pre>
<h2><strong>Аргументы переменной длины </strong></h2>
<h3><strong>Передача кортежа в функцию &#8212; Использование *args в Python</strong></h3>
<p><span>Вам может потребоваться разработать функцию для большего числа аргументов, чем Вы указали при определении функции. Эти аргументы называются <strong>аргументами </strong></span><strong><i>переменной длины</i></strong><span> и не указываются в определении функции, <strong>в отличие от позиционных и ключевых аргументов.</strong></span></p>
<p><span>В Python форма с одной звездочкой </span><code>*args</code><span>может использоваться в качестве параметра для отправки в список функций аргументов переменной длины без ключа. Стоит отметить, что звёздочка ( </span><code>*</code><span>) является здесь важным элементом, так как слово </span><code>args</code><span>является общепринятой традиционной идиомой, хотя оно не поддерживается языком.</span></p>
<p><span>Синтаксис для функции с аргументами переменной длины следующий:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def function_name([formal_args,] *args_tuple ):
    """function_docstring"""
    function_body
    return [expression]</pre>
<p><span>Звездочка (*) ставится перед именем переменной, которая содержит в себе кортеж значений без ключевых слов.</span><span> Кортеж является необязательным параметром.</span></p>
<p><strong>Рассмотрим простой пример:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def print_info( parametr_1, *var_tuple ):
   """Эта функция производит вывод переданных аргументов"""
   print("Output is: ")
   print(parametr_1)
   for elem in var_tuple:
      print(elem)
   return

# Вызов функции printinfo
print_info( 10 )
print_info( 70, 60, 50 )</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Output is: 
10
Output is: 
70
60
50</pre>
<p>Еще один <strong>пример использования *args в функции</strong> Python:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def multiply(*args):
    z = 1
    for num in args:
        z *= num
    print(z)

multiply(4, 5)
multiply(10, 9)
multiply(2, 3, 4)
multiply(3, 5, 10, 6)</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">20
90
24
900</pre>
<p><span>Поскольку мы использовали </span><code>*args</code><span>для отправки списка аргументов переменной длины в нашу функцию, мы смогли передать столько аргументов, сколько пожелали, в вызовы функции.</span></p>
<p><span>С помощью </span><code>*args</code><span> вы можете создать более гибкий код, который принимает различное количество аргументов без ключевых слов в вашей функции.</span></p>
<h3><strong>Передачи словаря переменной длины с аргументами в функцию **kwargs</strong></h3>
<blockquote>
<p><strong>**kwargs</strong> &#8212; сокращение от “keyword arguments”</p>
</blockquote>
<p><span>Форма двойной звездочки </span><code>**kwargs</code><span>используется для передачи словарного </span><a href="https://www.digitalocean.com/community/tutorials/understanding-dictionaries-in-python-3"><span>словаря</span></a><span> с аргументами переменной длины в функцию. Опять же, две звездочки ( </span><code>**</code><span>) являются здесь важным элементом, так как слово </span><code>kwargs</code><span>используется условно, но не поддерживается языком.</span></p>
<p><span>Мол </span><code>*args</code><span>, </span><code>**kwargs</code><span>может принять столько аргументов, которые вы хотели бы привести к этому. Однако </span><code>**kwargs</code><span>отличается от того, </span><code>*args</code><span>что вам нужно будет назначить ключевые слова.</span></p>
<p><span>Во-первых, давайте просто распечатаем </span><code>**kwargs</code><span>аргументы, которые мы передаем функции. Мы создадим короткую функцию для этого:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def print_kwargs(**kwargs):
        print(kwargs)

print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True)</pre>
<p><span>Давайте запустим программу выше и посмотрим на вывод:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">{'kwargs_1': 'Shark', 'kwargs_2': 4.5, 'kwargs_3': True}</pre>
<p><span>В зависимости от версии Python 3, которую вы используете в данный момент, тип данных словаря может быть неупорядоченным. В Python 3.6 и выше вы получите пары ключ-значение по порядку, но в более ранних версиях пары будут выводиться в случайном порядке.</span></p>
<p><span>Важно отметить, что </span><code>kwargs</code><span>созданный словарь создан, и мы можем работать с ним так же, как мы можем работать с другими словарями.</span></p>
<p><span>Давайте создадим еще одну короткую программу, чтобы показать, как мы можем использовать </span><code>**kwargs</code><span>. Здесь мы создадим функцию для приветствия словаря имен. Сначала мы начнем со словаря из двух имен:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def print_values(**kwargs):
    for key, value in kwargs.items():
        print("The value of {} is {}".format(key, value))

print_values(my_name="Sammy", your_name="Casey")</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">The value of my_name is Sammy
The value of your_name is Casey</pre>
<p><span>Использование </span><code>**kwargs</code><span>дает нам гибкость в использовании ключевых аргументов в нашей программе. Когда мы используем </span><code>**kwargs</code><span>в качестве параметра, нам не нужно знать, сколько аргументов мы в конечном итоге хотели бы передать функции.</span></p>
<h3 id="using-args-and-kwargs-in-function-calls"><strong>Использование *args и **kwargs в вызовах функций</strong></h3>
<p><span>Мы также можем использовать </span><code>*args</code><span>и </span><code>**kwargs</code><span>для передачи аргументов в функции.</span></p>
<p><span>Сначала давайте рассмотрим пример с </span><code>*args</code><span>.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def some_args(arg_1, arg_2, arg_3):
    print("arg_1:", arg_1)
    print("arg_2:", arg_2)
    print("arg_3:", arg_3)

args = ("Sammy", "Casey", "Alex")
some_args(*args)</pre>
<p><span>В функции выше, существует три параметра , определенный как </span><code>arg_1</code><span>, </span><code>arg_</code><span>и </span><code>arg_3</code><span>. Функция распечатает каждый из этих аргументов. Затем мы создаем переменную, для которой задано итеративное значение (в данном случае </span><a href="https://www.digitalocean.com/community/tutorials/understanding-tuples-in-python-3"><span>кортеж</span></a><span> ), и можем передать эту переменную в функцию с синтаксисом звездочки.</span></p>
<p><span>Когда мы запустим код,</span><span> мы получим следующий вывод:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">arg_1: Sammy
arg_2: Casey
arg_3: Alex</pre>
<p><span>Мы также можем изменить вышеприведенную программу для </span><span>типа данных</span><span> итеративного списка с другим именем переменной. Давайте также объединим </span><code>*args</code><span>синтаксис с </span><span>именованным параметром</span><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def some_args(arg_1, arg_2, arg_3):
    print("arg_1:", arg_1)
    print("arg_2:", arg_2)
    print("arg_3:", arg_3)

my_list = [2, 3]
some_args(1, *my_list)</pre>
<p><span>Если мы запустим программу выше, она выдаст следующий вывод:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">arg_1: 1
arg_2: 2
arg_3: 3</pre>
<p><span>Аналогично, </span><code>**kwargs</code><span>аргументы с ключевым словом могут использоваться для вызова функции. Мы установим переменную, равную словарю с 3 парами ключ-значение (мы будем использовать </span><code>kwargs</code><span>здесь, но она может называться как угодно), и передадим ее функции с 3 аргументами:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def some_kwargs(kwarg_1, kwarg_2, kwarg_3):
    print("kwarg_1:", kwarg_1)
    print("kwarg_2:", kwarg_2)
    print("kwarg_3:", kwarg_3)

kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"}
some_kwargs(**kwargs)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">kwarg_1: Val
kwarg_2: Harper
kwarg_3: Remy</pre>
<p><span>Мы можем использовать специальный синтаксис </span><code>*args</code> <span>и </span><code>**kwargs</code> <span>внутри определения функции, чтобы передать переменное число аргументов функции.</span></p>
<p><span>Создание функций, которые принимают </span><code>*args</code><span>и </span><code>**kwargs</code><span>лучше всего использовать в ситуациях, когда вы ожидаете, что количество входов в списке аргументов останется относительно небольшим. Использование </span><code>*args</code><span>и </span><code>**kwargs</code><span>в первую очередь для обеспечения удобочитаемости и удобства, но следует делать с осторожностью.</span></p>
<h3><strong>Комбинирование параметров *args и **kwargs в функции</strong></h3>
<p>При комбинировании параметров параметр с двумя звездочками записывается самым последним. Если в определении функции указывается комбинация параметров с одной звездочкой и двумя звездочками, то функция примет любые переданные ей параметры:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def func(*args, **kwargs):
    """Функция примет любые параметры и выведет их на печать"""
    for elem in args:                   # Перебираем список с переданными параметрами
        print(elem, end=" ")
    for key, value in kwargs.items():   # Перебираем словарь с переданными параметрами
        print("{0} =&gt; {1}".format(key, value), end=" ")
    print("") #Перенос строки

func(35, 10, a=1, b=2, c=3) # Выведет: 35 10 a =&gt; 1 c =&gt; 3 b =&gt; 2
func(10)                    # Выведет: 10
func(3, a=1, b=2)           # Выведет: a =&gt; 1 b =&gt; 2</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">35 10 a =&gt; 1 b =&gt; 2 c =&gt; 3 
10 
3 a =&gt; 1 b =&gt; 2 </pre>
<p><strong>Еще один пример использования комбинации *args &amp; **kwargs:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Описываем функцию
def echo(*args, **kwargs):
    print(args, kwargs)

# Задаем список
args = (10, 20)
# Задаем словарь
kwargs = {'a':30, 'b':40}

#Вызываем функцию
echo(*args, **kwargs)</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">(10, 20) {'a': 30, 'b': 40}</pre>
<h3><strong>Порядок аргументов в функции Python</strong></h3>
<p>Аргументы внутри вызова функции должны стоять в определенном порядке:</p>
<ol>
<li><strong>Позиционные аргументы (arg_1, arg_2)</strong></li>
<li><strong>*args</strong></li>
<li><strong>Ключевые аргументы (kw_1=&#187;значение 1&#8243;, kw_2=&#187;значение 2&#8243;)</strong></li>
<li><strong>**kwargs</strong></li>
</ol>
<p>Рассмотрим детальный пример с использованием всех функций:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def function_print(arg_1, arg_2, *args, kw_1="значение 1", kw_2="значение 2", **kwargs):
    """ Обобщенный пример вывода всех аргументов, переданных функции """
    print("===Позиционные аргументы===")
    print(str(arg_1) + "," + str(arg_2))
    print("===*args===")
    for elem in args: # Перебираем список с переданными параметрами
        print(elem, end=" ")
    print("") #Перенос строки
    print("===Ключевые аргументы===")
    print(kw_1 + "," + kw_2)
    print("===**kwargs===")
    for key, value in kwargs.items(): # Перебираем словарь с переданными параметрами
        print("{0} =&gt; {1}".format(key, value), end=" ")
    print("") #Перенос строки


function_print(1, 2, 4, kw_2="Иван", var1=4)</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">===Позиционные аргументы===
1,2
===*args===
4 
===Ключевые аргументы===
значение 1,Иван
===**kwargs===
var1 =&gt; 4 </pre>
<h2><strong>Передача списка (list) по ссылке в функцию</strong></h2>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def myfunction (list):
    list.append(40)
    print ("Modified list inside a function: ", list)
    return

mylist=[10,20,30]
myfunction(mylist)
print(mylist)</pre>
<p>Следующий результат подтверждает, что аргументы передаются по ссылке в функцию Python:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Modified list inside a function: [10, 20, 30, 40]
[10, 20, 30, 40]</pre>
<h1><strong>Пространства имен, области видимости и локальные функции</strong></h1>
<h2><strong>Область действия переменной &#8212; область видимости переменных</strong></h2>
<p><span>Переменные в программе могут быть доступны или недоступны в разных местах этой программы. Это зависит от того, где вы объявили переменную.</span></p>
<p><span>Область действия переменной определяет ту часть программы, в которой вы можете получить доступ к определенному идентификатору (т.е. к значению переменной и возможности эту переменную поменять). <strong>В Python есть две основные области видимости переменных:</strong></span></p>
<ul class="list">
<li><span>Глобальные переменные</span></li>
<li><span>Локальные переменные</span></li>
</ul>
<p><strong>Область видимости переменной</strong> в Python называют также пространством имен. Любая переменная, которой присвоено значение внутри функции, по умолчанию попадает в локальное пространство имен.</p>
<p><strong>Локальное пространство имен</strong> создается при вызове функции, и в него сразу же заносятся аргументы функции. По завершении функции локальное пространство имен уничтожается (хотя бывают и исключения, см. ниже раздел о замыканиях).</p>
<p><strong>Переменные внутри функции – локальные.</strong> Поиск переменных: сперва среди локальных, потом среди глобальных.</p>
<p>Рассмотрим следующую функцию:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def func():
    a = []
    for i in range(5):
        a.append(i)</pre>
<p>При вызове func() создается пустой список a, в него добавляется 5 элементов, а затем, когда функция завершается, список a уничтожается. Но допустим, что мы объявили a следующим образом:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a = []
def func():
    for i in range(5):
        a.append(i)</pre>
<p>Присваивать значение глобальной переменной внутри функции допустимо, но такие переменные должны быть объявлены глобальными с помощью ключевого слова <strong>global</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a = None

def bind_a_variable():
    global a
    a = []

bind_a_variable()
print a</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">[]</pre>
<p>Функции можно объявлять в любом месте, в том числе допустимы локальные функции, которые динамически создаются внутри другой функции при ее вызове:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def outer_function(x, y, z):
    def inner_function(a, b, c):
        pass
    pass</pre>
<p>Здесь функция <strong>inner_function</strong> не существует, пока не вызвана функция <strong>outer_function</strong>. Как только <strong>outer_function</strong> завершает выполнение, <strong>inner_function</strong> уничтожается.</p>
<blockquote>
<p>Не рекомендуется злоупотреблять ключевым словом <strong>global</strong>. Обычно глобальные переменные служат для хранения состояния системы. Если вы понимаете, что пользуетесь ими слишком часто, то стоит подумать о переходе к <strong>объектно-ориентированному программированию (использовать классы).</strong></p>
</blockquote>
<p>Вложенные функции могут обращаться к локальному пространству имен объемлющей функции, но не могут связывать в нем переменные. Подробнее смотрите в разделе о замыканиях.</p>
<p>Строго говоря, любая функция локальна в какой-то области видимости, хотя это может быть и область видимости на уровне модуля.</p>
<h2><strong>Возврат нескольких значений из одной функции</strong></h2>
<p>В Python существует возможность возвращать из функции несколько значений.</p>
<p>Вот простой пример:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def f():
    a = 5
    b = 6
    c = 7
    return a, b, c
var1, var2, var3 = f()

print("var1={0} var2={1} var3={2}".format(var1, var2, var3))</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">var1=5 var2=6 var3=7</pre>
<p>В анализе данных и других научных приложениях это встречается сплошь и рядом, потому что многие функции вычисляют несколько результатов.</p>
<p>На самом деле, функция возвращает только один объект, кортеж, который затем распаковывается в результирующие переменные.</p>
<p>Этот пример можно было бы записать и так:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def f():
    a = 5
    b = 6
    c = 7
    return a, b, c
return_value = f()

print(return_value)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">(5, 6, 7)</pre>
<p>В таком случае <strong>return_value</strong> было бы кортежем, содержащим все три возвращенные переменные.</p>
<p>Иногда разумнее возвращать несколько значений не в виде кортежа, а <strong>в виде словаря</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def f():
    a = 5
    b = 6
    c = 7
    return {'a' : a, 'b' : b, 'c' : c}

return_value = f()

print(return_value)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">{'a': 5, 'b': 6, 'c': 7}</pre>
<h2><strong>Функции являются объектами</strong></h2>
<p>Поскольку функции в Python – объекты, становятся возможны многие конструкции, которые в других языках выразить трудно. Пусть, например, мы производим очистку данных и должны применить ряд преобразований к следующему списку строк:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">states = [' Alabama ', 'Georgia!', 'Georgia', 'georgia', 'FlOrIda', 'south carolina##', 'West virginia?']</pre>
<p>Всякий, кому доводилось работать с присланными пользователями данными опроса, ожидает такого рода мусора. Чтобы сделать такой список строк пригодным для анализа, нужно произвести различные операции: удалить лишние пробелы и знаки препинания, оставить заглавные буквы только в нужных местах.</p>
<p>Первая попытка могла бы выглядеть так:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import re # Модуль регулярных выражений

def clean_strings(strings):
    result = []
    for value in strings:
        value = value.strip()
        value = re.sub('[!#?]', '', value) # удалить знаки препинания
        value = value.title()
        result.append(value)
    return result

states = [' Alabama ', 'Georgia!', 'Georgia', 'georgia', 'FlOrIda', 'south carolina##', 'West virginia?']

states = clean_strings(states)

print(states)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">['Alabama', 'Georgia', 'Georgia', 'Georgia', 'Florida', 'South Carolina', 'West Virginia']</pre>
<p>Другой подход, который иногда бывает полезен, – составить список операций, которые необходимо применить к набору строк:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import re # Модуль регулярных выражений

def remove_punctuation(value):
    return re.sub('[!#?]', '', value)

def clean_strings(strings, ops):
    result = []
    for value in strings:
        for function in ops:
            value = function(value)
        result.append(value)
    return result

clean_ops = [str.strip, remove_punctuation, str.title]
states = [' Alabama ', 'Georgia!', 'Georgia', 'georgia', 'FlOrIda', 'south carolina##', 'West virginia?']

states = clean_strings(states, clean_ops)

print(states)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">['Alabama', 'Georgia', 'Georgia', 'Georgia', 'Florida', 'South Carolina', 'West Virginia']</pre>
<p>Подобный <strong>функциональный подход</strong> позволяет задать способ модификации строк на очень высоком уровне. Степень повторной используемости функции <strong>clean_strings</strong> определенно возросла!</p>
<p><strong>Функции можно передавать в качестве аргументов другим функциям</strong>, например встроенной функции <strong>map</strong>, которая применяет переданную функцию к коллекции:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import re # Модуль регулярных выражений

def remove_punctuation(value):
    return re.sub('[!#?]', '', value)

states = [' Alabama ', 'Georgia!', 'Georgia', 'georgia', 'FlOrIda', 'south carolina##', 'West virginia?']

states = list(map(remove_punctuation, states))
states = list(map(str.strip, states))
states = list(map(str.title, states))

print(states)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">['Alabama', 'Georgia', 'Georgia', 'Georgia', 'Florida', 'South Carolina', 'West Virginia']</pre>
<h2><strong>Анонимные функции или Лямбда-функции. Lambda Function Python 3</strong></h2>
<ul>
<li><strong>Лямбда-функции</strong> позволяют создавать «встроенные» функции, которые полезны для функционального программирования. Например, с <strong>Map, Filter или Reduce</strong>.</li>
<li><strong>Lambda</strong> &#8212; это инструмент для создания обработчиков обратного вызова (<strong>callback handlers</strong>).</li>
</ul>
<p><strong>Lambda Function &#8212; </strong>это анонимная однострочная функция, которая возвращает всегда 1 результат.</p>
<p>Определяются они с помощью ключевого слова <strong>lambda</strong></p>
<p><span style="color: #008080;"><strong>ИмяФункции</strong> =</span> <span style="color: #ff6600;"><strong>lambda</strong> </span><strong><span style="color: #008000;">переменная_1, переменная_2, &#8230;, переменная_N</span><span style="color: #ff0000;">:</span></strong> <strong><span style="color: #000080;">&lt;выражение, которое использует переменные&gt;</span></strong></p>
<p>Например, функция <strong><span style="color: #008080;">equiv_anon</span></strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">equiv_anon = lambda x: x * 2</pre>
<p>эквивалентна функции <strong><span style="color: #008080;">short_function</span></strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">def short_function(x):
    return x * 2</pre>
<p><strong>Лямбда-функции</strong> особенно удобны в ходе анализа данных, потому что, как вы увидите, во многих случаях функции преобразования данных принимают другие функции в качестве аргументов. Часто быстрее (и чище) передать лямбда-функцию, чем писать полноценное объявление функции или даже присваивать лямбда-функцию локальной переменной.</p>
<p>Рассмотрим такой простенький пример:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def apply_to_list(some_list, f):
    return [f(x) for x in some_list]

ints = [4, 0, 1, 5, 6]

result = apply_to_list(ints, lambda x: x * 2)

print(result)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">[8, 0, 2, 10, 12]</pre>
<p>Можно было бы, конечно, написать <code class="EnlighterJSRAW" data-enlighter-language="null">[x * 2 for x in ints]</code>, но в данном случае нам удалось передать функции <strong>apply_to_list</strong> пользовательский оператор.</p>
<p><strong>Еще пример:</strong> пусть требуется отсортировать коллекцию строк по количеству различных букв в строке.</p>
<p>Для этого можно передать лямбда-функцию методу списка sort:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">strings = ['foo', 'card', 'bar', 'aaaa', 'abab']

strings.sort(key=lambda x: len(set(list(x))))

print(strings)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">['aaaa', 'foo', 'abab', 'bar', 'card']</pre>
<h3><strong>Для чего хороша лямбда-функция? Зачем нужная lambda function в Python?</strong></h3>
<p pid="4973"><strong>Ответ:</strong></p>
<ul>
<li><span>Нам не нужна лямбда функция, мы могли бы обойтись без нее. <strong>Но…</strong></span></li>
<li><span>Есть определенные ситуации, когда это удобно &#8212; <strong>lambda</strong> делает написание кода немного легче, а написанный код &#8212; немного чище.</span></li>
</ul>
<p><strong>Какие ситуации?</strong></p>
<p pid="4975"><span>Что ж, ситуации, в которых нам нужна простая одноразовая функция: функция, которая будет использоваться только один раз.</span></p>
<p pid="4976"><span>Обычно функции создаются для одной из двух целей: </span><span>(а) для уменьшения дублирования кода или </span><span>(б) для модульности кода.</span></p>
<ul>
<li><span>Если ваше приложение содержит повторяющиеся фрагменты кода в разных местах, то вы можете поместить одну копию этого кода в функцию, дать имя функции, а затем &#8212; используя это имя функции &#8212; вызвать ее из разных мест в вашем коде.</span></li>
<li><span>Если у вас есть кусок кода, который выполняет одну четко определенную операцию &#8212; но он действительно длинный и грубый и прерывает читаемый поток вашей программы, то вы можете извлечь этот длинный грубый код и поместить его в самостоятельную функцию.</span></li>
</ul>
<p><span>Но предположим, что вам нужно создать функцию, которая будет использоваться только один раз &#8212; вызываться </span><em><span>только </span></em><span>из <em>одного </em>места в вашем приложении. Ну, во-первых, вам не нужно давать имя функции. Это может быть «анонимно». И вы можете просто определить его прямо там, где вы хотите его использовать. Вот где лямбда полезна.</span></p>
<p>Еще один пример использования <strong>lambda функции</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">colors = ["Goldenrod", "Purple", "Salmon", "Turquoise", "Cyan"]

normalized_colors = list(map(lambda s: s.casefold(), colors))

print(normalized_colors)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">['goldenrod', 'purple', 'salmon', 'turquoise', 'cyan']</pre>
<h3 id="Misuse:_naming_lambda_expressions"><strong>Неправильное использование: именование лямбда-выражений</strong></h3>
<p><span>PEP8, официальное руководство по стилю Python, советует никогда не писать такой код:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">normalize_case = lambda s: s.casefold()</pre>
<p><span>Вышеприведенный оператор создает анонимную функцию, а затем назначает ее переменной. Приведенный выше код игнорирует причину полезности </span><strong><span>лямбда-функций</span></strong><span>: <strong>лямбда-функции могут передаваться без необходимости вначале присваивать их переменной</strong>.</span></p>
<p><span>Если вы хотите создать однострочную функцию и сохранить ее в переменной, вы должны использовать </span><code>def</code><span>вместо этого:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def normalize_case(s): return s.casefold()</pre>
<p><span><strong>PEP8</strong> рекомендует это, потому что <strong>именованные функции</strong> &#8212; это обычная и понятная вещь. Именованная функция также имеет следующее преимущество: назначая нашей функции правильное имя, Вы упрощаете отладку кода. В отличие от функций, определенных с помощью </span><code>def</code><span>, лямбда-функции никогда не имеют имени (это всегда </span><code>&lt;lambda&gt;</code><span>).</span></p>
<p><strong><span>Если вы хотите создать функцию и сохранить ее в переменной, определите свою функцию с помощью </span><code>def</code></strong><span> . Это именно то, для чего существует именованная функция. Не имеет значения, является ли ваша функция одной строкой кода или вы определяете функцию внутри другой функции, </span><code>def</code> <span>отлично работает для этих случаев использования.</span></p>
<h3 id="Misuse:_needless_function_calls"><strong>Неправильное использование: ненужные вызовы функций</strong></h3>
<p><span>Периодически встречаются лямбда-выражения, которые используются для подстановки в функции python, которые уже содержат функциональность для решения задачи. Нужно только посмотреть в документацию по функциям.</span></p>
<p><span>Например, возьмем этот код:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">sorted_numbers = sorted(numbers, key=lambda n: abs(n))</pre>
<figure class="code">
<figcaption><span></span></figcaption>
</figure>
<p>Программист<span>, написавший этот код, вероятно, узнал, что лямбда-выражения используются для создания функции, которую можно передавать в другую функцию.</span></p>
<p><span>Поскольку </span><code>abs</code><span> (которая возвращает абсолютное значение числа) является функцией и все функции могут быть переданы, мы могли бы написать приведенный выше код следующим образом:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">sorted_numbers = sorted(numbers, key=abs)</pre>
<figure class="code">
<figcaption><span></span></figcaption>
</figure>
<p><span>Теперь этот пример может показаться надуманным, но нередко чрезмерно используют лямбда-выражения таким образом. Вот еще один пример, который иногда встречается:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">pairs = [(4, 11), (8, 8), (5, 7), (11, 3)]
sorted_by_smallest = sorted(pairs, key=lambda items: min(items))</pre>
<figure class="code">
<figcaption><span></span></figcaption>
</figure>
<p><span>Поскольку мы принимаем те же аргументы, что и при передаче </span><code>min</code><span>, нам не нужен этот дополнительный вызов функции. Вместо этого мы можем просто передать </span><code>min</code> <span>функцию </span><code>key</code><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">pairs = [(4, 11), (8, 8), (5, 7), (11, 3)]
sorted_by_smallest = sorted(pairs, key=min)</pre>
<figure class="code">
<figcaption><span></span></figcaption>
</figure>
<p><span>Вам не нужна лямбда-функция, если у вас уже есть другая функция, которая делает то, что вы хотите.</span></p>
<h2><strong>Замыкания: функции, возвращающие функции. Динамически сгенерированная функция</strong></h2>
<p><strong>Замыканием</strong> называется любая <em><strong>динамически сгенерированная функция</strong></em>, возвращенная из другой функции. Основное свойство замыкания состоит в том, что оно имеет доступ к переменным, определенным в том локальном пространстве имен, в котором было создано.</p>
<p>Вот очень простой пример:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def make_closure(a):
    def closure():
        print('Я знаю секрет: %d' % a)
    return closure

closure = make_closure(5)
closure()</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Я знаю секрет: 5</pre>
<p>Разница между замыканием и обычной функцией Python состоит в том, что <strong>замыкание сохраняет доступ к пространству имен (функции)</strong>, в котором было создано, даже если создавшая ее функция уже завершилась.</p>
<p>Так, в примере выше, возвращенное замыкание печатает строку <strong>&#171;Я знаю секрет: 5&#187;</strong>, в какой бы момент ее ни вызвать. Хотя обычно создают замыкания со статическим внутренним состоянием (в данном случае только значение a), ничто не мешает включить в состав состояния изменяемый объект – словарь, множество, список – и затем модифицировать его.</p>
<p>Например, ниже приведена функция, которая возвращает функцию, запоминающую, с какими аргументами вызывалась объемлющая функция:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def make_watcher():
    have_seen = {}

    def has_been_seen(x):
        if x in have_seen:
            return True
        else:
            have_seen[x] = True
        return False

    return has_been_seen

watcher = make_watcher()

vals = [5, 6, 1, 5, 1, 6, 3, 5]

print([watcher(x) for x in vals])</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">[False, False, False, True, True, True, False, True]</pre>
<p>Однако следует иметь в виду одно техническое ограничение: изменять внутреннее состояние объектов (например, добавлять в словарь пары ключ-значение) можно, но связывать переменные в области видимости объемлющей функции – нельзя. Обойти это ограничение можно, например, путем модификации словаря или списка вместо присваивания значений переменным.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def make_counter():
    count = [0]

    def counter():
        # увеличить счетчик и вернуть новое значение
        count[0] += 1
        return count[0]
    return counter

counter = make_counter()
print(counter())</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">1</pre>
<p><strong>Возникает вопрос, зачем все это нужно?</strong> На практике можно написать очень общую функцию с кучей параметров, а затем изготовить на ее основе более простые специализированные функции.</p>
<p>Вот пример функции форматирования строк:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def format_and_pad(template, space):
    def formatter(x):
        return (template % x).rjust(space)
    return formatter

fmt = format_and_pad('%.4f', 15)
print(fmt(1.756))</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">'         1.7560'</pre>
<h2><strong>Каррирование: частичное фиксирование аргументов функции</strong></h2>
<p>В информатике термином каррирование обозначается процедура порождения новых функций из существующих путем фиксирования некоторых аргументов.</p>
<p>Пусть, например, имеется тривиальная функция сложения двух чисел:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def add_numbers(x, y):
    return x + y</pre>
<p>Мы можем породить на ее основе новую функцию одной переменной, <strong>add_five</strong>, которая прибавляет к своему аргументу 5:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">add_five = lambda y: add_numbers(5, y)</pre>
<p>Говорят, что второй аргумент функции <strong>add_numbers</strong> каррирован. Ничего особо примечательного здесь нет, поскольку мы просто определили новую функцию, которая вызывает существующую.</p>
<p>Теперь запустим полный код:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def add_numbers(x, y):
    return x + y

add_five = lambda y: add_numbers(5, y)

print(add_five(10))</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">15</pre>
<p>Стандартный модуль <strong>functools</strong> упрощает эту процедуру за счет функции <strong>partial</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">from functools import partial

def add_numbers(x, y):
    return x + y

add_five = partial(add_numbers, 5)

print(add_five(10))</pre>
<p>Также вернет <code class="EnlighterJSRAW" data-enlighter-language="null">15</code></p>
<p>При обсуждении библиотеки pandas мы будем пользоваться этой техникой для создания специализированных функций преобразования временных рядов:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null"># вычислить скользящее среднее временного ряда x за 60 дней
ma60 = lambda x: pandas.rolling_mean(x, 60)
# вычислить скользящие средние за 60 дней всех временных рядов в data
data.apply(ma60)</pre>


<p></p>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&#038;title=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" data-a2a-url="https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/" data-a2a-title="Функции Python 3: значение, аргументы, вызов, переменные, списки"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/">Функции Python 3: значение, аргументы, вызов, переменные, списки</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Интерактивная визуализация данных в Python 3</title>
		<link>https://python.ivan-shamaev.ru/interactive-data-visualization-in-python-3/</link>
					<comments>https://python.ivan-shamaev.ru/interactive-data-visualization-in-python-3/#respond</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Wed, 18 Mar 2020 21:22:37 +0000</pubDate>
				<category><![CDATA[Введение в Python 3]]></category>
		<category><![CDATA[python 3]]></category>
		<category><![CDATA[визуализация Python 3]]></category>
		<category><![CDATA[Визуализация данных]]></category>
		<category><![CDATA[визуализация данных в Python 3]]></category>
		<category><![CDATA[Интерактивная визуализация]]></category>
		<category><![CDATA[Интерактивная визуализация данных в Python 3]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=752</guid>

					<description><![CDATA[<p>В этой статье будет рассмотрено &#171;Как создавать Интерактивные визуализации данных в Python 3 с помощью одной строки&#187; Заблуждение об утраченной стоимости является одним из многих вредных когнитивных предубеждений, жертвами которых становятся люди. Это относится к нашей тенденции продолжать тратить время и ресурсы на безнадежное дело, потому что мы уже потратили столько времени в поисках. Заблуждение о непомерных затратах относится [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/interactive-data-visualization-in-python-3/">Интерактивная визуализация данных в Python 3</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&#038;title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" data-a2a-url="https://python.ivan-shamaev.ru/interactive-data-visualization-in-python-3/" data-a2a-title="Интерактивная визуализация данных в Python 3"></a></p><blockquote>
<p><em><strong>В этой статье будет рассмотрено &#171;Как создавать Интерактивные визуализации данных в Python 3 с помощью одной строки&#187;</strong></em></p>
</blockquote>
<p id="b074" class="jp jq cm ap jr b hp js hr jt ju jv jw jx jy jz ka fb" data-selectable-paragraph=""><span>Заблуждение об утраченной стоимости является одним из многих </span><a href="https://en.wikipedia.org/wiki/Thinking,_Fast_and_Slow#Heuristics_and_biases" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>вредных когнитивных предубеждений,</span></a><span> жертвами которых становятся люди. Это </span><a href="https://youarenotsosmart.com/2011/03/25/the-sunk-cost-fallacy/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>относится к нашей тенденции</span></a><span> продолжать тратить время и ресурсы на безнадежное дело, потому что мы уже потратили столько времени в поисках. Заблуждение о непомерных затратах относится к тому, чтобы оставаться на плохой работе дольше, чем мы должны, упорно трудиться над проектом, даже когда ясно, что он не будет работать, и да, продолжая использовать утомительную, устаревшую библиотеку построения графиков &#8212; matplotlib &#8212; когда существуют более эффективные, интерактивные и более привлекательные альтернативы.</span></p>
<p id="c069" class="jp jq cm ap jr b hp js hr jt ju jv jw jx jy jz ka fb" data-selectable-paragraph=""><span>За последние несколько месяцев я понял, что единственная причина, по которой я использую </span><code class="gf kb kc kd ke b">matplotlib</code> &#8212; <span>это сотни часов, которые я потратил на изучение </span><a href="https://matplotlib.org/api/api_overview.html" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>сложного синтаксиса</span></a><span>. Это осложнение приводит к часам разочарования на StackOverflow, выясняя, как </span><a href="https://stackoverflow.com/questions/14946371/editing-the-date-formatting-of-x-axis-tick-labels-in-matplotlib" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>отформатировать дату</span></a><span> или </span><a href="https://stackoverflow.com/questions/14762181/adding-a-y-axis-label-to-secondary-y-axis-in-matplotlib" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>добавить вторую ось Y</span></a><span>. К счастью, сейчас отличное время для построения графиков в Python, и после изучения </span><a href="https://www.fusioncharts.com/blog/best-python-data-visualization-libraries/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>разных вариантов графических библиотек</span></a><span> явным победителем &#8212; с точки зрения простоты использования, документирования и функциональности &#8212; является </span><a href="https://plot.ly/python/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>библиотека Python. </span></a><span>В этой статье мы подробно рассмотрим </span><code class="gf kb kc kd ke b">plotly</code><span>, как создавать лучшие графики за меньшее время &#8212; часто с помощью одной строки кода.</span></p>
<p id="90e7" class="jp jq cm ap jr b hp js hr jt ju jv jw jx jy jz ka fb" data-selectable-paragraph=""><span>Весь код этой статьи </span><a href="https://github.com/WillKoehrsen/Data-Analysis/blob/master/plotly/Plotly%20Whirlwind%20Introduction.ipynb" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>доступен на GitHub</span></a><span>. Все графики являются интерактивными и могут быть просмотрены на </span><a href="https://nbviewer.jupyter.org/github/WillKoehrsen/Data-Analysis/blob/master/plotly/Plotly%20Whirlwind%20Introduction.ipynb" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>NBViewer здесь</span></a><span>.</span></p>
<p data-selectable-paragraph=""><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/1_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/1_interactive_data_visualization_in_python_3.png" alt="" width="660" height="525" class="aligncenter size-full wp-image-762" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/1_interactive_data_visualization_in_python_3.png 660w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/1_interactive_data_visualization_in_python_3-300x239.png 300w" sizes="(max-width: 660px) 100vw, 660px" /></a></p>
<h2 id="3caa" class="km kn cm ap ao ko kp kq kr ks kt ku kv kw kx ky kz" data-selectable-paragraph=""><strong>Краткий обзор Plotly &amp; Cufflinks</strong></h2>
<p id="c3b0" class="jp jq cm ap jr b hp la hr lb ju lc jw ld jy le ka fb" data-selectable-paragraph=""><mark class="tb tc pc"><span></span></mark><mark class="tb tc pc"><code class="gf kb kc kd ke b"></code><a href="https://plot.ly/python/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><strong>plotly</strong></a></mark><strong><mark class="tb tc pc"><a href="https://plot.ly/python/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"> </a></mark></strong><mark class="tb tc pc"><span><strong>Пакет Python</strong> &#8212; это библиотека с открытым исходным кодом, построенная на </span></mark><mark class="tb tc pc"><code class="gf kb kc kd ke b"></code><a href="https://plot.ly/javascript/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer">plotly.js</a>,</mark><mark class="tb tc pc"><a href="https://plot.ly/javascript/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span> который</span></a></mark><mark class="tb tc pc"><span> в свою очередь построен на </span></mark><mark class="tb tc pc"><code class="gf kb kc kd ke b"></code><a href="https://d3js.org/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer">d3.js</a></mark><mark class="tb tc pc"><a href="https://d3js.org/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>,</span></a></mark><span>Мы будем использовать wrapper на plotly, которые называются </span><a href="https://github.com/santosjorge/cufflinks" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer">cufflinks</a>, <span>предназначенные для работы с Pandas DataFrames. Итак, весь наш стек это <strong>cufflinks &gt; plotly &gt; plotly.js &gt; d3.js</strong>, что означает, что мы получаем эффективность кодирования в Python с невероятными </span><a href="https://github.com/d3/d3/wiki/Gallery" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>интерактивными графическими возможностями d3.js.</span></a></p>
<p id="3f5e" class="jp jq cm ap jr b hp js hr jt ju jv jw jx jy jz ka fb" data-selectable-paragraph=""><span>(</span><a href="https://plot.ly/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>Сама Plotly</span></a><span> &#8212; это графическая компания с несколькими продуктами и инструментами с открытым исходным кодом. Библиотека Python бесплатна, и мы можем создавать неограниченное количество диаграмм в автономном режиме и до 25 диаграмм в онлайн-режиме, чтобы </span><a href="http://help.plot.ly/how-sharing-works-in-plotly/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>поделиться ими со всем миром</span></a><span>).</span></p>
<p id="fcfe" class="jp jq cm ap jr b hp js hr jt ju jv jw jx jy jz ka fb" data-selectable-paragraph=""><span>Вся работа в этой статье была выполнена в <strong>блокноте Jupyter</strong> с plotly + cufflinks, работающими в автономном режиме. После установки plotly и cufflinks с помощью инструкции </span><code class="gf kb kc kd ke b">pip install cufflinks plotly</code>, необходимо <span>импортировать следующие компоненты в Jupyter:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Standard plotly imports
import plotly.plotly as py
import plotly.graph_objs as go
from plotly.offline import iplot, init_notebook_mode

# Using plotly + cufflinks in offline mode
import cufflinks
cufflinks.go_offline(connected=True)
init_notebook_mode(connected=True)</pre>
<h2 id="439d" class="lx kn cm ap ao ko gy ly ha lz ma mb mc md me mf mg"><strong>Распределения по одной переменной: Histograms и Boxplots</strong></h2>
<p id="202d" class="jp jq cm ap jr b hp la hr lb ju lc jw ld jy le ka fb" data-selectable-paragraph=""><span><strong>Одиночная переменная (single variable)</strong> &#8212; одномерный график &#8212; это стандартный способ начать анализ данных, а гистограмма &#8212; это график перехода ( </span><a href="https://www.andata.at/en/software-blog-reader/why-we-love-the-cdf-and-do-not-like-histograms-that-much.html" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>хотя он имеет некоторые проблемы</span></a><span> ) для построения графика распределения. Используя некоторую статистику (</span><span>Скачать </span><a href="https://github.com/WillKoehrsen/Data-Analysis/tree/master/medium" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>статистику &gt;&gt;&gt;</span></a><span> ), давайте создадим интерактивную гистограмму количества likes для статей (</span><code class="gf kb kc kd ke b">df</code><span>это стандартный dataframe Pandas):</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df['claps'].iplot(kind='hist', xTitle='claps',
                  yTitle='count', title='Claps Distribution')</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/2_interactive_data_visualization_in_python_3.gif"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/2_interactive_data_visualization_in_python_3.gif" alt="" width="800" height="427" class="aligncenter size-full wp-image-766" /></a></p>
<p id="a9a4" class="jp jq cm ap jr b hp js hr jt ju jv jw jx jy jz ka fb" data-selectable-paragraph=""><span>Для тех, кто привык к </span><code class="gf kb kc kd ke b">matplotlib</code><span>, все, что нам нужно сделать, это добавить еще одну букву ( </span><code class="gf kb kc kd ke b">iplot</code><span>вместо </span><code class="gf kb kc kd ke b">plot</code><span>), и мы получим намного более привлекательный и интерактивный график! Мы можем щелкнуть на колонке, чтобы получить более подробную информацию, увеличить масштаб участков и, как мы увидим позже, выбрать различные категории для выделения.</span></p>
<p id="02d3" class="jp jq cm ap jr b hp js hr jt ju jv jw jx jy jz ka fb" data-selectable-paragraph=""><span>Если мы хотим построить наложенные гистограммы, это так же просто:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df[['time_started', 'time_published']].iplot(
    kind='hist',
    histnorm='percent',
    barmode='overlay',
    xTitle='Time of Day',
    yTitle='(%) of Articles',
    title='Time Started and Time Published')</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/3_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/3_interactive_data_visualization_in_python_3.png" alt="" width="1122" height="604" class="aligncenter size-full wp-image-767" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/3_interactive_data_visualization_in_python_3.png 1122w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/3_interactive_data_visualization_in_python_3-300x161.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/3_interactive_data_visualization_in_python_3-1024x551.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/3_interactive_data_visualization_in_python_3-768x413.png 768w" sizes="(max-width: 1122px) 100vw, 1122px" /></a></p>
<p><span>С небольшим количеством манипуляций над </span><code class="gf kb kc kd ke b">pandas</code><span> мы можем сделать barplot:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Resample to monthly frequency and plot 
df2 = df[['view','reads','published_date']].\
         set_index('published_date').\
         resample('M').mean()
df2.iplot(kind='bar', xTitle='Date', yTitle='Average',
    title='Monthly Average Views and Reads')</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/4_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/4_interactive_data_visualization_in_python_3.png" alt="" width="1142" height="690" class="aligncenter size-full wp-image-768" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/4_interactive_data_visualization_in_python_3.png 1142w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/4_interactive_data_visualization_in_python_3-300x181.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/4_interactive_data_visualization_in_python_3-1024x619.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/4_interactive_data_visualization_in_python_3-768x464.png 768w" sizes="(max-width: 1142px) 100vw, 1142px" /></a></p>
<p><span>Мы можем объединить </span><a href="https://pandas.pydata.org/pandas-docs/stable/10min.html" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>возможности Pandas</span></a><span> с plotly + cufflinks. Для boxplot по подписчикам по всей истории публикаций мы используем </span><code class="gf kb kc kd ke b">pivot</code>, <span>а затем plot (точнее iplot):</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df.pivot(columns='publication', values='fans').iplot(
        kind='box',
        yTitle='fans',
        title='Fans Distribution by Publication')</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/5_interactive_data_visualization_in_python_3.gif"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/5_interactive_data_visualization_in_python_3.gif" alt="" width="800" height="452" class="aligncenter size-full wp-image-769" /></a></p>
<p><span>Преимущества интерактивности заключаются в том, что мы можем исследовать и размещать данные по своему усмотрению. </span><span>В boxplot много информации, и без возможности видеть цифры мы пропустим большую ее часть!</span></p>
<h2><strong>Диаграммы рассеяния &#8212; Scatterplots</strong></h2>
<p><strong>Диаграмма рассеяния (Scatterplots)</strong> &#8212; используется очень часто для анализа данных. Scatterplots позволяет видеть эволюцию переменной во времени или связь между двумя (или более) переменными.</p>
<h3><strong>Временные ряды (Time-Series)</strong></h3>
<p>Значительная часть данных реального мира содержит в себе временной параметр. К счастью, plotly + cufflinks были разработаны с учетом визуализации временных рядов. Давайте создадим базу данных по статьям и посмотрим, как изменились тенденции.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Create a dataframe of Towards Data Science Articles
tds = df[df['publication'] == 'Towards Data Science'].\
         set_index('published_date')

# Plot read time as a time series
tds[['claps', 'fans', 'title']].iplot(
    y='claps', mode='lines+markers', secondary_y = 'fans',
    secondary_y_title='Fans', xTitle='Date', yTitle='Claps',
    text='title', title='Fans and Claps over Time')</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/6_interactive_data_visualization_in_python_3.gif"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/6_interactive_data_visualization_in_python_3.gif" alt="" width="712" height="396" class="aligncenter size-full wp-image-773" /></a></p>
<p>Здесь мы выполняем много разных действий в одной строке:</p>
<ul>
<li>Автоматическое получение красиво отформатированного временного ряда по оси X</li>
<li>Добавление вторичной оси Y, потому что наши переменные имеют разные диапазоны</li>
<li>Добавление заголовка статей в качестве всплывающей информации</li>
</ul>
<p>Для получения дополнительной информации мы также можем легко добавить текстовые аннотации:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">tds_monthly_totals.iplot(
    mode='lines+markers+text',
    text=text,
    y='word_count',
    opacity=0.8,
    xTitle='Date',
    yTitle='Word Count',
    title='Total Word Count by Month')</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/7_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/7_interactive_data_visualization_in_python_3.png" alt="" width="1132" height="654" class="aligncenter size-full wp-image-774" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/7_interactive_data_visualization_in_python_3.png 1132w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/7_interactive_data_visualization_in_python_3-300x173.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/7_interactive_data_visualization_in_python_3-1024x592.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/7_interactive_data_visualization_in_python_3-768x444.png 768w" sizes="(max-width: 1132px) 100vw, 1132px" /></a></p>
<p>Для диаграммы рассеяния с двумя переменными, окрашенной третьей категориальной переменной, мы используем:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df.iplot(
    x='read_time',
    y='read_ratio',
    # Specify the category
    categories='publication',
    xTitle='Read Time',
    yTitle='Reading Percent',
    title='Reading Percent vs Read Ratio by Publication')</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/8_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/8_interactive_data_visualization_in_python_3.png" alt="" width="1131" height="656" class="aligncenter size-full wp-image-776" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/8_interactive_data_visualization_in_python_3.png 1131w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/8_interactive_data_visualization_in_python_3-300x174.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/8_interactive_data_visualization_in_python_3-1024x594.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/8_interactive_data_visualization_in_python_3-768x445.png 768w" sizes="(max-width: 1131px) 100vw, 1131px" /></a></p>
<p>Давайте немного усложним, используя ось журнала &#8212; указанную в виде графического макета &#8212; (см. <a href="https://plot.ly/python/reference/" target="_blank" rel="noopener noreferrer">Документацию Plotly для деталей макета</a>) и определяя размеры пузырьков с помощью числовой переменной:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">tds.iplot(
    x='word_count',
    y='reads',
    size='read_ratio',
    text=text,
    mode='markers',
    # Log xaxis
    layout=dict(
        xaxis=dict(type='log', title='Word Count'),
        yaxis=dict(title='Reads'),
        title='Reads vs Log Word Count Sized by Read Ratio'))</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/9_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/9_interactive_data_visualization_in_python_3.png" alt="" width="1110" height="647" class="aligncenter size-full wp-image-777" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/9_interactive_data_visualization_in_python_3.png 1110w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/9_interactive_data_visualization_in_python_3-300x175.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/9_interactive_data_visualization_in_python_3-1024x597.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/9_interactive_data_visualization_in_python_3-768x448.png 768w" sizes="(max-width: 1110px) 100vw, 1110px" /></a></p>
<p>Приложив немного больше усилий ( <a href="https://nbviewer.jupyter.org/github/WillKoehrsen/Data-Analysis/blob/master/plotly/Plotly%20Whirlwind%20Introduction.ipynb#">подробности см. В блокноте</a> ), мы даже можем поместить четыре переменных ( <a href="https://serialmentor.com/dataviz/aesthetic-mapping.html" target="_blank" rel="noopener noreferrer">это не рекомендуется</a> ) на один график!</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/10_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/10_interactive_data_visualization_in_python_3.png" alt="" width="962" height="517" class="aligncenter size-full wp-image-778" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/10_interactive_data_visualization_in_python_3.png 962w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/10_interactive_data_visualization_in_python_3-300x161.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/10_interactive_data_visualization_in_python_3-768x413.png 768w" sizes="(max-width: 962px) 100vw, 962px" /></a></p>
<p>Как и прежде, мы можем комбинировать pandas с plotly+cufflinks для полезных графических представлений:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df.pivot_table(
    values='views', index='published_date',
    columns='publication').cumsum().iplot(
        mode='markers+lines',
        size=8,
        symbol=[1, 2, 3, 4, 5],
        layout=dict(
            xaxis=dict(title='Date'),
            yaxis=dict(type='log', title='Total Views'),
            title='Total Views over Time by Publication'))</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/11_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/11_interactive_data_visualization_in_python_3.png" alt="" width="1139" height="678" class="aligncenter size-full wp-image-779" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/11_interactive_data_visualization_in_python_3.png 1139w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/11_interactive_data_visualization_in_python_3-300x179.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/11_interactive_data_visualization_in_python_3-1024x610.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/11_interactive_data_visualization_in_python_3-768x457.png 768w" sizes="(max-width: 1139px) 100vw, 1139px" /></a></p>
<p>См. Блокнот <a href="https://plot.ly/python/" target="_blank" rel="noopener noreferrer">или документацию</a> для получения дополнительных примеров дополнительных функций. Мы можем добавлять текстовые аннотации, опорные линии и линии, которые лучше всего подходят для наших графиков, с помощью одной строки кода и при этом со всеми взаимодействиями.</p>
<h2><strong>Advanced Plots &#8212; Расширенные графические представления</strong></h2>
<p>Теперь мы разберемся с несколькими графиками, которые вы, вероятно, не будете использовать так часто, но которые могут быть весьма впечатляющими. Мы будем использовать график <code class="EnlighterJSRAW" data-enlighter-language="null">figure_factory</code>, чтобы держать эти графики на одной линии.</p>
<h3><strong>Scatter Matrix</strong></h3>
<p>Когда мы хотим исследовать отношения между многими переменными, отличной опцией является точная матрица &#8212; scattermatrix (также называемая спломом или splom):</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import plotly.figure_factory as ff
figure = ff.create_scatterplotmatrix(
    df[['claps', 'publication', 'views',      
        'read_ratio','word_count']],
    diag='histogram',
    index='publication')</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/12_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/12_interactive_data_visualization_in_python_3.png" alt="" width="1000" height="1000" class="aligncenter size-full wp-image-782" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/12_interactive_data_visualization_in_python_3.png 1000w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/12_interactive_data_visualization_in_python_3-300x300.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/12_interactive_data_visualization_in_python_3-150x150.png 150w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/12_interactive_data_visualization_in_python_3-768x768.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></p>
<p>Даже этот график полностью интерактивен, что позволяет нам исследовать данные.</p>
<h3><strong>Тепловая карта корреляции &#8212; Correlation Heatmap</strong></h3>
<p>Чтобы визуализировать корреляции между числовыми переменными, мы вычисляем корреляции и затем создаем аннотированную тепловую карту:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">corrs = df.corr()
figure = ff.create_annotated_heatmap(
    z=corrs.values,
    x=list(corrs.columns),
    y=list(corrs.index),
    annotation_text=corrs.round(2).values,
    showscale=True)</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/13_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/13_interactive_data_visualization_in_python_3.png" alt="" width="1000" height="800" class="aligncenter size-full wp-image-783" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/13_interactive_data_visualization_in_python_3.png 1000w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/13_interactive_data_visualization_in_python_3-300x240.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/13_interactive_data_visualization_in_python_3-768x614.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></p>
<p>Список графиков можно продолжать и продолжать. Cufflinks также имеют несколько тем, которые мы можем использовать, чтобы получить совершенно другой стиль без каких-либо усилий. Например, ниже у нас есть график отношения (ratio plot) в теме «space»:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/14_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/14_interactive_data_visualization_in_python_3.png" alt="" width="700" height="450" class="aligncenter size-full wp-image-784" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/14_interactive_data_visualization_in_python_3.png 700w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/14_interactive_data_visualization_in_python_3-300x193.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>
<p>и график распространения (spread plot) в «ggplot»:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/15_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/15_interactive_data_visualization_in_python_3.png" alt="" width="972" height="460" class="aligncenter size-full wp-image-785" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/15_interactive_data_visualization_in_python_3.png 972w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/15_interactive_data_visualization_in_python_3-300x142.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/15_interactive_data_visualization_in_python_3-768x363.png 768w" sizes="(max-width: 972px) 100vw, 972px" /></a></p>
<p>Мы также можем получить 3D-графики (поверхность surface и пузырь bubble).</p>
<p><strong>surface plot:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/16_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/16_interactive_data_visualization_in_python_3.png" alt="" width="766" height="473" class="aligncenter size-full wp-image-786" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/16_interactive_data_visualization_in_python_3.png 766w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/16_interactive_data_visualization_in_python_3-300x185.png 300w" sizes="(max-width: 766px) 100vw, 766px" /></a></p>
<p><strong>bubble plot:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/17_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/17_interactive_data_visualization_in_python_3.png" alt="" width="746" height="478" class="aligncenter size-full wp-image-787" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/17_interactive_data_visualization_in_python_3.png 746w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/17_interactive_data_visualization_in_python_3-300x192.png 300w" sizes="(max-width: 746px) 100vw, 746px" /></a></p>
<p>Для тех, <a href="https://interworks.com/blog/rcurtis/2018/01/19/friends-dont-let-friends-make-pie-charts/" target="_blank" rel="noopener noreferrer">кто так склонен</a> , вы можете даже сделать круговую диаграмму:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/18_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/18_interactive_data_visualization_in_python_3.png" alt="" width="700" height="450" class="aligncenter size-full wp-image-788" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/18_interactive_data_visualization_in_python_3.png 700w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/18_interactive_data_visualization_in_python_3-300x193.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>
<h2><strong>Редактирование в Plotly Chart Studio</strong></h2>
<p>Создавая эти графики в блокноте, вы увидите небольшую ссылку в правом нижнем углу на графике с надписью «Экспорт в plot.ly». Если вы щелкнете по этой ссылке, вы попадете в <a href="https://plot.ly/create/" target="_blank" rel="noopener noreferrer">диаграммную студию</a>, где сможете подправить свой график для окончательной презентации. Вы можете добавлять аннотации, указывать цвета и, в общем, убирать все для получения отличной фигуры. Затем вы можете опубликовать свою фигуру в Интернете, чтобы любой мог найти ее по ссылке.</p>
<p>Ниже приведены два графика, которые были скорректированы в Chart Studio:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/19_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/19_interactive_data_visualization_in_python_3.png" alt="" width="700" height="450" class="aligncenter size-full wp-image-789" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/19_interactive_data_visualization_in_python_3.png 700w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/19_interactive_data_visualization_in_python_3-300x193.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/20_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/20_interactive_data_visualization_in_python_3.png" alt="" width="700" height="450" class="aligncenter size-full wp-image-790" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/20_interactive_data_visualization_in_python_3.png 700w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/20_interactive_data_visualization_in_python_3-300x193.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>
<p>Со всем, что упомянуто здесь, мы все еще не изучаем все возможности библиотеки! Я бы посоветовал вам проверить документацию по plotly &amp; cufflinks, для более невероятной графики.</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/21_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/21_interactive_data_visualization_in_python_3.png" alt="" width="1040" height="800" class="aligncenter size-full wp-image-791" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/21_interactive_data_visualization_in_python_3.png 1040w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/21_interactive_data_visualization_in_python_3-300x231.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/21_interactive_data_visualization_in_python_3-1024x788.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/21_interactive_data_visualization_in_python_3-768x591.png 768w" sizes="(max-width: 1040px) 100vw, 1040px" /></a></p>
<p>Выводы<br />Хуже всего в заблуждении о затонувших затратах является то, что вы понимаете, сколько времени вы потратили впустую после того, как бросили работу. К счастью, теперь, когда я допустил ошибку, придерживаясь matploblibслишком долго, вам не нужно!</p>
<p>Когда мы думаем о построении библиотек, есть несколько вещей, которые мы хотим:</p>
<ul>
<li>Графики с одной переменной для быстрого исследования</li>
<li>Интерактивные элементы для подбора / исследования данных</li>
<li>Возможность копаться в деталях по мере необходимости</li>
<li>Простая настройка для финальной презентации</li>
</ul>
<p>На данный момент, лучший вариант для всего этого в Python &#8212; это plotly.</p>
<p>Plotly позволяет нам быстро создавать визуализации и помогает нам лучше понять наши данные с помощью интерактивности. Кроме того, давайте признаем, что построение графиков должно быть одной из самых приятных частей науки о данных! С другими библиотеками построение графиков превратилось в утомительное занятие, но с plotly снова есть радость в создании великой фигуры!</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/22_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/22_interactive_data_visualization_in_python_3.png" alt="" width="1448" height="625" class="aligncenter size-full wp-image-792" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/22_interactive_data_visualization_in_python_3.png 1448w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/22_interactive_data_visualization_in_python_3-300x129.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/22_interactive_data_visualization_in_python_3-1024x442.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/22_interactive_data_visualization_in_python_3-768x331.png 768w" sizes="(max-width: 1448px) 100vw, 1448px" /></a></p>


<p></p>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&#038;title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" data-a2a-url="https://python.ivan-shamaev.ru/interactive-data-visualization-in-python-3/" data-a2a-title="Интерактивная визуализация данных в Python 3"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/interactive-data-visualization-in-python-3/">Интерактивная визуализация данных в Python 3</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/interactive-data-visualization-in-python-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Сравнение Flask vs Django. Когда стоит выбрать Python Flask?</title>
		<link>https://python.ivan-shamaev.ru/comparison-of-flask-vs-django-most-popular-python-platforms/</link>
					<comments>https://python.ivan-shamaev.ru/comparison-of-flask-vs-django-most-popular-python-platforms/#respond</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Thu, 05 Mar 2020 21:26:55 +0000</pubDate>
				<category><![CDATA[Введение в Python 3]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Django Python]]></category>
		<category><![CDATA[Flask]]></category>
		<category><![CDATA[Flask Python]]></category>
		<category><![CDATA[Flask vs Django]]></category>
		<category><![CDATA[python 3]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=652</guid>

					<description><![CDATA[<p>Flask vs Django: как понять, нужен ли вам молоток или ящик для инструментов Если вам интересно, следует ли использовать Flask или Django для своего проекта, эта статья для вас. Обе платформы написаны на Python, поэтому опыт работы с этим языком программирования является ключевым. Согласно исследованию Python для разработчиков 2018 года JetBrains, два самых популярных фрейворка Python &#8212; это Flask и Django. [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/comparison-of-flask-vs-django-most-popular-python-platforms/">Сравнение Flask vs Django. Когда стоит выбрать Python Flask?</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&#038;title=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" data-a2a-url="https://python.ivan-shamaev.ru/comparison-of-flask-vs-django-most-popular-python-platforms/" data-a2a-title="Сравнение Flask vs Django. Когда стоит выбрать Python Flask?"></a></p><blockquote><p><em><strong>Flask vs Django:</strong> как понять, нужен ли вам молоток или ящик для инструментов</em></p></blockquote>
<p id="820c" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Если вам интересно, следует ли использовать Flask или Django для своего проекта, эта статья для вас. Обе платформы написаны на Python, поэтому опыт работы с этим языком программирования является ключевым. Согласно исследованию <a class="at fw hf hg hh hi" href="https://www.jetbrains.com/research/python-developers-survey-2018/#general-python-usage" target="_blank" rel="noopener nofollow noreferrer">Python для разработчиков 2018</a> года JetBrains, <strong>два самых популярных фрейворка</strong><strong> Python</strong><strong> &#8212; это Flask и Django.</strong> Чтобы помочь Вам сделать осознанный выбор между этими фреймворками, мы обсудим, что такое <strong>Flask</strong> и <strong>Django</strong>, опишем их преимущества и недостатки, а также рассмотрим истории успеха.</p>
<h1 id="67ae" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu" data-selectable-paragraph="">Что такое Django и Flask?</h1>
<p id="2211" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph=""><strong class="gt ia">Django</strong> &#8212; это бесплатная среда разработки веб-приложений Python с открытым исходным кодом, которая следует шаблону <strong>Model-Template-View (MTV)</strong>. Он был создан осенью 2003 года Адрианом Головатым и Саймоном Уиллисоном.</p>
<p class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph=""><strong>Django</strong> был создан для упрощения процесса разработки сайта. Основное внимание уделяется повторно используемым компонентам, меньшему количеству кода и быстрой разработке. На него повлияли несколько более ранних фреймворков, в том числе Zope и Plone, и, в свою очередь, они вдохновили множество других фреймворков, которые последовали за ним, включая Pyramid, CherryPy, Bottle и Web2py.</p>
<p id="0543" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><b>Flask </b>&#8212; это микрофреймворк с удивительным началом. Фактически он зародился как первоапрельская шутка. Перед разработкой <strong>Flask</strong> Армин Роначер, создатель Flask, написал два других решения:</p>
<ul>
<li class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl"><strong>Werkzeug (серверная среда)</strong> и</li>
<li class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl"><strong>Jinja2 (библиотека шаблонов)</strong>.</li>
</ul>
<p class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Армин подумал, что было бы интересно взять эти два решения и собрать их в zip-файл, поэтому он написал <strong>Denied Framework</strong> (как он называл его прежде, и назвал его Flask). Когда разработчик устанавливает этот Denied Framework, программа установки автоматически разархивирует файл и запускает эти два решения одновременно. Хотите верьте, хотите нет, но Flask получил положительную реакцию.</p>
<h1 id="3955" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu" data-selectable-paragraph="">Основные различия между Django и Flask</h1>
<p id="97b2" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph="">Чтобы лучше понять, какая инфраструктура лучше всего подходит для вашего проекта, давайте рассмотрим основные различия между Django и Flask.</p>
<p id="c9e8" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><strong>Django</strong> предоставляет свой собственный <strong>Django ORM</strong> (объектно-реляционное отображение) и использует модели данных, в то время как <strong>Flask</strong> вообще не имеет моделей данных. Модели данных позволяют разработчикам связывать таблицы базы данных с классами на языке программирования, чтобы они могли работать с моделями так же, как ссылки на базы данных. Почему у Flask нет модели данных? Потому что философия Flask отличается от философии Django.</p>
<blockquote>
<p class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><strong>Django связывает все вместе, а Flask более модульный.</strong></p>
</blockquote>
<p id="8e28" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Основное различие между Django и Flask в том, что <strong>Django предоставляет полнофункциональную среду Model-View-Controller.</strong></p>
<p class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><strong>Цель Django</strong> &#8212; упростить процесс разработки сайта. Он основан на меньшем количестве кода, повторно используемых компонентах и ​​быстрой разработке.</p>
<p class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><strong>Flask</strong>, с другой стороны, представляет собой <strong>микрофреймворк, основанный на концепции &#171;хорошо выполнять одну вещь&#187;</strong>. Он не предоставляет ORM и поставляется только с базовым набором инструментов для веб-разработки.</p>
<p id="7a48" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Приложения для <strong>Flask</strong> в основном представляют собой одностраничные приложения (SPA). Это хороший выбор для небольших и средних сайтов, таких как форумы и личные блоги. <strong>Django</strong> идеально подходит для крупных проектов, таких как сайты электронной коммерции и CMS.</p>
<h1 id="b994" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu" data-selectable-paragraph="">Преимущества и недостатки этих фреймворков</h1>
<p id="c658" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph="">Мы сравним <strong>Django</strong> и <strong>Flask</strong> на основе производительности, пакетов, сообщества, безопасности и вариантов использования, чтобы выяснить, какая платформа лучше всего подходит для вашего проекта.</p>
<h2 id="0f36" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Производительность</h2>
<p id="eb09" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph=""><strong>Производительность Flask vs Django</strong> является важным показателем функциональности системы. Если инфраструктура обладает высокой производительностью, это приведет к созданию масштабируемого, быстрого и безопасного приложения. Слабая производительность может привести к масштабным проблемам и архитектурным проблемам.</p>
<p id="68f5" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Если учесть, что производительность <strong>Django vs Flask</strong> имеет хорошие результаты и используется на сайтах с большим трафиком, что является отличным показателем их эффективности.</p>
<h2 id="900d" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Пакеты</h2>
<p id="886e" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph=""><strong>Flask</strong> минималистичен и не имеет ограничений, то есть разработчики могут реализовать именно то, что они хотят, используя внешние библиотеки. Это делает <strong>Flask</strong> гибким и расширяемым.</p>
<p id="73ea" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><strong>Django</strong>, с другой стороны, имеет огромное количество встроенных пакетов. Если быть точным, то на сентябрь 2019 года было 4046 пакетов Django. Это означает, что вы, скорее всего, найдете пакет для сборки и запуска своего приложения с меньшими усилиями.</p>
<h2 id="54ee" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Сообщество</h2>
<p id="716a" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph="">В случае сравнения <strong>Python Django с Flask</strong>, Django имеет огромное и активное сообщество разработчиков. Если у вас есть какие-либо вопросы, вы можете задать их на различных веб-порталах и форумах, таких как <strong>Stack Overflow</strong>, и, скорее всего, получите ответ. Кроме того, не трудно найти работу Django.</p>
<p id="749c" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Сообщество Flask не такое большое, как сообщество Django. Поэтому, если вам сложно писать на Flask или у вас есть вопросы по Flask, поиск ответов может занять некоторое время.</p>
<h2 id="f89f" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Безопасность</h2>
<p id="c9aa" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph="">У Django есть варианты защиты вашего приложения от следующих проблем:</p>
<ul class="">
<li id="def1" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he ib ic id" data-selectable-paragraph=""><strong class="gt ia">Межсайтовый скриптинг (XSS). </strong>Атаки XSS позволяют злоумышленнику внедрить клиентские сценарии в браузеры. Шаблоны Django защищают ваш проект от большинства XSS-атак.</li>
<li id="9c49" class="gr gs dm bk gt b gu ie gw if gy ig ha ih hc ii he ib ic id" data-selectable-paragraph=""><strong class="gt ia">Подделка межсайтовых запросов (CSRF). </strong>CSRF-атаки позволяют злоумышленнику выполнять действия, используя учетные данные другого пользователя. Django имеет встроенную защиту от большинства типов CSRF-атак.</li>
<li id="d80f" class="gr gs dm bk gt b gu ie gw if gy ig ha ih hc ii he ib ic id" data-selectable-paragraph=""><strong class="gt ia">SQL-инъекция. </strong>SQL-инъекция &#8212; это атака, при которой злонамеренный пользователь может выполнить произвольный код SQL в базе данных. Наборы запросов Django защищены от внедрения SQL, поскольку запросы строятся с использованием параметризации.</li>
</ul>
<p id="a70f" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><strong>Библиотека Flask-Security</strong> предоставляет почти те же механизмы, что и Django, для предотвращения утечек данных и других веб-атак.</p>
<h1 id="3732" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Случаи использования</h1>
<p id="fce3" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph=""><strong>Django</strong> был разработан для быстрой разработки сложных веб-приложений. Он предоставляет разработчикам необходимые инструменты для реализации масштабируемой и поддерживаемой функциональности. С другой стороны, простота Flask позволяет разработчикам быстрее создавать небольшие приложения.</p>
<p id="2ba9" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Давайте рассмотрим лучшие примеры сайтов Django и Flask.</p>
<h2 id="adfe" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Какие проекты строятся с Django?</h2>
<p id="053f" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph="">Многие сайты используют Django. Поскольку этот фреймворк легко масштабируется и предоставляет возможность обрабатывать огромное количество данных в режиме реального времени, многие сайты с большим трафиком используют его. Ниже вы можете увидеть <strong>самые популярные проекты Django</strong>:</p>
<p data-selectable-paragraph=""><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/most_popular_Django_projects.png"><img decoding="async" class="aligncenter size-full wp-image-656" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/most_popular_Django_projects.png" alt="" width="900" height="680" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/most_popular_Django_projects.png 900w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/most_popular_Django_projects-300x227.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/most_popular_Django_projects-768x580.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></a></p>
<h2 id="9774" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Какие проекты можно разработать на Django</h2>
<p id="7fa6" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph="">Примеры приложений Django:</p>
<ul class="">
<li id="07f8" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he ib ic id" data-selectable-paragraph=""><strong class="gt ia">Population Explorer</strong>, проект SaaS, который предоставляет пользователям доступ к демографическим данным и инструментам анализа на карте. Пользователи могут выбрать целевую область и получить демографические данные о ней, такие как распределение по полу, возрасту, численности населения, плотности населения и росту населения. Мы внедрили платежную систему, чтобы пользователи могли приобретать планы подписки прямо на сайте. Population Explorer содержит огромное количество данных и множество функций, и Django &#8212; это то, что делает все это возможным.</li>
<li id="dfbe" class="gr gs dm bk gt b gu ie gw if gy ig ha ih hc ii he ib ic id" data-selectable-paragraph=""><strong class="gt ia">Possio</strong>, SaaS-платформа, где пользователи могут отслеживать местоположение транспортных средств, а также данные о резком торможении, быстром ускорении, агрессивном вождении и превышении скорости. Поскольку Possio обрабатывает огромные объемы данных в режиме реального времени, Django является отличным решением.</li>
</ul>
<h2 id="f095" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Какие типы проектов создаются с помощью Flask?</h2>
<p id="e3ca" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph=""><strong>Flask</strong> &#8212; одна из ведущих платформ Python для веб-разработки. Согласно <a class="at fw hf hg hh hi" href="https://www.jetbrains.com/research/python-developers-survey-2018/" target="_blank" rel="noopener nofollow noreferrer">опросам разработчиков Python от JetBrains</a>, использование Flask среди разработчиков увеличилось с 41% в 2017 году до 47% в 2018 году. Причины, по которым всемирно известные компании, такие как Airbnb и Reddit, используют Flask, многочисленны. Flask дает вам больше контроля над вашим проектом, поскольку вы можете выбирать, какие компоненты использовать и как вы взаимодействуете с ними. Кроме того, вы можете подключить любое расширение, которое вам нужно.</p>
<p id="e00b" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Сайты этих всемирно известных компаний создаются с помощью Flask:</p>
<p data-selectable-paragraph=""><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/world_famous_companies_are_built_with_Flask.png"><img decoding="async" class="aligncenter size-full wp-image-658" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/world_famous_companies_are_built_with_Flask.png" alt="" width="900" height="680" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/world_famous_companies_are_built_with_Flask.png 900w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/world_famous_companies_are_built_with_Flask-300x227.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/world_famous_companies_are_built_with_Flask-768x580.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></a></p>
<h2 id="e487" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Какие проекты можно реализовывать на Flask</h2>
<p id="cdd7" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph="">Один из практических проектов Flask &#8212; <strong class="gt ia">Cybertunity</strong>. Это приложение позволяет коллегам поделиться своими знаниями о кибербезопасности. Cybertunity делит сотрудников на две группы и дает всем сотрудникам опрос, состоящий из 60 вопросов, разделенных по темам. Затем приложение генерирует PDF-файл, показывающий результаты опроса и сводку того, насколько хорошо сотрудники знают темы, термины и концепции кибербезопасности. Это небольшой проект с минимальной функциональностью, поэтому мы использовали Flask.</p>
<h2 id="5281" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Что есть что? Hammer vs toolbox или какой фреймворк выбрать</h2>
<p id="73a6" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph="">Давайте подытожим особенности и сильные стороны Django и Flask, чтобы вы могли решить, какие рамки выбрать.</p>
<p data-selectable-paragraph=""><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/particularities_and_strengths_of_Django_and_Flask.png"><img decoding="async" class="aligncenter size-full wp-image-659" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/particularities_and_strengths_of_Django_and_Flask.png" alt="" width="1722" height="912" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/particularities_and_strengths_of_Django_and_Flask.png 1722w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/particularities_and_strengths_of_Django_and_Flask-300x159.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/particularities_and_strengths_of_Django_and_Flask-1024x542.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/particularities_and_strengths_of_Django_and_Flask-768x407.png 768w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/particularities_and_strengths_of_Django_and_Flask-1536x813.png 1536w" sizes="(max-width: 1722px) 100vw, 1722px" /></a></p>
<p id="9019" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><strong class="gt ia">Выберите Django,</strong> если у вас мало времени или у вас ограниченный бюджет. Django &#8212; это идеальное решение для MVP, платформ электронной коммерции, приложений mHealth и правительственных веб-сайтов.</p>
<p id="6a08" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><strong class="gt ia">Выберите Flask,</strong> если у вас небольшой или средний проект, который имеет уникальные требования и требует пользовательских компонентов. Flask особенно хорош для прототипирования.</p>
<p id="cde4" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Учитывая, что Django имеет огромное количество встроенных решений, и Flask часто выбирается для использования соответствующего пакета для решения определенной проблемы, наш вердикт <strong class="gt ia">таков</strong>: <strong class="gt ia">Django &#8212; это набор инструментов, а Flask &#8212; молот.</strong></p>
<p id="024b" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Мы надеемся, что наше руководство по Python Flask vs Django позволило вам лучше понять преимущества и недостатки этих платформ, различия и варианты использования.</p>
<h1>6 причин, по которым Flask — лучший фреймворк для разработки веб-приложений</h1>
<p>Что делает Flask лучше других фреймворков? И каковы причины использования Flask для разработки веб-приложений? Давайте проанализируем этот аспект и углубимся в причины, по которым Flask занимает лидирующие позиции среди фреймворков для веб-приложений.</p>
<h2>Причина 1: Высокая масштабируемость</h2>
<p>В сегодняшней быстро меняющейся среде большинство людей начинают с идеи небольшого веб-приложения, а затем масштабируют ее в соответствии с требованиями. Если вы связаны со стартапом или малым бизнесом, вы хотите разработать свое веб-приложение с помощью хорошо масштабируемой среды. Flask — одна из таких платформ, которая соответствует вашим требованиям. Он может обрабатывать большое количество запросов по мере того, как ваш бизнес расширяется со временем. Например, Pinterest перешел с Django на Flask и обрабатывает миллиарды запросов в день. Причиной масштабируемости Flask является его способность модульности кодовой базы по мере ее роста в течение определенного периода времени.</p>
<h2>Причина 2: Простота использования и гибкость</h2>
<p>Когда вы выбираете среду разработки веб-приложений, вы будете искать ту, которая позволяет настраивать код в соответствии с вашими требованиями. Flask — одна из таких веб-платформ, поэтому она имеет огромную базу пользователей среди технического сообщества. Есть очень мало частей Flask, которые вы не можете изменить или заменить. По сравнению с Django, Flask открыт для изменений и добавляет уровень гибкости в процесс разработки веб-приложений. Кроме того, фреймворк прост в использовании и понимании даже для новичка. Основной причиной простоты Flask является его простая документация.</p>
<h2>Причина 3: больший контроль над кодом</h2>
<p>Flask — одна из наиболее признанных платформ веб-приложений, позволяющая разработчикам полностью контролировать небольшую кодовую базу. Платформа позволяет разработчикам выбирать компоненты, которые они хотят для конкретного приложения. Более того, Flask позволяет разработчикам принимать решения при выборе компонентов для разработки. Он также обеспечивает контроль над различными расширениями, которые вы получаете с фреймворком. Например, предположим, что вы разрабатываете веб-приложение, которое не использует доступ к базе данных или проверку формы. В этом случае разработчики могут исключить это и использовать только соответствующие модули для разработки.</p>
<h2>Причина 4: Поддержка тестирования</h2>
<p>Следующим этапом жизненного цикла разработки программного обеспечения после разработки является тестирование. К сожалению, в большинстве фреймворков веб-приложений вы не найдете опцию тестирования. Итак, вам нужно найти тестовый фреймворк отдельно и выполнить требуемую процедуру. В случае с Flask вы получаете встроенное средство модульного тестирования, которое позволяет протестировать ваше приложение, прежде чем выпускать его в производство. Кроме того, инфраструктура предоставляет такие функции, как встроенный сервер разработки, быстрый отладчик и диспетчеризация запросов. Это помогает упростить процесс тестирования для команды разработчиков. Кроме того, фреймворк очень легкий.</p>
<h2>Причина 5: Облегчает эксперименты</h2>
<p>В современную эпоху вы хотите, чтобы среда веб-приложений экспериментировала с подходом к разработке. Вот где Flask может быть вашим лучшим выбором. Это позволит вам адаптироваться к новым технологиям и использовать гибкие методологии разработки. Более быстрая реализация — одно из уникальных преимуществ фреймворка Flask, и именно поэтому он сделал себе имя в сообществе Python. Если разработчик хочет добавлять в свой продукт все больше и больше функций по мере того, как он становится известным, Flask может стать отличным вариантом. Это позволит разработчикам постоянно улучшать свои продукты с помощью систем быстрой интеграции и поддержки.</p>
<h2>Причина 6: медленная кривая обучения</h2>
<p>Когда разработчики веб-приложений выбирают платформу для своего проекта, они будут думать о кривой обучения, будь она крутой или плоской. Естественно, вы хотите выбрать фреймворк с небольшой кривой обучения, и именно здесь Flask превосходит все другие фреймворки Python. Понимание концепции Flask не является сложной задачей, и именно поэтому разработчики любят его. Даже новичок может выучить Flask за несколько недель, если у него есть базовые знания языка программирования Python. Вот почему этот фреймворк становится все более популярным и популярным, и в ближайшие годы он займет центральное место в разработке веб-приложений.</p>
<h2>Подведение итогов по преимуществам Flask</h2>
<p><strong>Flask</strong> — один из самых популярных микрофреймворков для разработки веб-приложений в последнее время. Фреймворк зарекомендовал себя среди сообщества разработчиков Python и разработчиков веб-приложений по всему миру.</p>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&#038;title=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" data-a2a-url="https://python.ivan-shamaev.ru/comparison-of-flask-vs-django-most-popular-python-platforms/" data-a2a-title="Сравнение Flask vs Django. Когда стоит выбрать Python Flask?"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/comparison-of-flask-vs-django-most-popular-python-platforms/">Сравнение Flask vs Django. Когда стоит выбрать Python Flask?</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/comparison-of-flask-vs-django-most-popular-python-platforms/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Keras Tutorial: Руководство для начинающих по глубокому обучению на Python</title>
		<link>https://python.ivan-shamaev.ru/keras-tutorial-beginner-guide-to-deep-learning-in-python/</link>
					<comments>https://python.ivan-shamaev.ru/keras-tutorial-beginner-guide-to-deep-learning-in-python/#comments</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Sun, 08 Dec 2019 20:46:32 +0000</pubDate>
				<category><![CDATA[Машинное обучение. Python]]></category>
		<category><![CDATA[deep learning python]]></category>
		<category><![CDATA[Keras]]></category>
		<category><![CDATA[Keras Python 3]]></category>
		<category><![CDATA[Keras Tutorial]]></category>
		<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[python 3]]></category>
		<category><![CDATA[Глубокое обучение]]></category>
		<category><![CDATA[Глубокое обучение Python]]></category>
		<category><![CDATA[Руководство для начинающих]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=463</guid>

					<description><![CDATA[<p>Keras Tutorial: Руководство для начинающих по глубокому обучению на Python 3 В этом пошаговом руководстве по Keras вы узнаете, как построить сверточную нейронную сеть на Python! Фактически, мы будем обучать классификатор для рукописных цифр, который может похвастаться более чем 99% точностью в известном наборе данных MNIST. Прежде чем мы начнем, мы должны отметить, что это [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/keras-tutorial-beginner-guide-to-deep-learning-in-python/">Keras Tutorial: Руководство для начинающих по глубокому обучению на Python</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fkeras-tutorial-beginner-guide-to-deep-learning-in-python%2F&amp;linkname=Keras%20Tutorial%3A%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%BC%D1%83%20%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%BD%D0%B0%20Python" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fkeras-tutorial-beginner-guide-to-deep-learning-in-python%2F&amp;linkname=Keras%20Tutorial%3A%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%BC%D1%83%20%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%BD%D0%B0%20Python" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fkeras-tutorial-beginner-guide-to-deep-learning-in-python%2F&amp;linkname=Keras%20Tutorial%3A%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%BC%D1%83%20%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%BD%D0%B0%20Python" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fkeras-tutorial-beginner-guide-to-deep-learning-in-python%2F&amp;linkname=Keras%20Tutorial%3A%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%BC%D1%83%20%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%BD%D0%B0%20Python" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fkeras-tutorial-beginner-guide-to-deep-learning-in-python%2F&amp;linkname=Keras%20Tutorial%3A%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%BC%D1%83%20%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%BD%D0%B0%20Python" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fkeras-tutorial-beginner-guide-to-deep-learning-in-python%2F&amp;linkname=Keras%20Tutorial%3A%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%BC%D1%83%20%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%BD%D0%B0%20Python" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fkeras-tutorial-beginner-guide-to-deep-learning-in-python%2F&amp;linkname=Keras%20Tutorial%3A%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%BC%D1%83%20%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%BD%D0%B0%20Python" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fkeras-tutorial-beginner-guide-to-deep-learning-in-python%2F&#038;title=Keras%20Tutorial%3A%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%BC%D1%83%20%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%BD%D0%B0%20Python" data-a2a-url="https://python.ivan-shamaev.ru/keras-tutorial-beginner-guide-to-deep-learning-in-python/" data-a2a-title="Keras Tutorial: Руководство для начинающих по глубокому обучению на Python"></a></p><blockquote>
<p><strong>Keras Tutorial:</strong> Руководство для начинающих по глубокому обучению на <strong>Python 3</strong></p>
</blockquote>
<p>В этом пошаговом руководстве по Keras вы узнаете, как построить сверточную нейронную сеть на Python!</p>
<p>Фактически, мы будем обучать классификатор для рукописных цифр, который может похвастаться более чем 99% точностью в известном наборе данных MNIST.</p>
<p>Прежде чем мы начнем, мы должны отметить, что это руководство ориентировано на новичков, которые заинтересованы в прикладном глубокого изучения.</p>
<p><strong>Наша цель</strong> &#8212; познакомить вас с одной из самых популярных и мощных библиотек для построения нейронных сетей на Python. Это означает, что мы разберем большую часть теории и математики, но мы также укажем вам на большие ресурсы для их изучения.</p>
<h2><strong>Вступительная часть по Keras Tutorial Python 3</strong></h2>
<p>Для начала изучения машинного обучения на Python с библиотекой Keras, желательно, чтобы Вы:</p>
<ul>
<li>Понимали основные концепции машинного обучения</li>
<li>Имели навыки программирования на Python</li>
</ul>
<h3><strong>Почему Keras?</strong></h3>
<p><strong>Keras</strong> &#8212; рекомендуемая библиотека для глубокого изучения Python, особенно для начинающих. Его минималистичный, модульный подход позволяет с легкостью построить и запустить глубокие нейронные сети.</p>
<p><strong>Типичные рабочие процессы Keras выглядят так:</strong></p>
<ul>
<li>Определите ваши тренировочные данные: входной тензор и целевой тензор.</li>
<li>Определите сеть слоев (или модель), которая отображает входные данные для наших целей.</li>
<li>Настройте процесс обучения, выбрав функцию потерь, оптимизатор и некоторые показатели для мониторинга.</li>
<li>Повторяйте данные тренировки, вызывая метод fit() вашей модели.</li>
</ul>
<h3><strong>Что такое глубокое обучение?</strong></h3>
<p><strong>Глубокое обучение относится к нейронным сетям с несколькими скрытыми слоями</strong>, которые могут изучать все более абстрактные представления входных данных. Это явное упрощение, но для нас это практическое определение для старта в этой дисциплине.</p>
<p>Например, глубокое обучение привело к значительным достижениям в области компьютерного зрения. Теперь мы можем классифицировать изображения, находить в них объекты и даже помечать их заголовками. Для этого глубокие нейронные сети со многими скрытыми слоями могут последовательно изучать более сложные функции из исходного входного изображения:</p>
<ul>
<li>Первые скрытые слои могут изучать только локальные контуры.</li>
<li>Затем каждый последующий слой (или фильтр) изучает более сложные представления.</li>
<li>Наконец, последний слой может классифицировать изображение как кошку или кенгуру.</li>
</ul>
<p>Эти типы глубоких нейронных сетей называются <strong>сверточными нейронными сетями.</strong></p>
<h3><strong>Что такое сверточные нейронные сети (Convolutional Neural Networks CNN)?</strong></h3>
<p>Короче говоря, <strong>сверточные нейронные сети (CNN)</strong> представляют собой многослойные нейронные сети (иногда до 17 или более слоев), которые предполагают, что входные данные являются изображениями.</p>
<p><strong>Типичная архитектура CNN:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/typical_cnn_architecture_keras_tutorial_python3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/typical_cnn_architecture_keras_tutorial_python3.png" alt="" width="640" height="197" class="aligncenter size-full wp-image-472" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/typical_cnn_architecture_keras_tutorial_python3.png 640w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/typical_cnn_architecture_keras_tutorial_python3-300x92.png 300w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>
<p>Удовлетворяя это требование, CNN могут резко сократить количество параметров, которые должны быть настроены. Следовательно, CNN могут эффективно справляться с высокой размерностью необработанных изображений.</p>
<p>Их основная механика выходит за рамки этого урока, но вы можете прочитать о них <strong><a href="http://cs231n.github.io/convolutional-networks/" target="_blank" rel="noopener noreferrer">здесь</a></strong>.</p>
<h3><strong>Чем эта статья не является</strong></h3>
<p>Это не полный курс по глубокому обучению. Это руководство предназначено для того, чтобы перенести вас с нуля в вашу первую сверточную нейронную сеть с минимально возможной головной болью!</p>
<p>Если вы заинтересованы в овладении теорией глубокого обучения, мы рекомендуем этот замечательный курс из Стэнфорда:</p>
<ul>
<li><strong><a href="http://cs231n.stanford.edu/" target="_blank" rel="noopener noreferrer">CS231n: сверточные нейронные сети для визуального распознавания</a></strong></li>
</ul>
<h3><strong>О моделях Keras</strong></h3>
<p>В Keras доступно два основных типа моделей: <strong>последовательная модель</strong> и <strong>класс Model</strong>, используемый с функциональным API .</p>
<p><strong>Эти модели имеют ряд общих методов и атрибутов:</strong></p>
<ul>
<li><code>model.layers</code><span> это плоский список слоев, составляющих модель.</span></li>
<li><code>model.inputs</code><span> список входных тензоров модели.</span></li>
<li><code>model.outputs</code><span> список выходных тензоров модели.</span></li>
<li><code>model.summary()</code><span>печатает краткое представление вашей модели.</span></li>
<li><code>model.get_config()</code><span>возвращает словарь, содержащий конфигурацию модели.</span></li>
<li><code>model.get_weights()</code><span><span><span> </span>возвращает список всех весовых тензоров в модели в виде массивов Numpy.</span></span></li>
<li><code>model.set_weights(weights)</code><span><span>устанавливает значения весов модели из списка массивов Numpy.<span> </span></span><span>Массивы в списке должны иметь ту же форму, что и возвращаемые<span> </span></span></span><code>get_weights()</code><span><span>.</span></span></li>
<li><code>model.to_json()</code><span><span>возвращает представление модели в виде строки JSON.<span> </span></span><span>Обратите внимание, что представление не включает веса, только архитектуру.</span></span></li>
<li><code>model.to_yaml()</code><span>возвращает представление модели в виде строки YAML. Обратите внимание, что представление не включает веса, только архитектуру.</span></li>
<li><code>model.save_weights(filepath)</code><span><span><span> </span>сохраняет вес модели в виде файла HDF5.</span></span></li>
<li><code>model.load_weights(filepath, by_name=False)</code><span><span>загружает вес модели из файла HDF5 (созданного<span> </span></span></span><code>save_weights</code><span><span>).<span> </span></span><span>По умолчанию ожидается, что архитектура не изменится.</span></span></li>
</ul>
<h4><strong>Методы API последовательной модели (Sequential model API)</strong></h4>
<h5 id="compile"><strong>Компиляция &#8212; Compile</strong></h5>
<pre class="EnlighterJSRAW" data-enlighter-language="python">compile(
        optimizer, 
        loss=None, 
        metrics=None, 
        loss_weights=None, 
        sample_weight_mode=None, 
        weighted_metrics=None, 
        target_tensors=None
)</pre>
<p><span>Настраивает модель для обучения.</span></p>
<p><strong><span>Аргументы:</span></strong></p>
<ul>
<li><strong>optimizer</strong>: строка (имя оптимизатора) или экземпляр оптимизатора.</li>
<li><strong>loss (потеря)</strong>: <span>строка (имя целевой функции) или целевая функция или </span><code>Loss</code><span>экземпляр. Смотрите </span><a href="https://keras.io/losses"><span>потери</span></a><span>. Если модель имеет несколько выходов, вы можете использовать разные потери на каждом выходе, передав словарь или список потерь. Значение потерь, которое будет минимизировано моделью, будет тогда суммой всех индивидуальных потерь</span>.</li>
<li><strong>metrics</strong>: <span>список метрик, которые будут оцениваться моделью во время обучения и тестирования. Как правило, вы будете использовать </span><code>metrics=['accuracy']</code><span>. Чтобы указать разные метрики для разных выходов модели с несколькими выходами, вы также можете передать словарь, например </span><code>metrics={'output_a': 'accuracy', 'output_b': ['accuracy', 'mse']}</code><span>. Вы также можете передать список (len = len (выводы)) списков метрик, таких как </span><code>metrics=[['accuracy'], ['accuracy', 'mse']]</code><span>или </span><code>metrics=['accuracy', ['accuracy', 'mse']]</code>.</li>
<li><strong>loss_weights</strong>: <span>необязательный список или словарь, задающий скалярные коэффициенты (числа Python) для взвешивания вкладов потерь в различные выходные данные модели. Значение потерь, которое будет минимизировано моделью, будет затем </span><em><span>взвешенной суммой</span></em><span> всех индивидуальных потерь, взвешенных по </span><code>loss_weights</code><span>коэффициентам. Если список, ожидается, что он будет иметь соотношение 1: 1 к выходам модели. Если это диктат, ожидается, что выходные имена (строки) будут сопоставлены скалярным коэффициентам.</span></li>
<li><strong>sample_weight_mode</strong>: <span>Если вам нужно сделать взвешивание выборки по временным шагам (2D веса), установите это значение </span><code>"temporal"</code><span>. </span><code>None</code><span>по умолчанию используются веса выборки (1D). Если модель имеет несколько выходов, вы можете использовать разные </span><code>sample_weight_mode</code><span>на каждом выходе, передав словарь или список режимов.</span></li>
<li><strong>weighted_metrics</strong>: <span>список метрик, которые будут оцениваться и взвешиваться по sample_weight или class_weight во время обучения и тестирования.</span></li>
<li><strong>target_tensors</strong>: <span>по умолчанию <strong>Keras</strong> создаст заполнители для цели модели, которые будут <strong>снабжены</strong> целевыми данными во время обучения. Если вместо этого вы хотите использовать свои собственные целевые тензоры (в свою очередь, Keras не будет ожидать внешних данных Numpy для этих целей во время обучения), вы можете указать их с помощью </span><code>target_tensors</code><span>аргумента. Это может быть один тензор (для модели с одним выходом), список тензоров или точные сопоставления выходных имен с целевыми тензорами.</span></li>
<li><strong>**kwargs</strong>: <span>при использовании бэкэндов Theano / CNTK эти аргументы передаются в </span><code>K.function</code><span>. При использовании бэкэнда TensorFlow эти аргументы передаются в </span><code>tf.Session.run</code><span>.</span></li>
</ul>
<h5><strong>fit</strong></h5>
<p><span>Обучает модель для фиксированного числа эпох (итераций в наборе данных).</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">fit(
        x=None, 
        y=None, 
        batch_size=None, 
        epochs=1, 
        verbose=1, 
        callbacks=None, 
        validation_split=0.0, 
        validation_data=None, 
        shuffle=True, 
        class_weight=None, 
        sample_weight=None, 
        initial_epoch=0, 
        steps_per_epoch=None, 
        validation_steps=None, 
        validation_freq=1, 
        max_queue_size=10, 
        workers=1, 
        use_multiprocessing=False
)</pre>
<p><strong>Аргументы:</strong></p>
<ul>
<li><strong>x</strong>: <span>входные данные. Это может быть</span>:
<ul>
<li><span><span>Массив Numpy (или похожий на массив) или список массивов (в случае, если модель имеет несколько входов).</span></span></li>
<li><span><span>Диктовое отображение (dict mapping) входных имен в соответствующий массив / тензоры, если модель имеет именованные входы.</span></span></li>
<li><span><span>Генератор или<span> </span></span></span><code>keras.utils.Sequence</code><span><span>возвращение<span> </span></span></span><code>(inputs, targets)</code><span><span>или<span> </span></span></span><code>(inputs, targets, sample weights)</code><span><span>.</span></span></li>
<li><span><span>None (default) &#8212; Нет (по умолчанию) при подаче из тензоров, встроенных в каркас (например, тензоры данных TensorFlow)</span></span>.</li>
</ul>
</li>
<li><strong>y</strong>: <span>целевые данные. Как и входные данные </span><code>x</code><span>, это могут быть либо массив (ы) Numpy, тензор (ы), встроенные в платформу, список массивов Numpy (если модель имеет несколько выходных данных), либо None (по умолчанию), если они поступают из тензоров, встроенных в платформу (например, TensorFlow) тензоры данных). Если выходным слоям в модели присвоены имена, вы также можете передать словарь, отображающий выходные имена в массивы Numpy. If </span><code>x</code><span>является генератором или  </span><code>keras.utils.Sequence </code><span>экземпляром, </span><code>y</code> <span>указывать не следует (поскольку цели будут получены из </span><code>x</code><span>).</span></li>
<li><strong>batch_size</strong>: <span>целое число или </span><code>None</code><span>. Количество образцов на обновление градиента. Если </span><code>batch_size</code><span>не указан, по умолчанию будет 32. Не указывайте, </span><code>batch_size</code><span>если ваши данные представлены в виде символических тензоров, генераторов или </span><code>Sequence</code><span>экземпляров (так как они генерируют пакеты).</span></li>
<li><strong>epochs</strong>: <span>целочисленные. Количество эпох для обучения модели. Эпоха &#8212; это итерация по всему </span><code>x</code><span>и </span><code>y</code><span> предоставленным данным. Обратите внимание, что в сочетании с </span><code>initial_epoch</code><span>, </span><code>epochs</code><span>следует понимать как «конечную эпоху». Модель не обучается для ряда итераций, заданных </span><code>epochs</code><span>, а просто до тех пор, пока не </span><code>epochs</code><span>будет достигнута эпоха индекса .</span></li>
<li><strong>verbose</strong>: <span>Integer. </span><span>0, 1 или 2. Режим многословия. </span><span>0 = тихий, 1 = индикатор выполнения, 2 = одна строка за эпоху.</span></li>
<li><strong>callbacks</strong>: <span>список </span><code>keras.callbacks.Callback</code><span>экземпляров. Список обратных вызовов, применяемых во время обучения и проверки (если). Смотрите </span><a href="https://keras.io/callbacks"><span>обратные вызовы</span></a><span>.</span></li>
<li><strong>validation_split</strong>: <span>с плавающей точкой от 0 до 1. Доля данных обучения, которые будут использоваться в качестве данных проверки. Модель выделит эту часть обучающих данных, не будет обучаться им и будет оценивать потери и любые метрики модели на этих данных в конце каждой эпохи. Данные проверки выбираются из последних выборок </span><code>x</code><span>и </span><code>y</code><span>предоставленных данных перед перетасовкой. Этот аргумент не поддерживается, когда он </span><code>x</code><span>является генератором или </span><code>Sequence</code><span>экземпляром.</span></li>
<li><strong>validation_data</strong>:
<p><span>данные для оценки потерь и любые метрики модели в конце каждой эпохи. Модель не будет обучаться на этих данных. </span><code>validation_data</code><span>перекроет </span><code>validation_split</code><span>. </span><code>validation_data</code><span>может быть: &#8212; кортеж </span><code>(x_val, y_val)</code><span>массивов или тензоров </span><code>(x_val, y_val, val_sample_weights)</code><span>Numpy &#8212; кортеж массивов Numpy &#8212; набор данных или итератор набора данных</span></p>
<p><span>Для первых двух случаев, </span><code>batch_size</code><span>должны быть предоставлены. Для последнего случая, </span><code>validation_steps</code><span>должны быть предоставлены.</span></p>
</li>
<li>
<p><strong>shuffle</strong>: <span>Boolean (следует ли перемешивать данные тренировки перед каждой эпохой) или str (для «партии»). «пакетная» &#8212; это специальная опция для работы с ограничениями данных HDF5; он тасуется кусками размером с партию. Не имеет эффекта, когда </span><code>steps_per_epoch</code><span>нет </span><code>None</code><span>.</span></p>
</li>
<li>
<p><span></span><strong>class_weight</strong>: <span>необязательный словарь, отображающий индексы класса (целые числа) на значение веса (с плавающей запятой), используемое для взвешивания функции потерь (только во время обучения). </span><span>Это может быть полезно для того, чтобы сказать модели «уделять больше внимания» выборкам из недопредставленного класса.</span></p>
</li>
<li><strong>sample_weight</strong>: <span>необязательный массив весов Numpy для обучающих выборок, используемый для взвешивания функции потерь (только во время обучения). Вы можете либо передать плоский (1D) массив Numpy такой же длины, что и входные выборки (отображение весов и выборок 1: 1), либо в случае временных данных вы можете передать двумерный массив с формой </span><code>(samples, sequence_length)</code><span>, чтобы применить разный вес для каждого временного шага каждого образца. В этом случае вы должны обязательно указать </span><code>sample_weight_mode="temporal"</code><span>в </span><code>compile()</code><span>. Этот аргумент не поддерживается, когда </span><code>x</code><span>генератор или </span><code>Sequence</code><span>экземпляр вместо этого предоставляют sample_weights в качестве третьего элемента </span><code>x</code><span>.</span></li>
<li><strong>initial_epoch</strong>: <span>целое число. </span><span>Эпоха, с которой начинается тренировка (полезно для возобновления предыдущего тренировочного заезда).</span></li>
<li><strong>steps_per_epoch</strong>: <span>целое число или </span><code>None</code><span>. Общее количество шагов (партий образцов) до объявления одной эпохи законченной и начала следующей эпохи. При обучении с использованием входных тензоров, таких как тензоры данных TensorFlow, значение по умолчанию </span><code>None</code><span>равно числу выборок в вашем наборе данных, деленному на размер пакета, или 1, если это невозможно определить.</span></li>
<li><strong>validation_steps</strong>: <span>только релевантно, если  </span><code>steps_per_epoch</code><span>  указано. Общее количество шагов (партий образцов) для проверки перед остановкой.</span></li>
<li><strong>validation_steps</strong>: <span>релевантно, только если </span><code>validation_data</code><span>предоставлено и является генератором. Общее количество шагов (партий образцов), которые нужно нарисовать перед остановкой при выполнении проверки в конце каждой эпохи.</span></li>
<li><strong>validation_freq</strong>: <span>уместно, только если предоставлены данные проверки. Целое число или список / кортеж / набор. Если целое число, указывает, сколько тренировочных эпох должно быть выполнено до того, как будет выполнен новый прогон проверки, например, </span><code>validation_freq=2</code><span>выполняет проверку каждые 2 эпохи. Если в списке, кортеже или наборе указываются эпохи, в которых нужно выполнять проверку, например, </span><code>validation_freq=[1, 2, 10]</code><span>выполняет проверку в конце 1-й, 2-й и 10-й эпох.</span></li>
<li><strong>max_queue_size</strong>: <span>целое число. Используется только для генератора или </span><code>keras.utils.Sequence</code><span> входа. Максимальный размер очереди генератора. Если не указано, по </span><code>max_queue_size</code><span>умолчанию будет 10.</span></li>
<li><strong>workers</strong>: <span>целое число. Используется только для генератора или </span><code>keras.utils.Sequence</code><span>входа. Максимальное количество процессов, которые могут ускоряться при использовании потоков на основе процессов. Если не указан, по </span><code>workers</code><span> умолчанию будет 1. Если 0, будет запускать генератор в основном потоке.</span></li>
<li><strong>use_multiprocessing</strong>: <span>Boolean. Используется только для генератора или </span><code>keras.utils.Sequence</code><span>входа. Если </span><code>True</code><span>, используйте процессные потоки. Если не указано, по </span><code>use_multiprocessing</code><span>умолчанию </span><code>False</code><span>. Обратите внимание, что, поскольку эта реализация опирается на многопроцессорность, вы не должны передавать невыгружаемые аргументы генератору, так как они не могут быть легко переданы дочерним процессам.</span></li>
<li><strong>**kwargs</strong>: <span>используется для обратной совместимости.</span></li>
</ul>
<h2><strong>Краткий обзор учебника/статьи по Keras</strong></h2>
<p><strong>Вот перечень шагов для создания вашей первой сверточной нейройнной сети (CNN) с использованием Keras:</strong></p>
<ol>
<li>Настройте свою среду.</li>
<li>Установите Керас / Keras.</li>
<li>Импорт библиотек и модулей.</li>
<li>Загрузить данные изображения из MNIST.</li>
<li>Предварительная обработка входных данных для Keras.</li>
<li>Метки препроцесс-класса для Keras.</li>
<li>Определите архитектуру модели.</li>
<li>Скомпилируйте модель.</li>
<li>Подгонка модели по тренировочным данным.</li>
<li>Оценить модель по данным испытаний.</li>
</ol>
<h3><strong>Шаг 1: Настройте свою рабочую среду</strong></h3>
<p><span>убедитесь, что на вашем компьютере установлено следующее:</span></p>
<ul>
<li><span><strong>Python</strong> 2.7+ (Python 3 тоже хорошо, но Python 2.7 все еще более популярен для науки о данных в целом)</span></li>
<li><span><strong>SciPy</strong> <strong>с NumPy</strong></span></li>
<li><span><strong>Matplotlib</strong> (необязательно, рекомендуется для исследовательского анализа)</span></li>
<li><span><strong>Theano</strong> * ( </span><strong><a href="http://deeplearning.net/software/theano/install.html#install" target="_blank" rel="noopener noreferrer">Инструкция по установке</a></strong><span> )</span></li>
</ul>
<blockquote>
<p><strong>Theano</strong> &#8212; это библиотека <strong>Python</strong>, которая позволяет нам так эффективно оценивать математические операции, включая многомерные массивы. В основном он используется при создании проектов глубокого обучения. <strong>Он работает намного быстрее на графическом процессоре (GPU), чем на CPU.</strong> Theano достигает высоких скоростей, что создает жесткую конкуренцию реализациям на языке C для задач, связанных с большими объемами данных.<br /><strong>Theano </strong>знает, как брать структуры и преобразовывать их в очень эффективный код, который использует numpy и некоторые нативные библиотеки. Он в основном предназначен для обработки типов вычислений, требуемых для алгоритмов больших нейронных сетей, используемых в Deep Learning. Именно поэтому, это очень популярная библиотека в области глубокого обучения.</p>
</blockquote>
<p><em>Рекомендуется установить <strong>Python</strong>, <strong>NumPy</strong>, <strong>SciPy</strong> и <strong>matplotlib</strong> через дистрибутив <a href="https://www.anaconda.com/" target="_blank" rel="noopener noreferrer"><strong>Anaconda</strong></a>. Он поставляется со всеми этими пакетами.</em></p>
<p><strong><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/conda_cheatsheet_command_line_package_and_environment_manager.pdf">Conda Cheatsheet: command line package and environment manager.pdf</a></strong></p>
<hr />
<p><strong>Краткий обзор как настроить Анаконду здесь:</strong></p>
<p><blockquote class="wp-embedded-content" data-secret="1Ax30pKqzT"><a href="https://python.ivan-shamaev.ru/guide-conda-environments-anaconda-python-data-science-platform/">Инструкция по Anaconda &#038; Conda. Как управлять и настроить среду для Python?</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted"  title="«Инструкция по Anaconda &#038; Conda. Как управлять и настроить среду для Python?» &#8212; Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект" src="https://python.ivan-shamaev.ru/guide-conda-environments-anaconda-python-data-science-platform/embed/#?secret=1Ax30pKqzT" data-secret="1Ax30pKqzT" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></p>
<hr />
<p><em><span><strong>* Примечание:</strong> <strong>TensorFlow</strong> также поддерживается (как альтернатива <strong>Theano</strong>), но мы придерживаемся Theano для простоты. Основное отличие состоит в том, что вам необходимо изменить данные немного по-другому, прежде чем передавать их в свою сеть.</span></em></p>
<p><span style="color: #008000;"><strong>Еще раз пробежимся по устанавливаемым библиотекам:</strong></span></p>
<blockquote>
<p><strong>SciPy (произносится как сай пай)</strong> — это пакет прикладных математических процедур, основанный на расширении <strong>Numpy</strong> Python. С SciPy интерактивный сеанс Python превращается в такую же полноценную среду обработки данных и прототипирования сложных систем, как MATLAB, IDL, Octave, R-Lab и SciLab.<br /><strong></strong></p>
<p><strong>Matplotlib</strong> — библиотека на языке программирования Python для визуализации данных.<br /><strong></strong></p>
<p><strong>Theano</strong> — библиотека, которая используется для разработки систем машинного обучения как сама по себе, так и в качестве вычислительного бекэнда для более высокоуровневых библиотек, например, Lasagne, Keras или Blocks.<br /><strong></strong></p>
<p><strong>NumPy</strong> &#8212; это библиотека языка Python, добавляющая поддержку больших многомерных массивов и матриц, вместе с большой библиотекой высокоуровневых (и очень быстрых) математических функций для операций с этими массивами.</p>
</blockquote>
<h4><strong>Проверим правильно ли мы все установили</strong></h4>
<p>Переходим в <strong>Jupyter Notebook</strong> в среде, которая имеет установленные библиотеки/пакеты. Запускаем следующие команды:</p>
<p><strong>1. Для проверки среды:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import sys
print(sys.version)
print(sys.base_prefix)</pre>
<p>Результата:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">3.7.5 (default, Oct 31 2019, 15:18:51) [MSC v.1916 64 bit (AMD64)]
C:\Users\User\.conda\envs\MyNewEnvironmentName</pre>
<p><strong>2. Для проверки библиотек:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import numpy as np
import theano as th
import keras as kr
import matplotlib as mpl

print('numpy:' + np.__version__)
print('theano:' + th.__version__)
print('keras:' + kr.__version__)
print('matplotlib:' + mpl.__version__)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">numpy:1.17.4
theano:1.0.4
keras:2.2.4
matplotlib:3.1.1</pre>
<p><strong>Как это выглядит в Jupyter Notebook:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/keras_tutorial_check_libs_and_env_conda.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/keras_tutorial_check_libs_and_env_conda.png" alt="Keras Tutorial: Руководство для начинающих по глубокому обучению на Python" width="597" height="375" class="aligncenter size-full wp-image-566" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/keras_tutorial_check_libs_and_env_conda.png 597w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/keras_tutorial_check_libs_and_env_conda-300x188.png 300w" sizes="(max-width: 597px) 100vw, 597px" /></a></p>
<h3><strong>Шаг 2. Импортируем библиотеки и модули для нашего проекта</strong></h3>
<p><span style="color: #ff6600;"><strong>Удаляем предыдущие проверочные шаги из Notebook.</strong></span></p>
<p>Теперь начнем с импорта <strong>numpy</strong> и установки начального числа для генератора псевдослучайных чисел на компьютере. Это позволяет нам воспроизводить результаты из нашего скрипта:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import numpy as np
np.random.seed(123)  # for reproducibility</pre>
<p><span>Далее мы импортируем тип модели <strong>Sequential</strong> из <strong>Keras</strong>. </span><span>Это просто <strong>линейный набор слоев нейронной сети</strong>, и он идеально подходит для того типа <strong>CNN с прямой связью</strong>, который мы строим в этом руководстве.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">from keras.models import Sequential</pre>
<p><span>Далее, давайте <strong>импортируем «основные» слои из Keras</strong>. </span><span>Это слои, которые используются практически в любой нейронной сети:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">from keras.layers import Dense, Dropout, Activation, Flatten</pre>
<p><span>Затем мы <strong>импортируем слои CNN из Keras.</strong> </span><span>Это сверточные слои, которые помогут нам эффективно тренироваться на данных изображения:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">from keras.layers import Convolution2D, MaxPooling2D</pre>
<p><span>Наконец, мы <strong>импортируем некоторые утилиты</strong>. </span><span>Это поможет нам преобразовать наши данные позже:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">from keras.utils import np_utils</pre>
<p><span>Теперь у нас есть все необходимое для построения <strong>архитектуры нейронной сети.</strong></span></p>
<h4>Полный текст скрипта после шага 2:</h4>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import numpy as np
np.random.seed(123)  # for reproducibility

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.utils import np_utils</pre>
<h3><strong>Шаг 3. Загружаем изображения из MNIST</strong></h3>
<p><span><strong>MNIST</strong> &#8212; отличный набор данных для начала глубокого обучения и компьютерного зрения. </span><span>Это достаточно сложная задача, чтобы гарантировать нейронные сети, но она управляема на одном компьютере.</span></p>
<p><span>Библиотека Keras удобно уже включает это. </span><span>Мы можем загрузить это так:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">from keras.datasets import mnist
 
# Load pre-shuffled MNIST data into train and test sets
(X_train, y_train), (X_test, y_test) = mnist.load_data()</pre>
<p><span>Мы можем посмотреть на <strong>форму набора данных</strong>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">print(X_train.shape)</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">(60000, 28, 28)</pre>
<p><span>Отлично, получается, что в нашем обучающем наборе 60 000 сэмплов, и размер каждого изображения составляет 28 х 28 пикселей. </span><span>Мы можем подтвердить это, построив первый пример в matplotlib:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">from matplotlib import pyplot as plt
plt.imshow(X_train[0])</pre>
<p><strong>Вывод изображения:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/keras_tutorial_matplotlib_image_plt_imshow_xtrain_0.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/keras_tutorial_matplotlib_image_plt_imshow_xtrain_0.png" alt="" width="486" height="342" class="aligncenter size-full wp-image-572" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/keras_tutorial_matplotlib_image_plt_imshow_xtrain_0.png 486w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/keras_tutorial_matplotlib_image_plt_imshow_xtrain_0-300x211.png 300w" sizes="(max-width: 486px) 100vw, 486px" /></a></p>
<p><span>В целом, при работе с компьютерным зрением полезно визуально отобразить данные, прежде чем выполнять какую-либо работу алгоритма. </span><span>Это быстрая проверка работоспособности, которая может предотвратить легко предотвратимые ошибки (например, неверную интерпретацию измерений данных).</span></p>
<h4><strong>Полный скрипт после шага 3</strong></h4>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import numpy as np
np.random.seed(123)  # for reproducibility

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.utils import np_utils
from keras.datasets import mnist

from matplotlib import pyplot as plt
 
# Загрузка предварительно перемешанных данных MNIST в наборы trains и tests
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# Форма набора данных
print(X_train.shape)

# Вывод изображения
plt.imshow(X_train[0])</pre>
<h3><strong>Шаг 4: Предварительная обработка входных данных для Keras</strong></h3>
<p><span>При использовании бэкэнда Theano вы должны явно объявить размер для </span>глубины<span> входного изображения. Например, полноцветное изображение со всеми 3  </span><strong><span>каналами RGB</span></strong><span> будет иметь глубину 3.</span></p>
<p><span>Наши изображения <strong>MNIST</strong> имеют глубину только 1, но мы должны явно объявить это.</span></p>
<p><span>Другими словами, мы хотим преобразовать наш набор данных из формы<strong> (n, ширина, высота)</strong> в <strong>(n, глубина, ширина, высота)</strong>.</span></p>
<p><span>Вот как мы можем сделать это легко:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">X_train = X_train.reshape(X_train.shape[0], 1, 28, 28)
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28)</pre>
<p><span>Чтобы подтвердить, мы можем снова напечатать размеры <strong>X_train</strong>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">print(X_train.shape)</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">(60000, 1, 28, 28)</pre>
<p><span>Последний шаг <strong>предварительной обработки для входных данных</strong> &#8212; преобразовать наш тип данных в </span><strong><span>float32</span></strong><span> и <strong>нормализовать</strong> наши значения данных в диапазоне [0, 1].</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255</pre>
<p><span>Теперь наши входные данные готовы к обучению модели.</span></p>
<h4><strong>Полный текст скрипта после 4 шага</strong></h4>
<pre class="EnlighterJSRAW" data-enlighter-language="null">import numpy as np
np.random.seed(123)  # для воспроизводимости

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.utils import np_utils
from keras.datasets import mnist

from matplotlib import pyplot as plt
 
# Загрузка предварительно перемешанных данных MNIST в наборы trains и tests
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# Форма набора данных
print("=== Результат X_train.shape ===")
print(X_train.shape)

# Вывод изображения
plt.imshow(X_train[0])

# Преобразование набора данных из формы (n, ширина, высота) в (n, глубина, ширина, высота)
X_train = X_train.reshape(X_train.shape[0], 1, 28, 28)
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28)

# Вывод размеров X_train
print("=== Результат X_train.shape ===")
print(X_train.shape)

# Преобразование типа данных в float32
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')

# Нормализация значений данных в диапазоне [0, 1]
X_train /= 255
X_test /= 255</pre>
<h3><strong>Шаг 5. Предварительная обработка меток классов для Keras</strong></h3>
<p><span>Далее, давайте посмотрим на форму наших данных меток классов:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">print(y_train.shape)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">(60000,)</pre>
<p><span>Хм &#8230; это может быть проблематично. </span><span>У нас должно быть 10 разных классов, по одному на каждую цифру, но, похоже, у нас есть только одномерный массив. </span><span>Давайте посмотрим на ярлыки для первых 10 учебных образцов:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">print(y_train[:10])</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">[5 0 4 1 9 2 1 3 1 4]</pre>
<p><span>И есть проблема. Данные y_train и y_test не разделены на 10 различных меток классов, а представлены в виде одного массива со значениями классов.</span></p>
<p><span>Мы можем это легко исправить:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Convert 1-dimensional class arrays to 10-dimensional class matrices
Y_train = np_utils.to_categorical(y_train, 10)
Y_test = np_utils.to_categorical(y_test, 10)</pre>
<blockquote>
<p><strong>Метод np_utils.to_categorical</strong> &#8212; Преобразует вектор класса (целые числа) в двоичную матрицу классов.</p>
</blockquote>
<p><span>Теперь мы можем взглянуть еще раз:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">print(Y_train.shape)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">(60000, 10)</pre>
<h4><strong>Полный текст скрипта после 5 шага</strong></h4>
<pre class="EnlighterJSRAW" data-enlighter-language="null">import numpy as np
np.random.seed(123)  # для воспроизводимости

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.utils import np_utils
from keras.datasets import mnist

from matplotlib import pyplot as plt
 
# Загрузка предварительно перемешанных данных MNIST в наборы trains и tests
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# Форма набора данных
print("=== Результат X_train.shape ===")
print(X_train.shape)

# Вывод изображения
plt.imshow(X_train[0])

# Преобразование набора данных из формы (n, ширина, высота) в (n, глубина, ширина, высота)
X_train = X_train.reshape(X_train.shape[0], 1, 28, 28)
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28)

# Вывод размеров X_train
print("=== Результат X_train.shape ===")
print(X_train.shape)

# Преобразование типа данных в float32
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')

# Нормализация значений данных в диапазоне [0, 1]
X_train /= 255
X_test /= 255

# Просмотр формы меток классов наших данных
print("=== Результат y_train.shape ===")
print(y_train.shape)

print("=== Результат y_train[:10] ===")
print(y_train[:10])

# Преобразование одномерных массивов классов в 10-мерные матрицы классов
Y_train = np_utils.to_categorical(y_train, 10)
Y_test = np_utils.to_categorical(y_test, 10)

# Вывод после преобразования
print("=== Результат Y_train.shape после np_utils.to_categorical ===")
print(Y_train.shape)</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">=== Результат X_train.shape ===
(60000, 28, 28)

=== Результат X_train.shape ===
(60000, 1, 28, 28)

=== Результат y_train.shape ===
(60000,)

=== Результат y_train[:10] ===
[5 0 4 1 9 2 1 3 1 4]

=== Результат Y_train.shape после np_utils.to_categorical ===
(60000, 10)</pre>
<h3><strong>Шаг 6: Зададим архитектуру модели нейронной сети</strong></h3>
<p>Теперь мы готовы определить архитектуру нашей модели. В реальной научно-исследовательской работе исследователи потратят значительное количество времени на изучение архитектуру моделей.</p>
<p>Чтобы продолжать этот урок, мы не будем обсуждать здесь теорию или математику.</p>
<p>Когда вы только начинаете, вы можете просто воспроизвести проверенную архитектуру из академических работ или использовать существующие примеры. Вот список примеров реализации в Keras.</p>
<p>Начнем с объявления последовательного формата модели:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">model = Sequential()</pre>
<p><span>Далее мы объявляем входной слой:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">model.add(Conv2D(32,(3, 3), activation = 'relu', input_shape=(1,28,28), data_format='channels_first'))</pre>
<p>Входной параметр shape должен иметь форму 1 образца. В этом случае это то же самое (1, 28, 28), которое соответствует (глубина, ширина, высота) каждого изображения цифры.</p>
<p>Но что представляют собой первые 3 параметра? Они соответствуют количеству используемых фильтров свертки, количеству строк в каждом ядре свертки и количеству столбцов в каждом ядре свертки соответственно.</p>
<p>* Примечание. Размер шага по умолчанию равен (1,1), и его можно настроить с помощью параметра «subsample».</p>
<p>Мы можем подтвердить это, напечатав форму текущей модели:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">print(model.output_shape)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">(None, 32, 26, 26)</pre>
<p><span>Затем мы можем просто добавить больше слоев в нашу модель, как будто мы строим legos:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))</pre>
<p><span>Опять же, мы не будем слишком углубляться в теорию, но важно выделить  слой </span><strong><span>Dropout, который</span></strong><span> мы только что добавили. Это метод регуляризации нашей модели с целью предотвращения переоснащения. Вы можете прочитать больше об этом </span><a href="https://www.quora.com/How-does-the-dropout-method-work-in-deep-learning" target="_blank" rel="noopener noreferrer"><span>здесь</span></a><span> .</span></p>
<p><span>MaxPooling2D &#8212; это способ уменьшить количество параметров в нашей модели, переместив фильтр пула 2&#215;2 по предыдущему слою и взяв максимум 4 значения в фильтре 2&#215;2.</span></p>
<p><span>Пока что для параметров модели мы добавили два слоя свертки. Чтобы завершить архитектуру нашей модели, давайте добавим полностью связанный слой, а затем выходной слой:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))</pre>
<p><span>Для плотных слоев первым параметром является выходной размер слоя. Keras автоматически обрабатывает связи между слоями.</span></p>
<p><span>Обратите внимание, что конечный слой имеет выходной размер 10, соответствующий 10 классам цифр.</span></p>
<p><span>Также обратите внимание, что веса из слоев Convolution должны быть сплющены (сделаны одномерными) перед передачей их в полностью связанный плотный слой.</span></p>
<p><span>Вот как выглядит вся архитектура модели:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">model = Sequential()

model.add(Conv2D(32,(3, 3), activation = 'relu', input_shape=(1,28,28), data_format='channels_first'))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))</pre>
<p><span>Теперь все, что нам нужно сделать, это определить функцию потерь и оптимизатор, и тогда мы будем готовы обучить ее.</span></p>
<h3><strong>Шаг 7. Скомпилируем модель</strong></h3>
<p><span>Сложная часть уже закончилась.</span></p>
<p><span>Теперь нам просто нужно скомпилировать модель, и мы будем готовы обучать ее. </span><span>Когда мы компилируем модель, мы объявляем функцию потерь и оптимизатор (SGD, Adam и т.д.).</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])</pre>
<p>Keras имеет множество функций потери и встроенных оптимизаторов на выбор.</p>
<h3><strong>Шаг 8. Обучим модель на тестовых данных (тренировочных данных)</strong></h3>
<p><span>Чтобы соответствовать модели, все, что нам нужно сделать, это объявить размер партии и количество эпох для обучения, а затем передать наши данные обучения.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">model.fit(X_train, Y_train, 
          batch_size=32, epochs=10, verbose=1)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Epoch 1/10
60000/60000 [==============================] - 38100s 635ms/step - loss: 0.2253 - acc: 0.9337
Epoch 2/10
60000/60000 [==============================] - 728s 12ms/step - loss: 0.1195 - acc: 0.9650
Epoch 3/10
60000/60000 [==============================] - 964s 16ms/step - loss: 0.0927 - acc: 0.9724
Epoch 4/10
60000/60000 [==============================] - 1169s 19ms/step - loss: 0.0778 - acc: 0.9768
Epoch 5/10
60000/60000 [==============================] - 1223s 20ms/step - loss: 0.0709 - acc: 0.9794
Epoch 6/10
60000/60000 [==============================] - 730s 12ms/step - loss: 0.0640 - acc: 0.9809
Epoch 7/10
60000/60000 [==============================] - 749s 12ms/step - loss: 0.0578 - acc: 0.9828
Epoch 8/10
60000/60000 [==============================] - 730s 12ms/step - loss: 0.0554 - acc: 0.9825
Epoch 9/10
60000/60000 [==============================] - 728s 12ms/step - loss: 0.0528 - acc: 0.9848
Epoch 10/10
60000/60000 [==============================] - 719s 12ms/step - loss: 0.0495 - acc: 0.9852</pre>
<p><span>Вы также можете использовать различные </span><a href="https://keras.io/callbacks/" target="_blank" rel="noopener noreferrer"><span>обратные вызовы</span></a><span>  для установки правил ранней остановки, сохранения весов моделей по ходу дела или регистрации истории каждой эпохи обучения.</span></p>
<h3><strong>Шаг 9: Оценка работы модели на тестовых данных</strong></h3>
<p><span>Наконец, мы можем оценить нашу модель по тестовым данным:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">score = model.evaluate(X_test, Y_test, verbose=0)
score</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">[2.3163251502990723, 0.0986]</pre>


<p></p>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fkeras-tutorial-beginner-guide-to-deep-learning-in-python%2F&amp;linkname=Keras%20Tutorial%3A%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%BC%D1%83%20%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%BD%D0%B0%20Python" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fkeras-tutorial-beginner-guide-to-deep-learning-in-python%2F&amp;linkname=Keras%20Tutorial%3A%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%BC%D1%83%20%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%BD%D0%B0%20Python" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fkeras-tutorial-beginner-guide-to-deep-learning-in-python%2F&amp;linkname=Keras%20Tutorial%3A%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%BC%D1%83%20%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%BD%D0%B0%20Python" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fkeras-tutorial-beginner-guide-to-deep-learning-in-python%2F&amp;linkname=Keras%20Tutorial%3A%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%BC%D1%83%20%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%BD%D0%B0%20Python" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fkeras-tutorial-beginner-guide-to-deep-learning-in-python%2F&amp;linkname=Keras%20Tutorial%3A%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%BC%D1%83%20%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%BD%D0%B0%20Python" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fkeras-tutorial-beginner-guide-to-deep-learning-in-python%2F&amp;linkname=Keras%20Tutorial%3A%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%BC%D1%83%20%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%BD%D0%B0%20Python" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fkeras-tutorial-beginner-guide-to-deep-learning-in-python%2F&amp;linkname=Keras%20Tutorial%3A%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%BC%D1%83%20%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%BD%D0%B0%20Python" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fkeras-tutorial-beginner-guide-to-deep-learning-in-python%2F&#038;title=Keras%20Tutorial%3A%20%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE%20%D0%B4%D0%BB%D1%8F%20%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85%20%D0%BF%D0%BE%20%D0%B3%D0%BB%D1%83%D0%B1%D0%BE%D0%BA%D0%BE%D0%BC%D1%83%20%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%BD%D0%B0%20Python" data-a2a-url="https://python.ivan-shamaev.ru/keras-tutorial-beginner-guide-to-deep-learning-in-python/" data-a2a-title="Keras Tutorial: Руководство для начинающих по глубокому обучению на Python"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/keras-tutorial-beginner-guide-to-deep-learning-in-python/">Keras Tutorial: Руководство для начинающих по глубокому обучению на Python</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/keras-tutorial-beginner-guide-to-deep-learning-in-python/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Классы, методы Python 3. Примеры ООП (объектно ориентированное программирование)</title>
		<link>https://python.ivan-shamaev.ru/classes-python-3-methods-oop-examples/</link>
					<comments>https://python.ivan-shamaev.ru/classes-python-3-methods-oop-examples/#comments</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Mon, 23 Sep 2019 23:25:05 +0000</pubDate>
				<category><![CDATA[Введение в Python 3]]></category>
		<category><![CDATA[python 3]]></category>
		<category><![CDATA[Классы Python]]></category>
		<category><![CDATA[Методы Python]]></category>
		<category><![CDATA[объектно ориентированное программирование]]></category>
		<category><![CDATA[ООП]]></category>
		<category><![CDATA[Примеры python]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=182</guid>

					<description><![CDATA[<p>Объектно-ориентированный Python Python был объектно-ориентированным языком с момента его появления. Из-за этого создавать и использовать классы и объекты совершенно просто. Эта глава поможет вам стать экспертом в использовании объектно-ориентированного программирования в Python. Эта статья является кратким введением в объектно-ориентированное программирование (ООП) на Python, которое поможет вам быстро вникнуть в суть и начать решать прикладные задачи. [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/classes-python-3-methods-oop-examples/">Классы, методы Python 3. Примеры ООП (объектно ориентированное программирование)</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fclasses-python-3-methods-oop-examples%2F&amp;linkname=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B%2C%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20Python%203.%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%9E%D0%9E%D0%9F%20%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%20%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fclasses-python-3-methods-oop-examples%2F&amp;linkname=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B%2C%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20Python%203.%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%9E%D0%9E%D0%9F%20%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%20%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fclasses-python-3-methods-oop-examples%2F&amp;linkname=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B%2C%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20Python%203.%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%9E%D0%9E%D0%9F%20%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%20%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fclasses-python-3-methods-oop-examples%2F&amp;linkname=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B%2C%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20Python%203.%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%9E%D0%9E%D0%9F%20%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%20%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fclasses-python-3-methods-oop-examples%2F&amp;linkname=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B%2C%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20Python%203.%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%9E%D0%9E%D0%9F%20%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%20%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fclasses-python-3-methods-oop-examples%2F&amp;linkname=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B%2C%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20Python%203.%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%9E%D0%9E%D0%9F%20%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%20%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fclasses-python-3-methods-oop-examples%2F&amp;linkname=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B%2C%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20Python%203.%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%9E%D0%9E%D0%9F%20%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%20%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fclasses-python-3-methods-oop-examples%2F&#038;title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B%2C%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20Python%203.%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%9E%D0%9E%D0%9F%20%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%20%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29" data-a2a-url="https://python.ivan-shamaev.ru/classes-python-3-methods-oop-examples/" data-a2a-title="Классы, методы Python 3. Примеры ООП (объектно ориентированное программирование)"></a></p><h1><span>Объектно-ориентированный </span><span>Python</span></h1>
<p><span>Python был объектно-ориентированным языком с момента его появления. Из-за этого создавать и использовать классы и объекты совершенно просто. Эта глава поможет вам стать экспертом в использовании объектно-ориентированного программирования в Python.</span></p>
<p><span>Эта статья является кратким введением в объектно-ориентированное программирование (ООП) на Python, которое поможет вам быстро вникнуть в суть и начать решать прикладные задачи.</span></p>
<h2>Краткий обзор ооп python</h2>
<p>Программа/скрипт/код, написанные с использованием парадигмы объектно-ориентированного программирования, должны состоять из</p>
<ul>
<li>объектов,</li>
<li>классов (описания объектов),</li>
<li>взаимодействий объектов между собой, в результате которых меняются их свойства.</li>
</ul>
<p><strong>Что такое класс в ооп python?</strong></p>
<blockquote><p><span style="color: #ff0000;"><strong>Класс</strong> </span><strong>=</strong> <span style="color: #ff6600;"><strong>данные</strong> </span><strong>+</strong> <span style="color: #008080;"><strong>методы</strong></span></p></blockquote>
<p><span style="color: #ff0000;"><strong>Класс</strong> </span>&#8212; это тип данных, состоящий из набора <strong>атрибутов (свойств)</strong> и <strong>методов</strong> &#8212; функций для работы с этими атрибутами.</p>
<p><strong>Схематично класс можно представить следующим образом:</strong></p>
<p>Для создания классов предусмотрена инструкция class. Тело класса состоит из блока различных инструкций.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">class ИмяКласса:
    ПеременнаяКласса = Значение
    …
    def ИмяМетода(self, ...):
        self.ПеременнаяКласса = Значение
        …
    …</pre>
<p><strong>Методы в классах</strong> — это те же функции, которые принимают один обязательный параметр — <strong>self</strong> (с англ. можно перевести как &#171;собственная личность&#187;). Он нужен для связи с конкретным объектом.</p>
<p><strong>Атрибуты класса</strong> — это имена переменных вне функций и имена функций. Эти атрибуты наследуются всеми объектами, созданными на основе данного класса. Атрибуты обеспечивают свойства и поведение объекта. Объекты могут иметь атрибуты, которые создаются в теле метода, если данный метод будет вызван для конкретного объекта.</p>
<p><strong>Пример класса (ООП) на Python 3:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">class Second:
    color = "red"
    form = "circle"
    def changecolor(self,newcolor):
        self.color = newcolor
    def changeform(self,newform):
        self.form = newform

obj1 = Second()
obj2 = Second()

print (obj1.color, obj1.form) # вывод на экран "red circle"
print (obj2.color, obj2.form) # вывод на экран "red circle"

obj1.changecolor("green") # изменение цвета первого объекта
obj2.changecolor("blue") # изменение цвет второго объекта
obj2.changeform("oval") # изменение формы второго объекта

print (obj1.color, obj1.form) # вывод на экран "green circle"
print (obj2.color, obj2.form) # вывод на экран "blue oval"</pre>
<p><strong>Результат выполнения скрипта Python 3:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">red circle
red circle
green circle
blue oval</pre>
<h2>Конструктор класса &#8212; метод __init__</h2>
<p>Большинство классов имеют специальный метод, который автоматически при создании объекта создает ему атрибуты. Т.е. вызывать данный метод не нужно, т.к. он сам запускается при вызове класса. (Вызов класса происходит, когда создается объект.)</p>
<p><strong>Такой метод называется конструктором класса</strong> и в языке программирования Python носит имя <strong>__init__</strong>. (В начале и конце по два знака подчеркивания.)</p>
<p>Первым параметром, как и у любого другого метода, у __init__ является self, на место которого подставляется объект в момент его создания. Второй и последующие (если есть) параметры заменяются аргументами, переданными в конструктор при вызове класса. Рассмотрим два класса: в одном будет использоваться конструктор, а в другом нет. Требуется создать два атрибута объекта.</p>
<p><strong>Рассмотрим два класса:</strong> в одном будет использоваться конструктор, а в другом нет. Требуется создать два атрибута объекта.</p>
<p><strong>Пример 1:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">class YesInit:
    def __init__(self,one,two):
        self.fname = one
        self.sname = two

obj1 = YesInit("Peter","Ok")
print (obj1.fname, obj1.sname)</pre>
<p><strong>Пример 2:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">class NoInit:
    def names(self,one,two):
        self.fname = one
        self.sname = two

obj2 = NoInit()
obj2.names("Peter","Ok")

print (obj2.fname, obj2.sname)</pre>
<p><strong>Результат выполнения двух скриптов:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Peter Ok</pre>
<h2>Что значит аргумент self в Python 3 в методе класса</h2>
<p><strong>Аргумент self</strong> &#8212; это ссылка на создаваемый в памяти компьютера объект.</p>
<p><strong>Методы класса</strong> — это небольшие программки, предназначенные для работы с объектами. Методы могут создавать новые свойства (данные) объекта, изменять существующие, выполнять другие действия над объектами.</p>
<p>Методу необходимо &#171;знать&#187;, данные какого объекта ему предстоит обрабатывать. Для этого ему в качестве первого (а иногда и единственного) аргумента передается имя переменной, связанной с объектом (можно сказать, передается сам объект). Чтобы в описании класса указать передаваемый в дальнейшем объект, используется параметр self.</p>
<p>С другой стороны, вызов метода для конкретного объекта в основном блоке программы выглядит следующим образом:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">Объект.ИмяМетода(…)</pre>
<p>Здесь под словом Объект имеется в виду переменная, связанная с ним. Это выражение преобразуется в классе, к которому относится объект, в</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">ИмяМетода(Объект, …)</pre>
<p>Т.е. конкретный объект подставляется вместо параметра self</p>
<h1>Объектно-ориентированное программирование Python 3. Классы, объекты, экземпляры, методы</h1>
<h2>Принципы ООП</h2>
<p><strong>Объектно-ориентированный язык работает по следующим принципам:</strong></p>
<ul>
<li>Все данные представляются объектами</li>
<li>Программа является набором взаимодействующих объектов, посылающих друг другу сообщения</li>
<li>Каждый объект имеет собственную часть памяти и может иметь в составе другие объекты</li>
<li>Каждый объект имеет тип</li>
<li>Объекты одного типа могут принимать одни и те же сообщения (и выполнять одни и те же действия)</li>
</ul>
<p><strong>Идеи/принципы объектно-ориентированного программирования:</strong></p>
<ol>
<li><strong>Наследование.</strong> Возможность выделять общие свойства и методы классов в один класс верхнего уровня (родительский). Классы, имеющие общего родителя, различаются между собой за счет включения в них различных дополнительных свойств и методов.</li>
<li><strong>Инкапсуляция.</strong> Свойства и методы класса делятся на доступные из вне (опубликованные) и недоступные (защищенные). Защищенные атрибуты нельзя изменить, находясь вне класса. Опубликованные же атрибуты также называют интерфейсом объекта, т. к. с их помощью с объектом можно взаимодействовать. По идеи, инкапсуляция призвана обеспечить надежность программы, т.к. изменить существенные для существования объекта атрибуты становится невозможно.</li>
<li><strong>Полиморфизм.</strong> Полиморфизм подразумевает замещение атрибутов, описанных ранее в других классах: имя атрибута остается прежним, а реализация уже другой. Полиморфизм позволяет специализировать (адаптировать) классы, оставляя при этом единый интерфейс взаимодействия.</li>
</ol>
<h3>Преимущества ООП</h3>
<p>В связи со своими особенностями объектно-ориентированное программирование имеет ряд преимуществ перед структурным (и др.) программированием. Выделим некоторые из них:</p>
<ol>
<li>Использование одного и того же программного кода с разными данными. Классы позволяют создавать множество объектов, каждый из которых имеет собственные значения атрибутов. Нет потребности вводить множество переменных, т.к объекты получают в свое распоряжение индивидуальные так называемые пространства имен. Пространство имен конкретного объекта формируется на основе класса, от которого он был создан, а также от всех родительских классов данного класса. Объект можно представить как некую упаковку данных.</li>
<li>Наследование и полиморфизм позволяют не писать новый код, а настраивать уже существующий, за счет добавления и переопределения атрибутов. Это ведет к сокращению объема исходного кода.</li>
</ol>
<h3>Особенность ООП</h3>
<p>ООП позволяет сократить время на написание исходного кода, однако ООП всегда предполагает большую роль предварительного анализа предметной области, предварительного проектирования. От правильности решений на этом предварительном этапе зависит куда больше,чем от непосредственного написания исходного кода.</p>
<h3>Особенности ООП в Python</h3>
<p>По сравнению с другими распространенными языками программирования у Python можно выделить следующие особенности, связанные с объектно-ориентированным программированием:</p>
<ol>
<li>Любое данное (значение) — это объект. Число, строка, список, массив и др. — все является объектом. Бываю объекты встроенных классов (как те,что перечисленные в предыдущем предложении), а бывают объекты пользовательских классов (тех, что создает программист). Для единого механизма взаимодействия предусмотрены методы перегрузки операторов.</li>
<li>Класс — это тоже объект с собственным пространством имен. Это нигде не было указано в данном цикле уроков. Однако это так. Поэтому правильнее было употреблять вместо слова «объект», слово «экземпляр». И говорить «экземпляр объекта», подразумевая под этим созданный на основе класса именно объект, и «экземпляр класса», имея ввиду сам класс как объект.</li>
<li>Инкапсуляции в Python не уделяется особого внимания. В других языках программирования обычно нельзя получить напрямую доступ к свойству, описанному в классе. Для его изменения может быть предусмотрен специальный метод. В Python же это легко сделать, просто обратившись к свойству класса из вне. Несмотря на это в Python все-таки предусмотрены специальные способы ограничения доступа к переменным в классе.</li>
</ol>
<h2><span>Обзор терминологии ООП</span></h2>
<ul class="list">
<li><b><span>Класс</span></b><span> &#8212; определенный пользователем прототип для объекта, который определяет набор атрибутов, которые характеризуют любой объект класса. Атрибутами являются члены данных (переменные класса и переменные экземпляра) и методы, доступ к которым осуществляется через точечную запись.</span></li>
<li><b><span>Переменная класса</span></b><span> &#8212; переменная, которая используется всеми экземплярами класса. Переменные класса определены внутри класса, но вне любого из методов класса. Переменные класса используются не так часто, как переменные экземпляра.</span></li>
<li><b><span>Член данных</span></b><span> &#8212; переменная класса или переменная экземпляра, которая содержит данные, связанные с классом и его объектами.</span></li>
<li><b><span>Перегрузка функций</span></b><span> &#8212; назначение более чем одного поведения определенной функции. Выполняемая операция варьируется в зависимости от типов объектов или аргументов.</span></li>
<li><b><span>Переменная экземпляра</span></b><span> &#8212; переменная, которая определена внутри метода и принадлежит только текущему экземпляру класса.</span></li>
<li><b><span>Наследование</span></b><span> &#8212; передача характеристик класса другим классам, которые являются его производными.</span></li>
<li><b><span>Экземпляр</span></b><span> &#8212; индивидуальный объект определенного класса. Например, объект obj, принадлежащий классу Circle, является экземпляром класса Circle.</span></li>
<li><b><span>Instantiation</span></b><span> &#8212; создание экземпляра класса.</span></li>
<li><b><span>Метод</span></b><span> &#8212; особый вид функции, который определен в определении класса.</span></li>
<li><b><span>Объект</span></b><span> &#8212; уникальный экземпляр структуры данных, который определяется его классом. Объект включает в себя как члены данных (переменные класса и переменные экземпляра), так и методы.</span></li>
<li><b><span>Перегрузка оператора</span></b><span> &#8212; назначение более чем одной функции определенному оператору.</span></li>
</ul>
<h2><span>Создание классов</span></h2>
<p><span>Оператор </span><i><span>класса</span></i><span> создает новое определение класса. Имя класса следует сразу за ключевым словом </span><i><span>class,</span></i><span> за которым следует двоеточие:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">class ClassName:
   'Optional class documentation string'
   class_suite</pre>
<ul class="list">
<li><span>Класс имеет строку документации, к которой можно получить доступ через </span><strong><i>ClassName .__ doc__</i> .</strong></li>
<li><span></span><strong><i>Class_suite</i></strong><span> состоит из всех компонентов утверждений, определяющих член класса, атрибуты данных и функцию.</span></li>
</ul>
<h3><span>Пример</span></h3>
<p><span>Ниже приведен пример простого класса Python </span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">class Employee:
   'Common base class for all employees'
   empCount = 0

   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount

   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary</pre>
<ul class="list">
<li><span>Переменная </span><strong><i>empCount</i></strong><span><strong> </strong>является переменной класса, значение которой является общим для всех экземпляров этого класса. Доступ к нему можно получить как </span><strong><i>Employee.empCount</i></strong><span> внутри класса или за его пределами.</span></li>
<li><span>Первый метод </span><i><span><strong>__init __</strong> ()</span></i><span> &#8212; это специальный метод, который называется <strong>конструктором класса</strong> или <strong>методом инициализации</strong>, который Python вызывает при создании нового экземпляра этого класса.</span></li>
<li><span>Вы объявляете другие методы класса, как обычные функции, за исключением того, что первый аргумент каждого метода &#8212; это </span><strong><i>self</i></strong><span><strong> </strong>. Python добавляет аргумент </span><i><span>self</span></i><span> в список для вас; вам не нужно включать его при вызове методов.</span></li>
</ul>
<h2><span>Создание объектов экземпляра</span></h2>
<p><span>Чтобы создать экземпляры класса, вы вызываете класс, используя имя класса, и передаете любые аргументы, которые принимает его метод </span><i><span>__init__</span></i><span> .</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">"This would create first object of Employee class"
emp1 = Employee("Zara", 2000)
"This would create second object of Employee class"
emp2 = Employee("Manni", 5000)</pre>
<h2><span>Доступ к атрибутам</span></h2>
<p><span>Вы получаете доступ к атрибутам объекта, используя оператор точки с объектом. Переменная класса будет доступна с использованием имени класса следующим образом:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount</pre>
<p><span>Теперь, объединяя все концепции</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">#!/usr/bin/python

class Employee:
   'Common base class for all employees'
   empCount = 0

   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount

   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary

"This would create first object of Employee class"
emp1 = Employee("Zara", 2000)
"This would create second object of Employee class"
emp2 = Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount</pre>
<p><span>Когда приведенный выше код выполняется, он дает следующий результат</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Name :  Zara ,Salary:  2000
Name :  Manni ,Salary:  5000
Total Employee 2</pre>
<p><span>Вы можете добавлять, удалять или изменять атрибуты классов и объектов в любое время</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">emp1.age = 7  # Add an 'age' attribute.
emp1.age = 8  # Modify 'age' attribute.
del emp1.age  # Delete 'age' attribute.</pre>
<p><span>Вместо использования обычных операторов для доступа к атрибутам, вы можете использовать следующие функции:</span></p>
<ul class="list">
<li><span></span><b><span>GetAttr (объект, имя [, по умолчанию])</span></b><span> &#8212; для доступа к атрибуту объекта.</span></li>
<li><span></span><b><span>Hasattr (объект, имя)</span></b><span> &#8212; проверить , если атрибут существует или нет.</span></li>
<li><span></span><b><span>SetAttr (объект, имя, значение)</span></b><span> &#8212; установить атрибут. Если атрибут не существует, он будет создан.</span></li>
<li><span></span><b><span>Delattr (объект, имя)</span></b><span> &#8212; для удаления атрибута.</span></li>
</ul>
<pre class="EnlighterJSRAW" data-enlighter-language="python">hasattr(emp1, 'age')    # Returns true if 'age' attribute exists
getattr(emp1, 'age')    # Returns value of 'age' attribute
setattr(emp1, 'age', 8) # Set attribute 'age' at 8
delattr(empl, 'age')    # Delete attribute 'age'</pre>
<h2><span>Встроенные атрибуты класса</span></h2>
<p><span>Каждый класс Python поддерживает следующие встроенные атрибуты, и к ним можно получить доступ, используя оператор точки, как и любой другой атрибут &#8212;</span></p>
<ul class="list">
<li><b><span>__dict__</span></b><span> &#8212; словарь, содержащий пространство имен класса.</span></li>
<li><b><span>__doc__</span></b><span> &#8212; Строка документации класса или нет, если она не определена.</span></li>
<li><b><span>__name__</span></b><span> &#8212; Имя класса.</span></li>
<li><b><span>__module__</span></b><span> &#8212; Имя модуля, в котором определяется класс. Этот атрибут «__main__» в интерактивном режиме.</span></li>
<li><b><span>__bases__</span></b><span> &#8212; возможно пустой кортеж, содержащий базовые классы, в порядке их появления в списке базовых классов.</span></li>
</ul>
<p><span>Для приведенного выше класса давайте попробуем получить доступ ко всем этим атрибутам</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">#!/usr/bin/python

class Employee:
   'Common base class for all employees'
   empCount = 0

   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount

   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary

print "Employee.__doc__:", Employee.__doc__
print "Employee.__name__:", Employee.__name__
print "Employee.__module__:", Employee.__module__
print "Employee.__bases__:", Employee.__bases__
print "Employee.__dict__:", Employee.__dict__</pre>
<p><span>Когда приведенный выше код выполняется, он дает следующий результат</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Employee.__doc__: Common base class for all employees
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: ()
Employee.__dict__: {'__module__': '__main__', 'displayCount':
&lt;function displayCount at 0xb7c84994&gt;, 'empCount': 2, 
'displayEmployee': &lt;function displayEmployee at 0xb7c8441c&gt;, 
'__doc__': 'Common base class for all employees', 
'__init__': &lt;function __init__ at 0xb7c846bc&gt;}</pre>
<h2><span>Уничтожение объектов (Сборка мусора)</span></h2>
<p><span>Python автоматически удаляет ненужные объекты (встроенные типы или экземпляры классов), чтобы освободить пространство памяти. Процесс, посредством которого Python периодически восстанавливает блоки памяти, которые больше не используются, называется сборкой мусора.</span></p>
<p><span>Сборщик мусора в Python запускается во время выполнения программы и запускается, когда счетчик ссылок на объект достигает нуля. Количество ссылок объекта изменяется по мере изменения количества псевдонимов, которые на него указывают.</span></p>
<p><span>Счетчик ссылок на объект увеличивается, когда ему присваивается новое имя или он помещается в контейнер (список, кортеж или словарь). Счетчик ссылок объекта уменьшается, когда он удаляется с помощью </span><i><span>del</span></i><span> , его ссылка переназначается или его ссылка выходит за пределы области видимости. Когда счетчик ссылок объекта достигает нуля, Python собирает его автоматически.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a = 40      # Create object &lt;40&gt;
b = a       # Increase ref. count  of &lt;40&gt; 
c = [b]     # Increase ref. count  of &lt;40&gt; 

del a       # Decrease ref. count  of &lt;40&gt;
b = 100     # Decrease ref. count  of &lt;40&gt; 
c[0] = -1   # Decrease ref. count  of &lt;40&gt;</pre>
<p><span>Обычно вы не замечаете, когда сборщик мусора уничтожает потерянный экземпляр и освобождает его пространство. Но класс может реализовать специальный метод </span><i><span>__del __ ()</span></i><span> , называемый деструктором, который вызывается, когда экземпляр собирается быть уничтоженным. Этот метод может использоваться для очистки любых ресурсов памяти, используемых экземпляром.</span></p>
<h3><span>Пример</span></h3>
<p><span>Этот деструктор __del __ () печатает имя класса экземпляра, который должен быть уничтожен</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">#!/usr/bin/python

class Point:
   def __init__( self, x=0, y=0):
      self.x = x
      self.y = y
   def __del__(self):
      class_name = self.__class__.__name__
      print class_name, "destroyed"

pt1 = Point()
pt2 = pt1
pt3 = pt1
print id(pt1), id(pt2), id(pt3) # prints the ids of the obejcts
del pt1
del pt2
del pt3</pre>
<p><span>Когда приведенный выше код выполняется, он дает следующий результат</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">3083401324 3083401324 3083401324
Point destroyed</pre>
<p><b><span>Примечание.</span></b><span> В идеале вы должны определять свои классы в отдельном файле, а затем импортировать их в основной файл программы с помощью оператора </span><i><span>import</span></i><span> .</span></p>
<h2><span>Наследование классов</span></h2>
<p><span>Вместо того, чтобы начинать с нуля, вы можете создать класс, выведя его из ранее существовавшего класса, перечислив родительский класс в скобках после имени нового класса.</span></p>
<p><span>Дочерний класс наследует атрибуты своего родительского класса, и вы можете использовать эти атрибуты, как если бы они были определены в дочернем классе. Дочерний класс также может переопределять элементы данных и методы родительского класса.</span></p>
<h3><span>Синтаксис</span></h3>
<p><span>Производные классы объявляются так же, как их родительский класс; однако список базовых классов для наследования дается после имени класса</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">class SubClassName (ParentClass1[, ParentClass2, ...]):
   'Optional class documentation string'
   class_suite</pre>
<h3><span>Пример</span></h3>
<pre class="EnlighterJSRAW" data-enlighter-language="python">#!/usr/bin/python

class Parent:        # define parent class
   parentAttr = 100
   def __init__(self):
      print "Calling parent constructor"

   def parentMethod(self):
      print 'Calling parent method'

   def setAttr(self, attr):
      Parent.parentAttr = attr

   def getAttr(self):
      print "Parent attribute :", Parent.parentAttr

class Child(Parent): # define child class
   def __init__(self):
      print "Calling child constructor"

   def childMethod(self):
      print 'Calling child method'

c = Child()          # instance of child
c.childMethod()      # child calls its method
c.parentMethod()     # calls parent's method
c.setAttr(200)       # again call parent's method
c.getAttr()          # again call parent's method</pre>
<p><span>Когда приведенный выше код выполняется, он дает следующий результат</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Calling child constructor
Calling child method
Calling parent method
Parent attribute : 200</pre>
<p><span>Аналогичным образом вы можете управлять классом из нескольких родительских классов следующим образом:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">class A:        # define your class A
.....

class B:         # define your class B
.....

class C(A, B):   # subclass of A and B
.....</pre>
<p><span>Вы можете использовать функции issubclass () или isinstance (), чтобы проверить отношения двух классов и экземпляров.</span></p>
<ul class="list">
<li><span></span><b><span>Issubclass ( к югу, вир)</span></b><span> функция булева возвращает истину , если данный подкласс </span><b><span>суб</span></b><span> действительно подкласс суперкласса </span><b><span>вир</span></b><span> .</span></li>
<li><span></span><b><span>Isinstance (объект, класс)</span></b><span> Функция булева возвращает истину , если </span><i><span>OBJ</span></i><span> является экземпляром класса </span><i><span>Class</span></i><span> или является экземпляром подкласса класса</span></li>
</ul>
<h2><span>Переопределяющие методы</span></h2>
<p><span>Вы всегда можете переопределить ваши родительские методы класса. Одна из причин переопределения родительских методов заключается в том, что вам может потребоваться особая или другая функциональность в вашем подклассе.</span></p>
<h3><span>Пример</span></h3>
<pre class="EnlighterJSRAW" data-enlighter-language="python">#!/usr/bin/python

class Parent:        # define parent class
   def myMethod(self):
      print 'Calling parent method'

class Child(Parent): # define child class
   def myMethod(self):
      print 'Calling child method'

c = Child()          # instance of child
c.myMethod()         # child calls overridden method</pre>
<p><span>Когда приведенный выше код выполняется, он дает следующий результат</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Calling child method</pre>
<h2><span>Базовые методы перегрузки</span></h2>
<p><span>В следующей таблице перечислены некоторые общие функции, которые вы можете переопределить в своих собственных классах.</span></p>
<table class="table table-bordered">
<tbody>
<tr>
<th><span>Sr.No.</span></th>
<th><span>Метод, описание и пример вызова</span></th>
</tr>
<tr>
<td class="ts"><span>1</span></td>
<td><b><span>__init__ (self [, args &#8230;])</span></b></p>
<p><span>Конструктор (с любыми необязательными аргументами)</span></p>
<p><span>Пример вызова: </span><i><span>obj = className (args)</span></i></td>
</tr>
<tr>
<td class="ts"><span>2</span></td>
<td><b><span>__del __ (самостоятельно)</span></b></p>
<p><span>Деструктор, удаляет объект</span></p>
<p><span>Образец звонка: </span><i><span>del obj</span></i></td>
</tr>
<tr>
<td class="ts"><span>3</span></td>
<td><b><span>__repr __ (самостоятельно)</span></b></p>
<p><span>Оцениваемое строковое представление</span></p>
<p><span>Пример вызова: </span><i><span>repr (obj)</span></i></td>
</tr>
<tr>
<td class="ts"><span>4</span></td>
<td><b><span>__str __ (самостоятельно)</span></b></p>
<p><span>Печатное представление строки</span></p>
<p><span>Пример вызова: </span><i><span>str (obj)</span></i></td>
</tr>
<tr>
<td class="ts"><span>5</span></td>
<td><b><span>__cmp__ (self, x)</span></b></p>
<p><span>Сравнение объектов</span></p>
<p><span>Пример вызова: </span><i><span>cmp (obj, x)</span></i></td>
</tr>
</tbody>
</table>
<h2><span>Операторы перегрузки</span></h2>
<p><span>Предположим, что вы создали класс Vector для представления двумерных векторов. Что произойдет, когда вы добавите оператор «плюс»? Скорее всего, Python будет кричать на вас.</span></p>
<p><span>Однако вы можете определить метод </span><i><span>__add__</span></i><span> в вашем классе для выполнения сложения векторов, и тогда оператор плюс будет вести себя так, как ожидалось:</span></p>
<h3><span>пример</span></h3>
<pre class="EnlighterJSRAW" data-enlighter-language="python">#!/usr/bin/python

class Vector:
   def __init__(self, a, b):
      self.a = a
      self.b = b

   def __str__(self):
      return 'Vector (%d, %d)' % (self.a, self.b)
   
   def __add__(self,other):
      return Vector(self.a + other.a, self.b + other.b)

v1 = Vector(2,10)
v2 = Vector(5,-2)
print v1 + v2</pre>
<p><span>Когда приведенный выше код выполняется, он дает следующий результат</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Vector(7,8)</pre>
<h2><span>Скрытие данных</span></h2>
<p><span>Атрибуты объекта могут или не могут быть видны вне определения класса. Вам необходимо присвоить имена атрибутам с двойным префиксом подчеркивания, и тогда эти атрибуты не будут напрямую видны посторонним.</span></p>
<h3><span>пример</span></h3>
<pre class="EnlighterJSRAW" data-enlighter-language="python">#!/usr/bin/python

class JustCounter:
   __secretCount = 0
  
   def count(self):
      self.__secretCount += 1
      print self.__secretCount

counter = JustCounter()
counter.count()
counter.count()
print counter.__secretCount</pre>
<p><span>Когда приведенный выше код выполняется, он дает следующий результат</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">1
2
Traceback (most recent call last):
   File "test.py", line 12, in &lt;module&gt;
      print counter.__secretCount
AttributeError: JustCounter instance has no attribute '__secretCount'</pre>
<p><span>Python защищает этих членов, внутренне изменяя имя, чтобы включить имя класса. Вы можете получить доступ к таким атрибутам как </span><i><span>object._className__attrName</span></i><span> . Если вы заменили свою последнюю строку следующим образом, то она работает для вас</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">.........................
print counter._JustCounter__secretCount</pre>
<p><span>Когда приведенный выше код выполняется, он дает следующий результат</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">1
2
2</pre>
<h2>Сквозной пример по классам</h2>
<pre class="EnlighterJSRAW" data-enlighter-language="null">####################################################
## 5. Классы
####################################################

# Чтобы получить класс, мы наследуемся от object.
class Human(object):

    # Атрибут класса. Он разделяется всеми экземплярами этого класса
    species = "H. sapiens"

    # Обычный конструктор, вызывается при инициализации экземпляра класса
    # Обратите внимание, что двойное подчёркивание в начале и в конце имени
    # означает объекты и атрибуты, которые используются Python, но находятся
    # в пространствах имён, управляемых пользователем.
    # Не придумывайте им имена самостоятельно.
    def __init__(self, name):
        # Присваивание значения аргумента атрибуту класса name
        self.name = name

    # Метод экземпляра. Все методы принимают self в качестве первого аргумента
    def say(self, msg):
        return "{name}: {message}".format(name=self.name, message=msg)

    # Метод класса разделяется между всеми экземплярами
    # Они вызываются с указыванием вызывающего класса в качестве первого аргумента
    @classmethod
    def get_species(cls):
        return cls.species

    # Статический метод вызывается без ссылки на класс или экземпляр
    @staticmethod
    def grunt():
        return "*grunt*"


# Инициализация экземпляра класса
i = Human(name="Иван")
print(i.say("привет"))     # Выводит: «Иван: привет»

j = Human("Пётр")
print(j.say("Привет"))  # Выводит: «Пётр: привет»

# Вызов метода класса
i.get_species() #=&gt; "H. sapiens"

# Изменение разделяемого атрибута
Human.species = "H. neanderthalensis"
i.get_species() #=&gt; "H. neanderthalensis"
j.get_species() #=&gt; "H. neanderthalensis"

# Вызов статического метода
Human.grunt() #=&gt; "*grunt*"</pre>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fclasses-python-3-methods-oop-examples%2F&amp;linkname=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B%2C%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20Python%203.%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%9E%D0%9E%D0%9F%20%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%20%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fclasses-python-3-methods-oop-examples%2F&amp;linkname=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B%2C%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20Python%203.%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%9E%D0%9E%D0%9F%20%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%20%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fclasses-python-3-methods-oop-examples%2F&amp;linkname=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B%2C%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20Python%203.%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%9E%D0%9E%D0%9F%20%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%20%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fclasses-python-3-methods-oop-examples%2F&amp;linkname=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B%2C%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20Python%203.%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%9E%D0%9E%D0%9F%20%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%20%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fclasses-python-3-methods-oop-examples%2F&amp;linkname=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B%2C%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20Python%203.%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%9E%D0%9E%D0%9F%20%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%20%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fclasses-python-3-methods-oop-examples%2F&amp;linkname=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B%2C%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20Python%203.%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%9E%D0%9E%D0%9F%20%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%20%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fclasses-python-3-methods-oop-examples%2F&amp;linkname=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B%2C%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20Python%203.%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%9E%D0%9E%D0%9F%20%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%20%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fclasses-python-3-methods-oop-examples%2F&#038;title=%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D1%8B%2C%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20Python%203.%20%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B%20%D0%9E%D0%9E%D0%9F%20%28%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE%20%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29" data-a2a-url="https://python.ivan-shamaev.ru/classes-python-3-methods-oop-examples/" data-a2a-title="Классы, методы Python 3. Примеры ООП (объектно ориентированное программирование)"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/classes-python-3-methods-oop-examples/">Классы, методы Python 3. Примеры ООП (объектно ориентированное программирование)</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/classes-python-3-methods-oop-examples/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Python 3 Pandas: Объекты Series и DataFrame. Построение Index</title>
		<link>https://python.ivan-shamaev.ru/pandas-series-and-dataframe-objects-build-index/</link>
					<comments>https://python.ivan-shamaev.ru/pandas-series-and-dataframe-objects-build-index/#comments</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Tue, 23 Apr 2019 02:32:09 +0000</pubDate>
				<category><![CDATA[Pandas. Обработка данных]]></category>
		<category><![CDATA[pandas dataframe]]></category>
		<category><![CDATA[pandas dataframe tutorial]]></category>
		<category><![CDATA[python 3]]></category>
		<category><![CDATA[python 3 pandas]]></category>
		<category><![CDATA[python pandas]]></category>
		<category><![CDATA[обработка dataframe]]></category>
		<category><![CDATA[обучение dataframe]]></category>
		<category><![CDATA[обучение Python pandas]]></category>
		<category><![CDATA[учебник python pandas]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=79</guid>

					<description><![CDATA[<p>Что такое Pandas DataFrame? Pandas — более новый пакет, надстройка над библиотекой NumPy, обеспечивающий эффективную реализацию класса DataFrame. Объекты DataFrame — многомерные массивы с метками для строк и столбцов, а также зачастую с неоднородным типом данных и/или пропущенными данными. Помимо удобного интерфейса для хранения маркированных данных, библиотека Pandas реализует множество операций для работы с данными [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/pandas-series-and-dataframe-objects-build-index/">Python 3 Pandas: Объекты Series и DataFrame. Построение Index</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpandas-series-and-dataframe-objects-build-index%2F&amp;linkname=Python%203%20Pandas%3A%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20Series%20%D0%B8%20DataFrame.%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20Index" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpandas-series-and-dataframe-objects-build-index%2F&amp;linkname=Python%203%20Pandas%3A%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20Series%20%D0%B8%20DataFrame.%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20Index" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpandas-series-and-dataframe-objects-build-index%2F&amp;linkname=Python%203%20Pandas%3A%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20Series%20%D0%B8%20DataFrame.%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20Index" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpandas-series-and-dataframe-objects-build-index%2F&amp;linkname=Python%203%20Pandas%3A%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20Series%20%D0%B8%20DataFrame.%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20Index" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpandas-series-and-dataframe-objects-build-index%2F&amp;linkname=Python%203%20Pandas%3A%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20Series%20%D0%B8%20DataFrame.%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20Index" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpandas-series-and-dataframe-objects-build-index%2F&amp;linkname=Python%203%20Pandas%3A%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20Series%20%D0%B8%20DataFrame.%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20Index" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpandas-series-and-dataframe-objects-build-index%2F&amp;linkname=Python%203%20Pandas%3A%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20Series%20%D0%B8%20DataFrame.%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20Index" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpandas-series-and-dataframe-objects-build-index%2F&#038;title=Python%203%20Pandas%3A%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20Series%20%D0%B8%20DataFrame.%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20Index" data-a2a-url="https://python.ivan-shamaev.ru/pandas-series-and-dataframe-objects-build-index/" data-a2a-title="Python 3 Pandas: Объекты Series и DataFrame. Построение Index"></a></p>
<h2 class="wp-block-heading">Что такое Pandas DataFrame?</h2>


<p><span><strong>Pandas</strong> — более новый пакет, надстройка над библиотекой NumPy, обеспечивающий эффективную реализацию класса DataFrame. </span></p>
<p><span><strong>Объекты DataFrame</strong> — многомерные массивы с метками для строк и столбцов, а также зачастую с неоднородным типом данных и/или пропущенными данными. </span></p>
<p><span>Помимо удобного интерфейса для <strong>хранения маркированных данных</strong>, библиотека <strong>Pandas</strong> реализует <strong>множество операций для работы с данными</strong> хорошо знакомых пользователям фреймворков баз данных и электронных таблиц.</span></p>


<h2 class="wp-block-heading">Импорт библиотек NumPy и Pandas</h2>



<p>На самом примитивном уровне объекты библиотеки Pandas можно считать расширенной версией структурированных массивов библиотеки NumPy, в которых строки и столбцы идентифицируются метками, а не простыми числовыми индексами. Библиотека Pandas предоставляет множество полезных утилит, методов и функциональности в дополнение к базовым структурам данных, но все последующее изложение потребует понимания этих базовых структур. Позвольте познакомить вас с тремя фундаментальными структурами данных библиотеки Pandas: классами Series, DataFrame и Index.</p>



<p>Начнем наш сеанс программирования с обычных импортов библиотек NumPy и Pandas:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
import pandas as pd</pre>



<h2 class="wp-block-heading">Объект Series библиотеки Pandas</h2>



<p><strong>Объект Series</strong> библиотеки Pandas — одномерный массив индексированных данных. Его можно создать из списка или массива следующим образом:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
import pandas as pd

data = pd.Series([0.25, 0.5, 0.75, 1.0])
print(data)</pre>



<p><strong>Результат:</strong></p>



<div class="wp-block-image"><figure class="aligncenter"><img decoding="async" width="130" height="85" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/pandas_series_ex1.jpg" alt="" class="wp-image-82"/></figure></div>



<p>Как мы видели из предыдущего результата, объект Series служит адаптером как для последовательности значений, так и последовательности индексов, к которым можно получить доступ посредством атрибутов values и index. Атрибут values представляет собой массив NumPy:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
import pandas as pd

data = pd.Series([0.25, 0.5, 0.75, 1.0])
print(data.values)</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[0.25 0.5  0.75 1.  ]</pre>



<p><strong>Index</strong> — массивоподобный объект типа <strong>pd.Index</strong>:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
import pandas as pd

data = pd.Series([0.25, 0.5, 0.75, 1.0])
print(data.index)</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">RangeIndex(start=0, stop=4, step=1)</pre>



<p>Аналогично массивам библиотеки NumPy, к данным можно обращаться по соответствующему им индексу посредством нотации с использованием квадратных скобок языка Python:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
import pandas as pd

data = pd.Series([0.25, 0.5, 0.75, 1.0])
print('data[1]:')
print(data[1])

print('data[1:3]:')
print(data[1:3])</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">data[1]:
0.5
data[1:3]:
1    0.50
2    0.75
dtype: float64</pre>



<p>Однако объект Series библиотеки Pandas намного универсальнее и гибче, чем эмулируемый им одномерный массив библиотеки NumPy.</p>



<h3 class="wp-block-heading">Объект Series как обобщенный массив NumPy</h3>



<p>Может показаться, что объект <strong>Series </strong>и <strong>одномерный массив библиотеки NumPy</strong> взаимозаменяемы. Основное различие между ними — <strong>индекс</strong>. В то время как <strong>индекс массива NumPy</strong>, используемый для доступа к значениям, — целочисленный и описывается неявно, <strong>индекс объекта Series библиотеки Pandas</strong> описывается явно и связывается со значениями.<br></p>



<p><strong>Явное описание индекса</strong> расширяет возможности объекта Series. Такой индекс не должен быть целым числом, а может состоять из значений любого нужного типа. Например, при желании мы можем использовать в качестве индекса строковые значения:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
import pandas as pd

data = pd.Series([0.25, 0.5, 0.75, 1.0],
                 index=['a', 'b', 'c', 'd'])
print(data)</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">a    0.25
b    0.50
c    0.75
d    1.00
dtype: float64</pre>



<p>При этом доступ к элементам работает обычным образом:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
import pandas as pd

data = pd.Series([0.25, 0.5, 0.75, 1.0],
                 index=['a', 'b', 'c', 'd'])
print(data['b'])</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">0.5</pre>



<h3 class="wp-block-heading">Объект Series как специализированный словарь</h3>



<p><strong>Объект Series</strong> библиотеки Pandas можно рассматривать как специализированную разновидность словаря языка Python. <strong>Словарь </strong>— структура, задающая соответствие произвольных ключей набору произвольных значений, а объект <strong>Series </strong>— структура, задающая соответствие типизированных ключей набору типизированных значений. </p>



<p><strong>Типизация важна:</strong> точно так же, как соответствующий типу специализированный код для массива библиотеки NumPy при выполнении определенных операций делает его эффективнее, чем стандартный список Python, информация о типе в объекте Series библиотеки Pandas делает его намного более эффективным для определенных операций, чем словари Python.<br></p>



<p>Можно сделать аналогию «объект Series — словарь» еще более наглядной, сконструировав объект Series непосредственно из словаря Python.</p>



<p>По умолчанию при этом будет создан объект Series с полученным из отсортированных ключей индексом. Следовательно, для него возможен обычный доступ к элементам, такой же, как для словаря. Объект Series поддерживает операции &#171;срезы&#187;.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
import pandas as pd

# Словарь
population_dict = {'California': 38332521,
                   'Texas': 26448193,
                   'New York': 19651127,
                   'Florida': 19552860,
                   'Illinois': 12882135}
population = pd.Series(population_dict)
print('population:')
print(population)

# Доступ к элементам
print("population['California']:")
print(population['California'])

# Срез
print("population['California':'New York']:")
print(population['California':'New York'])</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">population:
California    38332521
Texas         26448193
New York      19651127
Florida       19552860
Illinois      12882135
dtype: int64

population['California']:
38332521

population['California':'New York']:
California    38332521
Texas         26448193
New York      19651127
dtype: int64</pre>



<h3 class="wp-block-heading">Создание объектов Series</h3>



<p>Мы уже изучили несколько способов создания объектов Series библиотеки Pandas с нуля.</p>



<p>Все они представляют собой различные варианты следующего <strong>синтаксиса Pandas Series</strong> (общий вид синтаксиса):</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pd.Series(data, index=index)</pre>



<p>где <strong>index </strong>— необязательный аргумент, а <strong>data </strong>может быть одной из множества сущностей.</p>



<p>Например, аргумент data может быть списком или массивом NumPy. В этом случае index по умолчанию будет целочисленной последовательностью:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

data = pd.Series([2, 4, 6])
print(data)</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">0    2
1    4
2    6
dtype: int64</pre>



<p>Аргумент data может быть скалярным значением, которое будет повторено нужное количество раз для заполнения заданного индекса:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

data = pd.Series(5, index=[100, 200, 300])
print(data)</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">100    5
200    5
300    5
dtype: int64</pre>



<p>Аргумент data может быть словарем, в котором index по умолчанию является отсортированными ключами этого словаря:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

data = pd.Series({2:'a', 1:'b', 3:'c'})
print(data)</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">2    a
1    b
3    c
dtype: object</pre>



<p>В каждом случае индекс можно указать вручную, если необходимо получить другой результат:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

data = pd.Series({2:'a', 1:'b', 3:'c'}, index=[3, 2])
print(data)</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">3    c
2    a
dtype: object</pre>



<p>Обратите внимание, что объект Series заполняется только заданными явным образом ключами.</p>



<h2 class="wp-block-heading">Объект DataFrame библиотеки Pandas</h2>



<p>Следующая базовая структура библиотеки Pandas — <strong>объект DataFrame</strong>. Как и объект Series, объект DataFrame можно рассматривать или как обобщение массива NumPy, или как специализированную версию словаря Python. Изучим оба варианта.</p>



<h3 class="wp-block-heading">DataFrame как обобщенный массив NumPy</h3>



<p>Если объект <strong>Series </strong>— аналог одномерного массива с гибкими индексами, объект <strong>DataFrame </strong>— аналог двумерного массива с гибкими индексами строк и гибкими именами столбцов. Аналогично тому, что двумерный массив можно рассматривать как упорядоченную последовательность выровненных столбцов, объект DataFrame можно рассматривать как упорядоченную последовательность выровненных объектов Series. <strong>Под «выровненными» имеется в виду то, что они используют один и тот же индекс.</strong></p>



<p>Чтобы продемонстрировать это, сначала создадим новый объект Series, содержащий площадь каждого из пяти упомянутых в предыдущем разделе штатов:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

area_dict = {'California': 423967,
             'Texas': 695662,
             'New York': 141297,
             'Florida': 170312,
             'Illinois': 149995}
area = pd.Series(area_dict)
print(area)</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">California    423967
Texas         695662
New York      141297
Florida       170312
Illinois      149995
dtype: int64</pre>



<p>Воспользовавшись объектом population класса <strong>Series</strong>, сконструируем на основе словаря единый двумерный объект, содержащий всю эту информацию:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

# Словарь площадь штатов
area_dict = {'California': 423967,
             'Texas': 695662,
             'New York': 141297,
             'Florida': 170312,
             'Illinois': 149995}
area = pd.Series(area_dict)

# Словарь население
population_dict = {'California': 38332521,
                   'Texas': 26448193,
                   'New York': 19651127,
                   'Florida': 19552860,
                   'Illinois': 12882135}
population = pd.Series(population_dict)

# Создаем DataFrame
states = pd.DataFrame({'population': population, 'area': area})
print(states)</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">            population    area
California    38332521  423967
Texas         26448193  695662
New York      19651127  141297
Florida       19552860  170312
Illinois      12882135  149995</pre>



<p>Аналогично объекту Series у объекта DataFrame имеется атрибут <strong>index</strong>, обеспечивающий доступ к меткам индекса. Еще у объекта DataFrame есть атрибут <strong>columns</strong>, представляющий собой содержащий метки столбцов объект Index.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

# Словарь площадь штатов
area_dict = {'California': 423967,
             'Texas': 695662,
             'New York': 141297,
             'Florida': 170312,
             'Illinois': 149995}
area = pd.Series(area_dict)

# Словарь население
population_dict = {'California': 38332521,
                   'Texas': 26448193,
                   'New York': 19651127,
                   'Florida': 19552860,
                   'Illinois': 12882135}
population = pd.Series(population_dict)

# Создаем DataFrame
states = pd.DataFrame({'population': population, 'area': area})

print('Индексы - states.index:')
print(states.index)
print('')
print('Колонки - states.columns:')
print(states.columns)</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Индексы - states.index:
Index(['California', 'Texas', 'New York', 'Florida', 'Illinois'], dtype='object')

Колонки - states.columns:
Index(['population', 'area'], dtype='object')</pre>



<p>Таким образом, объект DataFrame можно рассматривать как обобщение двумерного массива NumPy, где как у строк, так и у столбцов есть обобщенные индексы для доступа к данным.</p>



<h3 class="wp-block-heading">Объект DataFrame как специализированный словарь</h3>



<p><strong>DataFrame </strong>можно рассматривать как специализированный словарь. Если словарь задает соответствие ключей значениям, то DataFrame задает соответствие имени столбца объекту <strong>Series </strong>с данными этого столбца. Например, запрос данных по атрибуту &#8216;area&#8217; приведет к тому, что будет возвращен объект Series, содержащий площади штатов:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

# Словарь площадь штатов
area_dict = {'California': 423967,
             'Texas': 695662,
             'New York': 141297,
             'Florida': 170312,
             'Illinois': 149995}
area = pd.Series(area_dict)

# Словарь население
population_dict = {'California': 38332521,
                   'Texas': 26448193,
                   'New York': 19651127,
                   'Florida': 19552860,
                   'Illinois': 12882135}
population = pd.Series(population_dict)

# Создаем DataFrame
states = pd.DataFrame({'population': population, 'area': area})

print(states['area'])</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">California    423967
Texas         695662
New York      141297
Florida       170312
Illinois      149995
Name: area, dtype: int64</pre>



<h3 class="wp-block-heading">Создание объектов DataFrame</h3>



<p>Существует множество способов создания объектов DataFrame библиотеки Pandas. Вот несколько примеров.</p>



<h4 class="wp-block-heading">Из одного объекта Series</h4>



<p><strong>Объект DataFrame</strong> — набор объектов Series. </p>



<p>DataFrame, состоящий из одного столбца, можно создать на основе одного объекта Series:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

# Словарь население
population_dict = {'California': 38332521,
                   'Texas': 26448193,
                   'New York': 19651127,
                   'Florida': 19552860,
                   'Illinois': 12882135}
population = pd.Series(population_dict)

df = pd.DataFrame(population, columns=['population'])

print(df)</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">            population
California    38332521
Texas         26448193
New York      19651127
Florida       19552860
Illinois      12882135</pre>



<h4 class="wp-block-heading">Из списка словарей</h4>



<p>Любой список словарей можно преобразовать в объект DataFrame. Мы воспользуемся простым списковым включением для создания данных:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

data = [{'a': i, 'b': 2 * i}
        for i in range(3)]

print('data:')
print(data)
print('')

df = pd.DataFrame(data)
print('df:')
print(df)</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">data:
[{'a': 0, 'b': 0}, {'a': 1, 'b': 2}, {'a': 2, 'b': 4}]

df:
   a  b
0  0  0
1  1  2
2  2  4</pre>



<p>Даже если некоторые ключи в словаре отсутствуют, библиотека Pandas просто заполнит их значениями NaN (то есть Not a number — «не является числом»):</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

df = pd.DataFrame([{'a': 1, 'b': 2}, {'b': 3, 'c': 4}])
print('df:')
print(df)</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">df:
     a  b    c
0  1.0  2  NaN
1  NaN  3  4.0</pre>



<h4 class="wp-block-heading">Из словаря объектов Series</h4>



<p>Объект DataFrame также можно создать на основе словаря объектов Series (этот пример был приведен ранее):</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

# Словарь площадь штатов
area_dict = {'California': 423967,
             'Texas': 695662,
             'New York': 141297,
             'Florida': 170312,
             'Illinois': 149995}
area = pd.Series(area_dict)

# Словарь население
population_dict = {'California': 38332521,
                   'Texas': 26448193,
                   'New York': 19651127,
                   'Florida': 19552860,
                   'Illinois': 12882135}
population = pd.Series(population_dict)

# Создаем DataFrame
df = pd.DataFrame({'population': population,
                   'area': area})

print(df)</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">            population    area
California    38332521  423967
Texas         26448193  695662
New York      19651127  141297
Florida       19552860  170312
Illinois      12882135  149995 </pre>



<h4 class="wp-block-heading">Из двумерного массива NumPy</h4>



<p>Если у нас есть двумерный массив данных, мы можем создать объект DataFrame с любыми заданными именами столбцов и индексов. Для каждого из пропущенных значений будет использоваться целочисленный индекс:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(3, 2),
                  columns=['foo', 'bar'],
                  index=['a', 'b', 'c'])
print(df)</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">        foo       bar
a  0.290872  0.647270
b  0.690850  0.950563
c  0.468706  0.344193</pre>



<h4 class="wp-block-heading">Из структурированного массива NumPy</h4>



<p>Объект DataFrame библиотеки Pandas ведет себя во многом аналогично структурированному массиву библиотеки NumPy и может быть создан непосредственно из него:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
import pandas as pd

A = np.zeros(3, dtype=[('A', 'i8'), ('B', 'f8')])
print('A:')
print(A)
print('')

df = pd.DataFrame(A)
print('df:')
print(df)</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">A:
[(0, 0.) (0, 0.) (0, 0.)]

df:
   A    B
0  0  0.0
1  0  0.0
2  0  0.0</pre>



<h2 class="wp-block-heading">Объект Index библиотеки Pandas</h2>



<p>Как объект <strong>Series</strong>, так и объект <strong>DataFrame </strong>содержат явный <strong>индекс</strong>, обеспечивающий возможность ссылаться на данные и модифицировать их.</p>



<p><strong>Объект Index</strong> можно рассматривать или как неизменяемый массив (immutable array), или как упорядоченное множество (ordered set) (формально мультимножество, так как объекты Index могут содержать повторяющиеся значения). Из этих способов его представления следуют некоторые интересные возможности операций над объектами Index. В качестве простого примера создадим Index из списка целых чисел:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

ind = pd.Index([2, 3, 5, 7, 11])
print(ind)</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Int64Index([2, 3, 5, 7, 11], dtype='int64')</pre>



<h3 class="wp-block-heading">Объект Index как неизменяемый массив</h3>



<p><strong>Объект Index</strong> во многом ведет себя аналогично массиву. Например, для извлечения из него значений или срезов можно использовать стандартную нотацию индексации языка Python. У объектов Index есть много атрибутов.</p>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">ind[1]
3

ind[::2]
Int64Index([2, 5, 11], dtype='int64')

ind.size, ind.shape, ind.ndim, ind.dtype
5 (5,) 1 int64</pre>



<p>Одно из различий между объектами Index и массивами NumPy — <strong>неизменяемость индексов</strong>, то есть их нельзя модифицировать стандартными средствами:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

ind = pd.Index([2, 3, 5, 7, 11])
ind[1] = 0</pre>



<p><strong>Результат:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Traceback (most recent call last):
  File "C:/Users/User/Desktop/test.py", line 4, in &lt;module>
    ind[1] = 0
  File "C:\Users\User\AppData\Local\Programs\Python\Python37-32\lib\site-packages\pandas\core\indexes\base.py", line 3938, in __setitem__
    raise TypeError("Index does not support mutable operations")
TypeError: Index does not support mutable operations</pre>



<p>Неизменяемость делает безопаснее совместное использование индексов несколькими объектами DataFrame и массивами, исключая возможность побочных эффектов в виде случайной модификации индекса по неосторожности.</p>


<h1 class="ff b fg fn cn"><strong>Выбор подмножеств данных в Pandas</strong></h1>
<h2>Анатомия Python Pandas DataFrame &#8212; Column, Index, Data</h2>
<p>Рассмотрим изображение контейнера данных DataFrame (библиотеки Pandas):</p>
<p><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/python_pandas_dataframe_structure_anatomy.png" alt="" width="1258" height="412" class="alignnone wp-image-245 size-full" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/python_pandas_dataframe_structure_anatomy.png 1258w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/python_pandas_dataframe_structure_anatomy-300x98.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/python_pandas_dataframe_structure_anatomy-768x252.png 768w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/python_pandas_dataframe_structure_anatomy-1024x335.png 1024w" sizes="(max-width: 1258px) 100vw, 1258px" /></p>
<p><strong>Три компонента DataFrame:</strong></p>
<p><strong>DataFrame</strong> состоит из трех различных компонентов: <strong>индекса , столбцов и данных.</strong> Данные также известны как значения.</p>
<p><strong>Индекс</strong> &#8212; это последовательность значений в левой части DataFrame. Каждое отдельное значение индекса называется index label, Иногда индекс упоминается как заголовки строк. В приведенном выше примере метки строк не очень интересны и представляют собой целые числа, начиная с 0 до n-1, где n &#8212; количество строк в таблице.<br /><strong></strong></p>
<p><strong>Столбцы</strong> представляют собой последовательность значений в самой верхней части DataFrame.</p>
<p>Все остальное является <strong>данными или значениями</strong>. Иногда вы будете слышать, как датафреймы называют<strong> табличными данными</strong>. Это просто еще одно имя для данных прямоугольной таблицы со строками и столбцами.</p>
<p><strong>Каждая строка имеет метку, каждая колонка имеет метку</strong></p>
<p>Основной вывод из <strong>анатомии DataFrame</strong> заключается в том, что каждая строка имеет метку, каждый столбец имеет метку. Эти <strong>метки используются для ссылки на конкретные строки или столбцы</strong> в DataFrame.</p>
<h2 id="2636" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Что такое выбор подмножества?</span></h2>
<p id="1500" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>Прежде чем мы начнем делать выбор подмножества, было бы хорошо определить, что это такое. <strong>Выбор подмножества</strong> &#8212; это просто выбор определенных строк и столбцов данных из <strong>DataFrame</strong> (или Series). Это может означать выбор всех строк и некоторых столбцов, некоторых строк и всех столбцов или некоторых строк и столбцов.</span></p>
<h2 id="c635" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Выбор при помощи []</span></h2>
<h3>Загружаем данные из CSV в Pandas DataFrame (Python 3)</h3>
<p>В совокупности <strong>[], .loc и .iloc</strong> называются <strong>индексаторами</strong>. Это самые распространенные способы выбора данных.</p>
<p><strong>Скачать файл для использования в примерах:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/SampleData_Pandas.csv"><em><strong>SampleData_Pandas.csv</strong></em></a></p>
<p><strong>Код загрузки данных из csv в Pandas DataFrame:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';', index_col=0)
print(df)</pre>
<p><strong>Результат:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/dataframe_pandas_data_example.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/dataframe_pandas_data_example.png" alt="" width="681" height="418" class="aligncenter size-full wp-image-254" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/dataframe_pandas_data_example.png 681w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/dataframe_pandas_data_example-300x184.png 300w" sizes="(max-width: 681px) 100vw, 681px" /></a></p>
<p><strong>Вариант 2 загрузки данных из CSV (Index генерируется самостоятельно)</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')
print(df)</pre>
<p><strong>Результат:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/dataframe_pandas_data_example2.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/dataframe_pandas_data_example2.png" alt="" width="634" height="531" class="aligncenter size-full wp-image-256" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/dataframe_pandas_data_example2.png 634w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/dataframe_pandas_data_example2-300x251.png 300w" sizes="(max-width: 634px) 100vw, 634px" /></a></p>
<h3 id="5c39" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Извлечение отдельных компонентов DataFrame</span></h3>
<p id="b25d" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>Ранее мы упоминали три компоненты DataFrame. <strong>Индекс, столбцы и данные (значения).</strong> Мы можем извлечь каждый из этих компонентов в свои переменные. Давайте сделаем это, а затем осмотрим их:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

index = df.index
columns = df.columns
values = df.values

index_list = df.index.tolist()
columns_list = df.columns.tolist()
values_list = df.values.tolist()

print('+++++ БЕЗ TOLIST() +++++')
print(index)
print('==========================')
print(columns)
print('==========================')
print(values)
print('==========================')


print('+++++ С TOLIST() +++++')
print(index_list)
print('==========================')
print(columns_list)
print('==========================')
print(values_list)</pre>
<p><strong>Результат:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/view_dataframe_pandas_index_columns_values_tolist.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/view_dataframe_pandas_index_columns_values_tolist.png" alt="" width="925" height="504" class="aligncenter size-full wp-image-263" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/view_dataframe_pandas_index_columns_values_tolist.png 925w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/view_dataframe_pandas_index_columns_values_tolist-300x163.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/view_dataframe_pandas_index_columns_values_tolist-768x418.png 768w" sizes="(max-width: 925px) 100vw, 925px" /></a></p>
<h3 id="ddf0" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Типы данных компонентов</span></h3>
<p id="ec73" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>Давайте выведем тип каждого компонента, чтобы точно понять, что это за объект.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

index = df.index
columns = df.columns
values = df.values

index_list = df.index.tolist()
columns_list = df.columns.tolist()
values_list = df.values.tolist()

print('+++++ БЕЗ TOLIST() +++++')
print(type(index))
print('==========================')
print(type(columns))
print('==========================')
print(type(values))
print('==========================')


print('+++++ С TOLIST() +++++')
print(type(index_list))
print('==========================')
print(type(columns_list))
print('==========================')
print(type(values_list))</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">+++++ БЕЗ TOLIST() +++++
&lt;class 'pandas.core.indexes.range.RangeIndex'&gt;
==========================
&lt;class 'pandas.core.indexes.base.Index'&gt;
==========================
&lt;class 'numpy.ndarray'&gt;
==========================

+++++ С TOLIST() +++++
&lt;class 'list'&gt;
==========================
&lt;class 'list'&gt;
==========================
&lt;class 'list'&gt;</pre>
<h4 id="2665" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Понимание этих типов</span></h4>
<p id="2f50" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>Интересно, что и индекс, и столбцы имеют одинаковый тип. Они оба </span><code class="gw gx gy gz ha b"></code><strong class="hd js">Index-</strong><span>объект Pandas. Этот объект сам по себе довольно мощный, но сейчас вы можете думать о нем как о последовательности меток для строк или столбцов.</span></p>
<p id="eaa7" class="hb hc cn ar hd b he hp hg hq hi hr hk hs hm ht ho" data-selectable-paragraph=""><span>Значения (ячейки таблицы) &#8212; это </span><strong class="hd js">numpy.ndarray</strong><span>, который обозначает n-мерный массив и является основным контейнером данных в библиотеке <strong>NumPy</strong>. </span></p>
<blockquote>
<p class="hb hc cn ar hd b he hp hg hq hi hr hk hs hm ht ho" data-selectable-paragraph=""><strong>Pandas построен непосредственно поверх NumPy, и именно этот массив отвечает за большую часть рабочей нагрузки.</strong></p>
</blockquote>
<h3 id="01b1" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Выбор одного столбца как серии</span></h3>
<p id="f598" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>Чтобы выбрать один столбец данных, просто поместите имя столбца в скобках. Давайте выберем столбец <strong>Подразделение</strong>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df['Подразделение'])</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">0            Отдел продаж
1       Отдел продвижения
2       Отдел продвижения
3       Отдел продвижения
              ...        
2662         Отдел продаж
2663         Отдел продаж
2664         Отдел продаж
2665    Отдел продвижения
2666    Отдел продвижения
2667    Отдел продвижения
2668    Отдел продвижения
Name: Подразделение, Length: 2669, dtype: object</pre>
<h4 id="8f6b" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Анатомия Series, возвращаемой при выборе 1 столбца</span></h4>
<p id="347d" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>Выбор одного столбца данных возвращает другой контейнер данных <strong>Pandas Series</strong>. </span></p>
<p class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span><strong>Series</strong> &#8212; это одномерная последовательность помеченных данных. Существует два основных компонента Серии: </span><strong class="hd js"><span>указатель</span></strong><span> и </span><strong class="hd js"><span>данные</span></strong><span> (или </span><strong class="hd js"><span>значения</span></strong><span> . В серии нет колонок.</span></p>
<p id="20c7" class="hb hc cn ar hd b he hp hg hq hi hr hk hs hm ht ho" data-selectable-paragraph=""><span>Визуальное отображение Series &#8212; это просто текст, в отличие от красиво оформленной таблицы для DataFrames.</span></p>
<p id="cf25" class="hb hc cn ar hd b he hp hg hq hi hr hk hs hm ht ho" data-selectable-paragraph=""><span>Вы также заметите две дополнительные части данных в нижней части <strong>Series</strong>. </span></p>
<p class="hb hc cn ar hd b he hp hg hq hi hr hk hs hm ht ho" data-selectable-paragraph=""><span><strong>Name</strong> из <strong>Series</strong> становится старое имя колонки. Вы также увидите тип данных или <strong>dtype</strong></span><strong class="hd js"> </strong><span>серии. Вы можете игнорировать оба этих элемента на данный момент. А также количество элементов <strong>Length</strong>.</span></p>
<h3 id="f7c1" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Выбор нескольких столбцов с помощью оператора индексации</span></h3>
<p id="4f39" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>Можно выбрать несколько столбцов только с помощью оператора индексации, передав ему список имен столбцов. Давайте выберем <em><strong>&#8216;Подразделение&#8217;, &#8216;Менеджер&#8217;, &#8216;Номенклатура&#8217;, &#8216;Продажи&#8217;</strong></em></span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df[['Подразделение','Менеджер','Номенклатура','Продажи']])</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">          Подразделение    Менеджер Номенклатура       Продажи
0          Отдел продаж      Петров         Лыжи   956898,3051
1     Отдел продвижения     Сидоров   Велосипеды   1841949,153
2     Отдел продвижения     Сидоров        Доски   1052542,373
3     Отдел продвижения     Сидоров      Палатки   74478,81356
4          Отдел продаж    Илинская   Велосипеды   1649745,763
5          Отдел продаж    Илинская        Доски   1263241,525
...                 ...         ...          ...           ...
2661       Отдел продаж      Петров       Прочее   423,7288136
2662       Отдел продаж    Илинская         Лыжи  -15254,23729
2663       Отдел продаж      Петров         Лыжи   8176271,186
2664       Отдел продаж      Петров       Прочее   171186,4407
2665  Отдел продвижения  Охлобыстин       Прочее   16949,15254
2666  Отдел продвижения    Розницов         Лыжи   15254,23729
2667  Отдел продвижения    Розницов       Одежда   1444915,254
2668  Отдел продвижения    Розницов       Прочее   3389,830508

[2669 rows x 4 columns]</pre>
<h4 id="f1af" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Выбор нескольких столбцов возвращает DataFrame</span></h4>
<p id="b2f8" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>Выбор нескольких столбцов возвращает DataFrame. На самом деле вы можете выбрать один столбец как DataFrame со списком из одного элемента:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df[['Подразделение']])</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">          Подразделение
0          Отдел продаж
1     Отдел продвижения
2     Отдел продвижения
...                 ...
2666  Отдел продвижения
2667  Отдел продвижения
2668  Отдел продвижения

[2669 rows x 1 columns]</pre>
<p><span>Хотя это напоминает <strong>Series</strong>, технически это <strong>DataFrame</strong>, другой объект.</span></p>
<h3 id="dfc4" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Порядок столбцов не имеет значения</span></h3>
<p id="7b89" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>При выборе нескольких столбцов вы можете выбрать их в любом порядке по вашему выбору. Это не должен быть тот же самый порядок как оригинальный DataFrame.</span></p>
<p data-selectable-paragraph=""><span>Например, давайте выберем <strong>Номенклатура, Подразделение</strong>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df[['Номенклатура','Подразделение']])</pre>
<p data-selectable-paragraph=""><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">     Номенклатура      Подразделение
0            Лыжи       Отдел продаж
1      Велосипеды  Отдел продвижения
2           Доски  Отдел продвижения
3         Палатки  Отдел продвижения
4      Велосипеды       Отдел продаж
...           ...                ...
2666         Лыжи  Отдел продвижения
2667       Одежда  Отдел продвижения
2668       Прочее  Отдел продвижения

[2669 rows x 2 columns]</pre>
<h3 id="205b" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Исключения, при выполнении скрипта</span></h3>
<p id="3152" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>Есть несколько общих исключений, которые возникают при выполнении выборок только с помощью оператора индексации.</span></p>
<ul class="">
<li id="2d16" class="hb hc cn ar hd b he hp hg hq hi hr hk hs hm ht ho is hv hw" data-selectable-paragraph=""><span>Если вы ошиблись словом, вы получите </span><strong class="hd js">KeyError</strong></li>
<li id="511a" class="hb hc cn ar hd b he ib hg ic hi id hk ie hm if ho is hv hw" data-selectable-paragraph=""><span>Если вы забыли использовать список, содержащий несколько столбцов, вы также получите </span><strong class="hd js">KeyError</strong></li>
</ul>
<pre class="EnlighterJSRAW" data-enlighter-language="null">print(df['ПодразделениЯ'])
Результат: 
KeyError: 'ПодразделениЯ'

print(df['Номенклатура','Подразделение'])
Результат:
KeyError: ('Номенклатура', 'Подразделение')</pre>
<p>В первом случае должно стоять <code class="EnlighterJSRAW">print(df['Подразделение'])</code>. А во-втором случае: <code class="EnlighterJSRAW" data-enlighter-language="null">print(df[['Номенклатура','Подразделение']])</code>.</p>
<h2>Выборка данных из Pandas DataFrame с помощью .loc</h2>
<p><span>В </span><strong class="hd js">.loc </strong><span>индексатор выбирает данные по-другому, чем просто оператор индексации. Он может выбирать подмножества строк и/или столбцов. Самое главное, он выбирает данные только по </span><strong class="hd js"><span>метке</span></strong><span><strong> (label)</strong> строк и столбцов.</span></p>
<h3 id="a176" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Выберем одну строку как Series с .loc</span></h3>
<p id="0a00" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span></span><strong class="hd js">.loc &#8212; </strong><span>Индексатор возвращает одну строку в серии, когда указали одну метку строки (один индекс).</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df.loc[0])</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Дата                 01.01.2016
Подразделение      Отдел продаж
Контрагент           Абакус ООО
Менеджер                 Петров
Номенклатура               Лыжи
Продажи             956898,3051
Себестоимость       621983,8983
Валовая прибыль     334914,4068
Name: 0, dtype: object</pre>
<p>Теперь у нас есть Series, где старые имена столбцов теперь являются индексными метками.</p>
<h3 id="8c75" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Выбираем несколько строк из DataFrame с помощью .loc</span></h3>
<p id="1ffb" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>Чтобы выбрать несколько строк, поместите все метки строк, которые вы хотите выбрать, в список и передайте их <strong>.loc</strong></span><span>. Давайте выберем 3 и 20</span><span>.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df.loc[[3,20]])</pre>
<p data-selectable-paragraph=""><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">          Дата      Подразделение  ... Себестоимость Валовая прибыль
3   01.01.2016  Отдел продвижения  ...   55859,11017     18619,70339
20  01.01.2016       Отдел продаж  ...   80585,27542     26861,75847

[2 rows x 8 columns]</pre>
<h3 id="8449" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Обозначение среза для выборки диапазона строк с .loc</span></h3>
<p id="0752" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>Можно «нарезать» строки DataFrame с </span><code class="gw gx gy gz ha b">.loc</code><span>помощью </span><strong class="hd js"><span>нотации среза</span></strong><span>. Для обозначения среза используется двоеточие для разделения значений </span><strong class="hd js"><span>начала</span></strong><span>, </span><strong class="hd js"><span>остановки</span></strong><span> и </span><strong class="hd js"><span>шага</span></strong><span> . Например, мы можем выбрать все строки из с 134 по 139</span><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df.loc[134:139])</pre>
<p data-selectable-paragraph=""><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">           Дата      Подразделение  ... Себестоимость Валовая прибыль
134  01.01.2016  Отдел продвижения  ...   560,5932203     62,28813559
135  01.01.2016       Отдел продаж  ...   625773,3051     268188,5593
136  01.01.2016  Отдел продвижения  ...   508671,6102     218002,1186
137  01.01.2016  Отдел продвижения  ...   1034427,966     443326,2712
138  01.01.2016  Отдел продвижения  ...   55792,37288     18597,45763
139  01.01.2016  Отдел продвижения  ...   8477,542373     941,9491525

[6 rows x 8 columns]</pre>
<h4 id="6c5f" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>.loc включает в себя последнее значение из обозначения среза</span></h4>
<p id="88ad" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>Обратите внимание, что строка с пометкой 139 в примере без шага </span><span>была выведена. В других контейнерах данных, таких как списки Python, последнее значение исключается.</span></p>
<h4>Вывод среза с использованием .loc и шага из DataFrame</h4>
<p data-selectable-paragraph="">Выведем тот же самый результат, только будем выводить каждый второй элемент из среза:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df.loc[134:139:2])</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">           Дата      Подразделение  ... Себестоимость Валовая прибыль
134  01.01.2016  Отдел продвижения  ...   560,5932203     62,28813559
136  01.01.2016  Отдел продвижения  ...   508671,6102     218002,1186
138  01.01.2016  Отдел продвижения  ...   55792,37288     18597,45763

[3 rows x 8 columns]</pre>
<h4>Выбор до указанной позиции .loc</h4>
<p><strong>Пример скрипта Python 3 для вывода 139 первых строк из Pandas DataFrame:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df.loc[:139])</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">           Дата      Подразделение  ... Себестоимость Валовая прибыль
0    01.01.2016       Отдел продаж  ...   621983,8983     334914,4068
1    01.01.2016  Отдел продвижения  ...   1289364,407     552584,7458
2    01.01.2016  Отдел продвижения  ...    736779,661     315762,7119
3    01.01.2016  Отдел продвижения  ...   55859,11017     18619,70339
..          ...                ...  ...           ...             ...
136  01.01.2016  Отдел продвижения  ...   508671,6102     218002,1186
137  01.01.2016  Отдел продвижения  ...   1034427,966     443326,2712
138  01.01.2016  Отдел продвижения  ...   55792,37288     18597,45763
139  01.01.2016  Отдел продвижения  ...   8477,542373     941,9491525

[140 rows x 8 columns]</pre>
<p>Тот же самый пример, но выведем с шагом 25:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df.loc[:139:25])</pre>
<p><strong>Результат выполнения выборки данных из Pandas DataFrame:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">           Дата      Подразделение  ... Себестоимость Валовая прибыль
0    01.01.2016       Отдел продаж  ...   621983,8983     334914,4068
25   01.01.2016       Отдел продаж  ...   12813,55932     5491,525424
50   01.01.2016       Отдел продаж  ...   42978,81356     14326,27119
75   01.01.2016  Отдел продвижения  ...   6246,610169     694,0677966
100  01.01.2016  Отдел продвижения  ...   89694,91525     38440,67797
125  01.01.2016  Отдел продвижения  ...   879864,4068     377084,7458

[6 rows x 8 columns]</pre>
<h4>Выбор с указанной позиции до конца DataFrame через .loc</h4>
<p><strong>Полный код вывода данных из Pandas DataFrame:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df.loc[2660:])</pre>
<p><strong>Результат запроса к DataFrame:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">            Дата      Подразделение  ... Себестоимость Валовая прибыль
2660  01.12.2017       Отдел продаж  ...   762,7118644     84,74576271
2661  01.12.2017       Отдел продаж  ...   381,3559322     42,37288136
2662  01.12.2017       Отдел продаж  ...  -9915,254237    -5338,983051
2663  01.12.2017       Отдел продаж  ...   5314576,271     2861694,915
2664  01.12.2017       Отдел продаж  ...   154067,7966     17118,64407
2665  01.12.2017  Отдел продвижения  ...   15254,23729     1694,915254
2666  01.12.2017  Отдел продвижения  ...   9915,254237     5338,983051
2667  01.12.2017  Отдел продвижения  ...   1083686,441     361228,8136
2668  01.12.2017  Отдел продвижения  ...   3050,847458     338,9830508

[9 rows x 8 columns]</pre>
<p>Тот же пример, но с шагом 3 (<strong>вывод каждого третьего элемента из Pandas DataFrame с использованием .iloc[]</strong>):</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df.loc[2660::3])</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">            Дата      Подразделение  ... Себестоимость Валовая прибыль
2660  01.12.2017       Отдел продаж  ...   762,7118644     84,74576271
2663  01.12.2017       Отдел продаж  ...   5314576,271     2861694,915
2666  01.12.2017  Отдел продвижения  ...   9915,254237     5338,983051

[3 rows x 8 columns]</pre>
<h3 id="472b" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv">Выбор строк и столбцов одновременно с .loc</h3>
<p id="2a14" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>В отличие от просто оператора индексирования, можно выбирать строки и столбцы одновременно с </span><code class="gw gx gy gz ha b">.loc</code><span>. Вы делаете это, разделяя выбранные строки и столбцы </span><strong class="hd js"><span>запятой</span></strong><span>. Это будет выглядеть примерно так:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">df.loc [row_selection, column_selection]</pre>
<p><strong>Пример запроса на Python 3:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df.loc[[150,163],['Подразделение','Менеджер','Продажи']])</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">         Подразделение Менеджер      Продажи
150       Отдел продаж   Петров   1067796,61
163  Отдел продвижения  Сидоров  13665,25424</pre>
<h3 id="b8d6" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Используйте любую комбинацию выбора для строки или столбца с .loc</span></h3>
<p id="952c" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>Выбор строки или столбца может быть совершен любым из следующих способов:</span></p>
<ul class="">
<li id="7ed7" class="hb hc cn ar hd b he hp hg hq hi hr hk hs hm ht ho is hv hw" data-selectable-paragraph=""><span>Один ярлык</span></li>
<li id="3f7f" class="hb hc cn ar hd b he ib hg ic hi id hk ie hm if ho is hv hw" data-selectable-paragraph=""><span>Список ярлыков</span></li>
<li id="8fef" class="hb hc cn ar hd b he ib hg ic hi id hk ie hm if ho is hv hw" data-selectable-paragraph=""><span>slice с метками</span></li>
</ul>
<p id="a767" class="hb hc cn ar hd b he hp hg hq hi hr hk hs hm ht ho" data-selectable-paragraph=""><span>Мы можем использовать любой из этих трех вариантов для выбора строки или столбца с помощью </span><code class="gw gx gy gz ha b"></code><strong class="hd js">.loc</strong><span>. Давайте посмотрим несколько примеров.</span></p>
<p data-selectable-paragraph=""><strong>Пример 1 &#171;Выборка данных из Pandas DataFrame&#187;:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df.loc[150:163:3,['Подразделение','Менеджер','Продажи']])</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">         Подразделение  Менеджер      Продажи
150       Отдел продаж    Петров   1067796,61
153  Отдел продвижения  Добряков  82944,91525
156  Отдел продвижения  Добряков  85023,30508
159       Отдел продаж    Петров  499385,5932
162  Отдел продвижения   Сидоров  130805,0847</pre>
<h3 id="281b" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Выбор строк и столбцов через переменные</span></h3>
<p id="5371" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>Гораздо проще назначить список строк и столбцов переменным перед использованием в </span><code class="gw gx gy gz ha b">.loc</code><span>. Это полезно, если вы выбираете много строк или столбцов:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

rows = [59, 134, 1045]
columns = ['Контрагент', 'Номенклатура', 'Продажи'] 
print(df.loc[rows, columns])</pre>
<p data-selectable-paragraph=""><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">        Контрагент Номенклатура      Продажи
59        ИП Лусон   Велосипеды  1139110,169
134        Союз АО       Прочее  622,8813559
1045  Эсвольтр ООО       Прочее  2915,254237</pre>
<p data-selectable-paragraph=""><strong>Пример параметризации с slice:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

iStart = 59
iEnd = 134
iStep = 7
columns = ['Контрагент', 'Номенклатура', 'Продажи'] 
print(df.loc[iStart:iEnd:iStep, columns])</pre>
<p data-selectable-paragraph=""><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

iStart = 59
iEnd = 134
iStep = 7
columns = ['Контрагент', 'Номенклатура', 'Продажи'] 
print(df.loc[iStart:iEnd:iStep, columns])</pre>
<h2 id="2864" class="hb hc cn ar hd b he hp hg hq hi hr hk hs hm ht ho">Выборка данных из Pandas DataFrame с помощью индексатора .iloc[]</h2>
<p>.iloc индексатор очень похож на .loc, но использует только целое число позиций, по которым необходимо сделать выборку.</p>
<h3>Выбор одной строки при помощи .iloc</h3>
<p><span>Передав одно целое число в </span><code class="gw gx gy gz ha b">.iloc</code><span>, он выберет одну строку в качестве ряда:</span></p>
<p><strong>Код запроса:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df.iloc[5])</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Дата                  01.01.2016
Подразделение       Отдел продаж
Контрагент         Билли Боб ООО
Менеджер                Илинская
Номенклатура               Доски
Продажи              1263241,525
Себестоимость        884269,0678
Валовая прибыль      378972,4576
Name: 5, dtype: object</pre>
<h3 id="3c23" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Выбор нескольких строк с .iloc</span></h3>
<p id="bc35" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>Используйте список целых чисел, чтобы выбрать несколько строк:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df.iloc[[5,45,876]])</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">           Дата      Подразделение  ... Себестоимость Валовая прибыль
5    01.01.2016       Отдел продаж  ...   884269,0678     378972,4576
45   01.01.2016       Отдел продаж  ...   162972,4576     69845,33898
876  01.08.2016  Отдел продвижения  ...   444322,0339     190423,7288

[3 rows x 8 columns]</pre>
<h3 id="c375" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv"><span>Выборка диапазона строк через указание среза в .iloc</span></h3>
<p id="e0e5" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph=""><span>В случае с .iloc нотация слайса работает так же, как и список, и исключает последний элемент.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df.iloc[5:9])</pre>
<p data-selectable-paragraph=""><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">         Дата      Подразделение  ... Себестоимость Валовая прибыль
5  01.01.2016       Отдел продаж  ...   884269,0678     378972,4576
6  01.01.2016       Отдел продаж  ...   16517,47881     5505,826271
7  01.01.2016       Отдел продаж  ...   1098,305085     122,0338983
8  01.01.2016  Отдел продвижения  ...   22957,62712     9838,983051

[4 rows x 8 columns]</pre>
<h1 id="8023" class="gi gj cn ar aq gk gl gm gn go gp gq gr gs gt gu gv" data-selectable-paragraph=""><span>Выбор строк и столбцов одновременно в .iloc</span></h1>
<p id="0485" class="hb hc cn ar hd b he hf hg hh hi hj hk hl hm hn ho" data-selectable-paragraph="">Рассмотрим несколько примеров, чтобы понять, чем отличается .iloc от .loc.</p>
<p id="e2d4" class="hb hc cn ar hd b he hp hg hq hi hr hk hs hm ht ho" data-selectable-paragraph=""><span>Выберем две строки и два столбца:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df.iloc[[2,3], [0,3]])</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">         Дата Менеджер
2  01.01.2016  Сидоров
3  01.01.2016  Сидоров</pre>
<p>Осуществим выборку строк и столбцов с помощью среза:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df.iloc[2:9, 0:3])</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">         Дата      Подразделение     Контрагент
2  01.01.2016  Отдел продвижения     Абакус ООО
3  01.01.2016  Отдел продвижения     Абакус ООО
4  01.01.2016       Отдел продаж  Билли Боб ООО
5  01.01.2016       Отдел продаж  Билли Боб ООО
6  01.01.2016       Отдел продаж  Билли Боб ООО
7  01.01.2016       Отдел продаж  Билли Боб ООО
8  01.01.2016  Отдел продвижения  Билли Боб ООО</pre>
<p><strong>Выберем 1 значение из столбца и указанной колонки:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd
import numpy as np

df = pd.read_csv('D:\#python#\example\SampleData_Pandas.csv', sep=';')

print(df.loc[3, 4])</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Палатки</pre>
<h2>Резюме по .loc и .iloc</h2>
<p><strong>Доступ к строкам и колонкам по индексу возможен несколькими способами:</strong></p>
<ul>
<li><strong>.loc</strong> &#8212; используется для доступа по строковой метке &#8212; т.е. фактически по значению индекса и по названию столбца</li>
<li><strong>.iloc</strong> &#8212; используется для доступа по числовому значению (начиная от 0) &#8212; т.е. по номеру строки и номеру столбца</li>
</ul>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Pandas_DataFrame_Python3_For_Data_Science.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Pandas_DataFrame_Python3_For_Data_Science.png" alt="" width="2339" height="1654" class="aligncenter size-full wp-image-303" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Pandas_DataFrame_Python3_For_Data_Science.png 2339w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Pandas_DataFrame_Python3_For_Data_Science-300x212.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Pandas_DataFrame_Python3_For_Data_Science-768x543.png 768w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Pandas_DataFrame_Python3_For_Data_Science-1024x724.png 1024w" sizes="(max-width: 2339px) 100vw, 2339px" /></a></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Pandas_DataFrame_Python_selections_and_indexing.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Pandas_DataFrame_Python_selections_and_indexing.png" alt="" width="1400" height="1000" class="aligncenter size-full wp-image-304" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Pandas_DataFrame_Python_selections_and_indexing.png 1400w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Pandas_DataFrame_Python_selections_and_indexing-300x214.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Pandas_DataFrame_Python_selections_and_indexing-768x549.png 768w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Pandas_DataFrame_Python_selections_and_indexing-1024x731.png 1024w" sizes="(max-width: 1400px) 100vw, 1400px" /></a></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/cheat_sheet_pandas_dataframe_object.jpg"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/cheat_sheet_pandas_dataframe_object.jpg" alt="" width="1120" height="1576" class="aligncenter size-full wp-image-305" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/cheat_sheet_pandas_dataframe_object.jpg 1120w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/cheat_sheet_pandas_dataframe_object-213x300.jpg 213w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/cheat_sheet_pandas_dataframe_object-768x1081.jpg 768w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/cheat_sheet_pandas_dataframe_object-728x1024.jpg 728w" sizes="(max-width: 1120px) 100vw, 1120px" /></a></p>
<h2 class="entry-title"><span>Как выбрать строки из Pandas DataFrame по условию</span></h2>
<p>Собираем тестовый набор данных для иллюстрации работы выборки по условию</p>
<table width="179">
<tbody>
<tr>
<td width="52"><strong>Color</strong></td>
<td width="79"><strong>Shape</strong></td>
<td width="48"><strong>Price</strong></td>
</tr>
<tr>
<td width="52">Green</td>
<td width="79">Rectangle</td>
<td width="48">10</td>
</tr>
<tr>
<td width="52">Green</td>
<td width="79">Rectangle</td>
<td width="48">15</td>
</tr>
<tr>
<td width="52">Green</td>
<td width="79">Square</td>
<td width="48">5</td>
</tr>
<tr>
<td width="52">Blue</td>
<td width="79">Rectangle</td>
<td width="48">5</td>
</tr>
<tr>
<td width="52">Blue</td>
<td width="79">Square</td>
<td width="48">10</td>
</tr>
<tr>
<td width="52">Red</td>
<td width="79">Square</td>
<td width="48">15</td>
</tr>
<tr>
<td width="52">Red</td>
<td width="79">Square</td>
<td width="48">15</td>
</tr>
<tr>
<td width="52">Red</td>
<td width="79">Rectangle</td>
<td width="48">5</td>
</tr>
</tbody>
</table>
<p><strong>Пишем скрипт:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd

Boxes = {'Color': ['Green','Green','Green','Blue','Blue','Red','Red','Red'],
         'Shape': ['Rectangle','Rectangle','Square','Rectangle','Square','Square','Square','Rectangle'],
         'Price': [10,15,5,5,10,15,15,5]
        }

df = pd.DataFrame(Boxes, columns= ['Color','Shape','Price'])
print (df)</pre>
<p>Результат выполнения:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">   Color      Shape  Price
0  Green  Rectangle     10
1  Green  Rectangle     15
2  Green     Square      5
3   Blue  Rectangle      5
4   Blue     Square     10
5    Red     Square     15
6    Red     Square     15
7    Red  Rectangle      5</pre>
<h3>Синтаксис выборки строк из Pandas DataFrame по условию</h3>
<p><span>Вы можете использовать следующую логику для выбора строк в Pandas DataFrame по условию:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df.loc[df.column name condition]</pre>
<p><span>Например, если вы хотите получить строки с </span><em><span>зеленым цветом</span></em><span> , вам нужно применить:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">df.loc[df.Color == 'Green']</pre>
<p><span>Где:</span></p>
<ul>
<li><span><strong>Color</strong> &#8212; это название столбца</span></li>
<li><span><strong>Green</strong> &#8212; это условие (значение колонки)</span></li>
</ul>
<p><span>А вот полный код Python для нашего примера:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd

Boxes = {'Color': ['Green','Green','Green','Blue','Blue','Red','Red','Red'],
         'Shape': ['Rectangle','Rectangle','Square','Rectangle','Square','Square','Square','Rectangle'],
         'Price': [10,15,5,5,10,15,15,5]
        }

df = pd.DataFrame(Boxes, columns= ['Color','Shape','Price'])
print (df.loc[df.Color == 'Green'])</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">   Color      Shape  Price
0  Green  Rectangle     10
1  Green  Rectangle     15
2  Green     Square      5</pre>
<h3><span>Выберем строки, где цена равна или больше 10</span></h3>
<p><span>Чтобы получить все строки, где цена равна или больше 10, Вам нужно применить следующее условие:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df.loc[df.Price &gt;= 10]</pre>
<p><span>Полный код Python:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd

Boxes = {'Color': ['Green','Green','Green','Blue','Blue','Red','Red','Red'],
         'Shape': ['Rectangle','Rectangle','Square','Rectangle','Square','Square','Square','Rectangle'],
         'Price': [10,15,5,5,10,15,15,5]
        }

df = pd.DataFrame(Boxes, columns= ['Color','Shape','Price'])

print (df.loc[df.Price &gt;= 10])</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">   Color      Shape  Price
0  Green  Rectangle     10
1  Green  Rectangle     15
4   Blue     Square     10
5    Red     Square     15
6    Red     Square     15</pre>
<h3>Выберем строки, в которых цвет зеленый, а форма &#8212; прямоугольник</h3>
<p><span>Теперь цель состоит в том, чтобы выбрать строки на основе </span><em><span>двух</span></em><span> условий:</span></p>
<ul>
<li><span>Color зеленый; </span><em><span>а также</span></em></li>
<li><span>Shape = прямоугольник</span></li>
</ul>
<p><span>Мы будем использовать символ </span><span><strong>&amp;</strong></span><span> для применения нескольких условий. В нашем примере код будет выглядеть так:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">df.loc[(df.Color == 'Green') &amp; (df.Shape == 'Rectangle')]</pre>
<p><strong>Полный код примера Python для выборки Pandas DataFrame:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd

Boxes = {'Color': ['Green','Green','Green','Blue','Blue','Red','Red','Red'],
         'Shape': ['Rectangle','Rectangle','Square','Rectangle','Square','Square','Square','Rectangle'],
         'Price': [10,15,5,5,10,15,15,5]
        }

df = pd.DataFrame(Boxes, columns= ['Color','Shape','Price'])

print (df.loc[(df.Color == 'Green') &amp; (df.Shape == 'Rectangle')])
</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">   Color      Shape  Price
0  Green  Rectangle     10
1  Green  Rectangle     15</pre>
<h3>Выберем строки, где цвет зеленый ИЛИ форма прямоугольная</h3>
<p><span>Для достижения этой цели будем использовать</span><span> </span><span>символ | следующим образом:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df.loc[(df.Color == 'Green') | (df.Shape == 'Rectangle')]</pre>
<p><strong>Полный код Python 3:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">import pandas as pd

Boxes = {'Color': ['Green','Green','Green','Blue','Blue','Red','Red','Red'],
         'Shape': ['Rectangle','Rectangle','Square','Rectangle','Square','Square','Square','Rectangle'],
         'Price': [10,15,5,5,10,15,15,5]
        }

df = pd.DataFrame(Boxes, columns= ['Color','Shape','Price'])

print (df.loc[(df.Color == 'Green') | (df.Shape == 'Rectangle')])</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">   Color      Shape  Price<br />0  Green  Rectangle     10<br />1  Green  Rectangle     15<br />2  Green     Square      5<br />3   Blue  Rectangle      5<br />7    Red  Rectangle      5</pre>
<h3>Выберем строки, где цена не равна 15</h3>
<p>Мы будем использовать комбинацию символов !=, чтобы выбрать строки, цена которых не равна 15:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df.loc[df.Price != 15]</pre>
<p><strong>Полный код Pandas DF на питоне:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pandas as pd

Boxes = {'Color': ['Green','Green','Green','Blue','Blue','Red','Red','Red'],
         'Shape': ['Rectangle','Rectangle','Square','Rectangle','Square','Square','Square','Rectangle'],
         'Price': [10,15,5,5,10,15,15,5]
        }

df = pd.DataFrame(Boxes, columns= ['Color','Shape','Price'])

print (df.loc[df.Price != 15])</pre>
<p><strong>Результат работы скрипта Python:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">   Color      Shape  Price
0  Green  Rectangle     10
2  Green     Square      5
3   Blue  Rectangle      5
4   Blue     Square     10
7    Red  Rectangle      5</pre>
<h1><strong>Data Wrangling with Pandas</strong></h1>
<ul>
<li><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Data_Wrangling_Pandas_Cheat_Sheet.pdf">Data Wrangling Pandas Cheat Sheet.pdf</a></li>
<li><a href="https://towardsdatascience.com/data-wrangling-with-pandas-5b0be151df4e" target="_blank" rel="noopener noreferrer">Data Wrangling With Pandas</a></li>
</ul>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Data_Wrangling_Pandas_Cheat_Sheet_1.png" target="_blank" rel="noopener noreferrer"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Data_Wrangling_Pandas_Cheat_Sheet_1.png" alt="" width="3056" height="2362" class="aligncenter wp-image-311 size-full" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Data_Wrangling_Pandas_Cheat_Sheet_1.png 3056w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Data_Wrangling_Pandas_Cheat_Sheet_1-300x232.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Data_Wrangling_Pandas_Cheat_Sheet_1-768x594.png 768w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Data_Wrangling_Pandas_Cheat_Sheet_1-1024x791.png 1024w" sizes="(max-width: 3056px) 100vw, 3056px" /></a> <a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Data_Wrangling_Pandas_Cheat_Sheet_2.png" target="_blank" rel="noopener noreferrer"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Data_Wrangling_Pandas_Cheat_Sheet_2.png" alt="" width="3056" height="2362" class="aligncenter wp-image-312 size-full" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Data_Wrangling_Pandas_Cheat_Sheet_2.png 3056w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Data_Wrangling_Pandas_Cheat_Sheet_2-300x232.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Data_Wrangling_Pandas_Cheat_Sheet_2-768x594.png 768w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/Data_Wrangling_Pandas_Cheat_Sheet_2-1024x791.png 1024w" sizes="(max-width: 3056px) 100vw, 3056px" /></a></p>
<h2><strong>Обработка данных с помощью Pandas (<span style="color: #ff6600;">Data Wrangling</span>)</strong></h2>
<p>Обработка данных является одной из важнейших задач в data science и анализе данных, которая включает такие операции, как:</p>
<ul>
<li><strong>Dealing with missing values (Работа с пропущенными значениями)</strong> &#8212; количественная оценка пропущенных значений для каждого столбца, заполнение и удаление пропущенных значений.</li>
<li><strong>Reshaping data (Изменение формы данных)</strong> &#8212; единая кодировка данных, сводные таблицы, объединения, группировка и агрегирование.</li>
<li><strong>Data Sorting (Сортировка данных)</strong>: упорядочивание значений в порядке возрастания или убывания.</li>
<li><strong>Data Filtration (Фильтрация данных)</strong>: создание подмножества данных согласно тем или иным условиям.</li>
<li><strong>Data deduplication (Дедупликация данных)</strong> &#8212; это технология поиска и устранения дубликатов в хранилищах данных. Применяется для снижения накладные расходов на хранение информации.</li>
<li><strong>Data Reduction (Понижение размерности/Сокращение данных)</strong>: Уменьшение объема данных, сокращение количества используемых признаков и разнообразия их значений. Применяется в случае, когда данные избыточны. Избыточность возникает тогда, когда задачу анализа можно решить с тем же уровнем эффективности и точности, но используя меньшую размерность данных. Это позволяет сократить время и вычислительные затраты на решение задачи, сделать данные и результаты их анализа более интерпретируемыми и понятными для пользователя.</li>
<li><strong>Data Access (Доступ к данным)</strong>: для чтения или записи файлов данных.</li>
<li><strong>Data Handling/Data Processing (Обработка данных) или Data Transformation (преобразование данных)</strong>: выполнение агрегации, статистических и подобных операций над конкретными значениями.</li>
<li><strong>Другое:</strong> Создание описательных столбцов, поэлементные условные операции.</li>
</ul>
<h3><strong>Concatenation DataFrame</strong></h3>
<p>todo</p>
<h3><strong>Joining DataFrame</strong></h3>
<p>todo</p>
<h3><strong>Merging DataFrame</strong></h3>
<p>todo</p>
<h3><strong>Pivot &amp; Melt (Unpivot) DataFrame</strong></h3>
<p>todo</p>
<h3><strong>GroupBy Операции</strong></h3>
<p>todo</p>
<h3><strong>Применение Lambda функции в DataFrame</strong></h3>
<p>todo</p>
<h1 class="eg b eh eo ef"><strong>10 трюков Python Pandas, которые сделают вашу работу более эффективной</strong></h1>
<p><span><strong>Pandas</strong> &#8212; это широко используемый пакет Python для структурированных данных.</span></p>
<h2 id="893e" class="hw hx ef at as hy hz ia ib ic id ie if ig ih ii ij"><strong>read_csv</strong></h2>
<p id="6600" class="hi hj ef at hk b hl ik hn il hp im hr in ht io hv" data-selectable-paragraph=""><span>Все знают эту команду. Но данные, которые вы пытаетесь прочитать, велики, попробуйте добавить этот аргумент: </span><strong class="hk ip"><span>nrows = 5,</span></strong><span> чтобы загружать только часть данных. Тогда вы можете избежать ошибки, выбрав неправильный разделитель (он не всегда может быть разделен запятой).</span></p>
<p id="6108" class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span>(Или вы можете использовать команду &#8216;head&#8217; в linux, чтобы проверить первые 5 строк (скажем) в любом текстовом файле: </span><strong class="hk ip"><span>head -n 5 data.txt</span></strong><span>)</span></p>
<p id="5e92" class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span>Затем вы можете извлечь список столбцов, используя </span><code class="gt iq ir is it b">df.columns.tolist()</code><span>для извлечения всех столбцов, а затем добавить </span><strong class="hk ip"><span>аргумент usecols = [&#8216;c1&#8217;, &#8216;c2&#8217;,…],</span></strong><span> чтобы загрузить нужные вам столбцы. </span></p>
<p class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span>Кроме того, если вы знаете типы данных нескольких определенных столбцов, вы можете добавить аргумент </span><strong class="hk ip"><span>dtype = {&#8216;c1&#8217;: str, &#8216;c2&#8217;: int,…},</span></strong><span> чтобы он загружался быстрее. </span></p>
<p class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span>Еще одно преимущество этого аргумента в том, что если у вас есть столбец, который содержит как строки, так и числа, рекомендуется объявить его тип строковым, чтобы не возникало ошибок при попытке объединить таблицы, используя этот столбец в качестве ключа.</span></p>
<h2 id="51fd" class="hw hx ef at as hy hz ia ib ic id ie if ig ih ii ij"><strong>select_dtypes</strong></h2>
<p id="fe3b" class="hi hj ef at hk b hl ik hn il hp im hr in ht io hv" data-selectable-paragraph=""><span>Если предварительная обработка данных должна выполняться в <strong>Python</strong>, эта команда сэкономит вам время. После чтения в таблице типами данных по-умолчанию для каждого столбца могут быть bool, int64, float64, object, category, timedelta64 или datetime64. Вы можете сначала проверить распределение по</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df.dtypes.value_counts()</pre>
<p id="e108" class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span>чтобы узнать все возможные типы данных вашего DataFrame</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">df.select_dtypes(include=['float64', 'int64'])</pre>
<p id="10fb" class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span>выбрать sub-dataframe только с числовыми характеристиками.</span></p>
<h2 id="ee83" class="hw hx ef at as hy hz ia ib ic id ie if ig ih ii ij">copy()</h2>
<p id="df2a" class="hi hj ef at hk b hl ik hn il hp im hr in ht io hv" data-selectable-paragraph=""><span>Это важная команда, если вы еще не слышали о ней. Если вы выполните следующие команды:</span></p>
<pre class="gd ge gf gg gh iu iv cm">import pandas as pd<br />df1 = pd.DataFrame({ 'a':[0,0,0], 'b': [1,1,1]})<br />df2 = df1<br />df2['a'] = df2['a'] + 1<br />df1.head()</pre>
<p id="e7ea" class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span>Вы обнаружите, что <strong>df1</strong> изменен. Это потому, что <strong>df2 = df1</strong> не делает копию <strong>df1</strong> и присваивает ее <strong>df2</strong>, но устанавливает указатель, указывающий на <strong>df1</strong>. Таким образом, любые изменения в <strong>df2</strong> приведут к изменениям в <strong>df1</strong>. Чтобы это исправить, вы можете сделать либо</span></p>
<pre class="gd ge gf gg gh iu iv cm">df2 = df1.copy()</pre>
<p id="eafe" class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span>или же</span></p>
<pre class="gd ge gf gg gh iu iv cm">from copy import deepcopy<br />df2 = deepcopy(df1)</pre>
<h2 id="be19" class="hw hx ef at as hy hz ia ib ic id ie if ig ih ii ij"><span>map()</span></h2>
<p id="0a1f" class="hi hj ef at hk b hl ik hn il hp im hr in ht io hv" data-selectable-paragraph=""><span>Это классная команда для простого преобразования данных. Сначала вы определяете словарь, в котором «ключами» являются старые значения, а «значениями» являются новые значения.</span></p>
<pre class="gd ge gf gg gh iu iv cm">level_map = {1: 'high', 2: 'medium', 3: 'low'}<br />df['c_level'] = df['c'].map(level_map)</pre>
<p id="1b9c" class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span><strong>Некоторые примеры:</strong> </span></p>
<p class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span>True, False до 1, 0 (для моделирования); определение уровней; определяемые пользователем лексические кодировки.</span></p>
<h2 id="0efe" class="hw hx ef at as hy hz ia ib ic id ie if ig ih ii ij">apply or not apply?</h2>
<p id="1a4c" class="hi hj ef at hk b hl ik hn il hp im hr in ht io hv" data-selectable-paragraph=""><span>Если мы хотим создать новый столбец с несколькими другими столбцами в качестве входных данных, функция apply иногда будет весьма полезна.</span></p>
<pre class="gd ge gf gg gh iu iv cm">def rule(x, y):<br />    if x == 'high' and y &gt; 10:<br />         return 1<br />    else:<br />         return 0<br />df = pd.DataFrame({ 'c1':[ 'high' ,'high', 'low', 'low'], 'c2': [0, 23, 17, 4]})<br />df['new'] = df.apply(lambda x: rule(x['c1'], x['c2']), axis =  1)<br />df.head()</pre>
<p id="1a16" class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span>В приведенных выше кодах мы определяем функцию с двумя входными переменными и используем функцию <strong>apply</strong>, чтобы применить ее к столбцам <strong>&#8216;c1&#8217;</strong> и <strong>&#8216;c2&#8217;</strong>.</span></p>
<p id="8ae2" class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span>Но </span><strong class="hk ip"><span>проблема «apply» в том , что иногда он слишком медленный</span></strong><span> . Скажем, если вы хотите вычислить максимум из двух столбцов <strong>«c1»</strong> и <strong>«c2»</strong>, конечно, вы можете сделать</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df['maximum'] = df.apply(lambda x: max(x['c1'], x['c2']), axis = 1)</pre>
<p class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><code class="gt iq ir is it b"></code><span>но вы найдете это намного медленнее, чем эта команда:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df['maximum'] = df[['c1','c2']].max(axis =1)</pre>
<p id="98d2" class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><strong class="hk ip"><span>Вывод</span></strong><span>: не используйте apply, если вы можете выполнить ту же работу с другими встроенными функциями (они часто быстрее). Например, если вы хотите округлить колонку «с» целыми числами, делать </span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">round(df[‘c’], 0)</pre>
<p class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span>или </span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">df[‘c’].round(0)</pre>
<p class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span>Вместо использования функции применяются: </span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df.apply(lambda x: round(x['c'], 0), axis = 1)</pre>
<h2 id="380f" class="hw hx ef at as hy hz ia ib ic id ie if ig ih ii ij">value counts</h2>
<p id="0012" class="hi hj ef at hk b hl ik hn il hp im hr in ht io hv" data-selectable-paragraph=""><span>Это команда для проверки распределения значений. Например, если вы хотите проверить возможные значения и частоту для каждого отдельного значения в столбце «c», вы можете сделать</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df['c'].value_counts()</pre>
<p id="92e3" class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span>Есть несколько полезных трюков / аргументов:</span><br /><span></span></p>
<ol>
<li><span><strong class="hk ip">normalize = True</strong></span><span>: если вы хотите проверить частоту вместо количества.</span><br /><span></span></li>
<li><span><strong class="hk ip">dropna = False</strong></span><span>: если вы также хотите включить пропущенные значения в статистику.</span><br /><span></span></li>
<li><code class="gt iq ir is it b">df['c'].value_counts().reset_index()</code><span>.: если вы хотите преобразовать таблицу статистики в кадр данных pandas и манипулировать ею</span><br /><span></span></li>
<li><code class="gt iq ir is it b">df['c'].value_counts().sort_index()</code><span>: показать статистику, отсортированную по разным значениям, в столбце «c» вместо счетчиков.</span></li>
</ol>
<h2 id="9d7c" class="hw hx ef at as hy hz ia ib ic id ie if ig ih ii ij"><span>number of missing values &#8212; количество пустых значений</span></h2>
<p id="74b7" class="hi hj ef at hk b hl ik hn il hp im hr in ht io hv" data-selectable-paragraph=""><span>При построении моделей может потребоваться исключить строку со слишком большим количеством пропущенных значений / строки со всеми пропущенными значениями. Вы можете использовать <strong>.isnull()</strong> и <strong>.sum()</strong> для подсчета количества пропущенных значений в указанных столбцах.</span></p>
<pre class="gd ge gf gg gh iu iv cm">import pandas as pd<br />import numpy as np<br />df = pd.DataFrame({ 'id': [1,2,3], 'c1':[0,0,np.nan], 'c2': [np.nan,1,1]})<br />df = df[['id', 'c1', 'c2']]<br />df['num_nulls'] = df[['c1', 'c2']].isnull().sum(axis=1)<br />df.head()</pre>
<h2 id="b2a7" class="hw hx ef at as hy hz ia ib ic id ie if ig ih ii ij"><span>выбрать строки с конкретными идентификаторами (select rows with specific IDs)</span></h2>
<p id="a7d2" class="hi hj ef at hk b hl ik hn il hp im hr in ht io hv" data-selectable-paragraph=""><span>В SQL мы можем сделать это, используя <strong>SELECT * FROM … WHERE ID in (‘A001’, ‘C022’, …)</strong>, чтобы получить записи с конкретными идентификаторами. Если вы хотите сделать то же самое с Pandas, вы можете сделать</span></p>
<pre class="gd ge gf gg gh iu iv cm">df_filter = df['ID'].isin(['A001','C022',...])<br />df[df_filter]</pre>
<h2 id="261c" class="hw hx ef at as hy hz ia ib ic id ie if ig ih ii ij"><span>Процентильные группы (Percentile groups)</span></h2>
<p id="c90c" class="hi hj ef at hk b hl ik hn il hp im hr in ht io hv" data-selectable-paragraph=""><span>У вас есть числовой столбец, и вы хотите классифицировать значения в этом столбце по группам, скажем, верхние 5% в группе 1, 5–20% в группе 2, 20–50% в группе 3, нижние 50% в группе 4 Конечно, вы можете сделать это с помощью pandas.cut, но я бы хотел предоставить здесь другую опцию:</span></p>
<pre class="gd ge gf gg gh iu iv cm">import numpy as np<br />cut_points = [np.percentile(df['c'], i) for i in [50, 80, 95]]<br />df['group'] = 1<br />for i in range(3):<br />    df['group'] = df['group'] + (df['c'] &lt; cut_points[i])<br /># or &lt;= cut_points[i]</pre>
<p id="d775" class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span>который быстро запускается (не применяется функция apply).</span></p>
<h2 id="5535" class="hw hx ef at as hy hz ia ib ic id ie if ig ih ii ij"><span>to_csv</span></h2>
<p id="9bd9" class="hi hj ef at hk b hl ik hn il hp im hr in ht io hv" data-selectable-paragraph=""><span>Опять же, это команда, которую все будут использовать. Я хотел бы указать на две уловки здесь. Первый</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">print(df[:5].to_csv())</pre>
<p id="0413" class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span>Вы можете использовать эту команду, чтобы распечатать первые пять строк того, что будет записано в файл точно.</span></p>
<p id="e0c3" class="hi hj ef at hk b hl hm hn ho hp hq hr hs ht hu hv" data-selectable-paragraph=""><span>Еще один трюк &#8212; это смешанные целые числа и пропущенные значения. Если столбец содержит как пропущенные значения, так и целые числа, тип данных по-прежнему будет плавающим, а не целым. Когда вы экспортируете таблицу, вы можете добавить <strong class="hk ip">float_format=‘%.0f’</strong></span><strong class="hk ip"><span>,</span></strong><span> чтобы округлить все числа с плавающей точкой до целых чисел. Используйте этот трюк, если вам нужны только целочисленные выходные данные для всех столбцов &#8212; вы избавитесь от всех назойливых <strong>‘.0’s</strong>.</span></p><p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpandas-series-and-dataframe-objects-build-index%2F&amp;linkname=Python%203%20Pandas%3A%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20Series%20%D0%B8%20DataFrame.%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20Index" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpandas-series-and-dataframe-objects-build-index%2F&amp;linkname=Python%203%20Pandas%3A%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20Series%20%D0%B8%20DataFrame.%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20Index" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpandas-series-and-dataframe-objects-build-index%2F&amp;linkname=Python%203%20Pandas%3A%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20Series%20%D0%B8%20DataFrame.%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20Index" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpandas-series-and-dataframe-objects-build-index%2F&amp;linkname=Python%203%20Pandas%3A%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20Series%20%D0%B8%20DataFrame.%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20Index" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpandas-series-and-dataframe-objects-build-index%2F&amp;linkname=Python%203%20Pandas%3A%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20Series%20%D0%B8%20DataFrame.%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20Index" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpandas-series-and-dataframe-objects-build-index%2F&amp;linkname=Python%203%20Pandas%3A%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20Series%20%D0%B8%20DataFrame.%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20Index" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpandas-series-and-dataframe-objects-build-index%2F&amp;linkname=Python%203%20Pandas%3A%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20Series%20%D0%B8%20DataFrame.%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20Index" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpandas-series-and-dataframe-objects-build-index%2F&#038;title=Python%203%20Pandas%3A%20%D0%9E%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%20Series%20%D0%B8%20DataFrame.%20%D0%9F%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5%20Index" data-a2a-url="https://python.ivan-shamaev.ru/pandas-series-and-dataframe-objects-build-index/" data-a2a-title="Python 3 Pandas: Объекты Series и DataFrame. Построение Index"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/pandas-series-and-dataframe-objects-build-index/">Python 3 Pandas: Объекты Series и DataFrame. Построение Index</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/pandas-series-and-dataframe-objects-build-index/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
	</channel>
</rss>
