From 522793176d466064c47842870264c43c4a4d8e04 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Wed, 15 Jan 2025 10:01:15 +0000 Subject: [PATCH 01/44] First chunk --- .../docs/assets/tutorials/project/chart1.png | Bin 0 -> 151532 bytes .../docs/assets/tutorials/project/chart2.png | Bin 0 -> 76354 bytes .../docs/assets/tutorials/project/chart3.png | Bin 0 -> 124572 bytes .../user-interface-hosted-vizro-ai.png | Bin 0 -> 85745 bytes ...ser-interface-settings-hosted-vizro-ai.png | Bin 0 -> 57954 bytes .../docs/pages/tutorials/project-tutorial.md | 161 ++++++++++++++++++ 6 files changed, 161 insertions(+) create mode 100644 vizro-ai/docs/assets/tutorials/project/chart1.png create mode 100644 vizro-ai/docs/assets/tutorials/project/chart2.png create mode 100644 vizro-ai/docs/assets/tutorials/project/chart3.png create mode 100644 vizro-ai/docs/assets/tutorials/project/user-interface-hosted-vizro-ai.png create mode 100644 vizro-ai/docs/assets/tutorials/project/user-interface-settings-hosted-vizro-ai.png create mode 100644 vizro-ai/docs/pages/tutorials/project-tutorial.md diff --git a/vizro-ai/docs/assets/tutorials/project/chart1.png b/vizro-ai/docs/assets/tutorials/project/chart1.png new file mode 100644 index 0000000000000000000000000000000000000000..8878ba7f4701164daf9312ce8f48165865f4107d GIT binary patch literal 151532 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 KP$gp;`u_oNz#l>Y literal 0 HcmV?d00001 diff --git a/vizro-ai/docs/assets/tutorials/project/chart2.png b/vizro-ai/docs/assets/tutorials/project/chart2.png new file mode 100644 index 0000000000000000000000000000000000000000..96777a773f515339c111429a17984e15433c97dc GIT binary patch literal 76354 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⪻33$5X*gj}!x_qXg8V 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 aUy+^q7O%{NRm{PF9|;i|;YvY0zyAlwfP$_7 literal 0 HcmV?d00001 diff --git a/vizro-ai/docs/assets/tutorials/project/user-interface-hosted-vizro-ai.png b/vizro-ai/docs/assets/tutorials/project/user-interface-hosted-vizro-ai.png new file mode 100644 index 0000000000000000000000000000000000000000..71679f5d6411ae2022f5320441d4cdc7518b80a3 GIT binary patch literal 85745 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 literal 0 HcmV?d00001 diff --git a/vizro-ai/docs/assets/tutorials/project/user-interface-settings-hosted-vizro-ai.png b/vizro-ai/docs/assets/tutorials/project/user-interface-settings-hosted-vizro-ai.png new file mode 100644 index 0000000000000000000000000000000000000000..cd01c803afe3d9f46d094de0de9cd4dfacdca8f9 GIT binary patch literal 57954 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 G68{Cu+~LIl literal 0 HcmV?d00001 diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md new file mode 100644 index 000000000..df076e090 --- /dev/null +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -0,0 +1,161 @@ +# How to build a prototype dashboard with Vizro-AI + +This tutorial uses Vizro-AI to build a prototype dashboard with three charts that illustrate a simple dataset. We first show how to create individual charts with Vizro-AI and then move on to learn how to use Vizro-AI to build a dashboard. The tutorial concludes by moving the prototype code generated by Vizro-AI into a project on PyCafe, for others to use and extend. + +## Project background and data +The dataset for this project was a set of books data [exported from a personal Goodreads account](https://www.goodreads.com/review/import). If you use Goodreads, you can export your own data in CSV format and use it with the code for this project. + +The dataset was filtered to retain only books with an ISBN, since that can be used with [Google Books API](https://developers.google.com/books) to retrieve additional data about a book. The Books API wasn't used in this project, but by including ISBN data, there is scope to extend the prototype project in future. The dataset used can be downloaded from the [Vizro repository](filtered_books.csv). + +## OpenAI +This tutorial uses OpenAI with Vizro-AI. To run through the steps, you must have an account with paid-for credits available. None of the free accounts will suffice. [Check the OpenAI models and pricing on their website](https://platform.openai.com/docs/models). + +!!! note + + Before using a model, please review OpenAI's guidelines on risk mitigation to understand potential model limitations and best practices. [See the OpenAI site for more details on responsible usage](https://platform.openai.com/docs/guides/safety-best-practices). + + +## Individual chart generation with Vizro-AI +In this step, we'll show a UI on a hosted version of Vizro-AI, at [https://py.cafe/app/vizro-official/vizro-ai-charts](https://py.cafe/app/vizro-official/vizro-ai-charts). Use your browser to navigate to the site which looks as follows: + +![](../../assets/tutorials/project/user-interface-hosted-vizro-ai.png) + +### Settings +You'll notice a cog icon at the top right hand corner for access to your settings, which look as follows: + +![](../../assets/tutorials/project/user-interface-settings-hosted-vizro-ai.png) + +Add the API key for your chosen vendor. At the time of writing, you can use OpenAI, Anthropic, Mistral, or xAI. + +Once the API key is set, return to the main screen and upload the data for the project. + +We can now dive use Vizro-AI to build some charts by iterating text to write effective prompts. + +### Chart 1: Books timeline +To ask Vizro-AI to build a chart, describe what you want to see. This chart should show an ordered horiontal timeline to illustrate the sequence of reading the books. + +> Plot a chart with the title "Sequence of reading" . It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. + +You can adjust the model used: the chart below was generated from `gpt-4o-mini`. The chart displays on the right hand side of the screen and the Plotly code to generate the chart is below the prompt. + +The plot this code returns looks as follows: +![](../../assets/tutorials/project/chart1.png) + +### Chart 2: Reading velocity +The second chart should plot the cumulative total of pages read and the cumulative total of books read per year. The prompt took a few iterations to refine: + +> Plot a chart with the title "Pages and Book totals" . It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. + +> Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. + +The Plotly code generated when run with `gpt-4-turbo` was as follows: + +```python +import pandas as pd +import plotly.graph_objects as go +from plotly.subplots import make_subplots +from vizro.models.types import capture + + +@capture("graph") +def custom_chart(data_frame): + # Convert Date Read to datetime + data_frame["Date Read"] = pd.to_datetime(data_frame["Date Read"], dayfirst=True) + + # Group by year and sum pages + pages_per_year = ( + data_frame.groupby(data_frame["Date Read"].dt.year)["Number of Pages"].sum().cumsum() + ) + + # Count books per year + books_per_year = data_frame.groupby(data_frame["Date Read"].dt.year).size() + + # Create subplot + fig = make_subplots(specs=[[{"secondary_y": True}]]) + + # Add line for cumulative pages + fig.add_trace( + go.Scatter( + x=pages_per_year.index, + y=pages_per_year, + mode="lines", + name="Cumulative Pages", + ), + secondary_y=False, + ) + + # Add bar for books count + fig.add_trace( + go.Bar(x=books_per_year.index, y=books_per_year, name="Total Books"), + secondary_y=True, + ) + + # Set y-axes titles + fig.update_yaxes(title_text="Cumulative Pages", secondary_y=False) + fig.update_yaxes(title_text="Total Books", secondary_y=True) + + # Set layout + fig.update_layout(title="Pages and Book totals", xaxis_title="Year", showlegend=True) + + return fig + +``` + +The plot this code returns looks as follows: +![](../../assets/tutorials/project/chart2.png) + +### Chart 3: Reviews comparison +The third chart should illustrate the difference between the rating the Goodreads reader assigned a book and the average rating across the Goodreads community. This prompt took a degree of iteration and needed us to specify how to draw the lines between the points. It was run several times before it colored each line differently, which is a key learning when using generative AI: your results will vary from run to run. + +> For each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book - use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. + + +```python +import plotly.graph_objects as go +from vizro.models.types import capture + + +@capture("graph") +def custom_chart(data_frame): + # Filter out rows where 'My Rating' is 0 + df_filtered = data_frame[data_frame["My Rating"] != 0] + + # Create a blank figure + fig = go.Figure() + + # Add dumbbell lines and markers for each book + for index, row in df_filtered.iterrows(): + fig.add_trace( + go.Scatter( + x=[row["My Rating"], row["Average Rating"]], + y=[index, index], + mode="markers+lines", + marker=dict(size=10), + line=dict(width=2), + name=row["Title"], + showlegend=False, + ) + ) + + # Update layout + fig.update_layout( + title="Comparison of My Rating vs Average Rating", + xaxis_title="Rating", + yaxis_title="Books", + yaxis=dict( + tickmode="array", + tickvals=list(df_filtered.index), + ticktext=df_filtered["Title"], + ), + ) + return fig +``` + +The plot this code returns looks as follows: +![](../../assets/tutorials/project/chart3.png) + + +## Dashboard generation with Vizro-AI + +## Interactive Vizro dashboards on PyCafe + \ No newline at end of file From ddba624be2828193b07f23200ddf126177efd0a4 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Wed, 15 Jan 2025 11:15:03 +0000 Subject: [PATCH 02/44] Second chunk: add notebook --- .../assets/tutorials/project/chart1v2.png | Bin 0 -> 68362 bytes .../docs/pages/tutorials/project-tutorial.md | 82 +++++++++++++++++- 2 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 vizro-ai/docs/assets/tutorials/project/chart1v2.png diff --git a/vizro-ai/docs/assets/tutorials/project/chart1v2.png b/vizro-ai/docs/assets/tutorials/project/chart1v2.png new file mode 100644 index 0000000000000000000000000000000000000000..3e576a43d9211182f2c8f4c12c7fd47fee738abd GIT binary patch literal 68362 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 literal 0 HcmV?d00001 diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index df076e090..0d920ef7b 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -38,7 +38,7 @@ To ask Vizro-AI to build a chart, describe what you want to see. This chart shou You can adjust the model used: the chart below was generated from `gpt-4o-mini`. The chart displays on the right hand side of the screen and the Plotly code to generate the chart is below the prompt. -The plot this code returns looks as follows: +The plot this code returns looks as follows. Hovering over each point gave the date the book was read, but not the title of the book. You'll also notice that the points are spaced evenly rather than proportionately: ![](../../assets/tutorials/project/chart1.png) ### Chart 2: Reading velocity @@ -109,7 +109,6 @@ The third chart should illustrate the difference between the rating the Goodread > For each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book - use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. - ```python import plotly.graph_objects as go from vizro.models.types import capture @@ -157,5 +156,82 @@ The plot this code returns looks as follows: ## Dashboard generation with Vizro-AI +### Set up a Jupyter Notebook in which to use Vizro-AI +At this point, we have prototypes for three plotly charts for the Goodreads data. To display these as an interactive dashboard, we need some additional code and Vizro-AI can generate this for us, but not through the PyCafe host at the time of writing. We'll use a Jupyter Notebook + +Before running the Notebook code, you need to [set up Vizro-AI](https://vizro.readthedocs.io/projects/vizro-ai/en/latest/pages/user-guides/install/) inside a virtual environment with Python 3.10 or later. Install the package with `pip install vizro_ai`. + +You need to give Vizro-AI your API key to access OpenAI by adding it to your environment so the code you write in the next step can access it to successfully call OpenAI. There are some [straightforward instructions in the OpenAI docs](https://platform.openai.com/docs/quickstart/step-2-set-up-your-api-key), and the process is also covered in the our [LLM setup guide](https://vizro.readthedocs.io/projects/vizro-ai/en/latest/pages/user-guides/install/#set-up-access-to-a-large-language-model). + +### Build a dashboard +At this point you can open a Jupyter Notebook to make the dashboard. We'll submit a prompt that combines the three prompts listed above, with some small edits to ask for a dashboard that has three pages: one for each chart. + +The following code shows the code to make the request to Vizro-AI to build and display the dashboard. The Notebook is available for download on [Vizro's GitHub repository](TO DO): + +```python +user_question = """ +Create a dashboard with 3 pages, one for each chart. + +On the first page, plot a chart with the title "Sequence of reading" . +It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. + +On the second page, lot a chart with the title "Pages and Book totals" . +It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. +Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. +Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. +Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. + +On the third page, for each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book. +Use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. +""" + +result = vizro_ai.dashboard([df_cleaned], user_question, return_elements=True) +Vizro().build(result.dashboard).run(port=8006) +print(result.code) +``` + +Using `gpt-4-turbo`, Vizro-AI generates a set of plotly chart code and the necessary Vizro support code to build a dashboard. The generated code is displayed as output in the Notebook with the dashboard, although the dashboard is better viewed at `http://localhost:8006/`. + +You can see the code output in the Notebook stored on the Vizro GitHub repository, or generate similar output by running it yourself. + +The charts generated were similar to those created by the PyCafe host above, although the first chart was improved by spacing the books proportionate to the date read and rolling over each point gave the book title as well as the date read. + +![](../../assets/tutorials/project/chart1v2.png) + +### Dashboard interactivity +To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the code for a control. As a simple example, we can extend the prompt to ask for a filter to modify the time period displayed. + +```diff +user_question = """ +Create a dashboard with 3 pages, one for each chart. + +On the first page, plot a chart with the title "Sequence of reading" . +It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. +- ++ Add a filter so the user can change the x axis to adjust the range of dates by year on the x axis, using a slider to range from Jan 2023 to Dec 2024. + +On the second page, plot a chart with the title "Pages and Book totals" . +It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. +Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. +Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. + +Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. +- ++ Add a filter so the user can change the x axis to adjust the range of dates by year on the x axis, using a slider to range from Jan 2023 to Dec 2024. + +On the third page, for each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book. +Use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. +""" + +``` + ## Interactive Vizro dashboards on PyCafe - \ No newline at end of file +At this point, we have a Notebook with code to call Vizro-AI to build a prototype Vizro dashboard with a set of three pages and three charts, plus a control to filter the view. + +As we've already seen, the code generated by Vizro-AI can vary from run to run, and calling OpenAI each time a dashboard is needed can get costly. + +The project isn't particularly easy to share at present either: sharing a Notebook requires every user to have an OpenAI key and set up an environment. + +At this point, to share and iterate the prototype the best course of action is to transfer the generated code from the output of Vizro-AI in the Notebook into a PyCafe project. + + From cc85686c7d4795520d0f4df812a166c342db604e Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Wed, 15 Jan 2025 12:19:09 +0000 Subject: [PATCH 03/44] Update settings to add pycafe to Vizro-AI docs --- vizro-ai/hatch.toml | 3 ++- vizro-ai/mkdocs.yml | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/vizro-ai/hatch.toml b/vizro-ai/hatch.toml index 384d15d57..770cd26f7 100644 --- a/vizro-ai/hatch.toml +++ b/vizro-ai/hatch.toml @@ -63,7 +63,8 @@ dependencies = [ "mkdocs-material", "mkdocs-git-revision-date-localized-plugin>=1.2.5", "mkdocstrings[python]", - "linkchecker" + "linkchecker", + "mkdocs-pycafe" ] detached = true installer = "uv" diff --git a/vizro-ai/mkdocs.yml b/vizro-ai/mkdocs.yml index 9bd285a2a..7a2064ee1 100644 --- a/vizro-ai/mkdocs.yml +++ b/vizro-ai/mkdocs.yml @@ -5,6 +5,7 @@ nav: - Tutorials: - Chart generation: pages/tutorials/quickstart.md - Dashboard generation: pages/tutorials/quickstart-dashboard.md + - Goodreads tutorial: pages/tutorials/project-tutorial.md - How-to guides: - FUNDAMENTALS: - Install Vizro-AI: pages/user-guides/install.md @@ -74,7 +75,19 @@ markdown_extensions: generic: true - footnotes - pymdownx.details - - pymdownx.superfences + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format + - name: python + class: "highlight" + validator: !!python/name:mkdocs_pycafe.validator + format: !!python/object/apply:mkdocs_pycafe.formatter + kwds: + type: vizro + requirements: | + vizro==0.1.30 - pymdownx.tabbed: alternate_style: true - pymdownx.mark From 6a1402ce377cc3614bb558e8943f84cc0f12ad4d Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Wed, 15 Jan 2025 12:19:14 +0000 Subject: [PATCH 04/44] Update project-tutorial.md --- .../docs/pages/tutorials/project-tutorial.md | 191 ++++++++++++++++++ 1 file changed, 191 insertions(+) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index 0d920ef7b..7b48501c1 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -234,4 +234,195 @@ The project isn't particularly easy to share at present either: sharing a Notebo At this point, to share and iterate the prototype the best course of action is to transfer the generated code from the output of Vizro-AI in the Notebook into a PyCafe project. +There are three changes to the Notebook code needed for it to run on PyCafe: + +1. Add `from vizro import Vizro` to the imports list +2. Add `Vizro().build(model).run()` at the end of the code block +3. Uncomment the data manager code and replace it with code needed to access the dataset: + + - If you are building your own PyCafe project, you can download the dataset from the Vizro GitHub repository and upload it to the PyCafe project. + - Alternatively, you can use the code specified below to read the dataset directly from online storage. + + + +!!! example "First dashboard" + === "app.py" + ```{.python pycafe-link} + from vizro import Vizro + import vizro.models as vm + from vizro.models.types import capture + import pandas as pd + import plotly.graph_objects as go + from vizro.models.types import capture + + ####### Function definitions ###### + @capture("graph") + def sequence_reading(data_frame): + fig = go.Figure() + fig.add_trace( + go.Scatter( + x=data_frame["Date Read"], + y=[1] * len(data_frame), + mode="markers", + marker=dict(size=10, color="blue"), + ) + ) + fig.update_layout( + title="Sequence of reading", + xaxis_title="Date Read", + yaxis_title="Sequence", + yaxis=dict(showticklabels=False, showgrid=False), + xaxis=dict(tickangle=-45), + ) + return fig + + + @capture("graph") + def pages_books_totals(data_frame): + # Prepare data + data_frame["Date Read"] = pd.to_datetime(data_frame["Date Read"]) + data_frame.sort_values("Date Read", inplace=True) + data_frame["Cumulative Pages"] = data_frame["Number of Pages"].cumsum() + + # Aggregate data by year for total books read + yearly_books = data_frame.groupby(data_frame["Date Read"].dt.year).size() + + # Create figure with secondary y-axis + fig = go.Figure() + + # Add line for cumulative pages + fig.add_trace( + go.Scatter( + x=data_frame["Date Read"], + y=data_frame["Cumulative Pages"], + mode="lines", + name="Cumulative Pages Read", + ) + ) + + # Add bars for books read per year + fig.add_trace( + go.Bar( + x=yearly_books.index, y=yearly_books, name="Books Read per Year", yaxis="y2" + ) + ) + + # Set up the layout + fig.update_layout( + title="Cumulative Pages Read and Books Read per Year", + xaxis_title="Date", + yaxis=dict(title="Number of Pages"), + yaxis2=dict(title="Total Books", overlaying="y", side="right"), + ) + + return fig + + + @capture("graph") + def rating_comparison(data_frame): + # Filter out rows where 'My Rating' is 0 + df = data_frame[data_frame["My Rating"] != 0] + + # Create a figure + fig = go.Figure() + + # Add dumbbell traces + for index, row in df.iterrows(): + fig.add_trace( + go.Scatter( + x=[row["My Rating"], row["Average Rating"]], + y=[row["Title"], row["Title"]], + mode="markers+lines", + name=row["Title"], + marker=dict(size=10), + line=dict(width=2), + ) + ) + + # Update layout + fig.update_layout( + title="Comparison of My Rating vs Average Rating", + xaxis_title="Rating", + yaxis_title="Book Title", + showlegend=False, + ) + return fig + + ########### Read data ############ + # Define the URL of the raw CSV file + # TO DO -- This will change when data is uploaded to Vizro repo + import requests + url = "https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv" + + # Fetch the CSV file + response = requests.get(url) + response.raise_for_status() # Ensure we notice bad responses + + # Load the CSV data into a pandas DataFrame + from io import StringIO + csv_data = StringIO(response.text) + df = pd.read_csv(csv_data) + df["Date Read"] = pd.to_datetime(df['Date Read'],dayfirst=True) + + + ########### Model code ############ + model = vm.Dashboard( + pages=[ + vm.Page( + components=[ + vm.Graph( + id="sequence_reading", + figure=sequence_reading(df), + ) + ], + title="Sequence of Reading", + layout=vm.Layout(grid=[[0]]), + controls=[ + vm.Filter( + column="Year Published", + targets=["sequence_reading"], + selector=vm.RangeSlider(type="range_slider"), + ) + ], + ), + vm.Page( + components=[ + vm.Graph( + id="pages_books_totals", + figure=pages_books_totals(df), + ) + ], + title="Pages and Book Totals", + layout=vm.Layout(grid=[[0]]), + controls=[ + vm.Filter( + column="Year Published", + targets=["pages_books_totals"], + selector=vm.RangeSlider(type="range_slider"), + ) + ], + ), + vm.Page( + components=[ + vm.Graph( + id="rating_comparison", + figure=rating_comparison(df), + ) + ], + title="Rating Comparison", + layout=vm.Layout(grid=[[0]]), + controls=[], + ), + ], + title="Book Reading Analysis Dashboard", + ) + + Vizro().build(model).run() + ``` + + + + + + From d18ef29e53c20412eb0788b0dd2231b5bdd72655 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 15 Jan 2025 12:22:15 +0000 Subject: [PATCH 05/44] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../docs/pages/tutorials/project-tutorial.md | 90 +++++++++---------- vizro-ai/mkdocs.yml | 2 +- 2 files changed, 45 insertions(+), 47 deletions(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index 7b48501c1..033488d8b 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -3,50 +3,53 @@ This tutorial uses Vizro-AI to build a prototype dashboard with three charts that illustrate a simple dataset. We first show how to create individual charts with Vizro-AI and then move on to learn how to use Vizro-AI to build a dashboard. The tutorial concludes by moving the prototype code generated by Vizro-AI into a project on PyCafe, for others to use and extend. ## Project background and data + The dataset for this project was a set of books data [exported from a personal Goodreads account](https://www.goodreads.com/review/import). If you use Goodreads, you can export your own data in CSV format and use it with the code for this project. The dataset was filtered to retain only books with an ISBN, since that can be used with [Google Books API](https://developers.google.com/books) to retrieve additional data about a book. The Books API wasn't used in this project, but by including ISBN data, there is scope to extend the prototype project in future. The dataset used can be downloaded from the [Vizro repository](filtered_books.csv). ## OpenAI -This tutorial uses OpenAI with Vizro-AI. To run through the steps, you must have an account with paid-for credits available. None of the free accounts will suffice. [Check the OpenAI models and pricing on their website](https://platform.openai.com/docs/models). + +This tutorial uses OpenAI with Vizro-AI. To run through the steps, you must have an account with paid-for credits available. None of the free accounts will suffice. [Check the OpenAI models and pricing on their website](https://platform.openai.com/docs/models). !!! note - Before using a model, please review OpenAI's guidelines on risk mitigation to understand potential model limitations and best practices. [See the OpenAI site for more details on responsible usage](https://platform.openai.com/docs/guides/safety-best-practices). - ## Individual chart generation with Vizro-AI + In this step, we'll show a UI on a hosted version of Vizro-AI, at [https://py.cafe/app/vizro-official/vizro-ai-charts](https://py.cafe/app/vizro-official/vizro-ai-charts). Use your browser to navigate to the site which looks as follows: ![](../../assets/tutorials/project/user-interface-hosted-vizro-ai.png) ### Settings + You'll notice a cog icon at the top right hand corner for access to your settings, which look as follows: ![](../../assets/tutorials/project/user-interface-settings-hosted-vizro-ai.png) -Add the API key for your chosen vendor. At the time of writing, you can use OpenAI, Anthropic, Mistral, or xAI. +Add the API key for your chosen vendor. At the time of writing, you can use OpenAI, Anthropic, Mistral, or xAI. -Once the API key is set, return to the main screen and upload the data for the project. +Once the API key is set, return to the main screen and upload the data for the project. We can now dive use Vizro-AI to build some charts by iterating text to write effective prompts. ### Chart 1: Books timeline + To ask Vizro-AI to build a chart, describe what you want to see. This chart should show an ordered horiontal timeline to illustrate the sequence of reading the books. > Plot a chart with the title "Sequence of reading" . It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. You can adjust the model used: the chart below was generated from `gpt-4o-mini`. The chart displays on the right hand side of the screen and the Plotly code to generate the chart is below the prompt. -The plot this code returns looks as follows. Hovering over each point gave the date the book was read, but not the title of the book. You'll also notice that the points are spaced evenly rather than proportionately: -![](../../assets/tutorials/project/chart1.png) +The plot this code returns looks as follows. Hovering over each point gave the date the book was read, but not the title of the book. You'll also notice that the points are spaced evenly rather than proportionately: ![](../../assets/tutorials/project/chart1.png) ### Chart 2: Reading velocity + The second chart should plot the cumulative total of pages read and the cumulative total of books read per year. The prompt took a few iterations to refine: > Plot a chart with the title "Pages and Book totals" . It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. -> Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. +> Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. The Plotly code generated when run with `gpt-4-turbo` was as follows: @@ -63,9 +66,7 @@ def custom_chart(data_frame): data_frame["Date Read"] = pd.to_datetime(data_frame["Date Read"], dayfirst=True) # Group by year and sum pages - pages_per_year = ( - data_frame.groupby(data_frame["Date Read"].dt.year)["Number of Pages"].sum().cumsum() - ) + pages_per_year = data_frame.groupby(data_frame["Date Read"].dt.year)["Number of Pages"].sum().cumsum() # Count books per year books_per_year = data_frame.groupby(data_frame["Date Read"].dt.year).size() @@ -98,13 +99,12 @@ def custom_chart(data_frame): fig.update_layout(title="Pages and Book totals", xaxis_title="Year", showlegend=True) return fig - ``` -The plot this code returns looks as follows: -![](../../assets/tutorials/project/chart2.png) +The plot this code returns looks as follows: ![](../../assets/tutorials/project/chart2.png) ### Chart 3: Reviews comparison + The third chart should illustrate the difference between the rating the Goodreads reader assigned a book and the average rating across the Goodreads community. This prompt took a degree of iteration and needed us to specify how to draw the lines between the points. It was run several times before it colored each line differently, which is a key learning when using generative AI: your results will vary from run to run. > For each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book - use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. @@ -150,13 +150,12 @@ def custom_chart(data_frame): return fig ``` -The plot this code returns looks as follows: -![](../../assets/tutorials/project/chart3.png) - +The plot this code returns looks as follows: ![](../../assets/tutorials/project/chart3.png) ## Dashboard generation with Vizro-AI ### Set up a Jupyter Notebook in which to use Vizro-AI + At this point, we have prototypes for three plotly charts for the Goodreads data. To display these as an interactive dashboard, we need some additional code and Vizro-AI can generate this for us, but not through the PyCafe host at the time of writing. We'll use a Jupyter Notebook Before running the Notebook code, you need to [set up Vizro-AI](https://vizro.readthedocs.io/projects/vizro-ai/en/latest/pages/user-guides/install/) inside a virtual environment with Python 3.10 or later. Install the package with `pip install vizro_ai`. @@ -164,22 +163,23 @@ Before running the Notebook code, you need to [set up Vizro-AI](https://vizro.re You need to give Vizro-AI your API key to access OpenAI by adding it to your environment so the code you write in the next step can access it to successfully call OpenAI. There are some [straightforward instructions in the OpenAI docs](https://platform.openai.com/docs/quickstart/step-2-set-up-your-api-key), and the process is also covered in the our [LLM setup guide](https://vizro.readthedocs.io/projects/vizro-ai/en/latest/pages/user-guides/install/#set-up-access-to-a-large-language-model). ### Build a dashboard + At this point you can open a Jupyter Notebook to make the dashboard. We'll submit a prompt that combines the three prompts listed above, with some small edits to ask for a dashboard that has three pages: one for each chart. -The following code shows the code to make the request to Vizro-AI to build and display the dashboard. The Notebook is available for download on [Vizro's GitHub repository](TO DO): +The following code shows the code to make the request to Vizro-AI to build and display the dashboard. The Notebook is available for download on \[Vizro's GitHub repository\](TO DO): ```python user_question = """ -Create a dashboard with 3 pages, one for each chart. +Create a dashboard with 3 pages, one for each chart. -On the first page, plot a chart with the title "Sequence of reading" . +On the first page, plot a chart with the title "Sequence of reading" . It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. -On the second page, lot a chart with the title "Pages and Book totals" . -It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. +On the second page, lot a chart with the title "Pages and Book totals" . +It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. -Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. -Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. +Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. +Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. On the third page, for each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book. Use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. @@ -199,23 +199,24 @@ The charts generated were similar to those created by the PyCafe host above, alt ![](../../assets/tutorials/project/chart1v2.png) ### Dashboard interactivity -To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the code for a control. As a simple example, we can extend the prompt to ask for a filter to modify the time period displayed. + +To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the code for a control. As a simple example, we can extend the prompt to ask for a filter to modify the time period displayed. ```diff user_question = """ -Create a dashboard with 3 pages, one for each chart. +Create a dashboard with 3 pages, one for each chart. -On the first page, plot a chart with the title "Sequence of reading" . +On the first page, plot a chart with the title "Sequence of reading" . It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. - + Add a filter so the user can change the x axis to adjust the range of dates by year on the x axis, using a slider to range from Jan 2023 to Dec 2024. -On the second page, plot a chart with the title "Pages and Book totals" . -It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. +On the second page, plot a chart with the title "Pages and Book totals" . +It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. -Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. +Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. -Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. +Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. - + Add a filter so the user can change the x axis to adjust the range of dates by year on the x axis, using a slider to range from Jan 2023 to Dec 2024. @@ -226,9 +227,10 @@ Use shapes to add the horizontal lines between markers. Omit the legend. Don't s ``` ## Interactive Vizro dashboards on PyCafe + At this point, we have a Notebook with code to call Vizro-AI to build a prototype Vizro dashboard with a set of three pages and three charts, plus a control to filter the view. -As we've already seen, the code generated by Vizro-AI can vary from run to run, and calling OpenAI each time a dashboard is needed can get costly. +As we've already seen, the code generated by Vizro-AI can vary from run to run, and calling OpenAI each time a dashboard is needed can get costly. The project isn't particularly easy to share at present either: sharing a Notebook requires every user to have an OpenAI key and set up an environment. @@ -237,14 +239,16 @@ At this point, to share and iterate the prototype the best course of action is t There are three changes to the Notebook code needed for it to run on PyCafe: 1. Add `from vizro import Vizro` to the imports list -2. Add `Vizro().build(model).run()` at the end of the code block -3. Uncomment the data manager code and replace it with code needed to access the dataset: - - If you are building your own PyCafe project, you can download the dataset from the Vizro GitHub repository and upload it to the PyCafe project. - - Alternatively, you can use the code specified below to read the dataset directly from online storage. +1. Add `Vizro().build(model).run()` at the end of the code block + +1. Uncomment the data manager code and replace it with code needed to access the dataset: + + ``` + - If you are building your own PyCafe project, you can download the dataset from the Vizro GitHub repository and upload it to the PyCafe project. + - Alternatively, you can use the code specified below to read the dataset directly from online storage. + ``` - - !!! example "First dashboard" === "app.py" ```{.python pycafe-link} @@ -254,7 +258,7 @@ There are three changes to the Notebook code needed for it to run on PyCafe: import pandas as pd import plotly.graph_objects as go from vizro.models.types import capture - + ####### Function definitions ###### @capture("graph") def sequence_reading(data_frame): @@ -416,13 +420,7 @@ There are three changes to the Notebook code needed for it to run on PyCafe: ), ], title="Book Reading Analysis Dashboard", - ) + ) Vizro().build(model).run() ``` - - - - - - diff --git a/vizro-ai/mkdocs.yml b/vizro-ai/mkdocs.yml index 7a2064ee1..bf1768567 100644 --- a/vizro-ai/mkdocs.yml +++ b/vizro-ai/mkdocs.yml @@ -87,7 +87,7 @@ markdown_extensions: kwds: type: vizro requirements: | - vizro==0.1.30 + vizro==0.1.30 - pymdownx.tabbed: alternate_style: true - pymdownx.mark From 6e5929ab86498c86821765a616ba1c028e3f3c59 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Wed, 15 Jan 2025 14:18:20 +0000 Subject: [PATCH 06/44] Update project-tutorial.md --- .../docs/pages/tutorials/project-tutorial.md | 331 ++++++++++-------- 1 file changed, 177 insertions(+), 154 deletions(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index 033488d8b..fc64e7f80 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -3,159 +3,177 @@ This tutorial uses Vizro-AI to build a prototype dashboard with three charts that illustrate a simple dataset. We first show how to create individual charts with Vizro-AI and then move on to learn how to use Vizro-AI to build a dashboard. The tutorial concludes by moving the prototype code generated by Vizro-AI into a project on PyCafe, for others to use and extend. ## Project background and data - The dataset for this project was a set of books data [exported from a personal Goodreads account](https://www.goodreads.com/review/import). If you use Goodreads, you can export your own data in CSV format and use it with the code for this project. The dataset was filtered to retain only books with an ISBN, since that can be used with [Google Books API](https://developers.google.com/books) to retrieve additional data about a book. The Books API wasn't used in this project, but by including ISBN data, there is scope to extend the prototype project in future. The dataset used can be downloaded from the [Vizro repository](filtered_books.csv). ## OpenAI - -This tutorial uses OpenAI with Vizro-AI. To run through the steps, you must have an account with paid-for credits available. None of the free accounts will suffice. [Check the OpenAI models and pricing on their website](https://platform.openai.com/docs/models). +This tutorial uses OpenAI with Vizro-AI. To run through the steps, you must have an account with paid-for credits available. None of the free accounts will suffice. [Check the OpenAI models and pricing on their website](https://platform.openai.com/docs/models). !!! note + Before using a model, please review OpenAI's guidelines on risk mitigation to understand potential model limitations and best practices. [See the OpenAI site for more details on responsible usage](https://platform.openai.com/docs/guides/safety-best-practices). -## Individual chart generation with Vizro-AI +## Individual chart generation with Vizro-AI In this step, we'll show a UI on a hosted version of Vizro-AI, at [https://py.cafe/app/vizro-official/vizro-ai-charts](https://py.cafe/app/vizro-official/vizro-ai-charts). Use your browser to navigate to the site which looks as follows: ![](../../assets/tutorials/project/user-interface-hosted-vizro-ai.png) ### Settings - You'll notice a cog icon at the top right hand corner for access to your settings, which look as follows: ![](../../assets/tutorials/project/user-interface-settings-hosted-vizro-ai.png) -Add the API key for your chosen vendor. At the time of writing, you can use OpenAI, Anthropic, Mistral, or xAI. +Add the API key for your chosen vendor. At the time of writing, you can use OpenAI, Anthropic, Mistral, or xAI. -Once the API key is set, return to the main screen and upload the data for the project. +Once the API key is set, return to the main screen and upload the data for the project. We can now dive use Vizro-AI to build some charts by iterating text to write effective prompts. ### Chart 1: Books timeline - To ask Vizro-AI to build a chart, describe what you want to see. This chart should show an ordered horiontal timeline to illustrate the sequence of reading the books. > Plot a chart with the title "Sequence of reading" . It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. You can adjust the model used: the chart below was generated from `gpt-4o-mini`. The chart displays on the right hand side of the screen and the Plotly code to generate the chart is below the prompt. -The plot this code returns looks as follows. Hovering over each point gave the date the book was read, but not the title of the book. You'll also notice that the points are spaced evenly rather than proportionately: ![](../../assets/tutorials/project/chart1.png) +The plot this code returns looks as follows. Hovering over each point gave the date the book was read, but not the title of the book. You'll also notice that the points are spaced evenly rather than proportionately: +![](../../assets/tutorials/project/chart1.png) -### Chart 2: Reading velocity +??? example "Click to expand" + === "Generated by Vizro-AI" + ``` + import plotly.graph_objects as go + from vizro.models.types import capture + + @capture("graph") + def custom_chart(data_frame): + fig = go.Figure() + fig.add_trace(go.Scatter(x=data_frame["Date Read"], y=[1] * len(data_frame), mode="markers")) + fig.update_layout(title="Sequence of reading", xaxis_title="Date Read", yaxis_title="Y=1") + return fig + ``` +### Chart 2: Reading velocity The second chart should plot the cumulative total of pages read and the cumulative total of books read per year. The prompt took a few iterations to refine: > Plot a chart with the title "Pages and Book totals" . It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. -> Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. +> Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. The Plotly code generated when run with `gpt-4-turbo` was as follows: -```python -import pandas as pd -import plotly.graph_objects as go -from plotly.subplots import make_subplots -from vizro.models.types import capture - - -@capture("graph") -def custom_chart(data_frame): - # Convert Date Read to datetime - data_frame["Date Read"] = pd.to_datetime(data_frame["Date Read"], dayfirst=True) - - # Group by year and sum pages - pages_per_year = data_frame.groupby(data_frame["Date Read"].dt.year)["Number of Pages"].sum().cumsum() +??? example "Click to expand" + === "Generated by Vizro-AI" + ```python + import pandas as pd + import plotly.graph_objects as go + from plotly.subplots import make_subplots + from vizro.models.types import capture + + + @capture("graph") + def custom_chart(data_frame): + # Convert Date Read to datetime + data_frame["Date Read"] = pd.to_datetime(data_frame["Date Read"], dayfirst=True) + + # Group by year and sum pages + pages_per_year = ( + data_frame.groupby(data_frame["Date Read"].dt.year)["Number of Pages"].sum().cumsum() + ) + + # Count books per year + books_per_year = data_frame.groupby(data_frame["Date Read"].dt.year).size() + + # Create subplot + fig = make_subplots(specs=[[{"secondary_y": True}]]) + + # Add line for cumulative pages + fig.add_trace( + go.Scatter( + x=pages_per_year.index, + y=pages_per_year, + mode="lines", + name="Cumulative Pages", + ), + secondary_y=False, + ) + + # Add bar for books count + fig.add_trace( + go.Bar(x=books_per_year.index, y=books_per_year, name="Total Books"), + secondary_y=True, + ) + + # Set y-axes titles + fig.update_yaxes(title_text="Cumulative Pages", secondary_y=False) + fig.update_yaxes(title_text="Total Books", secondary_y=True) + + # Set layout + fig.update_layout(title="Pages and Book totals", xaxis_title="Year", showlegend=True) + + return fig + ``` + +The plot this code returns looks as follows: +![](../../assets/tutorials/project/chart2.png) - # Count books per year - books_per_year = data_frame.groupby(data_frame["Date Read"].dt.year).size() - - # Create subplot - fig = make_subplots(specs=[[{"secondary_y": True}]]) - - # Add line for cumulative pages - fig.add_trace( - go.Scatter( - x=pages_per_year.index, - y=pages_per_year, - mode="lines", - name="Cumulative Pages", - ), - secondary_y=False, - ) +### Chart 3: Reviews comparison +The third chart should illustrate the difference between the rating the Goodreads reader assigned a book and the average rating across the Goodreads community. This prompt took a degree of iteration and needed us to specify how to draw the lines between the points. It was run several times before it colored each line differently, which is a key learning when using generative AI: your results will vary from run to run. - # Add bar for books count - fig.add_trace( - go.Bar(x=books_per_year.index, y=books_per_year, name="Total Books"), - secondary_y=True, - ) +> For each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book - use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. - # Set y-axes titles - fig.update_yaxes(title_text="Cumulative Pages", secondary_y=False) - fig.update_yaxes(title_text="Total Books", secondary_y=True) +??? example "Click to expand" + === "Generated by Vizro-AI" + ``` + import plotly.graph_objects as go + from vizro.models.types import capture - # Set layout - fig.update_layout(title="Pages and Book totals", xaxis_title="Year", showlegend=True) - return fig -``` + @capture("graph") + def custom_chart(data_frame): + # Filter out rows where 'My Rating' is 0 + df_filtered = data_frame[data_frame["My Rating"] != 0] -The plot this code returns looks as follows: ![](../../assets/tutorials/project/chart2.png) + # Create a blank figure + fig = go.Figure() -### Chart 3: Reviews comparison + # Add dumbbell lines and markers for each book + for index, row in df_filtered.iterrows(): + fig.add_trace( + go.Scatter( + x=[row["My Rating"], row["Average Rating"]], + y=[index, index], + mode="markers+lines", + marker=dict(size=10), + line=dict(width=2), + name=row["Title"], + showlegend=False, + ) + ) -The third chart should illustrate the difference between the rating the Goodreads reader assigned a book and the average rating across the Goodreads community. This prompt took a degree of iteration and needed us to specify how to draw the lines between the points. It was run several times before it colored each line differently, which is a key learning when using generative AI: your results will vary from run to run. + # Update layout + fig.update_layout( + title="Comparison of My Rating vs Average Rating", + xaxis_title="Rating", + yaxis_title="Books", + yaxis=dict( + tickmode="array", + tickvals=list(df_filtered.index), + ticktext=df_filtered["Title"], + ), + ) + return fig + ``` -> For each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book - use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. +The plot this code returns looks as follows: +![](../../assets/tutorials/project/chart3.png) -```python -import plotly.graph_objects as go -from vizro.models.types import capture - - -@capture("graph") -def custom_chart(data_frame): - # Filter out rows where 'My Rating' is 0 - df_filtered = data_frame[data_frame["My Rating"] != 0] - - # Create a blank figure - fig = go.Figure() - - # Add dumbbell lines and markers for each book - for index, row in df_filtered.iterrows(): - fig.add_trace( - go.Scatter( - x=[row["My Rating"], row["Average Rating"]], - y=[index, index], - mode="markers+lines", - marker=dict(size=10), - line=dict(width=2), - name=row["Title"], - showlegend=False, - ) - ) - - # Update layout - fig.update_layout( - title="Comparison of My Rating vs Average Rating", - xaxis_title="Rating", - yaxis_title="Books", - yaxis=dict( - tickmode="array", - tickvals=list(df_filtered.index), - ticktext=df_filtered["Title"], - ), - ) - return fig -``` - -The plot this code returns looks as follows: ![](../../assets/tutorials/project/chart3.png) ## Dashboard generation with Vizro-AI ### Set up a Jupyter Notebook in which to use Vizro-AI - At this point, we have prototypes for three plotly charts for the Goodreads data. To display these as an interactive dashboard, we need some additional code and Vizro-AI can generate this for us, but not through the PyCafe host at the time of writing. We'll use a Jupyter Notebook Before running the Notebook code, you need to [set up Vizro-AI](https://vizro.readthedocs.io/projects/vizro-ai/en/latest/pages/user-guides/install/) inside a virtual environment with Python 3.10 or later. Install the package with `pip install vizro_ai`. @@ -163,32 +181,33 @@ Before running the Notebook code, you need to [set up Vizro-AI](https://vizro.re You need to give Vizro-AI your API key to access OpenAI by adding it to your environment so the code you write in the next step can access it to successfully call OpenAI. There are some [straightforward instructions in the OpenAI docs](https://platform.openai.com/docs/quickstart/step-2-set-up-your-api-key), and the process is also covered in the our [LLM setup guide](https://vizro.readthedocs.io/projects/vizro-ai/en/latest/pages/user-guides/install/#set-up-access-to-a-large-language-model). ### Build a dashboard - At this point you can open a Jupyter Notebook to make the dashboard. We'll submit a prompt that combines the three prompts listed above, with some small edits to ask for a dashboard that has three pages: one for each chart. -The following code shows the code to make the request to Vizro-AI to build and display the dashboard. The Notebook is available for download on \[Vizro's GitHub repository\](TO DO): +The following code shows the code to make the request to Vizro-AI to build and display the dashboard. The Notebook is available for download on [Vizro's GitHub repository](TO DO): -```python -user_question = """ -Create a dashboard with 3 pages, one for each chart. +??? example "Click to expand" + === "Generated by Vizro-AI" + ``` + user_question = """ + Create a dashboard with 3 pages, one for each chart. -On the first page, plot a chart with the title "Sequence of reading" . -It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. + On the first page, plot a chart with the title "Sequence of reading" . + It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. -On the second page, lot a chart with the title "Pages and Book totals" . -It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. -Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. -Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. -Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. + On the second page, lot a chart with the title "Pages and Book totals" . + It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. + Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. + Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. + Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. -On the third page, for each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book. -Use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. -""" + On the third page, for each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book. + Use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. + """ -result = vizro_ai.dashboard([df_cleaned], user_question, return_elements=True) -Vizro().build(result.dashboard).run(port=8006) -print(result.code) -``` + result = vizro_ai.dashboard([df_cleaned], user_question, return_elements=True) + Vizro().build(result.dashboard).run(port=8006) + print(result.code) + ``` Using `gpt-4-turbo`, Vizro-AI generates a set of plotly chart code and the necessary Vizro support code to build a dashboard. The generated code is displayed as output in the Notebook with the dashboard, although the dashboard is better viewed at `http://localhost:8006/`. @@ -199,38 +218,38 @@ The charts generated were similar to those created by the PyCafe host above, alt ![](../../assets/tutorials/project/chart1v2.png) ### Dashboard interactivity +To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the code for a control. As a simple example, we can extend the prompt to ask for a filter to modify the time period displayed. -To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the code for a control. As a simple example, we can extend the prompt to ask for a filter to modify the time period displayed. +??? example "Click to expand" + === "Generated by Vizro-AI" + ```diff + user_question = """ + Create a dashboard with 3 pages, one for each chart. -```diff -user_question = """ -Create a dashboard with 3 pages, one for each chart. + On the first page, plot a chart with the title "Sequence of reading" . + It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. -On the first page, plot a chart with the title "Sequence of reading" . -It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. -- -+ Add a filter so the user can change the x axis to adjust the range of dates by year on the x axis, using a slider to range from Jan 2023 to Dec 2024. + + Add a filter so the user can adjust the range of dates by year on the x axis. -On the second page, plot a chart with the title "Pages and Book totals" . -It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. -Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. -Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. + On the second page, plot a chart with the title "Pages and Book totals" . + It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. + Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. + Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. -Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. -- -+ Add a filter so the user can change the x axis to adjust the range of dates by year on the x axis, using a slider to range from Jan 2023 to Dec 2024. + Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. -On the third page, for each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book. -Use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. -""" + + Add a filter so the user can adjust the range of dates by year on the x axis. -``` + On the third page, for each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book. + Use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. + """ -## Interactive Vizro dashboards on PyCafe + ``` +## Interactive Vizro dashboards on PyCafe At this point, we have a Notebook with code to call Vizro-AI to build a prototype Vizro dashboard with a set of three pages and three charts, plus a control to filter the view. -As we've already seen, the code generated by Vizro-AI can vary from run to run, and calling OpenAI each time a dashboard is needed can get costly. +As we've already seen, the code generated by Vizro-AI can vary from run to run, and calling OpenAI each time a dashboard is needed can get costly. The project isn't particularly easy to share at present either: sharing a Notebook requires every user to have an OpenAI key and set up an environment. @@ -239,18 +258,16 @@ At this point, to share and iterate the prototype the best course of action is t There are three changes to the Notebook code needed for it to run on PyCafe: 1. Add `from vizro import Vizro` to the imports list - -1. Add `Vizro().build(model).run()` at the end of the code block - -1. Uncomment the data manager code and replace it with code needed to access the dataset: - - ``` - - If you are building your own PyCafe project, you can download the dataset from the Vizro GitHub repository and upload it to the PyCafe project. - - Alternatively, you can use the code specified below to read the dataset directly from online storage. - ``` - -!!! example "First dashboard" - === "app.py" +2. Add `Vizro().build(model).run()` at the end of the code block +3. Uncomment the data manager code and replace it with code needed to access the dataset: + - If you are building your own PyCafe project, you can download the dataset from the Vizro GitHub repository and upload it to the PyCafe project. + - Alternatively, you can use the code added to the snippet below to read the dataset directly from online storage. + +Follow the link at the bottom of the code snippet titled **☕️ Run and edit this code in PyCafe** to use and edit the dashboard. + + +??? example "Click to expand" + === "PyCafe project based on Notebook code" ```{.python pycafe-link} from vizro import Vizro import vizro.models as vm @@ -258,7 +275,7 @@ There are three changes to the Notebook code needed for it to run on PyCafe: import pandas as pd import plotly.graph_objects as go from vizro.models.types import capture - + ####### Function definitions ###### @capture("graph") def sequence_reading(data_frame): @@ -420,7 +437,13 @@ There are three changes to the Notebook code needed for it to run on PyCafe: ), ], title="Book Reading Analysis Dashboard", - ) + ) Vizro().build(model).run() ``` + + + + + + From 9c8849e8231d75569233f0b0a08309f738544d89 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 15 Jan 2025 14:20:22 +0000 Subject: [PATCH 07/44] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../docs/pages/tutorials/project-tutorial.md | 180 +++++++++--------- 1 file changed, 88 insertions(+), 92 deletions(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index fc64e7f80..6b6a0659f 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -3,50 +3,52 @@ This tutorial uses Vizro-AI to build a prototype dashboard with three charts that illustrate a simple dataset. We first show how to create individual charts with Vizro-AI and then move on to learn how to use Vizro-AI to build a dashboard. The tutorial concludes by moving the prototype code generated by Vizro-AI into a project on PyCafe, for others to use and extend. ## Project background and data + The dataset for this project was a set of books data [exported from a personal Goodreads account](https://www.goodreads.com/review/import). If you use Goodreads, you can export your own data in CSV format and use it with the code for this project. The dataset was filtered to retain only books with an ISBN, since that can be used with [Google Books API](https://developers.google.com/books) to retrieve additional data about a book. The Books API wasn't used in this project, but by including ISBN data, there is scope to extend the prototype project in future. The dataset used can be downloaded from the [Vizro repository](filtered_books.csv). ## OpenAI -This tutorial uses OpenAI with Vizro-AI. To run through the steps, you must have an account with paid-for credits available. None of the free accounts will suffice. [Check the OpenAI models and pricing on their website](https://platform.openai.com/docs/models). + +This tutorial uses OpenAI with Vizro-AI. To run through the steps, you must have an account with paid-for credits available. None of the free accounts will suffice. [Check the OpenAI models and pricing on their website](https://platform.openai.com/docs/models). !!! note - Before using a model, please review OpenAI's guidelines on risk mitigation to understand potential model limitations and best practices. [See the OpenAI site for more details on responsible usage](https://platform.openai.com/docs/guides/safety-best-practices). - ## Individual chart generation with Vizro-AI + In this step, we'll show a UI on a hosted version of Vizro-AI, at [https://py.cafe/app/vizro-official/vizro-ai-charts](https://py.cafe/app/vizro-official/vizro-ai-charts). Use your browser to navigate to the site which looks as follows: ![](../../assets/tutorials/project/user-interface-hosted-vizro-ai.png) ### Settings + You'll notice a cog icon at the top right hand corner for access to your settings, which look as follows: ![](../../assets/tutorials/project/user-interface-settings-hosted-vizro-ai.png) -Add the API key for your chosen vendor. At the time of writing, you can use OpenAI, Anthropic, Mistral, or xAI. +Add the API key for your chosen vendor. At the time of writing, you can use OpenAI, Anthropic, Mistral, or xAI. -Once the API key is set, return to the main screen and upload the data for the project. +Once the API key is set, return to the main screen and upload the data for the project. We can now dive use Vizro-AI to build some charts by iterating text to write effective prompts. ### Chart 1: Books timeline + To ask Vizro-AI to build a chart, describe what you want to see. This chart should show an ordered horiontal timeline to illustrate the sequence of reading the books. > Plot a chart with the title "Sequence of reading" . It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. You can adjust the model used: the chart below was generated from `gpt-4o-mini`. The chart displays on the right hand side of the screen and the Plotly code to generate the chart is below the prompt. -The plot this code returns looks as follows. Hovering over each point gave the date the book was read, but not the title of the book. You'll also notice that the points are spaced evenly rather than proportionately: -![](../../assets/tutorials/project/chart1.png) +The plot this code returns looks as follows. Hovering over each point gave the date the book was read, but not the title of the book. You'll also notice that the points are spaced evenly rather than proportionately: ![](../../assets/tutorials/project/chart1.png) ??? example "Click to expand" === "Generated by Vizro-AI" ``` import plotly.graph_objects as go from vizro.models.types import capture - + @capture("graph") def custom_chart(data_frame): fig = go.Figure() @@ -56,70 +58,69 @@ The plot this code returns looks as follows. Hovering over each point gave the d ``` ### Chart 2: Reading velocity + The second chart should plot the cumulative total of pages read and the cumulative total of books read per year. The prompt took a few iterations to refine: > Plot a chart with the title "Pages and Book totals" . It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. -> Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. +> Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. The Plotly code generated when run with `gpt-4-turbo` was as follows: ??? example "Click to expand" === "Generated by Vizro-AI" - ```python - import pandas as pd - import plotly.graph_objects as go - from plotly.subplots import make_subplots - from vizro.models.types import capture - - - @capture("graph") - def custom_chart(data_frame): - # Convert Date Read to datetime - data_frame["Date Read"] = pd.to_datetime(data_frame["Date Read"], dayfirst=True) - - # Group by year and sum pages - pages_per_year = ( - data_frame.groupby(data_frame["Date Read"].dt.year)["Number of Pages"].sum().cumsum() - ) - - # Count books per year - books_per_year = data_frame.groupby(data_frame["Date Read"].dt.year).size() - - # Create subplot - fig = make_subplots(specs=[[{"secondary_y": True}]]) - - # Add line for cumulative pages - fig.add_trace( - go.Scatter( - x=pages_per_year.index, - y=pages_per_year, - mode="lines", - name="Cumulative Pages", - ), - secondary_y=False, - ) - - # Add bar for books count - fig.add_trace( - go.Bar(x=books_per_year.index, y=books_per_year, name="Total Books"), - secondary_y=True, - ) - - # Set y-axes titles - fig.update_yaxes(title_text="Cumulative Pages", secondary_y=False) - fig.update_yaxes(title_text="Total Books", secondary_y=True) - - # Set layout - fig.update_layout(title="Pages and Book totals", xaxis_title="Year", showlegend=True) - - return fig - ``` - -The plot this code returns looks as follows: -![](../../assets/tutorials/project/chart2.png) + ```python + import pandas as pd + import plotly.graph_objects as go + from plotly.subplots import make_subplots + from vizro.models.types import capture + + + @capture("graph") + def custom_chart(data_frame): + # Convert Date Read to datetime + data_frame["Date Read"] = pd.to_datetime(data_frame["Date Read"], dayfirst=True) + + # Group by year and sum pages + pages_per_year = data_frame.groupby(data_frame["Date Read"].dt.year)["Number of Pages"].sum().cumsum() + + # Count books per year + books_per_year = data_frame.groupby(data_frame["Date Read"].dt.year).size() + + # Create subplot + fig = make_subplots(specs=[[{"secondary_y": True}]]) + + # Add line for cumulative pages + fig.add_trace( + go.Scatter( + x=pages_per_year.index, + y=pages_per_year, + mode="lines", + name="Cumulative Pages", + ), + secondary_y=False, + ) + + # Add bar for books count + fig.add_trace( + go.Bar(x=books_per_year.index, y=books_per_year, name="Total Books"), + secondary_y=True, + ) + + # Set y-axes titles + fig.update_yaxes(title_text="Cumulative Pages", secondary_y=False) + fig.update_yaxes(title_text="Total Books", secondary_y=True) + + # Set layout + fig.update_layout(title="Pages and Book totals", xaxis_title="Year", showlegend=True) + + return fig + ``` + +The plot this code returns looks as follows: ![](../../assets/tutorials/project/chart2.png) ### Chart 3: Reviews comparison + The third chart should illustrate the difference between the rating the Goodreads reader assigned a book and the average rating across the Goodreads community. This prompt took a degree of iteration and needed us to specify how to draw the lines between the points. It was run several times before it colored each line differently, which is a key learning when using generative AI: your results will vary from run to run. > For each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book - use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. @@ -167,13 +168,12 @@ The third chart should illustrate the difference between the rating the Goodread return fig ``` -The plot this code returns looks as follows: -![](../../assets/tutorials/project/chart3.png) - +The plot this code returns looks as follows: ![](../../assets/tutorials/project/chart3.png) ## Dashboard generation with Vizro-AI ### Set up a Jupyter Notebook in which to use Vizro-AI + At this point, we have prototypes for three plotly charts for the Goodreads data. To display these as an interactive dashboard, we need some additional code and Vizro-AI can generate this for us, but not through the PyCafe host at the time of writing. We'll use a Jupyter Notebook Before running the Notebook code, you need to [set up Vizro-AI](https://vizro.readthedocs.io/projects/vizro-ai/en/latest/pages/user-guides/install/) inside a virtual environment with Python 3.10 or later. Install the package with `pip install vizro_ai`. @@ -181,24 +181,25 @@ Before running the Notebook code, you need to [set up Vizro-AI](https://vizro.re You need to give Vizro-AI your API key to access OpenAI by adding it to your environment so the code you write in the next step can access it to successfully call OpenAI. There are some [straightforward instructions in the OpenAI docs](https://platform.openai.com/docs/quickstart/step-2-set-up-your-api-key), and the process is also covered in the our [LLM setup guide](https://vizro.readthedocs.io/projects/vizro-ai/en/latest/pages/user-guides/install/#set-up-access-to-a-large-language-model). ### Build a dashboard + At this point you can open a Jupyter Notebook to make the dashboard. We'll submit a prompt that combines the three prompts listed above, with some small edits to ask for a dashboard that has three pages: one for each chart. -The following code shows the code to make the request to Vizro-AI to build and display the dashboard. The Notebook is available for download on [Vizro's GitHub repository](TO DO): +The following code shows the code to make the request to Vizro-AI to build and display the dashboard. The Notebook is available for download on \[Vizro's GitHub repository\](TO DO): ??? example "Click to expand" === "Generated by Vizro-AI" ``` user_question = """ - Create a dashboard with 3 pages, one for each chart. + Create a dashboard with 3 pages, one for each chart. - On the first page, plot a chart with the title "Sequence of reading" . + On the first page, plot a chart with the title "Sequence of reading" . It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. - On the second page, lot a chart with the title "Pages and Book totals" . - It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. + On the second page, lot a chart with the title "Pages and Book totals" . + It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. - Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. - Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. + Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. + Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. On the third page, for each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book. Use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. @@ -218,25 +219,26 @@ The charts generated were similar to those created by the PyCafe host above, alt ![](../../assets/tutorials/project/chart1v2.png) ### Dashboard interactivity -To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the code for a control. As a simple example, we can extend the prompt to ask for a filter to modify the time period displayed. + +To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the code for a control. As a simple example, we can extend the prompt to ask for a filter to modify the time period displayed. ??? example "Click to expand" === "Generated by Vizro-AI" ```diff user_question = """ - Create a dashboard with 3 pages, one for each chart. + Create a dashboard with 3 pages, one for each chart. - On the first page, plot a chart with the title "Sequence of reading" . + On the first page, plot a chart with the title "Sequence of reading" . It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. + Add a filter so the user can adjust the range of dates by year on the x axis. - On the second page, plot a chart with the title "Pages and Book totals" . - It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. + On the second page, plot a chart with the title "Pages and Book totals" . + It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. - Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. + Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. - Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. + Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. + Add a filter so the user can adjust the range of dates by year on the x axis. @@ -247,9 +249,10 @@ To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the co ``` ## Interactive Vizro dashboards on PyCafe + At this point, we have a Notebook with code to call Vizro-AI to build a prototype Vizro dashboard with a set of three pages and three charts, plus a control to filter the view. -As we've already seen, the code generated by Vizro-AI can vary from run to run, and calling OpenAI each time a dashboard is needed can get costly. +As we've already seen, the code generated by Vizro-AI can vary from run to run, and calling OpenAI each time a dashboard is needed can get costly. The project isn't particularly easy to share at present either: sharing a Notebook requires every user to have an OpenAI key and set up an environment. @@ -258,14 +261,13 @@ At this point, to share and iterate the prototype the best course of action is t There are three changes to the Notebook code needed for it to run on PyCafe: 1. Add `from vizro import Vizro` to the imports list -2. Add `Vizro().build(model).run()` at the end of the code block -3. Uncomment the data manager code and replace it with code needed to access the dataset: +1. Add `Vizro().build(model).run()` at the end of the code block +1. Uncomment the data manager code and replace it with code needed to access the dataset: - If you are building your own PyCafe project, you can download the dataset from the Vizro GitHub repository and upload it to the PyCafe project. - Alternatively, you can use the code added to the snippet below to read the dataset directly from online storage. -Follow the link at the bottom of the code snippet titled **☕️ Run and edit this code in PyCafe** to use and edit the dashboard. - - +Follow the link at the bottom of the code snippet titled **☕️ Run and edit this code in PyCafe** to use and edit the dashboard. + ??? example "Click to expand" === "PyCafe project based on Notebook code" ```{.python pycafe-link} @@ -275,7 +277,7 @@ Follow the link at the bottom of the code snippet titled **☕️ Run and edit import pandas as pd import plotly.graph_objects as go from vizro.models.types import capture - + ####### Function definitions ###### @capture("graph") def sequence_reading(data_frame): @@ -437,13 +439,7 @@ Follow the link at the bottom of the code snippet titled **☕️ Run and edit ), ], title="Book Reading Analysis Dashboard", - ) + ) Vizro().build(model).run() ``` - - - - - - From e4fe78843a95c06c29332d47caeeaa7d64202e58 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Wed, 15 Jan 2025 14:55:53 +0000 Subject: [PATCH 08/44] Update project-tutorial.md --- .../docs/pages/tutorials/project-tutorial.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index 6b6a0659f..b37e4f5eb 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -6,7 +6,8 @@ This tutorial uses Vizro-AI to build a prototype dashboard with three charts tha The dataset for this project was a set of books data [exported from a personal Goodreads account](https://www.goodreads.com/review/import). If you use Goodreads, you can export your own data in CSV format and use it with the code for this project. -The dataset was filtered to retain only books with an ISBN, since that can be used with [Google Books API](https://developers.google.com/books) to retrieve additional data about a book. The Books API wasn't used in this project, but by including ISBN data, there is scope to extend the prototype project in future. The dataset used can be downloaded from the [Vizro repository](filtered_books.csv). +The dataset was filtered to retain only books with an ISBN, since that can be used with [Google Books API](https://developers.google.com/books) to retrieve additional data about a book. The Books API wasn't used in this project, but by including ISBN data, there is scope to extend the prototype project in future. The dataset used can be downloaded from the [Vizro repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv). + ## OpenAI @@ -15,7 +16,7 @@ This tutorial uses OpenAI with Vizro-AI. To run through the steps, you must have !!! note Before using a model, please review OpenAI's guidelines on risk mitigation to understand potential model limitations and best practices. [See the OpenAI site for more details on responsible usage](https://platform.openai.com/docs/guides/safety-best-practices). -## Individual chart generation with Vizro-AI +## Chart generation with Vizro-AI In this step, we'll show a UI on a hosted version of Vizro-AI, at [https://py.cafe/app/vizro-official/vizro-ai-charts](https://py.cafe/app/vizro-official/vizro-ai-charts). Use your browser to navigate to the site which looks as follows: @@ -45,7 +46,7 @@ The plot this code returns looks as follows. Hovering over each point gave the d ??? example "Click to expand" === "Generated by Vizro-AI" - ``` + ```python import plotly.graph_objects as go from vizro.models.types import capture @@ -127,7 +128,7 @@ The third chart should illustrate the difference between the rating the Goodread ??? example "Click to expand" === "Generated by Vizro-AI" - ``` + ```python import plotly.graph_objects as go from vizro.models.types import capture @@ -172,7 +173,7 @@ The plot this code returns looks as follows: ![](../../assets/tutorials/project/ ## Dashboard generation with Vizro-AI -### Set up a Jupyter Notebook in which to use Vizro-AI +### Set up a Jupyter Notebook At this point, we have prototypes for three plotly charts for the Goodreads data. To display these as an interactive dashboard, we need some additional code and Vizro-AI can generate this for us, but not through the PyCafe host at the time of writing. We'll use a Jupyter Notebook @@ -188,7 +189,7 @@ The following code shows the code to make the request to Vizro-AI to build and d ??? example "Click to expand" === "Generated by Vizro-AI" - ``` + ```python user_question = """ Create a dashboard with 3 pages, one for each chart. @@ -218,12 +219,12 @@ The charts generated were similar to those created by the PyCafe host above, alt ![](../../assets/tutorials/project/chart1v2.png) -### Dashboard interactivity +### Add dashboard interactivity To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the code for a control. As a simple example, we can extend the prompt to ask for a filter to modify the time period displayed. ??? example "Click to expand" - === "Generated by Vizro-AI" + === "Extend the prompt to add a control" ```diff user_question = """ Create a dashboard with 3 pages, one for each chart. From e0a4317a072f07a1071de799830c5c92ce02e9c2 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 15 Jan 2025 14:57:20 +0000 Subject: [PATCH 09/44] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- vizro-ai/docs/pages/tutorials/project-tutorial.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index b37e4f5eb..39d0aca4f 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -6,8 +6,7 @@ This tutorial uses Vizro-AI to build a prototype dashboard with three charts tha The dataset for this project was a set of books data [exported from a personal Goodreads account](https://www.goodreads.com/review/import). If you use Goodreads, you can export your own data in CSV format and use it with the code for this project. -The dataset was filtered to retain only books with an ISBN, since that can be used with [Google Books API](https://developers.google.com/books) to retrieve additional data about a book. The Books API wasn't used in this project, but by including ISBN data, there is scope to extend the prototype project in future. The dataset used can be downloaded from the [Vizro repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv). - +The dataset was filtered to retain only books with an ISBN, since that can be used with [Google Books API](https://developers.google.com/books) to retrieve additional data about a book. The Books API wasn't used in this project, but by including ISBN data, there is scope to extend the prototype project in future. The dataset used can be downloaded from the [Vizro repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv). \ ## OpenAI From 02bd48e3057354474f8072eec8ca1ca49b9f960a Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Wed, 15 Jan 2025 16:17:27 +0000 Subject: [PATCH 10/44] Update project-tutorial.md --- .../docs/pages/tutorials/project-tutorial.md | 227 +++++++++++++++++- 1 file changed, 217 insertions(+), 10 deletions(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index 39d0aca4f..146487f4d 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -35,11 +35,11 @@ We can now dive use Vizro-AI to build some charts by iterating text to write eff ### Chart 1: Books timeline -To ask Vizro-AI to build a chart, describe what you want to see. This chart should show an ordered horiontal timeline to illustrate the sequence of reading the books. +To ask Vizro-AI to build a chart, we describe what we want to see. This chart should show an ordered horiontal timeline to illustrate the sequence of reading the books. > Plot a chart with the title "Sequence of reading" . It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. -You can adjust the model used: the chart below was generated from `gpt-4o-mini`. The chart displays on the right hand side of the screen and the Plotly code to generate the chart is below the prompt. +We can adjust the model used: the chart below was generated from `gpt-4o-mini`. The chart displays on the right hand side of the screen and the Plotly code to generate the chart is below the prompt. The plot this code returns looks as follows. Hovering over each point gave the date the book was read, but not the title of the book. You'll also notice that the points are spaced evenly rather than proportionately: ![](../../assets/tutorials/project/chart1.png) @@ -176,15 +176,15 @@ The plot this code returns looks as follows: ![](../../assets/tutorials/project/ At this point, we have prototypes for three plotly charts for the Goodreads data. To display these as an interactive dashboard, we need some additional code and Vizro-AI can generate this for us, but not through the PyCafe host at the time of writing. We'll use a Jupyter Notebook -Before running the Notebook code, you need to [set up Vizro-AI](https://vizro.readthedocs.io/projects/vizro-ai/en/latest/pages/user-guides/install/) inside a virtual environment with Python 3.10 or later. Install the package with `pip install vizro_ai`. +Before running the Notebook code, [set up Vizro-AI](https://vizro.readthedocs.io/projects/vizro-ai/en/latest/pages/user-guides/install/) inside a virtual environment with Python 3.10 or later. Install the package with `pip install vizro_ai`. You need to give Vizro-AI your API key to access OpenAI by adding it to your environment so the code you write in the next step can access it to successfully call OpenAI. There are some [straightforward instructions in the OpenAI docs](https://platform.openai.com/docs/quickstart/step-2-set-up-your-api-key), and the process is also covered in the our [LLM setup guide](https://vizro.readthedocs.io/projects/vizro-ai/en/latest/pages/user-guides/install/#set-up-access-to-a-large-language-model). ### Build a dashboard -At this point you can open a Jupyter Notebook to make the dashboard. We'll submit a prompt that combines the three prompts listed above, with some small edits to ask for a dashboard that has three pages: one for each chart. +Now we can open a Jupyter Notebook to make the dashboard. We'll submit a prompt that combines the three prompts listed above, with some small edits to ask for a dashboard that has three pages: one for each chart. -The following code shows the code to make the request to Vizro-AI to build and display the dashboard. The Notebook is available for download on \[Vizro's GitHub repository\](TO DO): +The following code shows the code to make the request to Vizro-AI to build and display the dashboard. The Notebook is available for download from [Vizro's GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv): ??? example "Click to expand" === "Generated by Vizro-AI" @@ -212,7 +212,7 @@ The following code shows the code to make the request to Vizro-AI to build and d Using `gpt-4-turbo`, Vizro-AI generates a set of plotly chart code and the necessary Vizro support code to build a dashboard. The generated code is displayed as output in the Notebook with the dashboard, although the dashboard is better viewed at `http://localhost:8006/`. -You can see the code output in the Notebook stored on the Vizro GitHub repository, or generate similar output by running it yourself. +You can see the code output in the [Notebook stored on the Vizro GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv) , or generate similar output by running it yourself. The charts generated were similar to those created by the PyCafe host above, although the first chart was improved by spacing the books proportionate to the date read and rolling over each point gave the book title as well as the date read. @@ -250,21 +250,21 @@ To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the co ## Interactive Vizro dashboards on PyCafe -At this point, we have a Notebook with code to call Vizro-AI to build a prototype Vizro dashboard with a set of three pages and three charts, plus a control to filter the view. +Now we have a Notebook with code to call Vizro-AI to build a prototype Vizro dashboard with a set of three pages and three charts, plus a control to filter the view. As we've already seen, the code generated by Vizro-AI can vary from run to run, and calling OpenAI each time a dashboard is needed can get costly. The project isn't particularly easy to share at present either: sharing a Notebook requires every user to have an OpenAI key and set up an environment. -At this point, to share and iterate the prototype the best course of action is to transfer the generated code from the output of Vizro-AI in the Notebook into a PyCafe project. +To share and iterate the prototype, we can transfer the generated code from the output of Vizro-AI in the Notebook into a PyCafe project. There are three changes to the Notebook code needed for it to run on PyCafe: 1. Add `from vizro import Vizro` to the imports list 1. Add `Vizro().build(model).run()` at the end of the code block 1. Uncomment the data manager code and replace it with code needed to access the dataset: - - If you are building your own PyCafe project, you can download the dataset from the Vizro GitHub repository and upload it to the PyCafe project. - - Alternatively, you can use the code added to the snippet below to read the dataset directly from online storage. + - either download the dataset from the [Vizro GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv) \ and upload it to the PyCafe project. + - or use the code added to the snippet below to read the dataset directly from online storage. Follow the link at the bottom of the code snippet titled **☕️ Run and edit this code in PyCafe** to use and edit the dashboard. @@ -443,3 +443,210 @@ Follow the link at the bottom of the code snippet titled **☕️ Run and edit t Vizro().build(model).run() ``` + +## Summary + +In this tutorial, we first used Vizro-AI to generate a set of charts by iterating prompts, hosted in PyCafe. + +We then converted the successful prompts to build a Vizro dashboard using Vizro-AI in a Notebook using a few lines of support code. + +Finally, we converted the Vizro-AI generated Python to a PyCafe project with a few additional lines of support code. At this point, the Vizro project is not using generative AI, so it is easy to share and iterate. + +The code generated by Vizro-AI does not make a perfect dashboard, but it has been very easy to get it to a good standard without a great deal of coding or design experience. There are a few improvements that are easily applied to the Plotly code to further improve the charts, as shown below in a separate PyCafe project. + +### Improvements to generated code + +In this version of the dashboard, the first chart that show the sequence of books read has been modified to improve the information supplied when hovering over a point, and the opacity of the points has been altered to make it more attractive. + +In the second chart that shows the cumulative total of pages and books read, the line chart has been explicitly plotted on top of the bar chart. + +In the third chart that shows the ratings comparison, the color scheme has been updated to make it clearer which is the `My Rating` value compared to the `Average Rating`. + +??? example "Click to expand" + === "PyCafe project based on Notebook code" + ```{.python pycafe-link} + from vizro import Vizro + import vizro.models as vm + from vizro.models.types import capture + import pandas as pd + import plotly.graph_objects as go + from vizro.models.types import capture + + ####### Function definitions ###### + @capture("graph") + def sequence_reading(data_frame): + fig = go.Figure() + + # Iterate through the filtered DataFrame to add traces + for index, row in data_frame.iterrows(): + fig.add_trace( + go.Scatter( + x=[row["Date Read"], row["Date Read"]], + y=[1], + customdata=[[row["Title"], row["Author"], row["My Rating"]]], + showlegend=False, + marker=dict(color="#00b4ff", size=20, opacity=0.4), + hovertemplate="Title: %{customdata[0]}
" + + "Author: %{customdata[1]}
" + + "My Rating: %{customdata[2]}
" + + "Date: %{x}" + + "", + ) + ) + fig.update_layout( + title="Sequence of reading", + xaxis_title="Date Read", + yaxis_title="Sequence", + yaxis=dict(showticklabels=False, showgrid=False), + xaxis=dict(tickangle=-45), + ) + return fig + + + @capture("graph") + def pages_books_totals(data_frame): + # Prepare data + data_frame["Date Read"] = pd.to_datetime(data_frame["Date Read"]) + data_frame.sort_values("Date Read", inplace=True) + data_frame["Cumulative Pages"] = data_frame["Number of Pages"].cumsum() + + # Aggregate data by year for total books read + yearly_books = data_frame.groupby(data_frame["Date Read"].dt.year).size() + + # Create figure with secondary y-axis + fig = go.Figure() + + # Add line for cumulative pages + fig.add_trace( + go.Scatter( + x=data_frame["Date Read"], + y=data_frame["Cumulative Pages"], + mode="lines", + name="Cumulative Pages Read", + zorder=1, # Ensure the line chart is rendered on top of the bar chart + ) + ) + + # Add bars for books read per year + fig.add_trace( + go.Bar( + x=yearly_books.index, y=yearly_books, name="Books Read per Year", yaxis="y2" + ) + ) + + # Set up the layout + fig.update_layout( + title="Cumulative Pages Read and Books Read per Year", + xaxis_title="Date", + yaxis=dict(title="Number of Pages"), + yaxis2=dict(title="Total Books", overlaying="y", side="right"), + ) + + return fig + + + @capture("graph") + def rating_comparison(data_frame): + # Filter out rows where 'My Rating' is 0 + df = data_frame[data_frame["My Rating"] != 0] + # Sort by decreasing average rating + df = df.sort_values(by="Average Rating", ascending=False) + + # Create a figure + fig = go.Figure() + + # Add dumbbell traces + for index, row in df.iterrows(): + fig.add_trace( + go.Scatter( + x=[row["My Rating"], row["Average Rating"]], + y=[row["Title"], row["Title"]], + mode="markers+lines", + line=dict(color="gray", width=2), + marker=dict(color=["#00b4ff", "#ff9222"], size=10), + showlegend=False, + ) + ) + + # Update layout + fig.update_layout( + title="Comparison of My Rating (blue) vs Average Rating (orange)", + xaxis_title="Rating", + yaxis_title="Book Title", + showlegend=False, + ) + + return fig + + ########### Read data ############ + # Define the URL of the raw CSV file + # TO DO -- This will change when data is uploaded to Vizro repo + import requests + url = "https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv" + + # Fetch the CSV file + response = requests.get(url) + response.raise_for_status() # Ensure we notice bad responses + + # Load the CSV data into a pandas DataFrame + from io import StringIO + csv_data = StringIO(response.text) + df = pd.read_csv(csv_data) + df["Date Read"] = pd.to_datetime(df['Date Read'],dayfirst=True) + + + ########### Model code ############ + model = vm.Dashboard( + pages=[ + vm.Page( + components=[ + vm.Graph( + id="sequence_reading", + figure=sequence_reading(df), + ) + ], + title="Sequence of Reading", + layout=vm.Layout(grid=[[0]]), + controls=[ + vm.Filter( + column="Year Published", + targets=["sequence_reading"], + selector=vm.RangeSlider(type="range_slider"), + ) + ], + ), + vm.Page( + components=[ + vm.Graph( + id="pages_books_totals", + figure=pages_books_totals(df), + ) + ], + title="Pages and Book Totals", + layout=vm.Layout(grid=[[0]]), + controls=[ + vm.Filter( + column="Year Published", + targets=["pages_books_totals"], + selector=vm.RangeSlider(type="range_slider"), + ) + ], + ), + vm.Page( + components=[ + vm.Graph( + id="rating_comparison", + figure=rating_comparison(df), + ) + ], + title="Rating Comparison", + layout=vm.Layout(grid=[[0]]), + controls=[], + ), + ], + title="Book Reading Analysis Dashboard", + ) + + Vizro().build(model).run() + + ``` From b15c8fb6dcab7963f2660a8a1eb19cd682048a7b Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Wed, 15 Jan 2025 16:23:11 +0000 Subject: [PATCH 11/44] Update project-tutorial.md --- vizro-ai/docs/pages/tutorials/project-tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index 146487f4d..46c24ad54 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -212,7 +212,7 @@ The following code shows the code to make the request to Vizro-AI to build and d Using `gpt-4-turbo`, Vizro-AI generates a set of plotly chart code and the necessary Vizro support code to build a dashboard. The generated code is displayed as output in the Notebook with the dashboard, although the dashboard is better viewed at `http://localhost:8006/`. -You can see the code output in the [Notebook stored on the Vizro GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv) , or generate similar output by running it yourself. +You can see the code output in the [Notebook stored on the Vizro GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/goodreads.ipynb) , or generate similar output by running it yourself. The charts generated were similar to those created by the PyCafe host above, although the first chart was improved by spacing the books proportionate to the date read and rolling over each point gave the book title as well as the date read. From c4912a0e4141c021ec476ebdf094150a6025cf41 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Wed, 15 Jan 2025 16:31:00 +0000 Subject: [PATCH 12/44] Update project-tutorial.md --- vizro-ai/docs/pages/tutorials/project-tutorial.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index 46c24ad54..4ac846bad 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -462,6 +462,8 @@ In the second chart that shows the cumulative total of pages and books read, the In the third chart that shows the ratings comparison, the color scheme has been updated to make it clearer which is the `My Rating` value compared to the `Average Rating`. +Follow the link at the bottom of the code snippet titled **☕️ Run and edit this code in PyCafe** to use and edit the dashboard. + ??? example "Click to expand" === "PyCafe project based on Notebook code" ```{.python pycafe-link} From 37a104ca5d52d2f6a2e87e4e125e3fa168cfd35b Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 16 Jan 2025 09:20:40 +0000 Subject: [PATCH 13/44] Update vizro-ai/docs/pages/tutorials/project-tutorial.md Co-authored-by: Lingyi Zhang --- vizro-ai/docs/pages/tutorials/project-tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index 4ac846bad..f6654c32c 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -10,7 +10,7 @@ The dataset was filtered to retain only books with an ISBN, since that can be us ## OpenAI -This tutorial uses OpenAI with Vizro-AI. To run through the steps, you must have an account with paid-for credits available. None of the free accounts will suffice. [Check the OpenAI models and pricing on their website](https://platform.openai.com/docs/models). +This tutorial uses OpenAI models with Vizro-AI. To run through the steps, you must have an account with paid-for credits available. None of the free accounts will suffice. [Check the OpenAI models and pricing on their website](https://platform.openai.com/docs/models). !!! note Before using a model, please review OpenAI's guidelines on risk mitigation to understand potential model limitations and best practices. [See the OpenAI site for more details on responsible usage](https://platform.openai.com/docs/guides/safety-best-practices). From 54934ee1dcb1dca3a9f7dc07df92ae04cabfa490 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 16 Jan 2025 09:24:56 +0000 Subject: [PATCH 14/44] Update vizro-ai/docs/pages/tutorials/project-tutorial.md Co-authored-by: Maximilian Schulz <83698606+maxschulz-COL@users.noreply.github.com> --- vizro-ai/docs/pages/tutorials/project-tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index f6654c32c..da3f87892 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -174,7 +174,7 @@ The plot this code returns looks as follows: ![](../../assets/tutorials/project/ ### Set up a Jupyter Notebook -At this point, we have prototypes for three plotly charts for the Goodreads data. To display these as an interactive dashboard, we need some additional code and Vizro-AI can generate this for us, but not through the PyCafe host at the time of writing. We'll use a Jupyter Notebook +At this point, we have prototypes for three plotly charts for the Goodreads data. To display these as an interactive dashboard, we need some additional code and Vizro-AI can generate this for us, but not through the application hosted on PyCafe at the time of writing. We'll use a Jupyter Notebook Before running the Notebook code, [set up Vizro-AI](https://vizro.readthedocs.io/projects/vizro-ai/en/latest/pages/user-guides/install/) inside a virtual environment with Python 3.10 or later. Install the package with `pip install vizro_ai`. From 9374244ec64352499822e995bb66020154a411b6 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 16 Jan 2025 09:45:43 +0000 Subject: [PATCH 15/44] Put prompts in copyable blocks of text --- .../docs/pages/tutorials/project-tutorial.md | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index da3f87892..ff59e25d3 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -37,7 +37,11 @@ We can now dive use Vizro-AI to build some charts by iterating text to write eff To ask Vizro-AI to build a chart, we describe what we want to see. This chart should show an ordered horiontal timeline to illustrate the sequence of reading the books. -> Plot a chart with the title "Sequence of reading" . It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. +``` +Plot a chart with the title "Sequence of reading" . +It is a scatter chart. Use the x axis to show the date a book was read. +Plot it at y=1. +``` We can adjust the model used: the chart below was generated from `gpt-4o-mini`. The chart displays on the right hand side of the screen and the Plotly code to generate the chart is below the prompt. @@ -61,9 +65,18 @@ The plot this code returns looks as follows. Hovering over each point gave the d The second chart should plot the cumulative total of pages read and the cumulative total of books read per year. The prompt took a few iterations to refine: -> Plot a chart with the title "Pages and Book totals" . It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. +``` +Plot a chart with the title "Pages and Book totals" . +It shows the cumulative total number of pages read by summing the +Number of Pages of each book read in each year, using the Date Read data. +Plot date on the x axis and the number of pages on the y axis +using a scale on the left hand side of the chart. -> Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. +Superimpose a bar chart showing the total books read for each year, +taking data from the Date Read column. +Show the total books read using the right hand side of the chart, +which can be a different scale to the y axis shown on the left hand side. +``` The Plotly code generated when run with `gpt-4-turbo` was as follows: @@ -123,7 +136,12 @@ The plot this code returns looks as follows: ![](../../assets/tutorials/project/ The third chart should illustrate the difference between the rating the Goodreads reader assigned a book and the average rating across the Goodreads community. This prompt took a degree of iteration and needed us to specify how to draw the lines between the points. It was run several times before it colored each line differently, which is a key learning when using generative AI: your results will vary from run to run. -> For each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book - use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. +``` +For each row, create a dumbbell chart to show the difference +between My Rating and Average Rating for each book. +Use shapes to add the horizontal lines between markers. +Omit the legend. Don't show any row where My Rating is 0. +``` ??? example "Click to expand" === "Generated by Vizro-AI" From d8312131b40e52cdc9420cc82b659c4c559b2c76 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 16 Jan 2025 09:47:35 +0000 Subject: [PATCH 16/44] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../docs/pages/tutorials/project-tutorial.md | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index ff59e25d3..fcf0c045a 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -38,8 +38,8 @@ We can now dive use Vizro-AI to build some charts by iterating text to write eff To ask Vizro-AI to build a chart, we describe what we want to see. This chart should show an ordered horiontal timeline to illustrate the sequence of reading the books. ``` -Plot a chart with the title "Sequence of reading" . -It is a scatter chart. Use the x axis to show the date a book was read. +Plot a chart with the title "Sequence of reading" . +It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. ``` @@ -66,15 +66,15 @@ The plot this code returns looks as follows. Hovering over each point gave the d The second chart should plot the cumulative total of pages read and the cumulative total of books read per year. The prompt took a few iterations to refine: ``` -Plot a chart with the title "Pages and Book totals" . -It shows the cumulative total number of pages read by summing the -Number of Pages of each book read in each year, using the Date Read data. -Plot date on the x axis and the number of pages on the y axis +Plot a chart with the title "Pages and Book totals" . +It shows the cumulative total number of pages read by summing the +Number of Pages of each book read in each year, using the Date Read data. +Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. -Superimpose a bar chart showing the total books read for each year, -taking data from the Date Read column. -Show the total books read using the right hand side of the chart, +Superimpose a bar chart showing the total books read for each year, +taking data from the Date Read column. +Show the total books read using the right hand side of the chart, which can be a different scale to the y axis shown on the left hand side. ``` @@ -137,9 +137,9 @@ The plot this code returns looks as follows: ![](../../assets/tutorials/project/ The third chart should illustrate the difference between the rating the Goodreads reader assigned a book and the average rating across the Goodreads community. This prompt took a degree of iteration and needed us to specify how to draw the lines between the points. It was run several times before it colored each line differently, which is a key learning when using generative AI: your results will vary from run to run. ``` -For each row, create a dumbbell chart to show the difference +For each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book. -Use shapes to add the horizontal lines between markers. +Use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. ``` From f225c7937d71a77a7a32a539d1761d613138c57c Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 16 Jan 2025 10:38:17 +0000 Subject: [PATCH 17/44] Few copy edit improvements --- .../docs/pages/tutorials/project-tutorial.md | 40 +++++++++---------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index ff59e25d3..aff692e19 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -2,11 +2,11 @@ This tutorial uses Vizro-AI to build a prototype dashboard with three charts that illustrate a simple dataset. We first show how to create individual charts with Vizro-AI and then move on to learn how to use Vizro-AI to build a dashboard. The tutorial concludes by moving the prototype code generated by Vizro-AI into a project on PyCafe, for others to use and extend. -## Project background and data +## Project explanation -The dataset for this project was a set of books data [exported from a personal Goodreads account](https://www.goodreads.com/review/import). If you use Goodreads, you can export your own data in CSV format and use it with the code for this project. +The dataset for this project was a set of books data [exported from a personal Goodreads account](https://www.goodreads.com/review/import), which is provided with the project so you can run it. The dataset used can be downloaded from the [Vizro repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv). If you use Goodreads, you can export your own data in CSV format, substitute it for the dataset provided, and explore it with the code for this project. -The dataset was filtered to retain only books with an ISBN, since that can be used with [Google Books API](https://developers.google.com/books) to retrieve additional data about a book. The Books API wasn't used in this project, but by including ISBN data, there is scope to extend the prototype project in future. The dataset used can be downloaded from the [Vizro repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv). \ +The dataset was filtered to retain only books with an ISBN, which can be used with [Google Books API](https://developers.google.com/books) to retrieve additional data about a book. The Books API wasn't used in this project, but by including ISBN data, there is scope to extend the prototype project in future. ## OpenAI @@ -17,25 +17,23 @@ This tutorial uses OpenAI models with Vizro-AI. To run through the steps, you mu ## Chart generation with Vizro-AI -In this step, we'll show a UI on a hosted version of Vizro-AI, at [https://py.cafe/app/vizro-official/vizro-ai-charts](https://py.cafe/app/vizro-official/vizro-ai-charts). Use your browser to navigate to the site which looks as follows: +In this step, we use a UI on a hosted version of Vizro-AI, found at [https://py.cafe/app/vizro-official/vizro-ai-charts](https://py.cafe/app/vizro-official/vizro-ai-charts). Use your browser to navigate to the site which looks as follows: ![](../../assets/tutorials/project/user-interface-hosted-vizro-ai.png) ### Settings -You'll notice a cog icon at the top right hand corner for access to your settings, which look as follows: +The link will open with a settings pane where you can set the API key for your chosen vendor. At the time of writing, you can use OpenAI, Anthropic, Mistral, or xAI: ![](../../assets/tutorials/project/user-interface-settings-hosted-vizro-ai.png) -Add the API key for your chosen vendor. At the time of writing, you can use OpenAI, Anthropic, Mistral, or xAI. +To return to these settings at any time, you'll notice a cog icon at the top right hand corner for access to them. Once the API key is set, return to the main screen and upload the data for the project. -Once the API key is set, return to the main screen and upload the data for the project. - -We can now dive use Vizro-AI to build some charts by iterating text to write effective prompts. +We can now use Vizro-AI to build some charts by iterating text to form effective prompts. ### Chart 1: Books timeline -To ask Vizro-AI to build a chart, we describe what we want to see. This chart should show an ordered horiontal timeline to illustrate the sequence of reading the books. +To ask Vizro-AI to build a chart, we describe what we want to see. The first chart should show an ordered horiontal timeline to illustrate the sequence of reading the books. ``` Plot a chart with the title "Sequence of reading" . @@ -43,9 +41,9 @@ It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. ``` -We can adjust the model used: the chart below was generated from `gpt-4o-mini`. The chart displays on the right hand side of the screen and the Plotly code to generate the chart is below the prompt. +We can adjust the model used depending on the results, since more complex prompts need more powerful models. This chart was generated from `gpt-4o-mini`. It displays on the right hand side of the screen and the Plotly code to generate the chart is shown below the prompt. -The plot this code returns looks as follows. Hovering over each point gave the date the book was read, but not the title of the book. You'll also notice that the points are spaced evenly rather than proportionately: ![](../../assets/tutorials/project/chart1.png) +The plot this code returns looks as follows. Hovering over each point gave the date the book was read, but not the title of the book, although this could be achieved by tweaking the prompt to ask explicitly for particular fields in the hover text. You'll also notice that the points are spaced evenly rather than proportionately: ![](../../assets/tutorials/project/chart1.png) ??? example "Click to expand" === "Generated by Vizro-AI" @@ -78,7 +76,7 @@ Show the total books read using the right hand side of the chart, which can be a different scale to the y axis shown on the left hand side. ``` -The Plotly code generated when run with `gpt-4-turbo` was as follows: +The Plotly code generated when run with `gpt-4-turbo` was as follows. The chart could be improved by bringing the line graph on top of the bar chart, but varying the prompt to make this explicit did not have the desired results: ??? example "Click to expand" === "Generated by Vizro-AI" @@ -134,7 +132,7 @@ The plot this code returns looks as follows: ![](../../assets/tutorials/project/ ### Chart 3: Reviews comparison -The third chart should illustrate the difference between the rating the Goodreads reader assigned a book and the average rating across the Goodreads community. This prompt took a degree of iteration and needed us to specify how to draw the lines between the points. It was run several times before it colored each line differently, which is a key learning when using generative AI: your results will vary from run to run. +The third chart should illustrate the difference between the rating the Goodreads reader assigned a book and the average rating across the Goodreads community. This prompt took a degree of iteration and needed us to specify how to draw the lines between the points, which is a key learning when using generative AI: your results will vary from run to run. The type of chart ("dumbbell") was given explicitly to guide the chart creation. ``` For each row, create a dumbbell chart to show the difference @@ -192,7 +190,7 @@ The plot this code returns looks as follows: ![](../../assets/tutorials/project/ ### Set up a Jupyter Notebook -At this point, we have prototypes for three plotly charts for the Goodreads data. To display these as an interactive dashboard, we need some additional code and Vizro-AI can generate this for us, but not through the application hosted on PyCafe at the time of writing. We'll use a Jupyter Notebook +At this point, we have prototypes for three plotly charts for the Goodreads data. To display these as an interactive dashboard, we need some additional code and Vizro-AI can generate this for us, but not through the application hosted on PyCafe at the time of writing. We'll use a Jupyter Notebook instead. Before running the Notebook code, [set up Vizro-AI](https://vizro.readthedocs.io/projects/vizro-ai/en/latest/pages/user-guides/install/) inside a virtual environment with Python 3.10 or later. Install the package with `pip install vizro_ai`. @@ -200,9 +198,9 @@ You need to give Vizro-AI your API key to access OpenAI by adding it to your env ### Build a dashboard -Now we can open a Jupyter Notebook to make the dashboard. We'll submit a prompt that combines the three prompts listed above, with some small edits to ask for a dashboard that has three pages: one for each chart. +Now we can open a Jupyter Notebook to make the dashboard. We'll submit a single prompt that combines the three prompts listed above, with some small edits to ask for a dashboard that has three pages: one for each chart. -The following code shows the code to make the request to Vizro-AI to build and display the dashboard. The Notebook is available for download from [Vizro's GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv): +The following shows the code to make the request to Vizro-AI to build and display the dashboard. The Notebook is available for download from [Vizro's GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv): ??? example "Click to expand" === "Generated by Vizro-AI" @@ -230,9 +228,9 @@ The following code shows the code to make the request to Vizro-AI to build and d Using `gpt-4-turbo`, Vizro-AI generates a set of plotly chart code and the necessary Vizro support code to build a dashboard. The generated code is displayed as output in the Notebook with the dashboard, although the dashboard is better viewed at `http://localhost:8006/`. -You can see the code output in the [Notebook stored on the Vizro GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/goodreads.ipynb) , or generate similar output by running it yourself. +You can see the code output in the [Notebook stored on the Vizro GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/goodreads.ipynb), or generate similar output by running it yourself, although it will not necessarily be identical because of the variability of restuls returned from generative AI. -The charts generated were similar to those created by the PyCafe host above, although the first chart was improved by spacing the books proportionate to the date read and rolling over each point gave the book title as well as the date read. +The charts generated were similar to those created by the PyCafe host above, although the first chart was improved by spacing the books proportionate to the date read and the hover text included the book title as well as the date read, without an explicit request to do so. ![](../../assets/tutorials/project/chart1v2.png) @@ -281,7 +279,7 @@ There are three changes to the Notebook code needed for it to run on PyCafe: 1. Add `from vizro import Vizro` to the imports list 1. Add `Vizro().build(model).run()` at the end of the code block 1. Uncomment the data manager code and replace it with code needed to access the dataset: - - either download the dataset from the [Vizro GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv) \ and upload it to the PyCafe project. + - either download the dataset from the [Vizro GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv) and upload it to the PyCafe project. - or use the code added to the snippet below to read the dataset directly from online storage. Follow the link at the bottom of the code snippet titled **☕️ Run and edit this code in PyCafe** to use and edit the dashboard. @@ -472,7 +470,7 @@ Finally, we converted the Vizro-AI generated Python to a PyCafe project with a f The code generated by Vizro-AI does not make a perfect dashboard, but it has been very easy to get it to a good standard without a great deal of coding or design experience. There are a few improvements that are easily applied to the Plotly code to further improve the charts, as shown below in a separate PyCafe project. -### Improvements to generated code +### Improvements to generated Plotly code In this version of the dashboard, the first chart that show the sequence of books read has been modified to improve the information supplied when hovering over a point, and the opacity of the points has been altered to make it more attractive. From 1797c0aac9637da609db053d56ee46cccf955033 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 16 Jan 2025 10:38:49 +0000 Subject: [PATCH 18/44] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- vizro-ai/docs/pages/tutorials/project-tutorial.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index 6ee524a47..7afc62c0b 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -4,9 +4,9 @@ This tutorial uses Vizro-AI to build a prototype dashboard with three charts tha ## Project explanation -The dataset for this project was a set of books data [exported from a personal Goodreads account](https://www.goodreads.com/review/import), which is provided with the project so you can run it. The dataset used can be downloaded from the [Vizro repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv). If you use Goodreads, you can export your own data in CSV format, substitute it for the dataset provided, and explore it with the code for this project. +The dataset for this project was a set of books data [exported from a personal Goodreads account](https://www.goodreads.com/review/import), which is provided with the project so you can run it. The dataset used can be downloaded from the [Vizro repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv). \If you use Goodreads, you can export your own data in CSV format, substitute it for the dataset provided, and explore it with the code for this project. -The dataset was filtered to retain only books with an ISBN, which can be used with [Google Books API](https://developers.google.com/books) to retrieve additional data about a book. The Books API wasn't used in this project, but by including ISBN data, there is scope to extend the prototype project in future. +The dataset was filtered to retain only books with an ISBN, which can be used with [Google Books API](https://developers.google.com/books) to retrieve additional data about a book. The Books API wasn't used in this project, but by including ISBN data, there is scope to extend the prototype project in future. ## OpenAI @@ -132,7 +132,7 @@ The plot this code returns looks as follows: ![](../../assets/tutorials/project/ ### Chart 3: Reviews comparison -The third chart should illustrate the difference between the rating the Goodreads reader assigned a book and the average rating across the Goodreads community. This prompt took a degree of iteration and needed us to specify how to draw the lines between the points, which is a key learning when using generative AI: your results will vary from run to run. The type of chart ("dumbbell") was given explicitly to guide the chart creation. +The third chart should illustrate the difference between the rating the Goodreads reader assigned a book and the average rating across the Goodreads community. This prompt took a degree of iteration and needed us to specify how to draw the lines between the points, which is a key learning when using generative AI: your results will vary from run to run. The type of chart ("dumbbell") was given explicitly to guide the chart creation. ``` For each row, create a dumbbell chart to show the difference @@ -279,7 +279,7 @@ There are three changes to the Notebook code needed for it to run on PyCafe: 1. Add `from vizro import Vizro` to the imports list 1. Add `Vizro().build(model).run()` at the end of the code block 1. Uncomment the data manager code and replace it with code needed to access the dataset: - - either download the dataset from the [Vizro GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv) and upload it to the PyCafe project. + - either download the dataset from the [Vizro GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv)\ and upload it to the PyCafe project. - or use the code added to the snippet below to read the dataset directly from online storage. Follow the link at the bottom of the code snippet titled **☕️ Run and edit this code in PyCafe** to use and edit the dashboard. From 21b2b5a125e4cd0b7a9c7aabe5daab2d553e6226 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 16 Jan 2025 10:39:29 +0000 Subject: [PATCH 19/44] Linting --- vizro-ai/docs/pages/tutorials/project-tutorial.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index 6ee524a47..7afc62c0b 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -4,9 +4,9 @@ This tutorial uses Vizro-AI to build a prototype dashboard with three charts tha ## Project explanation -The dataset for this project was a set of books data [exported from a personal Goodreads account](https://www.goodreads.com/review/import), which is provided with the project so you can run it. The dataset used can be downloaded from the [Vizro repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv). If you use Goodreads, you can export your own data in CSV format, substitute it for the dataset provided, and explore it with the code for this project. +The dataset for this project was a set of books data [exported from a personal Goodreads account](https://www.goodreads.com/review/import), which is provided with the project so you can run it. The dataset used can be downloaded from the [Vizro repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv). \If you use Goodreads, you can export your own data in CSV format, substitute it for the dataset provided, and explore it with the code for this project. -The dataset was filtered to retain only books with an ISBN, which can be used with [Google Books API](https://developers.google.com/books) to retrieve additional data about a book. The Books API wasn't used in this project, but by including ISBN data, there is scope to extend the prototype project in future. +The dataset was filtered to retain only books with an ISBN, which can be used with [Google Books API](https://developers.google.com/books) to retrieve additional data about a book. The Books API wasn't used in this project, but by including ISBN data, there is scope to extend the prototype project in future. ## OpenAI @@ -132,7 +132,7 @@ The plot this code returns looks as follows: ![](../../assets/tutorials/project/ ### Chart 3: Reviews comparison -The third chart should illustrate the difference between the rating the Goodreads reader assigned a book and the average rating across the Goodreads community. This prompt took a degree of iteration and needed us to specify how to draw the lines between the points, which is a key learning when using generative AI: your results will vary from run to run. The type of chart ("dumbbell") was given explicitly to guide the chart creation. +The third chart should illustrate the difference between the rating the Goodreads reader assigned a book and the average rating across the Goodreads community. This prompt took a degree of iteration and needed us to specify how to draw the lines between the points, which is a key learning when using generative AI: your results will vary from run to run. The type of chart ("dumbbell") was given explicitly to guide the chart creation. ``` For each row, create a dumbbell chart to show the difference @@ -279,7 +279,7 @@ There are three changes to the Notebook code needed for it to run on PyCafe: 1. Add `from vizro import Vizro` to the imports list 1. Add `Vizro().build(model).run()` at the end of the code block 1. Uncomment the data manager code and replace it with code needed to access the dataset: - - either download the dataset from the [Vizro GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv) and upload it to the PyCafe project. + - either download the dataset from the [Vizro GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv)\ and upload it to the PyCafe project. - or use the code added to the snippet below to read the dataset directly from online storage. Follow the link at the bottom of the code snippet titled **☕️ Run and edit this code in PyCafe** to use and edit the dashboard. From 4e4996c89e6ed235bc4dd76bc557230d8abeb1b3 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 16 Jan 2025 12:46:39 +0000 Subject: [PATCH 20/44] Change rules of repo for data files --- .gitignore | 1 + tools/check_for_datafiles.py | 48 ------------------------------------ 2 files changed, 1 insertion(+), 48 deletions(-) delete mode 100644 tools/check_for_datafiles.py diff --git a/.gitignore b/.gitignore index 79a54175f..5fc87c51c 100644 --- a/.gitignore +++ b/.gitignore @@ -150,6 +150,7 @@ cython_debug/ # Ignore data files except for white-listed folders *.csv +!vizro-ai/examples/goodreads_tutorial/*.csv *.xls *.xlsx *.parquet diff --git a/tools/check_for_datafiles.py b/tools/check_for_datafiles.py deleted file mode 100644 index c34114ff6..000000000 --- a/tools/check_for_datafiles.py +++ /dev/null @@ -1,48 +0,0 @@ -"""FUNCTION TO CHECK FOR DATA FILES IN NON-WHITELISTED FOLDERS.""" - -import glob -from pathlib import Path - -file_extensions = [ - "csv", - "xlsx", - "xls", - "parquet", - "tsv", - "hdf5", - "h5", - "pickle", - "pkl", - "db", - "sqlite", - "sqlite3", - "orc", -] -whitelist_folders = [ - "/venv", - "/vizro-core/docs", - "/vizro-ai/tests/integration/reports", -] # starting from project root dir - - -def check_for_data_files(): - """Recursively finds all data files in non-whitelisted folders. - - Raises: - AssertionError if data files are present in non-whitelisted folders. - - """ - project_dir = str(Path(__file__).parent.parent) - whitelist_dir = {f"{project_dir}{dir}" for dir in whitelist_folders} - - found_files = {file for ext in file_extensions for file in glob.glob(project_dir + f"/**/*.{ext}", recursive=True)} - whitelisted_files = {files for dir in whitelist_dir for files in found_files if files.startswith(dir)} - to_be_removed_files = found_files - whitelisted_files - - assert ( - len(to_be_removed_files) == 0 - ), f"Caution! Please remove your data files {to_be_removed_files} before merging!" - - -if __name__ == "__main__": - check_for_data_files() From 834c8d9c198420e8b315c0dc045b7aa12534719d Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 16 Jan 2025 13:16:15 +0000 Subject: [PATCH 21/44] Add Goodreads project and data to examples --- .../goodreads_tutorial/filtered_books.csv | 57 ++ .../goodreads_tutorial/goodreads.ipynb | 682 ++++++++++++++++++ 2 files changed, 739 insertions(+) create mode 100644 vizro-ai/examples/goodreads_tutorial/filtered_books.csv create mode 100644 vizro-ai/examples/goodreads_tutorial/goodreads.ipynb diff --git a/vizro-ai/examples/goodreads_tutorial/filtered_books.csv b/vizro-ai/examples/goodreads_tutorial/filtered_books.csv new file mode 100644 index 000000000..a93c927ed --- /dev/null +++ b/vizro-ai/examples/goodreads_tutorial/filtered_books.csv @@ -0,0 +1,57 @@ +Title,Author,Author l-f,Additional Authors,ISBN,My Rating,Average Rating,Number of Pages,Year Published,Original Publication Year,Date Read +Milk Teeth,Jessica Andrews,"Andrews, Jessica",,1473682835,0,3.66,251,2022,2022,01/01/2023 +The Mad Women's Ball,Victoria Mas,"Mas, Victoria",Frank Wynne,1473575672,0,3.78,214,2021,2019,11/01/2023 +The Followers,Rebecca Wait,"Wait, Rebecca",,1447224760,0,3.9,347,2015,2015,15/01/2023 +In Little Stars,Linda Green,"Green, Linda",,1787478777,0,4.47,387,2022,,22/01/2023 +The Beloved Girls,Harriet Evans,"Evans, Harriet",,1472251075,3,3.65,520,2021,2021,02/02/2023 +The Vorrh,Brian Catling,"Catling, Brian",,1473606608,0,3.46,514,2015,2012,09/02/2023 +Kololo Hill,Neema Shah,"Shah, Neema",,1529030528,0,3.91,353,2021,,24/02/2023 +Small Pleasures,Clare Chambers,"Chambers, Clare",,1474613918,5,3.77,301,2020,2021,15/03/2023 +Greenwich Park,Katherine Faulkner,"Faulkner, Katherine",,152662625X,2,3.84,383,2021,2021,31/03/2023 +Don't Close Your Eyes,P.S. Cunliffe,"Cunliffe, P.S.",,1471413209,3,4.01,396,2023,2023,10/04/2023 +Among the Lesser Gods,Margo Catts,"Catts, Margo",,1628727403,4,4.12,338,2017,2017,16/04/2023 +Winter People,Gráinne Murphy,"Murphy, Gráinne",,1915054362,4,4.1,272,2022,,27/04/2023 +We Had to Remove This Post,Hanna Bervoets,"Bervoets, Hanna",Emma Rault,1529087252,4,2.93,144,2022,2021,02/05/2023 +The Schoolhouse,Sophie Ward,"Ward, Sophie",,1472156293,3,3.29,304,2023,2022,28/05/2023 +Victoria Park,Gemma Reeves,"Reeves, Gemma",,176087406X,3,3.6,227,2021,2021,04/06/2023 +Your Child is Not Broken: Parent Your Neurodivergent Child Without Losing Your Marbles,Heidi Mavir,"Mavir, Heidi",,1035030985,5,4.41,281,2023,,07/06/2023 +Sea Defences,Hilary Taylor,"Taylor, Hilary",,178563366X,5,4.3,337,2022,,27/06/2023 +No One Saw a Thing,Andrea Mara,"Mara, Andrea",,1529197899,1,3.98,378,2023,2023,07/07/2023 +Nobber,Oisín Fagan,"Fagan, Oisín",,1529389100,0,3.58,304,2019,2019,17/07/2023 +Ginger and Me,Elissa Soave,"Soave, Elissa",,000845843X,5,3.85,384,2022,2022,07/08/2023 +The Queen of Dirt Island,Donal Ryan,"Ryan, Donal",,1473544602,5,4.08,248,2022,2022,17/08/2023 +The Island of Longing,Anne Griffin,"Griffin, Anne",,1529372062,4,4.15,307,2023,2023,26/08/2023 +The Secret of Elephants,Vasundra Tailor,"Tailor, Vasundra",,1542038200,0,4.09,305,2022,2022,29/09/2023 +Strange Flowers,Donal Ryan,"Ryan, Donal",,1473544610,4,3.81,218,2020,2020,11/09/2023 +Mrs England,Stacey Halls,"Halls, Stacey",,1838772898,0,3.91,338,2021,2021,02/10/2023 +The Promise,Lucy Diamond,"Diamond, Lucy",,1529027055,3,4.02,480,2021,2020,07/10/2023 +Haven,Emma Donoghue,"Donoghue, Emma",,1529091179,4,3.42,289,2022,2022,10/10/2023 +The Lost Apothecary,Sarah Penner,"Penner, Sarah",,1789558980,2,3.75,320,2021,2021,27/10/2023 +Prize Women,Caroline Lea,"Lea, Caroline",,140594899X,0,3.93,438,2023,2023,11/11/2023 +Daughters of Night,Laura Shepherd-Robinson,"Shepherd-Robinson, Laura",,1509880852,4,4.17,498,2021,2021,22/11/2023 +Saltwater,Jessica Andrews,"Andrews, Jessica",,1473682797,0,3.79,304,2019,2019,27/11/2023 +Shuggie Bain,Douglas Stuart,"Stuart, Douglas",,1529019303,0,4.31,449,2020,2020,29/11/2023 +The Other Mothers,Katherine Faulkner,"Faulkner, Katherine",,1526626284,4,3.84,356,2023,2023,17/12/2023 +The Fell,Sarah Moss,"Moss, Sarah",,1529083257,0,3.63,193,2021,2021,29/12/2023 +Co-Active Coaching: The proven framework for transformative conversations at work and in life,Henry Kimsey-House,"Kimsey-House, Henry","Karen Kimsey-House, Phillip Sandahl, Laura Whitworth, Alexis Phillips",1473691133,5,4.2,241,2018,1998,29/12/2023 +The Step-by-Step Guide to Sourdough,Carroll Pellegrinelli,"Pellegrinelli, Carroll",,1641521651,2,4.03,226,2019,,01/01/2024 +Heartsick,Jessie Stephens,"Stephens, Jessie",,1529084229,2,4,333,2022,2021,14/01/2024 +The Echo Chamber,John Boyne,"Boyne, John",,1473563321,1,3.87,432,2021,2021,03/03/2024 +The Turnglass,Gareth Rubin,"Rubin, Gareth",,1398514519,4,3.49,512,2023,2023,30/03/2024 +Green Dot,Madeleine Gray,"Gray, Madeleine",,1399612794,4,3.7,376,2024,2024,09/04/2024 +In Memoriam,Alice Winn,"Winn, Alice",,024156784X,0,4.53,380,2023,2023,14/04/2024 +This Could Be Us,Claire McGowan,"McGowan, Claire",,1472157206,0,3.97,336,2023,,07/05/2024 +One of the Good Guys,Araminta Hall,"Hall, Araminta",,1035018136,0,3.51,324,2024,2024,27/05/2024 +Everyone Here Is Lying,Shari Lapena,"Lapena, Shari",,1473598567,0,3.8,404,2023,2023,07/06/2024 +The Man Who Didn't Call,Rosie Walsh,"Walsh, Rosie",,150982829X,3,3.75,353,2018,2018,22/06/2024 +The Wrong Daughter,Dandy Smith,"Smith, Dandy",,1471414639,3,4.09,353,2024,2024,29/06/2024 +Earth,John Boyne,"Boyne, John",,152991650X,4,4.31,168,2024,,30/06/2024 +The Satsuma Complex,Bob Mortimer,"Mortimer, Bob",,1398521213,0,3.68,301,2022,2022,07/07/2024 +Verity,Colleen Hoover,"Hoover, Colleen",,1408726610,0,4.31,333,2021,2018,09/07/2024 +Talking at Night,Claire Daverley,"Daverley, Claire",,1405953861,5,3.96,389,2023,2023,07/08/2024 +Maybe in Another Life,Taylor Jenkins Reid,"Reid, Taylor Jenkins",,139851666X,2,3.79,349,2022,2015,20/08/2024 +"Are You There, God? It's Me, Margaret",Judy Blume,"Blume, Judy",,1447280350,4,3.94,224,2014,1970,01/09/2024 +None of This Is True,Lisa Jewell,"Jewell, Lisa",,1804940224,1,4.12,400,2023,2023,07/09/2024 +Africa Is Not A Country: Breaking Stereotypes of Modern Africa,Dipo Faloyin,"Faloyin, Dipo",,1473593433,4,4.43,340,2022,2022,09/09/2024 +After the Funeral,Tessa Hadley,"Hadley, Tessa",,1473595290,4,3.82,226,2023,2023,21/09/2024 +Strong Female Character,Fern Brady,"Brady, Fern",,1914240464,4,4.47,288,2023,2023,31/10/2024 \ No newline at end of file diff --git a/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb b/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb new file mode 100644 index 000000000..a1d48e716 --- /dev/null +++ b/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb @@ -0,0 +1,682 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "150de2e4-622f-4d0f-91a2-ad47dd16c53a", + "metadata": {}, + "outputs": [], + "source": [ + "# Vizro-AI setup\n", + "\n", + "from vizro import Vizro\n", + "import vizro_ai\n", + "from vizro_ai import VizroAI\n", + "from dotenv import load_dotenv\n", + "\n", + "# Ensure the API key is in .env\n", + "load_dotenv()\n", + "\n", + "# Choose your model\n", + "\n", + "vizro_ai = VizroAI(model=\"gpt-4-turbo\")\n", + "\n", + "import pandas as pd\n", + "\n", + "df = pd.read_csv('filtered_books.csv')\n", + "df[\"Date Read\"] = pd.to_datetime(df['Date Read'],dayfirst=True)\n", + "\n", + "# Data cleanup \n", + "# Specify columns to check for missing values\n", + "columns_to_check = ['Title', 'Author', 'ISBN', 'My Rating', 'Average Rating', 'Number of Pages', 'Original Publication Year', 'Date Read']\n", + "df_cleaned = df.dropna(subset=columns_to_check)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1cbbea13-28f1-47fc-9348-9e41ba178463", + "metadata": {}, + "outputs": [], + "source": [ + "# Specifiy the prompt here\n", + "user_question = \"\"\"\n", + "Create a dashboard with 3 pages, one for each chart. \n", + "\n", + "On the first page, plot a chart with the title \"Sequence of reading\" . \n", + "It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1.\n", + "Add a filter so the user can adjust the range of dates by year on the x axis.\n", + "\n", + "On the second page, plot a chart with the title \"Pages and Book totals\" . \n", + "It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. \n", + "Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart.\n", + "Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. \n", + "Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. \n", + "Add a filter so the user can adjust the range of dates by year on the x axis.\n", + "\n", + "On the third page, for each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book.\n", + "Use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0.\n", + "\"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "14e9f5de-1ace-44cd-8b3a-3f1ee805fe2e", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "72dc4d9d9a6748d4b651dc76197bc8b5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Store df info: 0%| | 0/1 [00:00 components: 0%| | 0/1 [00:00 components: 0%| | 0/1 [00:00 components: 0%| | 0/1 [00:00 controls: 0%| | 0/1 [00:00 controls: 0it [00:00, ?it/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5055cf7208594dbe8bf0db4621ffff25", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Currently Building ... [Page] controls: 0%| | 0/1 [00:00. Definition will not be included.\n", + "WARNING:root:Could not extract source for . Definition will not be included.\n", + "WARNING:root:Could not extract source for . Definition will not be included.\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + " \n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "############ Imports ##############\n", + "import vizro.models as vm\n", + "from vizro.models.types import capture\n", + "import pandas as pd\n", + "import plotly.graph_objects as go\n", + "from vizro.models.types import capture\n", + "\n", + "\n", + "####### Function definitions ######\n", + "@capture(\"graph\")\n", + "def sequence_reading(data_frame):\n", + " fig = go.Figure()\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=data_frame[\"Date Read\"],\n", + " y=[1] * len(data_frame),\n", + " mode=\"markers\",\n", + " marker=dict(size=10, color=\"blue\"),\n", + " )\n", + " )\n", + " fig.update_layout(\n", + " title=\"Sequence of reading\",\n", + " xaxis_title=\"Date Read\",\n", + " yaxis_title=\"Sequence\",\n", + " yaxis=dict(showticklabels=False, showgrid=False),\n", + " xaxis=dict(tickangle=-45),\n", + " )\n", + " return fig\n", + "\n", + "\n", + "@capture(\"graph\")\n", + "def pages_books_totals(data_frame):\n", + " # Prepare data\n", + " data_frame[\"Date Read\"] = pd.to_datetime(data_frame[\"Date Read\"])\n", + " data_frame.sort_values(\"Date Read\", inplace=True)\n", + " data_frame[\"Cumulative Pages\"] = data_frame[\"Number of Pages\"].cumsum()\n", + "\n", + " # Aggregate data by year for total books read\n", + " yearly_books = data_frame.groupby(data_frame[\"Date Read\"].dt.year).size()\n", + "\n", + " # Create figure with secondary y-axis\n", + " fig = go.Figure()\n", + "\n", + " # Add line for cumulative pages\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=data_frame[\"Date Read\"],\n", + " y=data_frame[\"Cumulative Pages\"],\n", + " mode=\"lines\",\n", + " name=\"Cumulative Pages Read\",\n", + " )\n", + " )\n", + "\n", + " # Add bars for books read per year\n", + " fig.add_trace(\n", + " go.Bar(\n", + " x=yearly_books.index, y=yearly_books, name=\"Books Read per Year\", yaxis=\"y2\"\n", + " )\n", + " )\n", + "\n", + " # Set up the layout\n", + " fig.update_layout(\n", + " title=\"Cumulative Pages Read and Books Read per Year\",\n", + " xaxis_title=\"Date\",\n", + " yaxis=dict(title=\"Number of Pages\"),\n", + " yaxis2=dict(title=\"Total Books\", overlaying=\"y\", side=\"right\"),\n", + " )\n", + "\n", + " return fig\n", + "\n", + "\n", + "@capture(\"graph\")\n", + "def rating_comparison(data_frame):\n", + " # Filter out rows where 'My Rating' is 0\n", + " df = data_frame[data_frame[\"My Rating\"] != 0]\n", + "\n", + " # Create a figure\n", + " fig = go.Figure()\n", + "\n", + " # Add dumbbell traces\n", + " for index, row in df.iterrows():\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=[row[\"My Rating\"], row[\"Average Rating\"]],\n", + " y=[row[\"Title\"], row[\"Title\"]],\n", + " mode=\"markers+lines\",\n", + " name=row[\"Title\"],\n", + " marker=dict(size=10),\n", + " line=dict(width=2),\n", + " )\n", + " )\n", + "\n", + " # Update layout\n", + " fig.update_layout(\n", + " title=\"Comparison of My Rating vs Average Rating\",\n", + " xaxis_title=\"Rating\",\n", + " yaxis_title=\"Book Title\",\n", + " showlegend=False,\n", + " )\n", + "\n", + " return fig\n", + "\n", + "\n", + "####### Data Manager Settings #####\n", + "#######!!! UNCOMMENT BELOW !!!#####\n", + "# from vizro.managers import data_manager\n", + "# data_manager[\"book_reading_data\"] = ===> Fill in here <===\n", + "\n", + "\n", + "########### Model code ############\n", + "model = vm.Dashboard(\n", + " pages=[\n", + " vm.Page(\n", + " components=[\n", + " vm.Graph(\n", + " id=\"sequence_reading\",\n", + " figure=sequence_reading(data_frame=\"book_reading_data\"),\n", + " )\n", + " ],\n", + " title=\"Sequence of Reading\",\n", + " layout=vm.Layout(grid=[[0]]),\n", + " controls=[\n", + " vm.Filter(\n", + " column=\"Year Published\",\n", + " targets=[\"sequence_reading\"],\n", + " selector=vm.RangeSlider(type=\"range_slider\"),\n", + " )\n", + " ],\n", + " ),\n", + " vm.Page(\n", + " components=[\n", + " vm.Graph(\n", + " id=\"pages_books_totals\",\n", + " figure=pages_books_totals(data_frame=\"book_reading_data\"),\n", + " )\n", + " ],\n", + " title=\"Pages and Book Totals\",\n", + " layout=vm.Layout(grid=[[0]]),\n", + " controls=[\n", + " vm.Filter(\n", + " column=\"Year Published\",\n", + " targets=[\"pages_books_totals\"],\n", + " selector=vm.RangeSlider(type=\"range_slider\"),\n", + " )\n", + " ],\n", + " ),\n", + " vm.Page(\n", + " components=[\n", + " vm.Graph(\n", + " id=\"rating_comparison\",\n", + " figure=rating_comparison(data_frame=\"book_reading_data\"),\n", + " )\n", + " ],\n", + " title=\"Rating Comparison\",\n", + " layout=vm.Layout(grid=[[0]]),\n", + " controls=[],\n", + " ),\n", + " ],\n", + " title=\"Book Reading Analysis Dashboard\",\n", + ")\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ERROR:__main__:Exception on /_dash-update-component [POST]\n", + "Traceback (most recent call last):\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/flask/app.py\", line 1473, in wsgi_app\n", + " response = self.full_dispatch_request()\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/flask/app.py\", line 882, in full_dispatch_request\n", + " rv = self.handle_user_exception(e)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/flask/app.py\", line 880, in full_dispatch_request\n", + " rv = self.dispatch_request()\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/flask/app.py\", line 865, in dispatch_request\n", + " return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return]\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/dash/dash.py\", line 1376, in dispatch\n", + " ctx.run(\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/dash/_callback.py\", line 507, in add_context\n", + " raise err\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/dash/_callback.py\", line 496, in add_context\n", + " output_value = _invoke_callback(func, *func_args, **func_kwargs)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/dash/_callback.py\", line 43, in _invoke_callback\n", + " return func(*args, **kwargs) # %% callback invoked %%\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/models/_action/_action.py\", line 181, in callback_wrapper\n", + " return_value = self._action_callback_function(inputs=external, outputs=callback_outputs.get(\"external\"))\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/models/_action/_action.py\", line 110, in _action_callback_function\n", + " return_value = self.function(**inputs)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/models/types.py\", line 153, in __call__\n", + " return self.__function(**{**self.__bound_arguments, **kwargs})\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/actions/_on_page_load_action.py\", line 25, in _on_page_load\n", + " return _get_modified_page_figures(\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/actions/_actions_utils.py\", line 278, in _get_modified_page_figures\n", + " filtered_data = _apply_filters(unfiltered_data, ctds_filter, ctds_filter_interaction, target)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/actions/_actions_utils.py\", line 224, in _apply_filters\n", + " filtered_data = _apply_filter_controls(data_frame=data, ctds_filter=ctds_filter, target=target)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/actions/_actions_utils.py\", line 79, in _apply_filter_controls\n", + " data_frame = data_frame[_filter_function(data_frame[_filter_column], _filter_value)]\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/models/_controls/filter.py\", line 62, in _filter_between\n", + " return series.between(value[0], value[1], inclusive=\"both\")\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/series.py\", line 5638, in between\n", + " lmask = self >= left\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/ops/common.py\", line 76, in new_method\n", + " return method(self, other)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/arraylike.py\", line 60, in __ge__\n", + " return self._cmp_method(other, operator.ge)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/series.py\", line 6119, in _cmp_method\n", + " res_values = ops.comparison_op(lvalues, rvalues, op)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/ops/array_ops.py\", line 341, in comparison_op\n", + " return invalid_comparison(lvalues, rvalues, op)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/ops/invalid.py\", line 40, in invalid_comparison\n", + " raise TypeError(f\"Invalid comparison between dtype={left.dtype} and {typ}\")\n", + "TypeError: Invalid comparison between dtype=int64 and str\n", + "ERROR:__main__:Exception on /_dash-update-component [POST]\n", + "Traceback (most recent call last):\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/flask/app.py\", line 1473, in wsgi_app\n", + " response = self.full_dispatch_request()\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/flask/app.py\", line 882, in full_dispatch_request\n", + " rv = self.handle_user_exception(e)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/flask/app.py\", line 880, in full_dispatch_request\n", + " rv = self.dispatch_request()\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/flask/app.py\", line 865, in dispatch_request\n", + " return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return]\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/dash/dash.py\", line 1376, in dispatch\n", + " ctx.run(\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/dash/_callback.py\", line 507, in add_context\n", + " raise err\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/dash/_callback.py\", line 496, in add_context\n", + " output_value = _invoke_callback(func, *func_args, **func_kwargs)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/dash/_callback.py\", line 43, in _invoke_callback\n", + " return func(*args, **kwargs) # %% callback invoked %%\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/models/_action/_action.py\", line 181, in callback_wrapper\n", + " return_value = self._action_callback_function(inputs=external, outputs=callback_outputs.get(\"external\"))\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/models/_action/_action.py\", line 110, in _action_callback_function\n", + " return_value = self.function(**inputs)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/models/types.py\", line 153, in __call__\n", + " return self.__function(**{**self.__bound_arguments, **kwargs})\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/actions/_on_page_load_action.py\", line 25, in _on_page_load\n", + " return _get_modified_page_figures(\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/actions/_actions_utils.py\", line 278, in _get_modified_page_figures\n", + " filtered_data = _apply_filters(unfiltered_data, ctds_filter, ctds_filter_interaction, target)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/actions/_actions_utils.py\", line 224, in _apply_filters\n", + " filtered_data = _apply_filter_controls(data_frame=data, ctds_filter=ctds_filter, target=target)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/actions/_actions_utils.py\", line 79, in _apply_filter_controls\n", + " data_frame = data_frame[_filter_function(data_frame[_filter_column], _filter_value)]\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/models/_controls/filter.py\", line 62, in _filter_between\n", + " return series.between(value[0], value[1], inclusive=\"both\")\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/series.py\", line 5638, in between\n", + " lmask = self >= left\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/ops/common.py\", line 76, in new_method\n", + " return method(self, other)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/arraylike.py\", line 60, in __ge__\n", + " return self._cmp_method(other, operator.ge)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/series.py\", line 6119, in _cmp_method\n", + " res_values = ops.comparison_op(lvalues, rvalues, op)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/ops/array_ops.py\", line 341, in comparison_op\n", + " return invalid_comparison(lvalues, rvalues, op)\n", + " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/ops/invalid.py\", line 40, in invalid_comparison\n", + " raise TypeError(f\"Invalid comparison between dtype={left.dtype} and {typ}\")\n", + "TypeError: Invalid comparison between dtype=int64 and str\n", + ":9: SettingWithCopyWarning:\n", + "\n", + "\n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + "\n", + ":10: SettingWithCopyWarning:\n", + "\n", + "\n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + "\n", + ":11: SettingWithCopyWarning:\n", + "\n", + "\n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + "\n", + ":9: SettingWithCopyWarning:\n", + "\n", + "\n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + "\n", + ":10: SettingWithCopyWarning:\n", + "\n", + "\n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + "\n", + ":11: SettingWithCopyWarning:\n", + "\n", + "\n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + "\n", + ":9: SettingWithCopyWarning:\n", + "\n", + "\n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + "\n", + ":10: SettingWithCopyWarning:\n", + "\n", + "\n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + "\n", + ":11: SettingWithCopyWarning:\n", + "\n", + "\n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + "\n" + ] + } + ], + "source": [ + "result = vizro_ai.dashboard([df_cleaned], user_question, return_elements=True)\n", + "Vizro().build(result.dashboard).run(port=8006)\n", + "print(result.code)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c893170d-756b-4ca8-a3a2-d3646ac8e595", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.15" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From c846698a8b852a1d15e7789c60e49b1111254f8e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 16 Jan 2025 13:16:43 +0000 Subject: [PATCH 22/44] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../goodreads_tutorial/filtered_books.csv | 2 +- .../goodreads_tutorial/goodreads.ipynb | 23 +++++++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/vizro-ai/examples/goodreads_tutorial/filtered_books.csv b/vizro-ai/examples/goodreads_tutorial/filtered_books.csv index a93c927ed..33086702b 100644 --- a/vizro-ai/examples/goodreads_tutorial/filtered_books.csv +++ b/vizro-ai/examples/goodreads_tutorial/filtered_books.csv @@ -54,4 +54,4 @@ Maybe in Another Life,Taylor Jenkins Reid,"Reid, Taylor Jenkins",,139851666X,2,3 None of This Is True,Lisa Jewell,"Jewell, Lisa",,1804940224,1,4.12,400,2023,2023,07/09/2024 Africa Is Not A Country: Breaking Stereotypes of Modern Africa,Dipo Faloyin,"Faloyin, Dipo",,1473593433,4,4.43,340,2022,2022,09/09/2024 After the Funeral,Tessa Hadley,"Hadley, Tessa",,1473595290,4,3.82,226,2023,2023,21/09/2024 -Strong Female Character,Fern Brady,"Brady, Fern",,1914240464,4,4.47,288,2023,2023,31/10/2024 \ No newline at end of file +Strong Female Character,Fern Brady,"Brady, Fern",,1914240464,4,4.47,288,2023,2023,31/10/2024 diff --git a/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb b/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb index a1d48e716..03abc0a09 100644 --- a/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb +++ b/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb @@ -9,10 +9,10 @@ "source": [ "# Vizro-AI setup\n", "\n", - "from vizro import Vizro\n", "import vizro_ai\n", - "from vizro_ai import VizroAI\n", "from dotenv import load_dotenv\n", + "from vizro import Vizro\n", + "from vizro_ai import VizroAI\n", "\n", "# Ensure the API key is in .env\n", "load_dotenv()\n", @@ -23,13 +23,22 @@ "\n", "import pandas as pd\n", "\n", - "df = pd.read_csv('filtered_books.csv')\n", - "df[\"Date Read\"] = pd.to_datetime(df['Date Read'],dayfirst=True)\n", + "df = pd.read_csv(\"filtered_books.csv\")\n", + "df[\"Date Read\"] = pd.to_datetime(df[\"Date Read\"], dayfirst=True)\n", "\n", - "# Data cleanup \n", + "# Data cleanup\n", "# Specify columns to check for missing values\n", - "columns_to_check = ['Title', 'Author', 'ISBN', 'My Rating', 'Average Rating', 'Number of Pages', 'Original Publication Year', 'Date Read']\n", - "df_cleaned = df.dropna(subset=columns_to_check)\n" + "columns_to_check = [\n", + " \"Title\",\n", + " \"Author\",\n", + " \"ISBN\",\n", + " \"My Rating\",\n", + " \"Average Rating\",\n", + " \"Number of Pages\",\n", + " \"Original Publication Year\",\n", + " \"Date Read\",\n", + "]\n", + "df_cleaned = df.dropna(subset=columns_to_check)" ] }, { From 2e33e0f87c75c8adb808a7da03828299643e233e Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 16 Jan 2025 13:35:45 +0000 Subject: [PATCH 23/44] Pass precommit --- .pre-commit-config.yaml | 10 +--------- vizro-ai/pyproject.toml | 1 + 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1107ba26c..ada17ac1c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,14 +12,6 @@ repos: - id: trailing-whitespace - id: end-of-file-fixer - - repo: local - hooks: - - id: check-datafiles - name: check-datafiles - entry: python tools/check_for_datafiles.py - language: python - pass_filenames: false - - repo: https://github.com/codespell-project/codespell rev: v2.3.0 hooks: @@ -36,7 +28,7 @@ repos: language: node types: [text] additional_dependencies: ["prettier@3.3.3"] - exclude_types: [markdown] + exclude_types: [markdown, csv] - repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks rev: v2.14.0 diff --git a/vizro-ai/pyproject.toml b/vizro-ai/pyproject.toml index 791d2ab72..8393e7e88 100644 --- a/vizro-ai/pyproject.toml +++ b/vizro-ai/pyproject.toml @@ -77,3 +77,4 @@ src = ["src"] # Ignore print, line length, and import violations in Colab notebooks "examples/chart_by_vizro_ai.ipynb" = ["T201", "E501"] "examples/dashboard_by_vizro_ai.ipynb" = ["T201", "E402", "E501"] +"examples/goodreads_tutorial/goodreads.ipynb" = ["T201", "E402", "E501", "W291", "F811"] From fd2fe3dc545e2fd225306e5ad991adcf67d40d99 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 16 Jan 2025 13:36:41 +0000 Subject: [PATCH 24/44] Minor tweaks to data/notebook --- .../goodreads_tutorial/filtered_books.csv | 2 +- .../goodreads_tutorial/goodreads.ipynb | 25 +++++++++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/vizro-ai/examples/goodreads_tutorial/filtered_books.csv b/vizro-ai/examples/goodreads_tutorial/filtered_books.csv index a93c927ed..33086702b 100644 --- a/vizro-ai/examples/goodreads_tutorial/filtered_books.csv +++ b/vizro-ai/examples/goodreads_tutorial/filtered_books.csv @@ -54,4 +54,4 @@ Maybe in Another Life,Taylor Jenkins Reid,"Reid, Taylor Jenkins",,139851666X,2,3 None of This Is True,Lisa Jewell,"Jewell, Lisa",,1804940224,1,4.12,400,2023,2023,07/09/2024 Africa Is Not A Country: Breaking Stereotypes of Modern Africa,Dipo Faloyin,"Faloyin, Dipo",,1473593433,4,4.43,340,2022,2022,09/09/2024 After the Funeral,Tessa Hadley,"Hadley, Tessa",,1473595290,4,3.82,226,2023,2023,21/09/2024 -Strong Female Character,Fern Brady,"Brady, Fern",,1914240464,4,4.47,288,2023,2023,31/10/2024 \ No newline at end of file +Strong Female Character,Fern Brady,"Brady, Fern",,1914240464,4,4.47,288,2023,2023,31/10/2024 diff --git a/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb b/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb index a1d48e716..969efea35 100644 --- a/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb +++ b/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb @@ -9,10 +9,10 @@ "source": [ "# Vizro-AI setup\n", "\n", - "from vizro import Vizro\n", "import vizro_ai\n", - "from vizro_ai import VizroAI\n", "from dotenv import load_dotenv\n", + "from vizro import Vizro\n", + "from vizro_ai import VizroAI\n", "\n", "# Ensure the API key is in .env\n", "load_dotenv()\n", @@ -23,13 +23,22 @@ "\n", "import pandas as pd\n", "\n", - "df = pd.read_csv('filtered_books.csv')\n", - "df[\"Date Read\"] = pd.to_datetime(df['Date Read'],dayfirst=True)\n", + "df = pd.read_csv(\"filtered_books.csv\")\n", + "df[\"Date Read\"] = pd.to_datetime(df[\"Date Read\"], dayfirst=True)\n", "\n", - "# Data cleanup \n", + "# Data cleanup\n", "# Specify columns to check for missing values\n", - "columns_to_check = ['Title', 'Author', 'ISBN', 'My Rating', 'Average Rating', 'Number of Pages', 'Original Publication Year', 'Date Read']\n", - "df_cleaned = df.dropna(subset=columns_to_check)\n" + "columns_to_check = [\n", + " \"Title\",\n", + " \"Author\",\n", + " \"ISBN\",\n", + " \"My Rating\",\n", + " \"Average Rating\",\n", + " \"Number of Pages\",\n", + " \"Original Publication Year\",\n", + " \"Date Read\",\n", + "]\n", + "df_cleaned = df.dropna(subset=columns_to_check)" ] }, { @@ -39,7 +48,7 @@ "metadata": {}, "outputs": [], "source": [ - "# Specifiy the prompt here\n", + "# Specify the prompt here\n", "user_question = \"\"\"\n", "Create a dashboard with 3 pages, one for each chart. \n", "\n", From 174202be31bcef4f597a8b76d2439eac21359c4a Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 16 Jan 2025 13:36:47 +0000 Subject: [PATCH 25/44] Update project-tutorial.md --- .../docs/pages/tutorials/project-tutorial.md | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index 7afc62c0b..2cabed77f 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -4,7 +4,7 @@ This tutorial uses Vizro-AI to build a prototype dashboard with three charts tha ## Project explanation -The dataset for this project was a set of books data [exported from a personal Goodreads account](https://www.goodreads.com/review/import), which is provided with the project so you can run it. The dataset used can be downloaded from the [Vizro repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv). \If you use Goodreads, you can export your own data in CSV format, substitute it for the dataset provided, and explore it with the code for this project. +The dataset for this project was a set of books data [exported from a personal Goodreads account](https://www.goodreads.com/review/import), which is provided with the project so you can run it. The dataset used can be downloaded from the [Vizro repository](https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/filtered_books.csv). If you use Goodreads, you can export your own data in CSV format, substitute it for the dataset provided, and explore it with the code for this project. The dataset was filtered to retain only books with an ISBN, which can be used with [Google Books API](https://developers.google.com/books) to retrieve additional data about a book. The Books API wasn't used in this project, but by including ISBN data, there is scope to extend the prototype project in future. @@ -192,15 +192,15 @@ The plot this code returns looks as follows: ![](../../assets/tutorials/project/ At this point, we have prototypes for three plotly charts for the Goodreads data. To display these as an interactive dashboard, we need some additional code and Vizro-AI can generate this for us, but not through the application hosted on PyCafe at the time of writing. We'll use a Jupyter Notebook instead. -Before running the Notebook code, [set up Vizro-AI](https://vizro.readthedocs.io/projects/vizro-ai/en/latest/pages/user-guides/install/) inside a virtual environment with Python 3.10 or later. Install the package with `pip install vizro_ai`. +Before running the Notebook code, [set up Vizro-AI](../user-guides/install.md) inside a virtual environment with Python 3.10 or later. Install the package with `pip install vizro_ai`. -You need to give Vizro-AI your API key to access OpenAI by adding it to your environment so the code you write in the next step can access it to successfully call OpenAI. There are some [straightforward instructions in the OpenAI docs](https://platform.openai.com/docs/quickstart/step-2-set-up-your-api-key), and the process is also covered in the our [LLM setup guide](https://vizro.readthedocs.io/projects/vizro-ai/en/latest/pages/user-guides/install/#set-up-access-to-a-large-language-model). +You need to give Vizro-AI your API key to access OpenAI by adding it to your environment so the code you write in the next step can access it to successfully call OpenAI. There are some [straightforward instructions in the OpenAI docs](https://platform.openai.com/docs/quickstart/step-2-set-up-your-api-key), and the process is also covered in the our [LLM setup guide](../user-guides/install.md#set-up-access-to-a-large-language-model). ### Build a dashboard Now we can open a Jupyter Notebook to make the dashboard. We'll submit a single prompt that combines the three prompts listed above, with some small edits to ask for a dashboard that has three pages: one for each chart. -The following shows the code to make the request to Vizro-AI to build and display the dashboard. The Notebook is available for download from [Vizro's GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv): +The following shows the code to make the request to Vizro-AI to build and display the dashboard. The Notebook is available for download from [Vizro's GitHub repository](https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb): ??? example "Click to expand" === "Generated by Vizro-AI" @@ -228,7 +228,7 @@ The following shows the code to make the request to Vizro-AI to build and displa Using `gpt-4-turbo`, Vizro-AI generates a set of plotly chart code and the necessary Vizro support code to build a dashboard. The generated code is displayed as output in the Notebook with the dashboard, although the dashboard is better viewed at `http://localhost:8006/`. -You can see the code output in the [Notebook stored on the Vizro GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/goodreads.ipynb), or generate similar output by running it yourself, although it will not necessarily be identical because of the variability of restuls returned from generative AI. +You can see the code output in the [Notebook stored on the Vizro GitHub repository](https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb), or generate similar output by running it yourself, although it will not necessarily be identical because of the variability of restuls returned from generative AI. The charts generated were similar to those created by the PyCafe host above, although the first chart was improved by spacing the books proportionate to the date read and the hover text included the book title as well as the date read, without an explicit request to do so. @@ -279,7 +279,7 @@ There are three changes to the Notebook code needed for it to run on PyCafe: 1. Add `from vizro import Vizro` to the imports list 1. Add `Vizro().build(model).run()` at the end of the code block 1. Uncomment the data manager code and replace it with code needed to access the dataset: - - either download the dataset from the [Vizro GitHub repository](https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv)\ and upload it to the PyCafe project. + - either download the dataset from the [Vizro GitHub repository](https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/filtered_books.csv) and upload it to the PyCafe project. - or use the code added to the snippet below to read the dataset directly from online storage. Follow the link at the bottom of the code snippet titled **☕️ Run and edit this code in PyCafe** to use and edit the dashboard. @@ -390,9 +390,8 @@ Follow the link at the bottom of the code snippet titled **☕️ Run and edit t ########### Read data ############ # Define the URL of the raw CSV file - # TO DO -- This will change when data is uploaded to Vizro repo import requests - url = "https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv" + url = "https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/filtered_books.csv" # Fetch the CSV file response = requests.get(url) @@ -598,9 +597,8 @@ Follow the link at the bottom of the code snippet titled **☕️ Run and edit t ########### Read data ############ # Define the URL of the raw CSV file - # TO DO -- This will change when data is uploaded to Vizro repo import requests - url = "https://raw.githubusercontent.com/stichbury/vizro_projects/refs/heads/main/goodreads_project/filtered_books.csv" + url = "https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/filtered_books.csv" # Fetch the CSV file response = requests.get(url) From 5ea2d7e039850b48777fca30a6878f61023c757a Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 16 Jan 2025 13:44:26 +0000 Subject: [PATCH 26/44] Update .pre-commit-config.yaml --- .pre-commit-config.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ada17ac1c..96827dae2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -18,6 +18,7 @@ repos: - id: codespell additional_dependencies: - tomli + exclude_types: [csv] - repo: local hooks: @@ -28,7 +29,7 @@ repos: language: node types: [text] additional_dependencies: ["prettier@3.3.3"] - exclude_types: [markdown, csv] + exclude_types: [markdown] - repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks rev: v2.14.0 From 5291fdb27744d1091b27e263c3e7fbd6fd6e3cd4 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 16 Jan 2025 17:28:26 +0000 Subject: [PATCH 27/44] Update for control --- .../docs/pages/tutorials/project-tutorial.md | 19 +- .../goodreads_tutorial/goodreads.ipynb | 359 +++++------------- 2 files changed, 105 insertions(+), 273 deletions(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index 2cabed77f..4554a0556 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -228,12 +228,6 @@ The following shows the code to make the request to Vizro-AI to build and displa Using `gpt-4-turbo`, Vizro-AI generates a set of plotly chart code and the necessary Vizro support code to build a dashboard. The generated code is displayed as output in the Notebook with the dashboard, although the dashboard is better viewed at `http://localhost:8006/`. -You can see the code output in the [Notebook stored on the Vizro GitHub repository](https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb), or generate similar output by running it yourself, although it will not necessarily be identical because of the variability of restuls returned from generative AI. - -The charts generated were similar to those created by the PyCafe host above, although the first chart was improved by spacing the books proportionate to the date read and the hover text included the book title as well as the date read, without an explicit request to do so. - -![](../../assets/tutorials/project/chart1v2.png) - ### Add dashboard interactivity To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the code for a control. As a simple example, we can extend the prompt to ask for a filter to modify the time period displayed. @@ -247,8 +241,8 @@ To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the co On the first page, plot a chart with the title "Sequence of reading" . It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. - + Add a filter so the user can adjust the range of dates by year on the x axis. - + + Add a date picker filter so the user can adjust the range of dates for the Date Read on the x axis. + On the second page, plot a chart with the title "Pages and Book totals" . It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. @@ -256,7 +250,7 @@ To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the co Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. - + Add a filter so the user can adjust the range of dates by year on the x axis. + + Add a date picker filter so the user can adjust the range of dates for the Date Read on the x axis. On the third page, for each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book. Use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. @@ -264,6 +258,13 @@ To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the co ``` +### Get the Notebook +You can see the code output in the [Notebook stored on the Vizro GitHub repository](https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb), and generate similar output by running it yourself, although it will not necessarily be identical because of the variability of restuls returned from generative AI. + +The charts generated were similar to those created by the PyCafe host above, although the first chart was improved by spacing the books proportionate to the date read and the hover text included the book title as well as the date read, without an explicit request to do so. + +![](../../assets/tutorials/project/chart1v2.png) + ## Interactive Vizro dashboards on PyCafe Now we have a Notebook with code to call Vizro-AI to build a prototype Vizro dashboard with a set of three pages and three charts, plus a control to filter the view. diff --git a/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb b/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb index 969efea35..8d77f518b 100644 --- a/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb +++ b/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb @@ -50,18 +50,21 @@ "source": [ "# Specify the prompt here\n", "user_question = \"\"\"\n", - "Create a dashboard with 3 pages, one for each chart. \n", + "Create a dashboard with 3 pages, one for each chart.\n", "\n", - "On the first page, plot a chart with the title \"Sequence of reading\" . \n", + "On the first page, plot a chart with the title \"Sequence of reading\" .\n", "It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1.\n", - "Add a filter so the user can adjust the range of dates by year on the x axis.\n", "\n", - "On the second page, plot a chart with the title \"Pages and Book totals\" . \n", - "It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. \n", + "Add a date picker filter so the user can adjust the range of dates for the Date Read on the x axis.\n", + "\n", + "On the second page, plot a chart with the title \"Pages and Book totals\" .\n", + "It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data.\n", "Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart.\n", - "Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column. \n", - "Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. \n", - "Add a filter so the user can adjust the range of dates by year on the x axis.\n", + "Superimpose a bar chart showing the total books read for each year, taking data from the Date Read column.\n", + "\n", + "Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side.\n", + "\n", + "Add a date picker filter so the user can adjust the range of dates for the Date Read on the x axis.\n", "\n", "On the third page, for each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book.\n", "Use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0.\n", @@ -77,7 +80,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "72dc4d9d9a6748d4b651dc76197bc8b5", + "model_id": "6305989192314eda92689d52ba554f23", "version_major": 2, "version_minor": 0 }, @@ -98,7 +101,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "67e5561620f4492b8557bf061d889223", + "model_id": "93da13f7dbaa47df80d68a1995bc5e94", "version_major": 2, "version_minor": 0 }, @@ -112,12 +115,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e08ef3dd117d4d6e8294677745c3f730", + "model_id": "1f986ae0199a40c19dd17e8e33789df3", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Building page: Rating Comparison: 0%| | 0/5 [00:00 components: 0%| | 0/1 [00:00 components: 0%| | 0/1 [00:00 components: 0%| | 0/1 [00:00 components: 0%| | 0/1 [00:00. Definition will not be included.\n", - "WARNING:root:Could not extract source for . Definition will not be included.\n", - "WARNING:root:Could not extract source for . Definition will not be included.\n" + "WARNING:root:Could not extract source for . Definition will not be included.\n", + "WARNING:root:Could not extract source for . Definition will not be included.\n", + "WARNING:root:Could not extract source for . Definition will not be included.\n" ] }, { @@ -309,7 +312,7 @@ " " ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -329,7 +332,7 @@ "\n", "####### Function definitions ######\n", "@capture(\"graph\")\n", - "def sequence_reading(data_frame):\n", + "def sequence_chart(data_frame):\n", " fig = go.Figure()\n", " fig.add_trace(\n", " go.Scatter(\n", @@ -337,69 +340,28 @@ " y=[1] * len(data_frame),\n", " mode=\"markers\",\n", " marker=dict(size=10, color=\"blue\"),\n", + " text=data_frame[\"Title\"],\n", " )\n", " )\n", " fig.update_layout(\n", - " title=\"Sequence of reading\",\n", + " title=\"Sequence of Books Read Over Time\",\n", " xaxis_title=\"Date Read\",\n", " yaxis_title=\"Sequence\",\n", - " yaxis=dict(showticklabels=False, showgrid=False),\n", - " xaxis=dict(tickangle=-45),\n", + " yaxis=dict(showticklabels=False),\n", " )\n", " return fig\n", "\n", "\n", "@capture(\"graph\")\n", - "def pages_books_totals(data_frame):\n", - " # Prepare data\n", - " data_frame[\"Date Read\"] = pd.to_datetime(data_frame[\"Date Read\"])\n", - " data_frame.sort_values(\"Date Read\", inplace=True)\n", - " data_frame[\"Cumulative Pages\"] = data_frame[\"Number of Pages\"].cumsum()\n", - "\n", - " # Aggregate data by year for total books read\n", - " yearly_books = data_frame.groupby(data_frame[\"Date Read\"].dt.year).size()\n", - "\n", - " # Create figure with secondary y-axis\n", - " fig = go.Figure()\n", - "\n", - " # Add line for cumulative pages\n", - " fig.add_trace(\n", - " go.Scatter(\n", - " x=data_frame[\"Date Read\"],\n", - " y=data_frame[\"Cumulative Pages\"],\n", - " mode=\"lines\",\n", - " name=\"Cumulative Pages Read\",\n", - " )\n", - " )\n", - "\n", - " # Add bars for books read per year\n", - " fig.add_trace(\n", - " go.Bar(\n", - " x=yearly_books.index, y=yearly_books, name=\"Books Read per Year\", yaxis=\"y2\"\n", - " )\n", - " )\n", - "\n", - " # Set up the layout\n", - " fig.update_layout(\n", - " title=\"Cumulative Pages Read and Books Read per Year\",\n", - " xaxis_title=\"Date\",\n", - " yaxis=dict(title=\"Number of Pages\"),\n", - " yaxis2=dict(title=\"Total Books\", overlaying=\"y\", side=\"right\"),\n", - " )\n", - "\n", - " return fig\n", - "\n", - "\n", - "@capture(\"graph\")\n", - "def rating_comparison(data_frame):\n", + "def rating_comparison_chart(data_frame):\n", " # Filter out rows where 'My Rating' is 0\n", - " df = data_frame[data_frame[\"My Rating\"] != 0]\n", + " df_filtered = data_frame[data_frame[\"My Rating\"] != 0]\n", "\n", - " # Create a figure\n", + " # Create the dumbbell chart\n", " fig = go.Figure()\n", "\n", - " # Add dumbbell traces\n", - " for index, row in df.iterrows():\n", + " # Add traces for each book\n", + " for index, row in df_filtered.iterrows():\n", " fig.add_trace(\n", " go.Scatter(\n", " x=[row[\"My Rating\"], row[\"Average Rating\"]],\n", @@ -407,16 +369,52 @@ " mode=\"markers+lines\",\n", " name=row[\"Title\"],\n", " marker=dict(size=10),\n", - " line=dict(width=2),\n", " )\n", " )\n", "\n", " # Update layout\n", " fig.update_layout(\n", - " title=\"Comparison of My Rating vs Average Rating\",\n", + " title=\"Comparison of My Rating vs Average Rating for Each Book\",\n", " xaxis_title=\"Rating\",\n", " yaxis_title=\"Book Title\",\n", - " showlegend=False,\n", + " yaxis={\"categoryorder\": \"total ascending\"},\n", + " )\n", + "\n", + " return fig\n", + "\n", + "\n", + "@capture(\"graph\")\n", + "def pages_books_chart(data_frame):\n", + " # Prepare data\n", + " data_frame[\"Date Read\"] = pd.to_datetime(data_frame[\"Date Read\"])\n", + " data_frame[\"Year\"] = data_frame[\"Date Read\"].dt.year\n", + " yearly_pages = data_frame.groupby(\"Year\")[\"Number of Pages\"].sum().cumsum()\n", + " yearly_books = data_frame.groupby(\"Year\").size()\n", + "\n", + " # Create figure with secondary y-axis\n", + " fig = go.Figure()\n", + "\n", + " # Add line for cumulative pages\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=yearly_pages.index,\n", + " y=yearly_pages,\n", + " name=\"Cumulative Pages\",\n", + " mode=\"lines+markers\",\n", + " )\n", + " )\n", + "\n", + " # Add bars for books read\n", + " fig.add_trace(\n", + " go.Bar(x=yearly_books.index, y=yearly_books, name=\"Books Read\", yaxis=\"y2\")\n", + " )\n", + "\n", + " # Layout adjustments\n", + " fig.update_layout(\n", + " title=\"Cumulative Pages Read and Books Read per Year\",\n", + " xaxis_title=\"Year\",\n", + " yaxis_title=\"Total Pages Read\",\n", + " yaxis2=dict(title=\"Total Books Read\", overlaying=\"y\", side=\"right\"),\n", " )\n", "\n", " return fig\n", @@ -434,42 +432,44 @@ " vm.Page(\n", " components=[\n", " vm.Graph(\n", - " id=\"sequence_reading\",\n", - " figure=sequence_reading(data_frame=\"book_reading_data\"),\n", + " id=\"sequence_chart\",\n", + " figure=sequence_chart(data_frame=\"book_reading_data\"),\n", " )\n", " ],\n", " title=\"Sequence of Reading\",\n", " layout=vm.Layout(grid=[[0]]),\n", " controls=[\n", " vm.Filter(\n", - " column=\"Year Published\",\n", - " targets=[\"sequence_reading\"],\n", - " selector=vm.RangeSlider(type=\"range_slider\"),\n", + " type=\"filter\",\n", + " column=\"Date Read\",\n", + " targets=[\"sequence_chart\"],\n", + " selector=vm.DatePicker(type=\"date_picker\", range=True),\n", " )\n", " ],\n", " ),\n", " vm.Page(\n", " components=[\n", " vm.Graph(\n", - " id=\"pages_books_totals\",\n", - " figure=pages_books_totals(data_frame=\"book_reading_data\"),\n", + " id=\"pages_books_chart\",\n", + " figure=pages_books_chart(data_frame=\"book_reading_data\"),\n", " )\n", " ],\n", " title=\"Pages and Book Totals\",\n", " layout=vm.Layout(grid=[[0]]),\n", " controls=[\n", " vm.Filter(\n", - " column=\"Year Published\",\n", - " targets=[\"pages_books_totals\"],\n", - " selector=vm.RangeSlider(type=\"range_slider\"),\n", + " type=\"filter\",\n", + " column=\"Date Read\",\n", + " targets=[\"pages_books_chart\"],\n", + " selector=vm.DatePicker(type=\"date_picker\", range=True),\n", " )\n", " ],\n", " ),\n", " vm.Page(\n", " components=[\n", " vm.Graph(\n", - " id=\"rating_comparison\",\n", - " figure=rating_comparison(data_frame=\"book_reading_data\"),\n", + " id=\"rating_comparison_chart\",\n", + " figure=rating_comparison_chart(data_frame=\"book_reading_data\"),\n", " )\n", " ],\n", " title=\"Rating Comparison\",\n", @@ -481,175 +481,6 @@ ")\n", "\n" ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "ERROR:__main__:Exception on /_dash-update-component [POST]\n", - "Traceback (most recent call last):\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/flask/app.py\", line 1473, in wsgi_app\n", - " response = self.full_dispatch_request()\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/flask/app.py\", line 882, in full_dispatch_request\n", - " rv = self.handle_user_exception(e)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/flask/app.py\", line 880, in full_dispatch_request\n", - " rv = self.dispatch_request()\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/flask/app.py\", line 865, in dispatch_request\n", - " return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return]\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/dash/dash.py\", line 1376, in dispatch\n", - " ctx.run(\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/dash/_callback.py\", line 507, in add_context\n", - " raise err\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/dash/_callback.py\", line 496, in add_context\n", - " output_value = _invoke_callback(func, *func_args, **func_kwargs)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/dash/_callback.py\", line 43, in _invoke_callback\n", - " return func(*args, **kwargs) # %% callback invoked %%\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/models/_action/_action.py\", line 181, in callback_wrapper\n", - " return_value = self._action_callback_function(inputs=external, outputs=callback_outputs.get(\"external\"))\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/models/_action/_action.py\", line 110, in _action_callback_function\n", - " return_value = self.function(**inputs)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/models/types.py\", line 153, in __call__\n", - " return self.__function(**{**self.__bound_arguments, **kwargs})\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/actions/_on_page_load_action.py\", line 25, in _on_page_load\n", - " return _get_modified_page_figures(\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/actions/_actions_utils.py\", line 278, in _get_modified_page_figures\n", - " filtered_data = _apply_filters(unfiltered_data, ctds_filter, ctds_filter_interaction, target)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/actions/_actions_utils.py\", line 224, in _apply_filters\n", - " filtered_data = _apply_filter_controls(data_frame=data, ctds_filter=ctds_filter, target=target)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/actions/_actions_utils.py\", line 79, in _apply_filter_controls\n", - " data_frame = data_frame[_filter_function(data_frame[_filter_column], _filter_value)]\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/models/_controls/filter.py\", line 62, in _filter_between\n", - " return series.between(value[0], value[1], inclusive=\"both\")\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/series.py\", line 5638, in between\n", - " lmask = self >= left\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/ops/common.py\", line 76, in new_method\n", - " return method(self, other)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/arraylike.py\", line 60, in __ge__\n", - " return self._cmp_method(other, operator.ge)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/series.py\", line 6119, in _cmp_method\n", - " res_values = ops.comparison_op(lvalues, rvalues, op)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/ops/array_ops.py\", line 341, in comparison_op\n", - " return invalid_comparison(lvalues, rvalues, op)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/ops/invalid.py\", line 40, in invalid_comparison\n", - " raise TypeError(f\"Invalid comparison between dtype={left.dtype} and {typ}\")\n", - "TypeError: Invalid comparison between dtype=int64 and str\n", - "ERROR:__main__:Exception on /_dash-update-component [POST]\n", - "Traceback (most recent call last):\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/flask/app.py\", line 1473, in wsgi_app\n", - " response = self.full_dispatch_request()\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/flask/app.py\", line 882, in full_dispatch_request\n", - " rv = self.handle_user_exception(e)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/flask/app.py\", line 880, in full_dispatch_request\n", - " rv = self.dispatch_request()\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/flask/app.py\", line 865, in dispatch_request\n", - " return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return]\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/dash/dash.py\", line 1376, in dispatch\n", - " ctx.run(\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/dash/_callback.py\", line 507, in add_context\n", - " raise err\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/dash/_callback.py\", line 496, in add_context\n", - " output_value = _invoke_callback(func, *func_args, **func_kwargs)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/dash/_callback.py\", line 43, in _invoke_callback\n", - " return func(*args, **kwargs) # %% callback invoked %%\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/models/_action/_action.py\", line 181, in callback_wrapper\n", - " return_value = self._action_callback_function(inputs=external, outputs=callback_outputs.get(\"external\"))\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/models/_action/_action.py\", line 110, in _action_callback_function\n", - " return_value = self.function(**inputs)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/models/types.py\", line 153, in __call__\n", - " return self.__function(**{**self.__bound_arguments, **kwargs})\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/actions/_on_page_load_action.py\", line 25, in _on_page_load\n", - " return _get_modified_page_figures(\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/actions/_actions_utils.py\", line 278, in _get_modified_page_figures\n", - " filtered_data = _apply_filters(unfiltered_data, ctds_filter, ctds_filter_interaction, target)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/actions/_actions_utils.py\", line 224, in _apply_filters\n", - " filtered_data = _apply_filter_controls(data_frame=data, ctds_filter=ctds_filter, target=target)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/actions/_actions_utils.py\", line 79, in _apply_filter_controls\n", - " data_frame = data_frame[_filter_function(data_frame[_filter_column], _filter_value)]\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/vizro/models/_controls/filter.py\", line 62, in _filter_between\n", - " return series.between(value[0], value[1], inclusive=\"both\")\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/series.py\", line 5638, in between\n", - " lmask = self >= left\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/ops/common.py\", line 76, in new_method\n", - " return method(self, other)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/arraylike.py\", line 60, in __ge__\n", - " return self._cmp_method(other, operator.ge)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/series.py\", line 6119, in _cmp_method\n", - " res_values = ops.comparison_op(lvalues, rvalues, op)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/ops/array_ops.py\", line 341, in comparison_op\n", - " return invalid_comparison(lvalues, rvalues, op)\n", - " File \"/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pandas/core/ops/invalid.py\", line 40, in invalid_comparison\n", - " raise TypeError(f\"Invalid comparison between dtype={left.dtype} and {typ}\")\n", - "TypeError: Invalid comparison between dtype=int64 and str\n", - ":9: SettingWithCopyWarning:\n", - "\n", - "\n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - "\n", - ":10: SettingWithCopyWarning:\n", - "\n", - "\n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - "\n", - ":11: SettingWithCopyWarning:\n", - "\n", - "\n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - "\n", - ":9: SettingWithCopyWarning:\n", - "\n", - "\n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - "\n", - ":10: SettingWithCopyWarning:\n", - "\n", - "\n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - "\n", - ":11: SettingWithCopyWarning:\n", - "\n", - "\n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - "\n", - ":9: SettingWithCopyWarning:\n", - "\n", - "\n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - "\n", - ":10: SettingWithCopyWarning:\n", - "\n", - "\n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - "\n", - ":11: SettingWithCopyWarning:\n", - "\n", - "\n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - "\n" - ] } ], "source": [ From 8776cfc76580ac7e719c32f4c44d2162d278aaee Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 16 Jan 2025 17:29:06 +0000 Subject: [PATCH 28/44] Update project-tutorial.md --- vizro-ai/docs/pages/tutorials/project-tutorial.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index 4554a0556..d67220c5d 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -242,7 +242,7 @@ To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the co It is a scatter chart. Use the x axis to show the date a book was read. Plot it at y=1. + Add a date picker filter so the user can adjust the range of dates for the Date Read on the x axis. - + On the second page, plot a chart with the title "Pages and Book totals" . It shows the cumulative total number of pages read by summing the Number of Pages of each book read in each year, using the Date Read data. Plot date on the x axis and the number of pages on the y axis using a scale on the left hand side of the chart. @@ -259,6 +259,7 @@ To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the co ``` ### Get the Notebook + You can see the code output in the [Notebook stored on the Vizro GitHub repository](https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb), and generate similar output by running it yourself, although it will not necessarily be identical because of the variability of restuls returned from generative AI. The charts generated were similar to those created by the PyCafe host above, although the first chart was improved by spacing the books proportionate to the date read and the hover text included the book title as well as the date read, without an explicit request to do so. From 5278e3362667568f92445c1f089cde771a1d6f8b Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 16 Jan 2025 17:57:07 +0000 Subject: [PATCH 29/44] Update the controls --- .../docs/pages/tutorials/project-tutorial.md | 34 ++-- .../goodreads_tutorial/goodreads.ipynb | 174 ++++++++---------- 2 files changed, 92 insertions(+), 116 deletions(-) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/project-tutorial.md index d67220c5d..1fbeebece 100644 --- a/vizro-ai/docs/pages/tutorials/project-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/project-tutorial.md @@ -230,7 +230,7 @@ Using `gpt-4-turbo`, Vizro-AI generates a set of plotly chart code and the neces ### Add dashboard interactivity -To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the code for a control. As a simple example, we can extend the prompt to ask for a filter to modify the time period displayed. +To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the code for a control. As a simple example, we can extend the prompt to ask for a date picker control to modify the time period displayed for the `Date Read` column and change the scale on the x axis of the first chart. ??? example "Click to expand" === "Extend the prompt to add a control" @@ -250,8 +250,6 @@ To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the co Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side. - + Add a date picker filter so the user can adjust the range of dates for the Date Read on the x axis. - On the third page, for each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book. Use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0. """ @@ -406,7 +404,7 @@ Follow the link at the bottom of the code snippet titled **☕️ Run and edit t df["Date Read"] = pd.to_datetime(df['Date Read'],dayfirst=True) - ########### Model code ############ + ########### Model code ############ model = vm.Dashboard( pages=[ vm.Page( @@ -420,9 +418,10 @@ Follow the link at the bottom of the code snippet titled **☕️ Run and edit t layout=vm.Layout(grid=[[0]]), controls=[ vm.Filter( - column="Year Published", + type="filter", + column="Date Read", targets=["sequence_reading"], - selector=vm.RangeSlider(type="range_slider"), + selector=vm.DatePicker(type="date_picker", range=True), ) ], ), @@ -435,13 +434,7 @@ Follow the link at the bottom of the code snippet titled **☕️ Run and edit t ], title="Pages and Book Totals", layout=vm.Layout(grid=[[0]]), - controls=[ - vm.Filter( - column="Year Published", - targets=["pages_books_totals"], - selector=vm.RangeSlider(type="range_slider"), - ) - ], + controls=[], ), vm.Page( components=[ @@ -473,7 +466,7 @@ The code generated by Vizro-AI does not make a perfect dashboard, but it has bee ### Improvements to generated Plotly code -In this version of the dashboard, the first chart that show the sequence of books read has been modified to improve the information supplied when hovering over a point, and the opacity of the points has been altered to make it more attractive. +In this version of the dashboard, the first chart that show the sequence of books read has been modified to improve the information supplied when hovering over a point, and the opacity of the points has been altered to make it more attractive. The control has been changed to a slider for the `Date Read` field. In the second chart that shows the cumulative total of pages and books read, the line chart has been explicitly plotted on top of the bar chart. @@ -611,7 +604,8 @@ Follow the link at the bottom of the code snippet titled **☕️ Run and edit t csv_data = StringIO(response.text) df = pd.read_csv(csv_data) df["Date Read"] = pd.to_datetime(df['Date Read'],dayfirst=True) - + # Extract the year from each Date Read and create a new column 'Year Read' + df['Year Read'] = df['Date Read'].dt.year ########### Model code ############ model = vm.Dashboard( @@ -627,7 +621,7 @@ Follow the link at the bottom of the code snippet titled **☕️ Run and edit t layout=vm.Layout(grid=[[0]]), controls=[ vm.Filter( - column="Year Published", + column="Year Read", targets=["sequence_reading"], selector=vm.RangeSlider(type="range_slider"), ) @@ -642,13 +636,7 @@ Follow the link at the bottom of the code snippet titled **☕️ Run and edit t ], title="Pages and Book Totals", layout=vm.Layout(grid=[[0]]), - controls=[ - vm.Filter( - column="Year Published", - targets=["pages_books_totals"], - selector=vm.RangeSlider(type="range_slider"), - ) - ], + controls=[], ), vm.Page( components=[ diff --git a/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb b/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb index 8d77f518b..b4cb036a3 100644 --- a/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb +++ b/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb @@ -64,8 +64,6 @@ "\n", "Show the total books read using the right hand side of the chart which can be a different scale to the y axis shown on the left hand side.\n", "\n", - "Add a date picker filter so the user can adjust the range of dates for the Date Read on the x axis.\n", - "\n", "On the third page, for each row, create a dumbbell chart to show the difference between My Rating and Average Rating for each book.\n", "Use shapes to add the horizontal lines between markers. Omit the legend. Don't show any row where My Rating is 0.\n", "\"\"\"" @@ -80,7 +78,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "6305989192314eda92689d52ba554f23", + "model_id": "6e9ee132cfb34f2580a909f391ad60dd", "version_major": 2, "version_minor": 0 }, @@ -101,7 +99,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "93da13f7dbaa47df80d68a1995bc5e94", + "model_id": "6695c7d33ed94a76b099df1b3a9e4d9b", "version_major": 2, "version_minor": 0 }, @@ -115,12 +113,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "1f986ae0199a40c19dd17e8e33789df3", + "model_id": "fc86ba573acc474abd167410a975f5ca", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Building page: Sequence of Reading: 0%| | 0/5 [00:00 components: 0%| | 0/1 [00:00 components: 0%| | 0/1 [00:00 components: 0%| | 0/1 [00:00 components: 0%| | 0/1 [00:00 components: 0%| | 0/1 [00:00 components: 0%| | 0/1 [00:00 controls: 0it [00:00, ?it/s]" + "Currently Building ... [Page] controls: 0it [00:00, ?it/s]" ] }, "metadata": {}, @@ -273,12 +271,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e48cfbe18cd74971801554df65947e13", + "model_id": "3d9567ab8ad6439885f9387bf0f7ebfe", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "Currently Building ... [Page] controls: 0%| | 0/1 [00:00 controls: 0it [00:00, ?it/s]" ] }, "metadata": {}, @@ -288,13 +286,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "/Users/jo_stichbury/Documents/GitHub/vizro/vizro-core/vizro/lib/python3.10/site-packages/pydantic/v1/schema.py:631: UserWarning:\n", - "\n", - "CapturedCallable function is excluded from the schema.\n", - "\n", - "WARNING:root:Could not extract source for . Definition will not be included.\n", - "WARNING:root:Could not extract source for . Definition will not be included.\n", - "WARNING:root:Could not extract source for . Definition will not be included.\n" + "WARNING:root:Could not extract source for . Definition will not be included.\n", + "WARNING:root:Could not extract source for . Definition will not be included.\n", + "WARNING:root:Could not extract source for . Definition will not be included.\n" ] }, { @@ -312,7 +306,7 @@ " " ], "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -332,89 +326,90 @@ "\n", "####### Function definitions ######\n", "@capture(\"graph\")\n", - "def sequence_chart(data_frame):\n", - " fig = go.Figure()\n", - " fig.add_trace(\n", - " go.Scatter(\n", - " x=data_frame[\"Date Read\"],\n", - " y=[1] * len(data_frame),\n", - " mode=\"markers\",\n", - " marker=dict(size=10, color=\"blue\"),\n", - " text=data_frame[\"Title\"],\n", - " )\n", - " )\n", - " fig.update_layout(\n", - " title=\"Sequence of Books Read Over Time\",\n", - " xaxis_title=\"Date Read\",\n", - " yaxis_title=\"Sequence\",\n", - " yaxis=dict(showticklabels=False),\n", - " )\n", - " return fig\n", - "\n", - "\n", - "@capture(\"graph\")\n", - "def rating_comparison_chart(data_frame):\n", + "def rating_comparison(data_frame):\n", " # Filter out rows where 'My Rating' is 0\n", " df_filtered = data_frame[data_frame[\"My Rating\"] != 0]\n", "\n", - " # Create the dumbbell chart\n", + " # Create a figure\n", " fig = go.Figure()\n", "\n", - " # Add traces for each book\n", + " # Add traces for 'My Rating' and 'Average Rating'\n", " for index, row in df_filtered.iterrows():\n", " fig.add_trace(\n", " go.Scatter(\n", " x=[row[\"My Rating\"], row[\"Average Rating\"]],\n", " y=[row[\"Title\"], row[\"Title\"]],\n", - " mode=\"markers+lines\",\n", - " name=row[\"Title\"],\n", + " mode=\"lines+markers\",\n", + " name=\"\",\n", " marker=dict(size=10),\n", + " line=dict(color=\"gray\", width=2),\n", " )\n", " )\n", "\n", - " # Update layout\n", + " # Update layout to hide the legend\n", + " fig.update_layout(showlegend=False)\n", + "\n", + " return fig\n", + "\n", + "\n", + "@capture(\"graph\")\n", + "def sequence_reading(data_frame):\n", + " # Sorting data by 'Date Read'\n", + " sorted_df = data_frame.sort_values(\"Date Read\")\n", + " # Creating a scatter plot\n", + " fig = go.Figure()\n", + " fig.add_trace(\n", + " go.Scatter(\n", + " x=sorted_df[\"Date Read\"],\n", + " y=[1] * len(sorted_df),\n", + " mode=\"markers\",\n", + " marker=dict(color=\"blue\", size=10),\n", + " name=\"Books Read\",\n", + " )\n", + " )\n", " fig.update_layout(\n", - " title=\"Comparison of My Rating vs Average Rating for Each Book\",\n", - " xaxis_title=\"Rating\",\n", - " yaxis_title=\"Book Title\",\n", - " yaxis={\"categoryorder\": \"total ascending\"},\n", + " title=\"Sequence of Books Read Over Time\",\n", + " xaxis_title=\"Date Read\",\n", + " yaxis_title=\"Sequence\",\n", + " yaxis=dict(showticklabels=False),\n", " )\n", - "\n", " return fig\n", "\n", "\n", "@capture(\"graph\")\n", - "def pages_books_chart(data_frame):\n", + "def pages_books_totals(data_frame):\n", " # Prepare data\n", " data_frame[\"Date Read\"] = pd.to_datetime(data_frame[\"Date Read\"])\n", - " data_frame[\"Year\"] = data_frame[\"Date Read\"].dt.year\n", - " yearly_pages = data_frame.groupby(\"Year\")[\"Number of Pages\"].sum().cumsum()\n", - " yearly_books = data_frame.groupby(\"Year\").size()\n", + " data_frame.sort_values(\"Date Read\", inplace=True)\n", + " data_frame[\"Cumulative Pages\"] = data_frame[\"Number of Pages\"].cumsum()\n", + " yearly_books = data_frame.groupby(data_frame[\"Date Read\"].dt.year).size()\n", "\n", - " # Create figure with secondary y-axis\n", + " # Create figure\n", " fig = go.Figure()\n", "\n", - " # Add line for cumulative pages\n", + " # Add cumulative pages line\n", " fig.add_trace(\n", " go.Scatter(\n", - " x=yearly_pages.index,\n", - " y=yearly_pages,\n", - " name=\"Cumulative Pages\",\n", - " mode=\"lines+markers\",\n", + " x=data_frame[\"Date Read\"],\n", + " y=data_frame[\"Cumulative Pages\"],\n", + " mode=\"lines\",\n", + " name=\"Cumulative Pages Read\",\n", " )\n", " )\n", "\n", - " # Add bars for books read\n", + " # Add books read per year bar\n", " fig.add_trace(\n", - " go.Bar(x=yearly_books.index, y=yearly_books, name=\"Books Read\", yaxis=\"y2\")\n", + " go.Bar(\n", + " x=yearly_books.index, y=yearly_books, name=\"Books Read per Year\", yaxis=\"y2\"\n", + " )\n", " )\n", "\n", " # Layout adjustments\n", " fig.update_layout(\n", " title=\"Cumulative Pages Read and Books Read per Year\",\n", - " xaxis_title=\"Year\",\n", + " xaxis_title=\"Date Read\",\n", " yaxis_title=\"Total Pages Read\",\n", - " yaxis2=dict(title=\"Total Books Read\", overlaying=\"y\", side=\"right\"),\n", + " yaxis2=dict(title=\"Books Read per Year\", overlaying=\"y\", side=\"right\"),\n", " )\n", "\n", " return fig\n", @@ -432,8 +427,8 @@ " vm.Page(\n", " components=[\n", " vm.Graph(\n", - " id=\"sequence_chart\",\n", - " figure=sequence_chart(data_frame=\"book_reading_data\"),\n", + " id=\"sequence_reading\",\n", + " figure=sequence_reading(data_frame=\"book_reading_data\"),\n", " )\n", " ],\n", " title=\"Sequence of Reading\",\n", @@ -442,7 +437,7 @@ " vm.Filter(\n", " type=\"filter\",\n", " column=\"Date Read\",\n", - " targets=[\"sequence_chart\"],\n", + " targets=[\"sequence_reading\"],\n", " selector=vm.DatePicker(type=\"date_picker\", range=True),\n", " )\n", " ],\n", @@ -450,26 +445,19 @@ " vm.Page(\n", " components=[\n", " vm.Graph(\n", - " id=\"pages_books_chart\",\n", - " figure=pages_books_chart(data_frame=\"book_reading_data\"),\n", + " id=\"pages_books_totals\",\n", + " figure=pages_books_totals(data_frame=\"book_reading_data\"),\n", " )\n", " ],\n", " title=\"Pages and Book Totals\",\n", " layout=vm.Layout(grid=[[0]]),\n", - " controls=[\n", - " vm.Filter(\n", - " type=\"filter\",\n", - " column=\"Date Read\",\n", - " targets=[\"pages_books_chart\"],\n", - " selector=vm.DatePicker(type=\"date_picker\", range=True),\n", - " )\n", - " ],\n", + " controls=[],\n", " ),\n", " vm.Page(\n", " components=[\n", " vm.Graph(\n", - " id=\"rating_comparison_chart\",\n", - " figure=rating_comparison_chart(data_frame=\"book_reading_data\"),\n", + " id=\"rating_comparison\",\n", + " figure=rating_comparison(data_frame=\"book_reading_data\"),\n", " )\n", " ],\n", " title=\"Rating Comparison\",\n", From 5cfd0f9d2b3fc57b1b2da5d408888232458e1d48 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 16 Jan 2025 17:57:31 +0000 Subject: [PATCH 30/44] Rename markdown file --- .../tutorials/{project-tutorial.md => goodreads-tutorial.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename vizro-ai/docs/pages/tutorials/{project-tutorial.md => goodreads-tutorial.md} (100%) diff --git a/vizro-ai/docs/pages/tutorials/project-tutorial.md b/vizro-ai/docs/pages/tutorials/goodreads-tutorial.md similarity index 100% rename from vizro-ai/docs/pages/tutorials/project-tutorial.md rename to vizro-ai/docs/pages/tutorials/goodreads-tutorial.md From 1239b7a78666030134aa4774383ccfb974b2fa71 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 16 Jan 2025 17:57:39 +0000 Subject: [PATCH 31/44] Update mkdocs.yml --- vizro-ai/mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vizro-ai/mkdocs.yml b/vizro-ai/mkdocs.yml index bf1768567..092e90f38 100644 --- a/vizro-ai/mkdocs.yml +++ b/vizro-ai/mkdocs.yml @@ -5,7 +5,7 @@ nav: - Tutorials: - Chart generation: pages/tutorials/quickstart.md - Dashboard generation: pages/tutorials/quickstart-dashboard.md - - Goodreads tutorial: pages/tutorials/project-tutorial.md + - Goodreads tutorial: pages/tutorials/goodreads-tutorial.md - How-to guides: - FUNDAMENTALS: - Install Vizro-AI: pages/user-guides/install.md From 433888942b177dda34f14737476e32d629331dbd Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Mon, 20 Jan 2025 10:31:14 +0000 Subject: [PATCH 32/44] Update .pre-commit-config.yaml --- .pre-commit-config.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 96827dae2..03eedfda5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -101,7 +101,6 @@ ci: - check-case-conflict - check-yaml - check-json - - check-datafiles - codespell - bandit - mypy From dee27c3d272325154ed5f37323dd084525b41100 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Mon, 20 Jan 2025 15:13:00 +0000 Subject: [PATCH 33/44] Update goodreads-tutorial.md --- .../pages/tutorials/goodreads-tutorial.md | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/vizro-ai/docs/pages/tutorials/goodreads-tutorial.md b/vizro-ai/docs/pages/tutorials/goodreads-tutorial.md index 1fbeebece..457980a61 100644 --- a/vizro-ai/docs/pages/tutorials/goodreads-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/goodreads-tutorial.md @@ -1,10 +1,10 @@ # How to build a prototype dashboard with Vizro-AI -This tutorial uses Vizro-AI to build a prototype dashboard with three charts that illustrate a simple dataset. We first show how to create individual charts with Vizro-AI and then move on to learn how to use Vizro-AI to build a dashboard. The tutorial concludes by moving the prototype code generated by Vizro-AI into a project on PyCafe, for others to use and extend. +This tutorial uses Vizro-AI to build a prototype dashboard with three charts that illustrate a simple dataset. We first show how to create individual charts with Vizro-AI and then show how to use Vizro-AI to build a dashboard. The tutorial concludes by moving the prototype code generated by Vizro-AI into a project on PyCafe, for others to use and extend. ## Project explanation -The dataset for this project was a set of books data [exported from a personal Goodreads account](https://www.goodreads.com/review/import), which is provided with the project so you can run it. The dataset used can be downloaded from the [Vizro repository](https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/filtered_books.csv). If you use Goodreads, you can export your own data in CSV format, substitute it for the dataset provided, and explore it with the code for this project. +The dataset for this project was a set of books data [exported from a personal Goodreads account](https://www.goodreads.com/review/import), which is provided with the project so you can run it. The dataset can be downloaded from the [Vizro repository](https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/filtered_books.csv). If you use Goodreads, you can export your own data in CSV format, substitute it for the dataset provided, and explore it with the code for this project. The dataset was filtered to retain only books with an ISBN, which can be used with [Google Books API](https://developers.google.com/books) to retrieve additional data about a book. The Books API wasn't used in this project, but by including ISBN data, there is scope to extend the prototype project in future. @@ -17,7 +17,7 @@ This tutorial uses OpenAI models with Vizro-AI. To run through the steps, you mu ## Chart generation with Vizro-AI -In this step, we use a UI on a hosted version of Vizro-AI, found at [https://py.cafe/app/vizro-official/vizro-ai-charts](https://py.cafe/app/vizro-official/vizro-ai-charts). Use your browser to navigate to the site which looks as follows: +In this step, we use a hosted version of Vizro-AI, found at [https://py.cafe/app/vizro-official/vizro-ai-charts](https://py.cafe/app/vizro-official/vizro-ai-charts). Navigate with your browser to the site, which looks as follows: ![](../../assets/tutorials/project/user-interface-hosted-vizro-ai.png) @@ -27,7 +27,9 @@ The link will open with a settings pane where you can set the API key for your c ![](../../assets/tutorials/project/user-interface-settings-hosted-vizro-ai.png) -To return to these settings at any time, you'll notice a cog icon at the top right hand corner for access to them. Once the API key is set, return to the main screen and upload the data for the project. +To return to these settings at any time, you'll notice a cog icon at the top right hand corner for access to them. + +Once the API key is set, return to the main screen and [upload the data for the project](https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/filtered_books.csv). We can now use Vizro-AI to build some charts by iterating text to form effective prompts. @@ -76,7 +78,7 @@ Show the total books read using the right hand side of the chart, which can be a different scale to the y axis shown on the left hand side. ``` -The Plotly code generated when run with `gpt-4-turbo` was as follows. The chart could be improved by bringing the line graph on top of the bar chart, but varying the prompt to make this explicit did not have the desired results: +The Plotly code generated when run with `gpt-4-turbo` was as follows. The chart could be improved by bringing the line graph on top of the bar chart, but varying the prompt to make this explicit did not generate the desired output: ??? example "Click to expand" === "Generated by Vizro-AI" @@ -190,7 +192,7 @@ The plot this code returns looks as follows: ![](../../assets/tutorials/project/ ### Set up a Jupyter Notebook -At this point, we have prototypes for three plotly charts for the Goodreads data. To display these as an interactive dashboard, we need some additional code and Vizro-AI can generate this for us, but not through the application hosted on PyCafe at the time of writing. We'll use a Jupyter Notebook instead. +Now we have prototypes for three plotly charts for the Goodreads data. To display these as an interactive dashboard, we need some additional code. Vizro-AI can generate this for us, but not through the application hosted on PyCafe at the time of writing. We'll use a Jupyter Notebook instead. Before running the Notebook code, [set up Vizro-AI](../user-guides/install.md) inside a virtual environment with Python 3.10 or later. Install the package with `pip install vizro_ai`. @@ -198,9 +200,9 @@ You need to give Vizro-AI your API key to access OpenAI by adding it to your env ### Build a dashboard -Now we can open a Jupyter Notebook to make the dashboard. We'll submit a single prompt that combines the three prompts listed above, with some small edits to ask for a dashboard that has three pages: one for each chart. +In the Jupyter Notebook we'll submit a single prompt that combines the three prompts listed above, with some small edits to ask for a dashboard that has three pages: one for each chart. -The following shows the code to make the request to Vizro-AI to build and display the dashboard. The Notebook is available for download from [Vizro's GitHub repository](https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb): +The following shows the code to make the request to Vizro-AI to build and display the dashboardted, with the data handling code omit. The cp,[;ete Notebook is available for download from [Vizro's GitHub repository](https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb): ??? example "Click to expand" === "Generated by Vizro-AI" @@ -258,9 +260,9 @@ To make the Vizro dashboards more interactive, we can ask Vizro-AI to add the co ### Get the Notebook -You can see the code output in the [Notebook stored on the Vizro GitHub repository](https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb), and generate similar output by running it yourself, although it will not necessarily be identical because of the variability of restuls returned from generative AI. +You can see the code output in the [Notebook stored on the Vizro GitHub repository](https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb), and generate similar output by running it yourself, although it will not necessarily be identical because of the variability of results returned from generative AI. -The charts generated were similar to those created by the PyCafe host above, although the first chart was improved by spacing the books proportionate to the date read and the hover text included the book title as well as the date read, without an explicit request to do so. +The charts generated were similar to those created by the PyCafe host above, although the first chart was improved by spacing the books proportionate to the date read. The hover text included the book title as well as the date read, without needing an explicit request to do so. ![](../../assets/tutorials/project/chart1v2.png) @@ -272,7 +274,7 @@ As we've already seen, the code generated by Vizro-AI can vary from run to run, The project isn't particularly easy to share at present either: sharing a Notebook requires every user to have an OpenAI key and set up an environment. -To share and iterate the prototype, we can transfer the generated code from the output of Vizro-AI in the Notebook into a PyCafe project. +To share and iterate the prototype, we can transfer the **generated** code from the output of Vizro-AI in the Notebook into a PyCafe project. There are three changes to the Notebook code needed for it to run on PyCafe: @@ -454,19 +456,19 @@ Follow the link at the bottom of the code snippet titled **☕️ Run and edit t Vizro().build(model).run() ``` -## Summary +## Prototype summary -In this tutorial, we first used Vizro-AI to generate a set of charts by iterating prompts, hosted in PyCafe. +In this tutorial, we used Vizro-AI to generate a set of charts by iterating prompts, hosted in PyCafe. We then converted the successful prompts to build a Vizro dashboard using Vizro-AI in a Notebook using a few lines of support code. -Finally, we converted the Vizro-AI generated Python to a PyCafe project with a few additional lines of support code. At this point, the Vizro project is not using generative AI, so it is easy to share and iterate. +Finally, we converted the generated Python to a PyCafe project with a few additional lines of support code. The resulting Vizro project is not using generative AI, so it is easy to share and iterate. The code generated by Vizro-AI does not make a perfect dashboard, but it has been very easy to get it to a good standard without a great deal of coding or design experience. There are a few improvements that are easily applied to the Plotly code to further improve the charts, as shown below in a separate PyCafe project. ### Improvements to generated Plotly code -In this version of the dashboard, the first chart that show the sequence of books read has been modified to improve the information supplied when hovering over a point, and the opacity of the points has been altered to make it more attractive. The control has been changed to a slider for the `Date Read` field. +In this version of the dashboard, the first chart that shows the sequence of books read has been modified to improve the information supplied when hovering over a point, and the opacity of the points has been altered to make it more attractive. The control has been changed to a slider for the `Date Read` field. In the second chart that shows the cumulative total of pages and books read, the line chart has been explicitly plotted on top of the bar chart. From a6af91d3820f91a9f5dbccd7a7f6c2805a8e39bf Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 20 Jan 2025 15:13:22 +0000 Subject: [PATCH 34/44] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- vizro-ai/docs/pages/tutorials/goodreads-tutorial.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vizro-ai/docs/pages/tutorials/goodreads-tutorial.md b/vizro-ai/docs/pages/tutorials/goodreads-tutorial.md index 457980a61..83132b142 100644 --- a/vizro-ai/docs/pages/tutorials/goodreads-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/goodreads-tutorial.md @@ -27,7 +27,7 @@ The link will open with a settings pane where you can set the API key for your c ![](../../assets/tutorials/project/user-interface-settings-hosted-vizro-ai.png) -To return to these settings at any time, you'll notice a cog icon at the top right hand corner for access to them. +To return to these settings at any time, you'll notice a cog icon at the top right hand corner for access to them. Once the API key is set, return to the main screen and [upload the data for the project](https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/filtered_books.csv). @@ -202,7 +202,7 @@ You need to give Vizro-AI your API key to access OpenAI by adding it to your env In the Jupyter Notebook we'll submit a single prompt that combines the three prompts listed above, with some small edits to ask for a dashboard that has three pages: one for each chart. -The following shows the code to make the request to Vizro-AI to build and display the dashboardted, with the data handling code omit. The cp,[;ete Notebook is available for download from [Vizro's GitHub repository](https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb): +The following shows the code to make the request to Vizro-AI to build and display the dashboardted, with the data handling code omit. The cp,\[;ete Notebook is available for download from [Vizro's GitHub repository](https://raw.githubusercontent.com/mckinsey/vizro/834c8d9c198420e8b315c0dc045b7aa12534719d/vizro-ai/examples/goodreads_tutorial/goodreads.ipynb): ??? example "Click to expand" === "Generated by Vizro-AI" From 5520d22d1ea40f7aee207668d26a3fcbeec94c8d Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 23 Jan 2025 11:03:02 +0000 Subject: [PATCH 35/44] Add extrahead for google site verification --- vizro-core/docs/overrides/main.html | 5 +++++ vizro-core/mkdocs.yml | 1 + 2 files changed, 6 insertions(+) create mode 100644 vizro-core/docs/overrides/main.html diff --git a/vizro-core/docs/overrides/main.html b/vizro-core/docs/overrides/main.html new file mode 100644 index 000000000..686b40961 --- /dev/null +++ b/vizro-core/docs/overrides/main.html @@ -0,0 +1,5 @@ +{% extends "base.html" %} + +{% block extrahead %} + +{% endblock %} \ No newline at end of file diff --git a/vizro-core/mkdocs.yml b/vizro-core/mkdocs.yml index 61d7bec98..8c4fd1d12 100644 --- a/vizro-core/mkdocs.yml +++ b/vizro-core/mkdocs.yml @@ -66,6 +66,7 @@ repo_name: mckinsey/vizro theme: name: material language: en + custom_dir: docs/overrides palette: - scheme: default font: From d9e607a3fd27b841e1cefc7bff964adb8f6ca542 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 23 Jan 2025 11:05:00 +0000 Subject: [PATCH 36/44] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- vizro-core/docs/overrides/main.html | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/vizro-core/docs/overrides/main.html b/vizro-core/docs/overrides/main.html index 686b40961..29b712f2d 100644 --- a/vizro-core/docs/overrides/main.html +++ b/vizro-core/docs/overrides/main.html @@ -1,5 +1,6 @@ -{% extends "base.html" %} - -{% block extrahead %} - -{% endblock %} \ No newline at end of file +{% extends "base.html" %} {% block extrahead %} + +{% endblock %} From ff19b313213022c1e21bce4834569e2ea83e7954 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 23 Jan 2025 11:09:13 +0000 Subject: [PATCH 37/44] Reverting commit on wrong branch --- vizro-core/mkdocs.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/vizro-core/mkdocs.yml b/vizro-core/mkdocs.yml index 8c4fd1d12..61d7bec98 100644 --- a/vizro-core/mkdocs.yml +++ b/vizro-core/mkdocs.yml @@ -66,7 +66,6 @@ repo_name: mckinsey/vizro theme: name: material language: en - custom_dir: docs/overrides palette: - scheme: default font: From 313a989c53b2c1d4b46c8f251f195c041464c1c4 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Thu, 23 Jan 2025 11:14:08 +0000 Subject: [PATCH 38/44] Reverting commit on wrong branch --- vizro-core/docs/overrides/main.html | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 vizro-core/docs/overrides/main.html diff --git a/vizro-core/docs/overrides/main.html b/vizro-core/docs/overrides/main.html deleted file mode 100644 index 29b712f2d..000000000 --- a/vizro-core/docs/overrides/main.html +++ /dev/null @@ -1,6 +0,0 @@ -{% extends "base.html" %} {% block extrahead %} - -{% endblock %} From c7ac504a006dc9e936f030734531ba8c8b9e5ce6 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Tue, 4 Feb 2025 14:17:14 +0000 Subject: [PATCH 39/44] Add canonical tag --- vizro-ai/docs/overrides/canonical_tag.py | 13 +++++++++++++ vizro-ai/docs/pages/tutorials/goodreads-tutorial.md | 4 ++++ vizro-ai/mkdocs.yml | 3 +++ 3 files changed, 20 insertions(+) create mode 100644 vizro-ai/docs/overrides/canonical_tag.py diff --git a/vizro-ai/docs/overrides/canonical_tag.py b/vizro-ai/docs/overrides/canonical_tag.py new file mode 100644 index 000000000..3da2dcd7b --- /dev/null +++ b/vizro-ai/docs/overrides/canonical_tag.py @@ -0,0 +1,13 @@ +# Add a canonical tag + +def on_page_markdown(markdown, *, page, config, files): + + # Get key from front matter + canonical_url = page.meta.get("canonical_url") + + # Skip processing page when key not found + if canonical_url is None: + return + + # Assign the custom url to the page + page.canonical_url = canonical_url \ No newline at end of file diff --git a/vizro-ai/docs/pages/tutorials/goodreads-tutorial.md b/vizro-ai/docs/pages/tutorials/goodreads-tutorial.md index 83132b142..5a598d129 100644 --- a/vizro-ai/docs/pages/tutorials/goodreads-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/goodreads-tutorial.md @@ -1,3 +1,7 @@ +--- +canonical_url: https://medium.com/towards-data-science/how-to-build-a-data-dashboard-prototype-with-generative-ai-462f1d91690d +--- + # How to build a prototype dashboard with Vizro-AI This tutorial uses Vizro-AI to build a prototype dashboard with three charts that illustrate a simple dataset. We first show how to create individual charts with Vizro-AI and then show how to use Vizro-AI to build a dashboard. The tutorial concludes by moving the prototype code generated by Vizro-AI into a project on PyCafe, for others to use and extend. diff --git a/vizro-ai/mkdocs.yml b/vizro-ai/mkdocs.yml index 092e90f38..bb139f4d9 100644 --- a/vizro-ai/mkdocs.yml +++ b/vizro-ai/mkdocs.yml @@ -118,6 +118,9 @@ plugins: - git-revision-date-localized: enable_creation_date: false +hooks: + - docs/overrides/canonical_tag.py + extra_css: - stylesheets/extra.css From d239ff50e36633f4505bcb458ecfab98706c5f8f Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Tue, 4 Feb 2025 14:18:57 +0000 Subject: [PATCH 40/44] Update goodreads-tutorial.md --- vizro-ai/docs/pages/tutorials/goodreads-tutorial.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vizro-ai/docs/pages/tutorials/goodreads-tutorial.md b/vizro-ai/docs/pages/tutorials/goodreads-tutorial.md index 5a598d129..fe2380217 100644 --- a/vizro-ai/docs/pages/tutorials/goodreads-tutorial.md +++ b/vizro-ai/docs/pages/tutorials/goodreads-tutorial.md @@ -4,7 +4,7 @@ canonical_url: https://medium.com/towards-data-science/how-to-build-a-data-dashb # How to build a prototype dashboard with Vizro-AI -This tutorial uses Vizro-AI to build a prototype dashboard with three charts that illustrate a simple dataset. We first show how to create individual charts with Vizro-AI and then show how to use Vizro-AI to build a dashboard. The tutorial concludes by moving the prototype code generated by Vizro-AI into a project on PyCafe, for others to use and extend. +This tutorial uses Vizro-AI to build a prototype dashboard with three charts that illustrate a simple dataset. We first show how to create individual charts with Vizro-AI and then show how to use Vizro-AI to build a dashboard. The tutorial concludes by moving the prototype code generated by Vizro-AI into a project on PyCafe, for others to use and extend. A version of this tutorial was first published as a [blog post on Towards Data Science in January 2025](https://medium.com/towards-data-science/how-to-build-a-data-dashboard-prototype-with-generative-ai-462f1d91690d). ## Project explanation From b4c26d68c7ea6fa13c6a5153c10b450413bf1f43 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Tue, 4 Feb 2025 14:24:35 +0000 Subject: [PATCH 41/44] Create check_for_datafiles.py --- tools/check_for_datafiles.py | 48 ++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 tools/check_for_datafiles.py diff --git a/tools/check_for_datafiles.py b/tools/check_for_datafiles.py new file mode 100644 index 000000000..7dcbb5738 --- /dev/null +++ b/tools/check_for_datafiles.py @@ -0,0 +1,48 @@ +"""FUNCTION TO CHECK FOR DATA FILES IN NON-WHITELISTED FOLDERS.""" + +import glob +from pathlib import Path + +file_extensions = [ + "csv", + "xlsx", + "xls", + "parquet", + "tsv", + "hdf5", + "h5", + "pickle", + "pkl", + "db", + "sqlite", + "sqlite3", + "orc", +] +whitelist_folders = [ + "/venv", + "/vizro-core/docs", + "/vizro-ai/tests/integration/reports", +] # starting from project root dir + + +def check_for_data_files(): + """Recursively finds all data files in non-whitelisted folders. + + Raises: + AssertionError if data files are present in non-whitelisted folders. + + """ + project_dir = str(Path(__file__).parent.parent) + whitelist_dir = {f"{project_dir}{dir}" for dir in whitelist_folders} + + found_files = {file for ext in file_extensions for file in glob.glob(project_dir + f"/**/*.{ext}", recursive=True)} + whitelisted_files = {files for dir in whitelist_dir for files in found_files if files.startswith(dir)} + to_be_removed_files = found_files - whitelisted_files + + assert len(to_be_removed_files) == 0, ( + f"Caution! Please remove your data files {to_be_removed_files} before merging!" + ) + + +if __name__ == "__main__": + check_for_data_files() From e3e9b1c82fafa5a5705b0ca0a192be15cd9cc89c Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 4 Feb 2025 14:25:16 +0000 Subject: [PATCH 42/44] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- vizro-ai/docs/overrides/canonical_tag.py | 8 ++++---- vizro-ai/mkdocs.yml | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/vizro-ai/docs/overrides/canonical_tag.py b/vizro-ai/docs/overrides/canonical_tag.py index 3da2dcd7b..b17ca6a09 100644 --- a/vizro-ai/docs/overrides/canonical_tag.py +++ b/vizro-ai/docs/overrides/canonical_tag.py @@ -1,13 +1,13 @@ # Add a canonical tag + def on_page_markdown(markdown, *, page, config, files): - # Get key from front matter canonical_url = page.meta.get("canonical_url") - + # Skip processing page when key not found if canonical_url is None: return - + # Assign the custom url to the page - page.canonical_url = canonical_url \ No newline at end of file + page.canonical_url = canonical_url diff --git a/vizro-ai/mkdocs.yml b/vizro-ai/mkdocs.yml index bb139f4d9..252f51ce2 100644 --- a/vizro-ai/mkdocs.yml +++ b/vizro-ai/mkdocs.yml @@ -119,8 +119,8 @@ plugins: enable_creation_date: false hooks: - - docs/overrides/canonical_tag.py - + - docs/overrides/canonical_tag.py + extra_css: - stylesheets/extra.css From 8ed60275cbff8838ee506f9b707c5404a90171b1 Mon Sep 17 00:00:00 2001 From: Jo Stichbury Date: Tue, 4 Feb 2025 14:41:19 +0000 Subject: [PATCH 43/44] Update canonical_tag.py --- vizro-ai/docs/overrides/canonical_tag.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vizro-ai/docs/overrides/canonical_tag.py b/vizro-ai/docs/overrides/canonical_tag.py index b17ca6a09..88e21683b 100644 --- a/vizro-ai/docs/overrides/canonical_tag.py +++ b/vizro-ai/docs/overrides/canonical_tag.py @@ -1,7 +1,8 @@ -# Add a canonical tag +""" Add a canonical tag. """ def on_page_markdown(markdown, *, page, config, files): + """ Add a canonical tag. """ # Get key from front matter canonical_url = page.meta.get("canonical_url") From d0c25e1d41e1878a2c9a1ff0196cff14f6a3e1ce Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 4 Feb 2025 14:42:08 +0000 Subject: [PATCH 44/44] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- vizro-ai/docs/overrides/canonical_tag.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vizro-ai/docs/overrides/canonical_tag.py b/vizro-ai/docs/overrides/canonical_tag.py index 88e21683b..64ebdceef 100644 --- a/vizro-ai/docs/overrides/canonical_tag.py +++ b/vizro-ai/docs/overrides/canonical_tag.py @@ -1,8 +1,8 @@ -""" Add a canonical tag. """ +"""Add a canonical tag.""" def on_page_markdown(markdown, *, page, config, files): - """ Add a canonical tag. """ + """Add a canonical tag.""" # Get key from front matter canonical_url = page.meta.get("canonical_url")