limloop's picture
docker
f78fd27
import streamlit as st
from datetime import datetime
@st.cache_data
def get_search_mask(df, search_query):
return (
df['world'].str.contains(search_query, case=False, na=False) |
df['name'].str.contains(search_query, case=False, na=False) |
df['short_story'].str.contains(search_query, case=False, na=False) |
df['description'].str.contains(search_query, case=False, na=False) |
df['style'].str.contains(search_query, case=False, na=False) |
df['first_message'].str.contains(search_query, case=False, na=False)
)
@st.cache_data
def apply_filters(locale, df, search_query, absurdity_range, selected_mood, selected_tags):
"""Применение фильтров и сортировки"""
filtered_df = df[
(df['absurdity'] >= absurdity_range[0]) &
(df['absurdity'] <= absurdity_range[1])
]
if selected_mood != locale['filter_all']:
filtered_df = filtered_df[filtered_df['mood'] == selected_mood]
if selected_tags:
filtered_df = filtered_df[filtered_df['tags'].str.contains("|".join(selected_tags))]
if search_query:
mask = get_search_mask(df, search_query)
filtered_df = filtered_df[mask]
return filtered_df
@st.cache_data(ttl=120)
def apply_sort(locale, df, sort_option):
# Сортировка
sort_columns = {
locale['filter_sort'][0]: ("name", True),
locale['filter_sort'][1]: ("name", False),
locale['filter_sort'][2]: ("absurdity", True),
locale['filter_sort'][3]: ("absurdity", False),
locale['filter_sort'][4]: ("random", None)
}
col, asc = sort_columns[sort_option]
if col == "random":
return df.sample(frac=1, random_state=int(datetime.now().timestamp()))
else:
return df.sort_values(col, ascending=asc)