دیتا ساینس، اینبار خوشگلتر!

Streamlit
Streamlit

توی این چند سال اخیر گرایش دانشجوهای کامپیوتر به سمت علم داده بیشتر شده و هر روز پیشرفت های چشم گیری تو این حوزه اتفاق میوفته. توی علم داده یکی از قسمت های مهم روش نشون دادن داده هاست. شاید شما بتونید به بهترین شکل داده هاتون رو جمع آوری کنید و تحلیل کنید؛ ولی اگر نتونید اون هارو به صورت بصری نشون کارفرما بدید قطعا با مشکل جدی مواجه خواهید شد.

Streamlit

اسم کتابخونه ای هست که بر روی پایتون قابل استفاده است، که باهاش میتونید در قالب یک وب اپلیکیشن داده هارو بصورت نمودار، جدول و ... نشون بدید. قسمت خیلی باحال این کتابخونه اینه که بصورت real-time به شما پاسخ میده؛ یعنی با هر تغییر در پارامتر ها نمودارها و جدول ها آپدیت میشن.

توی این پست قصد دارم بصورت خیلی جزیٔی این کتابخونه رو معرفی کنم.

کد و داده های اولیه اینجا هستن!


نصب و راه اندازی

اولش streamlit رو با pip ورژن دلخواهتون نصب کنید.

pip install streamlit

حالا یک فایل با فرمت py ایجاد کنید و داخل فایل سطر های زیر رو اضافه کنید و در آخر ذخیره کنید.

import streamlit as st

st.write('Hello World')

حالا وارد ترمینال دستگاهتون بشید و دستور زیر رو وارد کنید.

$ streamlit run hello_world.py

صفحه مرورگر پیشفرضتون باز میشه و یک صفحه با عبارت Hello World مشاهده می کنید.


پیاده سازی یک وب اپلیکیشن ساده

خب کتابخونه نصب شد و می تونیم با داده های واقعی تر کار کنیم. تو این آموزش من از یک فایل csv که حاوی اطلاعات 1000 فیلم محبوب از نظر IMDB و کتابخونه pandas استفاده می کنم. قراره یک اپلیکیشینی درست کنیم که با توجه به پارامتر هایی که کاربر میده ( تعداد سطر و ستون های انتخابی )، فایل csv رو نمایش بدیم و در انتها نمودار توزیع پراکندگی امتیازات این داده هارو رسم کنیم.

یک فایل پایتون به اسم imdb-data-visualize.py ایجاد میکنم.

مثل قسمت قبل باید streamlit رو وارد کنید.

import streamlit as st
import pandas as pd

حالا عنوان برنامه رو مشخص کنید.

st.title('1000 Popular Movies')

هربار که فایل رو سیو کنید و مرورگرتون رو رفرش کنید تغییرات رو مشاهده می کنید.

صفحه اول بعد از آپدیت عنوان
صفحه اول بعد از آپدیت عنوان

لازمه که داده های اولیه رو وارد کنیم.

data = pd.csv_read(''./IMDB-Movie-Data.csv",  index_col="Title")

استریم لیت ویجت هایی داره که با استفاده از اونها می تونید اکثر المنت های یک وبسایت رو با یک خط کد بالا بیارید.

ویجت اسلایدر :

با استفاده از این ابزار می تونید به کاربر اجازه بدید که یک عدد رو توی یک بازه مشخصه انتخاب کنه.

num_of_rows = st.sidebar.slider("Select number of rows you wish to load data", min_value=1, max_value=data.shape[0], value=20)

اگه به کد توجه کنید قسمت sidebar رو مشاهده می کنید. این خط رو وارد کنید و مرورگرتون رو رفرش کنید. یک ویجت اسلایدر میبینید که در سمت چپ صفحه داخل یک پنل قرار داره. حالا اینبار sidebar رو حذف کنید یعنی این خط بصورت زیر باشه :

num_of_rows = st.slider("Select number of rows you wish to load data", min_value=1, max_value=data.shape[0], value=20)

تو این حالت ویجت مورد نظر داخل صفحه اصلی قرار میگیره. ما با کد اول ادامه میدیم ولی اگه شما دوست دارید میتونید هرجا که خواستید sidebar رو حذف کنید.

ویجت انتخاب چندگانه (multiselect) :

با این ویجت می تونید به کاربر امکان انتخاب یک یا چند مورد مشخص رو بدید.

columns = st.sidebar.multiselect('Select desired columns(empty for all)', data.columns)

این عنصر رو هم مثل عنصر قبلی داخل sidebar قرار میدیم. پارامتر اول متنی هست که نمایش داده میشه و پارامتر دوم موارد قابل انتخاب ( بصورت یک لیست یا آرایه numpy ) است.

پانداز ( pandas ) فایل csv شما رو بصورت یک دیتافریم میخونه و ویژگی columns ستون های دیتاست شما رو بصورت یک لیست بر میگردونه.

حالا یک چکباس وارد می کنیم برای اینکه کاربر اگه بخواد تو صفحه اصلیش جدول رو با پارامتر هایی که خودش انتخاب کرده مشاهده کنه.

if st.sidebar.checkbox("View the table"):
    if len(columns)==0:   
        st.write(data.head(num_of_rows))
    else:
        st.write(data.head(num_of_rows)[columns])

ویجت چکباکس اگه انتخاب بشه مقدارTrue برمیگردونه و در غیر اینصورت False. در سطر بعدی مشخص میشه اگر کاربر هیچکدوم از ستون هارو انتخاب نکرده باشه ( لیستی که multiselect برگردونده بود خالی باشه ) streamlit به تعداد num_of_value از داده هاشو نشون بده در غیر اینصورت فقط ستون های انتخاب شده کاربر رو نشون بده.

خب؛ برای اینکه نشون بدیم توی این کتابخونه چطوری با نمودار ها کار کنیم. میخوایم هیستوگرام توزیع امتیازات فیلم هارو بر اساس تعداد داده های انتخابی کاربر نمایش بدیم.

پانداز ( pandas ) خودش از کتابخونه matplotlib برای رسم نمودار ها استفاده میکنه.
if st.sidebar.checkbox('View rating histogram'):
    st.write('## Ratings')
    data[['Rating']].head(num_of_rows).plot(kind='hist')
    st.pyplot()

تو این قسمت دوباره از یه چکباکس استفاده کردم که با انتخابش نمودار توزیع امتیازات فیلم هارو نشون میده.

حالا فایل رو ذخیره و مرورگرتون رو رفرش کنید تا نتیجه کار رو ببینید.

خروجی نهایی
خروجی نهایی

خب، این فقط یه بخش کوچیک از streamlit بود. امیدوارم که علاقه مند بشید و بیشتر ازش استفاده بکنید.

:)