Найти тему
Nuances of programming

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

Источник: Nuances of Programming

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 выглядит так:
-2

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 выглядит так:
-3

Обратимся к более сложному примеру. Строка кода в следующей инструкции вычисляет среднюю цену дома в разных регионах для домов с типом 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 выглядит так:
-4

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

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 выглядит так:
-5

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

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.
-6

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

Последний пример иллюстрирует изменение названий столбцов. В данной инструкции код 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 гарантирует, что изменения вносятся непосредственно в датафрейм без присвоения результата новой переменной.
-7

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

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

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

Заключение

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

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

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

Читайте нас в Telegram, VK

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