Как перевести код R в Python с помощью ChatGPT

Python и R  —  это два ключевых игрока в экосистеме науки о данных. Я работал над проектами, написанными как на Python, так и на R. Они отлично решают задачи, связанные с очисткой, управлением и анализом данных. 

Но иногда требуется перевести базу кода с R на Python или наоборот. Это связано с уровнем профессиональной подготовки специалистов компании. Если большая часть из них программирует на Python, а меньшая  —  на R, то лучше вести проекты на Python. 

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

Для осуществления этой процедуры нужны специалисты с навыками программирования на обоих языках, найти которых непросто. К счастью, можно воспользоваться ChatGPT, который обладает приличным уровнем навыков почти во всех языках программирования. 

В статье мы сформулируем инструкцию для ChatGPT. В соответствии с ней он переведет код R, написанный посредством пакета data.table, на Python с помощью библиотеки pandas

Мы просто предоставим код, не сообщая, что он делает или для чего предназначен. Прежде всего, пишем начальную инструкцию, в которой определяем задачу для ChatGPT и ожидаемые результаты: 

Начальная инструкция. Ты инженер ПО с многолетним опытом программирования на Python и R. Твоя задача  —  преобразовать код R в Python. Код R чистит данные и управляет ими с помощью пакета data.table. Ты должен преобразовать этот код в Python, используя библиотеку pandas

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

Convert the following R code that uses `data.table` package 
to Python using the `pandas` library:

```
melb[, Price_per_area := Price / Landsize]
```

Ответ ChatGPT:

Предоставленный код R создает новый столбец Price_per_area, который является результатом деления Price на Landsize посредством библиотеки data.table.

Эквивалентная операция в Python с использованием библиотеки pandas выглядит так: 

ChatGPT не только выдает код, но и объясняет, что он делает. Это очень помогает тем, кто не владеет исходным или целевым языком. 

Во втором примере создается подмножество таблицы данных путем фильтрации по столбцам Price (цена) и Type (тип). 

Convert the following R code that uses `data.table` package 
to Python using the `pandas` library:

```
subset <- melb[Price > 1000000 & Type == "h"]
```

Ответ ChatGPT:

В предоставленном коде R создается подмножество датафрейма melb, в котором Price больше 1000000, а Type равен h

Эквивалентная операция в Python с использованием библиотеки pandas выглядит так:

Обратимся к более сложному примеру. Строка кода в следующей инструкции вычисляет среднюю цену дома в разных регионах для домов с типом u:

Convert the following R code that uses `data.table` package 
to Python using the `pandas` library:

```
melb[Type == "u", .(avg_price = mean(Price)), by="Regionname"]
```

Ответ ChatGPT:

В предоставленном коде R средняя цена Price вычисляется для каждого Regionname, где Type равен u.

Эквивалентная операция в Python с использованием библиотеки pandas выглядит так:

Код из вышеуказанного скрина: 

avg_price = melb[melb['Type'] == 'u'].groupby('Regionname')['Price'].mean().reset_index().rename(columns={'Price': 'avg_price'})

Он успешно выполняет задачу, но я бы предпочел задействовать именованные агрегации, которые и короче, и легче для чтения. Инструктируем ChatGPT их задействовать: 

Convert the following R code that uses `data.table` package 
to Python using the `pandas` library. Used named aggregations.

```
melb[Type == "u", .(avg_price = mean(Price)), by="Regionname"]
```

Ответ ChatGPT:

Эквивалентный код Python с использованием именованных агрегаций в библиотеке pandas выглядит так:

Код из вышеуказанного скрина: 

avg_price = melb[melb['Type'] == 'u'].groupby('Regionname').agg(avg_price=('Price', 'mean')).reset_index()

Этот вариант получше, так как не требует последующего переименования столбцов. Можно также применить параметр as_index функции groupby и задать ему значение False, чтобы не сбрасывать индекс после вычисления. 

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

Convert the following R code that uses `data.table` package 
to Python using the `pandas` library. Used named aggregations.

```
melb[
Type == "u",
.(avg_price = mean(Price), number_of_houses=.N),
by="Regionname"
][order(-avg_price)]
```

Ответ ChatGPT:

Код Python выполняет следующие действия: 

1. Фильтрует датафрейм, где столбец Type равен u.

2. Группирует отфильтрованный датафрейм по столбцу Regionname

3. Подсчитывает среднее значение и количество домов столбца Price для каждой группы, называя полученные столбцы соответственно avg_price и number_of_houses

4. Преобразует объект groupby обратно в датафрейм. 

5. Сортирует датафрейм в порядке убывания по avg_price

Как и в предыдущих примерах, пошаговое объяснение способствует полному пониманию и отладке кода. 

Последний пример иллюстрирует изменение названий столбцов. В данной инструкции код R переименовывает столбец Type в HouseType , а Distance —  в DistanceCBD.

Convert the following R code that uses `data.table` package 
to Python using the `pandas` library.

```
setnames(melb,
c("Type", "Distance"),
c("HouseType", "DistanceCBD"))
```

Ответ ChatCPT:

Код R переименовывает столбец Type в HouseType, а Distance —  в DistanceCBD.

Эквивалентная операция в Python с использованием библиотеки pandas выглядит так: 

Предлагаемая строка кода Python делает то же самое: переименовывает столбец Type в HouseType и Distance в DistanceCBD в датафрейме melb

Примечание. Параметр inplace=True гарантирует, что изменения вносятся непосредственно в датафрейм без присвоения результата новой переменной. 

Код из вышеуказанного скрина: 

melb.rename(columns={'Type': 'HouseType', 'Distance': 'DistanceCBD'}, inplace=True)

Отметим весьма полезное примечание относительно параметра inplace, поскольку данное обстоятельство легко упустить из виду. 

Заключение 

Рассмотренные примеры показывают, насколько успешно ChatGPT переводит код с одного языка программирования на другой. В статье мы выполняли построчный перевод. Следует отметить, что такой перевод не может считаться доказательством того, что ChatGPT способен перевести всю базу кода. 

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

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи Soner Yıldırım: Using ChatGPT to Translate R Code to Python

Предыдущая статьяРефакторинг кода Go для тестопригодности: возможности интерфейсов
Следующая статьяНастройка сервера AWS Aurora PostgreSQL и мониторинг его производительности