app.css CHANGED
@@ -15,6 +15,10 @@ div.files-container {
15
  max-height: 350px;
16
  }
17
 
 
 
 
 
18
  .dataframe div.table-wrap {
19
  height: auto !important;
20
  }
 
15
  max-height: 350px;
16
  }
17
 
18
+ div.files-container:hover label[data-testid="block-label"] {
19
+ display: none;
20
+ }
21
+
22
  .dataframe div.table-wrap {
23
  height: auto !important;
24
  }
app/app.py ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ File: app.py
3
+ Author: Elena Ryumina and Dmitry Ryumin
4
+ Description: About the app.
5
+ License: MIT License
6
+ """
7
+
8
+ APP = """
9
+ <div>
10
+ <div style="max-width: 90%; margin: auto; padding: 20px;">
11
+ <p style="text-align: center;">
12
+ <img src="https://raw.githubusercontent.com/aimclub/OCEANAI/main/docs/source/_static/logo.svg" alt="Logo" style="width: 20%; height: auto; display: block; margin: auto;">
13
+ </p>
14
+
15
+ <blockquote>
16
+ <a href="https://oceanai.readthedocs.io/en/latest/">OCEAN-AI</a> is an open-source library consisting of a set of algorithms for intellectual analysis of human behavior based on multimodal data for automatic personality traits (PT) assessment. The library evaluates five PT: <strong>O</strong>penness to experience, <strong>C</strong>onscientiousness, <strong>E</strong>xtraversion, <strong>A</strong>greeableness, Non-<strong>N</strong>euroticism.
17
+ </blockquote>
18
+
19
+ <p style="text-align: center;">
20
+ <img src="https://raw.githubusercontent.com/aimclub/OCEANAI/main/docs/source/_static/Pipeline_OCEANAI.en.svg" alt="Pipeline" style="max-width: 60%; height: auto; display: block; margin: auto;">
21
+ </p>
22
+
23
+ <hr>
24
+
25
+ <h2>OCEAN-AI includes three main algorithms:</h2>
26
+ <ol>
27
+ <li>Audio Information Analysis Algorithm (AIA).</li>
28
+ <li>Video Information Analysis Algorithm (VIA).</li>
29
+ <li>Text Information Analysis Algorithm (TIA).</li>
30
+ <li>Multimodal Information Fusion Algorithm (MIF).</li>
31
+ </ol>
32
+
33
+ <p>The AIA, VIA and TIA algorithms implement the functions of strong artificial intelligence (AI) in terms of complexing acoustic, visual and linguistic features built on different principles (hand-crafted and deep features), i.e. these algorithms implement the approaches of composite (hybrid) AI. The necessary pre-processing of audio, video and text information, the calculation of visual, acoustic and linguistic features and the output of predictions of personality traits based on them are carried out in the algorithms.</p>
34
+
35
+ <p>The MIF algorithm is a combination of three information analysis algorithms (AIA, VIA and TIA). This algorithm performs feature-level fusion obtained by the AIA, VIA and TIA algorithms.</p>
36
+
37
+ <p>In addition to the main task - unimodal and multimodal personality traits assessment, the features implemented in <a href="https://oceanai.readthedocs.io/en/latest/">OCEAN-AI</a> will allow researchers to solve other problems of analyzing human behavior, for example, affective state recognition.</p>
38
+
39
+ <p>The library solves practical tasks:</p>
40
+ <ol>
41
+ <li><a href="https://oceanai.readthedocs.io/en/latest/user_guide/notebooks/Pipeline_practical_task_1.html">Ranking of potential candidates by professional responsibilities</a>.</li>
42
+ <li><a href="https://oceanai.readthedocs.io/en/latest/user_guide/notebooks/Pipeline_practical_task_2.html">Predicting consumer preferences for industrial goods</a>.</li>
43
+ <li><a href="https://oceanai.readthedocs.io/ru/latest/user_guide/notebooks/Pipeline_practical_task_3.html">Forming effective work teams</a>.</li>
44
+ </ol>
45
+
46
+ <p><a href="https://oceanai.readthedocs.io/en/latest/">OCEAN-AI</a> uses the latest open-source libraries for audio, video and text processing: <a href="https://librosa.org/">librosa</a>, <a href="https://audeering.github.io/opensmile-python/">openSMILE</a>, <a href="https://pypi.org/project/opencv-python/">openCV</a>, <a href="https://google.github.io/mediapipe/getting_started/python">mediapipe</a>, <a href="https://pypi.org/project/transformers">transformers</a>.</p>
47
+
48
+ <p><a href="https://oceanai.readthedocs.io/en/latest/">OCEAN-AI</a> is written in the <a href="https://www.python.org/">python programming language</a>. Neural network models are implemented and trained using an open-source library code <a href="https://www.tensorflow.org/">TensorFlow</a>.</p>
49
+
50
+ <hr>
51
+
52
+ <h2>Research data</h2>
53
+
54
+ <p>The <a href="https://oceanai.readthedocs.io/en/latest/">OCEAN-AI</a> library was tested on two corpora:</p>
55
+
56
+ <ol>
57
+ <li>The publicly available and large-scale <a href="https://chalearnlap.cvc.uab.cat/dataset/24/description/">First Impressions V2 corpus</a>.</li>
58
+ <li>On the first publicly available Russian-language <a href="https://hci.nw.ru/en/pages/mupta-corpus">Multimodal Personality Traits Assessment (MuPTA) corpus</a>.</li>
59
+ </ol>
60
+
61
+ <hr>
62
+
63
+ <h2>Publications</h2>
64
+
65
+ <h3>Journals</h3>
66
+ <pre>
67
+ <code>
68
+ @article{ryumina22_neurocomputing,
69
+ author = {Elena Ryumina and Denis Dresvyanskiy and Alexey Karpov},
70
+ title = {In Search of a Robust Facial Expressions Recognition Model: A Large-Scale Visual Cross-Corpus Study},
71
+ journal = {Neurocomputing},
72
+ volume = {514},
73
+ pages = {435-450},
74
+ year = {2022},
75
+ doi = {<a href="https://doi.org/10.1016/j.neucom.2022.10.013">https://doi.org/10.1016/j.neucom.2022.10.013</a>},
76
+ }
77
+
78
+ @article{ryumina24_eswa,
79
+ author = {Elena Ryumina and Maxim Markitantov and Dmitry Ryumin and Alexey Karpov},
80
+ title = {OCEAN-AI Framework with EmoFormer Cross-Hemiface Attention Approach for Personality Traits Assessment},
81
+ journal = {Expert Systems with Applications},
82
+ volume = {239},
83
+ pages = {122441},
84
+ year = {2024},
85
+ doi = {<a href="https://doi.org/10.1016/j.eswa.2023.122441">https://doi.org/10.1016/j.eswa.2023.122441</a>},
86
+ }
87
+ </code>
88
+ </pre>
89
+
90
+ <h3>Conferences</h3>
91
+ <pre>
92
+ <code>
93
+ @inproceedings{ryumina23_interspeech,
94
+ author = {Elena Ryumina and Dmitry Ryumin and Maxim Markitantov and Heysem Kaya and Alexey Karpov},
95
+ title = {Multimodal Personality Traits Assessment (MuPTA) Corpus: The Impact of Spontaneous and Read Speech},
96
+ year = {2023},
97
+ booktitle = {INTERSPEECH},
98
+ pages = {4049--4053},
99
+ doi = {<a href="https://doi.org/10.21437/Interspeech.2023-1686">https://doi.org/10.21437/Interspeech.2023-1686</a>},
100
+ }
101
+ </code>
102
+ </pre>
103
+ </div>
104
+ </div>
105
+ """
app/authors.py CHANGED
@@ -6,5 +6,58 @@ License: MIT License
6
  """
7
 
8
  AUTHORS = """
9
- Authors: [Elena Ryumina](https://github.com/ElenaRyumina), [Dmitry Ryumin](https://github.com/DmitryRyumin)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  """
 
6
  """
7
 
8
  AUTHORS = """
9
+ <div style="display: flex; justify-content: center;">
10
+ <div style="flex-basis: 40%;">
11
+ <a href="https://github.com/ElenaRyumina">
12
+ <img src="https://readme-typing-svg.demolab.com?font=Roboto&duration=1500&pause=100&color=3081F7&vCenter=true&multiline=true&width=435&height=70&lines=Elena+Ryumina;Artificial+Intelligence+Researcher" alt="ElenaRyumina" />
13
+ </a>
14
+ <div style="display: flex; margin-bottom: 6px;">
15
+ <a href="https://www.scopus.com/authid/detail.uri?authorId=57220572427">
16
+ <img src="https://img.shields.io/badge/Scopus-%23E9711C.svg?&style=flat-square&logo=scopus&logoColor=white" alt="" style="margin-right: 6px;" />
17
+ </a>
18
+ <a href="https://scholar.google.com/citations?user=DOBkQssAAAAJ">
19
+ <img src="https://img.shields.io/badge/Google%20Scholar-%234285F4.svg?&style=flat-square&logo=google-scholar&logoColor=white" alt="" style="margin-right: 6px;" />
20
+ </a>
21
+ <a href="https://orcid.org/0000-0002-4135-6949">
22
+ <img src="https://img.shields.io/badge/ORCID-0000--0002--4135--6949-green.svg?&style=flat-square&logo=orcid&logoColor=white" alt="" />
23
+ </a>
24
+ </div>
25
+ <a href="https://github.com/ElenaRyumina" style="display: inline-block;">
26
+ <img src="https://github-stats-alpha.vercel.app/api?username=ElenaRyumina&cc=3081F7&tc=FFFFFF&ic=FFFFFF&bc=FFFFFF" alt="" />
27
+ </a>
28
+ <div style="display: flex;">
29
+ <img src="https://komarev.com/ghpvc/?username=ElenaRyumina&style=flat-square" alt="" />
30
+ </div>
31
+ </div>
32
+
33
+ <div style="flex-basis: 40%;">
34
+ <a href="https://github.com/DmitryRyumin">
35
+ <img src="https://readme-typing-svg.demolab.com?font=Roboto&duration=1500&pause=100&color=3081F7&vCenter=true&multiline=true&width=435&height=70&lines=Dr.+Dmitry+Ryumin;Artificial+Intelligence+Researcher" alt="DmitryRyumin" />
36
+ </a>
37
+ <div style="display: flex; margin-bottom: 6px;">
38
+ <a href="https://dmitryryumin.github.io">
39
+ <img src="https://img.shields.io/badge/Website-blue??&style=flat-square&logo=opsgenie&logoColor=white" alt="" style="margin-right: 6px;" />
40
+ </a>
41
+ <a href="https://www.scopus.com/authid/detail.uri?authorId=57191960214">
42
+ <img src="https://img.shields.io/badge/Scopus-%23E9711C.svg?&style=flat-square&logo=scopus&logoColor=white" alt="" style="margin-right: 6px;" />
43
+ </a>
44
+ <a href="https://scholar.google.com/citations?user=LrTIp5IAAAAJ">
45
+ <img src="https://img.shields.io/badge/Google%20Scholar-%234285F4.svg?&style=flat-square&logo=google-scholar&logoColor=white" alt="" style="margin-right: 6px;" />
46
+ </a>
47
+ <a href="https://orcid.org/0000-0002-7935-0569">
48
+ <img src="https://img.shields.io/badge/ORCID-0000--0002--7935--0569-green.svg?&style=flat-square&logo=orcid&logoColor=white" alt="" style="margin-right: 6px;" />
49
+ </a>
50
+ <a href="mailto:[email protected]">
51
+ <img src="https://img.shields.io/badge/-Email-red?style=flat-square&logo=gmail&logoColor=white" alt="" />
52
+ </a>
53
+ </div>
54
+ <a href="https://github.com/DmitryRyumin" style="display: inline-block;">
55
+ <img src="https://github-stats-alpha.vercel.app/api?username=DmitryRyumin&cc=3081F7&tc=FFFFFF&ic=FFFFFF&bc=FFFFFF" alt="" />
56
+ </a>
57
+ <div style="display: flex;">
58
+ <img src="https://custom-icon-badges.demolab.com/badge/dynamic/json?style=flat-square&logo=fire&logoColor=fff&color=orange&label=GitHub%20streak&query=%24.currentStreak.length&suffix=%20days&url=https%3A%2F%2Fstreak-stats.demolab.com%2F%3Fuser%3Ddmitryryumin%26type%3Djson" alt="" style="margin-right: 6px;" />
59
+ <img src="https://komarev.com/ghpvc/?username=DmitryRyumin&style=flat-square" alt="" />
60
+ </div>
61
+ </div>
62
+ </div>
63
  """
app/components.py CHANGED
@@ -154,8 +154,8 @@ def number_create_ui(
154
  def dropdown_create_ui(
155
  label: Optional[str] = None,
156
  info: Optional[str] = None,
157
- choices: List = [],
158
- value: List = [],
159
  multiselect: bool = False,
160
  show_label: bool = True,
161
  interactive: bool = True,
 
154
  def dropdown_create_ui(
155
  label: Optional[str] = None,
156
  info: Optional[str] = None,
157
+ choices: Optional[List[str]] = None,
158
+ value: Optional[List[str]] = None,
159
  multiselect: bool = False,
160
  show_label: bool = True,
161
  interactive: bool = True,
app/description_steps.py ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ File: description.py
3
+ Author: Dmitry Ryumin
4
+ Description: Project description for the Gradio app.
5
+ License: MIT License
6
+ """
7
+
8
+ # Importing necessary components for the Gradio app
9
+ from app.config import config_data
10
+
11
+ STEP_1 = f"""\
12
+ <h2 align="center">{config_data.InformationMessages_STEP_1}</h2>
13
+ """
14
+
15
+ STEP_2 = f"""\
16
+ <h2 align="center">{config_data.InformationMessages_STEP_2}</h2>
17
+ """
app/event_handlers/calculate_practical_tasks.py CHANGED
@@ -7,46 +7,28 @@ License: MIT License
7
 
8
  from app.oceanai_init import b5
9
  import gradio as gr
10
- import pandas as pd
11
  from pathlib import Path
12
 
13
  # Importing necessary components for the Gradio app
14
  from app.config import config_data
 
 
 
 
 
15
  from app.components import html_message, dataframe, files_create_ui, video_create_ui
16
 
17
 
18
- def read_csv_file(file_path, drop_id=False):
19
- df = pd.read_csv(file_path)
20
-
21
- if drop_id:
22
- df = pd.DataFrame(df.drop(["ID"], axis=1))
23
-
24
- df.index.name = "ID"
25
- df.index += 1
26
- df.index = df.index.map(str)
27
-
28
- return df
29
 
30
 
31
- def apply_rounding_and_rename_columns(df):
32
- df_rounded = df.rename(
33
- columns={
34
- "Openness": "OPE",
35
- "Conscientiousness": "CON",
36
- "Extraversion": "EXT",
37
- "Agreeableness": "AGR",
38
- "Non-Neuroticism": "NNEU",
39
- }
40
- )
41
- columns_to_round = df_rounded.columns[1:]
42
- df_rounded[columns_to_round] = df_rounded[columns_to_round].apply(
43
- lambda x: [round(i, 3) for i in x]
44
  )
45
- return df_rounded
46
-
47
-
48
- def colleague_type(subtask):
49
- return "minor" if "junior" in subtask.lower() else "major"
50
 
51
 
52
  def event_handler_calculate_practical_task_blocks(
@@ -61,18 +43,107 @@ def event_handler_calculate_practical_task_blocks(
61
  target_score_agr,
62
  target_score_nneu,
63
  equal_coefficient,
 
 
 
 
 
 
 
 
64
  ):
65
- if practical_subtasks.lower() == "professional skills":
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  df_professional_skills = read_csv_file(config_data.Links_PROFESSIONAL_SKILLS)
67
 
68
  b5._priority_skill_calculation(
69
  df_files=pt_scores.iloc[:, 1:],
70
  correlation_coefficients=df_professional_skills,
71
  threshold=threshold_professional_skills,
72
- out=True,
73
  )
74
 
75
- # Optional
76
  df = apply_rounding_and_rename_columns(b5.df_files_priority_skill_)
77
 
78
  professional_skills_list = (
@@ -81,15 +152,10 @@ def event_handler_calculate_practical_task_blocks(
81
 
82
  professional_skills_list.remove(dropdown_professional_skills)
83
 
84
- professional_skills_list = [
85
- "OPE",
86
- "CON",
87
- "EXT",
88
- "AGR",
89
- "NNEU",
90
- ] + professional_skills_list
91
-
92
- df_hidden = df.drop(columns=professional_skills_list)
93
 
94
  df_hidden.to_csv(config_data.Filenames_PT_SKILLS_SCORES)
95
 
@@ -131,7 +197,9 @@ def event_handler_calculate_practical_task_blocks(
131
  practical_subtasks.lower() == "finding a suitable junior colleague"
132
  or practical_subtasks.lower() == "finding a suitable senior colleague"
133
  ):
134
- df_correlation_coefficients = read_csv_file(config_data.Links_FINDING_COLLEAGUE)
 
 
135
 
136
  b5._colleague_ranking(
137
  df_files=pt_scores.iloc[:, 1:],
@@ -148,18 +216,9 @@ def event_handler_calculate_practical_task_blocks(
148
  out=False,
149
  )
150
 
151
- # Optional
152
- df = df = apply_rounding_and_rename_columns(b5.df_files_colleague_)
153
 
154
- professional_skills_list = [
155
- "OPE",
156
- "CON",
157
- "EXT",
158
- "AGR",
159
- "NNEU",
160
- ]
161
-
162
- df_hidden = df.drop(columns=professional_skills_list)
163
 
164
  df_hidden.to_csv(
165
  colleague_type(practical_subtasks) + config_data.Filenames_COLLEAGUE_RANKING
@@ -196,6 +255,75 @@ def event_handler_calculate_practical_task_blocks(
196
  ),
197
  html_message(config_data.InformationMessages_NOTI_IN_DEV, False, False),
198
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
199
  else:
200
  gr.Info(config_data.InformationMessages_NOTI_IN_DEV)
201
 
 
7
 
8
  from app.oceanai_init import b5
9
  import gradio as gr
 
10
  from pathlib import Path
11
 
12
  # Importing necessary components for the Gradio app
13
  from app.config import config_data
14
+ from app.utils import (
15
+ read_csv_file,
16
+ apply_rounding_and_rename_columns,
17
+ preprocess_scores_df,
18
+ )
19
  from app.components import html_message, dataframe, files_create_ui, video_create_ui
20
 
21
 
22
+ def colleague_type(subtask):
23
+ return "minor" if "junior" in subtask.lower() else "major"
 
 
 
 
 
 
 
 
 
24
 
25
 
26
+ def consumer_preferences(subtask):
27
+ return (
28
+ config_data.Filenames_CAR_CHARACTERISTICS
29
+ if "mobile device" in subtask.lower()
30
+ else config_data.Filenames_MDA_CATEGORIES
 
 
 
 
 
 
 
 
31
  )
 
 
 
 
 
32
 
33
 
34
  def event_handler_calculate_practical_task_blocks(
 
43
  target_score_agr,
44
  target_score_nneu,
45
  equal_coefficient,
46
+ number_priority,
47
+ number_importance_traits,
48
+ threshold_consumer_preferences,
49
+ number_openness,
50
+ number_conscientiousness,
51
+ number_extraversion,
52
+ number_agreeableness,
53
+ number_non_neuroticism,
54
  ):
55
+ if practical_subtasks.lower() == "professional groups":
56
+ sum_weights = sum(
57
+ [
58
+ number_openness,
59
+ number_conscientiousness,
60
+ number_extraversion,
61
+ number_agreeableness,
62
+ number_non_neuroticism,
63
+ ]
64
+ )
65
+
66
+ if sum_weights != 100:
67
+ gr.Warning(config_data.InformationMessages_SUM_WEIGHTS.format(sum_weights))
68
+
69
+ return (
70
+ gr.Row(visible=False),
71
+ gr.Column(visible=False),
72
+ dataframe(visible=False),
73
+ files_create_ui(
74
+ None,
75
+ "single",
76
+ [".csv"],
77
+ config_data.OtherMessages_EXPORT_PS,
78
+ True,
79
+ False,
80
+ False,
81
+ "csv-container",
82
+ ),
83
+ video_create_ui(visible=False),
84
+ html_message(
85
+ config_data.InformationMessages_SUM_WEIGHTS.format(sum_weights),
86
+ False,
87
+ True,
88
+ ),
89
+ )
90
+ else:
91
+ b5._candidate_ranking(
92
+ df_files=pt_scores.iloc[:, 1:],
93
+ weigths_openness=number_openness,
94
+ weigths_conscientiousness=number_conscientiousness,
95
+ weigths_extraversion=number_extraversion,
96
+ weigths_agreeableness=number_agreeableness,
97
+ weigths_non_neuroticism=number_non_neuroticism,
98
+ out=False,
99
+ )
100
+
101
+ df = apply_rounding_and_rename_columns(b5.df_files_ranking_)
102
+
103
+ df_hidden = df.drop(columns=config_data.Settings_SHORT_PROFESSIONAL_SKILLS)
104
+
105
+ df_hidden.to_csv(config_data.Filenames_POTENTIAL_CANDIDATES)
106
+
107
+ df_hidden.reset_index(inplace=True)
108
+
109
+ person_id = int(df_hidden.iloc[0]["Person ID"]) - 1
110
+
111
+ return (
112
+ gr.Row(visible=True),
113
+ gr.Column(visible=True),
114
+ dataframe(
115
+ headers=df_hidden.columns.tolist(),
116
+ values=df_hidden.values.tolist(),
117
+ visible=True,
118
+ ),
119
+ files_create_ui(
120
+ config_data.Filenames_POTENTIAL_CANDIDATES,
121
+ "single",
122
+ [".csv"],
123
+ config_data.OtherMessages_EXPORT_PG,
124
+ True,
125
+ False,
126
+ True,
127
+ "csv-container",
128
+ ),
129
+ video_create_ui(
130
+ value=files[person_id],
131
+ file_name=Path(files[person_id]).name,
132
+ label="Best Person ID - " + str(person_id + 1),
133
+ visible=True,
134
+ ),
135
+ html_message(config_data.InformationMessages_NOTI_IN_DEV, False, False),
136
+ )
137
+ elif practical_subtasks.lower() == "professional skills":
138
  df_professional_skills = read_csv_file(config_data.Links_PROFESSIONAL_SKILLS)
139
 
140
  b5._priority_skill_calculation(
141
  df_files=pt_scores.iloc[:, 1:],
142
  correlation_coefficients=df_professional_skills,
143
  threshold=threshold_professional_skills,
144
+ out=False,
145
  )
146
 
 
147
  df = apply_rounding_and_rename_columns(b5.df_files_priority_skill_)
148
 
149
  professional_skills_list = (
 
152
 
153
  professional_skills_list.remove(dropdown_professional_skills)
154
 
155
+ df_hidden = df.drop(
156
+ columns=config_data.Settings_SHORT_PROFESSIONAL_SKILLS
157
+ + professional_skills_list
158
+ )
 
 
 
 
 
159
 
160
  df_hidden.to_csv(config_data.Filenames_PT_SKILLS_SCORES)
161
 
 
197
  practical_subtasks.lower() == "finding a suitable junior colleague"
198
  or practical_subtasks.lower() == "finding a suitable senior colleague"
199
  ):
200
+ df_correlation_coefficients = read_csv_file(
201
+ config_data.Links_FINDING_COLLEAGUE, ["ID"]
202
+ )
203
 
204
  b5._colleague_ranking(
205
  df_files=pt_scores.iloc[:, 1:],
 
216
  out=False,
217
  )
218
 
219
+ df = apply_rounding_and_rename_columns(b5.df_files_colleague_)
 
220
 
221
+ df_hidden = df.drop(columns=config_data.Settings_SHORT_PROFESSIONAL_SKILLS)
 
 
 
 
 
 
 
 
222
 
223
  df_hidden.to_csv(
224
  colleague_type(practical_subtasks) + config_data.Filenames_COLLEAGUE_RANKING
 
255
  ),
256
  html_message(config_data.InformationMessages_NOTI_IN_DEV, False, False),
257
  )
258
+ elif (
259
+ practical_subtasks.lower() == "car characteristics"
260
+ or practical_subtasks.lower() == "mobile device application categories"
261
+ ):
262
+ if practical_subtasks.lower() == "car characteristics":
263
+ df_correlation_coefficients = read_csv_file(
264
+ config_data.Links_CAR_CHARACTERISTICS,
265
+ ["Style and performance", "Safety and practicality"],
266
+ )
267
+ if practical_subtasks.lower() == "mobile device application categories":
268
+ df_correlation_coefficients = read_csv_file(
269
+ config_data.Links_MDA_CATEGORIES
270
+ )
271
+
272
+ pt_scores_copy = pt_scores.iloc[:, 1:].copy()
273
+
274
+ preprocess_scores_df(pt_scores_copy, "Person ID")
275
+
276
+ b5._priority_calculation(
277
+ df_files=pt_scores_copy,
278
+ correlation_coefficients=df_correlation_coefficients,
279
+ col_name_ocean="Trait",
280
+ threshold=threshold_consumer_preferences,
281
+ number_priority=number_priority,
282
+ number_importance_traits=number_importance_traits,
283
+ out=False,
284
+ )
285
+
286
+ df_files_priority = b5.df_files_priority_.copy()
287
+ df_files_priority.reset_index(inplace=True)
288
+
289
+ df = apply_rounding_and_rename_columns(df_files_priority.iloc[:, 1:])
290
+
291
+ preprocess_scores_df(df, "Person ID")
292
+
293
+ df_hidden = df.drop(columns=config_data.Settings_SHORT_PROFESSIONAL_SKILLS)
294
+
295
+ df_hidden.to_csv(consumer_preferences(practical_subtasks))
296
+
297
+ df_hidden.reset_index(inplace=True)
298
+
299
+ person_id = int(df_hidden.iloc[0]["Person ID"]) - 1
300
+
301
+ return (
302
+ gr.Row(visible=True),
303
+ gr.Column(visible=True),
304
+ dataframe(
305
+ headers=df_hidden.columns.tolist(),
306
+ values=df_hidden.values.tolist(),
307
+ visible=True,
308
+ ),
309
+ files_create_ui(
310
+ consumer_preferences(practical_subtasks),
311
+ "single",
312
+ [".csv"],
313
+ config_data.OtherMessages_EXPORT_CP,
314
+ True,
315
+ False,
316
+ True,
317
+ "csv-container",
318
+ ),
319
+ video_create_ui(
320
+ value=files[person_id],
321
+ file_name=Path(files[person_id]).name,
322
+ label="Best Person ID - " + str(person_id + 1),
323
+ visible=True,
324
+ ),
325
+ html_message(config_data.InformationMessages_NOTI_IN_DEV, False, False),
326
+ )
327
  else:
328
  gr.Info(config_data.InformationMessages_NOTI_IN_DEV)
329
 
app/event_handlers/calculate_pt_scores_blocks.py CHANGED
@@ -10,6 +10,8 @@ import gradio as gr
10
  # Importing necessary components for the Gradio app
11
  from app.oceanai_init import b5
12
  from app.config import config_data
 
 
13
  from app.practical_tasks import supported_practical_tasks
14
  from app.components import (
15
  html_message,
@@ -38,6 +40,12 @@ def event_handler_calculate_pt_scores_blocks(files, evt_data: gr.EventData):
38
  df_files = b5.df_files_.copy()
39
  df_files.reset_index(inplace=True)
40
 
 
 
 
 
 
 
41
  return (
42
  html_message(config_data.InformationMessages_NOTI_VIDEOS, False, False),
43
  dataframe(
@@ -55,6 +63,7 @@ def event_handler_calculate_pt_scores_blocks(files, evt_data: gr.EventData):
55
  True,
56
  "csv-container",
57
  ),
 
58
  gr.Column(visible=True),
59
  radio_create_ui(
60
  first_practical_task,
@@ -80,7 +89,7 @@ def event_handler_calculate_pt_scores_blocks(files, evt_data: gr.EventData):
80
  visible=False,
81
  render=True,
82
  ),
83
- gr.Column(visible=False),
84
  number_create_ui(visible=False),
85
  dropdown_create_ui(visible=False),
86
  number_create_ui(visible=False),
@@ -89,6 +98,92 @@ def event_handler_calculate_pt_scores_blocks(files, evt_data: gr.EventData):
89
  number_create_ui(visible=False),
90
  number_create_ui(visible=False),
91
  number_create_ui(visible=False),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  button(
93
  config_data.OtherMessages_CALCULATE_PRACTICAL_TASK,
94
  True,
 
10
  # Importing necessary components for the Gradio app
11
  from app.oceanai_init import b5
12
  from app.config import config_data
13
+ from app.description_steps import STEP_2
14
+ from app.utils import read_csv_file, extract_profession_weights
15
  from app.practical_tasks import supported_practical_tasks
16
  from app.components import (
17
  html_message,
 
40
  df_files = b5.df_files_.copy()
41
  df_files.reset_index(inplace=True)
42
 
43
+ df_traits_priority_for_professions = read_csv_file(config_data.Links_PROFESSIONS)
44
+ weights_professions, interactive_professions = extract_profession_weights(
45
+ df_traits_priority_for_professions,
46
+ config_data.Settings_DROPDOWN_CANDIDATES[0],
47
+ )
48
+
49
  return (
50
  html_message(config_data.InformationMessages_NOTI_VIDEOS, False, False),
51
  dataframe(
 
63
  True,
64
  "csv-container",
65
  ),
66
+ gr.HTML(value=STEP_2, visible=True),
67
  gr.Column(visible=True),
68
  radio_create_ui(
69
  first_practical_task,
 
89
  visible=False,
90
  render=True,
91
  ),
92
+ gr.Column(visible=True),
93
  number_create_ui(visible=False),
94
  dropdown_create_ui(visible=False),
95
  number_create_ui(visible=False),
 
98
  number_create_ui(visible=False),
99
  number_create_ui(visible=False),
100
  number_create_ui(visible=False),
101
+ number_create_ui(visible=False),
102
+ number_create_ui(visible=False),
103
+ number_create_ui(visible=False),
104
+ dropdown_create_ui(
105
+ label=f"Potential candidates by professional responsibilities ({len(config_data.Settings_DROPDOWN_CANDIDATES)})",
106
+ info=config_data.InformationMessages_DROPDOWN_CANDIDATES_INFO,
107
+ choices=config_data.Settings_DROPDOWN_CANDIDATES,
108
+ value=config_data.Settings_DROPDOWN_CANDIDATES[0],
109
+ visible=True,
110
+ elem_classes="dropdown-container",
111
+ ),
112
+ number_create_ui(
113
+ value=weights_professions[0],
114
+ minimum=config_data.Values_0_100[0],
115
+ maximum=config_data.Values_0_100[1],
116
+ step=1,
117
+ label=config_data.Labels_NUMBER_IMPORTANCE_OPE_LABEL,
118
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
119
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
120
+ ),
121
+ show_label=True,
122
+ interactive=interactive_professions,
123
+ visible=True,
124
+ render=True,
125
+ elem_classes="number-container",
126
+ ),
127
+ number_create_ui(
128
+ value=weights_professions[1],
129
+ minimum=config_data.Values_0_100[0],
130
+ maximum=config_data.Values_0_100[1],
131
+ step=1,
132
+ label=config_data.Labels_NUMBER_IMPORTANCE_CON_LABEL,
133
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
134
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
135
+ ),
136
+ show_label=True,
137
+ interactive=interactive_professions,
138
+ visible=True,
139
+ render=True,
140
+ elem_classes="number-container",
141
+ ),
142
+ number_create_ui(
143
+ value=weights_professions[2],
144
+ minimum=config_data.Values_0_100[0],
145
+ maximum=config_data.Values_0_100[1],
146
+ step=1,
147
+ label=config_data.Labels_NUMBER_IMPORTANCE_EXT_LABEL,
148
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
149
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
150
+ ),
151
+ show_label=True,
152
+ interactive=interactive_professions,
153
+ visible=True,
154
+ render=True,
155
+ elem_classes="number-container",
156
+ ),
157
+ number_create_ui(
158
+ value=weights_professions[3],
159
+ minimum=config_data.Values_0_100[0],
160
+ maximum=config_data.Values_0_100[1],
161
+ step=1,
162
+ label=config_data.Labels_NUMBER_IMPORTANCE_AGR_LABEL,
163
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
164
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
165
+ ),
166
+ show_label=True,
167
+ interactive=interactive_professions,
168
+ visible=True,
169
+ render=True,
170
+ elem_classes="number-container",
171
+ ),
172
+ number_create_ui(
173
+ value=weights_professions[4],
174
+ minimum=config_data.Values_0_100[0],
175
+ maximum=config_data.Values_0_100[1],
176
+ step=1,
177
+ label=config_data.Labels_NUMBER_IMPORTANCE_NNEU_LABEL,
178
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
179
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
180
+ ),
181
+ show_label=True,
182
+ interactive=interactive_professions,
183
+ visible=True,
184
+ render=True,
185
+ elem_classes="number-container",
186
+ ),
187
  button(
188
  config_data.OtherMessages_CALCULATE_PRACTICAL_TASK,
189
  True,
app/event_handlers/clear_blocks.py CHANGED
@@ -9,6 +9,7 @@ import gradio as gr
9
 
10
  # Importing necessary components for the Gradio app
11
  from app.config import config_data
 
12
  from app.practical_tasks import supported_practical_tasks
13
  from app.components import (
14
  html_message,
@@ -48,6 +49,7 @@ def event_handler_clear_blocks():
48
  False,
49
  "csv-container",
50
  ),
 
51
  gr.Column(visible=False),
52
  radio_create_ui(
53
  first_practical_task,
@@ -82,6 +84,15 @@ def event_handler_clear_blocks():
82
  number_create_ui(visible=False),
83
  number_create_ui(visible=False),
84
  number_create_ui(visible=False),
 
 
 
 
 
 
 
 
 
85
  gr.Row(visible=False),
86
  gr.Column(visible=False),
87
  dataframe(visible=False),
 
9
 
10
  # Importing necessary components for the Gradio app
11
  from app.config import config_data
12
+ from app.description_steps import STEP_2
13
  from app.practical_tasks import supported_practical_tasks
14
  from app.components import (
15
  html_message,
 
49
  False,
50
  "csv-container",
51
  ),
52
+ gr.HTML(value=STEP_2, visible=False),
53
  gr.Column(visible=False),
54
  radio_create_ui(
55
  first_practical_task,
 
84
  number_create_ui(visible=False),
85
  number_create_ui(visible=False),
86
  number_create_ui(visible=False),
87
+ number_create_ui(visible=False),
88
+ number_create_ui(visible=False),
89
+ number_create_ui(visible=False),
90
+ dropdown_create_ui(visible=False),
91
+ number_create_ui(visible=False),
92
+ number_create_ui(visible=False),
93
+ number_create_ui(visible=False),
94
+ number_create_ui(visible=False),
95
+ number_create_ui(visible=False),
96
  gr.Row(visible=False),
97
  gr.Column(visible=False),
98
  dataframe(visible=False),
app/event_handlers/dropdown_candidates.py ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ File: dropdown_candidates.py
3
+ Author: Elena Ryumina and Dmitry Ryumin
4
+ Description: Event handler for Gradio app to filter dropdown candidates based on selected dropdown candidates.
5
+ License: MIT License
6
+ """
7
+
8
+ # Importing necessary components for the Gradio app
9
+ from app.config import config_data
10
+ from app.utils import read_csv_file, extract_profession_weights
11
+ from app.components import number_create_ui, dropdown_create_ui
12
+
13
+
14
+ def event_handler_dropdown_candidates(practical_subtasks, dropdown_candidates):
15
+ if practical_subtasks.lower() == "professional groups":
16
+ df_traits_priority_for_professions = read_csv_file(
17
+ config_data.Links_PROFESSIONS
18
+ )
19
+
20
+ weights, interactive = extract_profession_weights(
21
+ df_traits_priority_for_professions,
22
+ dropdown_candidates,
23
+ )
24
+
25
+ return (
26
+ number_create_ui(
27
+ value=weights[0],
28
+ minimum=config_data.Values_0_100[0],
29
+ maximum=config_data.Values_0_100[1],
30
+ step=1,
31
+ label=config_data.Labels_NUMBER_IMPORTANCE_OPE_LABEL,
32
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
33
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
34
+ ),
35
+ show_label=True,
36
+ interactive=interactive,
37
+ visible=True,
38
+ render=True,
39
+ elem_classes="number-container",
40
+ ),
41
+ number_create_ui(
42
+ value=weights[1],
43
+ minimum=config_data.Values_0_100[0],
44
+ maximum=config_data.Values_0_100[1],
45
+ step=1,
46
+ label=config_data.Labels_NUMBER_IMPORTANCE_CON_LABEL,
47
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
48
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
49
+ ),
50
+ show_label=True,
51
+ interactive=interactive,
52
+ visible=True,
53
+ render=True,
54
+ elem_classes="number-container",
55
+ ),
56
+ number_create_ui(
57
+ value=weights[2],
58
+ minimum=config_data.Values_0_100[0],
59
+ maximum=config_data.Values_0_100[1],
60
+ step=1,
61
+ label=config_data.Labels_NUMBER_IMPORTANCE_EXT_LABEL,
62
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
63
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
64
+ ),
65
+ show_label=True,
66
+ interactive=interactive,
67
+ visible=True,
68
+ render=True,
69
+ elem_classes="number-container",
70
+ ),
71
+ number_create_ui(
72
+ value=weights[3],
73
+ minimum=config_data.Values_0_100[0],
74
+ maximum=config_data.Values_0_100[1],
75
+ step=1,
76
+ label=config_data.Labels_NUMBER_IMPORTANCE_AGR_LABEL,
77
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
78
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
79
+ ),
80
+ show_label=True,
81
+ interactive=interactive,
82
+ visible=True,
83
+ render=True,
84
+ elem_classes="number-container",
85
+ ),
86
+ number_create_ui(
87
+ value=weights[4],
88
+ minimum=config_data.Values_0_100[0],
89
+ maximum=config_data.Values_0_100[1],
90
+ step=1,
91
+ label=config_data.Labels_NUMBER_IMPORTANCE_NNEU_LABEL,
92
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
93
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
94
+ ),
95
+ show_label=True,
96
+ interactive=interactive,
97
+ visible=True,
98
+ render=True,
99
+ elem_classes="number-container",
100
+ ),
101
+ )
102
+ else:
103
+ return (
104
+ number_create_ui(visible=False),
105
+ number_create_ui(visible=False),
106
+ number_create_ui(visible=False),
107
+ number_create_ui(visible=False),
108
+ number_create_ui(visible=False),
109
+ )
app/event_handlers/event_handlers.py CHANGED
@@ -19,6 +19,7 @@ from app.event_handlers.calculate_pt_scores_blocks import (
19
  )
20
  from app.event_handlers.practical_tasks import event_handler_practical_tasks
21
  from app.event_handlers.practical_subtasks import event_handler_practical_subtasks
 
22
  from app.event_handlers.calculate_practical_tasks import (
23
  event_handler_calculate_practical_task_blocks,
24
  )
@@ -34,6 +35,7 @@ def setup_app_event_handlers(
34
  clear_app,
35
  pt_scores,
36
  csv_pt_scores,
 
37
  practical_tasks,
38
  practical_subtasks,
39
  settings_practical_tasks,
@@ -45,6 +47,15 @@ def setup_app_event_handlers(
45
  target_score_agr,
46
  target_score_nneu,
47
  equal_coefficient,
 
 
 
 
 
 
 
 
 
48
  calculate_practical_task,
49
  practical_subtasks_selected,
50
  practical_tasks_column,
@@ -78,6 +89,7 @@ def setup_app_event_handlers(
78
  notifications,
79
  pt_scores,
80
  csv_pt_scores,
 
81
  practical_tasks_column,
82
  practical_tasks,
83
  practical_subtasks,
@@ -91,6 +103,15 @@ def setup_app_event_handlers(
91
  target_score_agr,
92
  target_score_nneu,
93
  equal_coefficient,
 
 
 
 
 
 
 
 
 
94
  calculate_practical_task,
95
  sorted_videos,
96
  sorted_videos_column,
@@ -120,6 +141,7 @@ def setup_app_event_handlers(
120
  clear_app,
121
  pt_scores,
122
  csv_pt_scores,
 
123
  practical_tasks_column,
124
  practical_tasks,
125
  practical_subtasks,
@@ -133,6 +155,15 @@ def setup_app_event_handlers(
133
  target_score_agr,
134
  target_score_nneu,
135
  equal_coefficient,
 
 
 
 
 
 
 
 
 
136
  sorted_videos,
137
  sorted_videos_column,
138
  practical_task_sorted,
@@ -162,6 +193,27 @@ def setup_app_event_handlers(
162
  target_score_agr,
163
  target_score_nneu,
164
  equal_coefficient,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
165
  ],
166
  queue=True,
167
  )
@@ -179,6 +231,14 @@ def setup_app_event_handlers(
179
  target_score_agr,
180
  target_score_nneu,
181
  equal_coefficient,
 
 
 
 
 
 
 
 
182
  ],
183
  outputs=[
184
  sorted_videos,
 
19
  )
20
  from app.event_handlers.practical_tasks import event_handler_practical_tasks
21
  from app.event_handlers.practical_subtasks import event_handler_practical_subtasks
22
+ from app.event_handlers.dropdown_candidates import event_handler_dropdown_candidates
23
  from app.event_handlers.calculate_practical_tasks import (
24
  event_handler_calculate_practical_task_blocks,
25
  )
 
35
  clear_app,
36
  pt_scores,
37
  csv_pt_scores,
38
+ step_2,
39
  practical_tasks,
40
  practical_subtasks,
41
  settings_practical_tasks,
 
47
  target_score_agr,
48
  target_score_nneu,
49
  equal_coefficient,
50
+ number_priority,
51
+ number_importance_traits,
52
+ threshold_consumer_preferences,
53
+ dropdown_candidates,
54
+ number_openness,
55
+ number_conscientiousness,
56
+ number_extraversion,
57
+ number_agreeableness,
58
+ number_non_neuroticism,
59
  calculate_practical_task,
60
  practical_subtasks_selected,
61
  practical_tasks_column,
 
89
  notifications,
90
  pt_scores,
91
  csv_pt_scores,
92
+ step_2,
93
  practical_tasks_column,
94
  practical_tasks,
95
  practical_subtasks,
 
103
  target_score_agr,
104
  target_score_nneu,
105
  equal_coefficient,
106
+ number_priority,
107
+ number_importance_traits,
108
+ threshold_consumer_preferences,
109
+ dropdown_candidates,
110
+ number_openness,
111
+ number_conscientiousness,
112
+ number_extraversion,
113
+ number_agreeableness,
114
+ number_non_neuroticism,
115
  calculate_practical_task,
116
  sorted_videos,
117
  sorted_videos_column,
 
141
  clear_app,
142
  pt_scores,
143
  csv_pt_scores,
144
+ step_2,
145
  practical_tasks_column,
146
  practical_tasks,
147
  practical_subtasks,
 
155
  target_score_agr,
156
  target_score_nneu,
157
  equal_coefficient,
158
+ number_priority,
159
+ number_importance_traits,
160
+ threshold_consumer_preferences,
161
+ dropdown_candidates,
162
+ number_openness,
163
+ number_conscientiousness,
164
+ number_extraversion,
165
+ number_agreeableness,
166
+ number_non_neuroticism,
167
  sorted_videos,
168
  sorted_videos_column,
169
  practical_task_sorted,
 
193
  target_score_agr,
194
  target_score_nneu,
195
  equal_coefficient,
196
+ number_priority,
197
+ number_importance_traits,
198
+ threshold_consumer_preferences,
199
+ dropdown_candidates,
200
+ number_openness,
201
+ number_conscientiousness,
202
+ number_extraversion,
203
+ number_agreeableness,
204
+ number_non_neuroticism,
205
+ ],
206
+ queue=True,
207
+ )
208
+ dropdown_candidates.change(
209
+ fn=event_handler_dropdown_candidates,
210
+ inputs=[practical_subtasks, dropdown_candidates],
211
+ outputs=[
212
+ number_openness,
213
+ number_conscientiousness,
214
+ number_extraversion,
215
+ number_agreeableness,
216
+ number_non_neuroticism,
217
  ],
218
  queue=True,
219
  )
 
231
  target_score_agr,
232
  target_score_nneu,
233
  equal_coefficient,
234
+ number_priority,
235
+ number_importance_traits,
236
+ threshold_consumer_preferences,
237
+ number_openness,
238
+ number_conscientiousness,
239
+ number_extraversion,
240
+ number_agreeableness,
241
+ number_non_neuroticism,
242
  ],
243
  outputs=[
244
  sorted_videos,
app/event_handlers/examples_blocks.py CHANGED
@@ -13,4 +13,7 @@ def event_handler_examples_blocks():
13
  "videos/video1.mp4",
14
  "videos/video2.mp4",
15
  "videos/video3.mp4",
 
 
 
16
  ]
 
13
  "videos/video1.mp4",
14
  "videos/video2.mp4",
15
  "videos/video3.mp4",
16
+ "videos/video4.mp4",
17
+ "videos/video5.mp4",
18
+ "videos/video6.mp4",
19
  ]
app/event_handlers/practical_subtasks.py CHANGED
@@ -9,6 +9,7 @@ import gradio as gr
9
 
10
  # Importing necessary components for the Gradio app
11
  from app.config import config_data
 
12
  from app.components import number_create_ui, dropdown_create_ui
13
 
14
 
@@ -17,7 +18,114 @@ def event_handler_practical_subtasks(
17
  ):
18
  practical_subtasks_selected[practical_tasks] = practical_subtasks
19
 
20
- if practical_subtasks.lower() == "professional skills":
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  return (
22
  practical_subtasks_selected,
23
  gr.Column(visible=True),
@@ -27,7 +135,7 @@ def event_handler_practical_subtasks(
27
  maximum=1.0,
28
  step=0.01,
29
  label=config_data.Labels_THRESHOLD_PROFESSIONAL_SKILLS_LABEL,
30
- info=config_data.InformationMessages_THRESHOLD_PROFESSIONAL_SKILLS_INFO,
31
  show_label=True,
32
  interactive=True,
33
  visible=True,
@@ -48,6 +156,15 @@ def event_handler_practical_subtasks(
48
  number_create_ui(visible=False),
49
  number_create_ui(visible=False),
50
  number_create_ui(visible=False),
 
 
 
 
 
 
 
 
 
51
  )
52
  elif (
53
  practical_subtasks.lower() == "finding a suitable junior colleague"
@@ -64,7 +181,7 @@ def event_handler_practical_subtasks(
64
  maximum=1.0,
65
  step=0.000001,
66
  label=config_data.Labels_TARGET_SCORE_OPE_LABEL,
67
- info=config_data.InformationMessages_TARGET_SCORE_OPE_INFO,
68
  show_label=True,
69
  interactive=True,
70
  visible=True,
@@ -77,7 +194,7 @@ def event_handler_practical_subtasks(
77
  maximum=1.0,
78
  step=0.000001,
79
  label=config_data.Labels_TARGET_SCORE_CON_LABEL,
80
- info=config_data.InformationMessages_TARGET_SCORE_CON_INFO,
81
  show_label=True,
82
  interactive=True,
83
  visible=True,
@@ -90,7 +207,7 @@ def event_handler_practical_subtasks(
90
  maximum=1.0,
91
  step=0.000001,
92
  label=config_data.Labels_TARGET_SCORE_EXT_LABEL,
93
- info=config_data.InformationMessages_TARGET_SCORE_EXT_INFO,
94
  show_label=True,
95
  interactive=True,
96
  visible=True,
@@ -103,7 +220,7 @@ def event_handler_practical_subtasks(
103
  maximum=1.0,
104
  step=0.000001,
105
  label=config_data.Labels_TARGET_SCORE_AGR_LABEL,
106
- info=config_data.InformationMessages_TARGET_SCORE_AGR_INFO,
107
  show_label=True,
108
  interactive=True,
109
  visible=True,
@@ -116,7 +233,7 @@ def event_handler_practical_subtasks(
116
  maximum=1.0,
117
  step=0.000001,
118
  label=config_data.Labels_TARGET_SCORE_NNEU_LABEL,
119
- info=config_data.InformationMessages_TARGET_SCORE_NNEU_INFO,
120
  show_label=True,
121
  interactive=True,
122
  visible=True,
@@ -129,13 +246,90 @@ def event_handler_practical_subtasks(
129
  maximum=1.0,
130
  step=0.01,
131
  label=config_data.Labels_EQUAL_COEFFICIENT_LABEL,
132
- info=config_data.InformationMessages_EQUAL_COEFFICIENT_INFO,
133
  show_label=True,
134
  interactive=True,
135
  visible=True,
136
  render=True,
137
  elem_classes="number-container",
138
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
139
  )
140
  else:
141
  return (
@@ -149,4 +343,13 @@ def event_handler_practical_subtasks(
149
  number_create_ui(visible=False),
150
  number_create_ui(visible=False),
151
  number_create_ui(visible=False),
 
 
 
 
 
 
 
 
 
152
  )
 
9
 
10
  # Importing necessary components for the Gradio app
11
  from app.config import config_data
12
+ from app.utils import read_csv_file, extract_profession_weights
13
  from app.components import number_create_ui, dropdown_create_ui
14
 
15
 
 
18
  ):
19
  practical_subtasks_selected[practical_tasks] = practical_subtasks
20
 
21
+ if practical_subtasks.lower() == "professional groups":
22
+ df_traits_priority_for_professions = read_csv_file(
23
+ config_data.Links_PROFESSIONS
24
+ )
25
+ weights_professions, interactive_professions = extract_profession_weights(
26
+ df_traits_priority_for_professions,
27
+ config_data.Settings_DROPDOWN_CANDIDATES[0],
28
+ )
29
+
30
+ return (
31
+ practical_subtasks_selected,
32
+ gr.Column(visible=True),
33
+ number_create_ui(visible=False),
34
+ dropdown_create_ui(visible=False),
35
+ number_create_ui(visible=False),
36
+ number_create_ui(visible=False),
37
+ number_create_ui(visible=False),
38
+ number_create_ui(visible=False),
39
+ number_create_ui(visible=False),
40
+ number_create_ui(visible=False),
41
+ number_create_ui(visible=False),
42
+ number_create_ui(visible=False),
43
+ number_create_ui(visible=False),
44
+ dropdown_create_ui(
45
+ label=f"Potential candidates by professional responsibilities ({len(config_data.Settings_DROPDOWN_CANDIDATES)})",
46
+ info=config_data.InformationMessages_DROPDOWN_CANDIDATES_INFO,
47
+ choices=config_data.Settings_DROPDOWN_CANDIDATES,
48
+ value=config_data.Settings_DROPDOWN_CANDIDATES[0],
49
+ visible=True,
50
+ elem_classes="dropdown-container",
51
+ ),
52
+ number_create_ui(
53
+ value=weights_professions[0],
54
+ minimum=config_data.Values_0_100[0],
55
+ maximum=config_data.Values_0_100[1],
56
+ step=1,
57
+ label=config_data.Labels_NUMBER_IMPORTANCE_OPE_LABEL,
58
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
59
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
60
+ ),
61
+ show_label=True,
62
+ interactive=interactive_professions,
63
+ visible=True,
64
+ render=True,
65
+ elem_classes="number-container",
66
+ ),
67
+ number_create_ui(
68
+ value=weights_professions[1],
69
+ minimum=config_data.Values_0_100[0],
70
+ maximum=config_data.Values_0_100[1],
71
+ step=1,
72
+ label=config_data.Labels_NUMBER_IMPORTANCE_CON_LABEL,
73
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
74
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
75
+ ),
76
+ show_label=True,
77
+ interactive=interactive_professions,
78
+ visible=True,
79
+ render=True,
80
+ elem_classes="number-container",
81
+ ),
82
+ number_create_ui(
83
+ value=weights_professions[2],
84
+ minimum=config_data.Values_0_100[0],
85
+ maximum=config_data.Values_0_100[1],
86
+ step=1,
87
+ label=config_data.Labels_NUMBER_IMPORTANCE_EXT_LABEL,
88
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
89
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
90
+ ),
91
+ show_label=True,
92
+ interactive=interactive_professions,
93
+ visible=True,
94
+ render=True,
95
+ elem_classes="number-container",
96
+ ),
97
+ number_create_ui(
98
+ value=weights_professions[3],
99
+ minimum=config_data.Values_0_100[0],
100
+ maximum=config_data.Values_0_100[1],
101
+ step=1,
102
+ label=config_data.Labels_NUMBER_IMPORTANCE_AGR_LABEL,
103
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
104
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
105
+ ),
106
+ show_label=True,
107
+ interactive=interactive_professions,
108
+ visible=True,
109
+ render=True,
110
+ elem_classes="number-container",
111
+ ),
112
+ number_create_ui(
113
+ value=weights_professions[4],
114
+ minimum=config_data.Values_0_100[0],
115
+ maximum=config_data.Values_0_100[1],
116
+ step=1,
117
+ label=config_data.Labels_NUMBER_IMPORTANCE_NNEU_LABEL,
118
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
119
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
120
+ ),
121
+ show_label=True,
122
+ interactive=interactive_professions,
123
+ visible=True,
124
+ render=True,
125
+ elem_classes="number-container",
126
+ ),
127
+ )
128
+ elif practical_subtasks.lower() == "professional skills":
129
  return (
130
  practical_subtasks_selected,
131
  gr.Column(visible=True),
 
135
  maximum=1.0,
136
  step=0.01,
137
  label=config_data.Labels_THRESHOLD_PROFESSIONAL_SKILLS_LABEL,
138
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(0, 1.0),
139
  show_label=True,
140
  interactive=True,
141
  visible=True,
 
156
  number_create_ui(visible=False),
157
  number_create_ui(visible=False),
158
  number_create_ui(visible=False),
159
+ number_create_ui(visible=False),
160
+ number_create_ui(visible=False),
161
+ number_create_ui(visible=False),
162
+ dropdown_create_ui(visible=False),
163
+ number_create_ui(visible=False),
164
+ number_create_ui(visible=False),
165
+ number_create_ui(visible=False),
166
+ number_create_ui(visible=False),
167
+ number_create_ui(visible=False),
168
  )
169
  elif (
170
  practical_subtasks.lower() == "finding a suitable junior colleague"
 
181
  maximum=1.0,
182
  step=0.000001,
183
  label=config_data.Labels_TARGET_SCORE_OPE_LABEL,
184
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(0, 1.0),
185
  show_label=True,
186
  interactive=True,
187
  visible=True,
 
194
  maximum=1.0,
195
  step=0.000001,
196
  label=config_data.Labels_TARGET_SCORE_CON_LABEL,
197
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(0, 1.0),
198
  show_label=True,
199
  interactive=True,
200
  visible=True,
 
207
  maximum=1.0,
208
  step=0.000001,
209
  label=config_data.Labels_TARGET_SCORE_EXT_LABEL,
210
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(0, 1.0),
211
  show_label=True,
212
  interactive=True,
213
  visible=True,
 
220
  maximum=1.0,
221
  step=0.000001,
222
  label=config_data.Labels_TARGET_SCORE_AGR_LABEL,
223
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(0, 1.0),
224
  show_label=True,
225
  interactive=True,
226
  visible=True,
 
233
  maximum=1.0,
234
  step=0.000001,
235
  label=config_data.Labels_TARGET_SCORE_NNEU_LABEL,
236
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(0, 1.0),
237
  show_label=True,
238
  interactive=True,
239
  visible=True,
 
246
  maximum=1.0,
247
  step=0.01,
248
  label=config_data.Labels_EQUAL_COEFFICIENT_LABEL,
249
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(0, 1.0),
250
  show_label=True,
251
  interactive=True,
252
  visible=True,
253
  render=True,
254
  elem_classes="number-container",
255
  ),
256
+ number_create_ui(visible=False),
257
+ number_create_ui(visible=False),
258
+ number_create_ui(visible=False),
259
+ dropdown_create_ui(visible=False),
260
+ number_create_ui(visible=False),
261
+ number_create_ui(visible=False),
262
+ number_create_ui(visible=False),
263
+ number_create_ui(visible=False),
264
+ number_create_ui(visible=False),
265
+ )
266
+ elif (
267
+ practical_subtasks.lower() == "car characteristics"
268
+ or practical_subtasks.lower() == "mobile device application categories"
269
+ ):
270
+ df_correlation_coefficients = read_csv_file(
271
+ config_data.Links_CAR_CHARACTERISTICS,
272
+ ["Trait", "Style and performance", "Safety and practicality"],
273
+ )
274
+
275
+ return (
276
+ practical_subtasks_selected,
277
+ gr.Column(visible=True),
278
+ number_create_ui(visible=False),
279
+ dropdown_create_ui(visible=False),
280
+ number_create_ui(visible=False),
281
+ number_create_ui(visible=False),
282
+ number_create_ui(visible=False),
283
+ number_create_ui(visible=False),
284
+ number_create_ui(visible=False),
285
+ number_create_ui(visible=False),
286
+ number_create_ui(
287
+ value=3,
288
+ minimum=1,
289
+ maximum=df_correlation_coefficients.columns.size,
290
+ step=1,
291
+ label=config_data.Labels_NUMBER_PRIORITY_LABEL,
292
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
293
+ 1, df_correlation_coefficients.columns.size
294
+ ),
295
+ show_label=True,
296
+ interactive=True,
297
+ visible=True,
298
+ render=True,
299
+ elem_classes="number-container",
300
+ ),
301
+ number_create_ui(
302
+ value=3,
303
+ minimum=1,
304
+ maximum=5,
305
+ step=1,
306
+ label=config_data.Labels_NUMBER_IMPORTANCE_TRAITS_LABEL,
307
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(1, 5),
308
+ show_label=True,
309
+ interactive=True,
310
+ visible=True,
311
+ render=True,
312
+ elem_classes="number-container",
313
+ ),
314
+ number_create_ui(
315
+ value=0.55,
316
+ minimum=0.0,
317
+ maximum=1.0,
318
+ step=0.01,
319
+ label=config_data.Labels_THRESHOLD_CONSUMER_PREFERENCES_LABEL,
320
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(0, 1.0),
321
+ show_label=True,
322
+ interactive=True,
323
+ visible=True,
324
+ render=True,
325
+ elem_classes="number-container",
326
+ ),
327
+ dropdown_create_ui(visible=False),
328
+ number_create_ui(visible=False),
329
+ number_create_ui(visible=False),
330
+ number_create_ui(visible=False),
331
+ number_create_ui(visible=False),
332
+ number_create_ui(visible=False),
333
  )
334
  else:
335
  return (
 
343
  number_create_ui(visible=False),
344
  number_create_ui(visible=False),
345
  number_create_ui(visible=False),
346
+ number_create_ui(visible=False),
347
+ number_create_ui(visible=False),
348
+ number_create_ui(visible=False),
349
+ dropdown_create_ui(visible=False),
350
+ number_create_ui(visible=False),
351
+ number_create_ui(visible=False),
352
+ number_create_ui(visible=False),
353
+ number_create_ui(visible=False),
354
+ number_create_ui(visible=False),
355
  )
app/event_handlers/practical_task_sorted.py CHANGED
@@ -15,13 +15,6 @@ from app.components import video_create_ui
15
  def event_handler_practical_task_sorted(
16
  files, practical_task_sorted, evt_data: gr.SelectData
17
  ):
18
- # print(
19
- # f"{evt_data.value}, {evt_data.index}, {evt_data.target}, {evt_data.selected}, {evt_data._data}"
20
- # )
21
- # print(practical_task_sorted)
22
-
23
- # print(evt_data, evt_data.index[0], practical_task_sorted.iloc[evt_data.index[0]])
24
-
25
  person_id = int(practical_task_sorted.iloc[evt_data.index[0]]["Person ID"]) - 1
26
 
27
  if evt_data.index[0] == 0:
 
15
  def event_handler_practical_task_sorted(
16
  files, practical_task_sorted, evt_data: gr.SelectData
17
  ):
 
 
 
 
 
 
 
18
  person_id = int(practical_task_sorted.iloc[evt_data.index[0]]["Person ID"]) - 1
19
 
20
  if evt_data.index[0] == 0:
app/tabs.py CHANGED
@@ -9,9 +9,12 @@ import gradio as gr
9
 
10
  # Importing necessary components for the Gradio app
11
  from app.description import DESCRIPTION
 
 
12
  from app.authors import AUTHORS
13
  from app.config import config_data
14
  from app.practical_tasks import supported_practical_tasks
 
15
  from app.components import (
16
  html_message,
17
  files_create_ui,
@@ -27,6 +30,8 @@ from app.components import (
27
  def app_tab():
28
  gr.Markdown(value=DESCRIPTION)
29
 
 
 
30
  with gr.Row():
31
  files = files_create_ui()
32
 
@@ -62,6 +67,8 @@ def app_tab():
62
  "csv-container",
63
  )
64
 
 
 
65
  first_practical_task = next(iter(supported_practical_tasks))
66
 
67
  with gr.Column(scale=1, visible=False, render=True) as practical_tasks_column:
@@ -95,7 +102,7 @@ def app_tab():
95
  maximum=1.0,
96
  step=0.01,
97
  label=config_data.Labels_THRESHOLD_PROFESSIONAL_SKILLS_LABEL,
98
- info=config_data.InformationMessages_THRESHOLD_PROFESSIONAL_SKILLS_INFO,
99
  show_label=True,
100
  interactive=True,
101
  visible=False,
@@ -118,7 +125,7 @@ def app_tab():
118
  maximum=1.0,
119
  step=0.000001,
120
  label=config_data.Labels_TARGET_SCORE_OPE_LABEL,
121
- info=config_data.InformationMessages_TARGET_SCORE_OPE_INFO,
122
  show_label=True,
123
  interactive=True,
124
  visible=False,
@@ -132,7 +139,7 @@ def app_tab():
132
  maximum=1.0,
133
  step=0.000001,
134
  label=config_data.Labels_TARGET_SCORE_CON_LABEL,
135
- info=config_data.InformationMessages_TARGET_SCORE_CON_INFO,
136
  show_label=True,
137
  interactive=True,
138
  visible=False,
@@ -146,7 +153,7 @@ def app_tab():
146
  maximum=1.0,
147
  step=0.000001,
148
  label=config_data.Labels_TARGET_SCORE_EXT_LABEL,
149
- info=config_data.InformationMessages_TARGET_SCORE_EXT_INFO,
150
  show_label=True,
151
  interactive=True,
152
  visible=False,
@@ -160,7 +167,7 @@ def app_tab():
160
  maximum=1.0,
161
  step=0.000001,
162
  label=config_data.Labels_TARGET_SCORE_AGR_LABEL,
163
- info=config_data.InformationMessages_TARGET_SCORE_AGR_INFO,
164
  show_label=True,
165
  interactive=True,
166
  visible=False,
@@ -174,7 +181,7 @@ def app_tab():
174
  maximum=1.0,
175
  step=0.000001,
176
  label=config_data.Labels_TARGET_SCORE_NNEU_LABEL,
177
- info=config_data.InformationMessages_TARGET_SCORE_NNEU_INFO,
178
  show_label=True,
179
  interactive=True,
180
  visible=False,
@@ -188,7 +195,42 @@ def app_tab():
188
  maximum=1.0,
189
  step=0.01,
190
  label=config_data.Labels_EQUAL_COEFFICIENT_LABEL,
191
- info=config_data.InformationMessages_EQUAL_COEFFICIENT_INFO,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
192
  show_label=True,
193
  interactive=True,
194
  visible=False,
@@ -196,6 +238,117 @@ def app_tab():
196
  elem_classes="number-container",
197
  )
198
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
199
  calculate_practical_task = button(
200
  config_data.OtherMessages_CALCULATE_PRACTICAL_TASK,
201
  True,
@@ -247,6 +400,7 @@ def app_tab():
247
  clear_app,
248
  pt_scores,
249
  csv_pt_scores,
 
250
  practical_tasks,
251
  practical_subtasks,
252
  settings_practical_tasks,
@@ -258,6 +412,15 @@ def app_tab():
258
  target_score_agr,
259
  target_score_nneu,
260
  equal_coefficient,
 
 
 
 
 
 
 
 
 
261
  calculate_practical_task,
262
  practical_subtasks_selected,
263
  practical_tasks_column,
@@ -270,5 +433,9 @@ def app_tab():
270
  )
271
 
272
 
 
 
 
 
273
  def about_authors_tab():
274
- return gr.Markdown(value=AUTHORS)
 
9
 
10
  # Importing necessary components for the Gradio app
11
  from app.description import DESCRIPTION
12
+ from app.description_steps import STEP_1, STEP_2
13
+ from app.app import APP
14
  from app.authors import AUTHORS
15
  from app.config import config_data
16
  from app.practical_tasks import supported_practical_tasks
17
+ from app.utils import read_csv_file, extract_profession_weights
18
  from app.components import (
19
  html_message,
20
  files_create_ui,
 
30
  def app_tab():
31
  gr.Markdown(value=DESCRIPTION)
32
 
33
+ gr.HTML(value=STEP_1)
34
+
35
  with gr.Row():
36
  files = files_create_ui()
37
 
 
67
  "csv-container",
68
  )
69
 
70
+ step_2 = gr.HTML(value=STEP_2, visible=False)
71
+
72
  first_practical_task = next(iter(supported_practical_tasks))
73
 
74
  with gr.Column(scale=1, visible=False, render=True) as practical_tasks_column:
 
102
  maximum=1.0,
103
  step=0.01,
104
  label=config_data.Labels_THRESHOLD_PROFESSIONAL_SKILLS_LABEL,
105
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(0, 1.0),
106
  show_label=True,
107
  interactive=True,
108
  visible=False,
 
125
  maximum=1.0,
126
  step=0.000001,
127
  label=config_data.Labels_TARGET_SCORE_OPE_LABEL,
128
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(0, 1.0),
129
  show_label=True,
130
  interactive=True,
131
  visible=False,
 
139
  maximum=1.0,
140
  step=0.000001,
141
  label=config_data.Labels_TARGET_SCORE_CON_LABEL,
142
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(0, 1.0),
143
  show_label=True,
144
  interactive=True,
145
  visible=False,
 
153
  maximum=1.0,
154
  step=0.000001,
155
  label=config_data.Labels_TARGET_SCORE_EXT_LABEL,
156
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(0, 1.0),
157
  show_label=True,
158
  interactive=True,
159
  visible=False,
 
167
  maximum=1.0,
168
  step=0.000001,
169
  label=config_data.Labels_TARGET_SCORE_AGR_LABEL,
170
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(0, 1.0),
171
  show_label=True,
172
  interactive=True,
173
  visible=False,
 
181
  maximum=1.0,
182
  step=0.000001,
183
  label=config_data.Labels_TARGET_SCORE_NNEU_LABEL,
184
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(0, 1.0),
185
  show_label=True,
186
  interactive=True,
187
  visible=False,
 
195
  maximum=1.0,
196
  step=0.01,
197
  label=config_data.Labels_EQUAL_COEFFICIENT_LABEL,
198
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(0, 1.0),
199
+ show_label=True,
200
+ interactive=True,
201
+ visible=False,
202
+ render=True,
203
+ elem_classes="number-container",
204
+ )
205
+
206
+ df_correlation_coefficients = read_csv_file(
207
+ config_data.Links_CAR_CHARACTERISTICS,
208
+ ["Trait", "Style and performance", "Safety and practicality"],
209
+ )
210
+
211
+ number_priority = number_create_ui(
212
+ value=3,
213
+ minimum=1,
214
+ maximum=df_correlation_coefficients.columns.size,
215
+ step=1,
216
+ label=config_data.Labels_NUMBER_PRIORITY_LABEL,
217
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
218
+ 1, df_correlation_coefficients.columns.size
219
+ ),
220
+ show_label=True,
221
+ interactive=True,
222
+ visible=False,
223
+ render=True,
224
+ elem_classes="number-container",
225
+ )
226
+
227
+ number_importance_traits = number_create_ui(
228
+ value=3,
229
+ minimum=1,
230
+ maximum=5,
231
+ step=1,
232
+ label=config_data.Labels_NUMBER_IMPORTANCE_TRAITS_LABEL,
233
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(1, 5),
234
  show_label=True,
235
  interactive=True,
236
  visible=False,
 
238
  elem_classes="number-container",
239
  )
240
 
241
+ threshold_consumer_preferences = number_create_ui(
242
+ value=0.55,
243
+ minimum=0.0,
244
+ maximum=1.0,
245
+ step=0.01,
246
+ label=config_data.Labels_THRESHOLD_CONSUMER_PREFERENCES_LABEL,
247
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(0, 1.0),
248
+ show_label=True,
249
+ interactive=True,
250
+ visible=False,
251
+ render=True,
252
+ elem_classes="number-container",
253
+ )
254
+
255
+ dropdown_candidates = dropdown_create_ui(
256
+ label=f"Potential candidates by professional responsibilities ({len(config_data.Settings_DROPDOWN_CANDIDATES)})",
257
+ info=config_data.InformationMessages_DROPDOWN_CANDIDATES_INFO,
258
+ choices=config_data.Settings_DROPDOWN_CANDIDATES,
259
+ value=config_data.Settings_DROPDOWN_CANDIDATES[0],
260
+ visible=False,
261
+ elem_classes="dropdown-container",
262
+ )
263
+
264
+ df_traits_priority_for_professions = read_csv_file(
265
+ config_data.Links_PROFESSIONS
266
+ )
267
+ weights_professions, interactive_professions = extract_profession_weights(
268
+ df_traits_priority_for_professions,
269
+ config_data.Settings_DROPDOWN_CANDIDATES[0],
270
+ )
271
+
272
+ number_openness = number_create_ui(
273
+ value=weights_professions[0],
274
+ minimum=config_data.Values_0_100[0],
275
+ maximum=config_data.Values_0_100[1],
276
+ step=1,
277
+ label=config_data.Labels_NUMBER_IMPORTANCE_OPE_LABEL,
278
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
279
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
280
+ ),
281
+ show_label=True,
282
+ interactive=interactive_professions,
283
+ visible=False,
284
+ render=True,
285
+ elem_classes="number-container",
286
+ )
287
+
288
+ number_conscientiousness = number_create_ui(
289
+ value=weights_professions[1],
290
+ minimum=config_data.Values_0_100[0],
291
+ maximum=config_data.Values_0_100[1],
292
+ step=1,
293
+ label=config_data.Labels_NUMBER_IMPORTANCE_CON_LABEL,
294
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
295
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
296
+ ),
297
+ show_label=True,
298
+ interactive=interactive_professions,
299
+ visible=False,
300
+ render=True,
301
+ elem_classes="number-container",
302
+ )
303
+
304
+ number_extraversion = number_create_ui(
305
+ value=weights_professions[2],
306
+ minimum=config_data.Values_0_100[0],
307
+ maximum=config_data.Values_0_100[1],
308
+ step=1,
309
+ label=config_data.Labels_NUMBER_IMPORTANCE_EXT_LABEL,
310
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
311
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
312
+ ),
313
+ show_label=True,
314
+ interactive=interactive_professions,
315
+ visible=False,
316
+ render=True,
317
+ elem_classes="number-container",
318
+ )
319
+
320
+ number_agreeableness = number_create_ui(
321
+ value=weights_professions[3],
322
+ minimum=config_data.Values_0_100[0],
323
+ maximum=config_data.Values_0_100[1],
324
+ step=1,
325
+ label=config_data.Labels_NUMBER_IMPORTANCE_AGR_LABEL,
326
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
327
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
328
+ ),
329
+ show_label=True,
330
+ interactive=interactive_professions,
331
+ visible=False,
332
+ render=True,
333
+ elem_classes="number-container",
334
+ )
335
+
336
+ number_non_neuroticism = number_create_ui(
337
+ value=weights_professions[4],
338
+ minimum=config_data.Values_0_100[0],
339
+ maximum=config_data.Values_0_100[1],
340
+ step=1,
341
+ label=config_data.Labels_NUMBER_IMPORTANCE_NNEU_LABEL,
342
+ info=config_data.InformationMessages_VALUE_FROM_TO_INFO.format(
343
+ config_data.Values_0_100[0], config_data.Values_0_100[1]
344
+ ),
345
+ show_label=True,
346
+ interactive=interactive_professions,
347
+ visible=False,
348
+ render=True,
349
+ elem_classes="number-container",
350
+ )
351
+
352
  calculate_practical_task = button(
353
  config_data.OtherMessages_CALCULATE_PRACTICAL_TASK,
354
  True,
 
400
  clear_app,
401
  pt_scores,
402
  csv_pt_scores,
403
+ step_2,
404
  practical_tasks,
405
  practical_subtasks,
406
  settings_practical_tasks,
 
412
  target_score_agr,
413
  target_score_nneu,
414
  equal_coefficient,
415
+ number_priority,
416
+ number_importance_traits,
417
+ threshold_consumer_preferences,
418
+ dropdown_candidates,
419
+ number_openness,
420
+ number_conscientiousness,
421
+ number_extraversion,
422
+ number_agreeableness,
423
+ number_non_neuroticism,
424
  calculate_practical_task,
425
  practical_subtasks_selected,
426
  practical_tasks_column,
 
433
  )
434
 
435
 
436
+ def about_app_tab():
437
+ return gr.HTML(value=APP)
438
+
439
+
440
  def about_authors_tab():
441
+ return gr.HTML(value=AUTHORS)
app/utils.py ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ File: utils.py
3
+ Author: Elena Ryumina and Dmitry Ryumin
4
+ Description: Utility functions.
5
+ License: MIT License
6
+ """
7
+
8
+ import pandas as pd
9
+
10
+
11
+ def preprocess_scores_df(df, name):
12
+ df.index.name = name
13
+ df.index += 1
14
+ df.index = df.index.map(str)
15
+
16
+ return df
17
+
18
+
19
+ def read_csv_file(file_path, drop_columns=[]):
20
+ df = pd.read_csv(file_path)
21
+
22
+ if len(drop_columns) != 0:
23
+ df = pd.DataFrame(df.drop(drop_columns, axis=1))
24
+
25
+ return preprocess_scores_df(df, "ID")
26
+
27
+
28
+ def round_numeric_values(x):
29
+ if isinstance(x, (int, float)):
30
+ return round(x, 3)
31
+
32
+ return x
33
+
34
+
35
+ def apply_rounding_and_rename_columns(df):
36
+ df_rounded = df.rename(
37
+ columns={
38
+ "Openness": "OPE",
39
+ "Conscientiousness": "CON",
40
+ "Extraversion": "EXT",
41
+ "Agreeableness": "AGR",
42
+ "Non-Neuroticism": "NNEU",
43
+ }
44
+ )
45
+
46
+ columns_to_round = df_rounded.columns[1:]
47
+ df_rounded[columns_to_round] = df_rounded[columns_to_round].applymap(
48
+ round_numeric_values
49
+ )
50
+
51
+ return df_rounded
52
+
53
+
54
+ def extract_profession_weights(df, dropdown_candidates):
55
+ try:
56
+ weights_professions = df.loc[df["Profession"] == dropdown_candidates, :].values[
57
+ 0
58
+ ][1:]
59
+ interactive_professions = False
60
+ except Exception:
61
+ weights_professions = [0] * 5
62
+ interactive_professions = True
63
+ else:
64
+ weights_professions = list(map(int, weights_professions))
65
+
66
+ return weights_professions, interactive_professions
config.toml CHANGED
@@ -1,5 +1,5 @@
1
  [AppSettings]
2
- APP_VERSION = "0.6.0"
3
  CSS_PATH = "app.css"
4
 
5
  [InformationMessages]
@@ -7,15 +7,13 @@ NOTI_VIDEOS = "Select the video(s)"
7
  PRACTICAL_TASKS_INFO = "Choose a practical task"
8
  PRACTICAL_SUBTASKS_INFO = "Choose a practical subtask"
9
  NOTI_IN_DEV = "In development"
10
- THRESHOLD_PROFESSIONAL_SKILLS_INFO = "Set value from 0 to 1.0"
11
  DROPDOWN_PROFESSIONAL_SKILLS_INFO = "What professional skill are you interested in?"
12
  DROPDOWN_DROPDOWN_COLLEAGUES_INFO = "What colleague are you interested in?"
13
- TARGET_SCORE_OPE_INFO = "Set value from 0 to 1.0"
14
- TARGET_SCORE_CON_INFO = "Set value from 0 to 1.0"
15
- TARGET_SCORE_EXT_INFO = "Set value from 0 to 1.0"
16
- TARGET_SCORE_AGR_INFO = "Set value from 0 to 1.0"
17
- TARGET_SCORE_NNEU_INFO = "Set value from 0 to 1.0"
18
- EQUAL_COEFFICIENT_INFO = "Set value from 0 to 1.0"
19
 
20
  [OtherMessages]
21
  CALCULATE_PT_SCORES = "Calculation of Big Five personality traits scores"
@@ -23,8 +21,10 @@ CALCULATE_PRACTICAL_TASK = "Solving a practical task"
23
  CLEAR_APP = "Clear"
24
  EXAMPLES_APP = "Examples"
25
  EXPORT_PT_SCORES = "Export Big Five personality traits to a CSV file"
 
26
  EXPORT_PS = "Export ranking professional skill results to a CSV file"
27
  EXPORT_WT = "Export ranking effective work teams results to a CSV file"
 
28
  NOTI_CALCULATE = "You can calculate Big Five personality traits scores"
29
 
30
  [Labels]
@@ -37,23 +37,41 @@ TARGET_SCORE_EXT_LABEL = "Extraversion target score"
37
  TARGET_SCORE_AGR_LABEL = "Agreeableness target score"
38
  TARGET_SCORE_NNEU_LABEL = "Non-Neuroticism target score"
39
  EQUAL_COEFFICIENT_LABEL = "Equal coefficient"
 
 
 
 
 
 
 
 
40
 
41
  [TabCreators]
42
  "App" = "app_tab"
 
43
  "About the Authors" = "about_authors_tab"
44
 
45
  [Filenames]
46
  PT_SCORES = "personality_traits_scores.csv"
47
  PT_SKILLS_SCORES = "personality_skills_scores.csv"
48
  COLLEAGUE_RANKING = "_colleague_ranking.csv"
 
 
 
49
 
50
  [Settings]
 
51
  DROPDOWN_PROFESSIONAL_SKILLS = ["Analytical", "Interactive", "Routine", "Non-Routine"]
52
  DROPDOWN_COLLEAGUES = ["major", "minor"]
 
53
 
54
  [Values]
55
  TARGET_SCORES = [0.527886, 0.522337, 0.458468, 0.51761, 0.444649]
 
56
 
57
  [Links]
58
  PROFESSIONAL_SKILLS = "https://download.sberdisk.ru/download/file/478678231?token=0qiZwliLtHWWYMv&filename=professional_skills.csv"
59
- FINDING_COLLEAGUE = "https://download.sberdisk.ru/download/file/478675819?token=LuB7L1QsEY0UuSs&filename=colleague_ranking.csv"
 
 
 
 
1
  [AppSettings]
2
+ APP_VERSION = "0.7.0"
3
  CSS_PATH = "app.css"
4
 
5
  [InformationMessages]
 
7
  PRACTICAL_TASKS_INFO = "Choose a practical task"
8
  PRACTICAL_SUBTASKS_INFO = "Choose a practical subtask"
9
  NOTI_IN_DEV = "In development"
 
10
  DROPDOWN_PROFESSIONAL_SKILLS_INFO = "What professional skill are you interested in?"
11
  DROPDOWN_DROPDOWN_COLLEAGUES_INFO = "What colleague are you interested in?"
12
+ DROPDOWN_CANDIDATES_INFO = "What profession are you interested in?"
13
+ VALUE_FROM_TO_INFO = "Set value from {} to {}"
14
+ SUM_WEIGHTS = "The sum of the weights of the personality traits should be 100, not {}"
15
+ STEP_1 = "Step 1: Calculation of personality traits scores"
16
+ STEP_2 = "Step 2: Solving a practical task"
 
17
 
18
  [OtherMessages]
19
  CALCULATE_PT_SCORES = "Calculation of Big Five personality traits scores"
 
21
  CLEAR_APP = "Clear"
22
  EXAMPLES_APP = "Examples"
23
  EXPORT_PT_SCORES = "Export Big Five personality traits to a CSV file"
24
+ EXPORT_PG = "Export ranking professional groups results to a CSV file"
25
  EXPORT_PS = "Export ranking professional skill results to a CSV file"
26
  EXPORT_WT = "Export ranking effective work teams results to a CSV file"
27
+ EXPORT_CP = "Export consumer preferences for industrial goods results to a CSV file"
28
  NOTI_CALCULATE = "You can calculate Big Five personality traits scores"
29
 
30
  [Labels]
 
37
  TARGET_SCORE_AGR_LABEL = "Agreeableness target score"
38
  TARGET_SCORE_NNEU_LABEL = "Non-Neuroticism target score"
39
  EQUAL_COEFFICIENT_LABEL = "Equal coefficient"
40
+ NUMBER_PRIORITY_LABEL = "Priority number"
41
+ NUMBER_IMPORTANCE_TRAITS_LABEL = "Importance traits number"
42
+ NUMBER_IMPORTANCE_OPE_LABEL = "Openness weight"
43
+ NUMBER_IMPORTANCE_CON_LABEL = "Conscientiousness weight"
44
+ NUMBER_IMPORTANCE_EXT_LABEL = "Extraversion weight"
45
+ NUMBER_IMPORTANCE_AGR_LABEL = "Agreeableness weight"
46
+ NUMBER_IMPORTANCE_NNEU_LABEL = "Non-Neuroticism weight"
47
+ THRESHOLD_CONSUMER_PREFERENCES_LABEL = "Polarity traits threshold"
48
 
49
  [TabCreators]
50
  "App" = "app_tab"
51
+ "About the App" = "about_app_tab"
52
  "About the Authors" = "about_authors_tab"
53
 
54
  [Filenames]
55
  PT_SCORES = "personality_traits_scores.csv"
56
  PT_SKILLS_SCORES = "personality_skills_scores.csv"
57
  COLLEAGUE_RANKING = "_colleague_ranking.csv"
58
+ CAR_CHARACTERISTICS = "auto_characteristics_priorities.csv"
59
+ MDA_CATEGORIES = "divice_characteristics_priorities.csv"
60
+ POTENTIAL_CANDIDATES = "potential_candidates.csv"
61
 
62
  [Settings]
63
+ SHORT_PROFESSIONAL_SKILLS = ["OPE", "CON", "EXT", "AGR", "NNEU"]
64
  DROPDOWN_PROFESSIONAL_SKILLS = ["Analytical", "Interactive", "Routine", "Non-Routine"]
65
  DROPDOWN_COLLEAGUES = ["major", "minor"]
66
+ DROPDOWN_CANDIDATES = ["Managers/executives", "Entrepreneurship", "Social/Non profit making professions", "Public sector professions", "Scientists/researchers, and engineers", "Custom"]
67
 
68
  [Values]
69
  TARGET_SCORES = [0.527886, 0.522337, 0.458468, 0.51761, 0.444649]
70
+ 0_100 = [0, 100]
71
 
72
  [Links]
73
  PROFESSIONAL_SKILLS = "https://download.sberdisk.ru/download/file/478678231?token=0qiZwliLtHWWYMv&filename=professional_skills.csv"
74
+ FINDING_COLLEAGUE = "https://download.sberdisk.ru/download/file/478675819?token=LuB7L1QsEY0UuSs&filename=colleague_ranking.csv"
75
+ CAR_CHARACTERISTICS = "https://download.sberdisk.ru/download/file/478675818?token=EjfLMqOeK8cfnOu&filename=auto_characteristics.csv"
76
+ MDA_CATEGORIES = "https://download.sberdisk.ru/download/file/478676690?token=7KcAxPqMpWiYQnx&filename=divice_characteristics.csv"
77
+ PROFESSIONS = "https://download.sberdisk.ru/download/file/478675798?token=fF5fNZVpthQlEV0&filename=traits_priority_for_professions.csv"
requirements.txt CHANGED
@@ -2,6 +2,6 @@ gradio==4.23.0
2
  requests==2.31.0
3
  PyYAML==6.0.1
4
  toml==0.10.2
5
- oceanai==1.0.0a26
6
  tf-keras==2.16.0
7
  pandas==2.2.1
 
2
  requests==2.31.0
3
  PyYAML==6.0.1
4
  toml==0.10.2
5
+ oceanai==1.0.0a27
6
  tf-keras==2.16.0
7
  pandas==2.2.1