Skip to content

Instantly share code, notes, and snippets.

@falvojr
Last active July 21, 2023 21:40
Show Gist options
  • Save falvojr/a6f186a4ed3c017abb7660ab194400b5 to your computer and use it in GitHub Desktop.
Save falvojr/a6f186a4ed3c017abb7660ab194400b5 to your computer and use it in GitHub Desktop.
ifood-dev-week.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"collapsed_sections": [
"ekkcgs-nujuG"
],
"authorship_tag": "ABX9TyNnx8OR5MF70bT9hwwTl2FT",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/falvojr/a6f186a4ed3c017abb7660ab194400b5/ifood-dev-week.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"source": [
"# iFood Dev Week\n",
"\n",
"Saiba mais sobre essa semana incrível nos artigos:\n",
"- [Desvendando a iFood Dev Week](https://www.dio.me/articles/desvendando-a-ifood-dev-week)\n",
"- [Fechando a iFood Dev Week Com Chave de Ouro](https://web.dio.me/articles/fechando-a-ifood-dev-week-com-chave-de-ouro)"
],
"metadata": {
"id": "oPigZArHe3d_"
}
},
{
"cell_type": "markdown",
"source": [
"## Dia 1: [Conheça o Google Colab e o Projeto Desta Dev Week](https://www.youtube.com/live/59XwC5e8U1k?feature=share)\n",
"\n",
"Vamos mergulhar no Google Colab, aprendendo como ele pode ser usado para automatizar tarefas cotidianas, principalmente através da manipulação de planilhas. Além disso, você aprenderá na prática o conceito do Net Promoter Score (NPS), uma métrica fundamental para entender a satisfação do cliente."
],
"metadata": {
"id": "VJ9ncXpVjIz9"
}
},
{
"cell_type": "code",
"source": [
"\"\"\"\n",
"Este código baixa um arquivo CSV de feedbacks do Google Drive e carrega os dados em um DataFrame pandas.\n",
"\n",
"O arquivo é identificado por um ID único ('file_id'), que é extraído da URL do arquivo no Google Drive.\n",
"A URL do arquivo no Google Drive tem o seguinte formato:\n",
"https://drive.google.com/file/d/FILE_ID/view?usp=sharing\n",
"\"\"\"\n",
"\n",
"import gdown\n",
"import pandas as pd\n",
"\n",
"file_id = '1_nyLNsT55X37Y0KDBXVXzSYsX-SoSqZi'\n",
"gdown.download(f'https://drive.google.com/uc?id={file_id}', 'feedbacks.csv')\n",
"\n",
"dados = pd.read_csv('/content/feedbacks.csv', delimiter=';')"
],
"metadata": {
"id": "NbC1PgziTHai",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "62c86614-019e-4665-9280-a9dd089e1807"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"Downloading...\n",
"From: https://drive.google.com/uc?id=1_nyLNsT55X37Y0KDBXVXzSYsX-SoSqZi\n",
"To: /content/feedbacks.csv\n",
"100%|██████████| 365/365 [00:00<00:00, 428kB/s]\n"
]
}
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "pQo2iXQLPjnR",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "23c6c830-37fc-43f8-d2df-71b068bf5d13",
"cellView": "form"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"40.0\n"
]
}
],
"source": [
"#@title\n",
"\"\"\"\n",
"Versão 1: Paradigma Imperativo.\n",
"\n",
"Este script lê um arquivo CSV contendo feedback de usuários, no qual cada feedback tem uma nota associada.\n",
"O NPS é calculado como a diferença entre o percentual de promotores (nota >= 9) e detratores (nota <= 6), multiplicada por 100.\n",
"A implementação é realizada de uma maneira imperativa, onde os comandos são executados sequencialmente.\n",
"\"\"\"\n",
"\n",
"notas = dados['nota']\n",
"\n",
"detratores = 0\n",
"promotores = 0\n",
"\n",
"for nota in notas:\n",
" if nota >= 9:\n",
" promotores += 1\n",
" elif nota <= 6:\n",
" detratores += 1\n",
"\n",
"nps = (promotores - detratores) / len(notas) * 100\n",
"\n",
"print(nps)"
]
},
{
"cell_type": "code",
"source": [
"#@title\n",
"\"\"\"\n",
"Versão 2: Paradigma Funcional.\n",
"\n",
"Este código segue uma abordagem funcional para calcular o NPS a partir dos dados de feedback.\n",
"A função \"calcular_nps\" é definida para encapsular a lógica do cálculo do NPS. Esta versão apresenta\n",
"uma separação de responsabilidades mais clara do que a versão imperativa, além de melhorias de código pontuais.\n",
"\"\"\"\n",
"\n",
"import pandas as pd\n",
"\n",
"def calcular_nps(notas):\n",
" detratores = notas.apply(lambda nota: nota <= 6).sum()\n",
" promotores = notas[notas >= 9].count()\n",
"\n",
" return (promotores - detratores) / len(notas) * 100\n",
"\n",
"notas = dados['nota']\n",
"\n",
"nps = calcular_nps(notas)\n",
"\n",
"print(nps)"
],
"metadata": {
"id": "-qLL6LQ1qcAR",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "72846d0f-f6c5-4132-9fd7-52d78480c254",
"cellView": "form"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"40.0\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"\"\"\"\n",
"Versão 3: Paradigma Orientado a Objetos (POO).\n",
"\n",
"Este script adota uma abordagem Orientada a Objetos (OO) para calcular o NPS a partir de feedback de usuários.\n",
"Duas classes são definidas, onde:\n",
"- Feedback representa um único feedback de usuário;\n",
"- AnalisadorFeedback é usado para calcular o NPS a partir de uma lista de Feedbacks.\n",
"A POO fornece uma abstração mais clara dos dados e comportamentos envolvidos no cálculo do NPS.\n",
"Desta forma, nossa solução estará preparada para as evoluções do nosso projeto.\n",
"\"\"\"\n",
"\n",
"class Feedback:\n",
" def __init__(self, nota, comentario):\n",
" self.nota = nota\n",
" self.comentario = comentario\n",
"\n",
"class AnalisadorFeedback:\n",
" def __init__(self, feedbacks):\n",
" self.feedbacks = feedbacks\n",
"\n",
" def calcular_nps(self):\n",
" # Por ser uma list do Python, aplicamos o conceito de \"list comprehension\" para filtrar nossos Feedbacks.\n",
" detratores = sum(1 for feedback in self.feedbacks if feedback.nota <= 6)\n",
" promotores = sum(1 for feedback in self.feedbacks if feedback.nota >= 9)\n",
"\n",
" return (promotores - detratores) / len(self.feedbacks) * 100\n",
"\n",
"feedbacks = dados.apply(lambda linha: Feedback(linha['nota'], linha['comentario']), axis=1)\n",
"\n",
"analisador = AnalisadorFeedback(feedbacks)\n",
"nps = analisador.calcular_nps()\n",
"\n",
"print(nps)"
],
"metadata": {
"id": "Rzhk-sOXrwJb",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "10a8c0ff-e4d6-4737-9484-58c7e9a2f0aa"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"37.5\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"## Dia 2: [Desvendando o Poder dos Seus Dados com Python](https://www.youtube.com/live/2Y59NEO9KU4?feature=share)\n",
"\n",
"No segundo dia, vamos conectar nosso Google Colab ao Google Drive, extrair dados do NPS e aplicar as técnicas de ETL (Extração, Transformação e Carregamento) nesses dados. Com a ajuda da biblioteca matplotlib, criaremos gráficos para visualizar e compreender o nível de satisfação dos nossos usuários."
],
"metadata": {
"id": "ekkcgs-nujuG"
}
},
{
"cell_type": "code",
"source": [
"\"\"\"\n",
"Criar um gráfico usando \"matplotlib\" para visualizar o NPS que calculamos no Dia 1!\n",
"\"\"\"\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.patches as mpatches\n",
"\n",
"# Definição das constantes que usaremos para visualizar o NPS\n",
"NPS_ZONAS = ['Crítico', 'Aperfeiçoamento', 'Qualidade', 'Excelência']\n",
"NPS_VALORES = [-100, 0, 50, 75, 100]\n",
"NPS_CORES = ['#FF595E', '#FFCA3A', '#8AC926', '#1982C4']\n",
"\n",
"def criar_grafico_nps(nps):\n",
" # Inicia a figura e os eixos.\n",
" fig, ax = plt.subplots(figsize=(10, 2))\n",
"\n",
" # Itera sobre as zonas para criar a barra de cores do gráfico.\n",
" for i, zona in enumerate(NPS_ZONAS):\n",
" ax.barh([0], width=NPS_VALORES[i+1]-NPS_VALORES[i], left=NPS_VALORES[i], color=NPS_CORES[i])\n",
"\n",
" # Cria a \"seta\" que vai indicar o NPS no gráfico.\n",
" ax.barh([0], width=1, left=nps, color='black')\n",
" # Remove os ticks do eixo Y\n",
" ax.set_yticks([])\n",
" # Define os limites do eixo X\n",
" ax.set_xlim(-100, 100)\n",
" # Define os ticks do eixo X\n",
" ax.set_xticks(NPS_VALORES)\n",
"\n",
" # Inclui um texto com o valor de NPS, o qual ficará alinhado com a \"seta\" criada anteriormente.\n",
" plt.text(nps, 0, f'{nps:.2f}', ha='center', va='center', color='white', bbox=dict(facecolor='black'))\n",
"\n",
" # Cria a legenda do gráfico\n",
" patches = [mpatches.Patch(color=NPS_CORES[i], label=NPS_ZONAS[i]) for i in range(len(NPS_ZONAS))]\n",
" plt.legend(handles=patches, bbox_to_anchor=(1,1))\n",
"\n",
" # Inclui um título no gráfico.\n",
" plt.title('Gráfico de NPS da iFood Dev Week')\n",
"\n",
" # Mostra o gráfico.\n",
" plt.show()\n",
"\n",
"criar_grafico_nps(nps)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 172
},
"id": "bXaJ7Q0zf95l",
"outputId": "4c5e4ebf-2e27-4be3-8f80-bce43dc28ecb"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 1000x200 with 1 Axes>"
],
"image/png": "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RrNmzfDxxx/j5MmTAB4szLVq1Sq89dZbMDAwwLx58xATEwOZTIacnBzExMRg2LBhyM3NhUwmg0wmw6xZswA8uNV82bJl0ng5OTkYPXo0rKysoKuri+bNmyMqKkqq3759O5o1awa5XA5HR0csWbJEnW8HgVe8iYiIiIiIakxWVhb27NmDefPmVXk7uKmpqfT7rFmzsGDBAixbtgxaWlr4999/pTovLy8sW7YMM2bMwJUrVwAAhoaGlfpTKBTo27cv8vPzsWnTJjg5OSE+Ph6ampoAgDNnzsDf3x+zZs1CQEAAjh8/jnHjxsHc3BwhISE1u/P0WEy8iYiIiIiIakhSUhKEEHB1dX1q28GDB2PYsGHS64cTbx0dHZiYmEAmk8Ha2vqxfRw4cACnTp1CQkICGjduDABo1KiRVP/111+jR48emD59OgCgcePGiI+Px+LFi5l4qxFvNSciIiIiIqohQohqt23btu0LjxcXF4cGDRpISfejEhIS0KlTJ6WyTp06ITExEeXl5S88PlUPE28iIiIiIqIa4uLiAplMVuUCao+qiZXJ9fT0XrgPUj0m3kRERERERDXEzMwMvr6+WLFiBQoLCyvVP/posCfR0dF56lVpd3d33LhxA1evXq2y3s3NDceOHVMqO3bsGBo3bizNAyfVY+JNRERERERUg1asWIHy8nK0b98e27dvR2JiIhISErB8+XJ4enpWux9HR0cUFBTg4MGDuHPnDoqKiiq18fb2RteuXeHn54f9+/cjJSUF0dHR2LNnDwBg0qRJOHjwIObMmYOrV69i/fr1iIyMxOTJk2tsf+npmHgTERERERHVoEaNGuHs2bPo1q0bJk2ahObNm6NXr144ePAgVq1aVe1+vLy8MGbMGAQEBMDCwgKLFi2qst327dvRrl07BAYGomnTppg6dap0pdzDwwNbt27FL7/8gubNm2PGjBn44osvuLCamsnEs8z+rwF5eXkwMTFB7sBBMNbWUefQRET0spmYVNsRUB0na39c6bU45VVLkTyfxeJObYfw2lu698faDuG1piguROaXvsjNzYWxsbFSXXFxMVJSUtCwYUPo6ur+/4o7d4FJ04CyMvUEqa0NLFkI1DdXz3hUZzz2HK0CHydGRERERER1R33zB4lwfr56xjMyYtJNL4yJNxERERER1S31zZkMU53COd5EREREREREKsTE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qTZ0dWS1HUaN0NWRob6p9tMbEhERPQaveBMREVGNs7eW48r/PHAnR7W3gj46j/zMBvcaH6O+qTbsrXlljYiInh8TbyIiIlIJe2u52hNWVSyARkS1S81rQRNV27Ocm7zVnIiIiIiIXjra2g+meBQVFdVyJERVKy0tBQBoamo+tS2veBMRERER0UtHU1MTpqamuHXrFgBAX18fMtmrsXYE1X0KhQK3b9+Gvr4+tLSenlYz8SYiIiIiopeStbU1AEjJN9HLRENDA/b29tX6QoiJNxERERERvZRkMhlsbGxgaWmJsjL1PLebqLp0dHSgoVG92dtMvImIiIiI6KWmqalZrXm0RC8rLq5GREREREREpEJMvImIiIiIiIhUiIk3ERERERERkQox8SYiIiIiIiJSISbeRERERERERCrExJuIiIiIiIhIhZh4ExEREREREakQE28iIiIiIiIiFWLiTURERERERKRCTLyJiIiIiIiIVIiJNxEREREREZEKMfEmIiIiIiIiUiEm3kREREREREQqxMSbiIiIiIiISIWYeBMRERERERGpEBNvIiIiIiIiIhVi4k1ERERERESkQky8iYiIiIiIiFSIiTcRERERERGRCjHxJiIiIiIiIlIhJt5EREREREREKsTEm4iIiIiIiEiFmHgTERERERERqRATbyIiIiIiIiIVYuJNREREREREpEJMvImIiIiIiIhUiIk3ERERERERkQox8SYiIiIiIiJSISbeRERERERERCrExJuIiIiIiIhIhZh4ExEREREREakQE28iIiIiIiIiFWLiTURERERERKRCTLyJiIiIiIiIVIiJNxEREREREZEKMfEmIiIiIiIiUiEm3kREREREREQqxMSbiIiIiIiISIWYeBMRERERERGpEBNvIiIiIiIiIhVi4k1ERERERESkQky8iYiIiIiIiFSIiTcRERERERGRCjHxJiIiIiIiIlIhJt5EREREREREKsTEm4iIiIiIiEiFmHgTERERERERqRATbyIiIiIiIiIVYuJNREREREREpEIyIYRQ54B5eXkwMTFBbm4ujI2N1Tk0ERERERG9RJgb0OuCV7yJiIiIiIiIVIiJNxEREREREZEKMfEmIiIiIiIiUiEm3kREREREREQqxMSbiIiIiIiISIW01D1gxSLqeXl56h6aiIiIiIheIhU5gZoftESkdmpPvO/evQsAsLOzU/fQRERERET0Erp79y5MTExqOwwilVF74m1mZgYASE1N5YeLiOg1lpeXBzs7O/z33398diu9lvgZqH08BrUvNzcX9vb2Uo5A9KpSe+KtofFgWrmJiQn/wBEREYyNjfnvAb3W+BmofTwGta8iRyB6VfEMJyIiIiIiIlIhJt5EREREREREKqT2xFsul2PmzJmQy+XqHpqIiF4i/PeAXnf8DNQ+HoPax2NArwuZ4Nr9RERERERERCrDW82JiIiIiIiIVIiJNxEREREREZEKMfEmIiIiIiIiUiEm3kREREREREQqpLLEe968efDy8oK+vj5MTU2rbJOamor+/ftDX18flpaWmDJlCu7fv6/UJiYmBh4eHpDL5XB2dsa6detUFTIREanJihUr4OjoCF1dXXTo0AGnTp2q7ZCIVGbWrFmQyWRKP66urlJ9cXExxo8fD3NzcxgaGsLPzw+ZmZm1GPGrx9HRsdIxkMlkGD9+PADAx8enUt2YMWNqOeq666+//sKbb74JW1tbyGQy7Ny5U6leCIEZM2bAxsYGenp66NmzJxITE5XaZGVlISgoCMbGxjA1NcXw4cNRUFCgxr0gqlkqS7xLS0vx3nvvYezYsVXWl5eXo3///igtLcXx48exfv16rFu3DjNmzJDapKSkoH///ujWrRvi4uIQFhaGESNGYO/evaoKm4iIVGzLli34+OOPMXPmTJw9exYtW7aEr68vbt26VduhEalMs2bNkJ6eLv0cPXpUqps4cSL++OMPbNu2DYcPH0ZaWhrefffdWoz21RMbG6v0/u/fvx8A8N5770ltRo4cqdRm0aJFtRVunVdYWIiWLVtixYoVVdYvWrQIy5cvx7fffou///4bBgYG8PX1RXFxsdQmKCgIly5dwv79+xEVFYW//voLo0aNUtcuENU8oWJr164VJiYmlcp3794tNDQ0REZGhlS2atUqYWxsLEpKSoQQQkydOlU0a9ZMabuAgADh6+ur0piJiEh12rdvL8aPHy+9Li8vF7a2tmL+/Pm1GBWR6sycOVO0bNmyyrqcnByhra0ttm3bJpUlJCQIAOLEiRNqivD189FHHwknJyehUCiEEEJ4e3uLjz76qHaDekUBEL/++qv0WqFQCGtra7F48WKpLCcnR8jlcvHzzz8LIYSIj48XAERsbKzUJjo6WshkMnHz5k21xU5Uk2ptjveJEyfQokULWFlZSWW+vr7Iy8vDpUuXpDY9e/ZU2s7X1xcnTpxQa6xERFQzSktLcebMGaW/7RoaGujZsyf/ttMrLTExEba2tmjUqBGCgoKQmpoKADhz5gzKysqUPhOurq6wt7fnZ0JFSktLsWnTJnzwwQeQyWRS+ebNm1G/fn00b94cn376KYqKimoxyldXSkoKMjIylM55ExMTdOjQQTrnT5w4AVNTU7Rt21Zq07NnT2hoaODvv/9We8xENUGrtgbOyMhQSroBSK8zMjKe2CYvLw/37t2Dnp6eeoIlIqIacefOHZSXl1f5t/3y5cu1FBWRanXo0AHr1q1DkyZNkJ6ejtmzZ6NLly64ePEiMjIyoKOjU2k9HCsrK+n/h6hm7dy5Ezk5OQgJCZHKBg8eDAcHB9ja2uL8+fOYNm0arly5gh07dtReoK+oivO6qn8HHs4BLC0tleq1tLRgZmbGzwXVWc+UeH/yySdYuHDhE9skJCQoLRhCRERE9Drr27ev9Lu7uzs6dOgABwcHbN26lRcRasGaNWvQt29f2NraSmUPzx1u0aIFbGxs0KNHDyQnJ8PJyak2wiSiV8wzJd6TJk1S+nawKo0aNapWX9bW1pVWsa1YwdPa2lr676OremZmZsLY2Jj/UBER1UH169eHpqZmlX/bK/72E73qTE1N0bhxYyQlJaFXr14oLS1FTk6O0lVvfiZU4/r16zhw4MBTr2R36NABAJCUlMTEu4ZVnNeZmZmwsbGRyjMzM9GqVSupzaMLbt6/fx9ZWVn8XFCd9UxzvC0sLODq6vrEHx0dnWr15enpiQsXLih9qPbv3w9jY2M0bdpUanPw4EGl7fbv3w9PT89nCZuIiF4SOjo6aNOmjdLfdoVCgYMHD/JvO702CgoKkJycDBsbG7Rp0wba2tpKn4krV64gNTWVnwkVWLt2LSwtLdG/f/8ntouLiwMApcSQakbDhg1hbW2tdM7n5eXh77//ls55T09P5OTk4MyZM1KbP//8EwqFQvpShKiuUdkc79TUVGRlZSE1NRXl5eXSHzBnZ2cYGhqid+/eaNq0KYYMGYJFixYhIyMDn3/+OcaPHw+5XA4AGDNmDCIjIzF16lR88MEH+PPPP7F161bs2rVLVWETEZGKffzxxwgODkbbtm3Rvn17LFu2DIWFhRg2bFhth0akEpMnT8abb74JBwcHpKWlYebMmdDU1ERgYCBMTEwwfPhwfPzxxzAzM4OxsTE+/PBDeHp6omPHjrUd+itFoVBg7dq1CA4OhpbW//9f4OTkZPz000/o168fzM3Ncf78eUycOBFdu3aFu7t7LUZcdxUUFCApKUl6nZKSgri4OJiZmcHe3h5hYWGYO3cuXFxc0LBhQ0yfPh22trYYMGAAAMDNzQ19+vTByJEj8e2336KsrAyhoaEYNGiQ0hQBojpFVculBwcHCwCVfg4dOiS1uXbtmujbt6/Q09MT9evXF5MmTRJlZWVK/Rw6dEi0atVK6OjoiEaNGom1a9eqKmQiIlKTb775Rtjb2wsdHR3Rvn17cfLkydoOiUhlAgIChI2NjdDR0RFvvPGGCAgIEElJSVL9vXv3xLhx40S9evWEvr6+eOedd0R6enotRvxq2rt3rwAgrly5olSempoqunbtKszMzIRcLhfOzs5iypQpIjc3t5YirfsOHTpUZR4QHBwshHjwSLHp06cLKysrIZfLRY8ePSodl7t374rAwEBhaGgojI2NxbBhw0R+fn4t7A1RzZAJIUQt5fxEREREREREr7xae443ERERERER0euAiTcRERERERGRCjHxJiIiIiIiIlIhJt5EREREREREKsTEm4iIiIiIiEiFmHgTERERERERqRATbyIiIiIiIiIVYuJNREREREREpEJMvImIiIiIiIhUiIk3ERERERERkQox8SYiIiIiIiJSISbeRERERERERCr0/wAbl6hUhN2wjgAAAABJRU5ErkJggg==\n"
},
"metadata": {}
}
]
},
{
"cell_type": "markdown",
"source": [
"## Dia 3: [Decifrando Sentimentos com Inteligência Artificial (IA)](https://www.youtube.com/live/wj9tVSWVzOM?feature=share)\n",
"\n",
"No último dia, vamos utilizar as técnicas de Processamento de Linguagem Natural (PLN) para analisar os sentimentos expressos nos comentários associados às notas de NPS. Dessa forma, teremos uma perspectiva qualitativa que complementa nossos dados quantitativos."
],
"metadata": {
"id": "jHl6lLS1usU1"
}
},
{
"cell_type": "code",
"source": [
"!pip install openai"
],
"metadata": {
"id": "4GgxVSEDUevW"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"# Documentação Oficial da API OpenAI: https://platform.openai.com/docs/api-reference/introduction\n",
"# Informações sobre o Período Gratuito: https://help.openai.com/en/articles/4936830\n",
"\n",
"# Para gerar uma API Key:\n",
"# 1. Crie uma conta na OpenAI\n",
"# 2. Acesse a seção \"API Keys\"\n",
"# 3. Clique em \"Create API Key\"\n",
"# Link direto: https://platform.openai.com/account/api-keys\n",
"\n",
"# Substitua o texto TODO por sua API Key da OpenAI, ela será salva como uma variável de ambiente.\n",
"openai_api_key = 'TODO'"
],
"metadata": {
"id": "ahl3NezxUD2r"
},
"execution_count": 1,
"outputs": []
},
{
"cell_type": "code",
"source": [
"\"\"\"\n",
"Integrar com o ChatGPT e usá-lo como um modelo para análise de sentimentos dos nossos comentários.\n",
"Seguem alguns links úteis:\n",
"1. Endpoint que vamos consumir: https://platform.openai.com/docs/api-reference/chat/create\n",
"2. Collection Postman da OpenAI: https://www.postman.com/devrel/workspace/openai/documentation/13183464-90abb798-cb85-43cb-ba3a-ae7941e968da\n",
"\"\"\"\n",
"\n",
"import openai\n",
"\n",
"openai.api_key = openai_api_key\n",
"\n",
"def analisar_sentimentos(feedbacks):\n",
"\n",
" comentarios_formatados = \"\\n\".join([f\"- Nota {feedback.nota}! {feedback.comentario}\" for feedback in feedbacks])\n",
"\n",
" prompt = f\"\"\"\n",
" Sintetize uma análise geral sobre os seguintes comentário:\n",
" {comentarios_formatados}\n",
" \"\"\"\n",
"\n",
" respostaAPI = openai.ChatCompletion.create(\n",
" model=\"gpt-4\",\n",
" messages=[\n",
" {\n",
" \"role\": \"system\",\n",
" \"content\": \"Você é um modelo de análise de sentimentos com foco em feedbacks sobre experiências educacionais.\"\n",
" },\n",
" {\n",
" \"role\": \"user\",\n",
" \"content\": prompt\n",
" }\n",
" ]\n",
" )\n",
" return respostaAPI.choices[0].message.content\n",
"\n",
"insigths = analisar_sentimentos(feedbacks)\n",
"print(insigths)"
],
"metadata": {
"id": "G7H3LfBgUU1h",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "878a5aae-2af0-4616-925d-149074134bd0"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Em geral, o feedback sobre a experiência educacional no Bootcamp é altamente positivo, com a maioria das avaliações recebendo notas superiores a 7. Os alunos parecem satisfeitos com a qualidade e a entrega do programa. No entanto, um feedback destacou a expectativa de incorporação de mentorias de inteligência artificial (IA) e outro expressou a preferência pela linguagem de programação Python. Uma única crítica negativa foi muito severa, classificando a experiência como horrível. Tal comentário pode indicar problemas específicos que precisam ser analisados. No geral, há um forte reconhecimento na potencialização da educação aberta e um desejo de melhorias contínuas na oferta do Bootcamp.\n"
]
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment