Movatterモバイル変換


[0]ホーム

URL:


Skip to content
DEV Community
Log in Create account

DEV Community

Cover image for Streamlit + DuckDB Tutorial
Mike Houngbadji
Mike Houngbadji

Posted on • Edited on • Originally published atMedium

     

Streamlit + DuckDB Tutorial

Streamlit + DuckDB Tutorial

The beautiful thing about learning is that nobody can take it away from you.
B.B King

Motivation

In this era of Everything Web, we are basically compelled to build web interfaces for our various application to ease the access, hence, bring value.

As a Python developer , we have a lot modules & framework that helps us build web interfaces.

This is whereStreamlit comes in, with it’s pythonic way of creating and web applications, it's the go to solution to build fast and with great ease web application.

We’ll useduckDB for it’s built-in OLAP capabilities and easy usage (the databases is a file, no complex infrastructure needed).

In this tutorial, you’ll learn how to build web apps usingStreamlit and usingduckDB as your database.

Table of content

What is Streamlit ?

Streamlit turns data scripts into shareable web apps in minutes.

All in pure Python. No front‑end experience required.

With Streamlit, we can easily create using python ONLY dynamic web application. It’s ideal for data apps as it natively has built-in function to present data in different ways (tables, charts, etc.).

You can read morehere

What is duckDB ?

DuckDB is an in-process SQL OLAP database management system.

It is serverless comes with great features like (Direct Parquet & CSV querying, Vectorized Engine, Parallel query Processing). It is an alternative to SQLite purposely built for Analytics workload.

You can read morehere.

Code

The full code can be access below.

https://github.com/mikekenneth/streamlit_duckdb

Data Generator

The below generates a1000 rows data and loads toorders table induck.db when thebutton is clicked:

fromgenerate_dataimportgenerate_dataset_orders,load_filebutton=st.button(label="Generate or Refresh Data")ifbutton:db="duck.db"destination_table_name="orders"filename="orders.csv"generate_dataset_orders(filename=filename,num_rows=1000)load_file(db=db,infile_path=filename,table_name=destination_table_name)
Enter fullscreen modeExit fullscreen mode

Screenshot

Generate Data

I wrote a little helper to easily generate the orders data and load intoduckDB. The code can be accessedhere.

Extract data from DuckDB

I created a functionexecute_query to easily get the data using only the desired SQL query. It also allows specifying the type of output needed. You can read more in the officialdocumentation.

defexecute_query(query:str,return_type:str="df"):withduckdb.connect("duck.db",read_only=True)ascon:ifreturn_type=="df":returncon.execute(query).df()elifreturn_type=="arrow":returncon.execute(query).arrow()elifreturn_type=="list":returncon.execute(query).fetchall()destination_table_name="orders"data=execute_query(f"select * from{destination_table_name}",return_type="df")
Enter fullscreen modeExit fullscreen mode

Display a sample of the data

WithStreamlit we can easily display aDataframe like a table. You can read morehere.

st.write("## Sample")st.dataframe(data.head(10),height=300)
Enter fullscreen modeExit fullscreen mode

Screenshot

Display Sample Data

Visualization

Streamlit allow us to easily display charts. We will use it to display some bar charts. You can read morehere.

st.write("## Visualization")option=st.selectbox("Select a dimension",["product_name","customer_name","status"],key="option")ifoption:st.write(f"### Bar Chart:{option} x Quantity")st.bar_chart(data,x=option,y="quantity")st.write(f"### Bar Chart:{option} x Amount")st.bar_chart(data,x=option,y="amount")st.write(f"### Bar Chart:{option} x Count")st.bar_chart(data[option].value_counts())
Enter fullscreen modeExit fullscreen mode

Screenshot

Visualization

Filtering Data

We can alsofilter out data directly from the web using the below. You can read morehere.

st.write("## Filters (by Products Name)")products_list=[row[0]forrowinexecute_query(f"select distinct(product_name) from{destination_table_name}",db=db,return_type="list")]product_filter=st.selectbox(label="Select a Product",options=products_list,key="product_filter")ifproduct_filter!="--":result=execute_query(f"select * from{destination_table_name} where product_name ='{product_filter}'",db=db,return_type="df",)st.dataframe(result,height=400)
Enter fullscreen modeExit fullscreen mode

Screenshot

Filtering Data

Download / Exporting Data

We can export data to csv using the Streamlitst.download_button function.

@st.experimental_memo# An optimization wrapper to memoize the result of the functiondefexport_df(df):returndf.to_csv(index=False).encode("utf-8")st.write("### Download Data")st.download_button(label="Press to Download",data=export_df(result),file_name=f"orders - product='{product_filter}'.csv",mime="text/csv",key="download-csv",)
Enter fullscreen modeExit fullscreen mode

Screenshot

Download / Export Data

That is a wrap. I hope this helps you. 🙂

About Me

I am a Data Engineer with 2+ years of experience and more years as a Software Engineer (5+ years). I enjoy learning and teaching (mostly learning 😎).

You can get in touch with me byemail,Twitter &LinkedIn.

Top comments(0)

Subscribe
pic
Create template

Templates let you quickly answer FAQs or store snippets for re-use.

Dismiss

Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment'spermalink.

For further actions, you may consider blocking this person and/orreporting abuse

Hi, just a problem solver, I use mainly Python. Working in Data Engineering & Analytics, though still connected to the web/apps dev community.
  • Location
    World
  • Joined

Trending onDEV CommunityHot

DEV Community

We're a place where coders share, stay up-to-date and grow their careers.

Log in Create account

[8]ページ先頭

©2009-2025 Movatter.jp