我是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)
字符串
任何帮助都非常感谢。
1条答案
按热度按时间rekjcdws1#
使用Caching可以避免在每次重新加载页面时重新加载您的框架。
来自文件:
st.cache_data
是缓存返回数据的计算的推荐方法:从CSV加载DataFrame,转换NumPy数组,查询API或任何其他返回可序列化数据对象(str,int,float,DataFrame,array,list,...)的函数。字符串
备注:如果你喜欢每次加载文件,但增加速度,你应该转换你的excel文件为 parquet 文件与
pyarrow
和df.to_parquet
.我更喜欢
parquet
的解决方案,因为streamlit
使用pickle
来序列化对象。泛型是一个好主意,但对于一个嵌套框架,你可以使用一个更好的格式。使用parquet
,你可以过滤你的嵌套框架,只在内存中加载你的嵌套框架的一个子集,这是一个很大的改进!