Привет, чемпион!

За прошедший год появилось много полезных AI инструментов для упрощения работы разработчиков, аналитиков данных и даже дизайнеров: Copilot допишет за тебя код, EverSQL оптимизирует SQl-запрос, а Kittl нарисует логотип. А сейчас поговорим о PandasAI -  аналоге классической библиотеки pandas на стероидах ChatGPT.

Как работает PandasAI?

По сути это LLM агент, которые имеет доступ к Pandas. Агенту необходимо передать вопрос или указание на естественном языке, а он на основе данных найдет, построит диаграмму или преобразует данные. Примеры запросов:

PandasAI vs просты запросы

Для установки используем команду pip install pandasai. Есть github библиотеки. Импортируем библиотеки, передаем ключ API OpenAI и создаем датасет с данными о продажах книг.

Пример кода и запрос в PandasAI
import os
import pandas as pd
from pandasai import Agent

os.environ["PANDASAI_API_KEY"] = "YOUR_API_KEY"

sales_by_book = pd.DataFrame({
  'book' : ['A', 'D', 'E', 'U', 'C', 'R', 'E'],
  "revenue": [1500, 3500, 1290, 4610, 7200, 9100, 2200]
})

agent = Agent(sales_by_book)
# Пишем вопрос “Какие топ-3 книги по продажам?”
agent.chat('Which are the top 3 book by sales?')
# PandasAI ответит нам R, C, U

Можно попробовать более сложные вопросы, например “Каковы общие продажи для топ-3 книг?”.

agent.chat("What is the total sales for the top 3 book by sales?")
# The total sales for the top 3 books is: 20910

Отлично! Получаем ожидаемо верный ответ. Вопрос для llm-ки оказался слишком простым. Зато все сделано всего в одну строчку. Давайте попробуем порисовать гистограммы?!

PandasAI vs графики

# Построй гистограмму книг по их продажаем. Используй разные цвета для каждой
agent.chat("Plot the histogram of books showing for each one. Use different colors for each bar"
)

И получаем вполне приличный график за пару секунд, который мы скорее всего строили бы дольше. 

Результат
Идеально отработало!
Идеально отработало!

И что самое крутое, у нас есть код для построения этого графика. Конечно я бы строил через seaborn. Т.к он удобнее и чем matplotlib, но тут решение было такое:

Пример кода
import pandas as pd
import matplotlib.pyplot as plt

# Data for books and revenue
data = {'book': ['R', 'A', 'E'], 'revenue': [9100, 7200, 3500]}
books_df = pd.DataFrame(data)

# Plotting histogram with different colors for each bar
plt.figure(figsize=(10, 6))
colors = ['skyblue', 'salmon', 'lightgreen']
plt.bar(books_df['book'], books_df['revenue'], color=colors)
plt.xlabel('Book')
plt.ylabel('Revenue')
plt.title('Revenue by Book')
plt.show()

Также PandasAI имеет возможность создавать объекты SmartDatalake - хранилище нескольких датафреймов, которое позволяет выполнять запросы для объединенных данных. 

PandasAI vs мердж таблиц

Для этого нам потребоваться работать с несколькими фреймами данных одновременно. В таких случаях вместо использования SmartDataframe следует использовать SmartDatalake. Концепция очень похожа на SmartDataframe, но вместо того, чтобы принимать в качестве входных данных только 1 df, она может принимать несколько значений.

К примеру, имеем 2 датафрейма с данными о продаж книг и их цветах, которые связаны между собой по book_id сотрудника. Спросим PandasAI , какой цвето самой продаваемой книги?

Код
from pandasai import SmartDatalake

sales_by_book = pd.DataFrame({
    'book_id' :   ['A', 'D', 'E', ' U', 'C', 'R', 'E'],
    "revenue": [1500, 3500, 1290, 4610, 7200, 9100, 2200]
})

color_by_book = pd.DataFrame(
    {
        'book_id' :   ['A', 'D', 'E', ' U', 'C', 'R', 'E'],
        "color":   ['green',  'red',  'green',  'red', 'black', 'green', 'red'],
    }
)

lake = SmartDatalake([sales_by_book, color_by_book])
lake.chat("What's the color of book that was saled the most?")

# LLM-ка ответ нам:
# The color of the book that was sold the most is green.

Для выполнения такого запроса в Pandas пришлось бы мерджить два датафрейма между собой по id, а потом выполнять запрос поиска максимальных продаж, но ИИ-шка справилась на отлично. Такая классная фича сильно упрощает работу с несколькими источниками данных, а это все же одна из основных задач в работе аналитика данных.

Еще одним вариантом использования SmartDatalake является преобразование данных для дальнейшей работы с ними, например для построения моделей машинного обучения, потому что PandasAI понимает не только вопросы, но и запросы на изменения данных.

lake.chat("Merge this dataframes in one and rank it by the salary descending and delete the highest and the book with lowest sales")
Результат
Результат запроса. Верный!
Результат запроса. Верный!

PandasAI vs моя фирменная сложная задач

До этого были вполне себе простые вещи. Давайте попробуем справится с задачей, которая в свое время заняла у меня несколько часов экспериментов. Тогда я не смог сходу решил эту задачу, но посмотрим, смог бы PandasAI сохранить мне драгоценное время?!

Формулировка задания. Попробуйте решить сами без ChatGPT и PandasAI
Формулировка задания. Попробуйте решить сами без ChatGPT и PandasAI

Подаем таблицу в SmartDataframe и делаем запрос. В конце для удобства выводим сразу код генерации через атрибут last_code_generated.

Код и запрос
import os
import pandas as pd
from pandasai import SmartDataframe

os.environ["PANDASAI_API_KEY"] = 'API_KEY'

table_df = pd.DataFrame({
    'book' : ['A','A','A','A', 'D','D','D','D', 'E','E','E', 'E'],
     'page' : [15, 25, 54, 44, 75, 22, 14, 60, 18, 10, 20, 95],
     'prediction' : [0.1, 0.2, 0.26, 0.5, 0.1, 0.2, 0.4, 0.6, 0.1, 0.97, 0.2, 0.95]
})

lake = SmartDataframe(table_df)

lake.chat("Aggregate this dataframe and print top-3 pages for every book with the highest prediction, print only book and a list of pages. I'm expecting 'book' and 'pages' columns in anwer")
print('Предлагаемый код:')
print(lake.last_code_generated)

Результат
В точку! Прям как у меня в примере
В точку! Прям как у меня в примере

А еще круто, мы можем брать в работу дальше код результа. Запускаем предложенный код. И он тоже работает! Вот он ниже. Можно брать и использовать!

Код из last_code_generated
table_df = (table_df
            .sort_values(by='prediction', ascending=False)
            .groupby('book')
            .head(3)
            .groupby('book')['page']
            .apply(list)
            .reset_index()
            )

Но что еще интереснее, PandasAI можно дообучить на своих данных, подробнее это описано в документации. Так же можно использовать другие LLM-ки. С другими вариантами использования PandasAI можно познакомиться здесь (ссылка на ноутбук).

Плюсы и минусы PandasAI

Плюсы
  • Очевидно, самые большое преимущество - ускорение работы с данными, поскольку не приходится периодически подсматривать в документацию Pandas в поисках нужных методов.

  • В некоторых случаях это позволит снизить количество аd-hoс задач на аналитика: продакт или бизнес-аналитик сможет самостоятельно провести EDA или проверить гипотезу.

Минусы

А вы бы использовали PandasAI в своей работе? Пишите в комменты!

А если вам нравится применение подобных AI инструментов в проекции на Data Scientist'ов - подписывайтесь на мой телеграм. Нас уже почти 10 000. Удачи!

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


  1. vtal007
    01.07.2024 07:53

    Подскажите, во всех ли случаях, AI дает код своих расчетов? Иначе это очень опасная штука

    # LLM-ка ответ нам:

    # The color of the book that was sold the most is green.

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

    Когда есть код, его можно проверить самому, его могут проверить коллеги. А ответ модельки это просто ответ модельки


    1. Aleron75 Автор
      01.07.2024 07:53

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