Главная » Хабрахабр » Совмещение R и Python: зачем, когда и как?

Совмещение R и Python: зачем, когда и как?

dva stula

И если да, то зачем это может быть нужно? Наверное, многие из тех, кто занимается анализом данных, когда-нибудь думали о том, возможно ли использовать в работе одновременно R и Python. Да и как вообще выбрать лучший способ совмещения языков, если гугл выдает примерно 100500 вариантов? В каких случаях будет полезным и эффективным для проектов?

Давайте попробуем разобраться в этих вопросах.

Зачем

  • В первую очередь, это возможность использовать преимущества двух наиболее популярных языков программирования для анализа данных на сегодняшний день. Совмещая наиболее мощные и стабильные библиотеки R и Python в некоторых случаях можно повысить эффективность расчетов или избежать изобретения велосипедов для реализации каких-либо статистических моделей.
  • Во вторую очередь, это повышение скорости и удобства выполнения проектов, в случае если разные люди в вашей команде (или вы сами) обладают хорошими знаниями разных языков. Здесь может помочь разумная комбинация имеющихся навыков программирования на R и Python.

Попробуем поговорить подробнее о первом пункте. Summary, которое последует ниже, безусловно, субъективно, и его можно дополнять. Оно создано на основе систематизации ключевых статей о преимуществах языков и личного опыта. Но мир, как мы знаем, очень быстро меняется.

Отсюда и следуют главные плюсы этого языка. Python создавался умными программистами и является языком общего назначения, уже впоследствии — с развитием data science — адаптированным под специфические задачи анализа данных. При анализе данных его использование оптимально для:

  • Web scraping и crawling (beautifulsoup, Scrapy, и т.д.)
  • Эффективной работы с базами данных и приложениями (sqlachemy, и т.д.)
  • Реализации классических ML алгоритмов (scikit-learn, pandas, numpy, scipy, и т.д.)
  • Задач Computer Vision

Главное в R — это обширная коллекция библиотек. Этот язык, особенно на начальном этапе, развивался по большей части благодаря усилиям статистиков, а не программистов. Статистики очень старались и их достижения сложно оспорить.

Ваши шансы на успех очень велики! Если вдруг вы подумываете о том, чтобы попробовать новую вкусную статмодель, о которой недавно услышали на конференции, прежде чем садиться писать ее с нуля, загуглите сначала R package <INSERT NAME: new great stats model>. В особенности, для ряда специфических областей науки и практики (эконометрика, биоинформатика и др.). Так, несомненным плюсом R являются возможности продвинутого статистического анализа. На мой взгляд, в R на текущий момент все еще существенно более развит анализ временных рядов.

Возможности для создания и настройки дашбордов и простых приложений для людей без знаний JS поистине огромны. Другим ключевым и пока неоспоримым преимуществом R над Python является интерактивная графика. Например, изначально, материалы для этой статьи были собраны в виде интерактивной презентации на slidify. Не верите — потратьте немного времени на изучение возможностей пары библиотек из списка: htmlwidgets, flexdashboard, shiny, slidify.

Такой высокой эффективности управления памятью, как в Python, им достичь не удалось. Но как бы статистики ни старались, сильны они не во всем. Но при гораздо больших усилиях и самоконтроле, чем в Python. Вернее, в R хороший и быстроработающий на больших объемах данных код вполне возможен.

В Python развиваются возможности визуализации (большим шагом вперед стал seaborn) и добавляются не всегда работающие эконометрические библиотеки (puFlux, pymaclab, и др.), в R — растет эффективность управления памятью и улучшаются возможности обработки данных (data.table). Постепенно все различия стираются, и оба языка становятся все более взаимозаменяемы. Так что есть ли преимущество в совмещении языков для вашего проекта, решать только вам. Вот тут, например, можно посмотреть примеры базовых операций с данными на R и Python.

К примеру, есть у вас на проект два человека, один из которых больше и сильнее может на R, другой — на Python. Что касается второго пункта о повышении скорости и удобства выполнения проектов, то здесь речь в основном об организации проекта. Конечно, также имеет значение ваш опыт решения конкретных задач на различных языках. При условии, что вы можете обеспечить code review и другой контроль для обоих языков, можно попробовать распределить задачи так, чтобы каждый участник использовал свои лучшие навыки.

Для продакшен решений важны другие критерии. Хотя тут следует уточнить, что речь идет об исследовательских проектах работы с данными. Так мы плавно и переходим к вопросу о том, когда удобнее совмещать языки. Совмещение, скорее всего, не будет полезным для устойчивости и масштабируемости расчетов.

Когда

С учетом особенностей обоих языков выиграть от совмещения R и Python можно при:

  • Исследовательском анализе данных
  • Прототипировании
  • Реализации проекта/набора задач с широким охватом по различным научно-практическим областям

Приведу примеры для возможного совмещения языков:

  • Исследование региональных рынков труда. Подключение к официальному API HH.ru с помощью Python, исследование трендов и зависимостей (xgboost, xgboostExplainer) + визуализация (Markdown-отчеты) с помощью R
  • Приложение на данных Bloomberg. Подключение к официальному API и обработка данных на Python (numpy, pandas) + вывод результата в dashboard или shiny приложение на R (flexdashboard, htmlwidgets)
  • Анализ данных социальных медиа. Парсинг и ML стек с помощью Python + эконометрика, network analysis, визуализация и сайт — с помощью R
  • Модель для прогнозирования спроса на продукцию в отдельных точках. Блок прогноза спроса на товар в единичных локациях c помощью Python (ML алгоритмы) + макроэкономический прогноз с помощью R (модели общего равновесия и структурные var модели)
  • Анализ новостного потока. Парсинг на R (rvest) + NLP на Python + параметризованный отчет на R (RMarkdown Parameterized Reports)

Все приведенные примеры — реальные проекты.

Разве что если это почти 2 отдельных сущности/модели, не критично завязанные друг на друга. Повторюсь, что даже при том, что с момента моего первого выступления о возможностях совмещения R и Python прошло уже 2 года, я все еще не решусь рекомендовать совмещать языки в продакшене.

Если есть счастливчики, запилившие R+Python продакшен что-то — поделитесь, пожалуйста, в комментах!

Как

Теперь непосредственно о стульях. Среди подходов к совмещению R и Python можно выделить три основных категории:

  • Command line tools. Исполнение скриптов с помощью командной строки + промежуточное хранение файлов на диске (filling air gap)
  • Interfacing R and Python. Одновременный запуск процессов R и Python и передача данных между ними в оперативной памяти (in-memory)
  • Другие подходы

Рассмотрим подробнее каждый из подходов.

Command line tools

Суть в разделении проекта на отдельные относительно самостоятельные части, выполняемые на R или Python и передаче данных через диск в каком-либо удобном для обоих языков формате.
По синтаксису все предельно просто. Исполнение скриптов с помощью командной строки осуществляется по схеме:

<cmd_to_run> <path_to_script> <any_additional_args>

<cmd_to_run> — команда для выполнения скрипта R или Python с помощью командной строки
<path_to_script> — директория расположения скрипта
<any_additional_args> — список аргументов на вход скрипту

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

Command

Python

R

Cmd

python path/to/myscript.py arg1 arg2 arg3

Rscript path/to/myscript.R arg1 arg2 arg3

Fetch arguments

# list, 1st el. - file executed
import sys
my_args = sys.argv

# character vector of args
myArgs <- commandArgs(trailingOnly = TRUE)

Для желающих есть совсем подробные примеры ниже.

R script из Python

R.
Для начала сформируем простой R script для определения максимального числа из списка и назовем его max.

# max.R
randomvals <- rnorm(75, 5, 0.5)
par(mfrow = c(1, 2))
hist(randomvals, xlab = 'Some random numbers')
plot(randomvals, xlab = 'Some random numbers', ylab = 'value', pch = 3)

А теперь выполним его на Python, задействовав cmd и передав список чисел для поиска максимального значения.

# calling R from Python
import subprocess # Define command and arguments
command = 'Rscript'
path2script = 'path/to your script/max.R' # Variable number of args in a list
args = ['11', '3', '9', '42'] # Build subprocess command
cmd = [command, path2script] + args # check_output will run the command and store to result
x = subprocess.check_output(cmd, universal_newlines=True) print('The maximum of the numbers is:', x)

Python script из R

Вначале создадим простой скрипт на Python по разделению текстовой строки на части и назовем его `splitstr.py`.

# splitstr.py
import sys # Get the arguments passed in
string = sys.argv[1] pattern = sys.argv[2] # Perform the splitting
ans = string.split(pattern) # Join the resulting list of elements into a single newline
# delimited string and print
print('\n'.join(ans))

А теперь выполним его на R, задействовав cmd и передав текстовую строку для удаления нужного паттерна.

# calling Python from R
command = "python" # Note the single + double quotes in the string (needed if paths have spaces)
path2script ='"path/to your script/splitstr.py"' # Build up args in a vector
string = "3523462---12413415---4577678---7967956---5456439"
pattern = "---"
args = c(string, pattern) # Add path to script as first arg
allArgs = c(path2script, args) output = system2(command, args=allArgs, stdout=TRUE) print(paste("The Substrings are:\n", output))

Для промежуточного хранения файлов при передаче информации от одного скрипта к другому можно использовать множество форматов — в зависимости от целей и предпочтений. Для работы с каждым из форматов в обоих языках есть библиотеки (и не по одной).

Форматы файлов для R и Python

Medium Storage

Python

R

Flat files

csv

csv, pandas

readr, data.table

json

json

jsonlite

yaml

PyYAML

yaml

Databases

SQL

sqlalchemy, pandasql, pyodbc

sqlite, RODBS, RMySQL, sqldf, dplyr

NoSQL

PyMongo

RMongo

Feather

for data frames

feather

feather

Numpy

for numpy objects

numpy

RcppCNPy

Классический формат — это, конечно, flat файлы. Часто csv — это наиболее просто, удобно и надежно. Если хочется структуризации или хранение информации планируется на относительно длительный срок, то, вероятно, оптимальным выбором будет хранение в базах данных (SQL/NoSQL).

Пример её использования можно посмотреть тут. Для быстрой передачи numpy объектов в R и обратно есть быстрая и устойчивая библиотека RCppCNPy.

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

Тест-сравнение по скорости чтения-записи файла на 10 млн строк представлены на рисунке ниже. Но при этом запись и чтение feather в R и Python действительно быстрые. В обоих случаях feather значимо опережает по скорости ключевые библиотеки для работы с классическим форматом csv.

Сравнение скорости работы с форматами feather и CSV для R и Python

строк. Файл: data frame, 10 млн. По 10 попыток на каждую библиотеку.

Работа с feather оказалась наиболее быстрой, но обход по скорости data.table не высокий. R: CSV чтение/запись через пакеты data.table и dplyr. И поддержка вызывает сомнения. При этом есть определенные сложности с настройкой и работой с feather для R. Пакет feather последний раз обновлялся год назад.

Выигрыш feather по скорости оказался значительным, проблем с работой с форматом на Python 3. Python: CSV чтение/запись с помощью pandas. 5 не обнаружилось.

Между языками будет некорректно, потому что весь тест осуществлялся из R — для удобства формирования итогового рисунка.
Тут важно отметить, что сравнивать скорость можно только отдельно для R и отдельно для Python.

Подведем итоги

Преимущества

  • Простой метод и поэтому часто наиболее быстрый
  • Просто увидеть промежуточный результат
  • Возможность чтения/записи большинства форматов реализована в обоих языках

Недостатки

  • Конструкция быстро становится громоздкой и сложноуправляемой по мере роста числа переходов между языками
  • Существенная потеря в скорости записи/чтения файлов при росте объема данных
  • Необходимость заранее согласовывать схему взаимодействия между языками и формат промежуточных файлов

Interfacing R and Python

Этот подход заключается в непосредственном запуске одного языка из другого и предусматривает внутреннюю (in-memory) передачу информации.

Из них удачных и устойчивых к разным параметрам, включая использование операционной системы Windows, всего две. За время, в которое народ задумывался о совмещении R и Python вместо их противопоставления, было создано достаточно много библиотек. Но уже их наличие открывает новые горизонты, значительно облегчая процесс совмещения языков.

Для вызова каждого языка через другой ниже представлено по три библиотеки — по убыванию качества.

R from Python

Наиболее популярная, стабильная и устойчивая библиотека — это rpy2. Работает быстро, имеет хорошее описание как часть официальной документации pandas, так и на отдельном сайте. Главная фишка — интеграция с pandas. Ключевым объектом для передачи информации между языками является data frame. Также декларируется прямая поддержка наиболее популярного пакета для визуализации R ggplot2. Т.е. пишете код в python, график видите непосредственно в IDE Python. Тема с ggplot2, правда, барахлит для Windows.

Для корректной работы с двумя языками это необходимо, поскольку есть неочевидные нюансы в синтаксисе и сопоставлении типов объектов при передаче. Недостаток у rpy2, пожалуй, один — необходимость потратить некоторое время на изучение туториалов. К примеру, при передаче числа из Python на вход в R вы получаете не число, а вектор из одного элемента.

Реализация через пайпы, действительно, в среднем ускоряет работу (на эту тему даже есть статья в JSS), а наличие поддержки работы с pandas объектами в R-Python внушает надежду. Ключевое преимущество библиотеки pipe, которая находится на втором месте в таблице ниже, — это скорость. Ключевой недостаток — это плохая поддержка установки библиотек в R через Python. Но имеющиеся минусы надежно сдвигают библиотеку на второе место. А для некоторых библиотек их может быть примерно 100500 и маленькая тележка. Если вы хотите воспользоваться какой-либо нестандартной библиотекой в R (а R часто нужен именно для этого), то чтобы она установилась и заработала, нужно последовательно (!!!) загрузить все её dependencies. Построенный график можно посмотреть, только записав его в файл на диске. Второй важный недостаток — неудобная работа с графикой. Если случается косяк чуть за границами стандартного набора, решение часто не найдешь ни в документации, ни на stackoverflow. Третий недостаток — слабая документация.

Например, не поддерживает передачу таблиц. Библиотека pyrserve проста в использовании, но и значительно ограничена по функционалу. Версия 0. Обновление и поддержка библиотеки разработчиками также оставляет желать лучшего. 1 является последней из доступных уже более 2 лет. 9.

Библиотеки

Комментарии

rpy2

— C-level interface
— прямая поддержка pandas
— поддержка графики (+ggplot2)
— слабая поддержка Windows

pyper

— Python code
— use of pipes (в среднем быстрее)
— косвенная поддержка pandas
— ограниченная поддержка графики
— плохая документация

pyrserve

— Python code
— use of pipes (в среднем быстрее)
— косвенная поддержка pandas
— ограниченная поддержка графики
— плохая документация
— низкий уровень поддержки проекта

Python from R

Лучшая библиотека на текущий момент — это официальная разработка RStudio reticulate. Минусы в ней пока не просматриваются. А вот преимуществ достаточно: активная поддержка, понятная и удобная документация, вывод результатов выполнения скриптов и ошибок сразу в консоль, легкая передача объектов (как и в rpy2, основной объект — дата фрейм). По поводу активной поддержки приведу пример из личного опыта: средняя скорость ответа на вопрос в stackoverflow и github/issues составляет примерно 1 минуту. Для работы можно как выучить синтаксис по туториалу и затем подключать отдельные python-модули и писать функции. Или же выполнять отдельные куски кода в python через функции py_run. Они позволяют легко выполнить python-скрипт из R, передав необходимые аргументы и получить объект со всем выходом скрипта.

Ключевое преимущество — простота синтаксиса. Второе место по качеству у библиотеки rPython. Документация также не отстает: все изложено понятно, просто и доступно. Всего 4 команды и вы мастер использования R и Python. И в R и в Python требуется дополнительный шаг, чтобы переданный объект стал таблицей. Главный недостаток — кривая реализация передачи data frame. При запуске какой-то python-команды из R непосредственно из R вы не сможете быстро понять, успешно она выполнилась или нет. Второй важный недостаток — отсутствие вывода результата выполнения функции в консоль. Работа с пакетом из Windows возможна только через боль, но возможна. Даже в документации был хороший пассаж от авторов, что для того, чтобы увидеть результат выполнения python кода нужно зайти в сам python и посмотреть. Полезные ссылки есть в таблице.

На самом деле, это очень хороший вариант. Третье место у библиотеки Rcpp. Но требует времени, чтобы разобраться. Как правило, то, что реализовано в R с помощью C++ работает устойчиво, качественно и быстро. Поэтому здесь и указано в конце списка.

Идея была хорошая — единая платформа в обе стороны с единой логикой и синтаксисом — но реализация подкачала. Еще вне таблицы можно упомянуть RSPython. Хотя в целом старую версию завести и потыкать палочкой можно. Пакет не поддерживается с 2005 г.

Для двух наиболее популярных библиотек ниже приведены подробные примеры использования.

Interfacing R from Python: rpy2

Для простоты будем использовать скрипт на R, указанный еще в первых примерах — max.R.

from rpy2.robjects import pandas2ri # loading rpy2
from rpy2.robjects import r
pandas2ri.activate() # activating pandas module
df_iris_py = pandas2ri.ri2py(r['iris']) # from r data frame to pandas
df_iris_r = pandas2ri.py2ri(df_iris_py) # from pandas to r data frame plotFunc = r(""" library(ggplot2) function(df) """) # ggplot2 example
gr = importr('grDevices') # necessary to shut the graph off
plotFunc(df_iris_r)
gr.dev_off()

Interfacing Python from R: reticulate

Для простоты будем использовать скрипт на Python, указанный еще в первых примерах — splitstr.py.

library(reticulate) # aliasing the main module
py <- import_main() # set parameters for Python directly from R session
py$pattern <- "---"
py$string = "3523462---12413415---4577678---7967956---5456439" # run splitstr.py from the slide 11
result <- py_run_file('splitstr.py') # read Python script result in R
result$ans
# [1] "3523462" "12413415" "4577678" "7967956" "5456439"

Подведем итоги

Преимущества

  • Гибкий и интерактивный способ
  • Быстрая взаимная передача объектов в рамках оперативной памяти

Недостатки

  • Необходимость читать туториалы!
  • Тонкости в сопоставимости объектов и способах их передачи между языками
  • Передача больших объемов данных также может быть затруднительной
  • Слабая поддержка Windows
  • Нестабильность между версиями библиотек

Другие подходы

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

При выборе ноутбуков можно использовать:

  • Классический jupyter и синтаксис R majic вместе с обсуждавшейся выше rpy2. Несложно, в целом, но нужно опять же потратить некоторое время на изучение синтаксиса. Другой вариант: установка IRKernel. Но в этом случае получится только запускать кернелы отдельно, передавая файлы через запись на диске.
  • R Notebook. Достаточно просто установить уже упомянутую библиотеку reticulate и далее указывать для каждой ячейки ноутбука язык, на котором вы будете творить. Удобная штука!
  • Apache Zeppelin. Говорят, достойно и также в использовании удобно.

Был еще замечательный проект Beaker Notebooks, позволявший очень удобно перемещаться между языками в интерфейсе, похожем и на Jupyter и на Zeppelin. Для передачи объектов in-memory авторами была написана отдельная библиотека beaker. Плюс можно было сразу удобно публиковать результат (в общий доступ). Но почему-то всего этого больше нет, даже старые публикации удалены — разработчики сконцентрировались на проекте BeakerX.

Среди специального софта, дающего возможность совмещать R и Python следует выделить:

  • Отличную open-source платформу H2O. Продукт предполагает отдельные библиотеки-коннекторы как для Python, так и для R.
  • Возможности SAS
  • Cloudera

Расширенный пример

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

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

Решить задачу нужно быстро, а как быструю загрузку помним только с Python, обработку и визуализацию — с R.

Данные будем передавать через CSV. Поэтому трясущимися руками заводим R Notebook, пишем в верхней ячейке ```python``` и загружаем данные с сайта World Bank.

Python: загрузка данных с сайта World Bank

import pandas as pd
import wbdata as wd # define a period of time
start_year = 2013
end_year = 2017 # list of countries under inflation targeting monetary policy regime
countries = ['AM', 'AU', 'AT', 'BE', 'BG', 'BR', 'CA', 'CH', 'CL', 'CO', 'CY', 'CZ', 'DE', 'DK', 'XC', 'ES', 'EE', 'FI', 'FR', 'GB', 'GR', 'HU', 'IN', 'IE', 'IS', 'IL', 'IT', 'JM', 'JP', 'KR', 'LK', 'LT', 'LU', 'LV', 'MA', 'MD', 'MX', 'MT', 'MY', 'NL', 'NO', 'NZ', 'PK', 'PE', 'PH', 'PL', 'PT', 'RO', 'RU', 'SG', 'SK', 'SI', 'SE', 'TH', 'TR', 'US', 'ZA'] # set dictionary for wbdata
inflation = {'FP.CPI.TOTL.ZG': 'CPI_annual', 'NY.GDP.MKTP.KD.ZG': 'GDP_annual'} # download wb data
df = wd.get_dataframe(inflation, country = countries, data_date = (pd.datetime(start_year, 1, 1), pd.datetime(end_year, 1, 1))) print(df.head())
df.to_csv('WB_data.csv', index = True)

Далее осуществляется предобработка данных на R: разброс значений инфляции в разных странах (min/max/mean) и средний темп экономического роста (по темпам роста реального ВВП). Изменяем также названия некоторых стран на более короткие — чтобы потом было удобнее сделать визуализацию.

R: предобработка данных

library(tidyverse)
library(data.table)
library(DT) # get df with python results
cpi <- fread('WB_data.csv') cpi <- cpi %>% group_by(country) %>% summarize(cpi_av = mean(CPI_annual), cpi_max = max(CPI_annual), cpi_min = min(CPI_annual), gdp_av = mean(GDP_annual)) %>% ungroup
cpi <- cpi %>% mutate(country = replace(country, country %in% c('Czech Republic', 'Korea, Rep.', 'Philippines', 'Russian Federation', 'Singapore', 'Switzerland', 'Thailand', 'United Kingdom', 'United States'), c('Czech', 'Korea', 'Phil', 'Russia', 'Singap', 'Switz', 'Thai', 'UK', 'US')), gdp_sign = ifelse(gdp_av > 0, 'Positive', 'Negative'), gdp_sign = factor(gdp_sign, levels = c('Positive', 'Negative')), country = fct_reorder(country, gdp_av), gdp_av = abs(gdp_av), coord = rep(ceiling(max(cpi_max)) + 2, dim(cpi)[1]) ) print(head(data.frame(cpi)))

Затем можно с помощью небольшого кода и R создать читабельный и приятный график, позволяющий ответить на исходный вопрос о сравнении уровней инфляции и ВВП в странах, применяющих режим инфляционного таргетирования.

R: визуализация

library(viridis)
library(scales) ggplot(cpi, aes(country, y = cpi_av)) + geom_linerange(aes(x = country, y = cpi_av, ymin = cpi_min, ymax = cpi_max, colour = cpi_av), size = 1.8, alpha = 0.9) + geom_point(aes(x = country, y = coord, size = gdp_av, shape = gdp_sign), alpha = 0.5) + scale_size_area(max_size = 8) + scale_colour_viridis() + guides(size = guide_legend(title = 'Average annual\nGDP growth, %', title.theme = element_text(size = 7, angle = 0)), shape = guide_legend(title = 'Sign of\nGDP growth, %', title.theme = element_text(size = 7, angle = 0)), colour = guide_legend(title = 'Average\nannual CPI, %', title.theme = element_text(size = 7, angle = 0))) + ylim(floor(min(cpi$cpi_min)) - 2, ceiling(max(cpi$cpi_max)) + 2) + labs(title = 'Average Inflation and GDP Rates in Inflation Targeting Countries', subtitle = paste0('For the period 2013-2017'), x = NULL, y = NULL) + coord_polar() + theme_bw() + theme(legend.position = 'right', panel.border = element_blank(), axis.text.x = element_text(colour = '#442D25', size = 6, angle = 21, vjust = 1)) ggsave('IT_countries_2013_2017.png', width = 11, height = 5.7)

по 2017 г., а также средние значения ВВП (над значениями инфляции). На полученном графике в полярной системе координат показан разброс значений инфляции в период с 2013 г. Круг означает положительный темп роста ВВП, треугольник — отрицательный.

Но это уже за рамками данной статьи. Рисунок в целом позволяет сделать некоторые предварительные выводы об успешности режима инфляционного таргетирования в России относительно других стран. А если интересно — могу дать ссылки на различные материалы по теме.

Выводы

  • Можно и нужно совмещать R и Python!
    В особенности в целях исследовательского анализа данных и прототипирования
  • Внимательно относитесь к выбору способов совмещения, основываясь на целях проекта:
    • Command line tools: просто, понятно и обязательно будет работать.
    • Отличный способ для начала!
    • Внимание к формату feather!
  • Interfacing R and Python: быстро, гибко и временами интерактивно.
    • Специфический синтаксис — необходимо читать туториалы, более сложная настройка.
    • Используйте проверенные и стабильные библиотеки: rpy2 и reticulate.
  • Другие подходы. Внимание к ноутбукам!

Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

Исследователи побороли наиболее мощные блокировщики рекламы, грядет война форматов

Большинство из нас не любят слишком навязчивую и нерелевантную рекламу, а в большинстве случаев она именно такой и является. За последние несколько последних лет блокировщики рекламы, как сервисы, так и приложения, стали чрезвычайно популярными среди интернет-пользователей. Как только они стали ...

Оптимизация обработки событий в Angular

Вместе с политикой проверки изменений ChangeDetectionStrategy. Angular предоставляет удобный декларативный способ подписки на события в шаблоне, с помощью синтаксиса (eventName)="onEventName($event)". Иными словами, если мы слушаем (input) событие на <input> элементе, то проверка изменений не будет запускаться, если пользователь просто кликает ...