CINXE.COM
How Polars Can Help You Build Fast Dash Apps for Large Datasets
<!DOCTYPE html><html><head><meta charSet="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/><title>How Polars Can Help You Build Fast Dash Apps for Large Datasets</title><meta name="title" content="How Polars Can Help You Build Fast Dash Apps for Large Datasets"/><meta name="description" content="Discover the power of leveraging Polars in lightning-fast Dash apps for visualizing and analyzing large data sets in your production environment."/><meta name="twitter:title" content="How Polars Can Help You Build Fast Dash Apps for Large Datasets"/><meta name="twitter:description" content="Discover the power of leveraging Polars in lightning-fast Dash apps for visualizing and analyzing large data sets in your production environment."/><meta name="twitter:image" content="https://images.prismic.io/plotly-marketing-website-2/2868553c-8db0-4ff1-9ea7-4cb34c0ed335_Polars+%281%29.png?auto=compress,format"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:site" content="@plotlygraphs"/><meta name="twitter:creator" content="plotly"/><meta property="og:title" content="How Polars Can Help You Build Fast Dash Apps for Large Datasets"/><meta property="og:description" content="Discover the power of leveraging Polars in lightning-fast Dash apps for visualizing and analyzing large data sets in your production environment."/><meta property="og:url" content="blog/polars-to-build-fast-dash-apps-for-large-datasets"/><meta property="og:type" content="website"/><meta property="og:image" content="https://images.prismic.io/plotly-marketing-website-2/2868553c-8db0-4ff1-9ea7-4cb34c0ed335_Polars+%281%29.png?auto=compress,format"/><meta property="og:image:type" content="image/jpg"/><meta property="og:image:url" content="https://images.prismic.io/plotly-marketing-website-2/2868553c-8db0-4ff1-9ea7-4cb34c0ed335_Polars+%281%29.png?auto=compress,format"/><meta property="og:image:secure_url" content="https://images.prismic.io/plotly-marketing-website-2/2868553c-8db0-4ff1-9ea7-4cb34c0ed335_Polars+%281%29.png?auto=compress,format"/><meta name="robots" content="index, follow"/><meta property="og:image:alt" content="Plotly"/><meta property="og:image:width" content="50"/><meta property="og:image:height" content="50"/><meta property="og:locale" content="en_IE"/><link rel="icon" type="image/x-icon" href="favicon.ico"/><link rel="icon" id="favicon" type="image/svg+xml" href="https://images.prismic.io/plotly-marketing-website-2/798854a2-209b-4e03-959f-965613354c4f_favicon_new_white.png?auto=compress,format"/><script type="application/ld+json">{"@context":"https://schema.org","@type":"Corporation","name":"Plotly","url":"https://plotly.com/","description":"Plotly is a software company whose mission is to enable every company, around the world, to build data apps.","logo":"https://images.prismic.io/plotly-marketing-website-2/a8e0a665-64b3-4d45-8f06-36ab5c165a65_google-search-logo.png","sameAs":["https://www.facebook.com/Plotly/","https://twitter.com/plotlygraphs","https://www.linkedin.com/company/plotly/","https://www.instagram.com/plotly/","https://github.com/plotly"]}</script><script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":"1","name":"Blog","item":"https://plotly.com/blog/"},{"@type":"ListItem","position":"2","name":"How Polars Can Help You Build Fast Dash Apps for Large Datasets","item":"https://plotly.com/blog/polars-to-build-fast-dash-apps-for-large-datasets/"}]}</script><meta name="next-head-count" content="28"/><meta name="robots" content="index,follow"/><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"pageData":{"id":"ZK8S6RUAACYAzPRx","uid":"polars-to-build-fast-dash-apps-for-large-datasets","url":null,"type":"blog_page","href":"https://plotly-marketing-website-2.cdn.prismic.io/api/v2/documents/search?ref=Z0ZkvREAACAAtL1G\u0026q=%5B%5B%3Ad+%3D+at%28document.id%2C+%22ZK8S6RUAACYAzPRx%22%29+%5D%5D","tags":[],"first_publication_date":"2023-07-26T19:15:55+0000","last_publication_date":"2024-06-22T01:55:54+0000","slugs":["how-polars-can-help-you-build-fast-dash-apps-for-large-datasets"],"linked_documents":[],"lang":"en-us","alternate_languages":[],"data":{"body":[{"primary":{"animation":true,"color_1":null,"color_2":null,"color_3":null,"static_background":false},"items":[{}],"id":"subtle_animation$9865ddf4-6e75-4632-a279-0de1acb25894","slice_type":"subtle_animation","slice_label":null},{"primary":{"image":{"dimensions":{"width":512,"height":512},"alt":"Mina Mirazaei","copyright":null,"url":"https://images.prismic.io/plotly-marketing-website-2/cf8529b1-15da-4417-af6b-c96372a11fa8_Mina.png?auto=compress,format","id":"ZLHF0xUAACcA2GA3","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"name":"Mina Mirzaei","date___time":[{"type":"paragraph","text":"July 26, 2023","spans":[]}]},"items":[{}],"id":"author_section$283924a6-5e97-415e-9656-195052013ee0","slice_type":"author_section","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"heading1","text":"How Polars Can Help You Build Fast Dash Apps for Large Datasets","spans":[]}]}],"id":"blog_section$27818f16-c73e-4214-8e07-3e72ab9c89ff","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"Working in the world of data visualization can feel like the average data size keeps growing exponentially but compute power stays the same. While that may be true, we have to ask ourselves: are we actually running in the most optimal way?","spans":[]},{"type":"image","url":"https://prismic-io.s3.amazonaws.com/plotly-marketing-website-2/e81fcb8d-1b8c-4dd2-b9dc-ba841b52bb9b_image3.gif","alt":null,"copyright":null,"dimensions":{"width":500,"height":281},"id":"ZLmrthUAACgA-veB","edit":{"x":0,"y":0,"zoom":1,"background":"#fff"}},{"type":"paragraph","text":"There are many ways to accomplish this with Dash: Leveraging tooling or strategies including caching and memorization, minimizing data transfer over the network, and using partial property updates are just a few. We always recommend profiling an application before trying to optimize it: Premature optimization can cost weeks or even months of unnecessary labor. So choose the right fit for each use case.","spans":[{"start":233,"end":257,"type":"hyperlink","data":{"link_type":"Web","url":"https://community.plotly.com/t/performance-profiling-dash-apps-with-werkzeug/65199","target":"_blank"}},{"start":288,"end":310,"type":"hyperlink","data":{"link_type":"Web","url":"https://xkcd.com/1691/","target":"_blank"}}]},{"type":"paragraph","text":"In Professional Services at Plotly, we frequently encounter use cases with large datasets. Many of these applications require bespoke architectures and there is no complete “one size fits all” data format or database system for any application.","spans":[]},{"type":"paragraph","text":"One strategy that has gained significant popularity in recent years is to leverage a memory-mapped data architecture, and in Python pairing Parquet files with a tool like Vaex or Polars is a fantastic strategy to accomplish this.","spans":[]},{"type":"paragraph","text":"A recent Professional Services project for an equity firm led to our employment of this system as part of an application build, which paired well with the Dash framework and the Dash Enterprise deployment stack.","spans":[]},{"type":"paragraph","text":"It might make sense to look into a memory-mapped data architecture for your Dash application if you have completed profiling your application and are observing some common performance problems:","spans":[]},{"type":"list-item","text":"Callbacks in the app taking very long or just timing out.","spans":[]},{"type":"list-item","text":"Maxing out RAM and CPU in the deployment environment, and upgrading your machine is not a viable option.","spans":[]},{"type":"list-item","text":"Directly reading data from a SQL warehouse that was not intended to be the back-end for a real time web application and can’t be modified to accommodate this demand.","spans":[]},{"type":"paragraph","text":"In this article, I will go through how we accomplished this in a production environment using Polars, and describe how Polars could be leveraged into your large data Dash application architecture. We’ll also review a sandboxed use case of Polars and Dash in an open-source Dash application, whose source code is available in our Github: This application uses a dataset with 65 million rows and 25 columns, and illustrates other tools and techniques like Datashader and aggregation to support visualization of that data in a browser window.","spans":[{"start":322,"end":335,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/plotly/polars-open-source-app/tree/main","target":"_blank"}},{"start":374,"end":404,"type":"strong"}]}]}],"id":"blog_section$f8fdc194-89e3-4e3d-9335-092bb64944c7","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"heading2","text":"What is Polars?","spans":[]},{"type":"image","url":"https://images.prismic.io/plotly-marketing-website-2/bbbdb242-44c1-4b7f-8664-3b884ae7616e_image8.gif?auto=compress,format","alt":"Polar Bear","copyright":null,"dimensions":{"width":337,"height":194},"id":"ZLmrtRUAAHv9-vd4","edit":{"x":0,"y":0,"zoom":1,"background":"#fff"}}]}],"id":"blog_section$91548e12-edfd-4a19-8e9c-58c0ae51f7ae","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"Polars is a dataframe query engine implemented in Rust with a Python API, it’s a great pandas alternative for when your data starts reaching millions of entries in size.","spans":[]},{"type":"paragraph","text":"The underlying data frames in Polars are based on the Apache Arrow format, and with a Rust backend. Rust is the up-and-coming favorite coding language of performance-minded programmers that promises to be fast and memory efficient.","spans":[{"start":54,"end":73,"type":"hyperlink","data":{"link_type":"Web","url":"https://arrow.apache.org/"}},{"start":86,"end":90,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.rust-lang.org/","target":"_blank"}}]}]}],"id":"blog_section$5d1643dc-723a-497b-befd-5da7a873db94","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"heading3","text":"Why is Apache Arrow good for large datasets?","spans":[]}]}],"id":"blog_section$2edf79ce-e706-4e98-aad1-99d3999841c1","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"To quote the Apache Org FAQ, Arrow is an “in-memory columnar format, a standardized, language-agnostic specification for representing structured, table-like datasets in-memory.”","spans":[]},{"type":"paragraph","text":"One great thing about Apache Arrow datasets is that there’s no serialization and deserialization between on-disk and in memory representation of them. This makes memory-mapped Arrow files super fast to read.","spans":[]},{"type":"paragraph","text":"Memory mapping is holding a representation of a file in memory to increase I/O efficiency. This would be challenging or counter productive with large datasets that are bigger than RAM size but with virtual memory on an SSD disk, and no deserialization, memory mapped Arrow files are fast to read with very little memory footprint.","spans":[{"start":0,"end":14,"type":"hyperlink","data":{"link_type":"Web","url":"https://realpython.com/python-mmap/","target":"_blank"}}]},{"type":"paragraph","text":"Another useful big data aspect of Arrow files is that they are columnar, so unlike a CSV file where you have to hold an entire row of data in memory just to access one single column, you can efficiently just read in columns you need. With wide datasets, this makes a noticeable difference in the memory footprint.","spans":[]},{"type":"paragraph","text":"There’s a brilliant explanation of why Apache Arrow is great at handling large data in this article by one of the cofounders of the Apache Arrow project.","spans":[{"start":87,"end":99,"type":"hyperlink","data":{"link_type":"Web","url":"https://wesmckinney.com/blog/apache-arrow-pandas-internals/","target":"_blank"}}]}]}],"id":"blog_section$c1b9bf16-cd26-4a3e-b612-171852178611","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"heading3","text":"Polars lazy vs eager computations","spans":[]},{"type":"image","url":"https://images.prismic.io/plotly-marketing-website-2/93759235-cb30-435a-b8b4-9ec1af2c49d2_image6.gif?auto=compress,format","alt":"Cartoon Turtle","copyright":null,"dimensions":{"width":500,"height":500},"id":"ZLmrsxUAACkA-vds","edit":{"x":0,"y":0,"zoom":1,"background":"#fff"}}]}],"id":"blog_section$1f38ef57-8027-42b5-bde7-eff520d57737","slice_type":"blog_section","slice_label":null},{"primary":{},"items":[{"parapgraph_section":[{"type":"paragraph","text":"Polars will handle your data in one of two ways. ","spans":[]},{"type":"paragraph","text":"Let’s say you want to read from a parquet file. This method will instantly load the parquet file into a Polars dataframe using the polars.read_parquet() function. This will “eagerly” compute the command, taking 6 seconds in my local jupyter notebook to run. During this time Polars decompressed and converted a parquet file to a Polars dataframe.","spans":[{"start":131,"end":152,"type":"strong"}]}]}],"id":"text_highlight$4dd01c78-42b8-418f-9a8e-7060c98e1d13","slice_type":"text_highlight","slice_label":null},{"primary":{},"items":[{"section_description":[],"code_snippet":"Import polars a pl \ndf = pl.read_parquet(\"data/fhvhv_data.parquet\")"}],"id":"blog_syntax_highlighter$e409ce16-b77c-4395-845b-f5fb4d515478","slice_type":"blog_syntax_highlighter","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"But if I use scan_parquet, the runtime is zero. What happened here? ","spans":[]}]}],"id":"blog_section$5b32e2b0-13b7-4ff0-b24b-9cb4d2babd35","slice_type":"blog_section","slice_label":null},{"primary":{},"items":[{"section_description":[],"code_snippet":"ldf = pl.scan_parquet(\"data/fhvhv_data.parquet\")"}],"id":"blog_syntax_highlighter$33218d2e-6f63-454a-98ca-bd9a7008b9e4","slice_type":"blog_syntax_highlighter","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"Well, Polars didn’t actually run any computations; it's now constructed a lazyframe based on my parquet file and is waiting for us to tell it when it’s time to collect the data, utilizing lazy loading!","spans":[]}]}],"id":"blog_section$b17e7aac-0c29-40e8-9786-fa60613259d7","slice_type":"blog_section","slice_label":null},{"primary":{},"items":[{"section_description":[],"code_snippet":"df = ldf.collect()"}],"id":"blog_syntax_highlighter$9b140981-05c8-4851-b3f1-54a634af2c24","slice_type":"blog_syntax_highlighter","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"Now when I use the collect method, data is being read from the parquet file and constructed into a Polars dataframe. This is a very powerful concept: we can build a lazyframe from all sorts of data loading and wrangling logic, and collect our data only when we need it. ","spans":[]}]}],"id":"blog_section$811a4a8c-5c61-4a11-89a3-0ca0d665eadb","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"heading3","text":"Polars expressions and data wrangling","spans":[]}]}],"id":"blog_section$006cbef0-452e-46d3-af7a-95edf84df30b","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"Polars handles data wrangling with expressions. Expression in the Polars are like functions that can be chained together and applied to a dataframe or series. When you chain a bunch of expressions and apply it to a dataset, Polars will take care of parallelizing wherever possible to run as fast as possible.","spans":[]},{"type":"paragraph","text":"It’s recommended you use lazyframes wherever possible to allow Polars to optimize on the entire process from start to end. The Polars API is easy to use once you learn the basics, it’s pretty intuitive what a Polars query is supposed to do. I’ve put together a notebook that can help you jumpstart using Polars. I also highly recommend checking out the Polars user guide.","spans":[{"start":261,"end":269,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/plotly/polars-open-source-app/blob/main/explore_data.ipynb","target":"_blank"}},{"start":360,"end":370,"type":"hyperlink","data":{"link_type":"Web","url":"https://pola-rs.github.io/polars-book/user-guide/","target":"_blank"}}]}]}],"id":"blog_section$6c42cb7d-b55c-4696-89ef-ad6d669e3dd7","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"heading2","text":"How to use Polars in a Dash application","spans":[]}]}],"id":"blog_section$d3fc6f7a-bcb4-4ba6-bfb6-f5c149b3f8e3","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"If you have large amounts of structured data in a data lake, chances are you have parquet files. Parquet is another Apache project and also a columnar data type. The big difference between parquet and Arrow is that parquet files are compressed and optimized for storage. This is a good article on the differences between Arrow and parquet if you’re curious for more, or to help you decide which file type makes sense for your application. ","spans":[{"start":162,"end":271,"type":"strong"},{"start":271,"end":275,"type":"hyperlink","data":{"link_type":"Web","url":"https://towardsdatascience.com/apache-arrow-read-dataframe-with-zero-memory-69634092b1a","target":"_blank"}}]},{"type":"paragraph","text":"Building an Arrow file from parquet files can be as simple as a few lines of code.","spans":[]}]}],"id":"blog_section$9fb38055-a51b-4b61-b8bf-112fcc6b89ae","slice_type":"blog_section","slice_label":null},{"primary":{},"items":[{"section_description":[],"code_snippet":"import polars as pl\ndf = pl.read_parquet(\"data/fhvhv_data.parquet\")\ndf.write_ipc(\"data/fhvhv_data.Arrow\")"}],"id":"blog_syntax_highlighter$3879fee4-f4c2-4aaf-bc74-7f94166f4c22","slice_type":"blog_syntax_highlighter","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"Store this Arrow file in the Dash Enterprise Persistent Filesystem for a low maintenance, fast performing large data application.","spans":[{"start":45,"end":66,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/dash/persistent-filesystem/"}}]},{"type":"paragraph","text":"Just note that depending on the nature of the underlying data, you may need to set up a data hydration process that periodically updates your Arrow file. This can be done with a scheduled task running on Celery. Also note that this hydration part will be the most memory consuming part of your Dash application as decompressing parquet files takes memory, so only do when necessary.","spans":[{"start":204,"end":210,"type":"hyperlink","data":{"link_type":"Web","url":"https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html","target":"_blank"}}]},{"type":"paragraph","text":"There’s plenty of other IO support with Polars to read in from: Avro, CSV, and many more.","spans":[{"start":79,"end":88,"type":"hyperlink","data":{"link_type":"Web","url":"https://pola-rs.github.io/polars/py-polars/html/reference/io.html","target":"_blank"}}]},{"type":"paragraph","text":"Now that we have our data reading set up, let’s go over some good use cases of Polars in Dash apps. We want to utilize what makes Polars fast and efficient by using Arrow files and lazy API.","spans":[]},{"type":"paragraph","text":"This sample project showcases how to do this, and we’ll be walking through the code from this sample app as part of this blog. Always refer to the original Polars documentation for more detailed usage guides. This app uses the NYC taxi data and we want to enable a user to browse through this data in a Dash app, filter and select what they want and then visualize some features in scatter plots.","spans":[{"start":0,"end":209,"type":"strong"},{"start":12,"end":19,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/plotly/polars-open-source-app/tree/main","target":"_blank"}},{"start":147,"end":176,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.pola.rs/","target":"_blank"}}]}]}],"id":"blog_section$7aa6e27c-7d07-4b31-837b-f9c0ac85e56c","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"image":{"dimensions":{"width":1999,"height":929},"alt":"Browse Data with Polars","copyright":null,"url":"https://images.prismic.io/plotly-marketing-website-2/7c320a72-196c-4d55-b546-e7f1e577d63e_image7.png?auto=compress,format","id":"ZLmrsRUAACkA-vdi","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"description":[],"size":null}],"id":"image___description$f793d8ac-cb1f-40e3-a475-4bf51b04adfa","slice_type":"image___description","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"So we have two main challenges: browsing large data sets then visualizing it. Let’s go over these two functions and how to utilize Polars in each case.","spans":[]}]}],"id":"blog_section$4397508c-b621-4cb9-b157-df9c4e600e21","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"heading3","text":"Polars in a Dash AG Grid table with infinite scroll","spans":[]}]}],"id":"blog_section$1758d7b2-c307-43a9-b0e6-4bd0b2d8cbd6","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"Our data set size is 65 million rows and 25 columns. ","spans":[]},{"type":"paragraph","text":"We can use a Dash AG Grid with infinite scroll to load only one page at a time in combination with a column selection modal to allow the user to add or remove columns they don’t want to see. Remember we are dealing with columnar data, not row based data, so this little modification can really improve performance.","spans":[{"start":18,"end":46,"type":"hyperlink","data":{"link_type":"Web","url":"https://dashaggrid.pythonanywhere.com/scrolling/infinite-scroll","target":"_blank"}}]},{"type":"paragraph","text":"By storing the data in an IPC Arrow file, we can use Polars in the callbacks for these applications to filter and select the necessary data in a memory efficient way.","spans":[]},{"type":"paragraph","text":"The components here are a list of checkboxes for the user to choose which columns to view and then hit an apply button:","spans":[]}]}],"id":"blog_section$18f73925-3454-4a16-b72d-91d0b2150374","slice_type":"blog_section","slice_label":null},{"primary":{},"items":[{"section_description":[],"code_snippet":"dmc.Container(\n [\n *(\n dmc.Checkbox(\n label=col,\n id={\"type\": \"checkbox\", \"field\": col},\n )\n for col in all_columns\n ),\n html.Button(\n \"apply\",\n id=\"apply-bttn\",\n ),\n ],\n ),"}],"id":"blog_syntax_highlighter$7199e37f-cd80-4ddf-aded-6096496aff9c","slice_type":"blog_syntax_highlighter","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"A Dash AG Grid with infinite row mode:","spans":[]}]}],"id":"blog_section$d699b0b8-338d-42ce-bc20-1beec5cffd8f","slice_type":"blog_section","slice_label":null},{"primary":{},"items":[{"section_description":[],"code_snippet":"dag.AgGrid(\n id=\"infinite-grid\",\n rowModelType=\"infinite\",\n enableEnterpriseModules=True,\n columnDefs=layout_utils.generate_column_defintions(),\n pagination=True,\n paginationPageSize=100,\n className=\"ag-theme-alpine-dark\",\n defaultColDef={\"filter\": True},\n ),"}],"id":"blog_syntax_highlighter$7eccb0f3-3a09-4b88-a561-2e878e7b3cfb","slice_type":"blog_syntax_highlighter","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"A dcc Store to save the current state of the filter model (more on why we do this in the next part):","spans":[]}]}],"id":"blog_section$518fde00-4ea9-4c32-9519-24932bdc120e","slice_type":"blog_section","slice_label":null},{"primary":{},"items":[{"section_description":[],"code_snippet":"dcc.Store(id=\"filter-model\"),"}],"id":"blog_syntax_highlighter$34c489f5-4286-42df-8fd1-828e25f96b98","slice_type":"blog_syntax_highlighter","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"AG Grid with infinite scroll mode, sends a request to the server with a filter model to be applied. We can translate this filter model to Polars expressions:","spans":[]}]}],"id":"blog_section$013e2e54-f75c-4021-82ca-52ddc8749bab","slice_type":"blog_section","slice_label":null},{"primary":{},"items":[{"section_description":[],"code_snippet":"def parse_column_filter(filter_obj, col_name):\n \"\"\"Build a polars filter expression based on the filter object\"\"\"\n if filter_obj[\"filterType\"] == \"set\":\n expr = None\n for val in filter_obj[\"values\"]:\n expr |= pl.col(col_name).cast(pl.Utf8).cast(pl.Categorical) == val\n else:\n if filter_obj[\"filterType\"] == \"date\":\n crit1 = filter_obj[\"dateFrom\"]\n\n\n if \"dateTo\" in filter_obj:\n crit2 = filter_obj[\"dateTo\"]\n\n\n else:\n if \"filter\" in filter_obj:\n crit1 = filter_obj[\"filter\"]\n if \"filterTo\" in filter_obj:\n crit2 = filter_obj[\"filterTo\"]\n\n\n if filter_obj[\"type\"] == \"contains\":\n lower = (crit1).lower()\n expr = pl.col(col_name).str.to_lowercase().str.contains(lower)\n\n\n elif filter_obj[\"type\"] == \"notContains\":\n lower = (crit1).lower()\n expr = ~pl.col(col_name).str.to_lowercase().str.contains(lower)\n elif filter_obj[\"type\"] == \"startsWith\":\n lower = (crit1).lower()\n expr = pl.col(col_name).str.starts_with(lower)\n\n\n elif filter_obj[\"type\"] == \"notStartsWith\":\n lower = (crit1).lower()\n expr = ~pl.col(col_name).str.starts_with(lower)\n\n\n elif filter_obj[\"type\"] == \"endsWith\":\n lower = (crit1).lower()\n expr = pl.col(col_name).str.ends_with(lower)\n\n\n elif filter_obj[\"type\"] == \"notEndsWith\":\n lower = (crit1).lower()\n expr = ~pl.col(col_name).str.ends_with(lower)\n\n\n elif filter_obj[\"type\"] == \"blank\":\n expr = pl.col(col_name).is_null()\n\n\n elif filter_obj[\"type\"] == \"notBlank\":\n expr = ~pl.col(col_name).is_null()\n\n\n elif filter_obj[\"type\"] == \"equals\":\n expr = pl.col(col_name) == crit1\n\n\n elif filter_obj[\"type\"] == \"notEqual\":\n expr = pl.col(col_name) != crit1\n\n\n elif filter_obj[\"type\"] == \"lessThan\":\n expr = pl.col(col_name) \u003c crit1\n\n\n elif filter_obj[\"type\"] == \"lessThanOrEqual\":\n expr = pl.col(col_name) \u003c= crit1\n\n\n elif filter_obj[\"type\"] == \"greaterThan\":\n expr = pl.col(col_name) \u003e crit1\n\n\n elif filter_obj[\"type\"] == \"greaterThanOrEqual\":\n expr = pl.col(col_name) \u003e= crit1\n\n\n elif filter_obj[\"type\"] == \"inRange\":\n if filter_obj[\"filterType\"] == \"date\":\n expr = (pl.col(col_name) \u003e= crit1) \u0026 (pl.col(col_name) \u003c= crit2)\n else:\n expr = (pl.col(col_name) \u003e= crit1) \u0026 (pl.col(col_name) \u003c= crit2)\n else:\n None\n\n\n return expr"}],"id":"blog_syntax_highlighter$812ede61-cbbe-4ea5-b680-9b29a5e29ee6","slice_type":"blog_syntax_highlighter","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"We can then apply these expressions to a lazyframe:","spans":[]}]}],"id":"blog_section$9b1cdd19-05aa-4f06-b0e7-60a0f024f246","slice_type":"blog_section","slice_label":null},{"primary":{},"items":[{"section_description":[],"code_snippet":"def scan_ldf(\n filter_model=None,\n columns=None,\n sort_model=None,\n):\n ldf = DATA_SOURCE\n if columns:\n ldf = ldf.select(columns)\n if filter_model:\n expression_list = make_filter_expr_list(filter_model)\n if expression_list:\n filter_query = None\n for expr in expression_list:\n if filter_query is None:\n filter_query = expr\n else:\n filter_query \u0026= expr\n ldf = ldf.filter(filter_query)\n return ldf"}],"id":"blog_syntax_highlighter$63962e32-6001-47e9-a63f-fa38e5af18d1","slice_type":"blog_syntax_highlighter","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"Finally, we’ll use these functions to query the Arrow file and retrieve data inside our callback, slice based on start and end row, and then convert the end result to pandas for the return statement.","spans":[]}]}],"id":"blog_section$7fa22af5-2c60-4007-b0c8-5113376b45ea","slice_type":"blog_section","slice_label":null},{"primary":{},"items":[{"section_description":[],"code_snippet":"@app.callback(\n Output(\"infinite-grid\", \"getRowsResponse\"),\n Output(\"filter-model\", \"data\"),\n Input(\"infinite-grid\", \"getRowsRequest\"),\n Input(\"infinite-grid\", \"columnDefs\"),\n manager=long_callback_manager,\n)\ndef infinite_scroll(request, columnDefs):\n if request is None:\n raise PreventUpdate\n columns = [col[\"field\"] for col in columnDefs]\n ldf = scan_ldf(filter_model=request[\"filterModel\"], columns=columns)\n df = ldf.collect()\n partial = df.slice(request[\"startRow\"], request[\"endRow\"]).to_pandas()\n\n\n return {\n \"rowData\": partial.to_dict(\"records\"),\n \"rowCount\": len(df),\n }, request[\"filterModel\"]"}],"id":"blog_syntax_highlighter$a72e1037-ca22-4346-a15d-7af1ba6911bd","slice_type":"blog_syntax_highlighter","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"heading3","text":"Aggregate data for rasterized plots","spans":[]}]}],"id":"blog_section$52a4ccbe-04a5-4f6f-8383-9489e5c8311e","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"Remember the filter-model we stored in the last callback? It’s time to utilize it for visualizations and make some plots!","spans":[]}]}],"id":"blog_section$8eac3f63-58b3-4f9c-82a5-c92295ff792f","slice_type":"blog_section","slice_label":null},{"primary":{},"items":[{"section_description":[],"code_snippet":"dcc.Store(id=\"filter-model\"),\n dmc.Group(\n [\n dmc.Button(\n \"re-run visualizations\",\n id=\"viz-bttn\",\n ),\n ],\n ),\n dmc.Group(\n [\n html.Div(\n dcc.Graph(\n id=\"mileage-time-graph\",\n ),\n ),\n html.Div(\n dcc.Graph(\n id=\"request-dropoff-graph\",\n ),\n ),\n ]\n ),"}],"id":"blog_syntax_highlighter$8eccac5f-d897-48e0-b806-476ce0cc046e","slice_type":"blog_syntax_highlighter","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"Let’s strategize. By default we have 6 million rows, putting this much data in a scatter plot could crash your browser. We can check the size of our dataset and aggregate on our target columns if it’s too big:","spans":[]}]}],"id":"blog_section$fd3aece0-0c90-4027-a68f-89a935cdab35","slice_type":"blog_section","slice_label":null},{"primary":{},"items":[{"section_description":[],"code_snippet":"def aggregate_on_pay_tip(ldf):\n results = (\n ldf.with_columns(\n [\n pl.col(\"driver_pay\").round(0).alias(\"rounded_driver_pay\"),\n pl.col(\"tips\").round(0).alias(\"rounded_tips\"),\n ]\n )\n .collect()\n .groupby([\"rounded_driver_pay\", \"rounded_tips\"])\n .count()\n )\n return results"}],"id":"blog_syntax_highlighter$7179f03f-e79c-4f05-9a24-aab80439e896","slice_type":"blog_syntax_highlighter","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"What if even an aggregation is still too large? We can use a rasterized plot in these cases. This means rendering of a visualization is happening server side and a flat image is passed back to the browser instead of an SVG with vectors representing each data point. This type of plot, although less interactive by a user, is great for visualizing large datasets that would otherwise crash a web browser on regular plots.","spans":[]}]}],"id":"blog_section$3c5c792b-796a-4426-8ebe-54077264a5b3","slice_type":"blog_section","slice_label":null},{"primary":{},"items":[{"section_description":[],"code_snippet":"def generate_data_shader_plot(df, x_label, y_label):\n cvs = ds.Canvas(plot_width=100, plot_height=100)\n agg = cvs.points(df.to_pandas(), x=x_label, y=y_label)\n zero_mask = agg.values == 0\n agg.values = np.log10(agg.values, where=np.logical_not(zero_mask))\n agg.values[zero_mask] = np.nan\n fig = px.imshow(agg, origin=\"lower\", labels={\"color\": \"Log10(count)\"}, color_continuous_scale='solar')\n fig.update_traces(hoverongaps=False)\n fig.update_layout(coloraxis_colorbar=dict(title=\"Count\", tickprefix=\"1.e\",), font=dict(color=\"#FFFFFF\"), paper_bgcolor=\"#23262E\", plot_bgcolor=\"#23262E\",)\n return fig"}],"id":"blog_syntax_highlighter$c1360ed8-4441-464a-988b-2f9760200b55","slice_type":"blog_syntax_highlighter","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"So the final callback can be something like the following. With Polars, we can query the data quickly and efficiently:","spans":[]},{"type":"list-item","text":"If the data size is too big, aggregate it to have fewer rows.","spans":[]},{"type":"list-item","text":"If our aggregation is still too big, generate a rasterized plot using Datashader. ","spans":[]},{"type":"list-item","text":"In all other cases, we can generate a good old scatter plot for the user to view and interact with.","spans":[]}]}],"id":"blog_section$a251b873-dabd-4e7c-a652-9d7f42577331","slice_type":"blog_section","slice_label":null},{"primary":{},"items":[{"section_description":[],"code_snippet":"@app.callback(\n Output(\"mileage-time-graph\", \"figure\"),\n Output(\"request-dropoff-graph\", \"figure\"),\n State(\"filter-model\", \"data\"),\n Input(\"viz-bttn\", \"n_clicks\"),\n manager=long_callback_manager,\n)\ndef visualize(filter_model, n_clicks):\n columns = [\"trip_time\", \"trip_miles\", \"driver_pay\", \"tips\"]\n if filter_model:\n columns_to_filter = [col for col in filter_model]\n columns = list(set([*columns_to_filter, *columns]))\n ldf = scan_ldf(filter_model=filter_model, columns=columns)\n df = ldf.collect()\n if len(df) \u003e 20000:\n agg1 = aggregate_on_trip_distance_time(ldf)\n if len(agg1) \u003c 20000:\n fig1 = generate_scatter_go(agg1, \"rounded_time\", \"rounded_miles\")\n else:\n fig1 = generate_data_shader_plot(agg1, \"rounded_time\", \"rounded_miles\")\n\n\n agg2 = aggregate_on_pay_tip(ldf)\n if len(agg2) \u003c 25000:\n fig2 = generate_scatter_go(agg2, \"rounded_driver_pay\", \"rounded_tips\")\n else:\n fig2 = generate_data_shader_plot(agg2, \"rounded_driver_pay\", \"rounded_tips\")\n return fig1, fig2\n else:\n fig1 = generate_scatter_go(df, \"trip_time\", \"trip_miles\")\n fig2 = generate_scatter_go(df, \"driver_pay\", \"tips\")\n return fig1, fig2"}],"id":"blog_syntax_highlighter$35c638f7-68a2-4d1f-add5-2d82c831d4be","slice_type":"blog_syntax_highlighter","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"Here’s the resulting visualization for 49 million rows of data. The miles vs time plot ends up being rasterized and the tips vs driver pay is a scatter plot of the aggregated data:","spans":[]}]}],"id":"blog_section$838d2856-8b5e-4f32-8094-d63e0af9bbc9","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"image":{"dimensions":{"width":1999,"height":639},"alt":"Visualizing large data sets with Polars","copyright":null,"url":"https://images.prismic.io/plotly-marketing-website-2/f1c6c10c-3c49-425e-9725-83f37081297c_image4.png?auto=compress,format","id":"ZLmrsRUAACkA-vdh","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"description":[],"size":null}],"id":"image___description$a7a2036e-5835-41dc-9acc-0e7273c7a1c3","slice_type":"image___description","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"heading2","text":"Polars with Plotly Express","spans":[]}]}],"id":"blog_section$5d808110-35a7-40ae-94bc-ffdd7320398e","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"In the previous examples, Polars was used for data wrangling in Dash callbacks, and then the resulting Polars dataframes were converted to either a Pandas dataframe, numpy or python list before passing as an argument to the Plotly figure.","spans":[]},{"type":"paragraph","text":"As of the latest Plotly python graphing library (v5.16) you can directly pass a Polars DataFrame to Plotly Express.","spans":[{"start":64,"end":96,"type":"hyperlink","data":{"link_type":"Web","url":"https://github.com/plotly/plotly.py/blob/master/doc/python/px-arguments.md#input-data-as-non-pandas-dataframes","target":"_blank"}}]}]}],"id":"blog_section$b1873809-baf9-4043-950b-d159cf0e0bbd","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"heading2","text":"Wrap Up","spans":[]}]}],"id":"blog_section$d086031b-2c15-4387-ac04-8803530113bc","slice_type":"blog_section","slice_label":null},{"primary":{"user_story":false},"items":[{"section":[{"type":"paragraph","text":"We went over what Polars is and why it’s good at handling large data. We also went through two very common, real use cases that come up in Dash applications that can utilize Polars for better performance. I’m sure you’ll find many more ways to implement this library with Dash applications as you dive deeper.","spans":[]},{"type":"paragraph","text":"Thinking back to the equity firm that started us down this path, the intended purpose of the Dash application was to leverage the firm’s existing wealth of company data — spanning across the world and all industry sectors, and create an exploratory tool for their team to identify potential companies to invest in.","spans":[]},{"type":"paragraph","text":"Before the Professional Services team was involved, this data existed solely in a Redshift database and investment strategists would have to request specific filters/search parameters which the data team would then use to query the dataset to acquire Excel documents with the requested companies.","spans":[]},{"type":"paragraph","text":"The Dash application is built utilizing Polars for back-end data handling and is now deployed to Dash Enterprise.","spans":[]},{"type":"paragraph","text":"User feedback suggests that the app overall has been a great improvement to their BI workflows, by simplifying this process by providing a platform for their investment team to discover companies, save those companies to lists for future consideration, and share saved companies with colleagues for a more collaborative process — all in one place.","spans":[]},{"type":"paragraph","text":"","spans":[]},{"type":"paragraph","text":"(Image sources: Giphy @gifnews, Reddit)","spans":[{"start":0,"end":39,"type":"em"}]}]}],"id":"blog_section$f424e293-a1a2-41bc-aacc-9d0c001b4553","slice_type":"blog_section","slice_label":null}],"seo_title":[{"type":"paragraph","text":"How Polars Can Help You Build Fast Dash Apps for Large Datasets","spans":[]}],"seo_description":[{"type":"paragraph","text":"Discover the power of leveraging Polars in lightning-fast Dash apps for visualizing and analyzing large data sets in your production environment.","spans":[]}],"seo_keywords":null,"seo_link":[{"type":"paragraph","text":"blog/polars-to-build-fast-dash-apps-for-large-datasets","spans":[]}],"canonical_url":null,"twitter_title":[{"type":"paragraph","text":"How Polars Can Help You Build Fast Dash Apps for Large Datasets","spans":[]}],"twitter_description":[{"type":"paragraph","text":"Discover the power of leveraging Polars in lightning-fast Dash apps for visualizing and analyzing large data sets in your production environment.","spans":[]}],"twitter_image":{"dimensions":{"width":1000,"height":565},"alt":"Polars","copyright":null,"url":"https://images.prismic.io/plotly-marketing-website-2/2868553c-8db0-4ff1-9ea7-4cb34c0ed335_Polars+%281%29.png?auto=compress,format","id":"ZLmrbhUAACgA-vY4","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"twitter_card":[{"type":"paragraph","text":"summary_large_image","spans":[]}],"twitter_site":[{"type":"paragraph","text":"@plotlygraphs","spans":[]}],"twitter_creator":[{"type":"paragraph","text":"plotly","spans":[]}],"og_title":[{"type":"paragraph","text":"How Polars Can Help You Build Fast Dash Apps for Large Datasets","spans":[]}],"og_description":[{"type":"paragraph","text":"Discover the power of leveraging Polars in lightning-fast Dash apps for visualizing and analyzing large data sets in your production environment.","spans":[]}],"og_url":[{"type":"paragraph","text":"blog/polars-to-build-fast-dash-apps-for-large-datasets","spans":[]}],"og_image":{"dimensions":{"width":1000,"height":565},"alt":"Polars","copyright":null,"url":"https://images.prismic.io/plotly-marketing-website-2/2868553c-8db0-4ff1-9ea7-4cb34c0ed335_Polars+%281%29.png?auto=compress,format","id":"ZLmrbhUAACgA-vY4","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"breadscrumbs":[{"breadcrumb_position":[{"type":"paragraph","text":"1","spans":[]}],"breadcrumbs_name":[{"type":"paragraph","text":"Blog","spans":[]}],"breadcrumbs_url":[{"type":"paragraph","text":"https://plotly.com/blog/","spans":[]}]},{"breadcrumb_position":[{"type":"paragraph","text":"2","spans":[]}],"breadcrumbs_name":[{"type":"paragraph","text":"How Polars Can Help You Build Fast Dash Apps for Large Datasets","spans":[]}],"breadcrumbs_url":[{"type":"paragraph","text":"https://plotly.com/blog/polars-to-build-fast-dash-apps-for-large-datasets/","spans":[]}]}],"body1":[]}},"mainFooterData":{"id":"YXkfsxIAACQANKAQ","uid":"footer","url":null,"type":"footer","href":"https://plotly-marketing-website-2.cdn.prismic.io/api/v2/documents/search?ref=Z0ZkvREAACAAtL1G\u0026q=%5B%5B%3Ad+%3D+at%28document.id%2C+%22YXkfsxIAACQANKAQ%22%29+%5D%5D","tags":[],"first_publication_date":"2021-10-27T09:45:27+0000","last_publication_date":"2024-09-17T21:24:47+0000","slugs":["footer"],"linked_documents":[],"lang":"en-us","alternate_languages":[],"data":{"logo":{"dimensions":{"width":300,"height":83},"alt":"Plotly","copyright":null,"url":"https://images.prismic.io/plotly-marketing-website-2/8f977c91-7b4e-4367-8228-26fbba2506e4_69e12d6a-fb65-4b6e-8423-9465a29c6028_plotly-logo-sm.png?auto=compress,format","id":"Yw7PUBAAACcAH7ra","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"logo_light":{"dimensions":{"width":300,"height":83},"alt":"Plotly","copyright":null,"url":"https://plotly-marketing-website-2.cdn.prismic.io/plotly-marketing-website-2/b3d3a2b1-49f9-4e74-93dc-070b266a54ba_plotly_logo.svg","id":"YtkLkBEAAIFVEe01","edit":{"x":0,"y":0,"zoom":1,"background":"#fff"}},"heading":"Sign up for updates","heading_smaller_size":"SUBSCRIBE TO PLOTLY","sub_heading":"We wouldn't dream of spamming you or selling your info.","rich_text_field":[{"type":"paragraph","text":"Plotly is based on Tioh’tia:ke, commonly known in English as Montreal Island, in Kanien’ke-há:ka, the “Place of the People of the Flint” (the Kanien’kéha).","spans":[]},{"type":"paragraph","text":"Plotly is committed to making the tech industry more accessible to people from different cultures, as well as using and encouraging the use of our technology for anti-racist efforts. For our complete land acknowledgement and resources to learn about settlement and contribute to Indigenous activism, visit our About Us page.","spans":[{"start":310,"end":323,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/about-us/"}}]}],"year":true,"rights":[{"type":"paragraph","text":"Plotly. All rights reserved.","spans":[]}],"footer_links":[{"label":[{"type":"paragraph","text":"Privacy","spans":[]}],"link":{"id":"YajULxMAACIAyM87","type":"pages","tags":[],"lang":"en-us","slug":"i.-the-information-we-collect","first_publication_date":"2021-12-02T14:12:05+0000","last_publication_date":"2022-11-02T14:37:23+0000","uid":"privacy","link_type":"Document","isBroken":false}}],"body":[{"primary":{"label":"Products \u0026 Services"},"items":[{"label":"Dash Enterprise","links":{"id":"YbAkPBAAACEAzqkL","type":"pages","tags":[],"lang":"en-us","slug":"overview-of-dash--dash-apps","first_publication_date":"2021-12-08T03:20:07+0000","last_publication_date":"2024-11-13T18:40:45+0000","uid":"dash","link_type":"Document","isBroken":false},"badge":[]},{"label":"Plotly App Studio","links":{"link_type":"Web","url":"https://plotly.com/dash/app-studio/"},"badge":[]},{"label":"Chatbot Builder","links":{"link_type":"Web","url":"https://plotly.com/dash/chatbot-builder/"},"badge":[]},{"label":"Data App Workspaces","links":{"id":"YXtovREAACIACldD","type":"dash_pages","tags":[],"lang":"en-us","slug":"about-data-app-workspaces","first_publication_date":"2021-10-29T03:21:36+0000","last_publication_date":"2024-02-03T00:31:57+0000","uid":"workspaces","link_type":"Document","isBroken":false},"badge":[]},{"label":"Design Kit","links":{"id":"YXgEKRIAACQAL-ae","type":"dash_pages","tags":[],"lang":"en-us","slug":"about-design-kit","first_publication_date":"2021-10-26T13:35:58+0000","last_publication_date":"2024-11-19T16:06:13+0000","uid":"design-kit","link_type":"Document","isBroken":false},"badge":[]},{"label":"Snapshot Engine","links":{"id":"YXEspxQAACkANhuF","type":"dash_pages","tags":[],"lang":"en-us","slug":"about-snapshot-engine","first_publication_date":"2021-10-21T09:06:32+0000","last_publication_date":"2024-03-27T23:21:10+0000","uid":"snapshot-engine","link_type":"Document","isBroken":false},"badge":[]},{"label":"App Manager","links":{"id":"YXwMYxEAACQADSqk","type":"dash_pages","tags":[],"lang":"en-us","slug":"about-app-manager","first_publication_date":"2021-10-29T14:59:51+0000","last_publication_date":"2024-02-03T00:18:23+0000","uid":"app-manager","link_type":"Document","isBroken":false},"badge":[]},{"label":"Centralized Development","links":{"id":"ZUlV2RYAACIAgSdu","type":"dash_pages","tags":[],"lang":"en-us","slug":"multiple-teams.-one-single-platform.","first_publication_date":"2023-11-08T01:20:55+0000","last_publication_date":"2024-08-28T20:43:34+0000","uid":"centralized-data-app-management","link_type":"Document","isBroken":false},"badge":[]},{"label":"Job Queue","links":{"id":"YZOS3BEAACEANAWv","type":"dash_pages","tags":[],"lang":"en-us","slug":"about-job-queue","first_publication_date":"2021-11-16T11:16:34+0000","last_publication_date":"2024-03-28T19:24:30+0000","uid":"job-queue","link_type":"Document","isBroken":false},"badge":[]},{"label":"Embedding","links":{"id":"YXnYAhEAACQAAzyH","type":"dash_pages","tags":[],"lang":"en-us","slug":"about-embedding-middleware","first_publication_date":"2021-10-27T22:53:25+0000","last_publication_date":"2024-02-03T00:33:42+0000","uid":"embedding","link_type":"Document","isBroken":false},"badge":[]},{"label":"Authentication Middleware","links":{"id":"YZr_ohEAACIAVToz","type":"dash_pages","tags":[],"lang":"en-us","slug":"about-authentication-middleware","first_publication_date":"2021-11-22T02:28:37+0000","last_publication_date":"2024-02-03T00:32:43+0000","uid":"authentication","link_type":"Document","isBroken":false},"badge":[]},{"label":"ChatGPT Integration","links":{"id":"ZInwchIAAB8Af1b1","type":"dash_pages","tags":[],"lang":"en-us","slug":"dash-and-chatgpt-for-geospatial-use-cases","first_publication_date":"2023-06-19T21:52:12+0000","last_publication_date":"2024-08-16T19:37:12+0000","uid":"chatgpt","link_type":"Document","isBroken":false},"badge":[]},{"label":"Customer Success","links":{"link_type":"Web","url":"https://plotly.com/customer-success/"},"badge":[]},{"label":"Professional Services","links":{"id":"Ya7QVxMAACIA43YL","type":"pages","tags":[],"lang":"en-us","slug":"data-app-development","first_publication_date":"2021-12-07T03:09:55+0000","last_publication_date":"2023-08-29T20:11:45+0000","uid":"consulting-and-oem","link_type":"Document","isBroken":false},"badge":[]}],"id":"menu$5290647d-f657-4a88-b192-fcb4e03d6c0c","slice_type":"menu","slice_label":null},{"primary":{"label":"DOCS"},"items":[{"label":"Dash Enterprise","links":{"link_type":"Web","url":"https://dash.plotly.com/dash-enterprise","target":"_blank"},"badge":[]},{"label":"Dash Open Source","links":{"link_type":"Web","url":"https://dash.plotly.com/","target":"_blank"},"badge":[]},{"label":"Graphing Libraries","links":{"link_type":"Web","url":"https://plotly.com/graphing-libraries/","target":"_blank"},"badge":[]},{"label":"Community","links":{"link_type":"Web","url":"https://community.plotly.com/","target":"_blank"},"badge":[]},{"label":"Example apps","links":{"link_type":"Web","url":"https://plotly.com/examples/"},"badge":[]}],"id":"menu$46f3e9a2-ac40-4fb8-8c1d-786f1aafecc3","slice_type":"menu","slice_label":null},{"primary":{"label":"Resources"},"items":[{"label":"User Stories","links":{"link_type":"Web","url":"https://plotly.com/user-stories/"},"badge":[]},{"label":"Events","links":{"link_type":"Web","url":"https://plotly.com/events/"},"badge":[]},{"label":"Webinars","links":{"link_type":"Web","url":"https://plotly.com/resources/webinars/"},"badge":[]},{"label":"Blog","links":{"link_type":"Web","url":"https://plotly.com/blog/"},"badge":[]},{"label":"White Papers","links":{"link_type":"Web","url":"https://plotly.com/resources/"},"badge":[]}],"id":"menu$f240b9af-08ae-44f5-90dd-f3d4dc410a47","slice_type":"menu","slice_label":null},{"primary":{"label":"Solutions"},"items":[{"label":"Databricks","links":{"link_type":"Web","url":"https://plotly.com/dash/databricks/"},"badge":[]},{"label":"Snowflake","links":{"link_type":"Web","url":"https://plotly.com/dash/snowflake/"},"badge":[]},{"label":"Financial Services","links":{"link_type":"Web","url":"https://plotly.com/solutions/finance/"},"badge":[]},{"label":"Healthcare \u0026 Life Sciences","links":{"link_type":"Web","url":"https://plotly.com/solutions/healthcare-life-sciences-pharma/"},"badge":[]},{"label":"Energy \u0026 Utilities","links":{"link_type":"Web","url":"https://plotly.com/solutions/energy/"},"badge":[]}],"id":"menu$645af7bd-00c3-4e94-8d84-d48f657762af","slice_type":"menu","slice_label":null},{"primary":{"label":"COMPANY"},"items":[{"label":"About Us","links":{"id":"YanRFBMAACIAzUNF","type":"pages","tags":[],"lang":"en-us","slug":"2013-2014","first_publication_date":"2021-12-03T08:11:04+0000","last_publication_date":"2024-11-06T21:48:23+0000","uid":"about-us","link_type":"Document","isBroken":false},"badge":[]},{"label":"Careers","links":{"id":"YaoM9hMAACAAzlYs","type":"pages","tags":[],"lang":"en-us","slug":"autonomy","first_publication_date":"2021-12-03T12:26:33+0000","last_publication_date":"2024-11-26T19:48:02+0000","uid":"careers","link_type":"Document","isBroken":false},"badge":[{"type":"paragraph","text":"WE ARE HIRING","spans":[]}]},{"label":"Contact Us","links":{"id":"YanysBMAACIAzd-_","type":"pages","tags":[],"lang":"en-us","slug":"contact-us","first_publication_date":"2021-12-03T10:37:04+0000","last_publication_date":"2024-10-25T21:54:27+0000","uid":"contact-us","link_type":"Document","isBroken":false},"badge":[]},{"label":"Press \u0026 News","links":{"link_type":"Web","url":"https://plotly.com/news/"},"badge":[]}],"id":"menu$bc5f8046-a88a-42d7-8a2c-ca5daefa988c","slice_type":"menu","slice_label":null}],"social_links":[{"image":{"dimensions":{"width":18,"height":14},"alt":"Medium","copyright":null,"url":"https://images.prismic.io/plotly-marketing-website-2/bbf396b3-2fd4-4d8d-ad5a-75ad717fc426_Vector.png?auto=compress,format","id":"YcBCBBAAACQArP35","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"link":[{"type":"paragraph","text":"https://medium.com/plotly","spans":[]}]},{"image":{"dimensions":{"width":18,"height":14},"alt":"Twitter","copyright":null,"url":"https://images.prismic.io/plotly-marketing-website-2/d4a91c22-fb05-4194-995a-4cb172f3f439_Vector-1.png?auto=compress,format","id":"YcBCBRAAACEArP38","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"link":[{"type":"paragraph","text":"https://twitter.com/plotlygraphs","spans":[]}]},{"image":{"dimensions":{"width":18,"height":18},"alt":"Github","copyright":null,"url":"https://images.prismic.io/plotly-marketing-website-2/335997cd-a91c-48c5-9958-bc7c48237233_Vector-2.png?auto=compress,format","id":"YcBCBBAAACQArP34","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"link":[{"type":"paragraph","text":"https://github.com/plotly","spans":[]}]},{"image":{"dimensions":{"width":19,"height":19},"alt":"Instagram","copyright":null,"url":"https://images.prismic.io/plotly-marketing-website-2/11374ad5-fc84-4e77-8668-e3e2b9543d3c_Group.png?auto=compress,format","id":"YcBCBBAAACMArP37","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"link":[{"type":"paragraph","text":"https://www.instagram.com/plotly/","spans":[]}]},{"image":{"dimensions":{"width":19,"height":18},"alt":"Facebook","copyright":null,"url":"https://images.prismic.io/plotly-marketing-website-2/624ef182-7abc-4961-9384-3ea952c48cf7_Vector-3.png?auto=compress,format","id":"YcBCBBAAACIArP36","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"link":[{"type":"paragraph","text":"https://www.facebook.com/Plotly/","spans":[]}]},{"image":{"dimensions":{"width":19,"height":19},"alt":"Linkedin","copyright":null,"url":"https://images.prismic.io/plotly-marketing-website-2/afce3119-714c-4698-a5cb-b3b713eb06e2_Vector-4.png?auto=compress,format","id":"YcBCBBAAACQArP33","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"link":[{"type":"paragraph","text":"https://www.linkedin.com/company/plotly/","spans":[{"start":0,"end":40,"type":"hyperlink","data":{"link_type":"Web","url":"https://www.google.com/url?q=https://www.linkedin.com/company/plotly/\u0026sa=D\u0026source=editors\u0026ust=1653441568926187\u0026usg=AOvVaw0_5yUJIdzfEN20tIA3Rwua","target":"_blank"}}]}]}]}},"searchData":[[{"uid":"user-stories","type":"pages","seo_title":[{"type":"paragraph","text":"User Stories","spans":[]}],"seo_description":[{"type":"paragraph","text":"Read in-depth user stories and examples of how Plotly customers build, deploy, and scale professional data applications with Dash Enterprise.","spans":[]}]},{"uid":"resources","type":"pages","seo_title":[{"type":"paragraph","text":"Resources","spans":[]}],"seo_description":[{"type":"paragraph","text":"Access a curated selection of user stories, white papers, and how-to guides from data science experts and industry leaders. Start your data app journey today.","spans":[]}]},{"uid":"blog","type":"pages","seo_title":[{"type":"paragraph","text":"Blog","spans":[]}],"seo_description":[{"type":"paragraph","text":"Data science and analytics best practices, trends, success stories, and expert-curated tutorials for modern data teams and leaders.","spans":[]}]},{"uid":"dash","type":"pages","seo_title":[{"type":"paragraph","text":"Dash Enterprise: The Premier Data App Platform for Python","spans":[]}],"seo_description":[{"type":"paragraph","text":"Dash is a framework for building data apps in Python. Dash Enterprise simplifies the development and deployment process in a secure, scalable environment.","spans":[]}]},{"uid":"events","type":"pages","seo_title":[{"type":"paragraph","text":"Plotly Community Events, Webinars, and Conferences","spans":[]}],"seo_description":[{"type":"paragraph","text":"We love connecting with the data community, in-person and online! Explore upcoming Plotly community events, webinars, and conferences around the world.","spans":[]}]},{"uid":"careers","type":"pages","seo_title":[{"type":"paragraph","text":"Plotly Careers","spans":[]}],"seo_description":[{"type":"paragraph","text":"Plotly's company culture focuses on autonomy, trust, and data. Join the remote-first team pioneering analytic innovation and leading the data app industry.","spans":[]}]},{"uid":"whats-new","type":"pages","seo_title":[{"type":"paragraph","text":"What's new | Plotly","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Discover the latest updates in Dash Enterprise, Dash Open Source, and Plotly Graphing Library — new product features, enhancements, and more","spans":[],"direction":"ltr"}]},{"uid":"discuss-your-use-case","type":"pages","seo_title":[{"type":"paragraph","text":"Discuss Your Use Case","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Discuss your use case with a Plotly expert. Learn how industry leaders are solving the toughest challenges with custom data apps powered by Plotly Dash Enterprise.","spans":[],"direction":"ltr"}]},{"uid":"get-pricing","type":"pages","seo_title":[{"type":"paragraph","text":"Get Pricing","spans":[]}],"seo_description":[{"type":"paragraph","text":"Discover how leading businesses put data and AI to work, through production data apps. Request a custom price-quote.","spans":[],"direction":"ltr"}]},{"uid":"chart-studio-updates","type":"pages","seo_title":[{"type":"paragraph","text":"Sunsetting Chart Studio Cloud User Accounts","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Important updates to Chart Studio Cloud regarding user accounts, starting on November 8, 2024.","spans":[],"direction":"ltr"}]},{"uid":"examples","type":"pages","seo_title":[{"type":"paragraph","text":"Plotly Dash App Examples","spans":[]}],"seo_description":[{"type":"paragraph","text":"Combined with Python, Plotly Dash delivers interactive, customizable data apps. Explore examples in a wide range of industries and advanced analytic needs.","spans":[]}]},{"uid":"contact-us","type":"pages","seo_title":[{"type":"paragraph","text":"Contact Us","spans":[]}],"seo_description":[{"type":"paragraph","text":"Have a question about Plotly or want to know how to get started with Dash? Share feedback in this form, and a member of the our team will get in touch soon.","spans":[]}]},{"uid":"contact-sales","type":"pages","seo_title":[{"type":"paragraph","text":"Contact Sales","spans":[]}],"seo_description":[{"type":"paragraph","text":"Have a question about Plotly or want to know how to get started with Dash Enterprise? Fill out this form, and a member of the our team will get in touch soon.","spans":[]}]},{"uid":"about-us","type":"pages","seo_title":[{"type":"paragraph","text":"About Plotly","spans":[]}],"seo_description":[{"type":"paragraph","text":"Headquartered in Montreal with a remote-first team, Plotly is dedicated to ensuring that every organization uses Dash Enterprise to build data applications.","spans":[]}]},{"uid":"get-demo","type":"pages","seo_title":[{"type":"paragraph","text":"Get Demo","spans":[]}],"seo_description":[{"type":"paragraph","text":"Go from data exploration to actionable insight faster. Schedule a demo to learn how Dash Enterprise enables powerful, customizable, interactive data apps.","spans":[]}]},{"uid":"security","type":"pages","seo_title":[{"type":"paragraph","text":"Security at Plotly","spans":[]}],"seo_description":[{"type":"paragraph","text":"Build, deploy, and scale professional data applications with airtight security, for confident, data-driven decisions across the organization.","spans":[]}]},{"uid":"news","type":"pages","seo_title":[{"type":"paragraph","text":"Press \u0026 News","spans":[]}],"seo_description":[{"type":"paragraph","text":"As a category-defining leader in enabling data-driven decisions, Plotly is frequently featured in the news. Explore recent articles, podcasts, and blog posts.","spans":[]}]},{"uid":"dash-enterprise-terms-of-use","type":"pages","seo_title":[{"type":"paragraph","text":"Dash Enterprise Terms of Use","spans":[]}],"seo_description":[{"type":"paragraph","text":"Review the Dash Enterprise Terms of Use and gain a thorough understanding of Plotly's policies, to ensure compliance and effective utilization","spans":[]}]},{"uid":"customer-success","type":"pages","seo_title":[{"type":"paragraph","text":"Customer Success","spans":[]}],"seo_description":[{"type":"paragraph","text":"Plotly Customer Success empowers Dash Enterprise customers to drive insight and decision-making with data. The award-winning team offers support, enablement sessions, technical account management, and more.","spans":[]}]},{"uid":"comparing-dash-tableau-powerbi-einstein-analytics","type":"pages","seo_title":[{"type":"paragraph","text":"Dash Enterprise for Python vs Common BI Software","spans":[]}],"seo_description":[{"type":"paragraph","text":"Compare Dash Enterprise, Tableau, Power BI, and Einstein Analytics. See the differences in deployment process, ease of use, security, support, and more.","spans":[]}]},{"uid":"dash-enterprise-faq","type":"pages","seo_title":[{"type":"paragraph","text":"Dash Enterprise FAQ","spans":[]}],"seo_description":[{"type":"paragraph","text":"Find answers to common questions you may have about Dash Enterprise, including migration, installation, deployment, and licensing.","spans":[]}]},{"uid":"consulting-and-oem","type":"pages","seo_title":[{"type":"paragraph","text":"Consulting, Training \u0026 Open-Source Development","spans":[]}],"seo_description":[{"type":"paragraph","text":"Plotly Professional Services are experts in delivering future-proof data apps. From custom development to workshops, they can support your analytics needs.","spans":[]}]},{"uid":"comparing-dash-shiny-streamlit","type":"pages","seo_title":[{"type":"paragraph","text":"How do Dash, Posit (Shiny), and Streamlit compare?","spans":[]}],"seo_description":[{"type":"paragraph","text":"Learn how Dash, Posit (Shiny), and Streamlit compare as low-code UI layers for data apps. See the differences in architecture, deployment, user experience, and more.","spans":[]}]},{"uid":"compare-dash-shiny-streamlit-bokeh","type":"pages","seo_title":[{"type":"paragraph","text":"How do Dash, Shiny, Streamlit, and Bokeh compare?","spans":[]}],"seo_description":[{"type":"paragraph","text":"Learn how low-code UI layers like Dash, Posit (Shiny), Streamlit, and Bokeh compare in web protocol, architecture, user experience, licensing, deployment, and more.","spans":[]}]},{"uid":"life-sciences-app-catalog","type":"pages","seo_title":[{"type":"paragraph","text":"Dash Life Sciences App Catalog","spans":[]}],"seo_description":[{"type":"paragraph","text":"Deploy front-ends for machine learning back-ends like PyTorch, Keras, and TensorFlow with custom Life Sciences templates in Dash Enterprise.","spans":[]}]},{"uid":"comparing-dash-rstudio-anaconda-streamlit","type":"pages","seo_title":[{"type":"paragraph","text":"Dash Enterprise vs RStudio, Anaconda, Streamlit","spans":[]}],"seo_description":[{"type":"paragraph","text":"Compare Dash Enterprise, RStudio Connect, Anaconda Enterprise, and Streamlit for Teams as deployment platforms. See differences in authentication and licensing.","spans":[]}]},{"uid":"building-machine-learning-web-apps-in-python","type":"pages","seo_title":[{"type":"paragraph","text":"Build Machine Learning Apps in Python","spans":[]}],"seo_description":[{"type":"paragraph","text":"Dash is the solution for operationalizing your AI/ML initiatives, with GPT-3, Hugging Face Transformers, UMAP, and YOLOv3. Check out latest Dash-AI projects.","spans":[]}]},{"uid":"privacy","type":"pages","seo_title":[{"type":"paragraph","text":"Privacy Policy","spans":[]}],"seo_description":[{"type":"paragraph","text":"Please see more details on Plotly's privacy policy, including information collected, security, retention, international visitors, and third-party services.","spans":[]}]}],[{"uid":"ai-data-apps","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Plotly for Gen AI and ML. Dynamic LLM-Powered Data Apps","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Learn how competitive decisions and efficient operations are powered by interactive, dynamic LLM-powered data apps with Plotly Dash Enterprise for Gen AI and ML.","spans":[],"direction":"ltr"}]},{"uid":"databricks","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Databricks with Plotly","spans":[]}],"seo_description":[{"type":"paragraph","text":"Use Plotly’s Dash web app framework with Databricks (Python SQL connector, Jobs API, CLI, databricks-connect-v2) for at-scale production data apps.","spans":[]}]},{"uid":"design-kit","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Dash Design Kit","spans":[]}],"seo_description":[{"type":"paragraph","text":"Easily style and customize data apps with Design Kit, a low-code framework from Dash Enterprise. Production ready — no JavaScript, HTML, or CSS required.","spans":[]}]},{"uid":"app-studio","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Plotly App Studio | Python notebook to data app","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Rapidly build, deploy, and scale data science data apps from your Jupyter Notebooks, Python scripts, or other Python notebooks with Plotly App Studio.","spans":[],"direction":"ltr"}]},{"uid":"guided-installation","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Dash Enterprise - Guided Installation","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"After installing Dash Enterprise in one of the below environments, you will be asked for a license key to activate the software and begin deploying Dash apps.","spans":[]}]},{"uid":"aws","type":"dash_pages","seo_title":[{"type":"paragraph","text":"AWS with Plotly","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Use Plotly’s Dash web app framework with AWS (EC2, S3, EKS, RDS, Aurora, Redshift, and more) for at-scale production data apps.","spans":[],"direction":"ltr"}]},{"uid":"data-sources","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Data Sources | Plotly Dash Enterprise","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Plotly Dash Enterprise Data Sources helps connect, manage, and access data when connecting to Databricks, Snowflake, Redshift, BigQuery, and AWS S3.","spans":[],"direction":"ltr"}]},{"uid":"centralized-data-app-management","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Centralized Data App Development","spans":[]}],"seo_description":[{"type":"paragraph","text":"Dash Enterprise lets you centralize data app development under a single platform to manage and deploy Dash, Streamlit, and Django data apps.","spans":[]}]},{"uid":"big-data-for-python","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Big Data Pipelines","spans":[]}],"seo_description":[{"type":"paragraph","text":"Dash Enterprise supports turnkey connections to popular backends in Python – Vaex, Dask, Datashader, RAPIDS, Databricks (PySpark), Snowflake, and Postgres.","spans":[]}]},{"uid":"chatgpt","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Dash and ChatGPT","spans":[]}],"seo_description":[{"type":"paragraph","text":"As a Python-based framework, Dash offers integration with ChatGPT and large language models (LLMs). Learn how you can take part in the future of AI-enabled apps.","spans":[]}]},{"uid":"industry-app-catalog","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Dash Industry App Catalog","spans":[]}],"seo_description":[{"type":"paragraph","text":"Dash Enterprise is the fastest way to deploy front-ends for machine learning back-ends with dozens of easily customizable ML and AI templates.","spans":[]}]},{"uid":"snowflake","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Snowflake with Plotly","spans":[]}],"seo_description":[{"type":"paragraph","text":"Learn how using Snowflake and Plotly together ensures the delivery of production-grade delivery apps that use real-time machine learning and AI processes.","spans":[]}]},{"uid":"chatbot-builder","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Plotly Chatbot Builder","spans":[]}],"seo_description":[{"type":"paragraph","text":"Use Plotly's new Chatbot Builder to deliver fast, easy AI-generated insights from within your data apps.","spans":[]}]},{"uid":"job-queue","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Dash Job Queue","spans":[]}],"seo_description":[{"type":"paragraph","text":"Dash Enterprise Job Queue makes background jobs seamless and scalable in Python. Easily offload CPU-intensive tasks and improve data app performance.","spans":[]}]},{"uid":"snapshot-engine","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Dash Enterprise Snapshot Engine","spans":[]}],"seo_description":[{"type":"paragraph","text":"Create, annotate, archive, and share views of your Dash apps. With only a few lines of code, Snapshot Engine schedules tasks and auto-generates reports.","spans":[]}]},{"uid":"persistent-filesystem","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Persistent Filesystem","spans":[]}],"seo_description":[{"type":"paragraph","text":"With Persistent Filesystems, simplify your data science workflow and avoid network delays. Large data can be uploaded, updated, and cached in Dash Enterprise.","spans":[]}]},{"uid":"app-manager","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Dash App Manager","spans":[]}],"seo_description":[{"type":"paragraph","text":"Deploy, manage, and share data apps. | With the App Manager from Dash Enterprise, ensure a standard, well-documented, and reproducible workflow.","spans":[]}]},{"uid":"authentication","type":"dash_pages","seo_title":[{"type":"paragraph","text":"No-Code Authentication","spans":[]}],"seo_description":[{"type":"paragraph","text":"Access a GUI for easy and secure authentication. With App Manager from Dash Enterprise, choose from LDAP, AD, PingFederate, Okta, SAML, SSO, and more.","spans":[]}]},{"uid":"continuous-integration","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Continuous Integration","spans":[]}],"seo_description":[{"type":"paragraph","text":"Dash Enterprise seamlessly integrates CI/CD for streamlined app deployment. Git-based workflow, automated QA, version control, and more included.","spans":[]}]},{"uid":"dashboard-engine","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Dash Dashboard Engine","spans":[]}],"seo_description":[{"type":"paragraph","text":"Provide data app end users with a powerful, drag-and-drop UI. Dashboard Engine from Dash Enterprise is Python ETL meeds BI — no callbacks or layout required.","spans":[]}]},{"uid":"workspaces","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Data App Workspaces","spans":[]}],"seo_description":[{"type":"paragraph","text":"Workspaces is an onboard code editor from Dash Enterprise. Easily write and execute code for data apps. No additional downloads or installation needed.","spans":[]}]},{"uid":"embedding","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Dash Embedding","spans":[]}],"seo_description":[{"type":"paragraph","text":"Dash Enterprise Embedding Middleware enables seamless embedding without the use of iframes. It also offers single sign-on for easy authentication that scales.","spans":[]}]},{"uid":"dask-integration","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Dask-Coiled and Dash Integration","spans":[]}],"seo_description":[{"type":"paragraph","text":"Learn how to adapt your Dash app with Dask to use Coiled in the back end. Using the integration can enable scaling across parallel computing clusters.","spans":[]}]},{"uid":"excel-python","type":"dash_pages","seo_title":[{"type":"paragraph","text":"Excel to Python","spans":[]}],"seo_description":[{"type":"paragraph","text":"Python is one of the best tools for data scientists in analyzing \u0026 developing models. Here are some resources to help you say goodbye to Excel, and hello to Dash.","spans":[]}]}],[{"uid":"webinars","type":"resource","seo_title":[{"type":"paragraph","text":"Webinars","spans":[]}],"seo_description":[{"type":"paragraph","text":"Leverage Plotly's library of recorded webinars to learn data analytics tips, industry best practices, and application use cases from data analytics experts.","spans":[]}]}],[{"uid":"mitacs","type":"news_pages","seo_title":[{"type":"paragraph","text":"Plotly \u0026 Université de Sherbrooke to develop genomic visualization","spans":[]}],"seo_description":[{"type":"paragraph","text":"Learn how Université de Sherbrooke uses Plotly to develop new analytical tools to explore and visualize genetic structures at the school's CoBIUS Lab.","spans":[]}]},{"uid":"plotly-named-best-place-to-work","type":"news_pages","seo_title":[{"type":"paragraph","text":"Canadian SME National Business Awards selects Plotly","spans":[]}],"seo_description":[{"type":"paragraph","text":"Plotly receives the Canadian SME award for Top Place to Work and Business of the Year for driving product innovation and employee professional development.","spans":[]}]},{"uid":"dash-daq","type":"news_pages","seo_title":[{"type":"paragraph","text":"Dash DAQ","spans":[]}],"seo_description":[{"type":"paragraph","text":"Dash DAQ provides Python users the means to create interactive virtual control panels on their computers that interface with common lab instruments.","spans":[]}]}],[{"uid":"geospatial","type":"explore_pages","seo_title":[{"type":"paragraph","text":"Geospatial Dash App Examples","spans":[]}],"seo_description":[{"type":"paragraph","text":"Interested in Plotly and Dash for geospatial projects and use cases? Explore these Dash data applications that take advantage of the flexibility of Python.","spans":[]}]},{"uid":"dashboards","type":"explore_pages","seo_title":[{"type":"paragraph","text":"Data Visualization \u0026 Dashboards Dash App Examples","spans":[]}],"seo_description":[{"type":"paragraph","text":"Data visualization and dashboards is what Plotly and Dash is known for. Explore several of these Python applications for data visualization and dashboards.","spans":[]}]},{"uid":"sports-analytics","type":"explore_pages","seo_title":[{"type":"paragraph","text":"Sports Analytics Dash App Examples","spans":[]}],"seo_description":[{"type":"paragraph","text":"Data analytics and data scientists meet sports fans with Dash. Explore Dash data applications that convey sports analytics using the flexibility of Python.","spans":[]}]},{"uid":"business","type":"explore_pages","seo_title":[{"type":"paragraph","text":"Business Dash App Examples","spans":[]}],"seo_description":[{"type":"paragraph","text":"Explore Python and data science Dash applications for business-related use cases, ranging from customer segmentation, retail demand forecasting, and more.","spans":[]}]},{"uid":"energy","type":"explore_pages","seo_title":[{"type":"paragraph","text":"Energy \u0026 Utilities Dash App Examples","spans":[]}],"seo_description":[{"type":"paragraph","text":"Explore examples of Python and data science applications in the energy and utilities industry, including electricity, oil and gas, renewables, and more.","spans":[]}]},{"uid":"generative-ai-chatgpt","type":"explore_pages","seo_title":[{"type":"paragraph","text":"ChatGPT \u0026 Generative AI Dash App Examples","spans":[]}],"seo_description":[{"type":"paragraph","text":"Explore Dash applications that incorporate ChatGPT and generative AI in Python.","spans":[]}]},{"uid":"image-video-audio","type":"explore_pages","seo_title":[{"type":"paragraph","text":"Image, Video \u0026 Audio Dash App Examples","spans":[]}],"seo_description":[{"type":"paragraph","text":"Explore Dash data applications that run interactive image processing, computer vision, video analysis, and audio engineering with the power of Python.","spans":[]}]},{"uid":"finance","type":"explore_pages","seo_title":[{"type":"paragraph","text":"Finance Dash App Examples","spans":[]}],"seo_description":[{"type":"paragraph","text":"Explore examples of Python and Dash in finance ranging from quantitative analysis, machine learning, portfolio optimization, and NLP.","spans":[]}]},{"uid":"bioinformatics","type":"explore_pages","seo_title":[{"type":"paragraph","text":"Bioinformatics \u0026 Life Sciences Dash App Examples","spans":[]}],"seo_description":[{"type":"paragraph","text":"Explore examples of Python in bioinformatics in a variety of applications, ranging from genomics, public health, clinical trials, 3D images, and more.","spans":[]}]},{"uid":"predictive-analytics","type":"explore_pages","seo_title":[{"type":"paragraph","text":"Predictive Analytics Dash App Examples","spans":[]}],"seo_description":[{"type":"paragraph","text":"Explore detailed and practical examples of Python in predictive analytics and forecasting to go beyond common BI limitations.","spans":[]}]},{"uid":"manufacturing","type":"explore_pages","seo_title":[{"type":"paragraph","text":"Manufacturing \u0026 R\u0026D Dash App Examples","spans":[]}],"seo_description":[{"type":"paragraph","text":"Explore Python applications for manufacturing and research and development, ranging from laboratory data collection, IoT, real-time dashboards, and more.","spans":[]}]},{"uid":"connecting-to-apis","type":"explore_pages","seo_title":[{"type":"paragraph","text":"Connecting to APIs App Examples","spans":[]}],"seo_description":[{"type":"paragraph","text":"Thanks to the flexibility of Python, Dash applications can connect to any API. Explore data applications that connect to external APIs and visualize data.","spans":[]}]},{"uid":"science-engineering","type":"explore_pages","seo_title":[{"type":"paragraph","text":"Science \u0026 Engineering Dash App Examples","spans":[]}],"seo_description":[{"type":"paragraph","text":"Explore Python applications for science and engineering, including finite element method, contract for difference, physics modeling, and simulations, and more.","spans":[]}]},{"uid":"natural-language-processing","type":"explore_pages","seo_title":[{"type":"paragraph","text":"NLP Dash App Examples","spans":[]}],"seo_description":[{"type":"paragraph","text":"Explore Python data applications for natural language processing (NLP). The following Plotly and Dash applications examples will speak for themselves.","spans":[]}]},{"uid":"machine-learning","type":"explore_pages","seo_title":[{"type":"paragraph","text":"Machine Learning Dash App Examples","spans":[]}],"seo_description":[{"type":"paragraph","text":"Explore Python and Dash applications for machine learning projects, ranging in a variety of use cases from SHAP explainability, segmentation, and more.","spans":[]}]}],[{"uid":"ai-for-benchmarking-data-tools","type":"blog_page","seo_title":[{"type":"paragraph","text":"How AI is Changing the Way We Benchmark Data Tools","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Explore how AI helps you benchmark data tools, making it easy to compare Pandas, Polars, DuckDB, and SQLite on performance, APIs, and scalability.","spans":[],"direction":"ltr"}]},{"uid":"kaleido-the-next-generation","type":"blog_page","seo_title":[{"type":"paragraph","text":"Kaleido: The Next Generation of Static Image Export for Data Visualization","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Generate static images from interactive Plotly charts for your slideshow, report, academic journal, or thesis with the next generation of Kaleido.","spans":[],"direction":"ltr"}]},{"uid":"decoding-genomes-cogent3-plotly","type":"blog_page","seo_title":[{"type":"paragraph","text":"Decoding genomes with cogent3 + Plotly","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Genome data encodes life and drives bioinformatics challenges. Learn how cogent3 and Plotly help accelerate decoding genetic variants and their implications.","spans":[],"direction":"ltr"}]},{"uid":"what-is-a-data-app","type":"blog_page","seo_title":[{"type":"paragraph","text":"Complete Guide and Industry Examples. What is a Data App? ","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Modern data science teams trade static reports for interactive, collaborative, and highly custom data applications - commonly known as data apps","spans":[],"direction":"ltr"}]},{"uid":"6ix-reasons-to-choose-plotly-for-production-data-apps","type":"blog_page","seo_title":[{"type":"paragraph","text":"6ix Reasons to Choose Plotly for Production Data Apps","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Plotly was in Toronto for the AWS Summit, so we’re reflecting on the top six reasons to choose us for building dynamic data apps for production!","spans":[],"direction":"ltr"}]},{"uid":"plotly-is-switching-to-maplibre","type":"blog_page","seo_title":[{"type":"paragraph","text":"Plotly Is Switching to MapLibre as the rendering library for all","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"MapLibre is an independently-maintained fork of Mapbox GL JS v1.x, which ensures minimal changes in Plotly’s code. MapLibre also offers improved performance","spans":[],"direction":"ltr"}]},{"uid":"500-million-downloads-plotly-py","type":"blog_page","seo_title":[{"type":"paragraph","text":"Celebrating 500 Million (and counting!)","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Plotly.py, our graphing libraries, reached an incredible milestone: 500 million lifetime package downloads from PyPi. Read the blog to learn more.","spans":[],"direction":"ltr"}]},{"uid":"plotly-autotickangles-improves-axis-label-readability","type":"blog_page","seo_title":[{"type":"paragraph","text":"Autotickangles Improve Axis Label Readability - Plotly","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Learn how to optimize tick label angles in charts or graphs to prevent overlap of dense data points, improving readability of Plotly Dash charts.","spans":[],"direction":"ltr"}]},{"uid":"data-science-impact-on-portfolio-management-finance","type":"blog_page","seo_title":[{"type":"paragraph","text":"The Impact Data Science has on Portfolio Management in Finance","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Data science has specialized roles in finance, shaping how risk is managed and data is visualized. Jeff Butler, Executive Director - XVA Trading at CIBC","spans":[],"direction":"ltr"}]},{"uid":"plotly-ships-summer-release","type":"blog_page","seo_title":[{"type":"paragraph","text":"Plotly Ships: Summer Release 2024","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Discover the new collaboration features, customization options, and enhanced control measures in the latest 5.4 Plotly Dash Enterprise release.","spans":[],"direction":"ltr"}]},{"uid":"data-ai-summit-plotly-reflections","type":"blog_page","seo_title":[{"type":"paragraph","text":"Playing Plotly Hits from Data+AI Summit 2024","spans":[]}],"seo_description":[{"type":"paragraph","text":"Read about Plotly's customer stories, data and AI trends, and more buzz from the Data+AI Summit as told by Domenic Ravita, Plotly's VP of Marketing.","spans":[]}]},{"uid":"plotly-ask-ai-chatbot-for-easier-app-development","type":"blog_page","seo_title":[{"type":"paragraph","text":"Meet Your Personal Plotly “Ask AI” Chatbot for Easier Data App Development","spans":[]}],"seo_description":[{"type":"paragraph","text":"Here's how Plotly's new \"Ask AI\" chatbot answers technical questions based on LLM models trained on over 2,000 pages of documentation.","spans":[]}]},{"uid":"people-in-focus-software-engineering-app-studio","type":"blog_page","seo_title":[{"type":"paragraph","text":"People in Focus: Unveiling Opportunities as a Senior Software Engineer in App Studio","spans":[]}],"seo_description":[{"type":"paragraph","text":"Learn what it's like to work as a software engineer on Plotly's App Studio team, building the best notebook-to-app solution for data scientists.","spans":[]}]},{"uid":"build-python-web-apps-for-scikit-learn-with-plotly-dash","type":"blog_page","seo_title":[{"type":"paragraph","text":"Build Python Web Apps for scikit-learn Models with Plotly Dash","spans":[]}],"seo_description":[{"type":"paragraph","text":"Easily build and deploy an interactive dashboard interface for your scikit-learn models directly on the web, with Plotly Dash.","spans":[]}]},{"uid":"ai-llm-reflections-dash-club","type":"blog_page","seo_title":[{"type":"paragraph","text":"Dash Club 12: Chris' Reflections on GenAI Dash Apps","spans":[]}],"seo_description":[{"type":"paragraph","text":"Chris Parmer, Plotly Co-Founder and Chief Product Officer, reflects on the future of AI data apps and LLMs in a world of unstructured text.","spans":[]}]},{"uid":"automate-streamline-digital-marketing-workflows-plotly-dash","type":"blog_page","seo_title":[{"type":"paragraph","text":"Automating and Streamlining Digital Marketing Workflows with Plotly and Dash","spans":[]}],"seo_description":[{"type":"paragraph","text":"Automate and streamline digital marketing workflows with by building custom digital marketing data apps and dashboards using Advertools and Dash.","spans":[]}]},{"uid":"how-pharma-and-life-sciences-benefit-from-ai","type":"blog_page","seo_title":[{"type":"paragraph","text":"How Pharma and Life Sciences Are Benefiting From AI Applications","spans":[]}],"seo_description":[{"type":"paragraph","text":"Discover the benefits, challenges, and explore how AI benefits both employees and patients in the Pharmaceutical and Life Sciences industries.","spans":[]}]},{"uid":"how-python-can-help-with-excel","type":"blog_page","seo_title":[{"type":"paragraph","text":"How Python Can Help with Excel | Plotly","spans":[]}],"seo_description":[{"type":"paragraph","text":"Excel is a complicated tool with a lot of functions that aren’t always intuitive. We’ve got a few ways Python can improve Excel functions. Learn more in this article.","spans":[]}]},{"uid":"data-scientist-to-sustainability-analytics-ceo","type":"blog_page","seo_title":[{"type":"paragraph","text":"A Data Scientist's Path to Becoming the CEO","spans":[]}],"seo_description":[{"type":"paragraph","text":"Dataphoria co-founder and CEO, Anastasis Stamatis, shares his inspiring story from data scientist to the CEO of a sustainability analytics company.","spans":[]}]},{"uid":"dash-enterprise-5.2-enables-mission-critical-data-science-decisions","type":"blog_page","seo_title":[{"type":"paragraph","text":"How Dash Enterprise 5.2 Enables Data Science Teams to Influence Mission-Critical Decisions","spans":[]}],"seo_description":[{"type":"paragraph","text":"Nicole Arksey, Group Product Manager at Plotly, shares her thoughts on the upcoming Dash Enterprise 5.2 release — and what it means for data science teams.","spans":[]}]},{"uid":"analyze-website-structure-with-dash","type":"blog_page","seo_title":[{"type":"paragraph","text":"Analyzing Website Structure With robots.txt Files and XML Sitemaps Using Dash","spans":[]}],"seo_description":[{"type":"paragraph","text":"Analyze URLs and website structure with Dash for better sub-folder organization, effective content distribution, and enhanced online presence.","spans":[]}]},{"uid":"python-tools-for-data-science","type":"blog_page","seo_title":[{"type":"paragraph","text":"Python Tools for Data Science | Plotly","spans":[]}],"seo_description":[{"type":"paragraph","text":"Python is one of the best tools for data scientists in analyzing \u0026 developing models. Here is a list of the top 15 python tools for data scientists.","spans":[]}]},{"uid":"how-to-keep-your-data-safe-with-dash","type":"blog_page","seo_title":[{"type":"paragraph","text":"How to Keep Your Data Safe With Dash","spans":[]}],"seo_description":[{"type":"paragraph","text":"Learn how Plotly prioritizes data security as the premier platform for developing, scaling, and deploying Python-based data apps.","spans":[]}]},{"uid":"automate-excel-reports-with-python","type":"blog_page","seo_title":[{"type":"paragraph","text":"How to Automate Excel Reports Using Python | Plotly","spans":[]}],"seo_description":[{"type":"paragraph","text":"Generating Excel reports can be tedious \u0026 time-consuming, but there’s a solution. Automating your reports using Python. Learn more.","spans":[]}]},{"uid":"sankey-diagrams","type":"blog_page","seo_title":[{"type":"paragraph","text":"Deep Dive on Sankey Diagrams","spans":[]}],"seo_description":[{"type":"paragraph","text":"By leveraging these best practices and the provided code, you can harness the power of Sankey Diagrams to gain insights from data. Learn more in this Plotly article.","spans":[]}]},{"uid":"build-dash-data-apps-data-science-consultant","type":"blog_page","seo_title":[{"type":"paragraph","text":"Building Plotly Dash Data Applications as a Data Science Consultant","spans":[]}],"seo_description":[{"type":"paragraph","text":"Arne Petter, Data Science consultant, chats about his experience building data apps with Dash Enterprise for internal and external clients alike.","spans":[]}]},{"uid":"building-unit-tests-for-dash-applications","type":"blog_page","seo_title":[{"type":"paragraph","text":"Building Unit Tests for Dash Applications","spans":[]}],"seo_description":[{"type":"paragraph","text":"Ease the learning curve of unit testing your Dash applications with this tutorial by Mario Rodríguez Ibáñez, Plotly Professional Services team.","spans":[]}]},{"uid":"performance-optimization-geospatial","type":"blog_page","seo_title":[{"type":"paragraph","text":"Performance Optimizations for Geospatial Dash Apps","spans":[]}],"seo_description":[{"type":"paragraph","text":"Plotly Professional Services team shares how to effectively visualize geospatial datasets in data apps, specifically for vector, polygon data.","spans":[]}]},{"uid":"introduction-to-data-science-in-finance","type":"blog_page","seo_title":[{"type":"paragraph","text":"Introduction to Data Science in Finance","spans":[]}],"seo_description":[{"type":"paragraph","text":"Dive into the world of data science in finance, where analytics and insights reshape the future of financial decision-making and innovation.","spans":[]}]},{"uid":"dash-matplotlib","type":"blog_page","seo_title":[{"type":"paragraph","text":"Creating an Interactive Web App with Matplotlib, Python, and Dash","spans":[]}],"seo_description":[{"type":"paragraph","text":"In this blog post from Plotly Community Manager, Adam Schroeder, learn how to leverage Matplotlib's robust plots with Dash's intuitive API to create dynamic and immersive data visualizations.","spans":[]}]},{"uid":"dash-and-github-copilot","type":"blog_page","seo_title":[{"type":"paragraph","text":"Dash + GitHub Copilot = Easier and Faster Data App Building","spans":[]}],"seo_description":[{"type":"paragraph","text":"Learn how to accelerate data app creation using GitHub Copilot with Dash Open Source and Dash Enterprise Solutions, for streamlined development.","spans":[]}]},{"uid":"low-code-vs-no-code-data-app-development","type":"blog_page","seo_title":[{"type":"paragraph","text":"What’s Better: Low-Code or No-Code Data App Development?","spans":[]}],"seo_description":[{"type":"paragraph","text":"We explore how to choose between low-code and no-code for data app development, offering insights to streamline data into production-ready apps.","spans":[]}]},{"uid":"dash-strava","type":"blog_page","seo_title":[{"type":"paragraph","text":"Reflections from an Athlete — Dash feat. Strava","spans":[]}],"seo_description":[{"type":"paragraph","text":"Discover how Anna Riley, Plotly Professional Services team member and athlete, visualized her Strava data in just two weeks with Dash.","spans":[]}]},{"uid":"partial-properties","type":"blog_page","seo_title":[{"type":"paragraph","text":"Partial Property Updates: Extending Full-Stack Development with Python","spans":[]}],"seo_description":[{"type":"paragraph","text":"In this blog post from Plotly's CPO and the Creator of Dash, Chris Parmer, learn how Partial Property Updates offers substantial data app performance improvements.","spans":[]}]},{"uid":"polars-to-build-fast-dash-apps-for-large-datasets","type":"blog_page","seo_title":[{"type":"paragraph","text":"How Polars Can Help You Build Fast Dash Apps for Large Datasets","spans":[]}],"seo_description":[{"type":"paragraph","text":"Discover the power of leveraging Polars in lightning-fast Dash apps for visualizing and analyzing large data sets in your production environment.","spans":[]}]},{"uid":"dash-enterprise-security-soc-2-type-2","type":"blog_page","seo_title":[{"type":"paragraph","text":"Enhanced Security and Reliability: Plotly Is SOC 2 Type II Compliant","spans":[]}],"seo_description":[{"type":"paragraph","text":"Plotly is now SOC2 Type I and Type II compliant. Learn how this helps protect customer assets and data sources when using Plotly products.","spans":[]}]}],[{"uid":"singapore-institute-for-clinical-sciences-sics","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Singapore Institute for Clinical Sciences Enables Open Sharing of Health Research with Interactive Data Vault Platform","spans":[]}],"seo_description":[{"type":"paragraph","text":"SICS shares cohort data with the global research community by deploying data catalogs, analytics, and research to an interactive data vault platform.","spans":[]}]},{"uid":"johnson-matthey","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Johnson Matthey Scales Commercial Scientific App Platform with Dash Enterprise","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Johnson Matthey delivers state-of-the-art imaging data science to aid research and development with Dash Enterprise and Azure.","spans":[],"direction":"ltr"}]},{"uid":"automotive-capacity-planning-cox-auto","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Largest U.S. Automotive Auction Network Deploys Capacity Planning with Dash Enterprise","spans":[]}],"seo_description":[{"type":"paragraph","text":"Learn how Cox Automotive leverages the power of Dash Enterprise to deliver mission-critical capacity planning analytics that accelerate business decisions.","spans":[]}]},{"uid":"nhs-foundation-trust-healthcare","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"NHS Foundation Trust Unlocks AI Healthcare Potential with Dash Enterprise","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Somerset NHS Foundation Trust used Plotly Dash Enterprise to quickly build and deploy AI data apps for heathcare provider and organizational needs.","spans":[],"direction":"ltr"}]},{"uid":"berkeley-lab","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Berkeley Lab Powers Worldwide Materials Research with Dash and Python","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Berkeley Lab's team utilizes interactive Dash apps and components to explore and analyze nearly 150,000 inorganic materials and their associated properties. ","spans":[]}]},{"uid":"kansas-city-chiefs","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Kansas City Chiefs Champion Digital Transformation in Business and Operations","spans":[]}],"seo_description":[{"type":"paragraph","text":"Investing in Dash Enterprise provided a unified analytics platform for the Kansas City Chiefs' analytics team to address diverse use cases.","spans":[]}]},{"uid":"dr-reddys-laboratories-automates-pharmaceutical-regulatory-reporting-with-plotly","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Dr. Reddy's Laboratories Automates Pharmaceutical Regulatory Reporting with Plotly","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Dr. Reddy's Laboratories uses Plotly to aggregate and distribute marketing intelligence and regulatory data from multiple data sources into GCP.","spans":[],"direction":"ltr"}]},{"uid":"bio-pharma-cfd-nova-labs","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"NovaLabs facilitates access to the most popular CFD methodology for stirred reactor scaling using Plotly Dash","spans":[]}],"seo_description":[{"type":"paragraph","text":"Read the story: saving time and costs and increasing ease of access to CFD for pharmaceutical companies with CliqScale.R developed with Plotly’s Dash.","spans":[]}]},{"uid":"cibc","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"CIBC Drives ML-Powered Quant Analytics with Plotly Dash Enterprise and Databricks","spans":[]}],"seo_description":[{"type":"paragraph","text":"CIBC Capital Markets deploys production-grade data apps with quantitative analytics and machine learning models to Sales and Trading desks.","spans":[]}]},{"uid":"pairwise","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Pairwise Accelerates Food and Tech Innovation with Python and Dash Enterprise","spans":[]}],"seo_description":[{"type":"paragraph","text":"U.S. Food Tech startup Pairwise sees 10x scalability of molecular screening pipeline with Dash Enterprise for innovative scientific analytics.","spans":[]}]},{"uid":"federal-power-provider","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Federal Power Provider Saves Time and Costs on Nuclear Site Operations and Maintenance With Dash Enterprise","spans":[]}],"seo_description":[{"type":"paragraph","text":"Learn how a U.S. federal power provider adopted advanced analytics for nuclear plant mapping and intelligent text analysis using Dash Enterprise.","spans":[]}]},{"uid":"property-management-analytics-pricelabs","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"PriceLabs creates custom platform for vacation property management analytics","spans":[]}],"seo_description":[{"type":"paragraph","text":"Discover how PriceLabs chose Python analytics over traditional BI software for custom parametrization and robust, relevant, real-time analytics.","spans":[]}]},{"uid":"education-sidmach","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Sidmach launches AI-driven Edustat platform built with Plotly Dash Enterprise and Azure Databricks","spans":[]}],"seo_description":[{"type":"paragraph","text":"Dash Enterprise front-end framework and Databricks back-end architecture empower Sidmach to develop and launch AI-powered educational platform.","spans":[]}]},{"uid":"iot-gamuda","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Gamuda develops tunnel boring machine IoT solution with Dash Enterprise","spans":[]}],"seo_description":[{"type":"paragraph","text":"Gamuda pairs Python and Dash with sensor data to build real-time monitoring for the world’s first Autonomous Tunnel Boring Machine (A-TBM) effort.","spans":[]}]},{"uid":"fetch-rewards","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Fetch Integrates Plotly Dash With Snowflake to Power a Comprehensive Self-Service Analytics Platform","spans":[]}],"seo_description":[{"type":"paragraph","text":"Fetch Rewards develops self-service production-grade data applications for its Analytics Hub platform using Plotly Dash and Snowflake.","spans":[]}]},{"uid":"sp-global","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"S\u0026P Global Market Intelligence Powers 'Workbench Data Apps' Commercial Offering using Plotly with Databricks","spans":[]}],"seo_description":[{"type":"paragraph","text":"S\u0026P Global's rapid development and evolution of Workbench Data Applications derived from massive, aggregated datasets with Plotly and Databricks.","spans":[]}]},{"uid":"biopharma-single-cell-data-visualization","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Single Cell Data Visualization in Multinational Biopharma Org’s Fight Against Disease","spans":[]}],"seo_description":[{"type":"paragraph","text":"How can building a single cell RNA sequencing visualizer with Plotly Dash save hours of app development time? Read the story to learn more.","spans":[]}]},{"uid":"wpo-energy","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"WPO Leads Renewable Energy Asset Management with Dash","spans":[]}],"seo_description":[{"type":"paragraph","text":"Largest independent European asset management firm, WPO, offers fit-for-purpose data analytics spanning six gigawatts of global renewables sites.","spans":[]}]},{"uid":"ai-supply-chain-aioneers","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"aioneers Builds AI-Driven Supply Chain Intelligence Platform with Plotly Dash and Azure Databricks","spans":[]}],"seo_description":[{"type":"paragraph","text":"aioneers’ AI supply chain intelligence platform pushes past legacy BI with Plotly Dash and Azure Databricks for actionable machine learning insights.","spans":[]}]},{"uid":"crant-ai","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"How Crant Automated AI-driven Insight for Brand Building with Dash","spans":[]}],"seo_description":[{"type":"paragraph","text":"How Crant, an AI company, reduced weekly analysis time by 28 hours and processed social media data to produce daily metrics with Dash Enterprise.","spans":[]}]},{"uid":"chesapeake-energy","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Chesapeake Energy Creates Real-Time Data Applications for Mission-Critical KPIs using Dash Enterprise","spans":[]}],"seo_description":[{"type":"paragraph","text":"Learn how Chesapeake Energy implemented Dash Enterprise to address challenges related to real-time data visualizations and secure mobile access.","spans":[]}]},{"uid":"renewable-energy-nrel","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"National Renewable Energy Laboratory Mobilizes Dash for Wind Turbine Wake Research","spans":[]}],"seo_description":[{"type":"paragraph","text":"National Renewable Energy Laboratory builds custom preprocessing interface to instantly rerun wind turbine wake steering models and hypotheses.","spans":[]}]},{"uid":"gamma-tech","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Gamma Technologies and Plotly Partner on Updates to Industry-Leading Engineering Simulation Platform","spans":[]}],"seo_description":[{"type":"paragraph","text":"Gamma Technologies partners with Plotly Professional Services to support automated chart creation in their simulation platform.","spans":[]}]},{"uid":"komatsu","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Komatsu Develops Advanced Analytics and Reporting Applications With Dash Enterprise and Snowflake","spans":[]}],"seo_description":[{"type":"paragraph","text":"Komatsu uses Dash Enterprise to build custom data applications with Snowflake for insight generation, fault detection, and contextualizing machine behavior.","spans":[]}]},{"uid":"public-utility-dash-enterprise","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Public utility organization reduces work order overdue rate by 87% with Dash Enterprise","spans":[]}],"seo_description":[{"type":"paragraph","text":"Read the story of how within one year of switching to Dash Enterprise, a North American public utilities org reduced customer complaints by 10x.","spans":[]}]},{"uid":"supply-chain-nisci","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"NISCI Develops Supply Chain Applications With Dash Enterprise","spans":[]}],"seo_description":[{"type":"paragraph","text":"Read how NISCI deployed production-grade, interactive ship cargo optimization and distribution network planning applications with Dash Enterprise.","spans":[]}]},{"uid":"uniper","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Uniper accelerates digital innovation in trading business with Dash Enterprise","spans":[]}],"seo_description":[{"type":"paragraph","text":"Discover how Dash Enterprise facilitates decision-support tool development aligning with Uniper's production deployment and security standards.","spans":[]}]},{"uid":"martin-engineering","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Martin Engineering Optimizes Customer Site Up-time and Safety with Predictive Maintenance and Remote Monitoring Applications","spans":[]}],"seo_description":[{"type":"paragraph","text":"Martin Engineering uses Dash Enterprise to develop and deploy production-grade data applications from on-site manufacturing equipment sensors.","spans":[]}]},{"uid":"energy-uk-power-networks","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"UK Power Networks Utilizes Dash Enterprise and Databricks in Drive to Save Customers More Than £400MM","spans":[]}],"seo_description":[{"type":"paragraph","text":"UK Power Networks developed ML-powered models to predict electricity demand peaks and inform network reliability upgrade investment decisions.","spans":[]}]},{"uid":"quantitative-analytics-financial-services-institution","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Scaling Quantitative Analytics at a Global Financial Services Institution with Python and Dash","spans":[]}],"seo_description":[{"type":"paragraph","text":"How the Portfollio Analytics team built a platform to facilitate and standardize analytic app development at a global financial services org.","spans":[]}]},{"uid":"intuit","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Intuit Reduces Experiment Runtime More Than 50% with Dash Enterprise","spans":[]}],"seo_description":[{"type":"paragraph","text":"Here's how financial technology company Intuit achieved 50% faster experiments with Python and Dash Enterprise, increasing analyst productivity.","spans":[]}]},{"uid":"sports-analytics-utah-jazz","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Dash Enterprise for Sports Analytics with Utah Jazz","spans":[]}],"seo_description":[{"type":"paragraph","text":"Learn how the Basketball Analytics Group on the Utah Jazz team is bringing powerful Python analytics to the NBA with Dash Enterprise.","spans":[]}]},{"uid":"predictive-analytics-multinational-telecom","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Predictive Analytics at Multinational Telecommunications Firm Accelerates Digital Transformation with Dash Enterprise","spans":[]}],"seo_description":[{"type":"paragraph","text":"Major telecommunications firm uses Dash Enterprise to develop a Python-based analytics platform to better track internal ROI and decisions.","spans":[]}]},{"uid":"dash-enterprise-covid","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Dash Enterprise in the Fight Against COVID-19","spans":[]}],"seo_description":[{"type":"paragraph","text":"A digital pharmaceutical company takes action with Dash Enterprise to visualize thousands of drug compound results in the wake of COVID-19.","spans":[]}]},{"uid":"equinor-energy","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Equinor develops a visualization platform utilizing Dash","spans":[]}],"seo_description":[{"type":"paragraph","text":"Discover how Equinor meets the energy needs of over 170 million people each day by operationalizing data science with Plotly Dash Enterprise.","spans":[]}]},{"uid":"denver-regional-transport","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"Denver Regional Transportation District builds accessible ride logistics with Dash Enterprise","spans":[]}],"seo_description":[{"type":"paragraph","text":"Denver-RTD creates a ride-planning app to assist passengers with disabilities on 2,000 rides daily, with mobile-friendly GUIs written in Python.","spans":[]}]},{"uid":"behavioral-health-holmusk","type":"ungated_stories","seo_title":[{"type":"paragraph","text":"NeuroBlu Analytics Platform Delivers Flexibility and Data-Driven Insight to Healthcare Stakeholders","spans":[]}],"seo_description":[{"type":"paragraph","text":"Learn how Holmusk uses Dash Enterprise and Databricks for faster development, decision-making, and deployment of their NeuroBlu analytics platform.","spans":[]}]}],[{"uid":"retail-data-apps","type":"solutions","seo_title":[{"type":"paragraph","text":"Retail | Production-grade data applications","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Advanced, real-time analytics for retail. Professional data apps for supply chain optimization, demand forecasting, inventory management, and more.","spans":[],"direction":"ltr"}]},{"uid":"finance","type":"solutions","seo_title":[{"type":"paragraph","text":"Finance | Production-grade data applications","spans":[]}],"seo_description":[{"type":"paragraph","text":"Real-time insights, automated processes, and rapid, secure deployment for financial data applications used by Finance teams with Dash Enterprise.","spans":[]}]},{"uid":"aerospace-defense","type":"solutions","seo_title":[{"type":"paragraph","text":"Aerospace and Defense | Production-grade data applications","spans":[]}],"seo_description":[{"type":"paragraph","text":"Rapid deployment, complex data visualizations, and custom analytics for aerospace and defense data applications.","spans":[]}]},{"uid":"manufacturing","type":"solutions","seo_title":[{"type":"paragraph","text":"Manufacturing | Production-grade data applications","spans":[],"direction":"ltr"}],"seo_description":[{"type":"paragraph","text":"Real-time insights, automated processes, and rapid, secure deployment for data applications used by Manufacturing teams with Dash Enterprise.","spans":[],"direction":"ltr"}]},{"uid":"energy","type":"solutions","seo_title":[{"type":"paragraph","text":"Energy | Production-grade data applications","spans":[]}],"seo_description":[{"type":"paragraph","text":"Secure, reliable advanced analytics in real time, allowing remote access and cross-device compatibility, for professionals in the energy sector.","spans":[]}]},{"uid":"healthcare-life-sciences-pharma","type":"solutions","seo_title":[{"type":"paragraph","text":"Healthcare and Life Sciences | Production-grade data applications","spans":[]}],"seo_description":[{"type":"paragraph","text":"Rapid deployment, complex data visualizations, and custom analytics for healthcare, life sciences, and pharmaceutical data applications.","spans":[]}]}],[{"uid":"https://plotly.com/graphing-libraries/","type":"external_page","seo_title":[{"text":"Graphing Libraries"}],"seo_description":[{"text":"Graphing Libraries"}]},{"uid":"https://dash.gallery/Portal/","type":"external_page","seo_title":[{"text":"Galleries"}],"seo_description":[{"text":"Galleries"}]},{"uid":"https://dash.plotly.com/","type":"external_page","seo_title":[{"text":"Dash Documentation"}],"seo_description":[{"text":"Dash Documentation"}]},{"uid":"https://dash.plotly.com/dash-enterprise","type":"external_page","seo_title":[{"text":"Dash Enterprise"}],"seo_description":[{"text":"Dash Enterprise"}]},{"uid":"https://community.plotly.com/","type":"external_page","seo_title":[{"text":"Community forum"}],"seo_description":[{"text":"Community forum"}]}]],"mainMenuData":{"id":"YXohqBEAACQABIA3","uid":"header","url":null,"type":"header","href":"https://plotly-marketing-website-2.cdn.prismic.io/api/v2/documents/search?ref=Z0ZkvREAACAAtL1G\u0026q=%5B%5B%3Ad+%3D+at%28document.id%2C+%22YXohqBEAACQABIA3%22%29+%5D%5D","tags":[],"first_publication_date":"2021-10-28T04:06:04+0000","last_publication_date":"2024-11-18T23:35:32+0000","slugs":["header"],"linked_documents":[],"lang":"en-us","alternate_languages":[],"data":{"favicon":{"dimensions":{"width":67,"height":67},"alt":"Plotly","copyright":null,"url":"https://images.prismic.io/plotly-marketing-website-2/798854a2-209b-4e03-959f-965613354c4f_favicon_new_white.png?auto=compress,format","id":"YyHGKhAAACQANlDB","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"favicon_light":{"dimensions":{"width":150,"height":150},"alt":null,"copyright":null,"url":"https://plotly-marketing-website-2.cdn.prismic.io/plotly-marketing-website-2/91b2540e-f108-48c0-b155-16498a8ec346_favicon_plotly.svg","id":"ZfysbxIAACAA7iUp","edit":{"x":0,"y":0,"zoom":1,"background":"#fff"}},"logo":{"dimensions":{"width":300,"height":83},"alt":"Plotly","copyright":null,"url":"https://images.prismic.io/plotly-marketing-website-2/8f977c91-7b4e-4367-8228-26fbba2506e4_69e12d6a-fb65-4b6e-8423-9465a29c6028_plotly-logo-sm.png?auto=compress,format","id":"Yw7PUBAAACcAH7ra","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"logo_light":{"dimensions":{"width":300,"height":83},"alt":"Plotly","copyright":null,"url":"https://plotly-marketing-website-2.cdn.prismic.io/plotly-marketing-website-2/b3d3a2b1-49f9-4e74-93dc-070b266a54ba_plotly_logo.svg","id":"YtkLkBEAAIFVEe01","edit":{"x":0,"y":0,"zoom":1,"background":"#fff"}},"body":[{"primary":{"label":"Products \u0026 Services","link":[{"type":"paragraph","text":"","spans":[]}],"block_image":{"dimensions":{"width":150,"height":150},"alt":"Dash Enterprise Overview","copyright":null,"url":"https://plotly-marketing-website-2.cdn.prismic.io/plotly-marketing-website-2/ZszVeUaF0TcGJZ7W_DashEnterpriseicon-1-.svg","id":"ZszVeUaF0TcGJZ7W","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"block_text":[{"type":"paragraph","text":"Dash Enterprise Overview","spans":[]}],"block_link":{"id":"YbAkPBAAACEAzqkL","type":"pages","tags":[],"lang":"en-us","slug":"overview-of-dash--dash-apps","first_publication_date":"2021-12-08T03:20:07+0000","last_publication_date":"2024-11-13T18:40:45+0000","uid":"dash","link_type":"Document","isBroken":false},"highlighted_image":{},"highlighted_title":null,"highlighted_link_name":null,"highlighted_link":{"link_type":"Any"},"by_category":true},"items":[{"image":{},"image_light":{},"tag":[{"type":"paragraph","text":"NEW","spans":[]}],"label":"Plotly App Studio","link":[{"type":"paragraph","text":"https://plotly.com/dash/app-studio/","spans":[{"start":0,"end":35,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/dash/app-studio/"}}]}],"description":null,"category_name":"Accelerated Development"},{"image":{},"image_light":{},"tag":[{"type":"paragraph","text":"NEW","spans":[]}],"label":"Chatbot Builder","link":[{"type":"paragraph","text":"https://plotly.com/dash/chatbot-builder/","spans":[{"start":0,"end":40,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/dash/chatbot-builder/"}}]}],"description":null,"category_name":"Accelerated Development"},{"image":{},"image_light":{},"tag":[{"type":"paragraph","text":"","spans":[]}],"label":"Data App Workspaces","link":[{"type":"paragraph","text":"https://plotly.com/dash/workspaces/","spans":[{"start":0,"end":35,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/dash/workspaces/"}}]}],"description":null,"category_name":"Accelerated Development"},{"image":{},"image_light":{},"tag":[{"type":"paragraph","text":"","spans":[]}],"label":"Snapshot Engine","link":[{"type":"paragraph","text":"https://plotly.com/dash/snapshot-engine/","spans":[{"start":0,"end":40,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/dash/snapshot-engine/"}}]}],"description":null,"category_name":"Accelerated Development"},{"image":{},"image_light":{},"tag":[{"type":"paragraph","text":"","spans":[]}],"label":"Design Kit","link":[{"type":"paragraph","text":"https://plotly.com/dash/design-kit/","spans":[{"start":0,"end":35,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/dash/design-kit/"}}]}],"description":null,"category_name":"Accelerated Development"},{"image":{},"image_light":{},"tag":[{"type":"paragraph","text":"","spans":[]}],"label":"Centralized Deployment","link":[{"type":"paragraph","text":"https://plotly.com/dash/centralized-data-app-management/","spans":[{"start":0,"end":56,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/dash/centralized-data-app-management/"}}]}],"description":null,"category_name":"Deployment \u0026 Scaling"},{"image":{},"image_light":{},"tag":[{"type":"paragraph","text":"","spans":[]}],"label":"App Manager","link":[{"type":"paragraph","text":"https://plotly.com/dash/app-manager/","spans":[{"start":0,"end":36,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/dash/app-manager/"}}]}],"description":null,"category_name":"Deployment \u0026 Scaling"},{"image":{},"image_light":{},"tag":[],"label":"Background Jobs \u0026 Queuing","link":[{"type":"paragraph","text":"https://plotly.com/dash/job-queue/","spans":[{"start":0,"end":34,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/dash/job-queue/"}}]}],"description":null,"category_name":"Deployment \u0026 Scaling"},{"image":{},"image_light":{},"tag":[],"label":"Embedding","link":[{"type":"paragraph","text":"https://plotly.com/dash/embedding/","spans":[{"start":0,"end":34,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/dash/embedding/"}}]}],"description":null,"category_name":"Deployment \u0026 Scaling"},{"image":{},"image_light":{},"tag":[],"label":"Persistent Filesystem","link":[{"type":"paragraph","text":"https://plotly.com/dash/persistent-filesystem/","spans":[{"start":0,"end":46,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/dash/persistent-filesystem/"}}]}],"description":null,"category_name":"Deployment \u0026 Scaling"},{"image":{},"image_light":{},"tag":[],"label":"Authentication Middleware","link":[{"type":"paragraph","text":"https://plotly.com/dash/authentication/","spans":[{"start":0,"end":39,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/dash/authentication/"}}]}],"description":null,"category_name":"Enterprise IT Integration"},{"image":{},"image_light":{},"tag":[],"label":"Database Integration","link":[{"type":"paragraph","text":"https://plotly.com/dash/big-data-for-python/?tab=connect-any-data-pipeline#bigDataTabs","spans":[{"start":0,"end":86,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/dash/big-data-for-python/?tab=connect-any-data-pipeline#bigDataTabs"}}]}],"description":null,"category_name":"Enterprise IT Integration"},{"image":{},"image_light":{},"tag":[],"label":"Databricks Integration","link":[{"type":"paragraph","text":"https://plotly.com/dash/databricks/","spans":[{"start":0,"end":35,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/dash/databricks/"}}]}],"description":null,"category_name":"Enterprise IT Integration"},{"image":{},"image_light":{},"tag":[{"type":"paragraph","text":"","spans":[]}],"label":"CI/CD Integration","link":[{"type":"paragraph","text":"https://plotly.com/dash/continuous-integration/","spans":[{"start":0,"end":47,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/dash/continuous-integration/"}}]}],"description":null,"category_name":"Enterprise IT Integration"},{"image":{},"image_light":{},"tag":[{"type":"paragraph","text":"","spans":[]}],"label":"Security \u0026 Compliance","link":[{"type":"paragraph","text":"https://plotly.com/security/","spans":[{"start":0,"end":28,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/security/"}}]}],"description":null,"category_name":"Enterprise IT Integration"},{"image":{},"image_light":{},"tag":[{"type":"paragraph","text":"NEW","spans":[],"direction":"ltr"}],"label":"Data Sources","link":[{"type":"paragraph","text":"https://plotly.com/dash/data-sources/","spans":[],"direction":"ltr"}],"description":null,"category_name":"Enterprise IT Integration"},{"image":{"dimensions":{"width":150,"height":150},"alt":"Customer Success Icon","copyright":null,"url":"https://plotly-marketing-website-2.cdn.prismic.io/plotly-marketing-website-2/ZlULJ6WtHYXtT1O4_Frame31.svg","id":"ZlULJ6WtHYXtT1O4","edit":{"x":0,"y":0,"zoom":1,"background":"#fff"}},"image_light":{},"tag":[],"label":"Customer Success","link":[{"type":"paragraph","text":"https://plotly.com/customer-success/","spans":[{"start":0,"end":36,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/customer-success/"}}]}],"description":null,"category_name":null},{"image":{"dimensions":{"width":150,"height":150},"alt":"Professional Services Icon","copyright":null,"url":"https://plotly-marketing-website-2.cdn.prismic.io/plotly-marketing-website-2/ZldKuaWtHYXtT58h_professionalservices.svg","id":"ZldKuaWtHYXtT58h","edit":{"x":0,"y":0,"zoom":1,"background":"#fff"}},"image_light":{},"tag":[],"label":"Professional Services","link":[{"type":"paragraph","text":"https://plotly.com/consulting-and-oem/","spans":[{"start":0,"end":38,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/consulting-and-oem/","target":"_self"}}],"direction":"ltr"}],"description":null,"category_name":null}],"id":"menu$2e8ae0f7-1d17-4237-8c79-098d2e6df046","slice_type":"menu","slice_label":null},{"primary":{"label":"Docs","link":[],"block_image":{},"block_text":[],"block_link":{"link_type":"Any"},"highlighted_image":{},"highlighted_title":null,"highlighted_link_name":null,"highlighted_link":{"link_type":"Any"},"by_category":false},"items":[{"image":{"dimensions":{"width":150,"height":150},"alt":"Dash Enterprise","copyright":null,"url":"https://plotly-marketing-website-2.cdn.prismic.io/plotly-marketing-website-2/248c1e4e-e016-4c46-b926-bde97e9c69e1_doc_dropdown_icons-01.svg","id":"YjGN-BAAACEAOnmg","edit":{"x":0,"y":0,"zoom":1,"background":"#fff"}},"image_light":{},"tag":[],"label":"Dash Enterprise","link":[{"type":"paragraph","text":"https://dash.plotly.com/dash-enterprise","spans":[{"start":0,"end":39,"type":"hyperlink","data":{"link_type":"Web","url":"https://dash.plotly.com/dash-enterprise","target":"_blank"}}]}],"description":null,"category_name":null},{"image":{"dimensions":{"width":150,"height":150},"alt":"Dash Open Source","copyright":null,"url":"https://plotly-marketing-website-2.cdn.prismic.io/plotly-marketing-website-2/6ed94409-6d3d-4a12-bfd0-e9f4288d7eee_doc_dropdown_icons-02.svg","id":"YjGN9xAAACIAOnme","edit":{"x":0,"y":0,"zoom":1,"background":"#fff"}},"image_light":{},"tag":[],"label":"Dash Open Source","link":[{"type":"paragraph","text":"https://dash.plotly.com/","spans":[{"start":0,"end":24,"type":"hyperlink","data":{"link_type":"Web","url":"https://dash.plotly.com/","target":"_blank"}}]}],"description":null,"category_name":null},{"image":{"dimensions":{"width":150,"height":150},"alt":"Graphing Libraries","copyright":null,"url":"https://plotly-marketing-website-2.cdn.prismic.io/plotly-marketing-website-2/07c24e0c-9304-4666-9f6b-4483c3defef7_doc_dropdown_icons-03.svg","id":"YjGN9xAAACIAOnmf","edit":{"x":0,"y":0,"zoom":1,"background":"#fff"}},"image_light":{},"tag":[],"label":"Graphing Libraries","link":[{"type":"paragraph","text":"https://plotly.com/graphing-libraries/","spans":[{"start":0,"end":38,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/graphing-libraries/","target":"_blank"}}]}],"description":null,"category_name":null},{"image":{"dimensions":{"width":150,"height":150},"alt":"Forum","copyright":null,"url":"https://plotly-marketing-website-2.cdn.prismic.io/plotly-marketing-website-2/8c22dbd4-2e64-41a0-841d-d42679c66108_doc_dropdown_icons-04.svg","id":"YjGN9xAAACEAOnmd","edit":{"x":0,"y":0,"zoom":1,"background":"#fff"}},"image_light":{},"tag":[],"label":"Community","link":[{"type":"paragraph","text":"https://community.plotly.com/","spans":[{"start":0,"end":29,"type":"hyperlink","data":{"link_type":"Web","url":"https://community.plotly.com/","target":"_blank"}}]}],"description":null,"category_name":null}],"id":"menu$86c44501-8398-4ad1-80b5-a41474357e05","slice_type":"menu","slice_label":null},{"primary":{"label":"Example Apps","link":[{"type":"paragraph","text":"https://plotly.com/examples/","spans":[{"start":0,"end":28,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/examples/"}}]}],"block_image":{},"block_text":[],"block_link":{"link_type":"Any"},"highlighted_image":{},"highlighted_title":null,"highlighted_link_name":null,"highlighted_link":{"link_type":"Any"},"by_category":false},"items":[],"id":"menu$2e2b4444-4845-4837-985b-1938a7915b61","slice_type":"menu","slice_label":null},{"primary":{"label":"Resources","link":[],"block_image":{},"block_text":[],"block_link":{"link_type":"Any"},"highlighted_image":{},"highlighted_title":null,"highlighted_link_name":null,"highlighted_link":{"link_type":"Any"},"by_category":false},"items":[{"image":{"dimensions":{"width":150,"height":150},"alt":"User story icon","copyright":null,"url":"https://plotly-marketing-website-2.cdn.prismic.io/plotly-marketing-website-2/ZlUKvKWtHYXtT1Oy_Frame29.svg?auto=compress,format","id":"ZlUKvKWtHYXtT1Oy","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"image_light":{},"tag":[],"label":"User Stories","link":[{"type":"paragraph","text":"https://plotly.com/user-stories/","spans":[],"direction":"ltr"}],"description":null,"category_name":null},{"image":{"dimensions":{"width":150,"height":150},"alt":"Events Icon","copyright":null,"url":"https://plotly-marketing-website-2.cdn.prismic.io/plotly-marketing-website-2/ZlUK5qWtHYXtT1O2_Frame30.svg","id":"ZlUK5qWtHYXtT1O2","edit":{"x":0,"y":0,"zoom":1,"background":"#fff"}},"image_light":{},"tag":[],"label":"Events","link":[{"type":"paragraph","text":"https://plotly.com/events/","spans":[{"start":0,"end":26,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/events/"}}]}],"description":null,"category_name":null},{"image":{"dimensions":{"width":150,"height":150},"alt":"WEBINARS","copyright":null,"url":"https://plotly-marketing-website-2.cdn.prismic.io/plotly-marketing-website-2/0dd399cc-96c3-41d7-9133-de4a1aa60295_company_dropdown_icon-04.svg","id":"YkJtzRAAAB8AhTD5","edit":{"x":0,"y":0,"zoom":1,"background":"#fff"}},"image_light":{},"tag":[],"label":"Webinars","link":[{"type":"paragraph","text":"https://plotly.com/resources/webinars/","spans":[{"start":0,"end":38,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/resources/webinars/"}}]}],"description":null,"category_name":null},{"image":{"dimensions":{"width":150,"height":150},"alt":"BLOG","copyright":null,"url":"https://plotly-marketing-website-2.cdn.prismic.io/plotly-marketing-website-2/9a1aabd8-6513-4d63-9219-6c0a63f4bb2a_company_dropdown_icon-05.svg","id":"YgTBpBIAACAAgPnn","edit":{"x":0,"y":0,"zoom":1,"background":"#fff"}},"image_light":{},"tag":[],"label":"Blog","link":[{"type":"paragraph","text":"https://plotly.com/blog/","spans":[{"start":0,"end":24,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/blog/"}}]}],"description":null,"category_name":null},{"image":{"dimensions":{"width":150,"height":150},"alt":"White Papers","copyright":null,"url":"https://plotly-marketing-website-2.cdn.prismic.io/plotly-marketing-website-2/0148d187-07c6-4448-8b14-69e91975ff9b_company_dropdown_icon-03.svg","id":"YgTBkRIAACIAgPmV","edit":{"x":0,"y":0,"zoom":1,"background":"#fff"}},"image_light":{},"tag":[],"label":"White Papers","link":[{"type":"paragraph","text":"https://plotly.com/resources/","spans":[{"start":0,"end":29,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/resources/"}}]}],"description":null,"category_name":null}],"id":"menu$1240e3fc-053c-4009-af3a-32e163e24bba","slice_type":"menu","slice_label":null},{"primary":{"label":"Solutions","link":[{"type":"paragraph","text":"","spans":[]}],"block_image":{"dimensions":{"width":150,"height":150},"alt":"Customer Use Cases","copyright":null,"url":"https://plotly-marketing-website-2.cdn.prismic.io/plotly-marketing-website-2/ZszVuUaF0TcGJZ7p_CustomerUseCases-1-.svg","id":"ZszVuUaF0TcGJZ7p","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"block_text":[{"type":"paragraph","text":"Customer Use Cases","spans":[]}],"block_link":{"link_type":"Web","url":"https://plotly.com/user-stories"},"highlighted_image":{"dimensions":{"width":2000,"height":1130},"alt":null,"copyright":null,"url":"https://images.prismic.io/plotly-marketing-website-2/b88bb25f-1455-4717-b5d6-f5e508d4e96b_Kansas+CC_thumbnail-min.png?auto=compress,format","id":"ZeaDYhAAACIA80jC","edit":{"x":0,"y":0,"zoom":1,"background":"transparent"}},"highlighted_title":"Kansas City Chiefs Champion Digital Transformation in Business and Operations","highlighted_link_name":"Read The User Story","highlighted_link":{"link_type":"Web","url":"https://plotly.com/user-stories/kansas-city-chiefs/"},"by_category":true},"items":[{"image":{},"image_light":{},"tag":[],"label":"Financial Services","link":[{"type":"paragraph","text":"https://plotly.com/solutions/finance/","spans":[{"start":0,"end":37,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/solutions/finance/"}}]}],"description":null,"category_name":"Industries"},{"image":{},"image_light":{},"tag":[],"label":"Healthcare \u0026 Life Sciences","link":[{"type":"paragraph","text":"https://plotly.com/solutions/healthcare-life-sciences-pharma/","spans":[{"start":0,"end":61,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/solutions/healthcare-life-sciences-pharma/"}}]}],"description":null,"category_name":"Industries"},{"image":{},"image_light":{},"tag":[],"label":"Energy \u0026 Utilities","link":[{"type":"paragraph","text":"https://plotly.com/solutions/energy/","spans":[{"start":0,"end":36,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/solutions/energy/"}}]}],"description":null,"category_name":"Industries"},{"image":{},"image_light":{},"tag":[],"label":"Aerospace \u0026 Defense","link":[{"type":"paragraph","text":"https://plotly.com/solutions/aerospace-defense/","spans":[],"direction":"ltr"}],"description":null,"category_name":"Industries"},{"image":{},"image_light":{},"tag":[],"label":"Retail","link":[{"type":"paragraph","text":"https://plotly.com/solutions/retail-data-apps/","spans":[],"direction":"ltr"}],"description":null,"category_name":"Industries"},{"image":{},"image_light":{},"tag":[],"label":"Manufacturing","link":[{"type":"paragraph","text":"https://plotly.com/solutions/manufacturing/","spans":[],"direction":"ltr"}],"description":null,"category_name":"Industries"},{"image":{},"image_light":{},"tag":[],"label":"Gen AI and ML","link":[{"type":"paragraph","text":"https://plotly.com/dash/ai-data-apps/","spans":[],"direction":"ltr"}],"description":null,"category_name":"Solutions"},{"image":{},"image_light":{},"tag":[],"label":"Databricks","link":[{"type":"paragraph","text":"https://plotly.com/dash/databricks/","spans":[{"start":0,"end":35,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/dash/databricks/"}}]}],"description":null,"category_name":"Solutions"},{"image":{},"image_light":{},"tag":[],"label":"Snowflake","link":[{"type":"paragraph","text":"https://plotly.com/dash/snowflake/","spans":[{"start":0,"end":34,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/dash/snowflake/"}}]}],"description":null,"category_name":"Solutions"},{"image":{},"image_light":{},"tag":[],"label":"AWS","link":[{"type":"paragraph","text":"https://plotly.com/dash/aws/","spans":[],"direction":"ltr"}],"description":null,"category_name":"Solutions"}],"id":"menu$8f505aeb-71a9-4e42-ab37-fc402f5ea2a2","slice_type":"menu","slice_label":null},{"primary":{"label":"Pricing","link":[{"type":"paragraph","text":"https://plotly.com/get-pricing/","spans":[{"start":0,"end":31,"type":"hyperlink","data":{"link_type":"Web","url":"https://plotly.com/get-pricing/"}}]}],"block_image":{},"block_text":[],"block_link":{"link_type":"Any"},"highlighted_image":{},"highlighted_title":null,"highlighted_link_name":null,"highlighted_link":{"link_type":"Any"},"by_category":false},"items":[],"id":"menu$7bb3da18-a805-4759-96b7-5ff13551eb40","slice_type":"menu","slice_label":null}],"button_label":"Demo Dash","button_link":"/get-demo/","has_top_banner":false,"promotion_text":[],"has_count_down_timer":false,"date":"2024-05-31T18:00:00+0000","text":[{"type":"paragraph","text":"Reserve your spot for the Dash Enterprise 5.2 launch event!","spans":[{"start":0,"end":17,"type":"hyperlink","data":{"link_type":"Web","url":"https://event.plotly.com/dash-enterprise","target":"_blank"}}]}],"after_note":[{"type":"paragraph","text":"","spans":[]}]}}},"__N_SSG":true},"page":"/blog/[slug]","query":{"slug":"polars-to-build-fast-dash-apps-for-large-datasets"},"buildId":"Pfu0RjjG6b1aZQz4cwz9J","isFallback":false,"dynamicIds":[73296,26403,85404,17155,56135,18229,62196,34798],"gsp":true,"scriptLoader":[{"id":"google-analytics","strategy":"afterInteractive","children":"\n (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\n new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\n j=d.createElement(s),dl=l!='dataLayer'?'\u0026l='+l:'';j.async=true;j.src=\n 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\n })(window,document,'script','dataLayer','GTM-N6T2RXG');\n "}]}</script><link data-next-font="size-adjust" rel="preconnect" href="/" crossorigin="anonymous"/><link rel="preload" href="/_next/static/css/02d9f9f75c65f165.css" as="style"/><link rel="stylesheet" href="/_next/static/css/02d9f9f75c65f165.css" data-n-g=""/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-78c92fac7aa8fdd8.js"></script><script src="https://cmp.osano.com/6oaqJU2PyDQy692N/b5f37218-31c6-485e-913d-d7ec6e8d0a22/osano.js" defer="" data-nscript="beforeInteractive"></script><script defer="" src="/_next/static/chunks/3296.339bd75027ddaf73.js"></script><script defer="" src="/_next/static/chunks/6403.a2687e2beb6356a4.js"></script><script defer="" src="/_next/static/chunks/5404.057688a02a6b3e78.js"></script><script defer="" src="/_next/static/chunks/7155.d640b09b2f494c9d.js"></script><script defer="" src="/_next/static/chunks/6135.7dfd26e86f786c4b.js"></script><script defer="" src="/_next/static/chunks/3320.8830df50875c92fe.js"></script><script defer="" src="/_next/static/chunks/8229.0b55d196bdc14731.js"></script><script defer="" src="/_next/static/chunks/2196.7c4873f31770d790.js"></script><script defer="" src="/_next/static/chunks/78e521c3.75a551c016e2a773.js"></script><script defer="" src="/_next/static/chunks/d7eeaac4.320d014a6fcbb825.js"></script><script defer="" src="/_next/static/chunks/1421.8a35cd8833461dd6.js"></script><script defer="" src="/_next/static/chunks/4798.2d8a3c0bed1dee63.js"></script><script src="/_next/static/chunks/webpack-2db160b08a0ac86f.js" defer=""></script><script src="/_next/static/chunks/framework-0e8d27528ba61906.js" defer=""></script><script src="/_next/static/chunks/main-b4b7f66f4bb01458.js" defer=""></script><script src="/_next/static/chunks/pages/_app-c7ba790674848f34.js" defer=""></script><script src="/_next/static/chunks/17007de1-56390cd97b47d65e.js" defer=""></script><script src="/_next/static/chunks/9b380ffa-cec447e94a5ce576.js" defer=""></script><script src="/_next/static/chunks/5309-ff295da2e018ee87.js" defer=""></script><script src="/_next/static/chunks/2107-fa8394f0ab78aab1.js" defer=""></script><script src="/_next/static/chunks/pages/blog/%5Bslug%5D-8e293d87f6bc08d1.js" defer=""></script><script src="/_next/static/Pfu0RjjG6b1aZQz4cwz9J/_buildManifest.js" defer=""></script><script src="/_next/static/Pfu0RjjG6b1aZQz4cwz9J/_ssgManifest.js" defer=""></script></head><body><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-N6T2RXG" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><script id="chakra-script">!(function(){try{var a=function(c){var v="(prefers-color-scheme: dark)",h=window.matchMedia(v).matches?"dark":"light",r=c==="system"?h:c,o=document.documentElement,s=document.body,l="chakra-ui-light",d="chakra-ui-dark",i=r==="dark";return s.classList.add(i?d:l),s.classList.remove(i?l:d),o.style.colorScheme=r,o.dataset.theme=r,r},n=a,m="dark",e="chakra-ui-color-mode",t=localStorage.getItem(e);t?a(t):localStorage.setItem(e,a(m))}catch(a){}})();</script><div id="__next"><style data-emotion="css-global 1ja279s">:host,:root,[data-theme]{--chakra-ring-inset:var(--chakra-empty,/*!*/ /*!*/);--chakra-ring-offset-width:0px;--chakra-ring-offset-color:#fff;--chakra-ring-color:rgba(66, 153, 225, 0.6);--chakra-ring-offset-shadow:0 0 #0000;--chakra-ring-shadow:0 0 #0000;--chakra-space-x-reverse:0;--chakra-space-y-reverse:0;--chakra-colors-transparent:transparent;--chakra-colors-current:currentColor;--chakra-colors-black:#fff;--chakra-colors-white:#fff;--chakra-colors-whiteAlpha-50:rgba(255, 255, 255, 0.04);--chakra-colors-whiteAlpha-100:rgba(255, 255, 255, 0.06);--chakra-colors-whiteAlpha-200:rgba(255, 255, 255, 0.08);--chakra-colors-whiteAlpha-300:rgba(255, 255, 255, 0.16);--chakra-colors-whiteAlpha-400:rgba(255, 255, 255, 0.24);--chakra-colors-whiteAlpha-500:rgba(255, 255, 255, 0.36);--chakra-colors-whiteAlpha-600:rgba(255, 255, 255, 0.48);--chakra-colors-whiteAlpha-700:rgba(255, 255, 255, 0.64);--chakra-colors-whiteAlpha-800:rgba(255, 255, 255, 0.80);--chakra-colors-whiteAlpha-900:rgba(255, 255, 255, 0.92);--chakra-colors-blackAlpha-50:rgba(0, 0, 0, 0.04);--chakra-colors-blackAlpha-100:rgba(0, 0, 0, 0.06);--chakra-colors-blackAlpha-200:rgba(0, 0, 0, 0.08);--chakra-colors-blackAlpha-300:rgba(0, 0, 0, 0.16);--chakra-colors-blackAlpha-400:rgba(0, 0, 0, 0.24);--chakra-colors-blackAlpha-500:rgba(0, 0, 0, 0.36);--chakra-colors-blackAlpha-600:rgba(0, 0, 0, 0.48);--chakra-colors-blackAlpha-700:rgba(0, 0, 0, 0.64);--chakra-colors-blackAlpha-800:rgba(0, 0, 0, 0.80);--chakra-colors-blackAlpha-900:rgba(0, 0, 0, 0.92);--chakra-colors-gray-25:#F9F9F9;--chakra-colors-gray-50:#DFDFDF;--chakra-colors-gray-100:#EDF2F7;--chakra-colors-gray-200:#E2E8F0;--chakra-colors-gray-300:#CBD5E0;--chakra-colors-gray-400:#A0AEC0;--chakra-colors-gray-500:#575757;--chakra-colors-gray-600:#4A5568;--chakra-colors-gray-700:#2D3748;--chakra-colors-gray-800:#1A202C;--chakra-colors-gray-900:#0c0c0c;--chakra-colors-red-50:#FFF5F5;--chakra-colors-red-100:#FED7D7;--chakra-colors-red-200:#FEB2B2;--chakra-colors-red-300:#FC8181;--chakra-colors-red-400:#F56565;--chakra-colors-red-500:#E53E3E;--chakra-colors-red-600:#C53030;--chakra-colors-red-700:#9B2C2C;--chakra-colors-red-800:#822727;--chakra-colors-red-900:#63171B;--chakra-colors-red-primary:#ff3b3b;--chakra-colors-orange-50:#FFFAF0;--chakra-colors-orange-100:#FEEBC8;--chakra-colors-orange-200:#FBD38D;--chakra-colors-orange-300:#F6AD55;--chakra-colors-orange-400:#ED8936;--chakra-colors-orange-500:#DD6B20;--chakra-colors-orange-600:#C05621;--chakra-colors-orange-700:#9C4221;--chakra-colors-orange-800:#7B341E;--chakra-colors-orange-900:#652B19;--chakra-colors-yellow-50:#FFFFF0;--chakra-colors-yellow-100:#FEFCBF;--chakra-colors-yellow-200:#FAF089;--chakra-colors-yellow-300:#F6E05E;--chakra-colors-yellow-400:#ECC94B;--chakra-colors-yellow-500:#D69E2E;--chakra-colors-yellow-600:#B7791F;--chakra-colors-yellow-700:#975A16;--chakra-colors-yellow-800:#744210;--chakra-colors-yellow-900:#5F370E;--chakra-colors-yellow-primary:#ffce55;--chakra-colors-green-50:#F0FFF4;--chakra-colors-green-100:#C6F6D5;--chakra-colors-green-200:#9AE6B4;--chakra-colors-green-300:#68D391;--chakra-colors-green-400:#48BB78;--chakra-colors-green-500:#38A169;--chakra-colors-green-600:#2F855A;--chakra-colors-green-700:#276749;--chakra-colors-green-800:#22543D;--chakra-colors-green-900:#1C4532;--chakra-colors-green-primary:#4bbf64;--chakra-colors-teal-50:#E6FFFA;--chakra-colors-teal-100:#B2F5EA;--chakra-colors-teal-200:#81E6D9;--chakra-colors-teal-300:#4FD1C5;--chakra-colors-teal-400:#38B2AC;--chakra-colors-teal-500:#319795;--chakra-colors-teal-600:#2C7A7B;--chakra-colors-teal-700:#285E61;--chakra-colors-teal-800:#234E52;--chakra-colors-teal-900:#1D4044;--chakra-colors-blue-50:#ebf8ff;--chakra-colors-blue-100:#bee3f8;--chakra-colors-blue-200:#90cdf4;--chakra-colors-blue-300:#63b3ed;--chakra-colors-blue-400:#4299e1;--chakra-colors-blue-500:#3182ce;--chakra-colors-blue-600:#2b6cb0;--chakra-colors-blue-700:#2c5282;--chakra-colors-blue-800:#2a4365;--chakra-colors-blue-900:#1A365D;--chakra-colors-blue-primary:#3479f3;--chakra-colors-cyan-50:#EDFDFD;--chakra-colors-cyan-100:#C4F1F9;--chakra-colors-cyan-200:#9DECF9;--chakra-colors-cyan-300:#76E4F7;--chakra-colors-cyan-400:#0BC5EA;--chakra-colors-cyan-500:#00B5D8;--chakra-colors-cyan-600:#00A3C4;--chakra-colors-cyan-700:#0987A0;--chakra-colors-cyan-800:#086F83;--chakra-colors-cyan-900:#065666;--chakra-colors-cyan-primary:#00f2e4;--chakra-colors-purple-50:#FAF5FF;--chakra-colors-purple-100:#E9D8FD;--chakra-colors-purple-200:#D6BCFA;--chakra-colors-purple-300:#B794F4;--chakra-colors-purple-400:#9F7AEA;--chakra-colors-purple-500:#805AD5;--chakra-colors-purple-600:#6B46C1;--chakra-colors-purple-700:#553C9A;--chakra-colors-purple-800:#44337A;--chakra-colors-purple-900:#322659;--chakra-colors-purple-primary:#7A76FF;--chakra-colors-pink-50:#FFF5F7;--chakra-colors-pink-100:#FED7E2;--chakra-colors-pink-200:#FBB6CE;--chakra-colors-pink-300:#F687B3;--chakra-colors-pink-400:#ED64A6;--chakra-colors-pink-500:#D53F8C;--chakra-colors-pink-600:#B83280;--chakra-colors-pink-700:#97266D;--chakra-colors-pink-800:#702459;--chakra-colors-pink-900:#521B41;--chakra-colors-pink-primary:#ff2d6e;--chakra-colors-linkedin-50:#E8F4F9;--chakra-colors-linkedin-100:#CFEDFB;--chakra-colors-linkedin-200:#9BDAF3;--chakra-colors-linkedin-300:#68C7EC;--chakra-colors-linkedin-400:#34B3E4;--chakra-colors-linkedin-500:#00A0DC;--chakra-colors-linkedin-600:#008CC9;--chakra-colors-linkedin-700:#0077B5;--chakra-colors-linkedin-800:#005E93;--chakra-colors-linkedin-900:#004471;--chakra-colors-facebook-50:#E8F4F9;--chakra-colors-facebook-100:#D9DEE9;--chakra-colors-facebook-200:#B7C2DA;--chakra-colors-facebook-300:#6482C0;--chakra-colors-facebook-400:#4267B2;--chakra-colors-facebook-500:#385898;--chakra-colors-facebook-600:#314E89;--chakra-colors-facebook-700:#29487D;--chakra-colors-facebook-800:#223B67;--chakra-colors-facebook-900:#1E355B;--chakra-colors-messenger-50:#D0E6FF;--chakra-colors-messenger-100:#B9DAFF;--chakra-colors-messenger-200:#A2CDFF;--chakra-colors-messenger-300:#7AB8FF;--chakra-colors-messenger-400:#2E90FF;--chakra-colors-messenger-500:#0078FF;--chakra-colors-messenger-600:#0063D1;--chakra-colors-messenger-700:#0052AC;--chakra-colors-messenger-800:#003C7E;--chakra-colors-messenger-900:#002C5C;--chakra-colors-whatsapp-50:#dffeec;--chakra-colors-whatsapp-100:#b9f5d0;--chakra-colors-whatsapp-200:#90edb3;--chakra-colors-whatsapp-300:#65e495;--chakra-colors-whatsapp-400:#3cdd78;--chakra-colors-whatsapp-500:#22c35e;--chakra-colors-whatsapp-600:#179848;--chakra-colors-whatsapp-700:#0c6c33;--chakra-colors-whatsapp-800:#01421c;--chakra-colors-whatsapp-900:#001803;--chakra-colors-twitter-50:#E5F4FD;--chakra-colors-twitter-100:#C8E9FB;--chakra-colors-twitter-200:#A8DCFA;--chakra-colors-twitter-300:#83CDF7;--chakra-colors-twitter-400:#57BBF5;--chakra-colors-twitter-500:#1DA1F2;--chakra-colors-twitter-600:#1A94DA;--chakra-colors-twitter-700:#1681BF;--chakra-colors-twitter-800:#136B9E;--chakra-colors-twitter-900:#0D4D71;--chakra-colors-telegram-50:#E3F2F9;--chakra-colors-telegram-100:#C5E4F3;--chakra-colors-telegram-200:#A2D4EC;--chakra-colors-telegram-300:#7AC1E4;--chakra-colors-telegram-400:#47A9DA;--chakra-colors-telegram-500:#0088CC;--chakra-colors-telegram-600:#007AB8;--chakra-colors-telegram-700:#006BA1;--chakra-colors-telegram-800:#005885;--chakra-colors-telegram-900:#003F5E;--chakra-colors-app-light-star:#fff;--chakra-colors-app-light-bgThumb:#000;--chakra-colors-app-light-bgTrack:#fff;--chakra-colors-app-light-switchChecked:#575757;--chakra-colors-app-light-gradientStart:#7A76FF;--chakra-colors-app-light-gradientEnd:#00f2e4;--chakra-colors-app-light-gradientEndSecondary:#7FE4FF;--chakra-colors-app-light-bgPrimary:#fff;--chakra-colors-app-light-bgDashPost:transparent;--chakra-colors-app-light-bgSecondary:#fff;--chakra-colors-app-light-bgTertiary:#212121;--chakra-colors-app-light-bgQuaternary:#f9f9f9;--chakra-colors-app-light-textPrimary:#282D33;--chakra-colors-app-light-textSecondary:#000;--chakra-colors-app-light-textTertiary:#A2AAB8;--chakra-colors-app-light-bodyText:#5B6372;--chakra-colors-app-light-bodyTextSecondary:#919191;--chakra-colors-app-light-lines:#A2AAB8;--chakra-colors-app-light-accentPrimary:#7A76FF;--chakra-colors-app-light-accentSecondary:#3479f3;--chakra-colors-app-light-accentTertiary:#7FE4FF;--chakra-colors-app-light-accentQuaternary:#7fe4f;--chakra-colors-app-light-bulletGray:#a2aab7;--chakra-colors-app-light-greyPrimary:#f9f9f9;--chakra-colors-app-light-greySecondary:#fff;--chakra-colors-app-light-grayPrimary:#a2aab7;--chakra-colors-app-light-graySecondary:#494949;--chakra-colors-app-light-grayTertiary:#E2E8F0;--chakra-colors-app-light-grayQuaternary:#fff;--chakra-colors-app-light-grayQuinary:#D8DDE5;--chakra-colors-app-light-lightGrayPrimary:#9ba2b1;--chakra-colors-app-light-lightGraySecondary:#a3a9b7;--chakra-colors-app-light-lightGrayTertiary:#f8f8f8;--chakra-colors-app-light-linkPrimary:#7A76FF;--chakra-colors-app-light-redPrimary:#ff3b3b;--chakra-colors-app-light-yellowPrimary:#ffce55;--chakra-colors-app-light-greenPrimary:#4bbf64;--chakra-colors-app-light-pinkPrimary:#ff2d6e;--chakra-colors-app-light-border:#DFDFDF;--chakra-colors-app-light-borderSecondary:#5c5e62;--chakra-colors-app-light-borderTertiary:#282d33;--chakra-colors-app-light-borderQuarternary:#27282c;--chakra-colors-app-light-scrollbar:#555555;--chakra-colors-app-light-darkBlue:#1E3953;--chakra-colors-app-light-darkBLueSecondary:#DFDFDF;--chakra-colors-app-light-turquoise:#7A76FF;--chakra-colors-app-light-black:#fff;--chakra-colors-app-light-blackSecondary:#fff;--chakra-colors-app-light-darkGray:#19181c;--chakra-colors-app-light-codeBackground:#f3f6fb;--chakra-colors-app-light-codeBorder:#e0e8f2;--chakra-colors-app-light-codeColor:#20293d;--chakra-colors-app-light-footerLink:rgb(129 130 131 / 96%);--chakra-colors-app-light-pink:#fe2d6d;--chakra-colors-app-dark-star:#121317;--chakra-colors-app-dark-bgThumb:#000;--chakra-colors-app-dark-bgTrack:#fff;--chakra-colors-app-dark-switchChecked:#575757;--chakra-colors-app-dark-gradientStart:#7A76FF;--chakra-colors-app-dark-gradientEnd:#00f2e4;--chakra-colors-app-dark-gradientEndSecondary:#7FE4FF;--chakra-colors-app-dark-bgPrimary:#00000;--chakra-colors-app-dark-bgDashPost:#0c0c0c;--chakra-colors-app-dark-bgSecondary:#0D0E0F;--chakra-colors-app-dark-bgTertiary:#212121;--chakra-colors-app-dark-bgQuaternary:#101010;--chakra-colors-app-dark-textPrimary:#fff;--chakra-colors-app-dark-textSecondary:#000;--chakra-colors-app-dark-textTertiary:#fff;--chakra-colors-app-dark-bodyText:#A2AAB8;--chakra-colors-app-dark-bodyTextSecondary:#121317;--chakra-colors-app-dark-lines:#282d33;--chakra-colors-app-dark-accentPrimary:#7A76FF;--chakra-colors-app-dark-accentSecondary:#3479f3;--chakra-colors-app-dark-accentTertiary:#7FE4FF;--chakra-colors-app-dark-accentQuaternary:#7fe4f;--chakra-colors-app-dark-bulletGray:#a2aab7;--chakra-colors-app-dark-greyPrimary:#2A2E30;--chakra-colors-app-dark-greySecondary:#121317;--chakra-colors-app-dark-grayPrimary:#303030;--chakra-colors-app-dark-graySecondary:#494949;--chakra-colors-app-dark-grayTertiary:#E2E8F0;--chakra-colors-app-dark-grayQuaternary:#1c1c1c;--chakra-colors-app-dark-grayQuinary:#282D33;--chakra-colors-app-dark-lightGrayPrimary:#9ba2b1;--chakra-colors-app-dark-lightGraySecondary:#a3a9b7;--chakra-colors-app-dark-lightGrayTertiary:#f8f8f8;--chakra-colors-app-dark-linkPrimary:#7A76FF;--chakra-colors-app-dark-redPrimary:#ff3b3b;--chakra-colors-app-dark-yellowPrimary:#ffce55;--chakra-colors-app-dark-pinkPrimary:#ff2d6e;--chakra-colors-app-dark-greenPrimary:#4bbf64;--chakra-colors-app-dark-border:#282D33;--chakra-colors-app-dark-borderSecondary:#5c5e62;--chakra-colors-app-dark-borderTertiary:#282D33;--chakra-colors-app-dark-borderQuarternary:#27282c;--chakra-colors-app-dark-scrollbar:#555555;--chakra-colors-app-dark-darkBlue:#1E3953;--chakra-colors-app-dark-darkBLueSecondary:#17181a;--chakra-colors-app-dark-turquoise:#7A76FF;--chakra-colors-app-dark-black:#000;--chakra-colors-app-dark-blackSecondary:#101010;--chakra-colors-app-dark-darkGray:#19181c;--chakra-colors-app-dark-codeBackground:#292C33;--chakra-colors-app-dark-codeBorder:#34383F;--chakra-colors-app-dark-codeColor:#79808B;--chakra-colors-app-dark-footerLink:rgb(129 130 131 / 96%);--chakra-colors-app-dark-pink:#fe2d6d;--chakra-borders-none:0;--chakra-borders-1px:1px solid;--chakra-borders-2px:2px solid;--chakra-borders-4px:4px solid;--chakra-borders-8px:8px solid;--chakra-fonts-heading:Roboto,sans-serif;--chakra-fonts-body:Open Sans,sans-serif;--chakra-fonts-mono:Menlo,monospace;--chakra-fontSizes-3xs:10px;--chakra-fontSizes-2xs:11px;--chakra-fontSizes-xs:12px;--chakra-fontSizes-sm:13px;--chakra-fontSizes-md:14px;--chakra-fontSizes-lg:15px;--chakra-fontSizes-xl:16px;--chakra-fontSizes-2xl:18px;--chakra-fontSizes-3xl:24px;--chakra-fontSizes-4xl:28px;--chakra-fontSizes-5xl:32px;--chakra-fontSizes-6xl:36px;--chakra-fontSizes-7xl:38px;--chakra-fontSizes-8xl:46px;--chakra-fontSizes-9xl:48px;--chakra-fontSizes-4xs:9px;--chakra-fontSizes-1xl:17px;--chakra-fontSizes-2-25xl:19px;--chakra-fontSizes-2-5xl:20px;--chakra-fontSizes-2-6xl:21px;--chakra-fontSizes-2-75xl:22px;--chakra-fontSizes-3-5xl:25px;--chakra-fontSizes-4-5xl:30px;--chakra-fontSizes-5-5xl:34px;--chakra-fontSizes-7-5xl:40px;--chakra-fontSizes-9-5xl:52px;--chakra-fontSizes-10xl:77px;--chakra-fontWeights-hairline:100;--chakra-fontWeights-thin:200;--chakra-fontWeights-light:300;--chakra-fontWeights-normal:400;--chakra-fontWeights-medium:500;--chakra-fontWeights-semibold:600;--chakra-fontWeights-bold:700;--chakra-fontWeights-extrabold:800;--chakra-fontWeights-black:900;--chakra-letterSpacings-tighter:-0.05em;--chakra-letterSpacings-tight:-0.025em;--chakra-letterSpacings-normal:0;--chakra-letterSpacings-wide:0.025em;--chakra-letterSpacings-wider:0.05em;--chakra-letterSpacings-widest:0.1em;--chakra-lineHeights-3:.75rem;--chakra-lineHeights-4:1rem;--chakra-lineHeights-5:1.25rem;--chakra-lineHeights-6:1.5rem;--chakra-lineHeights-7:1.75rem;--chakra-lineHeights-8:2rem;--chakra-lineHeights-9:2.25rem;--chakra-lineHeights-10:2.5rem;--chakra-lineHeights-normal:normal;--chakra-lineHeights-none:1;--chakra-lineHeights-shorter:1.25;--chakra-lineHeights-short:1.375;--chakra-lineHeights-base:1.5;--chakra-lineHeights-tall:1.625;--chakra-lineHeights-taller:2;--chakra-radii-none:0;--chakra-radii-sm:0.125rem;--chakra-radii-base:0.25rem;--chakra-radii-md:0.375rem;--chakra-radii-lg:0.5rem;--chakra-radii-xl:0.75rem;--chakra-radii-2xl:1rem;--chakra-radii-3xl:1.5rem;--chakra-radii-full:9999px;--chakra-space-1:0.25rem;--chakra-space-2:0.5rem;--chakra-space-3:0.75rem;--chakra-space-4:1rem;--chakra-space-5:1.25rem;--chakra-space-6:1.5rem;--chakra-space-7:1.75rem;--chakra-space-8:2rem;--chakra-space-9:2.25rem;--chakra-space-10:2.5rem;--chakra-space-12:3rem;--chakra-space-14:3.5rem;--chakra-space-16:4rem;--chakra-space-20:5rem;--chakra-space-24:6rem;--chakra-space-28:7rem;--chakra-space-32:8rem;--chakra-space-36:9rem;--chakra-space-40:10rem;--chakra-space-44:11rem;--chakra-space-48:12rem;--chakra-space-52:13rem;--chakra-space-56:14rem;--chakra-space-60:15rem;--chakra-space-64:16rem;--chakra-space-72:18rem;--chakra-space-80:20rem;--chakra-space-96:24rem;--chakra-space-px:1px;--chakra-space-0-5:0.125rem;--chakra-space-1-5:0.375rem;--chakra-space-2-5:0.625rem;--chakra-space-3-5:0.875rem;--chakra-shadows-xs:0 0 0 1px rgba(0, 0, 0, 0.05);--chakra-shadows-sm:0 1px 2px 0 rgba(0, 0, 0, 0.05);--chakra-shadows-base:0 1px 3px 0 rgba(0, 0, 0, 0.1),0 1px 2px 0 rgba(0, 0, 0, 0.06);--chakra-shadows-md:0 4px 6px -1px rgba(0, 0, 0, 0.1),0 2px 4px -1px rgba(0, 0, 0, 0.06);--chakra-shadows-lg:0 10px 15px -3px rgba(0, 0, 0, 0.1),0 4px 6px -2px rgba(0, 0, 0, 0.05);--chakra-shadows-xl:0 20px 25px -5px rgba(0, 0, 0, 0.1),0 10px 10px -5px rgba(0, 0, 0, 0.04);--chakra-shadows-2xl:0 25px 50px -12px rgba(0, 0, 0, 0.25);--chakra-shadows-outline:0 0 0 3px rgba(66, 153, 225, 0.6);--chakra-shadows-inner:inset 0 2px 4px 0 rgba(0,0,0,0.06);--chakra-shadows-none:none;--chakra-shadows-dark-lg:rgba(0, 0, 0, 0.1) 0px 0px 0px 1px,rgba(0, 0, 0, 0.2) 0px 5px 10px,rgba(0, 0, 0, 0.4) 0px 15px 40px;--chakra-sizes-1:0.25rem;--chakra-sizes-2:0.5rem;--chakra-sizes-3:0.75rem;--chakra-sizes-4:1rem;--chakra-sizes-5:1.25rem;--chakra-sizes-6:1.5rem;--chakra-sizes-7:1.75rem;--chakra-sizes-8:2rem;--chakra-sizes-9:2.25rem;--chakra-sizes-10:2.5rem;--chakra-sizes-12:3rem;--chakra-sizes-14:3.5rem;--chakra-sizes-16:4rem;--chakra-sizes-20:5rem;--chakra-sizes-24:6rem;--chakra-sizes-28:7rem;--chakra-sizes-32:8rem;--chakra-sizes-36:9rem;--chakra-sizes-40:10rem;--chakra-sizes-44:11rem;--chakra-sizes-48:12rem;--chakra-sizes-52:13rem;--chakra-sizes-56:14rem;--chakra-sizes-60:15rem;--chakra-sizes-64:16rem;--chakra-sizes-72:18rem;--chakra-sizes-80:20rem;--chakra-sizes-96:24rem;--chakra-sizes-px:1px;--chakra-sizes-0-5:0.125rem;--chakra-sizes-1-5:0.375rem;--chakra-sizes-2-5:0.625rem;--chakra-sizes-3-5:0.875rem;--chakra-sizes-max:max-content;--chakra-sizes-min:min-content;--chakra-sizes-full:100%;--chakra-sizes-3xs:14rem;--chakra-sizes-2xs:16rem;--chakra-sizes-xs:20rem;--chakra-sizes-sm:24rem;--chakra-sizes-md:28rem;--chakra-sizes-lg:32rem;--chakra-sizes-xl:36rem;--chakra-sizes-2xl:42rem;--chakra-sizes-3xl:48rem;--chakra-sizes-4xl:56rem;--chakra-sizes-5xl:64rem;--chakra-sizes-6xl:72rem;--chakra-sizes-7xl:80rem;--chakra-sizes-8xl:90rem;--chakra-sizes-prose:60ch;--chakra-sizes-container-sm:640px;--chakra-sizes-container-md:768px;--chakra-sizes-container-lg:1024px;--chakra-sizes-container-xl:1280px;--chakra-zIndices-hide:-1;--chakra-zIndices-auto:auto;--chakra-zIndices-base:0;--chakra-zIndices-docked:10;--chakra-zIndices-dropdown:1000;--chakra-zIndices-sticky:1100;--chakra-zIndices-banner:1200;--chakra-zIndices-overlay:1300;--chakra-zIndices-modal:1400;--chakra-zIndices-popover:1500;--chakra-zIndices-skipLink:1600;--chakra-zIndices-toast:1700;--chakra-zIndices-tooltip:1800;--chakra-transition-property-common:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;--chakra-transition-property-colors:background-color,border-color,color,fill,stroke;--chakra-transition-property-dimensions:width,height;--chakra-transition-property-position:left,right,top,bottom;--chakra-transition-property-background:background-color,background-image,background-position;--chakra-transition-easing-ease-in:cubic-bezier(0.4, 0, 1, 1);--chakra-transition-easing-ease-out:cubic-bezier(0, 0, 0.2, 1);--chakra-transition-easing-ease-in-out:cubic-bezier(0.4, 0, 0.2, 1);--chakra-transition-duration-ultra-fast:50ms;--chakra-transition-duration-faster:100ms;--chakra-transition-duration-fast:150ms;--chakra-transition-duration-normal:200ms;--chakra-transition-duration-slow:300ms;--chakra-transition-duration-slower:400ms;--chakra-transition-duration-ultra-slow:500ms;--chakra-blur-none:0;--chakra-blur-sm:4px;--chakra-blur-base:8px;--chakra-blur-md:12px;--chakra-blur-lg:16px;--chakra-blur-xl:24px;--chakra-blur-2xl:40px;--chakra-blur-3xl:64px;--chakra-breakpoints-base:0em;--chakra-breakpoints-sm:576px;--chakra-breakpoints-md:768px;--chakra-breakpoints-lg:960px;--chakra-breakpoints-xl:1200px;--chakra-breakpoints-2xl:2000px;--chakra-breakpoints-2sm:240px;--chakra-breakpoints-xxl:1800px;--chakra-breakpoints-2xxl:2300px;--chakra-colors-star:#fff;--chakra-colors-bgThumb:#000;--chakra-colors-bgTrack:#fff;--chakra-colors-switchChecked:#575757;--chakra-colors-gradientStart:#7A76FF;--chakra-colors-gradientEnd:#00f2e4;--chakra-colors-gradientEndSecondary:#7FE4FF;--chakra-colors-bgPrimary:#fff;--chakra-colors-bgPrimaryTransparent:var(--chakra-colors-transparent);--chakra-colors-bgDashPost:var(--chakra-colors-transparent);--chakra-colors-bgSecondary:#fff;--chakra-colors-bgTertiary:#212121;--chakra-colors-bgQuaternary:#f9f9f9;--chakra-colors-bgNewsArticle:#F3F3F3;--chakra-colors-bgWebinarCard:#FBFBFB;--chakra-colors-textPrimary:#282D33;--chakra-colors-textSecondary:#0000;--chakra-colors-textTertiary:#A2AAB8;--chakra-colors-bodyText:#5B6372;--chakra-colors-bodyTextSecondary:#919191;--chakra-colors-lines:#A2AAB8;--chakra-colors-accentPrimary:#7A76FF;--chakra-colors-accentSecondary:#3479f3;--chakra-colors-accentTertiary:#7FE4FF;--chakra-colors-accentQuaternary:#7fe4f;--chakra-colors-bulletGray:#a2aab7;--chakra-colors-greyPrimary:#f9f9f9;--chakra-colors-greySecondary:#fff;--chakra-colors-grayPrimary:#a2aab7;--chakra-colors-graySecondary:#494949;--chakra-colors-grayTertiary:#E2E8F0;--chakra-colors-grayQuaternary:#fff;--chakra-colors-grayQuinary:#D8DDE5;--chakra-colors-lightGrayPrimary:#9ba2b1;--chakra-colors-lightGraySecondary:#a3a9b7;--chakra-colors-lightGrayTertiary:#f8f8f8;--chakra-colors-linkPrimary:#7A76FF;--chakra-colors-linkColor:#282d33;--chakra-colors-redPrimary:#ff3b3b;--chakra-colors-yellowPrimary:#ffce55;--chakra-colors-greenPrimary:#4bbf64;--chakra-colors-pinkPrimary:#ff2d6e;--chakra-colors-border:#DFDFDF;--chakra-colors-borderSecondary:#5c5e62;--chakra-colors-borderTertiary:#282d33;--chakra-colors-borderQuarternary:#27282c;--chakra-colors-scrollbar:#555555;--chakra-colors-darkBlue:#1E3953;--chakra-colors-darkBLueSecondary:#DFDFDF;--chakra-colors-turquoise:#7A76FF;--chakra-colors-blackSecondary:#fff;--chakra-colors-darkGray:#19181c;--chakra-colors-codeBackground:#f3f6fb;--chakra-colors-codeBorder:#e0e8f2;--chakra-colors-codeColor:#20293d;--chakra-colors-radioCheck:#5B6372;--chakra-colors-aboutTitle:#ececec;--chakra-colors-footerLink:rgb(129 130 131 / 96%);--chakra-colors-pink:#fe2d6d;--chakra-colors-customGradient:linear-gradient(135deg, #7A76FF, #7A76FF, #7FE4FF);--chakra-colors-radialGradientPurple:radial-gradient(#A29FFF, transparent, transparent, transparent, transparent, transparent, transparent);--chakra-colors-radialGradientCyan:radial-gradient(#7FE4FF, transparent, transparent, transparent, transparent, transparent, transparent);--chakra-shadows-ctaButton:2px 1000px 1px #ffffff inset;--chakra-shadows-ctaButtonSecondary:2px 1000px 1px #f1fcfe inset;--chakra-shadows-ctaButtonHover:2px 1000px 1px #7A76FF inset;}.chakra-ui-dark :host:not([data-theme]),.chakra-ui-dark :root:not([data-theme]),.chakra-ui-dark [data-theme]:not([data-theme]),[data-theme=dark] :host:not([data-theme]),[data-theme=dark] :root:not([data-theme]),[data-theme=dark] [data-theme]:not([data-theme]),:host[data-theme=dark],:root[data-theme=dark],[data-theme][data-theme=dark]{--chakra-colors-black:#000;--chakra-colors-chakra-body-text:var(--chakra-colors-whiteAlpha-900);--chakra-colors-chakra-body-bg:var(--chakra-colors-gray-800);--chakra-colors-chakra-border-color:var(--chakra-colors-whiteAlpha-300);--chakra-colors-chakra-inverse-text:var(--chakra-colors-gray-800);--chakra-colors-chakra-subtle-bg:var(--chakra-colors-gray-700);--chakra-colors-chakra-subtle-text:var(--chakra-colors-gray-400);--chakra-colors-chakra-placeholder-color:var(--chakra-colors-whiteAlpha-400);--chakra-colors-star:#121317;--chakra-colors-bgThumb:#000;--chakra-colors-bgTrack:#fff;--chakra-colors-switchChecked:#575757;--chakra-colors-gradientEndSecondary:#7FE4FF;--chakra-colors-bgPrimary:#00000;--chakra-colors-bgPrimaryTransparent:#00000;--chakra-colors-bgDashPost:#0c0c0c;--chakra-colors-bgSecondary:#0D0E0F;--chakra-colors-bgTertiary:#212121;--chakra-colors-bgQuaternary:#101010;--chakra-colors-bgNewsArticle:#0F1012;--chakra-colors-bgWebinarCard:#0E0F10;--chakra-colors-textPrimary:#fff;--chakra-colors-textSecondary:#0000;--chakra-colors-textTertiary:#fff;--chakra-colors-bodyText:#A2AAB8;--chakra-colors-bodyTextSecondary:#121317;--chakra-colors-lines:#282d33;--chakra-colors-accentPrimary:#7A76FF;--chakra-colors-accentSecondary:#3479f3;--chakra-colors-accentTertiary:#7FE4FF;--chakra-colors-accentQuaternary:#7fe4f;--chakra-colors-bulletGray:#a2aab7;--chakra-colors-greyPrimary:#2A2E30;--chakra-colors-greySecondary:#121317;--chakra-colors-grayPrimary:#303030;--chakra-colors-graySecondary:#494949;--chakra-colors-grayTertiary:#E2E8F0;--chakra-colors-grayQuaternary:#1c1c1c;--chakra-colors-grayQuinary:#282D33;--chakra-colors-lightGrayPrimary:#9ba2b1;--chakra-colors-lightGraySecondary:#a3a9b7;--chakra-colors-lightGrayTertiary:#f8f8f8;--chakra-colors-linkPrimary:#7A76FF;--chakra-colors-linkColor:#fff;--chakra-colors-redPrimary:#ff3b3b;--chakra-colors-yellowPrimary:#ffce55;--chakra-colors-greenPrimary:#4bbf64;--chakra-colors-pinkPrimary:#ff2d6e;--chakra-colors-border:#282D33;--chakra-colors-borderSecondary:#5c5e62;--chakra-colors-borderTertiary:#282D33;--chakra-colors-borderQuarternary:#27282c;--chakra-colors-scrollbar:#555555;--chakra-colors-darkBlue:#1E3953;--chakra-colors-darkBLueSecondary:#17181a;--chakra-colors-turquoise:#7A76FF;--chakra-colors-blackSecondary:#101010;--chakra-colors-darkGray:#19181c;--chakra-colors-codeBackground:#292C33;--chakra-colors-codeBorder:#34383F;--chakra-colors-codeColor:#79808B;--chakra-colors-radioCheck:#fff;--chakra-colors-aboutTitle:#fff;--chakra-colors-footerLink:rgb(129 130 131 / 96%);--chakra-colors-pink:#fe2d6d;--chakra-colors-radialGradientPurple:radial-gradient(#7A76FF, #0c0c0c, #0c0c0c, #0c0c0c, #0c0c0c, #0c0c0c, #0c0c0c);--chakra-colors-radialGradientCyan:radial-gradient(#7FE4FF, transparent, transparent, transparent, transparent, transparent, transparent);--chakra-shadows-ctaButton:2px 1000px 1px #0C0C0C inset;--chakra-shadows-ctaButtonSecondary:2px 1000px 1px #32444E inset;--chakra-shadows-ctaButtonHover:2px 1000px 1px #7A76FF inset;}.chakra-ui-light :host:not([data-theme]),.chakra-ui-light :root:not([data-theme]),.chakra-ui-light [data-theme]:not([data-theme]),[data-theme=light] :host:not([data-theme]),[data-theme=light] :root:not([data-theme]),[data-theme=light] [data-theme]:not([data-theme]),:host[data-theme=light],:root[data-theme=light],[data-theme][data-theme=light]{--chakra-colors-chakra-body-text:var(--chakra-colors-gray-800);--chakra-colors-chakra-body-bg:var(--chakra-colors-white);--chakra-colors-chakra-border-color:var(--chakra-colors-gray-200);--chakra-colors-chakra-inverse-text:var(--chakra-colors-white);--chakra-colors-chakra-subtle-bg:var(--chakra-colors-gray-100);--chakra-colors-chakra-subtle-text:var(--chakra-colors-gray-600);--chakra-colors-chakra-placeholder-color:var(--chakra-colors-gray-500);}</style><style data-emotion="css-global fubdgu">html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:system-ui,sans-serif;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;touch-action:manipulation;}body{position:relative;min-height:100%;margin:0;font-feature-settings:"kern";}:where(*, *::before, *::after){border-width:0;border-style:solid;box-sizing:border-box;word-wrap:break-word;}main{display:block;}hr{border-top-width:1px;box-sizing:content-box;height:0;overflow:visible;}:where(pre, code, kbd,samp){font-family:SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:1em;}a{background-color:transparent;color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit;}abbr[title]{border-bottom:none;-webkit-text-decoration:underline;text-decoration:underline;-webkit-text-decoration:underline dotted;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;}:where(b, strong){font-weight:bold;}small{font-size:80%;}:where(sub,sup){font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sub{bottom:-0.25em;}sup{top:-0.5em;}img{border-style:none;}:where(button, input, optgroup, select, textarea){font-family:inherit;font-size:100%;line-height:1.15;margin:0;}:where(button, input){overflow:visible;}:where(button, select){text-transform:none;}:where( button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner ){border-style:none;padding:0;}fieldset{padding:0.35em 0.75em 0.625em;}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal;}progress{vertical-align:baseline;}textarea{overflow:auto;}:where([type="checkbox"], [type="radio"]){box-sizing:border-box;padding:0;}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{-webkit-appearance:none!important;}input[type="number"]{-moz-appearance:textfield;}input[type="search"]{-webkit-appearance:textfield;outline-offset:-2px;}input[type="search"]::-webkit-search-decoration{-webkit-appearance:none!important;}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit;}details{display:block;}summary{display:-webkit-box;display:-webkit-list-item;display:-ms-list-itembox;display:list-item;}template{display:none;}[hidden]{display:none!important;}:where( blockquote, dl, dd, h1, h2, h3, h4, h5, h6, hr, figure, p, pre ){margin:0;}button{background:transparent;padding:0;}fieldset{margin:0;padding:0;}:where(ol, ul){margin:0;padding:0;}textarea{resize:vertical;}:where(button, [role="button"]){cursor:pointer;}button::-moz-focus-inner{border:0!important;}table{border-collapse:collapse;}:where(h1, h2, h3, h4, h5, h6){font-size:inherit;font-weight:inherit;}:where(button, input, optgroup, select, textarea){padding:0;line-height:inherit;color:inherit;}:where(img, svg, video, canvas, audio, iframe, embed, object){display:block;}:where(img, video){max-width:100%;height:auto;}[data-js-focus-visible] :focus:not([data-focus-visible-added]):not( [data-focus-visible-disabled] ){outline:none;box-shadow:none;}select::-ms-expand{display:none;}:root,:host{--chakra-vh:100vh;}@supports (height: -webkit-fill-available){:root,:host{--chakra-vh:-webkit-fill-available;}}@supports (height: -moz-fill-available){:root,:host{--chakra-vh:-moz-fill-available;}}@supports (height: 100dvh){:root,:host{--chakra-vh:100dvh;}}</style><style data-emotion="css-global e5ay2d">body{font-family:var(--chakra-fonts-body);color:var(--chakra-colors-chakra-body-text);background:var(--chakra-colors-transparent);transition-property:background-color;transition-duration:var(--chakra-transition-duration-normal);line-height:var(--chakra-lineHeights-base);-webkit-transition:all 1s linear;transition:all 1s linear;}*::-webkit-input-placeholder{color:var(--chakra-colors-chakra-placeholder-color);}*::-moz-placeholder{color:var(--chakra-colors-chakra-placeholder-color);}*:-ms-input-placeholder{color:var(--chakra-colors-chakra-placeholder-color);}*::placeholder{color:var(--chakra-colors-chakra-placeholder-color);}*,*::before,::after{border-color:var(--chakra-colors-chakra-border-color);}html,body{scroll-behavior:smooth;}.osano-cm-widget{display:none;}.osano-cm-view--type_consent .osano-cm-list-item:nth-child(5){display:none;}.osano-cm-window{font-family:Open Sans,sans-serif;}.osano-cm-view{padding:0 1.5em 1em;}.chakra-ui-light .osano-cm-view:not([data-theme]),[data-theme=light] .osano-cm-view:not([data-theme]),.osano-cm-view[data-theme=light]{background:#FFFFFF;}.osano-cm-link{color:#3479F3!important;font-weight:var(--chakra-fontWeights-normal);}a.osano-cm-storage-policy{color:#3479F3;}a.osano-cm-link:hover{color:#3479F3;}a.osano-cm-link:visited{color:#3479F3;}. osano-cm-info-views__view osano-cm-view osano-cm-view--active osano-cm-view--type_consent{font-size:.7em;}.osano-cm-info-dialog-header__close{color:#FFFFFF;stroke:#FFFFFF;stroke-width:2px;}.chakra-ui-light .osano-cm-info-dialog-header__close:not([data-theme]),[data-theme=light] .osano-cm-info-dialog-header__close:not([data-theme]),.osano-cm-info-dialog-header__close[data-theme=light]{color:#000;stroke:#000;}.osano-cm-info-dialog-header__close:hover{color:#FFFFFF;stroke:#FFFFFF;stroke-width:2px;}.chakra-ui-light .osano-cm-info-dialog-header__close:hover:not([data-theme]),[data-theme=light] .osano-cm-info-dialog-header__close:hover:not([data-theme]),.osano-cm-info-dialog-header__close:hover[data-theme=light]{color:#000;stroke:#000;}button.osano-cm-button{color:#FFFFFF;background-color:#3479F3;border-color:none;padding:.75em 0.5em;font-size:12px;letter-spacing:1px;line-height:16.94px;border-radius:8px;}.chakra-ui-light button.osano-cm-button:not([data-theme]),[data-theme=light] button.osano-cm-button:not([data-theme]),button.osano-cm-button[data-theme=light]{border-color:#3479F3;}div.osano-cm-powered-by{display:none;}div.osano-cm-info{height:auto;}.osano-cm-dialog{background:#17181A;padding:2em 4em 2em 3em;font-size:14px;}.osano-cm-dialog--type_bar .osano-cm-button{padding:.5em 0;font-size:12px;line-height:16.94px;font-weight:700;border-radius:8px;}.osano-cm-usage-list__list{padding-left:20px;list-style-position:outside;}.osano-cm-dialog--type_bar .osano-cm-button{width:100%;}.osano-cm-dialog--type_bar .osano-cm-dialog__buttons{margin:0 0 0 .75em;}.osano-cm-dialog__close:focus:hover{stroke:#ebebeb;}.osano-cm-close:focus,.osano-cm-close:hover{stroke-width:1px;color:#ebebeb;}.osano-cm-dialog__close:focus{background-color:var(--chakra-colors-transparent);border-color:var(--chakra-colors-transparent);stroke:#ebebeb;}.osano-cm-close{-webkit-transition:none!important;transition:none!important;margin:0.5em;min-width:15px;border-radius:var(--chakra-radii-none);background-color:var(--chakra-colors-transparent);}.osano-cm-info-dialog-header{position:relative;min-height:auto;}.osano-cm-info-dialog-header__close:focus{background-color:var(--chakra-colors-transparent);border-color:var(--chakra-colors-transparent);}.osano-cm-header,.osano-cm-info-dialog-header,.osano-cm-info-dialog-header__header{font-family:Roboto,sans-serif!important;font-weight:700!important;line-height:20px!important;font-size:20px!important;padding:0.5em 1em 0.5em .5em;}.chakra-ui-dark .osano-cm-header:not([data-theme]),.chakra-ui-dark .osano-cm-info-dialog-header:not([data-theme]),.chakra-ui-dark .osano-cm-info-dialog-header__header:not([data-theme]),[data-theme=dark] .osano-cm-header:not([data-theme]),[data-theme=dark] .osano-cm-info-dialog-header:not([data-theme]),[data-theme=dark] .osano-cm-info-dialog-header__header:not([data-theme]),.osano-cm-header[data-theme=dark],.osano-cm-info-dialog-header[data-theme=dark],.osano-cm-info-dialog-header__header[data-theme=dark]{background:#000000;color:#FFFFFF;}.chakra-ui-light .osano-cm-header:not([data-theme]),.chakra-ui-light .osano-cm-info-dialog-header:not([data-theme]),.chakra-ui-light .osano-cm-info-dialog-header__header:not([data-theme]),[data-theme=light] .osano-cm-header:not([data-theme]),[data-theme=light] .osano-cm-info-dialog-header:not([data-theme]),[data-theme=light] .osano-cm-info-dialog-header__header:not([data-theme]),.osano-cm-header[data-theme=light],.osano-cm-info-dialog-header[data-theme=light],.osano-cm-info-dialog-header__header[data-theme=light]{background:#FFFFFF;color:#000000;}p[role=heading]{font-family:Roboto,sans-serif!important;font-weight:700!important;line-height:20px!important;font-size:20px!important;}.chakra-ui-dark p[role=heading]:not([data-theme]),[data-theme=dark] p[role=heading]:not([data-theme]),p[role=heading][data-theme=dark]{color:#FFFFFF;}.chakra-ui-light p[role=heading]:not([data-theme]),[data-theme=light] p[role=heading]:not([data-theme]),p[role=heading][data-theme=light]{color:#00000;}span[role=heading]{font-family:Roboto,sans-serif!important;font-weight:700!important;line-height:16px!important;font-size:16px!important;}.chakra-ui-dark span[role=heading]:not([data-theme]),[data-theme=dark] span[role=heading]:not([data-theme]),span[role=heading][data-theme=dark]{color:#FFFFFF;}.chakra-ui-light span[role=heading]:not([data-theme]),[data-theme=light] span[role=heading]:not([data-theme]),span[role=heading][data-theme=light]{color:#00000;}div[role=link]{font-family:Open Sans,sans-serif!important;font-weight:700!important;line-height:16px!important;font-size:12px!important;color:#3479F3!important;}div[role=dialog]{color:#A2AAB8;}.osano-cm-info-views{height:auto;}.osano-cm-description{font-size:0.7em;line-height:1.2;}.osano-cm-disclosure{margin:0 -1.5em 0;}.osano-cm-toggle__switch{border-color:#A2AAB8;background-color:#A2AAB8;}.osano-cm-toggle__switch::after{background-color:#FFFFFF;border-color:#FFFFFF;}.osano-cm-toggle__input:focus+.osano-cm-toggle__switch::before{border-color:var(--chakra-colors-transparent)!important;}.osano-cm-toggle__input:checked+.osano-cm-toggle__switch::after,.osano-cm-toggle__input:checked+.osano-cm-toggle__switch::before{border-color:var(--chakra-colors-transparent);}.osano-cm-toggle__input:checked+.osano-cm-toggle__switch{background-color:#3479F3!important;border-color:var(--chakra-colors-transparent)!important;}.osano-cm-toggle__input:focus+.osano-cm-toggle__switch,.osano-cm-toggle__input:hover+.osano-cm-toggle__switch{border-color:#A2AAB8;background-color:#A2AAB8;}.osano-cm-toggle__input:disabled:checked+.osano-cm-toggle__switch::after,.osano-cm-toggle__input:disabled:checked:focus+.osano-cm-toggle__switch::after,.osano-cm-toggle__input:disabled:checked:hover+.osano-cm-toggle__switch::after{background-color:#FFFFFF;border-color:#FFFFFF;}.osano-cm-info{background:#000000;color:#A2AAB8;box-shadow:var(--chakra-shadows-none);}.chakra-ui-light .osano-cm-info:not([data-theme]),[data-theme=light] .osano-cm-info:not([data-theme]),.osano-cm-info[data-theme=light]{color:#282D33;background:#FFFFFF;}.osano-cm-widget__outline{stroke:#7A76FF;}.chakra-ui-light button.osano-cm-widget:not([data-theme]),[data-theme=light] button.osano-cm-widget:not([data-theme]),button.osano-cm-widget[data-theme=light]{bottom:60px;}.chakra-ui-dark button.osano-cm-widget:not([data-theme]),[data-theme=dark] button.osano-cm-widget:not([data-theme]),button.osano-cm-widget[data-theme=dark]{bottom:60px;}button.osano-cm-manage{background-color:var(--chakra-colors-transparent)!important;border-color:#3479F3;}button.osano-cm-save{background-color:var(--chakra-colors-transparent);border-color:#3479F3;}.chakra-ui-light button.osano-cm-save:not([data-theme]),[data-theme=light] button.osano-cm-save:not([data-theme]),button.osano-cm-save[data-theme=light]{background-color:#FFFFF;color:#000000;}button.osano-cm-accept-all:hover{background-color:#3479F3;}button.osano-cm-accept:hover{background-color:#3479F3;}button.osano-cm-save:hover{background-color:var(--chakra-colors-transparent);border-color:#3479F3;}button.osano-cm-denyAll{background-color:var(--chakra-colors-transparent);border-color:#3479F3;}button.osano-cm-denyAll:hover{background-color:var(--chakra-colors-transparent);}button.osano-cm-deny{background-color:var(--chakra-colors-transparent);border-color:#3479F3;}button.osano-cm-deny:hover{background-color:var(--chakra-colors-transparent);}.osano-cm-content__usage-list.osano-cm-usage-list{padding-top:10px;}@media screen and (max-width: 600px){.osano-cm-dialog--type_bar .osano-cm-dialog__buttons{margin:20px 0 0 .75em;}.osano-cm-dialog__content.osano-cm-content{font-size:12px;line-height:16.79px;}}main .animation-section+div:nth-of-type(2),main .animation-section+section:nth-of-type(2){background:var(--chakra-colors-transparent)!important;-webkit-transition:all 1s linear;transition:all 1s linear;}div#localize-widget:hover div#localize-powered-by{display:none!important;}a#localize-active-lang span{display:none!important;}.css-esifpi{-webkit-margin-start:0px!important;margin-inline-start:0px!important;}.css-1qnay5r>*:not(style)~*:not(style){-webkit-margin-start:40px!important;margin-inline-start:40px!important;}li a:hover,li a[data-hover]{-webkit-text-decoration:none!important;text-decoration:none!important;color:#7A76FF;}a:hover,a[data-hover]{-webkit-text-decoration:none!important;text-decoration:none!important;color:#7A76FF;}.field[aria-invalid=true],.field[data-invalid]{font-weight:var(--chakra-fontWeights-normal)!important;border-color:#FC8181!important;box-shadow:0 0 0 1px #FC8181!important;}.chakra-form__error-message{color:#FC8181!important;}</style><style data-emotion="css 1a2dkud">.css-1a2dkud{background-color:#000000;}</style><div class="css-1a2dkud"><style data-emotion="css n4507e">.css-n4507e{position:fixed;bottom:15px;right:15px;z-index:15;}</style><div class="css-n4507e"><style data-emotion="css fv178a">.css-fv178a{width:52px;position:relative;background-color:var(--chakra-colors-purple-primary);border-radius:var(--chakra-radii-full);}.chakra-ui-dark .css-fv178a:not([data-theme]),[data-theme=dark] .css-fv178a:not([data-theme]),.css-fv178a[data-theme=dark]{background-color:var(--chakra-colors-gray-500);}</style><div class="css-fv178a"><style data-emotion="css lkr8sv">.css-lkr8sv{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;white-space:nowrap;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;line-height:1.2;border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-bold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);text-transform:uppercase;height:28px;min-width:var(--chakra-sizes-10);font-size:var(--chakra-fontSizes-md);-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);color:var(--chakra-colors-whiteAlpha-900);width:52px;}.css-lkr8sv:focus-visible,.css-lkr8sv[data-focus-visible]{box-shadow:var(--chakra-shadows-outline);}.css-lkr8sv:disabled,.css-lkr8sv[disabled],.css-lkr8sv[aria-disabled=true],.css-lkr8sv[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-lkr8sv:hover,.css-lkr8sv[data-hover]{background:unset;}.css-lkr8sv:active,.css-lkr8sv[data-active]{background:unset;}</style><button type="button" class="chakra-button colorTrackingToggle css-lkr8sv" id="Dark"><style data-emotion="css 1tk3tgd">.css-1tk3tgd{position:absolute;top:5px;left:6px;z-index:1;width:18px;height:18px;pointer-events:none;}</style><img alt="Plotly" class="chakra-image css-1tk3tgd" src="/moon.svg"/><style data-emotion="css ckh9xj">.css-ckh9xj{position:absolute;top:5px;right:6px;z-index:1;width:18px;height:18px;pointer-events:none;}</style><img alt="Plotly" class="chakra-image css-ckh9xj" src="/sun.svg"/><style data-emotion="css s34jqb">.css-s34jqb{position:absolute;top:4px;right:6px;left:unset;z-index:1;width:20px;height:20px;pointer-events:none;}</style><img alt="Plotly" class="chakra-image css-s34jqb" src="/circle.svg"/></button></div></div><style data-emotion="css 1kxonj9">.css-1kxonj9{width:100%;position:relative;}</style><header id="primary-header" class="css-1kxonj9"><style data-emotion="css 13o7eu2">.css-13o7eu2{display:block;}</style><div class="css-13o7eu2"><style data-emotion="css 11wpte5">.css-11wpte5{display:none;position:fixed;z-index:11;width:100%;padding-top:var(--chakra-space-2);padding-bottom:var(--chakra-space-2);-webkit-padding-start:var(--chakra-space-2);padding-inline-start:var(--chakra-space-2);-webkit-padding-end:var(--chakra-space-2);padding-inline-end:var(--chakra-space-2);color:var(--chakra-colors-textPrimary);font-size:var(--chakra-fontSizes-3xs);font-weight:700;text-align:center;background-color:var(--chakra-colors-gray-50);opacity:1;}.css-11wpte5 a{color:var(--chakra-colors-accentPrimary);font-weight:var(--chakra-fontWeights-bold);}@media screen and (min-width: 576px){.css-11wpte5{font-size:var(--chakra-fontSizes-xs);}}@media screen and (min-width: 768px){.css-11wpte5{font-size:16px;font-weight:400;}}.chakra-ui-dark .css-11wpte5:not([data-theme]),[data-theme=dark] .css-11wpte5:not([data-theme]),.css-11wpte5[data-theme=dark]{background-color:#17181a;}</style><div class="css-11wpte5"></div></div><style data-emotion="css 1440amh">.css-1440amh{position:fixed;z-index:10;padding-bottom:0px;padding-top:0px;width:100%;color:var(--chakra-colors-textPrimary);background-color:var(--chakra-colors-transparent);border-bottom:1px solid;border-color:var(--chakra-colors-transparent);-webkit-transition:all 250ms;transition:all 250ms;top:0px;}@media screen and (min-width: 576px){.css-1440amh{padding-top:0px;}}@media screen and (min-width: 960px){.css-1440amh{padding-top:0px;}}@media screen and (min-width: 1200px){.css-1440amh{padding-top:0px;}}.chakra-ui-dark .css-1440amh:not([data-theme]),[data-theme=dark] .css-1440amh:not([data-theme]),.css-1440amh[data-theme=dark]{background-color:none;}</style><div class="css-1440amh"><style data-emotion="css f7yt5b">.css-f7yt5b{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:10px;margin-bottom:10px;}@media screen and (min-width: 1200px){.css-f7yt5b{display:none;}}</style><div class="css-f7yt5b"><style data-emotion="css 7pf6at">.css-7pf6at{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;}</style><div class="css-7pf6at"><style data-emotion="css 1woigal">.css-1woigal{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:0.5rem;width:100%;padding:0 20px;}</style><div class="chakra-stack css-1woigal"><style data-emotion="css v7v99c">.css-v7v99c{width:100px;}</style><div class="css-v7v99c"><a href="/"><style data-emotion="css ud2986">.css-ud2986{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;}</style><div class="css-ud2986"><style data-emotion="css 1ulxuub">.css-1ulxuub{object-fit:contain;width:126px;height:35px;}@media screen and (min-width: 960px){.css-1ulxuub{width:126px;}}</style><span style="box-sizing:border-box;display:inline-block;overflow:hidden;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;position:relative;max-width:100%"><span style="box-sizing:border-box;display:block;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0;max-width:100%"><img style="display:block;max-width:100%;width:initial;height:initial;background:none;opacity:1;border:0;margin:0;padding:0" alt="" aria-hidden="true" src="data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%27126%27%20height=%2735%27/%3e"/></span><img alt="Plotly" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" decoding="async" data-nimg="intrinsic" class="css-1ulxuub" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%"/><noscript><img alt="Plotly" loading="lazy" decoding="async" data-nimg="intrinsic" style="position:absolute;top:0;left:0;bottom:0;right:0;box-sizing:border-box;padding:0;border:none;margin:auto;display:block;width:0;height:0;min-width:100%;max-width:100%;min-height:100%;max-height:100%" class="css-1ulxuub" srcSet="https://images.prismic.io/plotly-marketing-website-2/8f977c91-7b4e-4367-8228-26fbba2506e4_69e12d6a-fb65-4b6e-8423-9465a29c6028_plotly-logo-sm.png?auto=compress%2Cformat&fit=max&w=128 1x, https://images.prismic.io/plotly-marketing-website-2/8f977c91-7b4e-4367-8228-26fbba2506e4_69e12d6a-fb65-4b6e-8423-9465a29c6028_plotly-logo-sm.png?auto=compress%2Cformat&fit=max&w=256 2x" src="https://images.prismic.io/plotly-marketing-website-2/8f977c91-7b4e-4367-8228-26fbba2506e4_69e12d6a-fb65-4b6e-8423-9465a29c6028_plotly-logo-sm.png?auto=compress%2Cformat&fit=max&w=256"/></noscript></span></div></a></div><style data-emotion="css 1igwmid">.css-1igwmid{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:0.5rem;}</style><div class="chakra-stack css-1igwmid"><style data-emotion="css 1p7yx3s">.css-1p7yx3s{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;position:relative;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;line-height:1.2;border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-bold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);text-transform:uppercase;height:var(--chakra-sizes-10);min-width:var(--chakra-sizes-10);size:lg;color:#ffffff;background-image:linear-gradient(135deg, #7A76FF, #7A76FF, #7FE4FF);-webkit-background-size:200% 100%;background-size:200% 100%;padding-top:revert;-webkit-padding-start:var(--chakra-space-3);padding-inline-start:var(--chakra-space-3);-webkit-padding-end:var(--chakra-space-3);padding-inline-end:var(--chakra-space-3);font-size:var(--chakra-fontSizes-xs);letter-spacing:2px;border-color:var(--chakra-colors-accentPrimary);border:var(--chakra-borders-none);-webkit-transition:all .4s ease-in-out;transition:all .4s ease-in-out;white-space:normal;}.css-1p7yx3s:focus-visible,.css-1p7yx3s[data-focus-visible]{box-shadow:var(--chakra-shadows-outline);}.css-1p7yx3s:disabled,.css-1p7yx3s[disabled],.css-1p7yx3s[aria-disabled=true],.css-1p7yx3s[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}@media screen and (min-width: 576px){.css-1p7yx3s{white-space:nowrap;}}@media screen and (min-width: 768px){.css-1p7yx3s{-webkit-padding-start:var(--chakra-space-5);padding-inline-start:var(--chakra-space-5);-webkit-padding-end:var(--chakra-space-5);padding-inline-end:var(--chakra-space-5);font-size:var(--chakra-fontSizes-md);}}.css-1p7yx3s:hover,.css-1p7yx3s[data-hover]{-webkit-background-position:100% 0;background-position:100% 0;color:var(--chakra-colors-white);}</style><button type="button" class="chakra-button css-1p7yx3s">Demo Dash</button><style data-emotion="css sdr3yg">.css-sdr3yg{position:relative;width:40px;z-index:99999;}</style><div class="css-sdr3yg"><style data-emotion="css 1icjydl">.css-1icjydl{position:relative;bottom:3px;font-size:var(--chakra-fontSizes-2-5xl);}</style><div class="css-1icjydl"><div class="hamburger-react" aria-expanded="false" role="button" style="cursor:pointer;height:48px;position:relative;transition:0.4s cubic-bezier(0, 0, 0, 1);user-select:none;width:48px;outline:none;transform:none" tabindex="0"><div style="background:currentColor;height:2px;left:14px;position:absolute;width:20px;top:17px;transition:0.4s cubic-bezier(0, 0, 0, 1);transform:none"></div><div style="background:currentColor;height:2px;left:14px;position:absolute;width:20px;top:23px;transition:0.4s cubic-bezier(0, 0, 0, 1);transform:none"></div><div style="background:currentColor;height:2px;left:14px;position:absolute;width:20px;top:29px;transition:0.4s cubic-bezier(0, 0, 0, 1);transform:none"></div></div></div></div></div></div></div><style data-emotion="css 1glt3dn">.css-1glt3dn{outline:2px solid transparent;outline-offset:2px;opacity:0;width:100%;box-shadow:var(--chakra-shadows-lg);position:absolute;top:68px;bottom:0px;left:0px;right:0px;height:calc(100vh - 68px);border-top:1px solid;border-bottom:1px solid;border-color:var(--chakra-colors-border);border-bottom-color:var(--chakra-colors-border);background:rgba(12, 12, 12);}.css-1glt3dn::-webkit-scrollbar{width:5px;}.css-1glt3dn::-webkit-scrollbar-track{width:6px;}.css-1glt3dn::-webkit-scrollbar-thumb{background-color:var(--chakra-colors-scrollbar);border-radius:24px;}@media screen and (min-width: 576px){.css-1glt3dn{top:68px;}}@media screen and (min-width: 768px){.css-1glt3dn{top:88px;}}@media screen and (min-width: 960px){.css-1glt3dn{top:84px;bottom:initial;}}</style><div headeronscroll="false" hastopbanner="false" style="opacity:0;display:none;transform:translateY(-4px) translateZ(0)" class="css-1glt3dn"><style data-emotion="css kh3yn6">.css-kh3yn6{width:80%;padding-left:var(--chakra-space-8);padding-top:var(--chakra-space-5);padding-right:var(--chakra-space-2);height:calc(100vh - 68px);background:var(--chakra-colors-bgPrimary);border-right:1px solid;border-color:var(--chakra-colors-border);overflow:auto;}</style><div class="css-kh3yn6"><div class="css-0"></div><div class="css-0"></div><style data-emotion="css c4fa8o">.css-c4fa8o{width:var(--chakra-sizes-full);display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:var(--chakra-sizes-12);font-size:var(--chakra-fontSizes-lg);letter-spacing:2px;font-weight:var(--chakra-fontWeights-bold);text-transform:uppercase;color:var(--chakra-colors-textPrimary);}.css-c4fa8o:hover,.css-c4fa8o[data-hover]{color:var(--chakra-colors-accentPrimary);}</style><div class="css-c4fa8o"><a href="https://plotly.com/examples/">Example Apps</a></div><div class="css-0"></div><div class="css-0"></div><div class="css-c4fa8o"><a href="https://plotly.com/get-pricing/">Pricing</a></div><style data-emotion="css 3s1c3j">.css-3s1c3j{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;cursor:pointer;width:100%;position:relative;padding-top:var(--chakra-space-5);}</style><div id="searchBarIcon" class="searchBarIcon css-3s1c3j"><style data-emotion="css 1jke4yk">.css-1jke4yk{position:relative;width:100%;}</style><div class="css-1jke4yk"><style data-emotion="css 2pkxs">.css-2pkxs{position:relative;width:92%;}</style><div class="css-2pkxs"><style data-emotion="css lgsmtg">.css-lgsmtg{position:relative;height:200px;}</style><div class="css-lgsmtg"><style data-emotion="css 1c9c5z5">.css-1c9c5z5{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:0.5rem;z-index:999;}</style><div class="chakra-stack css-1c9c5z5"><style data-emotion="css d4i7br">.css-d4i7br{width:100%;height:var(--input-height);font-size:var(--input-font-size);-webkit-padding-start:var(--input-padding);padding-inline-start:var(--input-padding);-webkit-padding-end:var(--input-padding);padding-inline-end:var(--input-padding);border-radius:var(--input-border-radius);min-width:0px;outline:2px solid transparent;outline-offset:2px;position:relative;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);--input-font-size:var(--chakra-fontSizes-md);--input-padding:var(--chakra-space-4);--input-border-radius:var(--chakra-radii-md);--input-height:var(--chakra-sizes-10);border:1px solid;border-color:var(--chakra-colors-border);background:#fff;-webkit-transition:none;transition:none;color:#5B6372;}.css-d4i7br:disabled,.css-d4i7br[disabled],.css-d4i7br[aria-disabled=true],.css-d4i7br[data-disabled]{opacity:0.4;cursor:not-allowed;}.css-d4i7br[aria-readonly=true],.css-d4i7br[readonly],.css-d4i7br[data-readonly]{box-shadow:var(--chakra-shadows-none)!important;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;}.css-d4i7br[aria-invalid=true],.css-d4i7br[data-invalid]{border-color:#FC8181;box-shadow:0 0 0 1px #FC8181;}.css-d4i7br:focus-visible,.css-d4i7br[data-focus-visible]{z-index:1;border-color:#63b3ed;box-shadow:0 0 0 1px #63b3ed;}.css-d4i7br::-webkit-input-placeholder{color:#5B6372;}.css-d4i7br::-moz-placeholder{color:#5B6372;}.css-d4i7br:-ms-input-placeholder{color:#5B6372;}.css-d4i7br::placeholder{color:#5B6372;}.chakra-ui-dark .css-d4i7br:not([data-theme]),[data-theme=dark] .css-d4i7br:not([data-theme]),.css-d4i7br[data-theme=dark]{background-color:#161616;color:#bfc8d6;}.chakra-ui-dark .css-d4i7br:not([data-theme])::-webkit-input-placeholder{color:#A2AAB8;}.chakra-ui-dark .css-d4i7br:not([data-theme])::-moz-placeholder{color:#A2AAB8;}.chakra-ui-dark .css-d4i7br:not([data-theme]):-ms-input-placeholder{color:#A2AAB8;}[data-theme=dark] .css-d4i7br:not([data-theme])::-webkit-input-placeholder{color:#A2AAB8;}[data-theme=dark] .css-d4i7br:not([data-theme])::-moz-placeholder{color:#A2AAB8;}[data-theme=dark] .css-d4i7br:not([data-theme]):-ms-input-placeholder{color:#A2AAB8;}.css-d4i7br[data-theme=dark]::-webkit-input-placeholder{color:#A2AAB8;}.css-d4i7br[data-theme=dark]::-moz-placeholder{color:#A2AAB8;}.css-d4i7br[data-theme=dark]:-ms-input-placeholder{color:#A2AAB8;}.chakra-ui-dark .css-d4i7br:not([data-theme])::placeholder,[data-theme=dark] .css-d4i7br:not([data-theme])::placeholder,.css-d4i7br[data-theme=dark]::placeholder{color:#A2AAB8;}.css-d4i7br:focus,.css-d4i7br[data-focus]{border-color:#7A76FF;box-shadow:var(--chakra-shadows-none);}.css-d4i7br:hover,.css-d4i7br[data-hover]{border-color:#7A76FF;}</style><input type="text" placeholder="Search" class="chakra-input css-d4i7br" value=""/><style data-emotion="css 58q21i">.css-58q21i{position:absolute;top:12px;right:15px;}</style><div class="css-58q21i"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M1014.64 969.04L703.71 656.207c57.952-69.408 92.88-158.704 92.88-256.208 0-220.912-179.088-400-400-400s-400 179.088-400 400 179.088 400 400 400c100.368 0 192.048-37.056 262.288-98.144l310.496 312.448c12.496 12.497 32.769 12.497 45.265 0 12.48-12.496 12.48-32.752 0-45.263zM396.59 736.527c-185.856 0-336.528-150.672-336.528-336.528S210.734 63.471 396.59 63.471c185.856 0 336.528 150.672 336.528 336.528S582.446 736.527 396.59 736.527z"></path></svg></div></div></div><style data-emotion="css m6uzba">.css-m6uzba{width:5%;position:absolute;top:12px;right:-9%;}</style><div class="css-m6uzba"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 16 16" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" clip-rule="evenodd" d="M7.116 8l-4.558 4.558.884.884L8 8.884l4.558 4.558.884-.884L8.884 8l4.558-4.558-.884-.884L8 7.116 3.442 2.558l-.884.884L7.116 8z"></path></svg></div></div></div></div></div></div></div></div></header><style data-emotion="css 1inryme">.css-1inryme{padding-top:112px;}.chakra-ui-dark .css-1inryme:not([data-theme]),[data-theme=dark] .css-1inryme:not([data-theme]),.css-1inryme[data-theme=dark]{background-color:#000000;}@media screen and (min-width: 960px){.css-1inryme{padding-top:149px;}}</style><main class="css-1inryme"><div class="css-0"><style data-emotion="css i6bazn">.css-i6bazn{overflow:hidden;}</style><div class="animation-section css-i6bazn"><style data-emotion="css 1gsjjiq">.css-1gsjjiq{position:absolute;top:0px;width:100%;height:100%;background:var(--chakra-colors-bgPrimaryTransparent);}</style><div class="css-1gsjjiq"><style data-emotion="css m5neqp animation-9nsdvm">.css-m5neqp{background:var(--chakra-colors-radialGradientPurple);-webkit-background-size:500% 300%;background-size:500% 300%;-webkit-animation:animation-9nsdvm 9s alternate infinite;animation:animation-9nsdvm 9s alternate infinite;-webkit-background-position:100% 100%;background-position:100% 100%;height:100vh;width:100%;opacity:1;}.chakra-ui-dark .css-m5neqp:not([data-theme]),[data-theme=dark] .css-m5neqp:not([data-theme]),.css-m5neqp[data-theme=dark]{opacity:0.3;}@media (prefers-reduced-motion: reduce){.css-m5neqp{-webkit-animation:unset;animation:unset;}}@-webkit-keyframes animation-9nsdvm{from{-webkit-background-position:top 55% right 100%;background-position:top 55% right 100%;}to{-webkit-background-position:100% 100%;background-position:100% 100%;}}@keyframes animation-9nsdvm{from{-webkit-background-position:top 55% right 100%;background-position:top 55% right 100%;}to{-webkit-background-position:100% 100%;background-position:100% 100%;}}</style><div class="css-m5neqp"></div><style data-emotion="css 1aym1d1 animation-9nsdvm">.css-1aym1d1{background:var(--chakra-colors-radialGradientCyan);-webkit-background-size:500% 300%;background-size:500% 300%;-webkit-animation:animation-9nsdvm 13s alternate infinite;animation:animation-9nsdvm 13s alternate infinite;height:100vh;width:100%;opacity:1;position:absolute;top:0px;}.chakra-ui-dark .css-1aym1d1:not([data-theme]),[data-theme=dark] .css-1aym1d1:not([data-theme]),.css-1aym1d1[data-theme=dark]{opacity:0.3;}@media (prefers-reduced-motion: reduce){.css-1aym1d1{-webkit-animation:unset;animation:unset;}}@-webkit-keyframes animation-9nsdvm{from{-webkit-background-position:top 55% right 100%;background-position:top 55% right 100%;}to{-webkit-background-position:100% 100%;background-position:100% 100%;}}@keyframes animation-9nsdvm{from{-webkit-background-position:top 55% right 100%;background-position:top 55% right 100%;}to{-webkit-background-position:100% 100%;background-position:100% 100%;}}</style><div class="css-1aym1d1"></div><style data-emotion="css 1u5jb1k animation-187age1">.css-1u5jb1k{background:var(--chakra-colors-radialGradientPurple);-webkit-background-size:500% 300%;background-size:500% 300%;-webkit-animation:animation-187age1 12s alternate-reverse infinite;animation:animation-187age1 12s alternate-reverse infinite;height:100vh;width:100%;opacity:1;position:absolute;top:0px;}.chakra-ui-dark .css-1u5jb1k:not([data-theme]),[data-theme=dark] .css-1u5jb1k:not([data-theme]),.css-1u5jb1k[data-theme=dark]{opacity:0.3;}@media (prefers-reduced-motion: reduce){.css-1u5jb1k{-webkit-animation:unset;animation:unset;}}@-webkit-keyframes animation-187age1{from{-webkit-background-position:100% 100%;background-position:100% 100%;}to{-webkit-background-position:top 55% right 100%;background-position:top 55% right 100%;}}@keyframes animation-187age1{from{-webkit-background-position:100% 100%;background-position:100% 100%;}to{-webkit-background-position:top 55% right 100%;background-position:top 55% right 100%;}}</style><div class="css-1u5jb1k"></div><style data-emotion="css 1i9x0sj animation-187age1">.css-1i9x0sj{background:var(--chakra-colors-radialGradientCyan);-webkit-background-size:500% 300%;background-size:500% 300%;-webkit-animation:animation-187age1 10s alternate-reverse infinite;animation:animation-187age1 10s alternate-reverse infinite;height:100vh;width:100%;opacity:1;position:absolute;top:0px;}.chakra-ui-dark .css-1i9x0sj:not([data-theme]),[data-theme=dark] .css-1i9x0sj:not([data-theme]),.css-1i9x0sj[data-theme=dark]{opacity:0.3;}@media (prefers-reduced-motion: reduce){.css-1i9x0sj{-webkit-animation:unset;animation:unset;}}@-webkit-keyframes animation-187age1{from{-webkit-background-position:100% 100%;background-position:100% 100%;}to{-webkit-background-position:top 55% right 100%;background-position:top 55% right 100%;}}@keyframes animation-187age1{from{-webkit-background-position:100% 100%;background-position:100% 100%;}to{-webkit-background-position:top 55% right 100%;background-position:top 55% right 100%;}}</style><div class="css-1i9x0sj"></div></div></div><style data-emotion="css he4pjq">.css-he4pjq{position:relative;width:80%;margin:50px auto 0;max-width:1200px;}@media screen and (min-width: 960px){.css-he4pjq{width:60%;}}</style><section class="css-he4pjq"><style data-emotion="css u4p24i">.css-u4p24i{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}</style><div class="css-u4p24i"><style data-emotion="css 1xuyv54">.css-1xuyv54{width:60px;height:60px;object-fit:cover;border-radius:50%;}</style><img alt="author photo" class="chakra-image css-1xuyv54" src="https://images.prismic.io/plotly-marketing-website-2/cf8529b1-15da-4417-af6b-c96372a11fa8_Mina.png?auto=compress,format"/><style data-emotion="css 1cbeyld">.css-1cbeyld{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;margin-left:var(--chakra-space-3);}</style><div class="css-1cbeyld"><div class="css-0"><style data-emotion="css 1i6zc75">.css-1i6zc75{color:#FFFFF;font-weight:700;}</style><p class="chakra-text css-1i6zc75">Mina Mirzaei</p><style data-emotion="css 37clb6">.css-37clb6{color:#A2AAB8;}</style><p class="chakra-text css-37clb6">July 26, 2023</p></div></div></div></section><style data-emotion="css 6f9xzw">.css-6f9xzw{position:relative;width:80%;margin:25px auto 25px;border-right:var(--chakra-borders-none);max-width:1200px;}.css-6f9xzw h1{font-family:var(--chakra-fonts-heading);font-weight:700;line-height:1.4;font-size:var(--chakra-fontSizes-7xl);}@media screen and (min-width: 768px){.css-6f9xzw h1{font-size:var(--chakra-fontSizes-7-5xl);}}.css-6f9xzw h2{font-family:var(--chakra-fonts-heading);line-height:5xl;font-size:var(--chakra-fontSizes-5xl);font-weight:700;color:var(--chakra-colors-textPrimary);}.css-6f9xzw h3{font-family:var(--chakra-fonts-heading);font-size:var(--chakra-fontSizes-2-5xl);line-height:23px;font-weight:700;margin-top:10px;color:var(--chakra-colors-textPrimary);}.css-6f9xzw h4{font-family:var(--chakra-fonts-heading);font-size:var(--chakra-fontSizes-2xl);line-height:23px;font-weight:700;margin-top:10px;color:var(--chakra-colors-textPrimary);}.css-6f9xzw strong{font-weight:700;color:var(--chakra-colors-textPrimary);}.css-6f9xzw p{color:var(--chakra-colors-bodyText);font-size:14px;padding:10px 0;}@media screen and (min-width: 240px){.css-6f9xzw p{font-size:var(--chakra-fontSizes-xl);}}.css-6f9xzw ul{list-style-type:disc;padding-top:10px;padding-bottom:18px;padding-left:35px;}.css-6f9xzw ol{padding-top:10px;padding-bottom:18px;padding-left:35px;list-style-type:decimal;margin-bottom:20px;}.css-6f9xzw li{color:var(--chakra-colors-bodyText);padding:10px 0;line-height:1.5;}.css-6f9xzw a{color:var(--chakra-colors-accentPrimary);-webkit-text-decoration:underline;text-decoration:underline;}.css-6f9xzw img{margin:0 auto;object-fit:cover;}@media screen and (min-width: 960px){.css-6f9xzw img{object-fit:contain;max-height:500px;}}.css-6f9xzw pre{display:inline;color:var(--chakra-colors-accentPrimary);width:auto;background-color:#282d33;padding:4px;}@media screen and (min-width: 960px){.css-6f9xzw{width:60%;}}</style><section class="css-6f9xzw"><h1>How Polars Can Help You Build Fast Dash Apps for Large Datasets</h1></section><section class="css-6f9xzw"><p>Working in the world of data visualization can feel like the average data size keeps growing exponentially but compute power stays the same. While that may be true, we have to ask ourselves: are we actually running in the most optimal way?</p><p class=" block-img"><img src="https://prismic-io.s3.amazonaws.com/plotly-marketing-website-2/e81fcb8d-1b8c-4dd2-b9dc-ba841b52bb9b_image3.gif" alt=""/></p><p>There are many ways to accomplish this with Dash: Leveraging tooling or strategies including caching and memorization, minimizing data transfer over the network, and using partial property updates are just a few. We always recommend <a href="https://community.plotly.com/t/performance-profiling-dash-apps-with-werkzeug/65199" target="_blank" rel="noopener">profiling an application</a> before trying to optimize it: <a href="https://xkcd.com/1691/" target="_blank" rel="noopener">Premature optimization</a> can cost weeks or even months of unnecessary labor. So choose the right fit for each use case.</p><p>In Professional Services at Plotly, we frequently encounter use cases with large datasets. Many of these applications require bespoke architectures and there is no complete “one size fits all” data format or database system for any application.</p><p>One strategy that has gained significant popularity in recent years is to leverage a memory-mapped data architecture, and in Python pairing Parquet files with a tool like Vaex or Polars is a fantastic strategy to accomplish this.</p><p>A recent Professional Services project for an equity firm led to our employment of this system as part of an application build, which paired well with the Dash framework and the Dash Enterprise deployment stack.</p><p>It might make sense to look into a memory-mapped data architecture for your Dash application if you have completed profiling your application and are observing some common performance problems:</p><ul><li>Callbacks in the app taking very long or just timing out.</li><li>Maxing out RAM and CPU in the deployment environment, and upgrading your machine is not a viable option.</li><li>Directly reading data from a SQL warehouse that was not intended to be the back-end for a real time web application and can’t be modified to accommodate this demand.</li></ul><p>In this article, I will go through how we accomplished this in a production environment using Polars, and describe how Polars could be leveraged into your large data Dash application architecture. We’ll also review a sandboxed use case of Polars and Dash in an open-source Dash application, whose source code is available <a href="https://github.com/plotly/polars-open-source-app/tree/main" target="_blank" rel="noopener">in our Github</a>: This application uses a dataset with <strong>65 million rows and 25 columns</strong>, and illustrates other tools and techniques like Datashader and aggregation to support visualization of that data in a browser window.</p></section><section class="css-6f9xzw"><h2>What is Polars?</h2><p class=" block-img"><img src="https://images.prismic.io/plotly-marketing-website-2/bbbdb242-44c1-4b7f-8664-3b884ae7616e_image8.gif?auto=compress,format" alt="Polar Bear"/></p></section><section class="css-6f9xzw"><p>Polars is a dataframe query engine implemented in Rust with a Python API, it’s a great pandas alternative for when your data starts reaching millions of entries in size.</p><p>The underlying data frames in Polars are based on the <a href="https://arrow.apache.org/">Apache Arrow format</a>, and with a <a href="https://www.rust-lang.org/" target="_blank" rel="noopener">Rust</a> backend. Rust is the up-and-coming favorite coding language of performance-minded programmers that promises to be fast and memory efficient.</p></section><section class="css-6f9xzw"><h3>Why is Apache Arrow good for large datasets?</h3></section><section class="css-6f9xzw"><p>To quote the Apache Org FAQ, Arrow is an “in-memory columnar format, a standardized, language-agnostic specification for representing structured, table-like datasets in-memory.”</p><p>One great thing about Apache Arrow datasets is that there’s no serialization and deserialization between on-disk and in memory representation of them. This makes memory-mapped Arrow files super fast to read.</p><p><a href="https://realpython.com/python-mmap/" target="_blank" rel="noopener">Memory mapping</a> is holding a representation of a file in memory to increase I/O efficiency. This would be challenging or counter productive with large datasets that are bigger than RAM size but with virtual memory on an SSD disk, and no deserialization, memory mapped Arrow files are fast to read with very little memory footprint.</p><p>Another useful big data aspect of Arrow files is that they are columnar, so unlike a CSV file where you have to hold an entire row of data in memory just to access one single column, you can efficiently just read in columns you need. With wide datasets, this makes a noticeable difference in the memory footprint.</p><p>There’s a brilliant explanation of why Apache Arrow is great at handling large data in <a href="https://wesmckinney.com/blog/apache-arrow-pandas-internals/" target="_blank" rel="noopener">this article</a> by one of the cofounders of the Apache Arrow project.</p></section><section class="css-6f9xzw"><h3>Polars lazy vs eager computations</h3><p class=" block-img"><img src="https://images.prismic.io/plotly-marketing-website-2/93759235-cb30-435a-b8b4-9ec1af2c49d2_image6.gif?auto=compress,format" alt="Cartoon Turtle"/></p></section><style data-emotion="css 1cslky2">.css-1cslky2{position:relative;width:80%;margin:30px auto;max-width:1200px;}.css-1cslky2 h1{font-family:var(--chakra-fonts-heading);font-weight:700;font-size:var(--chakra-fontSizes-7xl);}@media screen and (min-width: 768px){.css-1cslky2 h1{font-size:var(--chakra-fontSizes-7-5xl);}}.css-1cslky2 h2{font-family:var(--chakra-fonts-heading);line-height:5xl;font-size:var(--chakra-fontSizes-5xl);font-weight:700;color:var(--chakra-colors-textPrimary);}.css-1cslky2 h3{font-family:var(--chakra-fonts-heading);font-size:var(--chakra-fontSizes-2-5xl);line-height:23px;font-weight:700;color:var(--chakra-colors-textPrimary);}.css-1cslky2 strong{font-family:Courier;color:var(--chakra-colors-accentPrimary);font-size:14px;line-height:16.1px;background-color:#282d33;font-weight:var(--chakra-fontWeights-normal);padding:4px;border-radius:3px;}.css-1cslky2 p{color:var(--chakra-colors-bodyText);font-size:14px;padding:10px 0;}@media screen and (min-width: 240px){.css-1cslky2 p{font-size:var(--chakra-fontSizes-xl);}}.css-1cslky2 ul{list-style-type:disc;padding-top:10px;padding-bottom:18px;padding-left:35px;}.css-1cslky2 ol{list-style:inside;list-style-type:decimal;padding:10px 0;margin-bottom:20px;}.css-1cslky2 li{color:var(--chakra-colors-bodyText);padding:2px 0;line-height:1.2;}.css-1cslky2 a{color:var(--chakra-colors-accentPrimary);-webkit-text-decoration:underline;text-decoration:underline;}.css-1cslky2 img{width:100%;object-fit:cover;}@media screen and (min-width: 960px){.css-1cslky2 img{object-fit:contain;max-height:500px;}}@media screen and (min-width: 960px){.css-1cslky2{width:60%;}}</style><section class="css-1cslky2"><p>Polars will handle your data in one of two ways. </p><p>Let’s say you want to read from a parquet file. This method will instantly load the parquet file into a Polars dataframe using the <strong>polars.read_parquet()</strong> function. This will “eagerly” compute the command, taking 6 seconds in my local jupyter notebook to run. During this time Polars decompressed and converted a parquet file to a Polars dataframe.</p></section><style data-emotion="css 1ucaztz">.css-1ucaztz{position:relative;width:80%;margin:25px auto;max-width:1200px;}@media screen and (min-width: 960px){.css-1ucaztz{width:60%;}}</style><section class="css-1ucaztz"><style data-emotion="css kfzi1">.css-kfzi1{margin:25px auto;}</style><div class="css-kfzi1"><style data-emotion="css 1ekh305">.css-1ekh305 h1{font-family:var(--chakra-fonts-heading);font-weight:700;font-size:var(--chakra-fontSizes-7xl);}@media screen and (min-width: 768px){.css-1ekh305 h1{font-size:var(--chakra-fontSizes-7-5xl);}}.css-1ekh305 h2{font-family:var(--chakra-fonts-heading);line-height:5xl;font-size:var(--chakra-fontSizes-5xl);font-weight:700;color:var(--chakra-colors-textPrimary);}.css-1ekh305 h3{font-family:var(--chakra-fonts-heading);font-size:var(--chakra-fontSizes-2-5xl);line-height:23px;font-weight:700;color:var(--chakra-colors-textPrimary);padding-bottom:10px;}.css-1ekh305 strong{font-family:var(--chakra-fonts-heading);font-weight:500;color:var(--chakra-colors-accentPrimary);}.css-1ekh305 p{color:var(--chakra-colors-bodyText);font-size:14px;padding:10px 0;}@media screen and (min-width: 240px){.css-1ekh305 p{font-size:var(--chakra-fontSizes-xl);}}.css-1ekh305 ul{list-style-type:disc;padding-top:10px;padding-bottom:18px;padding-left:35px;}.css-1ekh305 ol{list-style:inside;list-style-type:decimal;padding:10px 0;margin-bottom:20px;}.css-1ekh305 li{color:var(--chakra-colors-bodyText);padding:2px 0;line-height:1.2;}.css-1ekh305 a{color:var(--chakra-colors-accentPrimary);-webkit-text-decoration:underline;text-decoration:underline;}.css-1ekh305 img{width:100%;object-fit:cover;}@media screen and (min-width: 960px){.css-1ekh305 img{object-fit:contain;max-height:500px;}}.css-1ekh305 .block-img{margin-bottom:10px;}</style><div class="css-1ekh305"></div><style data-emotion="css 15njhai">.css-15njhai{background-color:#181818;position:relative;padding:var(--chakra-space-5);overflow:auto;font-size:var(--chakra-fontSizes-xs);color:var(--chakra-colors-bodyText);border-radius:3px;}.css-15njhai::-webkit-scrollbar{width:5px;}.css-15njhai::-webkit-scrollbar-track{width:6px;}.css-15njhai::-webkit-scrollbar-thumb{background-color:var(--chakra-colors-scrollbar);border-radius:24px;}@media screen and (min-width: 768px){.css-15njhai{font-size:var(--chakra-fontSizes-md);}}</style><div class="css-15njhai"><style data-emotion="css 2nh262">.css-2nh262{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;vertical-align:baseline;outline:2px solid transparent;outline-offset:2px;line-height:var(--chakra-lineHeights-normal);border-radius:var(--chakra-radii-md);font-weight:var(--chakra-fontWeights-bold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);text-transform:uppercase;height:auto;font-size:var(--chakra-fontSizes-md);-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);padding:0px;position:absolute;right:var(--chakra-space-3);top:var(--chakra-space-3);min-width:auto;color:var(--chakra-colors-bodyText);}.css-2nh262:focus-visible,.css-2nh262[data-focus-visible]{box-shadow:var(--chakra-shadows-outline);}.css-2nh262:disabled,.css-2nh262[disabled],.css-2nh262[aria-disabled=true],.css-2nh262[data-disabled]{opacity:0.4;cursor:not-allowed;box-shadow:var(--chakra-shadows-none);}.css-2nh262:hover,.css-2nh262[data-hover]{-webkit-text-decoration:none;text-decoration:none;color:#7A76FF;}.css-2nh262:hover:disabled,.css-2nh262[data-hover]:disabled,.css-2nh262:hover[disabled],.css-2nh262[data-hover][disabled],.css-2nh262:hover[aria-disabled=true],.css-2nh262[data-hover][aria-disabled=true],.css-2nh262:hover[data-disabled],.css-2nh262[data-hover][data-disabled]{background:initial;-webkit-text-decoration:none;text-decoration:none;}.css-2nh262:active,.css-2nh262[data-active]{color:var(--chakra-colors-gray-500);}</style><button type="button" class="chakra-button css-2nh262" aria-label="copy"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"></path></svg></button><pre class="prism-code language-python" style="color:#d6deeb;white-space:break-spaces;background-color:#181818"><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain">Import polars a pl </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain">df </span><span class="token operator">=</span><span class="token plain"> pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">read_parquet</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token string" style="color:rgb(122, 118, 255)">"data/fhvhv_data.parquet"</span><span class="token punctuation" style="color:#FFFFFF">)</span></div></pre></div></div></section><section class="css-6f9xzw"><p>But if I use scan_parquet, the runtime is zero. What happened here? </p></section><section class="css-1ucaztz"><div class="css-kfzi1"><div class="css-1ekh305"></div><div class="css-15njhai"><button type="button" class="chakra-button css-2nh262" aria-label="copy"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"></path></svg></button><pre class="prism-code language-python" style="color:#d6deeb;white-space:break-spaces;background-color:#181818"><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain">ldf </span><span class="token operator">=</span><span class="token plain"> pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">scan_parquet</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token string" style="color:rgb(122, 118, 255)">"data/fhvhv_data.parquet"</span><span class="token punctuation" style="color:#FFFFFF">)</span></div></pre></div></div></section><section class="css-6f9xzw"><p>Well, Polars didn’t actually run any computations; it's now constructed a lazyframe based on my parquet file and is waiting for us to tell it when it’s time to collect the data, utilizing lazy loading!</p></section><section class="css-1ucaztz"><div class="css-kfzi1"><div class="css-1ekh305"></div><div class="css-15njhai"><button type="button" class="chakra-button css-2nh262" aria-label="copy"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"></path></svg></button><pre class="prism-code language-python" style="color:#d6deeb;white-space:break-spaces;background-color:#181818"><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain">df </span><span class="token operator">=</span><span class="token plain"> ldf</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">collect</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span></div></pre></div></div></section><section class="css-6f9xzw"><p>Now when I use the collect method, data is being read from the parquet file and constructed into a Polars dataframe. This is a very powerful concept: we can build a lazyframe from all sorts of data loading and wrangling logic, and collect our data only when we need it. </p></section><section class="css-6f9xzw"><h3>Polars expressions and data wrangling</h3></section><section class="css-6f9xzw"><p>Polars handles data wrangling with expressions. Expression in the Polars are like functions that can be chained together and applied to a dataframe or series. When you chain a bunch of expressions and apply it to a dataset, Polars will take care of parallelizing wherever possible to run as fast as possible.</p><p>It’s recommended you use lazyframes wherever possible to allow Polars to optimize on the entire process from start to end. The Polars API is easy to use once you learn the basics, it’s pretty intuitive what a Polars query is supposed to do. I’ve put together a <a href="https://github.com/plotly/polars-open-source-app/blob/main/explore_data.ipynb" target="_blank" rel="noopener">notebook</a> that can help you jumpstart using Polars. I also highly recommend checking out the Polars <a href="https://pola-rs.github.io/polars-book/user-guide/" target="_blank" rel="noopener">user guide</a>.</p></section><section class="css-6f9xzw"><h2>How to use Polars in a Dash application</h2></section><section class="css-6f9xzw"><p>If you have large amounts of structured data in a data lake, chances are you have parquet files. Parquet is another Apache project and also a columnar data type. <strong>The big difference between parquet and Arrow is that parquet files are compressed and optimized for storage. </strong><a href="https://towardsdatascience.com/apache-arrow-read-dataframe-with-zero-memory-69634092b1a" target="_blank" rel="noopener"><strong></strong>This</a> is a good article on the differences between Arrow and parquet if you’re curious for more, or to help you decide which file type makes sense for your application. </p><p>Building an Arrow file from parquet files can be as simple as a few lines of code.</p></section><section class="css-1ucaztz"><div class="css-kfzi1"><div class="css-1ekh305"></div><div class="css-15njhai"><button type="button" class="chakra-button css-2nh262" aria-label="copy"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"></path></svg></button><pre class="prism-code language-python" style="color:#d6deeb;white-space:break-spaces;background-color:#181818"><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token keyword" style="color:#7A76FF">import</span><span class="token plain"> polars </span><span class="token keyword" style="color:#7A76FF">as</span><span class="token plain"> pl</span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain">df </span><span class="token operator">=</span><span class="token plain"> pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">read_parquet</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token string" style="color:rgb(122, 118, 255)">"data/fhvhv_data.parquet"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain">df</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">write_ipc</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token string" style="color:rgb(122, 118, 255)">"data/fhvhv_data.Arrow"</span><span class="token punctuation" style="color:#FFFFFF">)</span></div></pre></div></div></section><section class="css-6f9xzw"><p>Store this Arrow file in the Dash Enterprise <a href="https://plotly.com/dash/persistent-filesystem/">Persistent Filesystem</a> for a low maintenance, fast performing large data application.</p><p>Just note that depending on the nature of the underlying data, you may need to set up a data hydration process that periodically updates your Arrow file. This can be done with a scheduled task running on <a href="https://docs.celeryq.dev/en/stable/userguide/periodic-tasks.html" target="_blank" rel="noopener">Celery</a>. Also note that this hydration part will be the most memory consuming part of your Dash application as decompressing parquet files takes memory, so only do when necessary.</p><p>There’s plenty of other IO support with Polars to read in from: Avro, CSV, and <a href="https://pola-rs.github.io/polars/py-polars/html/reference/io.html" target="_blank" rel="noopener">many more</a>.</p><p>Now that we have our data reading set up, let’s go over some good use cases of Polars in Dash apps. We want to utilize what makes Polars fast and efficient by using Arrow files and lazy API.</p><p><strong>This sample <a href="https://github.com/plotly/polars-open-source-app/tree/main" target="_blank" rel="noopener">project</a> showcases how to do this, and we’ll be walking through the code from this sample app as part of this blog. Always refer to the <a href="https://www.pola.rs/" target="_blank" rel="noopener">original Polars documentation</a> for more detailed usage guides. </strong>This app uses the NYC taxi data and we want to enable a user to browse through this data in a Dash app, filter and select what they want and then visualize some features in scatter plots.</p></section><style data-emotion="css f8qi8q">.css-f8qi8q{position:relative;width:80%;margin:25px auto;border-right:var(--chakra-borders-none);max-width:1200px;}@media screen and (min-width: 960px){.css-f8qi8q{width:60%;}}</style><div class="css-f8qi8q"><style data-emotion="css netxch">.css-netxch{width:100%;margin:25px auto 25px;}</style><div class="css-netxch"><style data-emotion="css 1izgn1a">.css-1izgn1a{object-fit:contain;width:100%;border-radius:10px;}</style><img alt="Browse Data with Polars" class="chakra-image css-1izgn1a" src="https://images.prismic.io/plotly-marketing-website-2/7c320a72-196c-4d55-b546-e7f1e577d63e_image7.png?auto=compress,format"/><style data-emotion="css 1jevy9w">.css-1jevy9w p{color:var(--chakra-colors-bodyText);font-size:10px;padding:10px 0;text-align:center;}@media screen and (min-width: 240px){.css-1jevy9w p{font-size:12px;}}.css-1jevy9w a{color:var(--chakra-colors-accentPrimary);-webkit-text-decoration:underline;text-decoration:underline;}</style><div class="css-1jevy9w"></div></div></div><section class="css-6f9xzw"><p>So we have two main challenges: browsing large data sets then visualizing it. Let’s go over these two functions and how to utilize Polars in each case.</p></section><section class="css-6f9xzw"><h3>Polars in a Dash AG Grid table with infinite scroll</h3></section><section class="css-6f9xzw"><p>Our data set size is 65 million rows and 25 columns. </p><p>We can use a Dash <a href="https://dashaggrid.pythonanywhere.com/scrolling/infinite-scroll" target="_blank" rel="noopener">AG Grid with infinite scroll</a> to load only one page at a time in combination with a column selection modal to allow the user to add or remove columns they don’t want to see. Remember we are dealing with columnar data, not row based data, so this little modification can really improve performance.</p><p>By storing the data in an IPC Arrow file, we can use Polars in the callbacks for these applications to filter and select the necessary data in a memory efficient way.</p><p>The components here are a list of checkboxes for the user to choose which columns to view and then hit an apply button:</p></section><section class="css-1ucaztz"><div class="css-kfzi1"><div class="css-1ekh305"></div><div class="css-15njhai"><button type="button" class="chakra-button css-2nh262" aria-label="copy"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"></path></svg></button><pre class="prism-code language-python" style="color:#d6deeb;white-space:break-spaces;background-color:#181818"><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain">dmc</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">Container</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token operator">*</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> dmc</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">Checkbox</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> label</span><span class="token operator">=</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token builtin" style="color:rgb(122, 118, 255)">id</span><span class="token operator">=</span><span class="token punctuation" style="color:#FFFFFF">{</span><span class="token string" style="color:rgb(122, 118, 255)">"type"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"checkbox"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"field"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"> col</span><span class="token punctuation" style="color:#FFFFFF">}</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">for</span><span class="token plain"> col </span><span class="token keyword" style="color:#7A76FF">in</span><span class="token plain"> all_columns</span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> html</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">Button</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"apply"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token builtin" style="color:rgb(122, 118, 255)">id</span><span class="token operator">=</span><span class="token string" style="color:rgb(122, 118, 255)">"apply-bttn"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span></div></pre></div></div></section><section class="css-6f9xzw"><p>A Dash AG Grid with infinite row mode:</p></section><section class="css-1ucaztz"><div class="css-kfzi1"><div class="css-1ekh305"></div><div class="css-15njhai"><button type="button" class="chakra-button css-2nh262" aria-label="copy"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"></path></svg></button><pre class="prism-code language-python" style="color:#d6deeb;white-space:break-spaces;background-color:#181818"><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain">dag</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">AgGrid</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token builtin" style="color:rgb(122, 118, 255)">id</span><span class="token operator">=</span><span class="token string" style="color:rgb(122, 118, 255)">"infinite-grid"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> rowModelType</span><span class="token operator">=</span><span class="token string" style="color:rgb(122, 118, 255)">"infinite"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> enableEnterpriseModules</span><span class="token operator">=</span><span class="token boolean" style="color:#7FE4FF">True</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> columnDefs</span><span class="token operator">=</span><span class="token plain">layout_utils</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">generate_column_defintions</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> pagination</span><span class="token operator">=</span><span class="token boolean" style="color:#7FE4FF">True</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> paginationPageSize</span><span class="token operator">=</span><span class="token number" style="color:rgb(132, 222, 250)">100</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> className</span><span class="token operator">=</span><span class="token string" style="color:rgb(122, 118, 255)">"ag-theme-alpine-dark"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> defaultColDef</span><span class="token operator">=</span><span class="token punctuation" style="color:#FFFFFF">{</span><span class="token string" style="color:rgb(122, 118, 255)">"filter"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"> </span><span class="token boolean" style="color:#7FE4FF">True</span><span class="token punctuation" style="color:#FFFFFF">}</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span></div></pre></div></div></section><section class="css-6f9xzw"><p>A dcc Store to save the current state of the filter model (more on why we do this in the next part):</p></section><section class="css-1ucaztz"><div class="css-kfzi1"><div class="css-1ekh305"></div><div class="css-15njhai"><button type="button" class="chakra-button css-2nh262" aria-label="copy"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"></path></svg></button><pre class="prism-code language-python" style="color:#d6deeb;white-space:break-spaces;background-color:#181818"><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain">dcc</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">Store</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token builtin" style="color:rgb(122, 118, 255)">id</span><span class="token operator">=</span><span class="token string" style="color:rgb(122, 118, 255)">"filter-model"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span></div></pre></div></div></section><section class="css-6f9xzw"><p>AG Grid with infinite scroll mode, sends a request to the server with a filter model to be applied. We can translate this filter model to Polars expressions:</p></section><section class="css-1ucaztz"><div class="css-kfzi1"><div class="css-1ekh305"></div><div class="css-15njhai"><button type="button" class="chakra-button css-2nh262" aria-label="copy"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"></path></svg></button><pre class="prism-code language-python" style="color:#d6deeb;white-space:break-spaces;background-color:#181818"><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token keyword" style="color:#7A76FF">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(122, 118, 255)">parse_column_filter</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">filter_obj</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token triple-quoted-string string" style="color:rgb(122, 118, 255)">"""Build a polars filter expression based on the filter object"""</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">if</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"filterType"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"set"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean" style="color:#7FE4FF">None</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">for</span><span class="token plain"> val </span><span class="token keyword" style="color:#7A76FF">in</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"values"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">|</span><span class="token operator">=</span><span class="token plain"> pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">cast</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">Utf8</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">cast</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">Categorical</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> val</span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">else</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">if</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"filterType"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"date"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> crit1 </span><span class="token operator">=</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"dateFrom"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">if</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"dateTo"</span><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">in</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> crit2 </span><span class="token operator">=</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"dateTo"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">else</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">if</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"filter"</span><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">in</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> crit1 </span><span class="token operator">=</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"filter"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">if</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"filterTo"</span><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">in</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> crit2 </span><span class="token operator">=</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"filterTo"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">if</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"type"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"contains"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> lower </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">crit1</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">lower</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">=</span><span class="token plain"> pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token builtin" style="color:rgb(122, 118, 255)">str</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">to_lowercase</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token builtin" style="color:rgb(122, 118, 255)">str</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">contains</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">lower</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">elif</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"type"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"notContains"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> lower </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">crit1</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">lower</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">=</span><span class="token plain"> </span><span class="token operator">~</span><span class="token plain">pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token builtin" style="color:rgb(122, 118, 255)">str</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">to_lowercase</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token builtin" style="color:rgb(122, 118, 255)">str</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">contains</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">lower</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">elif</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"type"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"startsWith"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> lower </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">crit1</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">lower</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">=</span><span class="token plain"> pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token builtin" style="color:rgb(122, 118, 255)">str</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">starts_with</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">lower</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">elif</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"type"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"notStartsWith"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> lower </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">crit1</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">lower</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">=</span><span class="token plain"> </span><span class="token operator">~</span><span class="token plain">pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token builtin" style="color:rgb(122, 118, 255)">str</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">starts_with</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">lower</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">elif</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"type"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"endsWith"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> lower </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">crit1</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">lower</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">=</span><span class="token plain"> pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token builtin" style="color:rgb(122, 118, 255)">str</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">ends_with</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">lower</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">elif</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"type"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"notEndsWith"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> lower </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">crit1</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">lower</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">=</span><span class="token plain"> </span><span class="token operator">~</span><span class="token plain">pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token builtin" style="color:rgb(122, 118, 255)">str</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">ends_with</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">lower</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">elif</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"type"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"blank"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">=</span><span class="token plain"> pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">is_null</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">elif</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"type"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"notBlank"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">=</span><span class="token plain"> </span><span class="token operator">~</span><span class="token plain">pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">is_null</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">elif</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"type"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"equals"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">=</span><span class="token plain"> pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> crit1</span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">elif</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"type"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"notEqual"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">=</span><span class="token plain"> pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"> </span><span class="token operator">!=</span><span class="token plain"> crit1</span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">elif</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"type"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"lessThan"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">=</span><span class="token plain"> pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"> </span><span class="token operator"><</span><span class="token plain"> crit1</span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">elif</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"type"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"lessThanOrEqual"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">=</span><span class="token plain"> pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"> </span><span class="token operator"><=</span><span class="token plain"> crit1</span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">elif</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"type"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"greaterThan"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">=</span><span class="token plain"> pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"> </span><span class="token operator">></span><span class="token plain"> crit1</span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">elif</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"type"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"greaterThanOrEqual"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">=</span><span class="token plain"> pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"> </span><span class="token operator">>=</span><span class="token plain"> crit1</span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">elif</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"type"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"inRange"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">if</span><span class="token plain"> filter_obj</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"filterType"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"date"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"> </span><span class="token operator">>=</span><span class="token plain"> crit1</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"> </span><span class="token operator">&</span><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"> </span><span class="token operator"><=</span><span class="token plain"> crit2</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">else</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expr </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"> </span><span class="token operator">>=</span><span class="token plain"> crit1</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"> </span><span class="token operator">&</span><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">col_name</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"> </span><span class="token operator"><=</span><span class="token plain"> crit2</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">else</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token boolean" style="color:#7FE4FF">None</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">return</span><span class="token plain"> expr</span></div></pre></div></div></section><section class="css-6f9xzw"><p>We can then apply these expressions to a lazyframe:</p></section><section class="css-1ucaztz"><div class="css-kfzi1"><div class="css-1ekh305"></div><div class="css-15njhai"><button type="button" class="chakra-button css-2nh262" aria-label="copy"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"></path></svg></button><pre class="prism-code language-python" style="color:#d6deeb;white-space:break-spaces;background-color:#181818"><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token keyword" style="color:#7A76FF">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(122, 118, 255)">scan_ldf</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> filter_model</span><span class="token operator">=</span><span class="token boolean" style="color:#7FE4FF">None</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> columns</span><span class="token operator">=</span><span class="token boolean" style="color:#7FE4FF">None</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> sort_model</span><span class="token operator">=</span><span class="token boolean" style="color:#7FE4FF">None</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"></span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> ldf </span><span class="token operator">=</span><span class="token plain"> DATA_SOURCE</span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">if</span><span class="token plain"> columns</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> ldf </span><span class="token operator">=</span><span class="token plain"> ldf</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">select</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">columns</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">if</span><span class="token plain"> filter_model</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> expression_list </span><span class="token operator">=</span><span class="token plain"> make_filter_expr_list</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">filter_model</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">if</span><span class="token plain"> expression_list</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> filter_query </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean" style="color:#7FE4FF">None</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">for</span><span class="token plain"> expr </span><span class="token keyword" style="color:#7A76FF">in</span><span class="token plain"> expression_list</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">if</span><span class="token plain"> filter_query </span><span class="token keyword" style="color:#7A76FF">is</span><span class="token plain"> </span><span class="token boolean" style="color:#7FE4FF">None</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> filter_query </span><span class="token operator">=</span><span class="token plain"> expr</span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">else</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> filter_query </span><span class="token operator">&</span><span class="token operator">=</span><span class="token plain"> expr</span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> ldf </span><span class="token operator">=</span><span class="token plain"> ldf</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token builtin" style="color:rgb(122, 118, 255)">filter</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">filter_query</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">return</span><span class="token plain"> ldf</span></div></pre></div></div></section><section class="css-6f9xzw"><p>Finally, we’ll use these functions to query the Arrow file and retrieve data inside our callback, slice based on start and end row, and then convert the end result to pandas for the return statement.</p></section><section class="css-1ucaztz"><div class="css-kfzi1"><div class="css-1ekh305"></div><div class="css-15njhai"><button type="button" class="chakra-button css-2nh262" aria-label="copy"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"></path></svg></button><pre class="prism-code language-python" style="color:#d6deeb;white-space:break-spaces;background-color:#181818"><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token decorator annotation punctuation" style="color:#FFFFFF">@app</span><span class="token decorator annotation punctuation" style="color:#FFFFFF">.</span><span class="token decorator annotation punctuation" style="color:#FFFFFF">callback</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> Output</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token string" style="color:rgb(122, 118, 255)">"infinite-grid"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"getRowsResponse"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> Output</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token string" style="color:rgb(122, 118, 255)">"filter-model"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"data"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> Input</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token string" style="color:rgb(122, 118, 255)">"infinite-grid"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"getRowsRequest"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> Input</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token string" style="color:rgb(122, 118, 255)">"infinite-grid"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"columnDefs"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> manager</span><span class="token operator">=</span><span class="token plain">long_callback_manager</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"></span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"></span><span class="token keyword" style="color:#7A76FF">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(122, 118, 255)">infinite_scroll</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">request</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> columnDefs</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">if</span><span class="token plain"> request </span><span class="token keyword" style="color:#7A76FF">is</span><span class="token plain"> </span><span class="token boolean" style="color:#7FE4FF">None</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">raise</span><span class="token plain"> PreventUpdate</span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> columns </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"field"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">for</span><span class="token plain"> col </span><span class="token keyword" style="color:#7A76FF">in</span><span class="token plain"> columnDefs</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> ldf </span><span class="token operator">=</span><span class="token plain"> scan_ldf</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">filter_model</span><span class="token operator">=</span><span class="token plain">request</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"filterModel"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> columns</span><span class="token operator">=</span><span class="token plain">columns</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> df </span><span class="token operator">=</span><span class="token plain"> ldf</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">collect</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> partial </span><span class="token operator">=</span><span class="token plain"> df</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token builtin" style="color:rgb(122, 118, 255)">slice</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">request</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"startRow"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> request</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"endRow"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">to_pandas</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">{</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"rowData"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"> partial</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">to_dict</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token string" style="color:rgb(122, 118, 255)">"records"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"rowCount"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(122, 118, 255)">len</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">df</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">}</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> request</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"filterModel"</span><span class="token punctuation" style="color:#FFFFFF">]</span></div></pre></div></div></section><section class="css-6f9xzw"><h3>Aggregate data for rasterized plots</h3></section><section class="css-6f9xzw"><p>Remember the filter-model we stored in the last callback? It’s time to utilize it for visualizations and make some plots!</p></section><section class="css-1ucaztz"><div class="css-kfzi1"><div class="css-1ekh305"></div><div class="css-15njhai"><button type="button" class="chakra-button css-2nh262" aria-label="copy"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"></path></svg></button><pre class="prism-code language-python" style="color:#d6deeb;white-space:break-spaces;background-color:#181818"><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain">dcc</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">Store</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token builtin" style="color:rgb(122, 118, 255)">id</span><span class="token operator">=</span><span class="token string" style="color:rgb(122, 118, 255)">"filter-model"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> dmc</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">Group</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> dmc</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">Button</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"re-run visualizations"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token builtin" style="color:rgb(122, 118, 255)">id</span><span class="token operator">=</span><span class="token string" style="color:rgb(122, 118, 255)">"viz-bttn"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> dmc</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">Group</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> html</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">Div</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> dcc</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">Graph</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token builtin" style="color:rgb(122, 118, 255)">id</span><span class="token operator">=</span><span class="token string" style="color:rgb(122, 118, 255)">"mileage-time-graph"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> html</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">Div</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> dcc</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">Graph</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token builtin" style="color:rgb(122, 118, 255)">id</span><span class="token operator">=</span><span class="token string" style="color:rgb(122, 118, 255)">"request-dropoff-graph"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span></div></pre></div></div></section><section class="css-6f9xzw"><p>Let’s strategize. By default we have 6 million rows, putting this much data in a scatter plot could crash your browser. We can check the size of our dataset and aggregate on our target columns if it’s too big:</p></section><section class="css-1ucaztz"><div class="css-kfzi1"><div class="css-1ekh305"></div><div class="css-15njhai"><button type="button" class="chakra-button css-2nh262" aria-label="copy"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"></path></svg></button><pre class="prism-code language-python" style="color:#d6deeb;white-space:break-spaces;background-color:#181818"><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token keyword" style="color:#7A76FF">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(122, 118, 255)">aggregate_on_pay_tip</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">ldf</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> results </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> ldf</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">with_columns</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token string" style="color:rgb(122, 118, 255)">"driver_pay"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token builtin" style="color:rgb(122, 118, 255)">round</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token number" style="color:rgb(132, 222, 250)">0</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">alias</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token string" style="color:rgb(122, 118, 255)">"rounded_driver_pay"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> pl</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">col</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token string" style="color:rgb(122, 118, 255)">"tips"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token builtin" style="color:rgb(122, 118, 255)">round</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token number" style="color:rgb(132, 222, 250)">0</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">alias</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token string" style="color:rgb(122, 118, 255)">"rounded_tips"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">collect</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">groupby</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"rounded_driver_pay"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"rounded_tips"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">count</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">return</span><span class="token plain"> results</span></div></pre></div></div></section><section class="css-6f9xzw"><p>What if even an aggregation is still too large? We can use a rasterized plot in these cases. This means rendering of a visualization is happening server side and a flat image is passed back to the browser instead of an SVG with vectors representing each data point. This type of plot, although less interactive by a user, is great for visualizing large datasets that would otherwise crash a web browser on regular plots.</p></section><section class="css-1ucaztz"><div class="css-kfzi1"><div class="css-1ekh305"></div><div class="css-15njhai"><button type="button" class="chakra-button css-2nh262" aria-label="copy"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"></path></svg></button><pre class="prism-code language-python" style="color:#d6deeb;white-space:break-spaces;background-color:#181818"><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token keyword" style="color:#7A76FF">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(122, 118, 255)">generate_data_shader_plot</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">df</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> x_label</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> y_label</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> cvs </span><span class="token operator">=</span><span class="token plain"> ds</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">Canvas</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">plot_width</span><span class="token operator">=</span><span class="token number" style="color:rgb(132, 222, 250)">100</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> plot_height</span><span class="token operator">=</span><span class="token number" style="color:rgb(132, 222, 250)">100</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> agg </span><span class="token operator">=</span><span class="token plain"> cvs</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">points</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">df</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">to_pandas</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> x</span><span class="token operator">=</span><span class="token plain">x_label</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> y</span><span class="token operator">=</span><span class="token plain">y_label</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> zero_mask </span><span class="token operator">=</span><span class="token plain"> agg</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">values </span><span class="token operator">==</span><span class="token plain"> </span><span class="token number" style="color:rgb(132, 222, 250)">0</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> agg</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">values </span><span class="token operator">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">log10</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">agg</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">values</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> where</span><span class="token operator">=</span><span class="token plain">np</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">logical_not</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">zero_mask</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> agg</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">values</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token plain">zero_mask</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> np</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">nan</span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> fig </span><span class="token operator">=</span><span class="token plain"> px</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">imshow</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">agg</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> origin</span><span class="token operator">=</span><span class="token string" style="color:rgb(122, 118, 255)">"lower"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> labels</span><span class="token operator">=</span><span class="token punctuation" style="color:#FFFFFF">{</span><span class="token string" style="color:rgb(122, 118, 255)">"color"</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"Log10(count)"</span><span class="token punctuation" style="color:#FFFFFF">}</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> color_continuous_scale</span><span class="token operator">=</span><span class="token string" style="color:rgb(122, 118, 255)">'solar'</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> fig</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">update_traces</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">hoverongaps</span><span class="token operator">=</span><span class="token boolean" style="color:#7FE4FF">False</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> fig</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">update_layout</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">coloraxis_colorbar</span><span class="token operator">=</span><span class="token builtin" style="color:rgb(122, 118, 255)">dict</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">title</span><span class="token operator">=</span><span class="token string" style="color:rgb(122, 118, 255)">"Count"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> tickprefix</span><span class="token operator">=</span><span class="token string" style="color:rgb(122, 118, 255)">"1.e"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> font</span><span class="token operator">=</span><span class="token builtin" style="color:rgb(122, 118, 255)">dict</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">color</span><span class="token operator">=</span><span class="token string" style="color:rgb(122, 118, 255)">"#FFFFFF"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> paper_bgcolor</span><span class="token operator">=</span><span class="token string" style="color:rgb(122, 118, 255)">"#23262E"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> plot_bgcolor</span><span class="token operator">=</span><span class="token string" style="color:rgb(122, 118, 255)">"#23262E"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">return</span><span class="token plain"> fig</span></div></pre></div></div></section><section class="css-6f9xzw"><p>So the final callback can be something like the following. With Polars, we can query the data quickly and efficiently:</p><ul><li>If the data size is too big, aggregate it to have fewer rows.</li><li>If our aggregation is still too big, generate a rasterized plot using Datashader. </li><li>In all other cases, we can generate a good old scatter plot for the user to view and interact with.</li></ul></section><section class="css-1ucaztz"><div class="css-kfzi1"><div class="css-1ekh305"></div><div class="css-15njhai"><button type="button" class="chakra-button css-2nh262" aria-label="copy"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 448 512" aria-hidden="true" focusable="false" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z"></path></svg></button><pre class="prism-code language-python" style="color:#d6deeb;white-space:break-spaces;background-color:#181818"><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token decorator annotation punctuation" style="color:#FFFFFF">@app</span><span class="token decorator annotation punctuation" style="color:#FFFFFF">.</span><span class="token decorator annotation punctuation" style="color:#FFFFFF">callback</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> Output</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token string" style="color:rgb(122, 118, 255)">"mileage-time-graph"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"figure"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> Output</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token string" style="color:rgb(122, 118, 255)">"request-dropoff-graph"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"figure"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> State</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token string" style="color:rgb(122, 118, 255)">"filter-model"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"data"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> Input</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token string" style="color:rgb(122, 118, 255)">"viz-bttn"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"n_clicks"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> manager</span><span class="token operator">=</span><span class="token plain">long_callback_manager</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"></span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"></span><span class="token keyword" style="color:#7A76FF">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(122, 118, 255)">visualize</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">filter_model</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> n_clicks</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> columns </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token string" style="color:rgb(122, 118, 255)">"trip_time"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"trip_miles"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"driver_pay"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"tips"</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">if</span><span class="token plain"> filter_model</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> columns_to_filter </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token plain">col </span><span class="token keyword" style="color:#7A76FF">for</span><span class="token plain"> col </span><span class="token keyword" style="color:#7A76FF">in</span><span class="token plain"> filter_model</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> columns </span><span class="token operator">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(122, 118, 255)">list</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token builtin" style="color:rgb(122, 118, 255)">set</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">[</span><span class="token operator">*</span><span class="token plain">columns_to_filter</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain">columns</span><span class="token punctuation" style="color:#FFFFFF">]</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> ldf </span><span class="token operator">=</span><span class="token plain"> scan_ldf</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">filter_model</span><span class="token operator">=</span><span class="token plain">filter_model</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> columns</span><span class="token operator">=</span><span class="token plain">columns</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> df </span><span class="token operator">=</span><span class="token plain"> ldf</span><span class="token punctuation" style="color:#FFFFFF">.</span><span class="token plain">collect</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">if</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(122, 118, 255)">len</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">df</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"> </span><span class="token operator">></span><span class="token plain"> </span><span class="token number" style="color:rgb(132, 222, 250)">20000</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> agg1 </span><span class="token operator">=</span><span class="token plain"> aggregate_on_trip_distance_time</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">ldf</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">if</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(122, 118, 255)">len</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">agg1</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"> </span><span class="token operator"><</span><span class="token plain"> </span><span class="token number" style="color:rgb(132, 222, 250)">20000</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> fig1 </span><span class="token operator">=</span><span class="token plain"> generate_scatter_go</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">agg1</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"rounded_time"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"rounded_miles"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">else</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> fig1 </span><span class="token operator">=</span><span class="token plain"> generate_data_shader_plot</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">agg1</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"rounded_time"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"rounded_miles"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain" style="display:inline-block"> </span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> agg2 </span><span class="token operator">=</span><span class="token plain"> aggregate_on_pay_tip</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">ldf</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">if</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(122, 118, 255)">len</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">agg2</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"> </span><span class="token operator"><</span><span class="token plain"> </span><span class="token number" style="color:rgb(132, 222, 250)">25000</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> fig2 </span><span class="token operator">=</span><span class="token plain"> generate_scatter_go</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">agg2</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"rounded_driver_pay"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"rounded_tips"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">else</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> fig2 </span><span class="token operator">=</span><span class="token plain"> generate_data_shader_plot</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">agg2</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"rounded_driver_pay"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"rounded_tips"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">return</span><span class="token plain"> fig1</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> fig2</span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">else</span><span class="token punctuation" style="color:#FFFFFF">:</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> fig1 </span><span class="token operator">=</span><span class="token plain"> generate_scatter_go</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">df</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"trip_time"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"trip_miles"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> fig2 </span><span class="token operator">=</span><span class="token plain"> generate_scatter_go</span><span class="token punctuation" style="color:#FFFFFF">(</span><span class="token plain">df</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"driver_pay"</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(122, 118, 255)">"tips"</span><span class="token punctuation" style="color:#FFFFFF">)</span><span class="token plain"></span></div><div class="token-line" style="color:#d6deeb;white-space:break-spaces"><span class="token plain"> </span><span class="token keyword" style="color:#7A76FF">return</span><span class="token plain"> fig1</span><span class="token punctuation" style="color:#FFFFFF">,</span><span class="token plain"> fig2</span></div></pre></div></div></section><section class="css-6f9xzw"><p>Here’s the resulting visualization for 49 million rows of data. The miles vs time plot ends up being rasterized and the tips vs driver pay is a scatter plot of the aggregated data:</p></section><div class="css-f8qi8q"><div class="css-netxch"><img alt="Visualizing large data sets with Polars" class="chakra-image css-1izgn1a" src="https://images.prismic.io/plotly-marketing-website-2/f1c6c10c-3c49-425e-9725-83f37081297c_image4.png?auto=compress,format"/><div class="css-1jevy9w"></div></div></div><section class="css-6f9xzw"><h2>Polars with Plotly Express</h2></section><section class="css-6f9xzw"><p>In the previous examples, Polars was used for data wrangling in Dash callbacks, and then the resulting Polars dataframes were converted to either a Pandas dataframe, numpy or python list before passing as an argument to the Plotly figure.</p><p>As of the latest Plotly python graphing library (v5.16) you can <a href="https://github.com/plotly/plotly.py/blob/master/doc/python/px-arguments.md#input-data-as-non-pandas-dataframes" target="_blank" rel="noopener">directly pass a Polars DataFrame</a> to Plotly Express.</p></section><section class="css-6f9xzw"><h2>Wrap Up</h2></section><section class="css-6f9xzw"><p>We went over what Polars is and why it’s good at handling large data. We also went through two very common, real use cases that come up in Dash applications that can utilize Polars for better performance. I’m sure you’ll find many more ways to implement this library with Dash applications as you dive deeper.</p><p>Thinking back to the equity firm that started us down this path, the intended purpose of the Dash application was to leverage the firm’s existing wealth of company data — spanning across the world and all industry sectors, and create an exploratory tool for their team to identify potential companies to invest in.</p><p>Before the Professional Services team was involved, this data existed solely in a Redshift database and investment strategists would have to request specific filters/search parameters which the data team would then use to query the dataset to acquire Excel documents with the requested companies.</p><p>The Dash application is built utilizing Polars for back-end data handling and is now deployed to Dash Enterprise.</p><p>User feedback suggests that the app overall has been a great improvement to their BI workflows, by simplifying this process by providing a platform for their investment team to discover companies, save those companies to lists for future consideration, and share saved companies with colleagues for a more collaborative process — all in one place.</p><p></p><p><em>(Image sources: Giphy @gifnews, Reddit)</em></p></section></div></main><div class="css-1a2dkud"><style data-emotion="css 6iary9">.css-6iary9{position:relative;border-top:0.5px solid;border-color:var(--chakra-colors-border);color:var(--chakra-colors-textPrimary);padding-top:35px;padding-bottom:35px;}@media screen and (min-width: 960px){.css-6iary9{padding-top:80px;padding-bottom:var(--chakra-space-10);}}</style><footer class="css-6iary9"><style data-emotion="css j221ct">.css-j221ct{width:100%;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;-webkit-padding-start:var(--chakra-space-4);padding-inline-start:var(--chakra-space-4);-webkit-padding-end:var(--chakra-space-4);padding-inline-end:var(--chakra-space-4);max-width:1400px;}</style><div class="chakra-container css-j221ct"><style data-emotion="css 89wkbf">.css-89wkbf{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:var(--chakra-space-8);position:relative;}@media screen and (min-width: 960px){.css-89wkbf{gap:0px;}}</style><div class="chakra-stack css-89wkbf"><style data-emotion="css 1py6ya0">.css-1py6ya0{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;}@media screen and (min-width: 960px){.css-1py6ya0{-webkit-box-flex-wrap:initial;-webkit-flex-wrap:initial;-ms-flex-wrap:initial;flex-wrap:initial;}}</style><div id="top" class="css-1py6ya0"><style data-emotion="css 1oig900">.css-1oig900{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:var(--chakra-space-2);width:100%;}@media screen and (min-width: 960px){.css-1oig900{gap:var(--chakra-space-5);width:40%;}}@media screen and (min-width: 1200px){.css-1oig900{width:43%;}}</style><div class="chakra-stack css-1oig900"><div class="css-0"></div><form id="pardot-form"><style data-emotion="css k008qs">.css-k008qs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;}</style><div class="css-k008qs"><style data-emotion="css 18x4cpl">.css-18x4cpl{width:100%;position:relative;}@media screen and (min-width: 960px){.css-18x4cpl{width:76%;}}</style><div role="group" class="chakra-form-control css-18x4cpl"><style data-emotion="css 16z694i">.css-16z694i{width:100%;height:var(--input-height);-webkit-padding-start:var(--input-padding);padding-inline-start:var(--input-padding);-webkit-padding-end:var(--input-padding);padding-inline-end:var(--input-padding);border-radius:var(--input-border-radius);min-width:0px;outline:2px solid transparent;outline-offset:2px;position:relative;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);--input-font-size:var(--chakra-fontSizes-md);--input-padding:var(--chakra-space-4);--input-border-radius:var(--chakra-radii-md);--input-height:var(--chakra-sizes-10);border:1px solid;border-color:var(--chakra-colors-border);background:#fff;-webkit-transition:none;transition:none;color:#5B6372;font-size:var(--chakra-fontSizes-sm);border-top-right-radius:5px;border-bottom-right-radius:5px;}.css-16z694i:disabled,.css-16z694i[disabled],.css-16z694i[aria-disabled=true],.css-16z694i[data-disabled]{opacity:0.4;cursor:not-allowed;}.css-16z694i[aria-readonly=true],.css-16z694i[readonly],.css-16z694i[data-readonly]{box-shadow:var(--chakra-shadows-none)!important;-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;}.css-16z694i[aria-invalid=true],.css-16z694i[data-invalid]{border-color:#FC8181;box-shadow:0 0 0 1px #FC8181;}.css-16z694i:focus,.css-16z694i[data-focus]{border-color:#7FE4FF;box-shadow:var(--chakra-shadows-none);}.chakra-ui-dark .css-16z694i:not([data-theme]),[data-theme=dark] .css-16z694i:not([data-theme]),.css-16z694i[data-theme=dark]{background-color:#161616;color:#bfc8d6;}.chakra-ui-dark .css-16z694i:not([data-theme])::-webkit-input-placeholder{color:#A2AAB8;}.chakra-ui-dark .css-16z694i:not([data-theme])::-moz-placeholder{color:#A2AAB8;}.chakra-ui-dark .css-16z694i:not([data-theme]):-ms-input-placeholder{color:#A2AAB8;}[data-theme=dark] .css-16z694i:not([data-theme])::-webkit-input-placeholder{color:#A2AAB8;}[data-theme=dark] .css-16z694i:not([data-theme])::-moz-placeholder{color:#A2AAB8;}[data-theme=dark] .css-16z694i:not([data-theme]):-ms-input-placeholder{color:#A2AAB8;}.css-16z694i[data-theme=dark]::-webkit-input-placeholder{color:#A2AAB8;}.css-16z694i[data-theme=dark]::-moz-placeholder{color:#A2AAB8;}.css-16z694i[data-theme=dark]:-ms-input-placeholder{color:#A2AAB8;}.chakra-ui-dark .css-16z694i:not([data-theme])::placeholder,[data-theme=dark] .css-16z694i:not([data-theme])::placeholder,.css-16z694i[data-theme=dark]::placeholder{color:#A2AAB8;}@media screen and (min-width: 240px){.css-16z694i{border-top-right-radius:0px;border-bottom-right-radius:0px;}}.css-16z694i::-webkit-input-placeholder{font-style:italic;color:var(--chakra-colors-bodyText);opacity:1;}.css-16z694i::-moz-placeholder{font-style:italic;color:var(--chakra-colors-bodyText);opacity:1;}.css-16z694i:-ms-input-placeholder{font-style:italic;color:var(--chakra-colors-bodyText);opacity:1;}.css-16z694i::placeholder{font-style:italic;color:var(--chakra-colors-bodyText);opacity:1;}.css-16z694i:hover,.css-16z694i[data-hover]{border:1px solid;border-color:var(--chakra-colors-accentTertiary);}.css-16z694i:focus-visible,.css-16z694i[data-focus-visible]{border-color:var(--chakra-colors-accentTertiary);box-shadow:var(--chakra-shadows-none);}</style><input class="chakra-input field css-16z694i" placeholder="Enter your email address" name="email" id="email"/></div><style data-emotion="css w87pwd">.css-w87pwd{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-appearance:none;-moz-appearance:none;-ms-appearance:none;appearance:none;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;vertical-align:middle;outline:2px solid transparent;outline-offset:2px;line-height:1.2;border-radius:8px;font-weight:var(--chakra-fontWeights-bold);transition-property:var(--chakra-transition-property-common);transition-duration:var(--chakra-transition-duration-normal);text-transform:uppercase;height:var(--chakra-sizes-10);min-width:var(--chakra-sizes-10);font-size:13px;color:var(--chakra-colors-linkColor);cursor:pointer;border:solid 1px transparent;box-shadow:var(--chakra-shadows-ctaButton);background-image:linear-gradient(45deg, #7FE4FF, #7A76FF, #7A76FF);-webkit-background-size:200% 100%;background-size:200% 100%;-webkit-background-position:0% 0;background-position:0% 0;position:relative;z-index:3;right:1px;-webkit-padding-start:25px;padding-inline-start:25px;-webkit-padding-end:25px;padding-inline-end:25px;border-top-left-radius:5px;border-bottom-left-radius:5px;-webkit-transition:none;transition:none;}.css-w87pwd:focus-visible,.css-w87pwd[data-focus-visible]{box-shadow:var(--chakra-shadows-outline);}.css-w87pwd:hover,.css-w87pwd[data-hover]{-webkit-transition:background-color 4000ms ease-in-out;transition:background-color 4000ms ease-in-out;-webkit-background-position:100% 0;background-position:100% 0;color:#ffffff;box-shadow:2px 1000px 1px #7A76FF inset!important;}.css-w87pwd:hover:disabled,.css-w87pwd[data-hover]:disabled,.css-w87pwd:hover[disabled],.css-w87pwd[data-hover][disabled],.css-w87pwd:hover[aria-disabled=true],.css-w87pwd[data-hover][aria-disabled=true],.css-w87pwd:hover[data-disabled],.css-w87pwd[data-hover][data-disabled]{background:initial;}.chakra-ui-dark .css-w87pwd:not([data-theme]):disabled,[data-theme=dark] .css-w87pwd:not([data-theme]):disabled,.css-w87pwd[data-theme=dark]:disabled,.chakra-ui-dark .css-w87pwd:not([data-theme])[disabled],[data-theme=dark] .css-w87pwd:not([data-theme])[disabled],.css-w87pwd[data-theme=dark][disabled],.chakra-ui-dark .css-w87pwd:not([data-theme])[aria-disabled=true],[data-theme=dark] .css-w87pwd:not([data-theme])[aria-disabled=true],.css-w87pwd[data-theme=dark][aria-disabled=true],.chakra-ui-dark .css-w87pwd:not([data-theme])[data-disabled],[data-theme=dark] .css-w87pwd:not([data-theme])[data-disabled],.css-w87pwd[data-theme=dark][data-disabled]{color:#ffffff!important;}@media screen and (min-width: 240px){.css-w87pwd{border-top-left-radius:0px;border-bottom-left-radius:0px;}}@media screen and (min-width: 960px){.css-w87pwd{-webkit-padding-start:0px;padding-inline-start:0px;-webkit-padding-end:0px;padding-inline-end:0px;width:39%;letter-spacing:2.6px;}}@media screen and (min-width: 1200px){.css-w87pwd{width:24%;}}.css-w87pwd:disabled,.css-w87pwd[disabled],.css-w87pwd[aria-disabled=true],.css-w87pwd[data-disabled]{opacity:1;cursor:not-allowed;border:1px solid;border-color:var(--chakra-colors-transparent);-webkit-transition:none;transition:none;}.css-w87pwd:disabled:hover,.css-w87pwd[disabled]:hover,.css-w87pwd[aria-disabled=true]:hover,.css-w87pwd[data-disabled]:hover,.css-w87pwd:disabled[data-hover],.css-w87pwd[disabled][data-hover],.css-w87pwd[aria-disabled=true][data-hover],.css-w87pwd[data-disabled][data-hover]{border:1px solid;border-color:var(--chakra-colors-accentPrimary);}</style><button type="submit" class="chakra-button css-w87pwd">Let‘s Go</button></div></form><style data-emotion="css 3b86ra">.css-3b86ra{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:var(--chakra-space-5);padding-top:var(--chakra-space-8);}@media screen and (min-width: 768px){.css-3b86ra{padding-top:var(--chakra-space-5);}}@media screen and (min-width: 960px){.css-3b86ra{padding-top:0px;}}</style><div class="chakra-stack css-3b86ra"><style data-emotion="css 1dneacq">.css-1dneacq a{font-size:var(--chakra-fontSizes-2-5xl);}.css-1dneacq:hover,.css-1dneacq[data-hover]{-webkit-filter:invert(51%) sepia(24%) saturate(6981%) hue-rotate(219deg) brightness(100%) contrast(103%);filter:invert(51%) sepia(24%) saturate(6981%) hue-rotate(219deg) brightness(100%) contrast(103%);}</style><div class="css-1dneacq"><a href="https://medium.com/plotly"><style data-emotion="css 17o9b05">.css-17o9b05{color:var(--chakra-colors-bodyText);font-size:20px;}</style><div class="css-17o9b05"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M834.7 279.8l61.3-58.9V208H683.7L532.4 586.4 360.3 208H137.7v12.9l71.6 86.6c7 6.4 10.6 15.8 9.7 25.2V673c2.2 12.3-1.7 24.8-10.3 33.7L128 805v12.7h228.6v-12.9l-80.6-98a39.99 39.99 0 0 1-11.1-33.7V378.7l200.7 439.2h23.3l172.6-439.2v349.9c0 9.2 0 11.1-6 17.2l-62.1 60.3V819h301.2v-12.9l-59.9-58.9c-5.2-4-7.9-10.7-6.8-17.2V297a18.1 18.1 0 0 1 6.8-17.2z"></path></svg></div></a></div><div class="css-1dneacq"><a href="https://twitter.com/plotlygraphs"><style data-emotion="css 8gwtju">.css-8gwtju{color:var(--chakra-colors-bodyText);font-size:16px;}</style><div class="css-8gwtju"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 24 24" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M8 2H1L9.26086 13.0145L1.44995 21.9999H4.09998L10.4883 14.651L16 22H23L14.3917 10.5223L21.8001 2H19.1501L13.1643 8.88578L8 2ZM17 20L5 4H7L19 20H17Z"></path></svg></div></a></div><div class="css-1dneacq"><a href="https://github.com/plotly"><div class="css-17o9b05"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M511.6 76.3C264.3 76.2 64 276.4 64 523.5 64 718.9 189.3 885 363.8 946c23.5 5.9 19.9-10.8 19.9-22.2v-77.5c-135.7 15.9-141.2-73.9-150.3-88.9C215 726 171.5 718 184.5 703c30.9-15.9 62.4 4 98.9 57.9 26.4 39.1 77.9 32.5 104 26 5.7-23.5 17.9-44.5 34.7-60.8-140.6-25.2-199.2-111-199.2-213 0-49.5 16.3-95 48.3-131.7-20.4-60.5 1.9-112.3 4.9-120 58.1-5.2 118.5 41.6 123.2 45.3 33-8.9 70.7-13.6 112.9-13.6 42.4 0 80.2 4.9 113.5 13.9 11.3-8.6 67.3-48.8 121.3-43.9 2.9 7.7 24.7 58.3 5.5 118 32.4 36.8 48.9 82.7 48.9 132.3 0 102.2-59 188.1-200 212.9a127.5 127.5 0 0 1 38.1 91v112.5c.8 9 0 17.9 15 17.9 177.1-59.7 304.6-227 304.6-424.1 0-247.2-200.4-447.3-447.5-447.3z"></path></svg></div></a></div><div class="css-1dneacq"><a href="https://www.instagram.com/plotly/"><div class="css-17o9b05"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M512 306.9c-113.5 0-205.1 91.6-205.1 205.1S398.5 717.1 512 717.1 717.1 625.5 717.1 512 625.5 306.9 512 306.9zm0 338.4c-73.4 0-133.3-59.9-133.3-133.3S438.6 378.7 512 378.7 645.3 438.6 645.3 512 585.4 645.3 512 645.3zm213.5-394.6c-26.5 0-47.9 21.4-47.9 47.9s21.4 47.9 47.9 47.9 47.9-21.3 47.9-47.9a47.84 47.84 0 0 0-47.9-47.9zM911.8 512c0-55.2.5-109.9-2.6-165-3.1-64-17.7-120.8-64.5-167.6-46.9-46.9-103.6-61.4-167.6-64.5-55.2-3.1-109.9-2.6-165-2.6-55.2 0-109.9-.5-165 2.6-64 3.1-120.8 17.7-167.6 64.5C132.6 226.3 118.1 283 115 347c-3.1 55.2-2.6 109.9-2.6 165s-.5 109.9 2.6 165c3.1 64 17.7 120.8 64.5 167.6 46.9 46.9 103.6 61.4 167.6 64.5 55.2 3.1 109.9 2.6 165 2.6 55.2 0 109.9.5 165-2.6 64-3.1 120.8-17.7 167.6-64.5 46.9-46.9 61.4-103.6 64.5-167.6 3.2-55.1 2.6-109.8 2.6-165zm-88 235.8c-7.3 18.2-16.1 31.8-30.2 45.8-14.1 14.1-27.6 22.9-45.8 30.2C695.2 844.7 570.3 840 512 840c-58.3 0-183.3 4.7-235.9-16.1-18.2-7.3-31.8-16.1-45.8-30.2-14.1-14.1-22.9-27.6-30.2-45.8C179.3 695.2 184 570.3 184 512c0-58.3-4.7-183.3 16.1-235.9 7.3-18.2 16.1-31.8 30.2-45.8s27.6-22.9 45.8-30.2C328.7 179.3 453.7 184 512 184s183.3-4.7 235.9 16.1c18.2 7.3 31.8 16.1 45.8 30.2 14.1 14.1 22.9 27.6 30.2 45.8C844.7 328.7 840 453.7 840 512c0 58.3 4.7 183.2-16.2 235.8z"></path></svg></div></a></div><div class="css-1dneacq"><a href="https://www.facebook.com/Plotly/"><div class="css-17o9b05"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zm-92.4 233.5h-63.9c-50.1 0-59.8 23.8-59.8 58.8v77.1h119.6l-15.6 120.7h-104V912H539.2V602.2H434.9V481.4h104.3v-89c0-103.3 63.1-159.6 155.3-159.6 44.2 0 82.1 3.3 93.2 4.8v107.9z"></path></svg></div></a></div><div class="css-1dneacq"><a href="https://www.linkedin.com/company/plotly/"><div class="css-17o9b05"><svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024" height="1em" width="1em" xmlns="http://www.w3.org/2000/svg"><path d="M880 112H144c-17.7 0-32 14.3-32 32v736c0 17.7 14.3 32 32 32h736c17.7 0 32-14.3 32-32V144c0-17.7-14.3-32-32-32zM349.3 793.7H230.6V411.9h118.7v381.8zm-59.3-434a68.8 68.8 0 1 1 68.8-68.8c-.1 38-30.9 68.8-68.8 68.8zm503.7 434H675.1V608c0-44.3-.8-101.2-61.7-101.2-61.7 0-71.2 48.2-71.2 98v188.9H423.7V411.9h113.8v52.2h1.6c15.8-30 54.5-61.7 112.3-61.7 120.2 0 142.3 79.1 142.3 181.9v209.4z"></path></svg></div></a></div></div></div><style data-emotion="css 34u4wp">.css-34u4wp{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:0.5rem;width:100%;}@media screen and (min-width: 960px){.css-34u4wp{width:50%;}}</style><div class="chakra-stack css-34u4wp"><style data-emotion="css 123i031">.css-123i031{display:grid;grid-gap:0px;grid-row-gap:var(--chakra-space-5);grid-column-gap:var(--chakra-space-5);grid-template-columns:repeat(2, 1fr);-webkit-box-flex-wrap:wrap;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-top:0px;-webkit-align-items:start;-webkit-box-align:start;-ms-flex-align:start;align-items:start;font-size:var(--chakra-fontSizes-sm);}@media screen and (min-width: 240px){.css-123i031{grid-column-gap:var(--chakra-space-3);}}@media screen and (min-width: 576px){.css-123i031{grid-row-gap:var(--chakra-space-8);grid-column-gap:var(--chakra-space-8);grid-template-columns:repeat(3, 1fr);}}@media screen and (min-width: 960px){.css-123i031{grid-column-gap:0px;padding-top:var(--chakra-space-5);}}@media screen and (min-width: 1200px){.css-123i031{grid-row-gap:var(--chakra-space-10);grid-column-gap:0px;}}</style><div class="css-123i031"><style data-emotion="css 1297823">.css-1297823{position:relative;z-index:2;padding-top:var(--chakra-space-10);}@media screen and (min-width: 960px){.css-1297823{padding-top:0px;}}</style><div class="css-1297823"><style data-emotion="css 11nrrcx">.css-11nrrcx{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:var(--chakra-space-3);}</style><div class="chakra-stack css-11nrrcx"><style data-emotion="css 122asr0">.css-122asr0{font-size:var(--chakra-fontSizes-lg);font-weight:var(--chakra-fontWeights-bold);letter-spacing:.1em;text-transform:uppercase;}</style><p class="chakra-text css-122asr0">Products & Services</p><style data-emotion="css 73k4dz">.css-73k4dz{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:0.5rem;list-style-type:none;padding-top:var(--chakra-space-2);}</style><ul class="chakra-stack css-73k4dz"><style data-emotion="css 1nkfmis">.css-1nkfmis{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}.css-1nkfmis a{font-size:var(--chakra-fontSizes-lg);color:var(--chakra-colors-bodyText);}</style><li class="css-1nkfmis"><style data-emotion="css 5cco2g">.css-5cco2g{display:inline-block;}@media screen and (min-width: 240px){.css-5cco2g{padding-right:var(--chakra-space-2);}}@media screen and (min-width: 960px){.css-5cco2g{padding-right:var(--chakra-space-3);}}</style><div class="css-5cco2g"><a href="/dash/">Dash Enterprise</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://plotly.com/dash/app-studio/">Plotly App Studio</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://plotly.com/dash/chatbot-builder/">Chatbot Builder</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="/dash/workspaces/">Data App Workspaces</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="/dash/design-kit/">Design Kit</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="/dash/snapshot-engine/">Snapshot Engine</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="/dash/app-manager/">App Manager</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="/dash/centralized-data-app-management/">Centralized Development</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="/dash/job-queue/">Job Queue</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="/dash/embedding/">Embedding</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="/dash/authentication/">Authentication Middleware</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="/dash/chatgpt/">ChatGPT Integration</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://plotly.com/customer-success/">Customer Success</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="/consulting-and-oem/">Professional Services</a></div></li></ul></div></div><div class="css-1297823"><div class="chakra-stack css-11nrrcx"><p class="chakra-text css-122asr0">DOCS</p><ul class="chakra-stack css-73k4dz"><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://dash.plotly.com/dash-enterprise">Dash Enterprise</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://dash.plotly.com/">Dash Open Source</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://plotly.com/graphing-libraries/">Graphing Libraries</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://community.plotly.com/">Community</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://plotly.com/examples/">Example apps</a></div></li></ul></div></div><div class="css-1297823"><div class="chakra-stack css-11nrrcx"><p class="chakra-text css-122asr0">Resources</p><ul class="chakra-stack css-73k4dz"><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://plotly.com/user-stories/">User Stories</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://plotly.com/events/">Events</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://plotly.com/resources/webinars/">Webinars</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://plotly.com/blog/">Blog</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://plotly.com/resources/">White Papers</a></div></li></ul></div></div><div class="css-1297823"><div class="chakra-stack css-11nrrcx"><p class="chakra-text css-122asr0">Solutions</p><ul class="chakra-stack css-73k4dz"><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://plotly.com/dash/databricks/">Databricks</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://plotly.com/dash/snowflake/">Snowflake</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://plotly.com/solutions/finance/">Financial Services</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://plotly.com/solutions/healthcare-life-sciences-pharma/">Healthcare & Life Sciences</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://plotly.com/solutions/energy/">Energy & Utilities</a></div></li></ul></div></div><div class="css-1297823"><div class="chakra-stack css-11nrrcx"><p class="chakra-text css-122asr0">COMPANY</p><ul class="chakra-stack css-73k4dz"><li class="css-1nkfmis"><div class="css-5cco2g"><a href="/about-us/">About Us</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="/careers/">Careers</a></div><style data-emotion="css vtlz5f">.css-vtlz5f{display:inline-block;padding-top:var(--chakra-space-1);padding-bottom:var(--chakra-space-1);-webkit-padding-start:var(--chakra-space-2);padding-inline-start:var(--chakra-space-2);-webkit-padding-end:var(--chakra-space-2);padding-inline-end:var(--chakra-space-2);background:rgb(122 118 255 / 20%);font-family:var(--chakra-fonts-body);color:var(--chakra-colors-accentPrimary);border:1px solid;border-color:var(--chakra-colors-accentPrimary);border-radius:5px;cursor:pointer;}@media screen and (min-width: 240px){.css-vtlz5f{font-size:5.5px;}}@media screen and (min-width: 960px){.css-vtlz5f{font-size:var(--chakra-fontSizes-4xs);}}</style><p class="chakra-text css-vtlz5f">WE ARE HIRING</p></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="/contact-us/">Contact Us</a></div></li><li class="css-1nkfmis"><div class="css-5cco2g"><a href="https://plotly.com/news/">Press & News</a></div></li></ul></div></div></div></div></div><style data-emotion="css 1cg5ubq">.css-1cg5ubq{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;gap:var(--chakra-space-10);position:relative;top:0px;font-size:var(--chakra-fontSizes-sm);}@media screen and (min-width: 960px){.css-1cg5ubq{top:-20px;}}</style><div class="chakra-stack css-1cg5ubq"><style data-emotion="css s45tpy">.css-s45tpy{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-start;-webkit-box-align:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:var(--chakra-space-5);color:var(--chakra-colors-bodyText);}@media screen and (min-width: 960px){.css-s45tpy{gap:68px;}}</style><div class="chakra-stack css-s45tpy"><style data-emotion="css 14lt884">.css-14lt884{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;gap:var(--chakra-space-1);}</style><div class="chakra-stack css-14lt884"><span class="chakra-text css-0"> © <!-- -->2024</span><div class="css-0">Plotly. All rights reserved.</div></div><style data-emotion="css 4g6ai3">.css-4g6ai3{cursor:pointer;}</style><div class="css-4g6ai3">Cookie Preferences</div><style data-emotion="css qtneuq">.css-qtneuq a:hover{border-color:var(--chakra-colors-accentPrimary);}</style><div class="css-qtneuq"><a href="/privacy/">Privacy</a></div></div></div></div></div></footer><style data-emotion="css 3a8qag">.css-3a8qag{margin-top:0px;width:100%;height:10px;background-image:linear-gradient(to left, var(--chakra-colors-gradientStart), var(--chakra-colors-gradientEndSecondary));}</style><div class="css-3a8qag"></div></div></div><span></span><span id="__chakra_env" hidden=""></span></div></body></html>