- установив их в pandas.DataFrame, который используется для инициализацииstreamlit.dataframe
установив Column_config
Код установки
Код: Выделить всё
import pandas as pd
import numpy as np
from pydantic import BaseModel
import streamlit as st
from functools import partial
TYPE_TO_STREAMLIT = {"str": st.column_config.TextColumn,
'float': st.column_config.NumberColumn,
'int': partial(st.column_config.NumberColumn, format='%u.'),
'datetime64[D]': partial(st.column_config.DatetimeColumn, format='YYYY-MM-DD'),
'datetime64[s]': partial(st.column_config.DatetimeColumn, format='YYYY-MM-DD HH:mm:ss'),
}
def remove_optional(type_):
"""
>>> remove_optional(typing.Optional[str])
"""
match = re.search("Optional\[(?P[A-Z_a-z]+)\]", repr(type_))
if match:
return match.groupdict()['t']
elif 'date' in repr(type_):
return 'datetime64[s]' # pandas does not support [D]
elif type_ == str:
return 'str'
else:
return (type_)
def np_from_base_model(bm: BaseModel):
col_types = {kk: remove_optional(ff.annotation) for kk, ff in bm.model_fields.items()}
# list(col_types.values())
return np.empty(0, dtype=[tuple(tt) for tt in col_types.items()])
def df_from_base_model(bm: BaseModel):
return pd.DataFrame(np_from_base_model(bm))
def st_from_base_model(bm: BaseModel):
col_types = {kk: TYPE_TO_STREAMLIT[remove_optional(ff.annotation)](kk.replace('_', ' ')) for kk,ff in bm.model_fields.items()}
df_ = df_from_base_model(bm)
return st.dataframe(df_, column_config=col_types)
def format_metadata(report_metadatas: List[MyModel]) -> pd.DataFrame:
bm = MyModel
col_types = {kk: remove_optional(ff.annotation) for kk, ff in bm.model_fields.items()}
df_ = [md.model_dump() for md in report_metadatas]
df_ = pd.DataFrame(df_)
df_ = df_.astype(col_types)
return df_
Код: Выделить всё
import pandas as pd
import numpy as np
from pydantic import BaseModel
import streamlit as st
from functools import partial
from typing import Optional
class MyModel(BaseModel):
first: str
second: Optional[str]
date: datetime.datetime = datetime.datetime.today()
st.session_state['df_reports'] = st_from_base_model(ReportFrontPageTyped)
examples = [MyModel(**{"first":x, "second":chr(ord(x)+5) if ord(x)%3==0 else None}) for x in "hello world!"]
for ex in examples:
df_ = format_metadata([ex])
st.session_state['df_reports'].add_rows(df_)
time.sleep(2)
Код: Выделить всё
Unsupported operation. The data passed into add_rows() must have the same data signature as the original data.
In this case, add_rows() received ["unicode","unicode","unicode","unicode","unicode","unicode","unicode","unicode","unicode","unicode","datetime","unicode"] but was expecting ["empty","empty","empty","empty","empty","empty","empty","empty","empty","empty","datetime","empty"].
Код: Выделить всё
elementType 'alert' is not a valid arrowAddRows target!
Я пытаюсь понять, как данные представлены в потоке данных и где я могу увидеть текущие типы данных ( код кажется довольно неясным).
Подробнее здесь: https://stackoverflow.com/questions/789 ... lit-tables