chatGPT Code Interpreter: Não, você não vai perder seu emprego de cientista de dados!
Bora lá, data hackers! Vamos entender do que este tal de code interpreter (CI) é capaz, com exemplos. Já vou dando uma boa notícia: você não vai perder seu emprego!
Uma breve introdução
A IA e os LLMs revolucionaram o cenário digital, e uma ferramenta que se destaca nessa revolução é o plug-in code interpreter (CI) do ChatGPT. Segundo a OpenAI, essa ferramenta foi projetada para preencher a lacuna entre a linguagem humana e o código, permitindo que os usuários interajam com várias linguagens de programação de maneira mais intuitiva e eficiente.
O plug-in CI do ChatGPT não é apenas uma ferramenta para programadores. É um assistente pessoal que pode compor e executar código Python, dentro de um “sandbox”. É como se você entrasse num ambiente onde diversas bibliotecas já estão carregadas: o plug-in opera em um ambiente seguro e em uma área restrita com um interpretador Python por baixo dos panos. O ambiente não tem acesso a internet, ou seja, você não pode carregar mais bibliotecas, mas com que há dá para fazer muita coisa, como por exemplo análise e visualização de dados, edição de imagens e geração de fluxogramas.
O plug-in CI do ChatGPT é um divisor de águas, e já há quem o chame de “GPT5". Seja você um cientista de dados explorando novos conjuntos de dados, um estudante lutando com matemática ou alguém que precisa converter arquivos rapidamente, este plug-in precisa estar no seu dia-a-dia.
O CI tem espaço em disco temporário para carregar seus arquivos, e suporta uma ampla variedade de formatos, incluindo TXT, PDF, DOC, DOCX, JPEG, PNG, MP4, AVI, CSV, JSON, XML, XLS, XLSX, CPP, PY, HTML, PDF, DB, SQLite, e muito mais. Esta não é uma lista exaustiva: a lista completa eu peguei do twitter abaixo:
À medida que mais pessoas começarem a usá-lo, veremos algumas coisas realmente incríveis acontecerem.
Por onde começar
Infelizmente, tem uma má notícia: para acessar o CI, é necessário assinar o ChatGPT Plus com uma taxa mensal de US$20. Eu fui usuário do plus no começo do ano, depois deixei de ser e agora acho que vale a pena manter minha assinatura, assim como pago com prazer US$10 para ter o CoPilot atuando no Visual Code. Juntando os dois são cerca de R$150 por mês. É caro? Sem dúvida, mas para quem coda e trabalha com ML no dia a dia o custo-benefício é excelente. Continue a ler que acredito que vc concordará comigo.
Para habilitar o plugin é bem simples: depois de fazer login, você pode localizar o símbolo “‘…” adjacente à sua conta no canto inferior esquerdo da tela para começar a usar o plug-in.
Um pouco do CI para análise de dados
Ainda que dê para fazer um monte de coisas com o CI, vou focar em exemplos de análise de dados. O que melhor do que usar a base State of Data Brazil 2022 do Data Hackers no Kaggle? Bora lá!
Bom, baixei os dados do Kaggle, que vieram em formato zip. Tentei carregar (basta fazer o dropdown ou clicar no “+” ao lado do prompt) no CI e… não funfou! Descompactei o arquivo e aí deu certo. A primeira coisa que eu fiz foi pedir para ajustar os headers do arquivo para facilitar a leitura:
E é aqui que vem a mágica, a parte mais impressionante do CI: sem alucinação! Se você clicar em “show work” ele mostra o código python que está rodando por trás:
Em seguida, pedi para ver as colunas renomeadas:
Aí, pedi para ele criar um gráfico:
Note que ele fez uma tentativa que não deu certo e automaticamente tentou outra abordagem. E, claro, pude ver o código gerado:
# We will count the values for each gender and salary range
df_m_counts = df_m['Faixa_salarial'].value_counts().reindex(order)
df_f_counts = df_f['Faixa_salarial'].value_counts().reindex(order)
# We will use subplots to have both bars in the same plot
fig, ax = plt.subplots(1, 2, figsize=(12, 6), sharey=True)
# We plot the data, for females we invert the x axis
df_m_counts.plot(kind='barh', ax=ax[0], color='blue')
df_f_counts.plot(kind='barh', ax=ax[1], color='red')
# We hide the y labels for the second plot
ax[1].yaxis.set_visible(False)
# We add titles to the subplots
ax[0].set_title('Masculino')
ax[1].set_title('Feminino')
# We reverse the first x axis to create the pyramid effect
ax[0].invert_xaxis()
plt.tight_layout()
# We add a title to the figure
fig.suptitle('Distribuição de Salários por Gênero', y=1.02)
plt.show()
Aqui outro ponto importante: pedi para ele gerar uma imagem do gráfico. Nestes casos, sempre aparece um link para fazer o download do resultado.
Bom, eu não gostei do fato de que ele colocou vermelho e azul. Nas boas práticas de visualização de dados o “vermelho” é usado para algo negativo. E justo nas mulhers? Correndo o risco de ser “cancelado”, pedi então para refazer em cores neutras:
Notem que ele refez o gráfico e já incluiu um link para eu baixar a imagem, porque se antecipou a meu próximo pedido. O problema é que eu achei que ficou sem graça, então:
Voilá! Depois de 20 dólares e 5 minutos, um gráfico bem decente. E, claro, finalizei pedindo para ele exportar todo o código para um arquivo “.py”:
import pandas as pd
import re
import matplotlib.pyplot as plt
import seaborn as sns
# Load the dataset
df = pd.read_csv('/mnt/data/State of Data 2021.csv')
# Define a function to clean the column names
def clean_column_name(name):
name = name.split(",")[1] # split on comma and keep part after comma
name = name.replace("'", "") # remove single quotes
name = name.replace(" ", "_") # replace spaces with underscore
name = re.sub(r'\W+', '', name) # remove all characters that are not letters
return name.strip() # remove leading and trailing whitespaces
# Clean column names
df.columns = [clean_column_name(name) for name in df.columns]
# Remove leading underscore from column names
df.columns = [name.lstrip('_') for name in df.columns]
# We will count the values for each gender and salary range
df_m = df[df['Genero'] == 'Masculino']
df_f = df[df['Genero'] == 'Feminino']
df_m_counts = df_m['Faixa_salarial'].value_counts().reindex(order)
df_f_counts = df_f['Faixa_salarial'].value_counts().reindex(order)
# We will use subplots to have both bars in the same plot
fig, ax = plt.subplots(1, 2, figsize=(12, 6), sharey=True)
# We plot the data, for females we invert the x axis
df_m_counts.plot(kind='barh', ax=ax[0], color='#ADD8E6')
df_f_counts.plot(kind='barh', ax=ax[1], color='#87CEFA')
# We hide the y labels for the second plot
ax[1].yaxis.set_visible(False)
# We add titles to the subplots
ax[0].set_title('Masculino')
ax[1].set_title('Feminino')
# We reverse the first x axis to create the pyramid effect
ax[0].invert_xaxis()
plt.tight_layout()
# We add a title to the figure
fig.suptitle('Distribuição de Salários por Gênero', y=1.02)
# Save the figure as a PNG file
fig.savefig('salary_distribution_by_gender_neutral_colors_2.png', bbox_inches='tight', dpi=300)
plt.show()
IMPORTANTE: esse é apenas um exemplo simples para mostrar um pouco de como o CI funciona. As possibilidades são infinitas. Pedi para ver as bibliotecas instaladas e ele rodou um “pip freeze”:
Vejam o retorno:
absl-py, affine, aiohttp, aiosignal, analytics-python, anyio, anytree, argcomplete, argon2-cffi, argon2-cffi-bindings, arviz, asttokens, async-timeout, attrs, audioread, Babel, backcall, backoff, backports.zoneinfo, basemap, basemap-data, bcrypt, beautifulsoup4, bleach, blinker, blis, bokeh, branca, Brotli, cachetools, cairocffi, CairoSVG, camelot-py, catalogue, certifi, cffi, chardet, charset-normalizer, click, click-plugins, cligj, cloudpickle, cmudict, comm, compressed-rtf, countryinfo, cryptography, cssselect2, cycler, cymem, dbus-python, debugpy, decorator, defusedxml, deprecat, dill, distro-info, dlib, dnspython, docx2txt, ebcdic, EbookLib, einops, email-validator, entrypoints, et-xmlfile, exceptiongroup, exchange-calendars, executing, extract-msg, fastapi, fastjsonschema, fastprogress, ffmpeg-python, ffmpy, filelock, Fiona, Flask, Flask-CacheBuster, Flask-Cors, Flask-Login, folium, fonttools, fpdf, frozenlist, future, fuzzywuzzy, gensim, geographiclib, geopandas, geopy, gradio, graphviz, gTTS, h11, h2, h5netcdf, h5py, hpack, html5lib, httpcore, httptools, httpx, hypercorn, hyperframe, idna, imageio, imageio-ffmpeg, imgkit, importlib-metadata, importlib-resources, iniconfig, ipykernel, ipython, ipython-genutils, isodate, itsdangerous, jax, jedi, Jinja2, joblib, jupyter-client, jupyter-core, jupyter-server, jupyterlab, jupyterlab-pygments, jupyterlab-server, keras, kerykeion, kiwisolver, korean-lunar-calendar, librosa, llvmlite, loguru, lxml, markdown2, markdownify, MarkupSafe, matplotlib, matplotlib-inline, matplotlib-venn, mistune, monotonic, moviepy, mpmath, mtcnn, multidict, munch, murmurhash, mutagen, nest-asyncio, networkx, nltk, notebook, notebook-shim, numba, numexpr, numpy, numpy-financial, odfpy, olefile, opencv-python, openpyxl, opt-einsum, orjson, packaging, pandas, pandocfilters, paramiko, parso, pathy, patsy, pdf2image, pdfkit, pdfminer.six, pdfplumber, pdfrw, pexpect, pickleshare, Pillow, pkgutil-resolve-name, platformdirs, plotly, plotnine, pluggy, pooch, preshed, priority, proglog, prometheus-client, prompt-toolkit, pronouncing, psutil, ptyprocess, pure-eval, py, PyAudio, pycountry, pycparser, pycryptodome, pydantic, pydot, pydub, pydyf, Pygments, PyGObject, pygraphviz, pylog, pyluach, pymc3, PyMuPDF, PyNaCl, pypandoc, pyparsing, PyPDF2, pypandoc, pyparsing, PyPDF2, pypandoc, pyparsing, PyPDF2, pyphen, pyproj, pyprover, pyswisseph, pytesseract, pytest, pyth3, python-apt, python-dateutil, python-docx, python-dotenv, python-multipart, python-pptx, pyttsx3, pytz, PyWavelets, pyxlsb, PyYAML, pyzbar, pyzmq, qrcode, rarfile, rasterio, rdflib, referencing, regex, reportlab, requests, requests-unixsocket, resampy, rpds-py, scikit-image, scikit-learn, scipy, seaborn, semver, sentencepiece, shap, Shapely, six, slicer, smart-open, sniffio, sortedcontainers, SoundFile, soupsieve, spacy, spacy-legacy, SpeechRecognition, sphinx, sphinxcontrib-serializinghtml, sphinxcontrib-websupport, stack-data, starlette, statsmodels, svglib, svgwrite, sympy, tables, tabula, tabulate, tenacity, terminado, text-unidecode, textblob, textract, Theano-PyMC, thinc, threadpoolctl, tifffile, tinycss2, toml, tomli, toolz, torch, torchaudio, torchtext, torchvision, tornado, tqdm, traitlets, trimesh, typer, typing-extensions, tzlocal, ujson, unattended-upgrades, urllib3, uvicorn, uvloop, Wand, wasabi, watchfiles, wcwidth, weasyprint, websocket-client, websockets, Werkzeug, wordcloud, wrapt, wsproto, xarray, xarray-einstats, xgboost, xlrd, XlsxWriter, xml-python, yarl, zipp, zopfli.
Dá para fazer muita coisa…
No que mais dá para usar o CI?
Em dois dias não consegui explorar muito mais do que o acima, mas fiz alguns testes. Em termos de análise de dados temos alguns prompts interessantes:
- Descreva os dados
- Explique este conjunto de dados em um parágrafo
- Identifique os principais pontos
- Descreva as linhas e colunas
- Forneça insights
- Crie um gráfico (descreva o gráfico que vc quer)
- Crie um mapa de calor
- Identifique 10 tendências
- Transforme este dataset em um artigo
- Crie 10 visualizações
- Crie uma nuvem de palavras
Há diversas outras coisas que podemos fazer. Nos meus testes, vi que ele é muito bom para extrair informações de PDF. Contudo, OCR não funcionou com arquivos raster, e usando PyPDF2 houve erros da própria lib. Pedindo para ele usar o pdfplumber deu certo!
Fiz também algumas conversões de arquivo de imagem e fiquei surpreso com o resultado. Carreguei um arquivo .ico e pedi para converter para jpeg. Ele me informou que não era possível por uma questão técnica de canais de cores mas já sugeriu como resolver.
Algumas considerações finais
- Definitivamente vale US$20 ao menos para fazer uma boa análise durante 30 dias.
- Aqui no artigo pode parecer que foi tudo “suave”, mas não foi bem assim… Muitas interrupções por conta de erros do próprio chatGPT que me obrigaram a gerar novamente as respostas.
- Não podemos esquecer que isso roda em cima do GPT4, que tem uma limitação de 25 prompts a cada 3 horas. Ou seja, não dá para ficar o dia inteiro trabalhando em cima dele.
- Muita gente está vendendo o CI como o fim dos cientistas de dados. Ridiculamente ridículo. É uma ferramenta de produtividade fantástica, mas como apoio. Ainda que o próprio pytorch esteja carregado e seja possível criar modelos preditivos, não consigo enxergar um cenário onde uma pessoa que não sabe o que é um missing, um outlier ou uma variável dummy consiga criar algo de forma consistente.
- Um uso bastante interessante é justamente para quem está começando na carreira, principalmente nos primeiros passos de Python e de Pandas. Você carrega os dados, diz o que quer e tem a possibilidade de ver o código daquilo que você pediu podendo, inclusive, copiar para um notebook e rodá-lo no Jupyter ou no Visual Code.