{"id":695,"date":"2021-08-09T06:08:43","date_gmt":"2021-08-09T06:08:43","guid":{"rendered":"https:\/\/fcpython.com\/?p=695"},"modified":"2021-08-09T06:12:55","modified_gmt":"2021-08-09T06:12:55","slug":"building-interactive-analysis-tools-with-python-streamlit","status":"publish","type":"post","link":"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit","title":{"rendered":"Building Interactive Analysis Tools with Python &#038; Streamlit"},"content":{"rendered":"\n<p>Streamlit is a Python library that makes creating and sharing analysis tools far easier than it should be. Think of it like a Jupyter notebook that only shows the parts you would want a non-programmer end user to interact with &#8211; data, visualisations, filters &#8211; without the code.<\/p>\n<p>This article will introduce you to Streamlit. We\u2019ll take you through getting the package and your app set up, importing data into it, calculating new columns and finally creating the visuals and filters that make it into something interactive.<\/p>\n<p>Our project will use data from the 20\/21 season of the Premier League\u2019s Fantasy Football competition to build a basic app to filter and visualise player data.<\/p>\n<p><a href=\"https:\/\/github.com\/dosanjos44\/FC-Python-Tutorials\/tree\/main\/Streamlit%20FPL%20Tutorial\">The data and code for this tutorial are available here.<\/a><\/p>\n<p>As general recommendations, I think that this is best learned with Anaconda to manage your environment, and VS Code to have your code and terminal running in the same place.<\/p>\n<h3>Getting off the ground with Streamlit<\/h3>\n<p>The very first thing that we need to do is install Streamlit, which we do as we would any other package. Head over to the terminal in your Python environment and install Streamlit with either Conda or Pip.<\/p>\n<p>conda install streamlit<br>Or if you are not using Anaconda<br>pip install streamlit<\/p>\n<p>With it installed, let\u2019s now create a new folder for our app. In this folder, create a new file called fpl-app.py (or whatever you want &#8211; just remember to use your new name later in the tutorial). Also in this folder, download the csv here and place it alongside your new .py file.<\/p>\n<p>Before we get started properly, we need to get our blank app up and running. Open up Python environment terminal (easiest to do this in VS code by opening the command palette and selecting \u2018create new integrated terminal), make sure you are in the new folder and run \u2018streamlit run fpl-app.py\u2019. This will open up our blank app, which we are going to make a lot more useful in the coming steps.<\/p>\n<h3>Importing our data and enhancing it<\/h3>\n<p>As with any Python code, we need to import our packages. Open up your blank fpl-app.py file and import the three modules we\u2019ll use in this tutorial:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">import pandas as pd\nimport numpy as np\nimport streamlit as st<\/code><\/pre>\n\n\n\n<p>With pandas installed, we can now import our data easily. Use read_csv to load in the data that you downloaded earlier and placed in the same folder:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">df = pd.read_csv('fpldata.csv')<\/code><\/pre>\n\n\n\n<p>This data frame is from FPL 20\/21. Each row is a player, and contains their data on points, cost, team, minutes played and a few basic performance metrics.<\/p>\n<p>Regardless of the project, we are hostage to the strength of our data. So let\u2019s improve what we have here before we create anything else.<\/p>\n<p>We have minutes played and we will use this metric to add context to the other performance metrics &#8211; goals, assists &amp; points. Firstly, we will create a \u201990 minutes played\u2019 metric, then use this to create p90 stats of these three metrics:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">df[\u201890s\u2019] = df[\u2018minutes\u2019]\/90\ncalc_elements = [\u2018goals\u2019, \u2018assists\u2019, \u2018points\u2019]\nfor each in calc_elements:\n    df[f\u2019{each}_p90\u2019] = df[each] \/ df[\u201890s\u2019]<\/code><\/pre>\n\n\n\n<p>This will give us a lot more insight when it comes to our dashboard.<\/p>\n<p>Finally, to help us to create filters for teams and positions, we need to get lists of the unique values in each. Rather than do this manually, we can do this by simply creating a list of these columns, then dropping the duplicates:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">positions = list(df[\u2018position\u2019].drop_duplicates())\nteams = list(df[\u2018team\u2019].drop_duplicates())<\/code><\/pre>\n\n\n\n<p>And this is all we have to do to get our data together! We\u2019re now ready to get started on our app. The first thing we will do is create our filters in the sidebar of the app, which will be applied to our dataframe. The app will then use this filtered dataframe to present data and visualisations in the main part of the app.<\/p>\n<h3>Adding Filters<\/h3>\n<p>Before displaying the data, we need to add filters that will allow the user to select just what is relevant to them.<\/p>\n<p>We add filters and other components to the app with the Streamlit library. As just two examples, adding a dataframe is done with st.dataframe() (we imported streamlit as st) and adding a slider is st.slider().<\/p>\n<p>We are going to add our filters in the sidebar of the app, which we do by calling sidebar before our component. So st.slider() would be placed in the sidebar with st.sidebar.slider() &#8211; easy!<\/p>\n<p>Let\u2019s first create a filter that allows us to pick which position we want to filter players by. A handy tool for this is multiselect, allowing us to pick one or many options.<\/p>\n<p>We add this to our app by assigning it to a variable, which will store our selection. Within the st.sidebar.multiselect() function, we pass the text label, the possible options and the default. Remember, we saved our positions in the \u2018positions\u2019 variable earlier, so our code looks like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">position_choice = st.sidebar.multiselect(\n    'Choose position:', positions, default=positions)<\/code><\/pre>\n\n\n\n<p>And let\u2019s add another multiselect for teams:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">teams_choice = st.sidebar.multiselect(\n    \"Teams:\", teams, default=teams)<\/code><\/pre>\n\n\n\n<p>Filtering by value would also be useful, but multiselect would be impractical. Instead a slider might be better. The st.slider() function needs a label, minimum value, maximum value, change step and default value. Something like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">price_choice = st.sidebar.slider(\n    'Max Price:', min_value=4, max_value=15.0, step=.5, value=15.0)<\/code><\/pre>\n\n\n\n<p>Refresh your app to take a look at your filters. It should look something like this, your filters across the left of the page.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-698 size-large\" src=\"https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/streamlitfilters-1024x621.jpg\" alt=\"Screenshot of Streamlit Filters\" width=\"1024\" height=\"621\" srcset=\"https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/streamlitfilters-1024x621.jpg 1024w, https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/streamlitfilters-300x182.jpg 300w, https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/streamlitfilters-768x466.jpg 768w, https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/streamlitfilters-1536x932.jpg 1536w, https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/streamlitfilters-2048x1242.jpg 2048w, https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/streamlitfilters-370x224.jpg 370w, https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/streamlitfilters-760x461.jpg 760w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>There are many other types of filters available in Streamlit, including checkboxes, buttons and radio buttons. Check out your other options in the <a href=\"https:\/\/docs.streamlit.io\/en\/stable\/api.html\">documentation<\/a>.<\/p>\n<p>Finally, we need to actually use these filters to slim down our dataframe to give the app the correct data to display to the user. You could do this all in one line, but for the sake of simplicity in this tutorial, let\u2019s do them one by one:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">df = df[df['position'].isin(position_choice)]\ndf = df[df['team'].isin(teams_choice)]\ndf = df[df['cost'] &lt; price_choice]<\/code><\/pre>\n\n\n\n<p>The df variable will now be filtered by whatever the user picks! Our next job is to display it.<\/p>\n<h3>Creating Visuals<\/h3>\n<p>As there are many types of filters, there are plenty of ways to display the information. We\u2019ll build a table and an interactive chart, but you&#8217;ll find the wealth of other options in the <a href=\"https:\/\/docs.streamlit.io\/en\/stable\/api.html\">docs.<\/a><\/p>\n<p>Every page needs a title and st.title() gives us just that:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">st.title(f\"Fantasy Football Analysis\")<\/code><\/pre>\n\n\n\n<p>If you want to add normal body text, you can simply use st.write(). However, I prefer st.markdown() as it gives you more freedom to format. Markdown gives syntax that formats text for you, and this <a href=\"https:\/\/www.markdownguide.org\/cheat-sheet\/\">cheat sheet<\/a> runs through your options.<\/p>\n<p>To create a subheading with st.markdown(), we use the following code:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">st.markdown(\u2018### Player Dataframe\u2019)<\/code><\/pre>\n\n\n\n<p>Under which, we obviously need to add a dataframe, which Streamlit again makes so simple:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">st.dataframe(df.sort_values('points',\n             ascending=False).reset_index(drop=True))<\/code><\/pre>\n\n\n\n<p>We could simply pass the df variable, but I think it is more useful for the user to give it a relevant order. So we have sorted it by points when we pass it. Streamlit and pandas sort the table for us, before posting it in the app.<\/p>\n<p>Now for something visual. Streamlit allows us to display plots and images from loads of different sources. Local images, Matplotlib plots, the Plotly library and more (check the docs). In this example, we\u2019ll use a really nice library called vega-lite. Vega-lite is a javascript library, but streamlit will do the hard work for us to convert our streamlit function into everything we need.<\/p>\n<p>Let\u2019s take a look with an example for cost vs points, with some extra information shown by colour and in the tooltips:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">This is our header\n st.markdown('### Cost vs 20\/21 Points')\n This is our plot\n st.vega_lite_chart(df, {\n     'mark': {'type': 'circle', 'tooltip': True},\n     'encoding': {\n         'x': {'field': 'cost', 'type': 'quantitative'},\n         'y': {'field': 'points', 'type': 'quantitative'},\n         'color': {'field': 'position', 'type': 'nominal'},\n         'tooltip': [{\"field\": 'name', 'type': 'nominal'}, {'field': 'cost', 'type': 'quantitative'}, {'field': 'points', 'type': 'quantitative'}],\n     },\n     'width': 700,\n     'height': 400,\n })<\/code><\/pre>\n\n\n\n<div>You\u2019ll notice that we use the st.vega_lite_chart() function. Within this, we pass the data that we want to plot, then a dictionary that looks quite complicated, but makes sense when we break it down:<\/div>\n<div>&nbsp;<\/div>\n<ul>\n<li>Mark &#8211; what mark are we using to signify the data points?<\/li>\n<li>Encoding:<\/li>\n<li>X &#8211; What is the x axis?<\/li>\n<li>Y &#8211; What is the y axis?<\/li>\n<li>Colour &#8211; What does colour show?<\/li>\n<li>Tooltip &#8211; Which data points would you like in the tooltips?<\/li>\n<li>Width\/height &#8211; What size should the chart be?<\/li>\n<\/ul>\n<div>Let\u2019s give another example, this time using our calculated goals_p90 and assists_p90 columns:<\/div>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">st.vega_lite_chart(df, {\n     'mark': {'type': 'circle', 'tooltip': True},\n     'encoding': {\n         'x': {'field': 'goals_p90', 'type': 'quantitative'},\n         'y': {'field': 'assists_p90', 'type': 'quantitative'},\n         'color': {'field': 'position', 'type': 'nominal'},\n         'tooltip': [{\"field\": 'name', 'type': 'nominal'}, {'field': 'cost', 'type': 'quantitative'}, {'field': 'points', 'type': 'quantitative'}],\n     },\n     'width': 700,\n     'height': 400,\n })<\/code><\/pre>\n\n\n\n<p>And now we have our app! Filters on the left should filter the data in the main part, with a refresh taking you back to a new start in case you run into any issues.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-702 size-large\" src=\"https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-09-at-08.09.25-1024x621.png\" alt=\"Streamlit app screenshot\" width=\"1024\" height=\"621\" srcset=\"https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-09-at-08.09.25-1024x621.png 1024w, https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-09-at-08.09.25-300x182.png 300w, https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-09-at-08.09.25-768x466.png 768w, https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-09-at-08.09.25-1536x932.png 1536w, https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-09-at-08.09.25-2048x1242.png 2048w, https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-09-at-08.09.25-370x224.png 370w, https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/Screenshot-2021-08-09-at-08.09.25-760x461.png 760w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<h3>Next Steps<\/h3>\n<p>This barely scratches the surface of what is possible with Streamlit, but I hope it gives you a nice introduction to importing data, running some calculations, then making it accessible to users to play around with.<\/p>\n<p>To develop these concepts further, you may want to look at extra chart or filter types, or connecting to an updating data source on a website\/API, or running machine learning models for users to interact with. The limit really is your imagination, as you can do whatever you want to in the backend before showing the user only what you want to.<\/p>\n<p>As always, we hope that you learned something here and enjoyed yourself along the way. Let us know any feedback <a href=\"https:\/\/twitter.com\/FC_Python\">@fc_python<\/a>, and we\u2019d love to see what you create with this tutorial!<\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[18,4],"tags":[73,74,72],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.13 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Building Interactive Analysis Tools with Python &amp; Streamlit - FC Python<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building Interactive Analysis Tools with Python &amp; Streamlit - FC Python\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit\" \/>\n<meta property=\"og:site_name\" content=\"FC Python\" \/>\n<meta property=\"article:published_time\" content=\"2021-08-09T06:08:43+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-08-09T06:12:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/streamlitfilters-1024x621.jpg\" \/>\n<meta name=\"author\" content=\"FCPythonADMIN\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@FC__Python\" \/>\n<meta name=\"twitter:site\" content=\"@FC__Python\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"FCPythonADMIN\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit#article\",\"isPartOf\":{\"@id\":\"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit\"},\"author\":{\"name\":\"FCPythonADMIN\",\"@id\":\"https:\/\/fcpython.com\/#\/schema\/person\/ed81e5728929acd0f3f2d9bf824a0bd0\"},\"headline\":\"Building Interactive Analysis Tools with Python &#038; Streamlit\",\"datePublished\":\"2021-08-09T06:08:43+00:00\",\"dateModified\":\"2021-08-09T06:12:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit\"},\"wordCount\":1503,\"publisher\":{\"@id\":\"https:\/\/fcpython.com\/#organization\"},\"keywords\":[\"dashboard\",\"fpl\",\"streamlit\"],\"articleSection\":[\"Blog\",\"Data Analysis\"],\"inLanguage\":\"en-GB\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit\",\"url\":\"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit\",\"name\":\"Building Interactive Analysis Tools with Python & Streamlit - FC Python\",\"isPartOf\":{\"@id\":\"https:\/\/fcpython.com\/#website\"},\"datePublished\":\"2021-08-09T06:08:43+00:00\",\"dateModified\":\"2021-08-09T06:12:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/fcpython.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building Interactive Analysis Tools with Python &#038; Streamlit\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fcpython.com\/#website\",\"url\":\"https:\/\/fcpython.com\/\",\"name\":\"FC Python\",\"description\":\"Learning Python through football\",\"publisher\":{\"@id\":\"https:\/\/fcpython.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fcpython.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/fcpython.com\/#organization\",\"name\":\"FC Python\",\"url\":\"https:\/\/fcpython.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/fcpython.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/fcpython.com\/wp-content\/uploads\/2017\/12\/Logocomp9.png\",\"contentUrl\":\"https:\/\/fcpython.com\/wp-content\/uploads\/2017\/12\/Logocomp9.png\",\"width\":981,\"height\":1049,\"caption\":\"FC Python\"},\"image\":{\"@id\":\"https:\/\/fcpython.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/twitter.com\/FC__Python\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/fcpython.com\/#\/schema\/person\/ed81e5728929acd0f3f2d9bf824a0bd0\",\"name\":\"FCPythonADMIN\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\/\/fcpython.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7a172a6f730270fc0f8bb1a8ff958895?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7a172a6f730270fc0f8bb1a8ff958895?s=96&d=mm&r=g\",\"caption\":\"FCPythonADMIN\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building Interactive Analysis Tools with Python & Streamlit - FC Python","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit","og_locale":"en_GB","og_type":"article","og_title":"Building Interactive Analysis Tools with Python & Streamlit - FC Python","og_url":"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit","og_site_name":"FC Python","article_published_time":"2021-08-09T06:08:43+00:00","article_modified_time":"2021-08-09T06:12:55+00:00","og_image":[{"url":"https:\/\/fcpython.com\/wp-content\/uploads\/2021\/08\/streamlitfilters-1024x621.jpg"}],"author":"FCPythonADMIN","twitter_card":"summary_large_image","twitter_creator":"@FC__Python","twitter_site":"@FC__Python","twitter_misc":{"Written by":"FCPythonADMIN","Estimated reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit#article","isPartOf":{"@id":"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit"},"author":{"name":"FCPythonADMIN","@id":"https:\/\/fcpython.com\/#\/schema\/person\/ed81e5728929acd0f3f2d9bf824a0bd0"},"headline":"Building Interactive Analysis Tools with Python &#038; Streamlit","datePublished":"2021-08-09T06:08:43+00:00","dateModified":"2021-08-09T06:12:55+00:00","mainEntityOfPage":{"@id":"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit"},"wordCount":1503,"publisher":{"@id":"https:\/\/fcpython.com\/#organization"},"keywords":["dashboard","fpl","streamlit"],"articleSection":["Blog","Data Analysis"],"inLanguage":"en-GB"},{"@type":"WebPage","@id":"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit","url":"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit","name":"Building Interactive Analysis Tools with Python & Streamlit - FC Python","isPartOf":{"@id":"https:\/\/fcpython.com\/#website"},"datePublished":"2021-08-09T06:08:43+00:00","dateModified":"2021-08-09T06:12:55+00:00","breadcrumb":{"@id":"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fcpython.com\/data-analysis\/building-interactive-analysis-tools-with-python-streamlit#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/fcpython.com\/"},{"@type":"ListItem","position":2,"name":"Building Interactive Analysis Tools with Python &#038; Streamlit"}]},{"@type":"WebSite","@id":"https:\/\/fcpython.com\/#website","url":"https:\/\/fcpython.com\/","name":"FC Python","description":"Learning Python through football","publisher":{"@id":"https:\/\/fcpython.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fcpython.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/fcpython.com\/#organization","name":"FC Python","url":"https:\/\/fcpython.com\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/fcpython.com\/#\/schema\/logo\/image\/","url":"https:\/\/fcpython.com\/wp-content\/uploads\/2017\/12\/Logocomp9.png","contentUrl":"https:\/\/fcpython.com\/wp-content\/uploads\/2017\/12\/Logocomp9.png","width":981,"height":1049,"caption":"FC Python"},"image":{"@id":"https:\/\/fcpython.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/twitter.com\/FC__Python"]},{"@type":"Person","@id":"https:\/\/fcpython.com\/#\/schema\/person\/ed81e5728929acd0f3f2d9bf824a0bd0","name":"FCPythonADMIN","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/fcpython.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/7a172a6f730270fc0f8bb1a8ff958895?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7a172a6f730270fc0f8bb1a8ff958895?s=96&d=mm&r=g","caption":"FCPythonADMIN"}}]}},"_links":{"self":[{"href":"https:\/\/fcpython.com\/wp-json\/wp\/v2\/posts\/695"}],"collection":[{"href":"https:\/\/fcpython.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fcpython.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fcpython.com\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fcpython.com\/wp-json\/wp\/v2\/comments?post=695"}],"version-history":[{"count":5,"href":"https:\/\/fcpython.com\/wp-json\/wp\/v2\/posts\/695\/revisions"}],"predecessor-version":[{"id":703,"href":"https:\/\/fcpython.com\/wp-json\/wp\/v2\/posts\/695\/revisions\/703"}],"wp:attachment":[{"href":"https:\/\/fcpython.com\/wp-json\/wp\/v2\/media?parent=695"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fcpython.com\/wp-json\/wp\/v2\/categories?post=695"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fcpython.com\/wp-json\/wp\/v2\/tags?post=695"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}