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)