0

我在 streamlit 中使用了简单的代码片段,它显示了由我拥有的 excel 组成的数据框。问题是在流光区域的过滤器列中加载数据需要太多时间。在那个过滤器区域中,我搜索材料名称,但加载并显示我要选择的数据甚至需要 30 秒。如何解决它并使其最快地选择数据?

代码是:

import streamlit as st
import pandas as pd

@st.cache
def load_data(nrows):
    df=pd.read_excel('materials.xlsx',nrows=nrows)
    return df

df=load_data(100000)

species = st.multiselect('SELECT THE MATERIAL', df['Name'])
new_df = df[(df['Name'].isin(species))]
st.write(new_df)

顺便说一下有20,000行的excel文件

并显示选择数据的速度太慢,看看这个:https ://streamable.com/kjis2

4

1 回答 1

3

最终,在不知道代码的哪一部分运行缓慢(以及实际加载了多少数据)的情况下,很难给出具体的建议。看起来您正在从电子表格中加载 100,000 行。这可能包含大量数据,尤其是在这些行本身很大的情况下。

一些事情要尝试:

  • 围绕代码块添加一些性能检测,以找出运行缓慢的内容。这可以像time.time()在一段代码之前和之后调用一样简单,并输出两个值之间的差异:
import contextlib
import time
import pandas as pd
import streamlit as st


@contextlib.contextmanager
def profile(name):
    start_time = time.time()
    yield  # <-- your code will execute here
    total_time = time.time() - start_time
    print("%s: %.4f ms" % (name, total_time * 1000.0))

with profile("load_data"):
    df = pd.read_excel('materials.xlsx',nrows=100000)

with profile("create_multiselect"):
    species = st.multiselect('SELECT THE MATERIAL', df['Name'])

with profile("filter_on_name"):
    new_df = df[(df['Name'].isin(species))]
  • @st.cache将注释更改为@st.cache(allow_output_mutation=True)。这将使 Streamlit 避免散列函数的输出(这是一个巨大的数据帧,可能需要一段时间才能散列)。
  • 是否可以一次加载更少的行?
  • 或者,您能否避免加载每一行中的所有数据?(例如,您需要“同义词”列吗?)pandas.read_excel采用一个usecols参数,可以限制哪些列被解析。
  • 如果您确实需要加载所有这些数据,您能否以允许更快过滤的方式存储它?例如,看起来 pandas 可以与 SQLite 交互。您能否在应用程序首次运行时将您的 excel 数据加载到 SQLite 数据库中,然后针对该数据库而不是针对 DataFrame 执行查询?
于 2020-01-29T23:45:22.333 回答