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 на текущий момент все еще существенно более развит анализ временных рядов.

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

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

Постепенно все различия стираются, и оба языка становятся все более взаимозаменяемы. В 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)

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

Повторюсь, что даже при том, что с момента моего первого выступления о возможностях совмещения R и Python прошло уже 2 года, я все еще не решусь рекомендовать совмещать языки в продакшене. Разве что если это почти 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 script для определения максимального числа из списка и назовем его max.R.
# 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. Пример её использования можно посмотреть тут.

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

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

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


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

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

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

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

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


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

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

Недостатки

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

Interfacing R and Python


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

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

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

R from Python


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

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

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

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

Библиотеки Комментарии
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. Документация также не отстает: все изложено понятно, просто и доступно. Главный недостаток — кривая реализация передачи data frame. И в R и в Python требуется дополнительный шаг, чтобы переданный объект стал таблицей. Второй важный недостаток — отсутствие вывода результата выполнения функции в консоль. При запуске какой-то python-команды из R непосредственно из R вы не сможете быстро понять, успешно она выполнилась или нет. Даже в документации был хороший пассаж от авторов, что для того, чтобы увидеть результат выполнения python кода нужно зайти в сам python и посмотреть. Работа с пакетом из Windows возможна только через боль, но возможна. Полезные ссылки есть в таблице.

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

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

Библиотеки Комментарии
reticulate — хорошая документация
— активное развитие (с авг 2016 г.)
— волшебная функция
py_run_file("script.py")
rPython — передача данных через json
— непрямая передача таблиц
хорошая документация
слабая поддержка Windows
— часто падает с Anaconda
Rcpp — через C++ (Boost.Python и Rcpp)
— нужны специфические навыки
хороший пример


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

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){
   p <- ggplot(iris, aes(x = Sepal.Length, y = Petal.Length)) 
          + geom_point(aes(color = Species))
   print(p)
   ggsave('iris_plot.pdf', plot = p, width = 6.5, height = 5.5)
 }
""") # 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.

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

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)




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

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

Выводы


  • Можно и нужно совмещать R и Python!
    В особенности в целях исследовательского анализа данных и прототипирования
  • Внимательно относитесь к выбору способов совмещения, основываясь на целях проекта:

    • Command line tools: просто, понятно и обязательно будет работать.
    • Отличный способ для начала!
    • Внимание к формату feather!
  • Interfacing R and Python: быстро, гибко и временами интерактивно.

    • Специфический синтаксис — необходимо читать туториалы, более сложная настройка.
    • Используйте проверенные и стабильные библиотеки: rpy2 и reticulate.
  • Другие подходы. Внимание к ноутбукам!

Комментарии (4)


  1. borisxm
    08.11.2018 19:00

    Сложно делать на R большие интерактивные проекты. Как специфическая считалка, он весьма полезен и прекрасно работает в связке с Python. А вот на RMarkdown в RStudio «подсел» основательно, правда, не все гладко с интеграцией Python'a, но понемногу вроде допиливают.


    1. Efaldgent Автор
      09.11.2018 08:55

      С интерактивщиной на R есть, конечно, нюансы. Но если с ними разобраться, то можно очень быстро делать красивые, аккуратные и удобные приложения. Markdown в связке с htmlwidgets дает очень большие возможности (и, как правило, предусмотрена интеграция с D3.js), а для всего остального есть shiny.


  1. assusdan
    08.11.2018 20:22

    А есть ещё Graal, который и то, и то умеет (пока не полная совместимость, но прогресс идёт), и который под совместную работу языков заточен. А, и ещё, там очень быстрая реализация R :)


    1. Efaldgent Автор
      09.11.2018 08:55

      Спасибо! Не знала про существование Graal. Надо обязательно посмотреть.