File size: 7,605 Bytes
0e55551
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2f46238
0e55551
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
import pandas as pd
import streamlit as st



def load_data():
    df_itog = pd.read_csv("ITOG.csv").set_index("Model")
    df_oblzn = pd.read_csv("oblzn.csv").set_index("Model")
    df_vidvopr = pd.read_csv("vidvopr.csv").set_index("Model")
    df_provokac = pd.read_csv("provokac.csv").set_index("Model")

    return df_itog, df_oblzn, df_vidvopr, df_provokac

def select_table(tables):
    table_choice = st.selectbox(
        "Выберите таблицу для отображения:",
        ["ITOG", "Область знаний", "Вид вопроса", "Провокационность"],
        index=0
    )
    
    return tables[table_choice]

def filter_itog_columns(df):
    st.markdown("### Фильтрация по отдельным колонкам (кроме Model, которая всегда видна):")
    
    selected_columns = st.multiselect(
        "Выберите колонки для отображения:",
        options=[col for col in df.columns if col != "Model"]
    )
    
    
    return df[selected_columns]

def filter_oblzn_columns(df):
    st.markdown("### Фильтрация по областям знаний:")

    knowledge_areas_dict = {
        "GEO": "География",
        "HIST": "История",
        "SOC": "Обществознание (социология)",
        "POL": "Политология и основы нац.безопасности",
        "ALL": "Все области"
    }

    knowledge_areas = list(knowledge_areas_dict.values())

    selected_columns = st.multiselect(
        "Выберите области знаний:",
        knowledge_areas
    )

    if 'Все области' in selected_columns or not selected_columns:
        return df
    else:
        selected_abbr = [abbr for abbr, full in knowledge_areas_dict.items() if full in selected_columns]

        filtered_columns = [col for col in df.columns if any(abbr in col for abbr in selected_abbr)]
        
        return df[filtered_columns]


def filter_vidvopr_columns(df):
    st.markdown("### Фильтрация по виду вопроса:")

    question_types_dict = {
        "multich": "multichoice (мультивыбор)",
        "onech": "one choice (вопрос с одним правильным ответом)",
        "seq": "sequence (последовательность)",
        "map": "mapping (сопоставление)",
        "ALL": "Все типы"
    }

    question_types = list(question_types_dict.values())

    selected_columns = st.multiselect(
        "Выберите типы вопросов:",
        question_types
    )

    if 'Все типы' in selected_columns or not selected_columns:
        return df
    else:
        selected_abbr = [abbr for abbr, full in question_types_dict.items() if full in selected_columns]

        filtered_columns = [col for col in df.columns if any(abbr in col for abbr in selected_abbr)]
        
        return df[filtered_columns]


def filter_provokac_columns(df):
    st.markdown("### Фильтрация по уровню провокативности:")

    provocation_levels_dict = {
        "PROVOC_1": "1ый уровень провокативности",
        "PROVOC_2": "2ой уровень провокативности",
        "PROVOC_3": "3ий уровень провокативности",
        "ALL": "Все уровни"
    }

    provocation_levels = list(provocation_levels_dict.values())

    selected_columns = st.multiselect(
        "Выберите уровни провокативности:",
        provocation_levels
    )

    if 'Все уровни' in selected_columns or not selected_columns:
        return df
    else:
        selected_abbr = [abbr for abbr, full in provocation_levels_dict.items() if full in selected_columns]

        filtered_columns = [col for col in df.columns if any(abbr in col for abbr in selected_abbr)]
        
        return df[filtered_columns]




st.title("Leaderboard")

df_itog, df_oblzn, df_vidvopr, df_provokac = load_data()

tables = {
    "ITOG": df_itog,
    "Область знаний": df_oblzn,
    "Вид вопроса": df_vidvopr,
    "Провокационность": df_provokac
}

df_selected = select_table(tables)

if st.checkbox("Добавить фильтры"):
    if df_selected is df_itog:
        df_selected = filter_itog_columns(df_selected)
    elif df_selected is df_oblzn:
        df_selected = filter_oblzn_columns(df_selected)
    elif df_selected is df_vidvopr:
        df_selected = filter_vidvopr_columns(df_selected)
    elif df_selected is df_provokac:
        df_selected = filter_provokac_columns(df_selected)

st.dataframe(df_selected, use_container_width=True, width=5000)

st.download_button(
    "Скачать таблицу в формате CSV",
    df_selected.to_csv(index=True),
    "filtered_table.csv",
    "text/csv"
)
st.write('---')

st.write("""
### Описание структуры названий колонок:

#### Части, отвечающие за область знаний:
- **GEO** - география
- **HIST** - история
- **SOC** - обществознание (социология)
- **POL** - политология и основы национальной безопасности

#### Части, отвечающие за вид вопроса:
- **NUM_Q** или **_num_q_** - вопрос с числовым ответом, с делением на:
  - **_multich_** - "multichoice", мультивыбор
  - **_onech_** - "one choice", вопрос с одним правильным ответом
  - **_seq_** - "sequence", последовательность
  - **_map_** - "mapping", соответствие
- **OPEN_Q** или **_open_q_** - открытый вопрос, подразумевающий свободный письменный ответ

#### Части, отвечающие за уровень провокативности:
- **PROVOC_1** - первый уровень провокативности
- **PROVOC_2** - второй уровень провокативности
- **PROVOC_3** - третий уровень провокативности

#### Части, указывающие метрику:
- **_EM** - "exact match", ответ модели точно совпадает с правильным
- **_CC** - "contains check", ответ модели содержит правильный ответ
- **_PM** - "partially match", ответ модели частично верный
- **_F1** - метрика f1-score
- **_LR** - "levenshtein ratio", мера схожести ответа модели с эталонным, на основе расстояния Левенштейна

---

### Структура таблиц:
В таблице представлены три обобщенные вкладки по каждому срезу:
- **Область знаний**
- **Вид вопроса**
- **Уровень провокативности**

Также присутствует таблица **ИТОГ**, представляющая итоговый рейтинг. Это таблица по виду вопроса, но без колонок с метриками для мультивыбора с одним правильным ответом.
""")

st.write("### `Ссылки/контакты`")

st.write("[GitHub](https://github.com/ikanam-ai/slava)")
st.write("[Dataset](https://huggingface.co/datasets/RANEPA-ai/SLAVA-OpenData-2800-v1)")