pandas 每次用户选择后,Streamlit应用程序速度太慢

6l7fqoea  于 2023-11-15  发布在  其他
关注(0)|答案(1)|浏览(198)

我是streamlit的新手。我正在通过阅读电子表格(~ 200万行)来创建一个web服务。
我创建了两个下拉选择使用列“PRODUCTID”,“PRODUCTNDC”从表中.然而,当用户选择的标识符从下拉,它是阅读一个字符串再次,这使得它非常慢.我如何才能提高这个服务的速度?
下面是代码:

#import libraries
import pandas as pd
import numpy as np
import openpyxl
import streamlit as st
from streamlit_extras.app_logo import add_logo

#page settings
st.set_page_config(page_title = 'FDA-NDC Code Service', layout="wide")
st.header('FDA-NDC Code Service')
#st.subheader('beta version')

#data reading & pre-processing
df = pd.read_excel(io='package.xlsx', engine='openpyxl', sheet_name= 'package')

#removing leading spaces and more than 1 space in column names
df = df[["PRODUCTID", "PRODUCTNDC", "NDCPACKAGECODE", "PACKAGEDESCRIPTION",  "STARTMARKETINGDATE", "ENDMARKETINGDATE", "NDC_EXCLUDE_FLAG", "SAMPLE_PACKAGE"]]
df['PRODUCTID'] = df['PRODUCTID'].str.strip()

product_list = list(df['PRODUCTID'].unique())

df6 = df.copy()

options_pid = df6['PRODUCTID'].unique().tolist()
selected_pid = st.sidebar.multiselect('Search product id',options_pid)

options_nid = df6['PRODUCTNDC'].unique().tolist()
selected_nid = st.sidebar.multiselect('Search product ndc',options_nid)

if selected_pid:
    df6 = df6[df6["PRODUCTID"].isin(selected_pid)]
    
elif selected_nid:
    df6 = df6[df6["PRODUCTNDC"].isin(selected_nid)]
    
else:
    st.markdown(
              f'<p class="header_title"> {str(df6.shape[0])} </p>',
              unsafe_allow_html=True,
          )

if selected_pid or selected_nid:
    st.dataframe(df6.reset_index(drop = True))
else:
    st.dataframe(df)

字符串
任何帮助都非常感谢。

rekjcdws

rekjcdws1#

使用Caching可以避免在每次重新加载页面时重新加载您的框架。
来自文件:
st.cache_data是缓存返回数据的计算的推荐方法:从CSV加载DataFrame,转换NumPy数组,查询API或任何其他返回可序列化数据对象(str,int,float,DataFrame,array,list,...)的函数。

@st.cache_data
def load_excel_sheet():
    return pd.read_excel(io='package.xlsx', engine='openpyxl', sheet_name='package')

df = load_excel_sheet()

字符串

备注:如果你喜欢每次加载文件,但增加速度,你应该转换你的excel文件为 parquet 文件与pyarrowdf.to_parquet.

我更喜欢parquet的解决方案,因为streamlit使用pickle来序列化对象。泛型是一个好主意,但对于一个嵌套框架,你可以使用一个更好的格式。使用parquet,你可以过滤你的嵌套框架,只在内存中加载你的嵌套框架的一个子集,这是一个很大的改进!

相关问题