<?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 Cryptocurrency - Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</title>
	<atom:link href="https://python.ivan-shamaev.ru/tag/python-cryptocurrency/feed/" rel="self" type="application/rss+xml" />
	<link>https://python.ivan-shamaev.ru/tag/python-cryptocurrency/</link>
	<description>Библиотеки обработки данных. Примеры. Строки, списки, файлы, числа, массивы. Язык программирования Python 3 - скачать</description>
	<lastBuildDate>Fri, 06 Dec 2019 21:47:37 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.1</generator>

<image>
	<url>https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/cropped-data_science_python3_logo-32x32.png</url>
	<title>Python Cryptocurrency - Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</title>
	<link>https://python.ivan-shamaev.ru/tag/python-cryptocurrency/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Python 3 Tutorial &#8212; Data Wrangling &#8212; Обработка данных по криптовалютам</title>
		<link>https://python.ivan-shamaev.ru/python-data-wrangling-tutorial-for-cryptocurrency/</link>
					<comments>https://python.ivan-shamaev.ru/python-data-wrangling-tutorial-for-cryptocurrency/#respond</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Fri, 29 Nov 2019 22:30:33 +0000</pubDate>
				<category><![CDATA[Pandas. Обработка данных]]></category>
		<category><![CDATA[Python Finance]]></category>
		<category><![CDATA[Cryptocurrency Data Wrangling]]></category>
		<category><![CDATA[Data Wrangling]]></category>
		<category><![CDATA[Data Wrangling Tutorial]]></category>
		<category><![CDATA[Python Cryptocurrency]]></category>
		<category><![CDATA[Python Data Wrangling]]></category>
		<category><![CDATA[Python For Finance]]></category>
		<category><![CDATA[Python Tutorial]]></category>
		<category><![CDATA[Обработка данных по криптовалютам]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=366</guid>

					<description><![CDATA[<p>Вводная часть по Python 3 Tutorial &#8212; Data Wrangling Биткойн и криптовалюта сейчас в тренде&#8230; но как специалисты по данным, мы эмпиристы, верно? Мы не хотим просто поверить на слово другим&#8230; мы хотим посмотреть на данные из первых рук! В этом уроке будут описаны общие и мощные методы обработки данных в Python. Python 3 Tutorial [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/python-data-wrangling-tutorial-for-cryptocurrency/">Python 3 Tutorial &#8212; Data Wrangling &#8212; Обработка данных по криптовалютам</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-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" 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-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" 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-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" 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-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" 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-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" 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-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" 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-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" 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-data-wrangling-tutorial-for-cryptocurrency%2F&#038;title=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" data-a2a-url="https://python.ivan-shamaev.ru/python-data-wrangling-tutorial-for-cryptocurrency/" data-a2a-title="Python 3 Tutorial — Data Wrangling — Обработка данных по криптовалютам"></a></p><h2><strong>Вводная часть по Python 3 Tutorial &#8212; Data Wrangling</strong></h2>
<p><strong>Биткойн и криптовалюта сейчас в тренде</strong>&#8230; но как специалисты по данным, мы эмпиристы, верно? Мы не хотим просто поверить на слово другим&#8230; мы хотим посмотреть на данные из первых рук! <strong>В этом уроке будут описаны общие и мощные методы обработки данных в Python.</strong></p>
<blockquote>
<p><span style="color: #993366;"><em>Python 3 Tutorial &#8212; Data Wrangling</em></span></p>
</blockquote>
<p>Вообще говоря, <strong>обработка данных (Data Wrangling)</strong> &#8212; это процесс преобразования, агрегирования, разделения или иного преобразования ваших данных из одного формата в более подходящий.</p>
<p>Например, мы хотим <strong>провести пошаговый анализ очень элементарной торговой стратегии</strong>, которая выглядит следующим образом:</p>
<ol>
<li>В начале каждого месяца мы покупаем криптовалюту, которая имела наибольший прирост цены за последние 7, 14, 21 или 28 дней. Мы хотим оценить каждое из этих временных окон.</li>
<li>Затем мы держим ровно 7 дней и продаем нашу позицию. Обратите внимание: это целенаправленно простая стратегия, которая предназначена только для иллюстративных целей.</li>
</ol>
<p><strong>Как мы будем оценивать эту стратегию?</strong></p>
<p>Это хороший вопрос для демонстрации методов обработки данных, потому что вся тяжелая работа заключается в преобразовании вашего набора данных в правильный формат. Когда у вас есть соответствующая аналитическая базовая таблица (analytical base table, ABT), ответить на вопрос становится просто.</p>
<p><strong>Чем это руководство не является:</strong></p>
<p>Это не руководство по инвестиционным или торговым стратегиям, и не призыв за или против торговли криптовалютами. Потенциальные инвесторы должны самостоятельно формировать свои взгляды, но в этом руководстве будут представлены инструменты для этого.</p>
<p>Опять же, основное внимание в этом руководстве уделяется методам обработки данных и возможности преобразования необработанных наборов данных в форматы, которые помогут вам ответить на интересные вопросы.</p>
<p><strong>Быстрый совет, прежде чем мы начнем:</strong></p>
<p>Этот учебник предназначен для быстрого ознакомления, и он не будет охватывать ни одну тему слишком подробно. Ознакомьтесь дополнительно с <a href="https://python.ivan-shamaev.ru/pandas-series-and-dataframe-objects-build-index/" target="_blank" rel="noopener noreferrer"><strong>Tutorial по библиотеке Pandas</strong></a>.</p>
<h2><strong>Содержание учебника по обработке данных Python &#8212; Data Wrangling Tutorial</strong></h2>
<p><strong>Вот шаги, которые мы пройдем в рамках нашего анализа:</strong></p>
<ol>
<li>Настройка среды.</li>
<li>Импорт библиотек и наборов данных.</li>
<li>Первичное знакомство с данными.</li>
<li>Фильтр нежелательных наблюдений (подмножеств).</li>
<li>Вращение набора данных &#8212; Pivot the dataset.</li>
<li>Сдвиг развернутого набора данных &#8212; Shift the pivoted dataset.</li>
<li>Melt сдвинутого набора данных &#8212; Melt the shifted dataset.</li>
<li>Уменьшение-объединение (Reduce-merge) melted data.</li>
<li>Агрегация данных с помощью group-by.</li>
</ol>
<h3><strong>Шаг 1. Настройка среды программирования Python</strong></h3>
<p><strong>Сначала убедитесь, что на вашем компьютере установлено ПО:</strong></p>
<ul>
<li>Python 2.7+ или Python 3</li>
<li>Pandas</li>
<li>Jupyter Notebook (необязательно, но рекомендуется)</li>
</ul>
<p>Мы настоятельно рекомендуем установить дистрибутив <a href="https://www.anaconda.com/" target="_blank" rel="noopener noreferrer"><strong>Anaconda</strong></a>, который поставляется со всеми этими пакетами. Просто следуйте инструкциям на этой странице загрузки.</p>
<blockquote>
<p><strong>Jupyter Notebook</strong> – это бесплатная интерактивная оболочка для языка программирования <strong>Python</strong>, позволяющая объединить <em><strong>код, изображения, комментарии, формулы и графики/диаграммы</strong></em>.</p>
</blockquote>
<p>После установки Anaconda запустите Jupyter Notebook (Anaconda3):</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_notebook_anaconda3.png"><img fetchpriority="high" decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_notebook_anaconda3.png" alt="" width="513" height="678" class="aligncenter size-full wp-image-381" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_notebook_anaconda3.png 513w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_notebook_anaconda3-227x300.png 227w" sizes="(max-width: 513px) 100vw, 513px" /></a></p>
<p>Откроется окно в браузере. В нем создайте новое окно Python3:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_create_new_notebook_with_python3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_create_new_notebook_with_python3.png" alt="" width="1365" height="425" class="aligncenter size-full wp-image-382" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_create_new_notebook_with_python3.png 1365w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_create_new_notebook_with_python3-300x93.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_create_new_notebook_with_python3-1024x319.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_create_new_notebook_with_python3-768x239.png 768w" sizes="(max-width: 1365px) 100vw, 1365px" /></a></p>
<p>Откроется новая вкладка, на ней Вы можете поменять название документа.</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_new_doc_name_line_program.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_new_doc_name_line_program.png" alt="" width="852" height="337" class="aligncenter size-full wp-image-384" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_new_doc_name_line_program.png 852w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_new_doc_name_line_program-300x119.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step1_jupyter_new_doc_name_line_program-768x304.png 768w" sizes="(max-width: 852px) 100vw, 852px" /></a></p>
<h4>Интерфейс Jupyter Notebook</h4>
<p><strong>В Jupyter Notebook</strong> есть два важных термина: <strong>cells (ячейки)</strong> и <strong>kernels (ядра)</strong> являются ключом как к пониманию Jupyter.</p>
<ul>
<li><strong>kernel (Ядро)</strong> – это <strong>«вычислительный движок»</strong>, который выполняет код, содержащийся в документе Notebook.</li>
<li><strong>cell (Ячейка)</strong> – это контейнер для текста, который будет отображаться в Notebook, или код, который будет выполняться ядром записной книжки.</li>
</ul>
<h4><strong>Запуск и прерывание выполнения кода в Jupyter Notebook</strong></h4>
<p><span>Если ваша программа зависла, то можно прервать ее выполнение выбрав на панели меню пункт <strong>Kernel -&gt; Interrupt.</strong></span></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_kernel_interrupt.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_kernel_interrupt.png" alt="" width="746" height="246" class="aligncenter size-full wp-image-422" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_kernel_interrupt.png 746w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_kernel_interrupt-300x99.png 300w" sizes="(max-width: 746px) 100vw, 746px" /></a></p>
<p><span>Для добавления новой ячейки используйте <strong>Insert-&gt;Insert Cell Above</strong> и <strong>Insert-&gt;Insert Cell Below</strong>.</span></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_insert_cell_above_below.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_insert_cell_above_below.png" alt="" width="589" height="182" class="aligncenter size-full wp-image-424" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_insert_cell_above_below.png 589w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_insert_cell_above_below-300x93.png 300w" sizes="(max-width: 589px) 100vw, 589px" /></a></p>
<p><span>Для запуска ячейки используете команды из меню <strong>Cell</strong>, либо следующие сочетания клавиш:</span></p>
<ul>
<li><span><strong>Ctrl+Enter</strong> – выполнить содержимое ячейки.</span></li>
<li><span><strong>Shift+Enter</strong> – выполнить содержимое ячейки и перейти на ячейку ниже.</span></li>
<li><span><strong>Alt+Enter</strong> – выполнить содержимое ячейки и вставить новую ячейку ниже.</span></li>
</ul>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_cell_run_cells_all_above_below_menu_python3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_cell_run_cells_all_above_below_menu_python3.png" alt="" width="558" height="309" class="aligncenter size-full wp-image-425" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_cell_run_cells_all_above_below_menu_python3.png 558w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/jupyter_cell_run_cells_all_above_below_menu_python3-300x166.png 300w" sizes="(max-width: 558px) 100vw, 558px" /></a></p>
<h3><strong>Шаг 2: Импортируем библиотеки и загружаем набор данных</strong></h3>
<p>Сначала мы импортируем библиотеку Pandas (лучшая библиотека для обработки реляционных наборов данных в табличном формате).<br>Библиотеке Pandas мы дадим alias (псевдоним). Позже мы сможем вызывать библиотеку с помощью pd.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Pandas for managing datasets
import pandas as pd</pre>
<p>Далее, давайте немного подправим параметры отображения чисел. Во-первых, давайте отобразим числа с плавающей точкой с двумя десятичными разрядами, чтобы сделать таблицы менее загруженными. Не волнуйтесь &#8212; это только настройка дисплея, которая не снижает основную точность. Давайте также расширим ограничения на количество отображаемых строк и столбцов.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Display floats with 2 decimal places
pd.options.display.float_format = '{:,.2f}'.format
 
# Expand display limits
pd.options.display.max_rows = 200
pd.options.display.max_columns = 100</pre>
<p>В этом уроке мы будем использовать набор данных о ценах Brave New Coin и распространяемый в Quandl. Полная версия отслеживает индексы цен для 1900+ фиат-крипто трейдинговых пар, но требует премиальной подписки, поэтому мы предоставили небольшую выборку с небольшим количеством криптовалют.</p>
<p>Чтобы использовать набор данных в своей программе скачайте файл <strong><a href="https://drive.google.com/file/d/1zgKTySGWDzrf4OE9Cs22ueS0_ZNg69YJ/view?usp=sharing" target="_blank" rel="noopener noreferrer">BNC2_sample.csv</a></strong>.</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_dataset_crypto.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_dataset_crypto.png" alt="" width="1365" height="505" class="aligncenter size-full wp-image-393" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_dataset_crypto.png 1365w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_dataset_crypto-300x111.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_dataset_crypto-1024x379.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_dataset_crypto-768x284.png 768w" sizes="(max-width: 1365px) 100vw, 1365px" /></a></p>
<p>После того, как вы скачали набор данных, разместите его в том же каталоге, что и сохраненный блокнот.</p>
<p>Набор данных можно загрузить как непосредственно в директорию на диске в windows:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_directory.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_directory.png" alt="" width="835" height="395" class="aligncenter size-full wp-image-395" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_directory.png 835w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_directory-300x142.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_directory-768x363.png 768w" sizes="(max-width: 835px) 100vw, 835px" /></a></p>
<p>Также можно загрузить файл из интерфейса Jupyter:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_upload_dataset_file_into_jupyter_folder.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_upload_dataset_file_into_jupyter_folder.png" alt="" width="1365" height="584" class="aligncenter size-full wp-image-396" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_upload_dataset_file_into_jupyter_folder.png 1365w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_upload_dataset_file_into_jupyter_folder-300x128.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_upload_dataset_file_into_jupyter_folder-1024x438.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_upload_dataset_file_into_jupyter_folder-768x329.png 768w" sizes="(max-width: 1365px) 100vw, 1365px" /></a></p>
<p>Если Вы все правильно сделали, то файл разместится рядом с вашим проектом:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_zagruzenniy_dataset_v_directoriu.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_zagruzenniy_dataset_v_directoriu.png" alt="" width="1168" height="303" class="aligncenter size-full wp-image-397" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_zagruzenniy_dataset_v_directoriu.png 1168w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_zagruzenniy_dataset_v_directoriu-300x78.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_zagruzenniy_dataset_v_directoriu-1024x266.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_python_zagruzenniy_dataset_v_directoriu-768x199.png 768w" sizes="(max-width: 1168px) 100vw, 1168px" /></a></p>
<p>Далее запускаем следующий код, чтобы прочитать набор данных из csv файла и создать DataFrame (набор данных библиотеки Pandas). Далее выводим примеры записей.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Read BNC2 sample dataset
df = pd.read_csv('BNC2_sample.csv',
                 names=['Code', 'Date', 'Open', 'High', 'Low', 
                        'Close', 'Volume', 'VWAP', 'TWAP'])
 
# Display first 5 observations
df.head()</pre>
<p><strong>Запускаем наш скрипт и получим следующий результат:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_run_script_python_pandas.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_run_script_python_pandas.png" alt="" width="739" height="438" class="aligncenter size-full wp-image-402" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_run_script_python_pandas.png 739w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step2_run_script_python_pandas-300x178.png 300w" sizes="(max-width: 739px) 100vw, 739px" /></a></p>
<p>Обратите внимание, что мы используем аргумент <code class="EnlighterJSRAW" data-enlighter-language="python">names =</code> для <code class="EnlighterJSRAW" data-enlighter-language="python">pd.read_csv()</code>, чтобы установить наши собственные имена столбцов, потому что исходный набор данных не содержит заголовка таблицы (наименования столбцов).</p>
<p><strong>Словарь данных (для кода GWA_BTC):</strong></p>
<ul>
<li><strong>Date:</strong> день, в который были рассчитаны значения индекса.</li>
<li><strong>Open:</strong> дневной индекс цен на биткойны в долларах США.</li>
<li><strong>High:</strong> максимальное значение индекса цен на биткойны в долларах США за день на дату.</li>
<li><strong>Low:</strong> самое низкое значение индекса цен на биткойны в долларах США за день на дату.</li>
<li><strong>Close:</strong> дневной индекс цен на биткойны в долларах США.</li>
<li><strong>Volume:</strong> объем торговли биткойнами в этот день.</li>
<li><strong>VWAP:</strong> средневзвешенная цена за биткойн, торгуемая в этот день.</li>
<li><strong>TWAP:</strong> средневзвешенная по времени цена Биткойна, торгуемая в этот день.</li>
</ul>
<h3 id="step-3"><strong>Шаг 3: Понимание данных. Изучение данных</strong></h3>
<p><span>Одна из наиболее распространенных причин для обработки данных &#8212; это когда «слишком много» информации упаковано в одну таблицу, особенно при работе с данными временных рядов.</span></p>
<p><strong><span>Как правило, все наблюдения (записи/транзакции) должны быть эквивалентны по степени&nbsp;</span><span>детализации</span><span>&nbsp;и в </span><span>единицах</span><span> измерения.</span></strong></p>
<p><span>Существуют исключения, но по большей части это правило поможет вам избежать многих головных болей.</span></p>
<ul>
<li><strong><span>Эквивалентность в гранулярности &#8212;&nbsp;</span></strong><span>&nbsp;например, вы можете иметь 10 строк данных по 10 разным криптовалютам.&nbsp;Однако у вас&nbsp;</span><strong><span>не</span></strong><span>&nbsp;должно быть 11-й строки со средними или суммарными значениями из других 10 строк.&nbsp;Эта 11-я строка будет&nbsp;</span><em><span>агрегацией </span></em><span>и, следовательно, не эквивалентна по гранулярности с другими 10.</span></li>
<li><strong><span>Эквивалентность в единицах &#8212; у</span></strong><span>&nbsp;вас может быть 10 строк с ценами в долларах США, собранных на разные даты.&nbsp;Однако у вас&nbsp;</span><strong><span>не</span></strong><span>&nbsp;должно быть еще 10 строк с ценами, указанными в евро.&nbsp;Любые агрегаты, распределения, визуализации или статистика станут бессмысленными.</span></li>
</ul>
<p><strong><span>Наш текущий набор необработанных данных нарушает оба эти правила!</span></strong></p>
<p><span>Данные, хранящиеся в CSV-файлах или базах данных, часто имеют формат «стопки» или «запись».&nbsp;Они используют один столбец&nbsp;</span><span id="crayon-5de292fa5d0bd739628329" class="crayon-syntax crayon-syntax-inline  crayon-theme-classic crayon-theme-classic-inline crayon-font-monaco"><span class="crayon-pre crayon-code"><span class="crayon-s"><span>«Код»</span></span></span></span><span>&nbsp;в качестве универсального для метаданных.&nbsp;Например, в примере набора данных у нас есть следующие коды:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Unique codes in the dataset
print( df.Code.unique() )</pre>
<p><strong>Результат выполнения:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_code_unique_in_dataset.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_code_unique_in_dataset.png" alt="" width="617" height="176" class="aligncenter size-full wp-image-407" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_code_unique_in_dataset.png 617w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_code_unique_in_dataset-300x86.png 300w" sizes="(max-width: 617px) 100vw, 617px" /></a></p>
<p><span>Во-первых, посмотрите, что некоторые коды начинаются с&nbsp;</span><strong><span>GWA,</span></strong><span>&nbsp;а другие &#8212; с&nbsp;</span><strong><span>MWA</span></strong><span>?&nbsp;На самом деле это абсолютно разные типы индикаторов согласно&nbsp;</span><strong><a href="https://www.quandl.com/data/BNC2-BNC-Digital-Currency-Indexed-EOD/documentation/introduction" target="_blank" rel="noopener noreferrer">странице документации</a></strong><span>.</span></p>
<ul>
<li><span>MWA означает <strong>«</strong></span><strong>средневзвешенное значение</strong><span><strong>&nbsp;по&nbsp;рынку»</strong>, и они показывают региональные цены.&nbsp;Существует несколько кодов MWA для каждой криптовалюты, по одному на каждую местную фиатную валюту.</span></li>
<li><span>С другой стороны, GWA означает <strong>«</strong></span><strong>средневзвешенное значение по</strong><span><strong>&nbsp;всему миру»</strong>, которое показывает глобально проиндексированные цены. Таким образом, GWA &#8212; это совокупность MWA, а не эквивалентность по гранулярности. (Примечание: в образец набора данных включен только поднабор региональных кодов MWA)</span></li>
</ul>
<p><strong>Например, давайте посмотрим на коды Биткойн в ту же дату:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Example of GWA and MWA relationship
df[df.Code.isin(['GWA_BTC', 'MWA_BTC_JPY', 'MWA_BTC_EUR']) &amp; (df.Date == '2018-01-01')]</pre>
<p>&nbsp;Результат выполнения команды:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_example_GWA_MWA_relationship.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_example_GWA_MWA_relationship.png" alt="" width="889" height="187" class="aligncenter size-full wp-image-411" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_example_GWA_MWA_relationship.png 889w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_example_GWA_MWA_relationship-300x63.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step3_example_GWA_MWA_relationship-768x162.png 768w" sizes="(max-width: 889px) 100vw, 889px" /></a><span>Как видите, у нас есть несколько записей для криптовалюты на данную дату.&nbsp;Чтобы еще больше усложнить ситуацию, региональные данные MWA выражены в местной валюте (то есть в неэквивалентных единицах), поэтому вам также понадобятся исторические обменные курсы.</span></p>
<p><span style="color: #000000;"><strong>Наличие разных уровней детализации и/или разных единиц делает анализ в лучшем случае громоздким, а в худшем &#8212; невозможным.</strong></span></p>
<p><span>К счастью, как только мы обнаружили эту проблему, исправить ее на самом деле тривиально!</span></p>
<h3 id="step-4"><strong>Шаг 4: Отфильтруем нежелательные наблюдения (записи/строки)</strong></h3>
<p><span>Одним из самых простых, но наиболее полезных методов обработки данных является удаление нежелательных наблюдений.</span></p>
<p><span>На предыдущем этапе мы узнали, что коды <strong>GWA</strong> являются агрегированием региональных кодов <strong>MWA</strong>.&nbsp;Поэтому для проведения нашего анализа нам нужно только сохранить глобальные коды GWA:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Number of observations in dataset
print( 'Before:', len(df) )
 
# Get all the GWA codes
gwa_codes = [code for code in df.Code.unique() if 'GWA_' in code]
 
# Only keep GWA observations
df = df[df.Code.isin(gwa_codes)]
 
# Number of observations left
print( 'After:', len(df) )</pre>
<p><strong>Результат работы скрипта Python 3</strong> в Jupyter Notebook:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step4_keep_only_GWA_observations_check_number_of_observations.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step4_keep_only_GWA_observations_check_number_of_observations.png" alt="" width="590" height="256" class="aligncenter size-full wp-image-414" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step4_keep_only_GWA_observations_check_number_of_observations.png 590w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step4_keep_only_GWA_observations_check_number_of_observations-300x130.png 300w" sizes="(max-width: 590px) 100vw, 590px" /></a></p>
<p><span>Теперь, когда у нас остались только коды GWA, все наши наблюдения эквивалентны по степени детализации и единицах измерения.&nbsp;</span><span>Мы можем продолжать обработку данных.</span></p>
<h3><strong>Шаг 5: Pivot the dataset &#8212; Развернем набор данных</strong></h3>
<p>Далее, чтобы проанализировать нашу стратегию торговли по импульсам, описанную выше, для каждой криптовалюты нам потребуется рассчитать <strong>доходность за предыдущие 7, 14, 21 и 28 дней</strong> для первого дня каждого месяца.</p>
<p>Тем не менее, было бы очень сложно производить этот расчет с текущим <strong>«сложенным» набором данных (&#171;stacked&#187; dataset)</strong>. Это потребует написания вспомогательных функций, циклов и множества условной логики. Вместо этого мы будем использовать более элегантный подход.</p>
<p>Во-первых, мы повернем набор данных, оставив только один ценовой столбец. В этом уроке мы сохраним столбец VWAP (средневзвешенная цена).</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Pivot dataset
pivoted_df = df.pivot(index='Date', columns='Code', values='VWAP')
 
# Display examples from pivoted dataset
pivoted_df.tail()</pre>
<p><strong>Результат:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step5_pivot_dataset_display_example_from_pivoted_dataset.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step5_pivot_dataset_display_example_from_pivoted_dataset.png" alt="" width="597" height="316" class="aligncenter size-full wp-image-419" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step5_pivot_dataset_display_example_from_pivoted_dataset.png 597w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step5_pivot_dataset_display_example_from_pivoted_dataset-300x159.png 300w" sizes="(max-width: 597px) 100vw, 597px" /></a></p>
<p>Как видите, каждый столбец в нашем сводном наборе данных (pivoted dataset) теперь представляет цену за одну криптовалюту, а каждая строка содержит цены за одну дату. Все объекты теперь выровнены по дате.</p>
<h3><strong>Шаг 6: Сдвиг развернутого набора данных &#8212; Shift the pivoted dataset</strong></h3>
<p>Чтобы легко рассчитать <strong>returns</strong> за предыдущие <strong>7, 14, 21 и 28 дней</strong>, мы можем использовать <strong>метод shift из библиотеки Pandas</strong>.</p>
<p>Эта функция сдвигает индекс dataframe на указанное количество периодов. Например, вот что происходит, когда мы сдвигаем наш pivoted dataset на 1:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">print( pivoted_df.tail(3) )</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_1.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_1.png" alt="" width="585" height="151" class="aligncenter size-full wp-image-429" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_1.png 585w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_1-300x77.png 300w" sizes="(max-width: 585px) 100vw, 585px" /></a></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">print( pivoted_df.tail(3).shift(1) )</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_2.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_2.png" alt="" width="530" height="136" class="aligncenter size-full wp-image-431" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_2.png 530w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_2-300x77.png 300w" sizes="(max-width: 530px) 100vw, 530px" /></a></p>
<p>Обратите внимание, как смещенный набор данных теперь имеет значения за 1 день до этого? Мы можем воспользоваться этим, чтобы рассчитать prior returns для 7, 14, 21, 28 дней.</p>
<p>Например, для расчета доходности за 7 дней этого нам понадобится <code class="EnlighterJSRAW" data-enlighter-language="python">prices_today / prices_7_days_ago - 1.0</code>, что означает:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_3_calc_return_over_7_days_prior.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_3_calc_return_over_7_days_prior.png" alt="" width="532" height="308" class="aligncenter size-full wp-image-432" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_3_calc_return_over_7_days_prior.png 532w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_3_calc_return_over_7_days_prior-300x174.png 300w" sizes="(max-width: 532px) 100vw, 532px" /></a></p>
<p>Рассчитать <strong>returns</strong> для всех наших периодов так же просто, как написать цикл и сохранить его в словаре:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Calculate returns over each window and store them in dictionary
delta_dict = {}
for offset in [7, 14, 21, 28]:
    delta_dict['delta_{}'.format(offset)] = pivoted_df / pivoted_df.shift(offset) - 1.0

# Display result "delta_dict"
delta_dict</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_4_calc_return_over_each_period.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_4_calc_return_over_each_period.png" alt="" width="806" height="527" class="aligncenter size-full wp-image-433" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_4_calc_return_over_each_period.png 806w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_4_calc_return_over_each_period-300x196.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/Step6_Shift_pivoted_dataset_example_4_calc_return_over_each_period-768x502.png 768w" sizes="(max-width: 806px) 100vw, 806px" /></a></p>
<p>Полный список результата (out):</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">{'delta_7': Code        GWA_BTC  GWA_ETH  GWA_LTC  GWA_XLM  GWA_XRP
 Date                                                   
 2014-04-01      nan      nan      nan      nan      nan
 2014-04-02      nan      nan      nan      nan      nan
 2014-04-03      nan      nan      nan      nan      nan
 2014-04-04      nan      nan      nan      nan      nan
 2014-04-05      nan      nan      nan      nan      nan
 ...             ...      ...      ...      ...      ...
 2018-01-19    -0.18    -0.17    -0.18    -0.21    -0.22
 2018-01-20    -0.13    -0.19    -0.18    -0.23    -0.29
 2018-01-21    -0.15    -0.20    -0.22    -0.22    -0.30
 2018-01-22    -0.21    -0.24    -0.24    -0.25    -0.32
 2018-01-23    -0.11    -0.12    -0.13    -0.02    -0.04
 
 [1394 rows x 5 columns],
 'delta_14': Code        GWA_BTC  GWA_ETH  GWA_LTC  GWA_XLM  GWA_XRP
 Date                                                   
 2014-04-01      nan      nan      nan      nan      nan
 2014-04-02      nan      nan      nan      nan      nan
 2014-04-03      nan      nan      nan      nan      nan
 2014-04-04      nan      nan      nan      nan      nan
 2014-04-05      nan      nan      nan      nan      nan
 ...             ...      ...      ...      ...      ...
 2018-01-19    -0.29     0.05    -0.23    -0.27    -0.41
 2018-01-20    -0.26     0.13    -0.29    -0.26    -0.42
 2018-01-21    -0.29    -0.01    -0.32    -0.31    -0.51
 2018-01-22    -0.29    -0.13    -0.30    -0.28    -0.52
 2018-01-23    -0.31    -0.22    -0.32    -0.24    -0.48
 
 [1394 rows x 5 columns],
 'delta_21': Code        GWA_BTC  GWA_ETH  GWA_LTC  GWA_XLM  GWA_XRP
 Date                                                   
 2014-04-01      nan      nan      nan      nan      nan
 2014-04-02      nan      nan      nan      nan      nan
 2014-04-03      nan      nan      nan      nan      nan
 2014-04-04      nan      nan      nan      nan      nan
 2014-04-05      nan      nan      nan      nan      nan
 ...             ...      ...      ...      ...      ...
 2018-01-19    -0.22     0.42    -0.24     0.88     0.02
 2018-01-20    -0.05     0.60    -0.09     0.57    -0.26
 2018-01-21    -0.11     0.51    -0.12     0.47    -0.28
 2018-01-22    -0.19     0.36    -0.19     0.05    -0.35
 2018-01-23    -0.25     0.13    -0.29    -0.10    -0.39
 
 [1394 rows x 5 columns],
 'delta_28': Code        GWA_BTC  GWA_ETH  GWA_LTC  GWA_XLM  GWA_XRP
 Date                                                   
 2014-04-01      nan      nan      nan      nan      nan
 2014-04-02      nan      nan      nan      nan      nan
 2014-04-03      nan      nan      nan      nan      nan
 2014-04-04      nan      nan      nan      nan      nan
 2014-04-05      nan      nan      nan      nan      nan
 ...             ...      ...      ...      ...      ...
 2018-01-19    -0.17     0.57    -0.24     1.30     0.65
 2018-01-20    -0.13     0.60    -0.27     1.23     0.53
 2018-01-21    -0.12     0.65    -0.27     1.22     0.45
 2018-01-22    -0.20     0.38    -0.33     1.09     0.30
 2018-01-23    -0.31     0.29    -0.37     1.16     0.29
 
 [1394 rows x 5 columns]}</pre>
<p><strong>Примечание.</strong> Для расчета returns путем смещения набора данных необходимо выполнить 2 допущения:</p>
<ol>
<li>наблюдения отсортированы ascending by date и</li>
<li>отсутствуют пропущенные даты. Этого шага нет в статье, чтобы сделать этот урок лаконичным, рекомендуется проверить это самостоятельно.</li>
</ol>
<h3><strong>Шаг 7: Сплавка смещенного набора данных &#8212; Melt the shifted dataset</strong></h3>
<p>Теперь, когда мы вычислили возвраты с использованием развернутого набора данных (Pivot dataset), мы собираемся «разворачивать (unpivot)» возвраты. Развернув (Unpivot) или расплавив данные, мы можем позже создать аналитическую базовую таблицу (АБТ &#8212; analytical base table, ABT), где каждая строка содержит всю необходимую информацию для конкретной монеты на определенную дату.</p>
<p>Мы не могли напрямую сместить исходный набор данных, потому что данные для разных монет были сложены друг на друга, поэтому границы могли бы перекрываться. Другими словами, данные BTC попадут в расчеты ETH, данные ETH попадут в расчеты LTC и так далее.</p>
<p><strong>Чтобы расплавить данные, нам требуется:</strong></p>
<ul>
<li><strong>reset_index()</strong>, чтобы мы могли вызывать столбцы по имени;</li>
<li>Вызовите метод <strong>melt()</strong>;</li>
<li>Передайте столбец (столбцы), чтобы сохранить в аргумент <strong>id_vars=</strong>;</li>
<li>Назовите растопленный столбец (melted column), используя аргумент <strong>value_name=</strong>.</li>
</ul>
<p><strong>Вот как это выглядит для одного dataframe:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Melt delta_7 returns
melted_7 = delta_7.reset_index().melt(id_vars=['Date'], value_name='delta_7')
 
# Melted dataframe examples
melted_7.tail()</pre>
<p>Результат:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step7_melted_dataframe_examples_delta_7_returns.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step7_melted_dataframe_examples_delta_7_returns.png" alt="" width="735" height="300" class="aligncenter size-full wp-image-443" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step7_melted_dataframe_examples_delta_7_returns.png 735w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step7_melted_dataframe_examples_delta_7_returns-300x122.png 300w" sizes="(max-width: 735px) 100vw, 735px" /></a></p>
<p>Чтобы сделать это для всех возвращаемых <strong>DataFrame</strong>, мы можем просто перебрать <strong>delta_dict</strong>, вот так:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Melt all the delta dataframes and store in list
melted_dfs = []
for key, delta_df in delta_dict.items():
    melted_dfs.append( delta_df.reset_index().melt(id_vars=['Date'], value_name=key) )

melted_dfs</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">[            Date     Code  delta_7
 0     2014-04-01  GWA_BTC      nan
 1     2014-04-02  GWA_BTC      nan
 2     2014-04-03  GWA_BTC      nan
 3     2014-04-04  GWA_BTC      nan
 4     2014-04-05  GWA_BTC      nan
 ...          ...      ...      ...
 6965  2018-01-19  GWA_XRP    -0.22
 6966  2018-01-20  GWA_XRP    -0.29
 6967  2018-01-21  GWA_XRP    -0.30
 6968  2018-01-22  GWA_XRP    -0.32
 6969  2018-01-23  GWA_XRP    -0.04
 
 [6970 rows x 3 columns],             Date     Code  delta_14
 0     2014-04-01  GWA_BTC       nan
 1     2014-04-02  GWA_BTC       nan
 2     2014-04-03  GWA_BTC       nan
 3     2014-04-04  GWA_BTC       nan
 4     2014-04-05  GWA_BTC       nan
 ...          ...      ...       ...
 6965  2018-01-19  GWA_XRP     -0.41
 6966  2018-01-20  GWA_XRP     -0.42
 6967  2018-01-21  GWA_XRP     -0.51
 6968  2018-01-22  GWA_XRP     -0.52
 6969  2018-01-23  GWA_XRP     -0.48
 
 [6970 rows x 3 columns],             Date     Code  delta_21
 0     2014-04-01  GWA_BTC       nan
 1     2014-04-02  GWA_BTC       nan
 2     2014-04-03  GWA_BTC       nan
 3     2014-04-04  GWA_BTC       nan
 4     2014-04-05  GWA_BTC       nan
 ...          ...      ...       ...
 6965  2018-01-19  GWA_XRP      0.02
 6966  2018-01-20  GWA_XRP     -0.26
 6967  2018-01-21  GWA_XRP     -0.28
 6968  2018-01-22  GWA_XRP     -0.35
 6969  2018-01-23  GWA_XRP     -0.39
 
 [6970 rows x 3 columns],             Date     Code  delta_28
 0     2014-04-01  GWA_BTC       nan
 1     2014-04-02  GWA_BTC       nan
 2     2014-04-03  GWA_BTC       nan
 3     2014-04-04  GWA_BTC       nan
 4     2014-04-05  GWA_BTC       nan
 ...          ...      ...       ...
 6965  2018-01-19  GWA_XRP      0.65
 6966  2018-01-20  GWA_XRP      0.53
 6967  2018-01-21  GWA_XRP      0.45
 6968  2018-01-22  GWA_XRP      0.30
 6969  2018-01-23  GWA_XRP      0.29
 
 [6970 rows x 3 columns]]</pre>
<p>Наконец, мы можем создать другой расплавленный фрейм данных, который содержит прогнозные 7-дневные возвраты. Это будет нашей <strong>«целевой переменной» для оценки нашей торговой стратегии</strong>.</p>
<p>Просто сдвиньте сводный набор данных на &#8212; 7, чтобы получить «будущие» цены, например:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Calculate 7-day returns after the date
return_df = pivoted_df.shift(-7) / pivoted_df - 1.0
 
# Melt the return dataset and append to list
melted_dfs.append( return_df.reset_index().melt(id_vars=['Date'], value_name='return_7') )</pre>
<p>Теперь у нас есть 5 расплавленных фреймов данных, сохраненных в списке <strong>melted_dfs</strong>, по одному для каждого из ретроспективных <strong>7, 14, 21 и 28-дневных возвратов</strong> и один для <strong>прогнозных 7-дневных возвратов</strong>.</p>
<h3><strong>Шаг 8: Уменьшить-объединить расплавленные данные &#8212; Reduce-merge the melted data</strong></h3>
<p>Все, что осталось сделать &#8212; это объединить наши расплавленные DataFrames в единую аналитическую базовую таблицу. Нам понадобятся два инструмента.</p>
<p>Первый инструмент &#8212; это функция слияния Pandas, которая работает как JOIN в SQL. Например, для того, чтобы объединить первые два расплавленных DataFrames:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null"># Merge two dataframes
pd.merge(melted_dfs[0], melted_dfs[1], on=['Date', 'Code']).tail()</pre>
<p><strong>Результат:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_merge_two_dataframes_delta7_delta14.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_merge_two_dataframes_delta7_delta14.png" alt="" width="640" height="249" class="aligncenter size-full wp-image-444" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_merge_two_dataframes_delta7_delta14.png 640w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_merge_two_dataframes_delta7_delta14-300x117.png 300w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>
<p>Посмотрите, теперь у нас delta_7 и delta_14 в одной строке! Это начало нашей аналитической базовой таблицы. Все, что нам нужно сделать сейчас &#8212; это объединить все наши расплавленные DataFrames с базовым DataFrame других функций, которые нам могут понадобиться.</p>
<p>Самый элегантный способ сделать это &#8212; использовать встроенную функцию уменьшения Python. Сначала нам нужно её импортировать:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">from functools import reduce</pre>
<p>Далее, прежде чем использовать эту функцию, давайте создадим список <strong>feature_dfs</strong>, который содержит базовые элементы из исходного набора данных плюс расплавленные наборы данных.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Grab features from original dataset
base_df = df[['Date', 'Code', 'Volume', 'VWAP']]
 
# Create a list with all the feature dataframes
feature_dfs = [base_df] + melted_dfs</pre>
<p>Теперь мы готовы использовать функцию <strong>Reduce</strong>.</p>
<p><strong>Reduce</strong> применяет функцию двух аргументов кумулятивно к объектам в последовательности (например, список). <br>Например,</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">reduce(lambda x,y: x+y, [1,2,3,4,5])</pre>
<p>вычисляет</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">((((1+2)+3)+4)+5)</pre>
<p>Таким образом, мы можем уменьшить-объединить все функции следующим образом:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Reduce-merge features into analytical base table
abt = reduce(lambda left,right: pd.merge(left,right,on=['Date', 'Code']), feature_dfs)
 
# Display examples from the ABT
abt.tail(10)</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_reduce_merge_features_into_analytical_base_table.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_reduce_merge_features_into_analytical_base_table.png" alt="" width="862" height="428" class="aligncenter size-full wp-image-448" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_reduce_merge_features_into_analytical_base_table.png 862w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_reduce_merge_features_into_analytical_base_table-300x149.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_reduce_merge_features_into_analytical_base_table-768x381.png 768w" sizes="(max-width: 862px) 100vw, 862px" /></a></p>
<p>Словарь данных для нашей&nbsp;<em><strong><span>аналитической базовой таблицы (ABT):</span></strong></em></p>
<ul>
<li><strong><span>Date (Дата):</span></strong><span>&nbsp;&nbsp;день, в который были рассчитаны значения индекса.</span></li>
<li><strong><span>Code (Код):</span></strong><span>&nbsp; пара, какая криптовалюта.</span></li>
<li><strong><span>VWAP:</span></strong><span>&nbsp; средневзвешенная цена за день торгов на дату .</span></li>
<li><strong><span>delta_7:</span></strong><span>&nbsp;&nbsp;возврат за предыдущие 7 дней (1.0 = 100% возврат).</span></li>
<li><strong><span>delta_14:</span></strong><span>&nbsp;&nbsp;возврат за предыдущие 14 дней (1.0 = 100% возврат).</span></li>
<li><strong><span>delta_21:</span></strong><span>&nbsp;&nbsp;возврат за предыдущие 21 день (1.0 = 100% возврат).</span></li>
<li><strong><span>delta_28:</span></strong><span>&nbsp;&nbsp;возврат за предыдущие 28 дней (1.0 = 100% возврат).</span></li>
<li><strong><span>return_7:</span></strong><span>&nbsp; будущий возврат в течение следующих 7 дней (1.0 = 100% возврат).</span></li>
</ul>
<p>Кстати, обратите внимание, что последние 7 наблюдений не имеют значений для функции return_7? Это ожидаемо, так как мы не можем рассчитать «будущие 7-дневные доходы» за последние 7 дней набора данных.</p>
<p>Технически, с этой ABT, мы уже можем ответить на нашу первоначальную цель. Например, если мы хотим выбрать монету, которая имела наибольший импульс 1 сентября 2017 года, мы могли бы просто отобразить строки для этой даты и посмотреть на 7, 14, 21 и 28-дневный возврат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Data from Sept 1st, 2017
abt[abt.Date == '2017-09-01']</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_print_returns_ABT.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_print_returns_ABT.png" alt="" width="863" height="249" class="aligncenter size-full wp-image-450" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_print_returns_ABT.png 863w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_print_returns_ABT-300x87.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_print_returns_ABT-768x222.png 768w" sizes="(max-width: 863px) 100vw, 863px" /></a></p>
<p><span>И если вы хотите программно выбрать криптовалюту (пару для торгов) с наибольшим импульсом (например, за предыдущие 28 дней), вы должны написать:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">max_momentum_id = abt[abt.Date == '2017-09-01'].delta_28.idxmax()
abt.loc[max_momentum_id, ['Code','return_7']]</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_max_momentum_dataframe_loc.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_max_momentum_dataframe_loc.png" alt="" width="598" height="116" class="aligncenter size-full wp-image-452" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_max_momentum_dataframe_loc.png 598w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step8_max_momentum_dataframe_loc-300x58.png 300w" sizes="(max-width: 598px) 100vw, 598px" /></a></p>
<p><span>Тем не менее, поскольку мы заинтересованы в торговле только в первый день каждого месяца, мы можем упростить ситуацию для себя&#8230;</span></p>
<h3><strong>Шаг 9: (Необязательно) Агрегация через Group By &#8212; Aggregate with group-by</strong></h3>
<p>В качестве последнего шага, если мы хотим сохранить только первые дни каждого месяца. Для этого мы можем использовать группирование с последующей агрегацией.</p>
<p>Сначала создайте новую функцию &#8216;month&#8217; из первых 7 символов строк Date.<br>Затем сгруппируйте наблюдения по «Коду» и «месяцу». Pandas создадут «ячейки» данных, которые разделяют наблюдения по коду и месяцу.<br>Наконец, в каждой группе просто возьмите .first() и сбросьте индекс.<br>Примечание. Мы предполагаем, что ваш фрейм данных по-прежнему правильно отсортирован по дате.</p>
<p>Вот как все это выглядит вместе:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Create 'month' feature
abt['month'] = abt.Date.apply(lambda x: x[:7])
 
# Group by 'Code' and 'month' and keep first date
gb_df = abt.groupby(['Code', 'month']).first().reset_index()
 
# Display examples
gb_df.tail()</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step9_display_example_group_by_keep_first_date.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step9_display_example_group_by_keep_first_date.png" alt="" width="906" height="351" class="aligncenter size-full wp-image-455" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step9_display_example_group_by_keep_first_date.png 906w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step9_display_example_group_by_keep_first_date-300x116.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/11/step9_display_example_group_by_keep_first_date-768x298.png 768w" sizes="(max-width: 906px) 100vw, 906px" /></a></p>
<p><strong>Как видите, теперь у нас есть правильная Аналитическая базовая таблица АБТ с:</strong></p>
<ul>
<li>Только соответствующие данные с 1-го числа каждого месяца.</li>
<li>Импульсные характеристики рассчитаны за предыдущие 7, 14, 21 и 28 дней.</li>
<li>Прогноз будущих возвратов (future returns) через 7 дней.</li>
</ul>
<p>Другими словами, у нас есть именно то, что нам нужно, чтобы оценить простую торговую стратегию, которую мы предложили в начале статьи!</p>


<h2 class="wp-block-heading" id="complete"><strong>Полный код от начала до конца</strong></h2>



<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=""># 2. Import libraries and dataset
import pandas as pd
pd.options.display.float_format = '{:,.2f}'.format
pd.options.display.max_rows = 200
pd.options.display.max_columns = 100
 
df = pd.read_csv('BNC2_sample.csv',
                 names=['Code', 'Date', 'Open', 'High', 'Low', 
                        'Close', 'Volume', 'VWAP', 'TWAP'])
 
# 4. Filter unwanted observations
gwa_codes = [code for code in df.Code.unique() if 'GWA_' in code]
df = df[df.Code.isin(gwa_codes)]
 
# 5. Pivot the dataset
pivoted_df = df.pivot(index='Date', columns='Code', values='VWAP')
 
# 6. Shift the pivoted dataset
delta_dict = {}
for offset in [7, 14, 21, 28]:
    delta_dict['delta_{}'.format(offset)] = pivoted_df / pivoted_df.shift(offset) - 1
    
# 7. Melt the shifted dataset
melted_dfs = []
for key, delta_df in delta_dict.items():
    melted_dfs.append( delta_df.reset_index().melt(id_vars=['Date'], value_name=key) )
 
return_df = pivoted_df.shift(-7) / pivoted_df - 1.0
melted_dfs.append( return_df.reset_index().melt(id_vars=['Date'], value_name='return_7') )
 
# 8. Reduce-merge the melted data
from functools import reduce
 
base_df = df[['Date', 'Code', 'Volume', 'VWAP']]
feature_dfs = [base_df] + melted_dfs
 
abt = reduce(lambda left,right: pd.merge(left,right,on=['Date', 'Code']), feature_dfs)
 
# 9. Aggregate with group-by.
abt['month'] = abt.Date.apply(lambda x: x[:7])
gb_df = abt.groupby(['Code', 'month']).first().reset_index()</pre>



<figure class="wp-block-image size-large"><img decoding="async" width="788" height="367" src="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/step_final_return.png" alt="" class="wp-image-459" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/step_final_return.png 788w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/step_final_return-300x140.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/step_final_return-768x358.png 768w" sizes="(max-width: 788px) 100vw, 788px" /></figure>



<div class="wp-block-file"><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/Notebook.html"><strong>Пример Jupyter Notebook Python 3</strong></a><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2019/12/Notebook.html" class="wp-block-file__button" download><strong>Скачать</strong></a></div>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" 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-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" 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-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" 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-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" 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-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" 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-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" 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-data-wrangling-tutorial-for-cryptocurrency%2F&amp;linkname=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" 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-data-wrangling-tutorial-for-cryptocurrency%2F&#038;title=Python%203%20Tutorial%20%E2%80%94%20Data%20Wrangling%20%E2%80%94%20%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%BF%D0%BE%20%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B2%D0%B0%D0%BB%D1%8E%D1%82%D0%B0%D0%BC" data-a2a-url="https://python.ivan-shamaev.ru/python-data-wrangling-tutorial-for-cryptocurrency/" data-a2a-title="Python 3 Tutorial — Data Wrangling — Обработка данных по криптовалютам"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/python-data-wrangling-tutorial-for-cryptocurrency/">Python 3 Tutorial &#8212; Data Wrangling &#8212; Обработка данных по криптовалютам</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-data-wrangling-tutorial-for-cryptocurrency/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
