| 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) |