From 31af28f1fe3ff3d05895ebea46128854ac5b4ba6 Mon Sep 17 00:00:00 2001 From: FlorentLvr Date: Fri, 23 Feb 2024 11:58:08 +0100 Subject: [PATCH 1/4] feat: barline cashflow statement --- .../core/domain/Plotly_Follow_cash_flow.ipynb | 626 ++++++++++++++++++ 1 file changed, 626 insertions(+) create mode 100644 models/finance-engine/core/domain/Plotly_Follow_cash_flow.ipynb diff --git a/models/finance-engine/core/domain/Plotly_Follow_cash_flow.ipynb b/models/finance-engine/core/domain/Plotly_Follow_cash_flow.ipynb new file mode 100644 index 0000000..95e57ef --- /dev/null +++ b/models/finance-engine/core/domain/Plotly_Follow_cash_flow.ipynb @@ -0,0 +1,626 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "6859e258-5916-47e0-bafe-840216bccb66", + "metadata": { + "execution": { + "iopub.execute_input": "2021-02-23T14:22:16.610471Z", + "iopub.status.busy": "2021-02-23T14:22:16.610129Z", + "iopub.status.idle": "2021-02-23T14:22:16.627784Z", + "shell.execute_reply": "2021-02-23T14:22:16.626866Z", + "shell.execute_reply.started": "2021-02-23T14:22:16.610384Z" + }, + "papermill": {}, + "tags": [] + }, + "source": [ + "\"Plotly.png\"" + ] + }, + { + "cell_type": "markdown", + "id": "53d8faa3-625a-4ce0-8ac0-2144fc572bf9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "# Plotly - Follow cash flow" + ] + }, + { + "cell_type": "markdown", + "id": "c333a80d-ed9a-4721-9980-8b2724b12dc6", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Tags:** #plotly #html #csv #image #finance #analytics #transactions #ledger #metric" + ] + }, + { + "cell_type": "markdown", + "id": "8df1c2de-f9b1-44f6-abdd-dc6fe4251c14", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Author:** [Florent Ravenel](https://www.linkedin.com/in/florent-ravenel/)" + ] + }, + { + "cell_type": "markdown", + "id": "7d7c58bc-96fa-4961-96d8-7f7ef5c535b4", + "metadata": { + "papermill": {}, + "tags": [ + "description" + ] + }, + "source": [ + "**Description:** This notebook creates a barline chart graph tracking your cashflows over the last 12 months." + ] + }, + { + "cell_type": "markdown", + "id": "distinguished-truth", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Input" + ] + }, + { + "cell_type": "markdown", + "id": "numeric-mediterranean", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "potential-surfing", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "import plotly.graph_objects as go\n", + "from plotly.subplots import make_subplots\n", + "import pandas as pd\n", + "import naas\n", + "import random\n", + "import os\n", + "from datetime import date, datetime, timedelta\n", + "import naas_data_product" + ] + }, + { + "cell_type": "markdown", + "id": "9b63f92e-b1e0-43cc-86d8-db12ae89558e", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Setup variables\n", + "**Inputs**\n", + "- `entity_dir`: Entity directory.\n", + "- `entity_name`: Entity name.\n", + "- `input_dir`: Input directory to retrieve file from.\n", + "- `input_file`: Input file.\n", + "- `spreadsheet_url`: Google Sheets spreadsheet URL.\n", + "- `sheet_name`: Google Sheets sheet name.\n", + "- `title`: Graph title.\n", + "\n", + "**Outputs**\n", + "- `output_dir`: This variable is used for storing the path to the directory where the output files will be saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "47b21878-f530-436b-95f8-4ed65b42da19", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "# Inputs\n", + "entity_dir = pload(os.path.join(naas_data_product.OUTPUTS_PATH, \"entities\", \"0\"), \"entity_dir\")\n", + "entity_name = pload(os.path.join(naas_data_product.OUTPUTS_PATH, \"entities\", \"0\"), \"entity_name\")\n", + "input_dir = os.path.join(entity_dir, \"finance-engine\", date.today().isoformat())\n", + "input_file = \"transactions\"\n", + "spreadsheet_url = pload(os.path.join(naas_data_product.OUTPUTS_PATH, \"entities\", \"0\"), \"abi_spreadsheet\")\n", + "sheet_name = \"TRANSACTIONS\"\n", + "title = \"Cash Flow Statement\"\n", + "\n", + "# Outputs\n", + "output_dir = os.path.join(entity_dir, \"finance-engine\", date.today().isoformat())\n", + "os.makedirs(output_dir, exist_ok=True)\n", + "output_name = \"finance_trend\"" + ] + }, + { + "cell_type": "markdown", + "id": "registered-showcase", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "markdown", + "id": "6c59de19-9541-47b9-8561-55ad88243907", + "metadata": {}, + "source": [ + "### Set outputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a5948dbb-fb9b-48b2-ac10-ce635837609e", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "html_output = os.path.join(output_dir, f\"{output_name}.html\")\n", + "image_output = os.path.join(output_dir, f\"{output_name}.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "0df10ed5-44fe-4abd-a3c1-61154c819e8c", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Get \"Cashin\" data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82cb0b6e-1a32-46fb-96b2-a1fba5ff515e", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "data_cashin = {\n", + " \"ENTITY\": [\"Abi\"] * 12,\n", + " \"SCENARIO\": [\"2023-12\"] * 12,\n", + " \"LABEL\": [\n", + " \"2023-01\",\n", + " \"2023-02\",\n", + " \"2023-03\",\n", + " \"2023-04\",\n", + " \"2023-05\",\n", + " \"2023-06\",\n", + " \"2023-07\",\n", + " \"2023-08\",\n", + " \"2023-09\",\n", + " \"2023-10\",\n", + " \"2023-11\",\n", + " \"2023-12\",\n", + " ],\n", + " \"GROUP\": [\"Cash in\"] * 12,\n", + " \"VALUE\": [random.randint(250, 500) for i in range(0, 12)],\n", + "}\n", + "\n", + "df_cashin = pd.DataFrame(data_cashin)\n", + "df_cashin" + ] + }, + { + "cell_type": "markdown", + "id": "706da888-645f-4d24-a2df-08570dcf10e3", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Get \"Cashout\" data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "df314ec4-6836-4cb8-a488-59ebd71937e9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "data_cashout = {\n", + " \"ENTITY\": [\"Abi\"] * 12,\n", + " \"SCENARIO\": [\"2023-12\"] * 12,\n", + " \"LABEL\": [\n", + " \"2023-01\",\n", + " \"2023-02\",\n", + " \"2023-03\",\n", + " \"2023-04\",\n", + " \"2023-05\",\n", + " \"2023-06\",\n", + " \"2023-07\",\n", + " \"2023-08\",\n", + " \"2023-09\",\n", + " \"2023-10\",\n", + " \"2023-11\",\n", + " \"2023-12\",\n", + " ],\n", + " \"GROUP\": [\"Cash out\"] * 12,\n", + " \"VALUE\": [random.randint(0, 350) * -1 for i in range(0, 12)],\n", + "}\n", + "df_cashout = pd.DataFrame(data_cashout)\n", + "df_cashout" + ] + }, + { + "cell_type": "markdown", + "id": "9a8484e3-708e-4453-81e5-05122c4dacb5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Calculate \"Cash Position\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "081e987c-a03a-4c98-8573-180ec3d7c6a1", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "# concat cash in and cash out\n", + "df_position = pd.concat([df_cashin, df_cashout])\n", + "\n", + "# rename column GROUP = \"Position\" and groupby + agg\n", + "to_group = [\n", + " \"ENTITY\",\n", + " \"SCENARIO\",\n", + " \"LABEL\",\n", + " \"GROUP\"\n", + "]\n", + "to_agg = {\n", + " \"VALUE\": \"sum\"\n", + "}\n", + "df_position[\"GROUP\"] = \"Position\"\n", + "df_position[\"VALUE\"] = df_position[\"VALUE\"] + 1000\n", + "df_position = df_position.groupby(to_group, as_index=False).agg(to_agg)\n", + "df_position" + ] + }, + { + "cell_type": "markdown", + "id": "392bcc8b-0844-4d69-ac89-d07eccbaaa7c", + "metadata": {}, + "source": [ + "### Create title and logo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f15b017-bdc8-4d19-bd85-31ab1082144d", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Calc data\n", + "total = df_position.loc[df_position.index[-1], \"VALUE\"]\n", + "total_n1 = df_position.loc[df_position.index[-2], \"VALUE\"]\n", + "varv = df_cashin.loc[df_cashin.index[-1], \"VALUE\"] + df_cashout.loc[df_cashout.index[-1], \"VALUE\"]\n", + "varp = 0\n", + "if total_n1 != 0:\n", + " varp = varv / total_n1\n", + "\n", + "# Create value to displayed\n", + "total_d = \"{:,.0f}\".format(total).replace(\",\", \" \")\n", + "varv_d = \"{:,.0f}\".format(varv).replace(\",\", \" \")\n", + "varp_d = \"{:,.0%}\".format(varp).replace(\",\", \" \")\n", + "if varv >= 0:\n", + " varv_d = f\"+{varv_d}\"\n", + " varp_d = f\"+{varp_d}\"\n", + "title_full = f\"{title}
{total_d} | {varv_d} ({varp_d}) vs last month\"\n", + "\n", + "# Logo\n", + "logo = None\n", + "if varv > 0:\n", + " logo = arrow_up\n", + "elif varv > -0.2:\n", + " logo = arrow_right\n", + "else:\n", + " logo = arrow_down\n", + "print(\"Title:\", title_full)" + ] + }, + { + "cell_type": "markdown", + "id": "tested-astrology", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Create barlinechart using Plotly" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "crude-louisville", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "def create_barlinechart(\n", + " df_cashin,\n", + " df_cashout,\n", + " df_position,\n", + " xaxis_title=None,\n", + " yaxis_title_r=None,\n", + " yaxis_title_l=None,\n", + "):\n", + " # Create figure with secondary y-axis\n", + " fig = make_subplots(specs=[[{\"secondary_y\": True}]])\n", + "\n", + " # Add traces\n", + " fig.add_trace(\n", + " go.Bar(\n", + " name=\"Encaissement\",\n", + " x=df_cashin[\"LABEL\"],\n", + " y=df_cashin[\"VALUE\"],\n", + " marker=dict(color=\"#1b7656\"),\n", + " ),\n", + " secondary_y=False,\n", + " )\n", + " fig.add_trace(\n", + " go.Bar(\n", + " name=\"Décaissement\",\n", + " x=df_cashout[\"LABEL\"],\n", + " y=df_cashout[\"VALUE\"] * -1,\n", + " marker=dict(color=\"#cd3244\"),\n", + " ),\n", + " secondary_y=False,\n", + " )\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=df_position[\"LABEL\"],\n", + " y=df_position[\"VALUE\"],\n", + " mode=\"lines\",\n", + " line=dict(color=\"#46a7f5\", width=2.5),\n", + " ),\n", + " secondary_y=True,\n", + " )\n", + " # Add logo\n", + " fig.add_layout_image(\n", + " dict(\n", + " source=logo,\n", + " xref=\"paper\",\n", + " yref=\"paper\",\n", + " x=0.01,\n", + " y=1.05,\n", + " sizex=0.12,\n", + " sizey=0.12,\n", + " xanchor=\"right\",\n", + " yanchor=\"bottom\",\n", + " )\n", + " )\n", + "\n", + " # Add figure title\n", + " fig.update_layout(\n", + " title=title_full,\n", + " title_x=0.09,\n", + " title_font=dict(family=\"Arial\", color=\"black\"),\n", + " paper_bgcolor=\"#ffffff\",\n", + " plot_bgcolor=\"#ffffff\",\n", + " legend=None,\n", + " margin_pad=10,\n", + " margin_r=10,\n", + " width=1200,\n", + " height=600,\n", + " xaxis_title=xaxis_title,\n", + " xaxis_title_font=dict(family=\"Arial\", size=12, color=\"black\"),\n", + " xaxis={\"type\": \"category\"},\n", + " )\n", + "\n", + " # Set y-axes titles\n", + " fig.update_yaxes(\n", + " title_text=yaxis_title_r,\n", + " title_font=dict(family=\"Arial\", size=12, color=\"black\"),\n", + " secondary_y=False,\n", + " )\n", + " fig.update_yaxes(\n", + " title_text=yaxis_title_l,\n", + " title_font=dict(family=\"Arial\", size=12, color=\"black\"),\n", + " secondary_y=True,\n", + " )\n", + " fig.update_traces(showlegend=False)\n", + " fig.show()\n", + " return fig\n", + "\n", + "\n", + "fig = create_barlinechart(\n", + " df_cashin,\n", + " df_cashout,\n", + " df_position,\n", + " xaxis_title=None,\n", + " yaxis_title_r=\"Flows\",\n", + " yaxis_title_l=\"Position\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "lonely-pacific", + "metadata": { + "execution": { + "iopub.execute_input": "2021-07-02T23:32:10.789097Z", + "iopub.status.busy": "2021-07-02T23:32:10.788829Z", + "iopub.status.idle": "2021-07-02T23:32:10.796900Z", + "shell.execute_reply": "2021-07-02T23:32:10.796358Z", + "shell.execute_reply.started": "2021-07-02T23:32:10.789033Z" + }, + "papermill": {}, + "tags": [] + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "id": "87c9da68-5ca9-4294-b44d-f2514cce77ef", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Save and share your csv file" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "438645b6-1c1f-4725-9649-5b9f0fdb8da9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "# # Save your dataframe in CSV\n", + "# df_trend.to_csv(csv_output, index=False)" + ] + }, + { + "cell_type": "markdown", + "id": "2748d1c8-1fdc-4e73-837d-61f24080227f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Save and share your graph in HTML\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1721bf1f-c2a9-4111-802a-6d03203ac6ba", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "# Save your graph in HTML\n", + "fig.write_html(html_output)\n", + "\n", + "# Share output with naas\n", + "html_link = naas.asset.add(html_output, override_prod=True, params={\"inline\": True})\n", + "\n", + "# -> Uncomment the line below to remove your asset\n", + "# naas.asset.delete(html_output)" + ] + }, + { + "cell_type": "markdown", + "id": "6d05d5bf-e745-4392-9603-d10b8314cdf5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Save and share your graph in image\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f51a9529-41fe-4236-9023-b13c1e0cce6b", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "# Save your graph in PNG\n", + "fig.write_image(image_output)\n", + "\n", + "# Share output with naas\n", + "image_link = naas.asset.add(image_output, override_prod=True, params={\"inline\": True})\n", + "\n", + "# -> Uncomment the line below to remove your asset\n", + "# naas.asset.delete(image_output)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + }, + "naas": { + "notebook_id": "d73ae271b1557432c42c76c41c62f94628dd97120e11e41b0f1c0f0eee97a9c5", + "notebook_path": "FEC/FEC_Visualiser_Trésorerie_Barline_Chart.ipynb" + }, + "papermill": { + "default_parameters": {}, + "environment_variables": {}, + "parameters": {}, + "version": "2.3.3" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 841fa365e2af7792b2e96906ffb1744a82164ae2 Mon Sep 17 00:00:00 2001 From: FlorentLvr Date: Mon, 26 Feb 2024 11:12:30 +0100 Subject: [PATCH 2/4] feat: add matplotlib create world cloud to core/domain opendata --- ...atplotlib_Create_content_world_cloud.ipynb | 347 ++++++++++++++++++ 1 file changed, 347 insertions(+) create mode 100644 models/opendata-engine/core/domain/Matplotlib_Create_content_world_cloud.ipynb diff --git a/models/opendata-engine/core/domain/Matplotlib_Create_content_world_cloud.ipynb b/models/opendata-engine/core/domain/Matplotlib_Create_content_world_cloud.ipynb new file mode 100644 index 0000000..2d70893 --- /dev/null +++ b/models/opendata-engine/core/domain/Matplotlib_Create_content_world_cloud.ipynb @@ -0,0 +1,347 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "e46cda1e", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "\"Matplotlib.png\"" + ] + }, + { + "cell_type": "markdown", + "id": "b0d4ced6", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "# Matplotlib - Create content world cloud" + ] + }, + { + "cell_type": "markdown", + "id": "06cb7cb7", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Tags:** #linkedin #worldcloud #content #analytics #dependency" + ] + }, + { + "cell_type": "markdown", + "id": "c64eee3c", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Author:** [Florent Ravenel](https://www.linkedin.com/in/florent-ravenel/)" + ] + }, + { + "cell_type": "markdown", + "id": "694879b8-e278-423d-bc29-2373efbff404", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Description:** This notebook demonstrates how to create a word cloud using Matplotlib. It provides a step-by-step guide on how to generate a word cloud from a given text data, which is a popular way to visualize high-frequency words in a dataset. The result is a word cloud image that visualizes the frequency of words in the given text data. The size of each word in the image corresponds to its frequency in the text data." + ] + }, + { + "cell_type": "markdown", + "id": "f65cd676", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Input" + ] + }, + { + "cell_type": "markdown", + "id": "428474ab", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6214ae90", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "try:\n", + " from wordcloud import WordCloud\n", + "except:\n", + " !pip install wordcloud --user\n", + " from wordcloud import WordCloud\n", + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "import os\n", + "from datetime import date, datetime, timedelta\n", + "import naas_data_product\n", + "from naas_drivers import gsheet" + ] + }, + { + "cell_type": "markdown", + "id": "b4c94227-a6d1-41ac-9126-a84bced89012", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Setup variables\n", + "**Inputs**\n", + "- `entity_dir`: Entity directory.\n", + "- `entity_name`: Entity name.\n", + "- `input_dir`: Input directory to retrieve file from.\n", + "- `input_file`: Input file.\n", + "- `spreadsheet_url`: Google Sheets spreadsheet URL.\n", + "- `sheet_name`: Google Sheets sheet name.\n", + "- `title`: Graph title.\n", + "\n", + "**Outputs**\n", + "- `output_dir`: This variable is used for storing the path to the directory where the output files will be saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "190b8d21", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "# Inputs\n", + "entity_dir = pload(os.path.join(naas_data_product.OUTPUTS_PATH, \"entities\", \"0\"), \"entity_dir\")\n", + "entity_name = pload(os.path.join(naas_data_product.OUTPUTS_PATH, \"entities\", \"0\"), \"entity_name\")\n", + "input_dir = os.path.join(entity_dir, \"opendata-engine\", date.today().isoformat())\n", + "input_file = \"opendata\"\n", + "spreadsheet_url = pload(os.path.join(naas_data_product.OUTPUTS_PATH, \"entities\", \"0\"), \"abi_spreadsheet\")\n", + "sheet_name = \"EVENTS\"\n", + "column_text = \"CONTENT\"\n", + "\n", + "# Outputs\n", + "output_dir = os.path.join(entity_dir, \"opendata-engine\", date.today().isoformat())\n", + "os.makedirs(output_dir, exist_ok=True)\n", + "output_name = \"opendata_worldcloud\"" + ] + }, + { + "cell_type": "markdown", + "id": "b3566c94", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "markdown", + "id": "294a8bb7-84cf-4767-8398-dc1e1bad046c", + "metadata": {}, + "source": [ + "### Set outputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c60b9e8b-78b3-4b3e-8004-ba8d0b2721d7", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "image_output = os.path.join(output_dir, f\"{output_name}.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "ba2000df", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Get data from spreadsheet" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "13a489d5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "df_init = gsheet.connect(spreadsheet_url).get(sheet_name=sheet_name)\n", + "print(\"- Data fetched:\", len(df_init))\n", + "df_init.head(1)" + ] + }, + { + "cell_type": "markdown", + "id": "7456a048", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Extract text from CONTENT" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22b41e65", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "# Creating the text variable\n", + "text = \" \".join(text for text in df_init.astype(str)[column_text])\n", + "# text" + ] + }, + { + "cell_type": "markdown", + "id": "4d76ebbf-beae-4671-960c-3950cec63400", + "metadata": {}, + "source": [ + "### Create worldcloud" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c21e9add-8dab-4030-b3dd-d2d13f2c3ccd", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "# Creating word_cloud with text as argument in .generate() method\n", + "wordcloud = WordCloud(\n", + " collocations=False,\n", + " background_color=\"white\",\n", + " width=1200,\n", + " height=600\n", + ").generate(remove_emojis(text))\n", + "\n", + "# Display the generated image\n", + "plt.imshow(wordcloud, interpolation=\"bilinear\")\n", + "plt.axis(\"off\")\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "id": "c8083216", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "id": "91a987c6", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Save and share your graph in image\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8342abf9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "# Save your image in PNG\n", + "wordcloud.to_file(image_output)\n", + "\n", + "# Share output with naas\n", + "naas.asset.add(image_output)\n", + "\n", + "# -> Uncomment the line below to remove your asset\n", + "# naas.asset.delete(image_output)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9cbe797a-0ec7-4abe-acc6-db5e7ad189fb", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + }, + "naas": { + "notebook_id": "11b2c07be26f4a540e850f376dd2cfffa6b41699fbb48e33fd0a5eecd9155e20", + "notebook_path": "LinkedIn/LinkedIn_Extract_content_world_cloud.ipynb" + }, + "papermill": { + "default_parameters": {}, + "environment_variables": {}, + "parameters": {}, + "version": "2.3.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 755158e35b29e95c3b6ff023cae621486b4886df Mon Sep 17 00:00:00 2001 From: FlorentLvr Date: Mon, 26 Feb 2024 11:15:47 +0100 Subject: [PATCH 3/4] feat: add graph operations --- .../Plotly_Follow_meetings_and_tasks.ipynb | 541 ++++++++++++++++++ 1 file changed, 541 insertions(+) create mode 100644 models/operations-engine/core/domain/Plotly_Follow_meetings_and_tasks.ipynb diff --git a/models/operations-engine/core/domain/Plotly_Follow_meetings_and_tasks.ipynb b/models/operations-engine/core/domain/Plotly_Follow_meetings_and_tasks.ipynb new file mode 100644 index 0000000..fc1b5cf --- /dev/null +++ b/models/operations-engine/core/domain/Plotly_Follow_meetings_and_tasks.ipynb @@ -0,0 +1,541 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "35673cb3-a65e-4e94-a60b-8b3863fd455b", + "metadata": { + "execution": { + "iopub.execute_input": "2021-02-23T14:22:16.610471Z", + "iopub.status.busy": "2021-02-23T14:22:16.610129Z", + "iopub.status.idle": "2021-02-23T14:22:16.627784Z", + "shell.execute_reply": "2021-02-23T14:22:16.626866Z", + "shell.execute_reply.started": "2021-02-23T14:22:16.610384Z" + }, + "papermill": {}, + "tags": [] + }, + "source": [ + "\"Plotly.png\"" + ] + }, + { + "cell_type": "markdown", + "id": "b0d4ced6", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "# Plotly - Follow meetings and tasks" + ] + }, + { + "cell_type": "markdown", + "id": "06cb7cb7", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Tags:** #plotly #html #csv #image #operations #analytics #meetings #tasks #metric" + ] + }, + { + "cell_type": "markdown", + "id": "c64eee3c", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Author:** [Florent Ravenel](https://www.linkedin.com/in/florent-ravenel/)" + ] + }, + { + "cell_type": "markdown", + "id": "naas-description", + "metadata": { + "papermill": {}, + "tags": [ + "description" + ] + }, + "source": [ + "**Description:** This notebook creates a barchart graph tracking your daily meetings and tasks over the past two weeks." + ] + }, + { + "cell_type": "markdown", + "id": "f65cd676", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Input" + ] + }, + { + "cell_type": "markdown", + "id": "428474ab", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6214ae90", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "import plotly.graph_objects as go\n", + "from naas_drivers import gsheet\n", + "import pandas as pd\n", + "import os\n", + "from datetime import date, datetime, timedelta\n", + "import naas_data_product\n", + "import random" + ] + }, + { + "cell_type": "markdown", + "id": "5ed1bed1", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Setup variables\n", + "**Inputs**\n", + "- `entity_dir`: Entity directory.\n", + "- `entity_name`: Entity name.\n", + "- `input_dir`: Input directory to retrieve file from.\n", + "- `input_file`: Input file.\n", + "- `spreadsheet_url`: Google Sheets spreadsheet URL.\n", + "- `sheet_name`: Google Sheets sheet name.\n", + "- `title`: Graph title.\n", + "\n", + "**Outputs**\n", + "- `output_dir`: This variable is used for storing the path to the directory where the output files will be saved." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "190b8d21", + "metadata": { + "papermill": {}, + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "# Inputs\n", + "entity_dir = pload(os.path.join(naas_data_product.OUTPUTS_PATH, \"entities\", \"0\"), \"entity_dir\")\n", + "entity_name = pload(os.path.join(naas_data_product.OUTPUTS_PATH, \"entities\", \"0\"), \"entity_name\")\n", + "input_dir = os.path.join(entity_dir, \"operations-engine\", date.today().isoformat())\n", + "input_file = \"meetings\"\n", + "input_file2 = \"tasks\"\n", + "spreadsheet_url = pload(os.path.join(naas_data_product.OUTPUTS_PATH, \"entities\", \"0\"), \"abi_spreadsheet\")\n", + "sheet_name = \"MEETINGS\"\n", + "sheet_name2 = \"TASKS\"\n", + "title = \"Ops\"\n", + "\n", + "# Outputs\n", + "output_dir = os.path.join(entity_dir, \"operations-engine\", date.today().isoformat())\n", + "os.makedirs(output_dir, exist_ok=True)\n", + "output_name = \"ops_trend\"" + ] + }, + { + "cell_type": "markdown", + "id": "b3566c94", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "markdown", + "id": "f306feb8-0889-44c5-bb0a-99e74fdd729d", + "metadata": {}, + "source": [ + "### Set outputs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a6f8da1-d66e-4f21-8d5f-56d67924895c", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "html_output = os.path.join(output_dir, f\"{output_name}.html\")\n", + "image_output = os.path.join(output_dir, f\"{output_name}.png\")" + ] + }, + { + "cell_type": "markdown", + "id": "2c6dbd38-52a8-4af8-aef9-f1d6551e06ef", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Get input data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c4ce220d-952b-4321-aed6-e1b3afe63ab8", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "DATE_FORMAT = \"%Y-%m-%d\"\n", + "PERIOD = \"%Y-%m-%d\"\n", + "PERIOD_TEXT = \"This day\"\n", + "\n", + "data1 = {\n", + " \"ENTITY\": [\"Abi\"] * 10,\n", + " \"SCENARIO\": [\"W03-2024\"] * 5 + [\"W04-2024\"] * 5,\n", + " \"LABEL\": [\n", + " \"2024-02-12\",\n", + " \"2024-02-13\",\n", + " \"2024-02-14\",\n", + " \"2024-02-15\",\n", + " \"2024-02-16\",\n", + " \"2024-02-19\",\n", + " \"2024-02-20\",\n", + " \"2024-02-21\",\n", + " \"2024-02-22\",\n", + " \"2024-02-23\",\n", + " ],\n", + " \"GROUP\": [\"Meetings\"] * 10,\n", + " \"VALUE\": [random.randint(0, 5) for i in range(0, 10)],\n", + "}\n", + "df1 = pd.DataFrame(data1)\n", + "\n", + "data2 = {\n", + " \"ENTITY\": [\"Abi\"] * 10,\n", + " \"SCENARIO\": [\"W03-2024\"] * 5 + [\"W04-2024\"] * 5,\n", + " \"LABEL\": [\n", + " \"2024-02-12\",\n", + " \"2024-02-13\",\n", + " \"2024-02-14\",\n", + " \"2024-02-15\",\n", + " \"2024-02-16\",\n", + " \"2024-02-19\",\n", + " \"2024-02-20\",\n", + " \"2024-02-21\",\n", + " \"2024-02-22\",\n", + " \"2024-02-23\",\n", + " ],\n", + " \"GROUP\": [\"Tasks\"] * 10,\n", + " \"VALUE\": [random.randint(0, 10) for i in range(0, 10)],\n", + "}\n", + "df2 = pd.DataFrame(data2)\n", + "df_trend = pd.concat([df1, df2])\n", + "df_trend[\"LABEL_D\"] = pd.to_datetime(df_trend[\"LABEL\"], format=PERIOD).dt.strftime(\"%a %d %b\")\n", + "df_trend[\"COLOR\"] = df_trend[\"GROUP\"].map({\"Meetings\": \"grey\", \"Tasks\": \"lightgrey\"})\n", + "df_trend" + ] + }, + { + "cell_type": "markdown", + "id": "91e37140-3961-4ef7-ab6e-a8af744e8e8b", + "metadata": {}, + "source": [ + "### Create title and logo" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ddb389e1-2919-4036-ba30-5e0302b6a933", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "def get_kpis(df):\n", + " # Groupby weeks\n", + " if len(df) > 0 and \"SCENARIO\" in df.columns:\n", + " df = df.groupby([\"SCENARIO\"], as_index=False).agg({\"VALUE\": \"sum\"})\n", + "\n", + " # Get total and total n-1\n", + " if len(df) == 0:\n", + " total = 0\n", + " total_n1 = 0\n", + " elif len(df) == 1:\n", + " if df.loc[0, \"SCENARIO\"] == TW:\n", + " total = df.loc[0, \"VALUE\"]\n", + " total_n1 = 0\n", + " else:\n", + " total = 0\n", + " total_n1 = df.loc[0, \"VALUE\"]\n", + " else:\n", + " total = df.loc[df.index[-1], \"VALUE\"]\n", + " total_n1 = df.loc[df.index[-2], \"VALUE\"]\n", + "\n", + " # Calc variation in value and pourcentage \n", + " varv = total - total_n1\n", + " if total == 0:\n", + " varp = -1\n", + " elif total_n1 == 0:\n", + " varp = 1\n", + " else:\n", + " varp = varv / total_n1\n", + "\n", + " # Create value to displayed\n", + " total_d = \"{:,.0f}\".format(total).replace(\",\", \" \")\n", + " varv_d = \"{:,.0f}\".format(varv).replace(\",\", \" \")\n", + " varp_d = \"{:,.0%}\".format(varp).replace(\",\", \" \")\n", + " if varv >= 0:\n", + " varv_d = f\"+{varv_d}\"\n", + " varp_d = f\"+{varp_d}\"\n", + " \n", + " # Logo\n", + " logo = None\n", + " if varv > 0:\n", + " logo = arrow_up\n", + " elif varv > -0.2:\n", + " logo = arrow_right\n", + " else:\n", + " logo = arrow_down\n", + " \n", + " return total_d, varv_d, varp_d, logo\n", + " \n", + "total_d, varv_d, varp_d, logo = get_kpis(df1)\n", + "total_d2, varv_d2, varp_d2, logo2 = get_kpis(df2)\n", + "title_full = f\"Meetings: {total_d} | {varv_d} ({varp_d})
Tasks: {total_d2} | {varv_d2} ({varp_d2})\"\n", + "print(\"Title:\", title_full)" + ] + }, + { + "cell_type": "markdown", + "id": "7456a048", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Create trend dataframe" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22b41e65", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "def create_barchart(df, label, groups, value, title):\n", + " fig = go.Figure()\n", + "\n", + " list_groups = df[groups].unique()\n", + " for group in list_groups:\n", + " tmp_df = df[df[groups] == group]\n", + " fig.add_trace(go.Bar(x=tmp_df[label], y=tmp_df[value], name=group, marker=dict(color=tmp_df[\"COLOR\"]),))\n", + " \n", + " # Add logo\n", + " fig.add_layout_image(\n", + " dict(\n", + " source=logo,\n", + " xref=\"paper\",\n", + " yref=\"paper\",\n", + " x=0.01,\n", + " y=1.05,\n", + " sizex=0.12,\n", + " sizey=0.12,\n", + " xanchor=\"right\",\n", + " yanchor=\"bottom\",\n", + " )\n", + " )\n", + " # Add legend\n", + " fig.update_layout(\n", + " legend=dict(\n", + " orientation=\"h\",\n", + " yanchor=\"bottom\",\n", + " y=-0.2,\n", + " xanchor=\"center\",\n", + " x=0.5\n", + " )\n", + " )\n", + " \n", + " # Update layout\n", + " fig.update_layout(\n", + " title=title_full,\n", + " title_x=0.09,\n", + " title_font=dict(family=\"Arial\", color=\"black\"),\n", + " paper_bgcolor=\"#ffffff\",\n", + " plot_bgcolor=\"#ffffff\",\n", + " width=1200,\n", + " height=600,\n", + " xaxis_tickfont_size=14,\n", + " legend=dict(bgcolor=\"white\", bordercolor=\"white\"),\n", + " barmode=\"group\",\n", + " bargap=0.1, # gap between bars of adjacent location coordinates.\n", + " bargroupgap=0.1, # gap between bars of the same location coordinate.\n", + " )\n", + " config = {\"displayModeBar\": False}\n", + " fig.show(config=config)\n", + " return fig\n", + "\n", + "fig = create_barchart(df_trend, label=\"LABEL_D\", groups=\"GROUP\", value=\"VALUE\", title=title)" + ] + }, + { + "cell_type": "markdown", + "id": "c8083216", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "id": "541e16a0", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Save and share your csv file" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "61cc88bf", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "pdump(output_dir, df_trend, output_name)" + ] + }, + { + "cell_type": "markdown", + "id": "d28cd477", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Save and share your graph in HTML\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3421d37f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "# Save your graph in HTML\n", + "fig.write_html(html_output)\n", + "\n", + "# Share output with naas\n", + "html_link = naas.asset.add(html_output, override_prod=True, params={\"inline\": True})\n", + "\n", + "# -> Uncomment the line below to remove your asset\n", + "# naas.asset.delete(html_output)" + ] + }, + { + "cell_type": "markdown", + "id": "91a987c6", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Save and share your graph in image\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8342abf9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "# Save your graph in PNG\n", + "fig.write_image(image_output)\n", + "\n", + "# Share output with naas\n", + "image_link = naas.asset.add(image_output, override_prod=True, params={\"inline\": True})\n", + "\n", + "# -> Uncomment the line below to remove your asset\n", + "# naas.asset.delete(image_output)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b99cbc5e-25ab-4e47-9ed1-d9637719d951", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.6" + }, + "papermill": { + "default_parameters": {}, + "environment_variables": {}, + "parameters": {}, + "version": "2.3.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 9510b21b5308558c167714440bdc1809d14705d5 Mon Sep 17 00:00:00 2001 From: FlorentLvr Date: Mon, 26 Feb 2024 11:18:53 +0100 Subject: [PATCH 4/4] feat: update plugin description --- models/content-engine/__plugin__.ipynb | 2 +- models/finance-engine/__plugin__.ipynb | 2 +- models/growth-engine/__plugin__.ipynb | 2 +- models/opendata-engine/__plugin__.ipynb | 4 ++-- models/operations-engine/__plugin__.ipynb | 2 +- models/sales-engine/__plugin__.ipynb | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/models/content-engine/__plugin__.ipynb b/models/content-engine/__plugin__.ipynb index d942257..318db9a 100644 --- a/models/content-engine/__plugin__.ipynb +++ b/models/content-engine/__plugin__.ipynb @@ -144,7 +144,7 @@ "name = \"📲 Content Assistant\"\n", "model = \"gpt-4-1106-preview\"\n", "temperature = 0.5\n", - "description = \"Track your content performance across platforms, leverage AI for optimized strategies and assistance in writing impactful new content that will increase reach & boost engagement.\"\n", + "description = \"Streamline the generation and distribution of content that aligns with the user's or business's brand voice and audience engagement goals.\"\n", "avatar = \"\"\n", "model_dir = os.path.join(naas_data_product.ROOT_PATH, \"models\", \"content-engine\")\n", "\n", diff --git a/models/finance-engine/__plugin__.ipynb b/models/finance-engine/__plugin__.ipynb index e451ce5..1c26c27 100644 --- a/models/finance-engine/__plugin__.ipynb +++ b/models/finance-engine/__plugin__.ipynb @@ -141,7 +141,7 @@ "\"\"\"\n", "model = \"gpt-3.5-turbo-16k\"\n", "temperature = 0\n", - "description = \"This plugin is used to setup the Finance Engine\"\n", + "description = \"Manage financial transactions accurately and maintain comprehensive records for informed financial planning and analysis.\"\n", "avatar = \"\"\n", "model_dir = os.path.join(naas_data_product.ROOT_PATH, \"models\", \"finance-engine\")\n", "\n", diff --git a/models/growth-engine/__plugin__.ipynb b/models/growth-engine/__plugin__.ipynb index 2584668..1a9a52e 100644 --- a/models/growth-engine/__plugin__.ipynb +++ b/models/growth-engine/__plugin__.ipynb @@ -144,7 +144,7 @@ "name = \"🚀 Growth Assistant\"\n", "model = \"gpt-4-1106-preview\"\n", "temperature = 0.5\n", - "description = \"Track your growth performance, understand your audience with cohorts analysis and meet your new marketing qualified leads.\"\n", + "description = \"Analyze content engagement, identifying potential leads through social media engagement, scoring interactions, and enriching profiles for targeted sales outreach.\"\n", "avatar = \"\"\n", "model_dir = os.path.join(naas_data_product.ROOT_PATH, \"models\", \"growth-engine\")\n", "\n", diff --git a/models/opendata-engine/__plugin__.ipynb b/models/opendata-engine/__plugin__.ipynb index a029f09..6044731 100644 --- a/models/opendata-engine/__plugin__.ipynb +++ b/models/opendata-engine/__plugin__.ipynb @@ -137,9 +137,9 @@ "Your role is to help people follow the portfolio of indicators that makes sense for them.\n", "Start by presenting yourself.\n", "\"\"\"\n", - "model = \"gpt-3.5-turbo-16k\"\n", + "model = \"gpt-4-1106-preview\"\n", "temperature = 0\n", - "description = \"This plugin is used to setup the Open Data Engine\"\n", + "description = \"Harness external data for enriching business intelligence and supporting strategic adaptation.\"\n", "avatar = \"\"\n", "model_dir = os.path.join(naas_data_product.ROOT_PATH, \"models\", \"opendata-engine\")\n", "\n", diff --git a/models/operations-engine/__plugin__.ipynb b/models/operations-engine/__plugin__.ipynb index eb83e53..fe318a4 100644 --- a/models/operations-engine/__plugin__.ipynb +++ b/models/operations-engine/__plugin__.ipynb @@ -141,7 +141,7 @@ "\"\"\"\n", "model = \"gpt-3.5-turbo-16k\"\n", "temperature = 0\n", - "description = \"This plugin is used to setup the Operations Engine\"\n", + "description = \"Automate and optimize operational tasks and meeting management, ensuring enhanced efficiency and streamlined workflows.\"\n", "avatar = \"\"\n", "model_dir = os.path.join(naas_data_product.ROOT_PATH, \"models\", \"operations-engine\")\n", "\n", diff --git a/models/sales-engine/__plugin__.ipynb b/models/sales-engine/__plugin__.ipynb index 778c487..8c24911 100644 --- a/models/sales-engine/__plugin__.ipynb +++ b/models/sales-engine/__plugin__.ipynb @@ -144,7 +144,7 @@ "name = \"⚡️ Sales Assistant\"\n", "model = \"gpt-4-1106-preview\"\n", "temperature = 0.2\n", - "description = \"Nurture your sales qualified leads and ensure they progress through the sales pipeline effectively.\"\n", + "description = \"Manage and facilitate the sales process from lead generation to deal closure.\"\n", "avatar = \"\"\n", "model_dir = os.path.join(naas_data_product.ROOT_PATH, \"models\", \"sales-engine\")\n", "input_image = \"deals_trend.png\"\n",