yifanxie commited on
Commit
7818025
·
1 Parent(s): ed581c9

updated model result download

Browse files
dash/numerdash_app.py CHANGED
@@ -19,6 +19,12 @@ import traceback
19
  import datetime
20
 
21
  st.set_page_config(layout='wide')
 
 
 
 
 
 
22
 
23
  def sidebar_data_picker():
24
  st.sidebar.subheader('Model Data Picker')
@@ -28,7 +34,9 @@ def sidebar_data_picker():
28
  special_list = st.sidebar.checkbox('model from specific users', value=True)
29
  return top_lb, top_tp3m, top_tp1y, special_list
30
 
31
- def model_data_picker(values = None):
 
 
32
  if values is None:
33
  values = [True, True, True, True, True, True]
34
  model_dict = {}
@@ -58,7 +66,9 @@ def model_data_picker(values = None):
58
  model_dict['mcv'] = project_config.MCV_MODELS + project_config.MCV_NEW_MODELS
59
  return model_dict
60
 
61
- def model_fast_picker(models):
 
 
62
  text_content = '''
63
  fast model picker by CSV string.
64
  example: "model1, model2, model3"
@@ -75,6 +85,39 @@ def model_fast_picker(models):
75
 
76
 
77
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  def generate_round_table(data, row_cts, c, r, sortcol='corrmmc'):
79
  # rounds = data
80
  # row_cts[c].write(2*r+c)
@@ -202,157 +245,137 @@ def round_view(data, select_perview, select_metric=None):
202
  generate_live_round_stake(data, row_cts, c, r)
203
 
204
 
205
- def performance_overview():
206
  models = []
207
- st.sidebar.subheader('Choose a Table View')
208
- select_perview = st.sidebar.selectbox("", list(tbl_opt.keys()), index=0, format_func=lambda x: tbl_opt[x])
209
- model_dict = model_data_picker(values=[False, False, False, False, True, True])
210
  data = []
211
- for k in model_dict.keys():
212
- models += model_dict[k]
213
- if os.path.isfile(project_config.DASHBOARD_MODEL_RESULT_FILE) and len(models)>0:
214
- data = project_utils.load_data(project_config.DASHBOARD_MODEL_RESULT_FILE)
215
- if select_perview=='round_result':
216
- data = data.drop(['fnc', 'fnc_pct'], axis=1)
217
- data = data.drop_duplicates(['model', 'roundNumber'], keep='first')
218
- data = data[data['model'].isin(models)].reset_index(drop=True)
219
- round_view(data, select_perview)
220
- if select_perview=='dailyscore_metric':
221
- st.sidebar.subheader('Select Round Data')
222
- latest_round = int(data['roundNumber'].max())
223
- earliest_round = int(data['roundNumber'].min())
224
- if (latest_round - earliest_round) > 10:
225
- # suggest_round = int(latest_round - (latest_round - earliest_round) / 2)
226
- suggest_round = 263
227
- else:
228
- suggest_round = earliest_round
229
- select_rounds = st.sidebar.slider('select a round', earliest_round, latest_round, (suggest_round, latest_round - 1), 1)
230
- data = data[(data['model'].isin(models))]
231
- data = data[(data['roundNumber']>=select_rounds[0]) & (data['roundNumber']<=select_rounds[1])]
232
- # st.write(data.shape, latest_round, earliest_round, suggest_round, select_rounds)
233
- st.write(f'Key columns: sos - Sharpe raito of daily score sharpe, avg_sharpe - Average of daily score sharpe')
234
- round_view(data, select_perview)
235
- # round_view(models, )
236
- if select_perview=='round_metric':
237
- st.sidebar.subheader('Select Round Data')
238
- latest_round = int(data['roundNumber'].max())
239
- earliest_round = int(data['roundNumber'].min())
240
- if (latest_round - earliest_round) > 10:
241
- # suggest_round = int(latest_round - (latest_round - earliest_round) / 2)
242
- suggest_round = 263
243
- else:
244
- suggest_round = earliest_round
245
- select_rounds = st.sidebar.slider('select a round', earliest_round, latest_round, (suggest_round, latest_round - 1), 1)
246
-
247
- data = data.drop(['fnc', 'fnc_pct'], axis=1)
248
- data = data.drop_duplicates(['model', 'roundNumber'], keep='first')
249
- data = data[(data['roundNumber']>=select_rounds[0]) & (data['roundNumber']<=select_rounds[1])]
250
- data = data[data['model'].isin(models)].reset_index(drop=True)
251
-
252
- roundmetrics_data = get_roundmetric_data(data)
253
- min_count = int(roundmetrics_data['count'].min())
254
- max_count = int(roundmetrics_data['count'].max())
255
- if min_count<max_count:
256
- select_minround = st.sidebar.slider('miminum number of rounds', min_count, max_count, min_count, 1)
257
- else:
258
- select_minround = min_count
259
- roundmetrics_data = roundmetrics_data[roundmetrics_data['count']>=select_minround].reset_index(drop=True)
260
- # st.write(roundmetrics_data.shape)
261
- round_view(roundmetrics_data, select_perview)
262
- # st.write(roundmetrics_data)
263
- else:
264
- st.info('model result data file missing, or no model is selected')
265
-
266
 
 
 
 
 
 
 
 
 
 
 
 
 
267
 
268
 
269
  def data_operation():
270
  # top_lb, top_tp3m, top_tp1y, special_list = sidebar_data_picker()
271
  latest_round = project_utils.latest_round
272
  models = []
273
- model_dict = model_data_picker()
274
- for k in model_dict.keys():
275
- models += model_dict[k]
 
 
 
 
 
276
  suggest_min_round = 182 #latest_round-50
277
  min_round, max_round = st.slider('select tournament rounds', 200, latest_round, (suggest_min_round, latest_round), 1)
278
  roundlist = [i for i in range(max_round, min_round-1, -1)]
279
- download = st.button('download data of tracked models')
280
  st.sidebar.subheader('configuration')
281
  show_info=st.sidebar.checkbox('show background data', value=False)
282
- update_numeraiti_data = st.sidebar.checkbox('update numerati data', value=True)
283
- update_model_data = st.sidebar.checkbox('update model data', value=True)
 
284
 
285
-
286
- model_df = []
287
- if download and len(models)>0:
288
- if update_numeraiti_data:
289
- if show_info:
290
- st.info('updating numerati data')
291
- project_utils.update_numerati_data()
292
-
293
- if update_model_data:
294
- model_dfs = []
295
- my_bar = st.progress(0.0)
296
- my_bar.progress(0.0)
297
- percent_complete = 0.0
298
- # models = models[0:5]
299
- for i in range(len(models)):
300
- message = ''
301
- try:
302
- model_res = numerapi_utils.daily_submissions_performances(models[i])
303
- if len(model_res) > 0:
304
- cols = ['model'] + list(model_res[0].keys())
305
- model_df = pd.DataFrame(model_res)
306
- model_df['model'] = models[i]
307
- model_df = model_df[cols]
308
- model_dfs.append(model_df)
309
- else:
310
- message = f'no result found for model {models[i]}'
311
- except Exception:
312
- # if show_info:
313
- # st.write(f'error while getting result for {models[i]}')
314
- except_msg = traceback.format_exc()
315
- message = f'error while getting result for {models[i]}: {except_msg}'
316
- if show_info and len(message)>0:
317
- st.info(message)
318
- percent_complete += 1/len(models)
319
- if i == len(models)-1:
320
- percent_complete = 1.0
321
- time.sleep(0.1)
322
- my_bar.progress(percent_complete)
323
- model_df = pd.concat(model_dfs, axis=0).sort_values(by=['roundNumber','date'], ascending=False).reset_index(drop=True)
324
- model_df = model_df[model_df['roundNumber'].isin(roundlist)].reset_index(drop=True)
325
- model_df['date'] = model_df['date'].dt.date
326
- model_df['group'] = model_df['model'].apply(lambda x: project_utils.get_model_group(x))
327
 
328
  prjreload = st.sidebar.button('reload config')
329
  if prjreload:
330
  project_utils.reload_project()
331
  if len(model_df)>0:
332
- rename_dict = {'corrPercentile': 'corr_pct', 'correlation':'corr', 'correlationWithMetamodel':'corr_meta', 'mmcPercentile':'mmc_pct', 'fncPercentile':'fnc_pct'}
333
  model_df.rename(columns=rename_dict, inplace=True)
334
  model_df['corrmmc'] = model_df['corr'] + model_df['mmc']
335
  model_df['corr2mmc'] = model_df['corr'] + 2*model_df['mmc']
336
  model_df['cmavg_pct'] = (model_df['corr_pct'] + model_df['mmc_pct'])/2
337
  model_df['c2mavg_pct'] = (model_df['corr_pct'] + 2*model_df['mmc_pct'])/3
338
- ord_cols = ['model','corr', 'corr_pct', 'mmc', 'mmc_pct', 'corrmmc', 'cmavg_pct', 'corr_meta','group', 'corr2mmc','c2mavg_pct', 'date', 'roundNumber', 'fnc', 'fnc_pct']
339
  model_df = model_df[ord_cols]
340
- project_utils.pickle_data(project_config.DASHBOARD_MODEL_RESULT_FILE, model_df)
 
 
 
341
  if show_info:
342
  st.text('list of models being tracked')
343
  st.write(model_dict)
344
- # st.write(models)
345
  try:
 
346
  st.write(model_df.head(5))
347
  except:
348
  st.write('model data was not retrieved')
349
- st.sidebar.subheader('data info')
350
- dbd_tstr, nmtd_str = project_utils.get_dashboard_data_status()
351
- st.sidebar.text(f'dashboard timestamp: {dbd_tstr}')
352
- st.sidebar.text(f'numerati timestamp: {nmtd_str}')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
353
  return None
354
 
355
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
356
  def chart_pxline(data, x, y, color, hover_data=None, x_range=None):
357
  fig = px.line(data, x=x, y=y, color=color, hover_data=hover_data)
358
  fig.update_layout(plot_bgcolor='black', paper_bgcolor='black', font_color='white', height = max_height, margin=dict(l=0, r=10, t=20, b=20))
@@ -437,7 +460,7 @@ def histtrend():
437
  def model_evaluation():
438
  models = []
439
  model_selection = []
440
- model_dict = model_data_picker(values=[True, True, True, True, True, True])
441
  mean_scale = [-0.05, 0.1]
442
  count_scale = [1, 50]
443
  sharpe_scale = [-0.2, 3]
@@ -652,31 +675,9 @@ def get_stake_graph(data):
652
  # roundlist = [i for i in range(latest_round_id, latest_round_id-4, -1]
653
 
654
 
655
- def check_session_state(key, data, init=False):
656
  # st.write(data)
657
- portsel_list = ['portfolio_left', 'portfolio_right']
658
- if key in portsel_list:
659
- if ('last_opt' not in st.session_state) & (~init):
660
- st.session_state['last_opt'] = key
661
- if key not in st.session_state:
662
- st.session_state[key] = data
663
- # st.session_state['last_opt'] = key
664
- else:
665
- # st.write(key, st.session_state['last_opt'],len(st.session_state[key]))
666
- if st.session_state[key] is None:
667
- st.session_state[key] = []
668
- # st.session_state['last_opt'] = key
669
- if data is None:
670
- return st.session_state[key]
671
- elif (set(data)!=set(st.session_state[key])) & (len(data)>0 & (~init)):
672
- # if st.session_state['last_opt'] == key:
673
- if(st.session_state['last_opt']==key):
674
- st.session_state[key] = data
675
- else:
676
- if len(st.session_state[key]) ==0:
677
- st.session_state[key] = data
678
- st.session_state['last_opt'] = key
679
-
680
  return st.session_state[key]
681
  else:
682
  return None
@@ -685,7 +686,7 @@ def check_session_state(key, data, init=False):
685
  def stake_overview():
686
  models = []
687
  model_selection = []
688
- model_dict = model_data_picker(values=[True, True, True, True, True, True])
689
  for k in model_dict.keys():
690
  if model_dict[k] not in models:
691
  models += model_dict[k]
@@ -748,176 +749,65 @@ def stake_overview():
748
  stake_models = ovdf['model'].tolist()
749
  liveround_stake_df = get_stake_by_liverounds(stake_models)
750
  # st.write(liveround_stake_df)
751
- round_view(liveround_stake_df,'live_round_stake')
752
-
753
-
754
- def set_portolio_control(ct, models ,data):
755
- roundmodels = data['model'].unique().tolist()
756
- use_models = [m for m in models if m in roundmodels]
757
- ct.write(use_models)
758
-
759
-
760
- # def portfolio_model_selector(models):
761
- # st.sidebar.subheader('Portfolio Model Shortlist')
762
- # # placeholder = st.sidebar.empty()
763
- # text_content = '''
764
- # fast model picker by CSV string.
765
- # example: "model1, model2, model3"
766
- # '''
767
- # # port_model_exp = st.sidebar.expander('portfolio model selector', expanded=True)
768
- # # with port_model_exp:
769
- # # text = placeholder.text_input(label=text_content, key='1')
770
- # text = st.sidebar.text_area(label=text_content)
771
- # result_models = []
772
- # if len(text)>0:
773
- # csv_parts = text.split(',')
774
- # for s in csv_parts:
775
- # m = s.strip()
776
- # if m in models:
777
- # result_models.append(m)
778
- # default_models = list(dict.fromkeys(result_models))
779
- # port_model_selection = st.sidebar.multiselect('select models for portfolio shortlist', models, default=default_models)
780
- # # selection_opt = st.sidebar.radio('select models for', list(port_model_selection_opt.keys()), index=0, format_func=lambda x: port_model_selection_opt[x])
781
- # return port_model_selection
782
-
783
-
784
- def portfolio_model_selector(models):
785
- # placeholder = st.sidebar.empty()
786
- selection_opt = st.sidebar.radio('select models for', list(port_model_selection_opt.keys()), index=0, format_func=lambda x: port_model_selection_opt[x], key='pmsel_mulsel')
787
-
788
- text_content = '''
789
- fast model picker by CSV string.
790
- example: "model1, model2, model3"
791
- '''
792
- # port_model_exp = st.sidebar.expander('portfolio model selector', expanded=True)
793
- # with port_model_exp:
794
- # text = placeholder.text_input(label=text_content, key='1')
795
- text = st.sidebar.text_area(label=text_content, key='pmsel_txt')
796
- result_models = []
797
- if len(text)>0:
798
- csv_parts = text.split(',')
799
- for s in csv_parts:
800
- m = s.strip()
801
- if m in models:
802
- result_models.append(m)
803
- default_models = list(dict.fromkeys(result_models))
804
- # st.write(default_models)
805
- port_model_selection = st.sidebar.multiselect('select models for portfolio shortlist', models, default=default_models)
806
- return port_model_selection, selection_opt
807
-
808
-
809
-
810
- def portfolio_mgmt():
811
- models = []
812
- model_selection = []
813
- # model_dict = model_data_picker(values=[True, True, True, True, True, True])
814
- model_dict = model_data_picker(values=[True, True, True, True, True, True])
815
-
816
- for k in model_dict.keys():
817
- if model_dict[k] not in models:
818
- models += model_dict[k]
819
- # overview_models = models
820
- port_models_left = check_session_state('portfolio_left', [], init=True)
821
- port_models_right = check_session_state('portfolio_right', [], init=True)
822
-
823
- if os.path.isfile(project_config.DASHBOARD_MODEL_RESULT_FILE) and len(models)>0:
824
- port_cts = st.columns(2)
825
- # port_models_shortlist = portfolio_model_selector(models)
826
-
827
- # elif port_model_opt=='overview':
828
- # if len(port_models_shortlist)==0:
829
- #
830
- # port_models_shortlist = models
831
- # else:
832
- # return None
833
- data = project_utils.load_data(project_config.DASHBOARD_MODEL_RESULT_FILE)
834
- round_data = data[data['model'].isin(models)].drop_duplicates(['model', 'roundNumber'],keep='first').reset_index(drop=True)
835
- min_round = int(round_data['roundNumber'].min())
836
- max_round = int(round_data['roundNumber'].max())
837
- suggest_min_round = max_round - 20
838
- if min_round == max_round:
839
- min_round = max_round - 20
840
-
841
- round_exp = st.expander('Round Selection', expanded=True)
842
- metric_exp = st.expander('Metric Selection', expanded=True)
843
- # portmodel_select_exp = st.expander('Portfolio Model Selection', expanded=True)
844
- models_overview_exp =st.expander('Portfolio Model Shortlist', expanded=True)
845
- with round_exp:
846
- min_selectround, max_selectround = st.slider('', min_round, max_round,
847
- (suggest_min_round, max_round), 1)
848
- round_list = [r for r in range(min_selectround, max_selectround+1)]
849
- with metric_exp:
850
- defaultlist = ['corr_sharpe', 'mmc_sharpe', 'corr2mmc_sharpe','corr_mean', 'mmc_mean', 'corr2mmc_mean', 'count']
851
- select_metrics = st.multiselect('', list(model_eval_opt.keys()),
852
- format_func=lambda x: model_eval_opt[x], default=defaultlist)
853
-
854
- round_data = round_data[round_data['roundNumber'].isin(round_list)].reset_index(drop=True)
855
- roundmetric_df = get_roundmetric_data(round_data).sort_values(by='corrmmc_sharpe', ascending=False).reset_index(drop=True)
856
- roundmodels = roundmetric_df['model'].unique().tolist()
857
 
858
- # with portmodel_select_exp:
859
- # port_sel = st.columns(2)
860
- # pl = port_sel[0].multiselect('', port_models_shortlist, default=[])
861
- port_models_selection, port_opt = portfolio_model_selector(roundmodels)
862
- if port_opt=='left':
863
- port_models_left = check_session_state('portfolio_left',port_models_selection)
864
- elif port_opt=='right':
865
- port_models_right = check_session_state('portfolio_right',port_models_selection)
866
-
867
- # port_models_right = portfolio_model_selector_ct(port_sel, roundmodels, c=1)
868
-
869
- # port_models_right = portfolio_model_selector_ct(port_sel[1], port_models_shortlist, '2')
870
 
871
 
872
 
873
- # with port_exp = st.expander('Portfolio Comparison ')
874
- set_portolio_control(port_cts[0], port_models_left, roundmetric_df)
875
- set_portolio_control(port_cts[1], port_models_right, roundmetric_df)
 
876
 
877
- with models_overview_exp:
878
- cols = ['model'] + select_metrics
879
- st.subheader(f'{len(roundmetric_df)} models are available for portfolio selection')
880
- st.dataframe(roundmetric_df[cols], height=max_table_height)
881
 
882
- # default_models = model_fast_picker(models)
883
- # model_selection = st.sidebar.multiselect('select models for chart', models, default=default_models)
884
 
885
 
 
 
 
 
886
 
887
- pass
 
 
 
 
 
888
 
889
 
890
 
891
  def show_content():
892
  st.sidebar.header('Dashboard Selection')
893
- select_app = st.sidebar.selectbox("", list(app_opt.keys()), index=3, format_func=lambda x: app_opt[x])
894
  if select_app=='performance_overview':
895
  performance_overview()
896
- if select_app=='historic_trend':
897
- histtrend()
898
- if select_app=='data_op':
899
- data_operation()
900
- if select_app=='model_evaluation':
901
- model_evaluation()
902
  if select_app=='stake_overview':
903
  stake_overview()
904
- if select_app=='portfolio_mgmt':
905
- portfolio_mgmt()
906
-
907
-
908
 
909
 
910
  # main body
911
  # various configuration setting
912
  app_opt = {
913
  'performance_overview' : 'Performance Overview',
914
- 'historic_trend':'Historic Trend',
915
- 'model_evaluation' : 'Model Evaluation',
916
  'stake_overview': 'Stake Overview',
917
- 'portfolio_mgmt': 'Portfolio_Management',
918
- 'data_op':'Data Operation'
919
  }
920
 
 
 
 
 
 
 
 
 
 
 
921
  tbl_opt = {
922
  'round_result':'Round Results',
923
  'dailyscore_metric':'Daily Score Metrics',
@@ -996,13 +886,14 @@ stakeoverview_plot_opt = {
996
  'all':'Display all available data'
997
  }
998
 
999
-
1000
- port_model_selection_opt = {
1001
- 'left':'Left Portfolio',
1002
- 'right':'Right Portfolio'
1003
- # 'overview':'Model Overview'
1004
- }
1005
-
 
1006
 
1007
 
1008
 
@@ -1015,6 +906,19 @@ with height_exp:
1015
 
1016
  st.title('Numerai Dashboard')
1017
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1018
  # trying out multi columns
1019
  # col1, col2 = st.columns(2)
1020
  # col1.header('col1')
 
19
  import datetime
20
 
21
  st.set_page_config(layout='wide')
22
+ get_benchmark_data = True
23
+
24
+ # get_dailyscore = True
25
+
26
+
27
+
28
 
29
  def sidebar_data_picker():
30
  st.sidebar.subheader('Model Data Picker')
 
34
  special_list = st.sidebar.checkbox('model from specific users', value=True)
35
  return top_lb, top_tp3m, top_tp1y, special_list
36
 
37
+
38
+ # to be removed
39
+ def model_data_picker_bak(values = None):
40
  if values is None:
41
  values = [True, True, True, True, True, True]
42
  model_dict = {}
 
66
  model_dict['mcv'] = project_config.MCV_MODELS + project_config.MCV_NEW_MODELS
67
  return model_dict
68
 
69
+
70
+ # to be removed
71
+ def model_fast_picker_bak(models):
72
  text_content = '''
73
  fast model picker by CSV string.
74
  example: "model1, model2, model3"
 
85
 
86
 
87
 
88
+ def default_model_picker():
89
+ picked_models = {}
90
+ if os.path.isfile('default_models.json'):
91
+ default_models_dict = project_utils.load_json('default_models.json')
92
+ for key in default_models_dict.keys():
93
+ picked_models[key] = default_models_dict[key]
94
+ if os.path.isfile('user_models.json'):
95
+ user_models_dict = project_utils.load_json('user_models.json')
96
+ for key in user_models_dict.keys():
97
+ picked_models[key] = user_models_dict[key]
98
+ return picked_models
99
+
100
+
101
+ def model_fast_picker(models):
102
+ text_content = '''
103
+ fast model picker by CSV string.
104
+ example: "model1, model2, model3"
105
+ '''
106
+ text = st.sidebar.text_area(text_content)
107
+ result_models = []
108
+ if len(text)>0:
109
+ csv_parts = text.split(',')
110
+ for s in csv_parts:
111
+ m = s.strip()
112
+ if m not in models:
113
+ result_models.append(m)
114
+ return list(dict.fromkeys(result_models))
115
+
116
+
117
+
118
+
119
+
120
+
121
  def generate_round_table(data, row_cts, c, r, sortcol='corrmmc'):
122
  # rounds = data
123
  # row_cts[c].write(2*r+c)
 
245
  generate_live_round_stake(data, row_cts, c, r)
246
 
247
 
248
+ def score_overview():
249
  models = []
 
 
 
250
  data = []
251
+ benchmark_opt = st.sidebar.checkbox('download default models', value=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
252
 
253
+ model_selection = st.empty()
254
+ if benchmark_opt:
255
+ model_dict = default_model_picker()
256
+ for k in model_dict.keys():
257
+ models += model_dict[k]
258
+ models = models + model_fast_picker(models)
259
+ # if len(models)>0:
260
+ # model_selection = st.sidebar.multiselect('select models', models, default=models)
261
+ st.sidebar.subheader('Choose a Table View')
262
+ select_perview = st.sidebar.selectbox("", list(tbl_opt.keys()), index=0, format_func=lambda x: tbl_opt[x])
263
+ if len(models)>0:
264
+ model_selection.multiselect('selected models', models, default=models)
265
 
266
 
267
  def data_operation():
268
  # top_lb, top_tp3m, top_tp1y, special_list = sidebar_data_picker()
269
  latest_round = project_utils.latest_round
270
  models = []
271
+ benchmark_opt = st.sidebar.checkbox('download default models', value=True)
272
+ if benchmark_opt:
273
+ model_dict = default_model_picker()
274
+ for k in model_dict.keys():
275
+ models += model_dict[k]
276
+ models = models + model_fast_picker(models)
277
+ if len(models)>0:
278
+ model_selection = st.multiselect('select models', models, default=models)
279
  suggest_min_round = 182 #latest_round-50
280
  min_round, max_round = st.slider('select tournament rounds', 200, latest_round, (suggest_min_round, latest_round), 1)
281
  roundlist = [i for i in range(max_round, min_round-1, -1)]
282
+ download = st.button('download data of selected models')
283
  st.sidebar.subheader('configuration')
284
  show_info=st.sidebar.checkbox('show background data', value=False)
285
+ # update_numeraiti_data = st.sidebar.checkbox('update numerati data', value=True)
286
+ # update_model_data = st.sidebar.checkbox('update model data', value=True)
287
+ # update_model_data =
288
 
289
+ model_df = get_saved_data()
290
+ if download and len(model_selection)>0:
291
+ # if update_model_data:
292
+ with st.spinner('downloading model round results'):
293
+ model_df = []
294
+ model_df = download_model_round_result(model_selection, roundlist, show_info)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
295
 
296
  prjreload = st.sidebar.button('reload config')
297
  if prjreload:
298
  project_utils.reload_project()
299
  if len(model_df)>0:
300
+ rename_dict = {'corrPercentile': 'corr_pct', 'correlation':'corr', 'corrWMetamodel':'corr_meta', 'mmcPercentile':'mmc_pct', 'tcPercentile':'tc_pct'}
301
  model_df.rename(columns=rename_dict, inplace=True)
302
  model_df['corrmmc'] = model_df['corr'] + model_df['mmc']
303
  model_df['corr2mmc'] = model_df['corr'] + 2*model_df['mmc']
304
  model_df['cmavg_pct'] = (model_df['corr_pct'] + model_df['mmc_pct'])/2
305
  model_df['c2mavg_pct'] = (model_df['corr_pct'] + 2*model_df['mmc_pct'])/3
306
+ ord_cols = ['model','corr', 'corr_pct', 'mmc', 'mmc_pct', 'corrmmc', 'cmavg_pct', 'corr_meta', 'tc', 'tc_pct', 'corr2mmc','c2mavg_pct', 'roundNumber']
307
  model_df = model_df[ord_cols]
308
+ if project_config.SAVE_LOCAL_COPY:
309
+ project_utils.pickle_data(project_config.MODEL_ROUND_RESULT_FILE, model_df)
310
+ st.session_state['model_data'] = model_df
311
+
312
  if show_info:
313
  st.text('list of models being tracked')
314
  st.write(model_dict)
 
315
  try:
316
+ st.write(st.session_state['model_data'].shape)
317
  st.write(model_df.head(5))
318
  except:
319
  st.write('model data was not retrieved')
320
+
321
+ if len(model_df)>0:
322
+ get_performance_data_status(model_df)
323
+ return None
324
+
325
+ def get_saved_data():
326
+ res = []
327
+ if os.path.isfile(project_config.MODEL_ROUND_RESULT_FILE):
328
+ res = project_utils.load_data(project_config.MODEL_ROUND_RESULT_FILE)
329
+ st.session_state['model_data'] = res
330
+ return res
331
+
332
+ def get_performance_data_status(df):
333
+ st.sidebar.subheader('model data summary')
334
+ # latest_date = df['date'][0].strftime(project_config.DATETIME_FORMAT3)
335
+ model_num = df['model'].nunique()
336
+ round_num = df['roundNumber'].nunique()
337
+ latest_round = df['roundNumber'].max()
338
+ # st.sidebar.text(f'latest date: {latest_date}')
339
+ st.sidebar.text(f'number of models: {model_num}')
340
+ st.sidebar.text(f'number of rounds: {round_num}')
341
+ st.sidebar.text(f'latest round: {latest_round}')
342
  return None
343
 
344
 
345
+ def download_model_round_result(models, roundlist, show_info):
346
+ model_df = []
347
+ model_dfs = []
348
+ my_bar = st.progress(0.0)
349
+ my_bar.progress(0.0)
350
+ percent_complete = 0.0
351
+ for i in range(len(models)):
352
+ message = ''
353
+ try:
354
+ model_res = numerapi_utils.daily_submissions_performances_V3(models[i])
355
+ if len(model_res) > 0:
356
+ cols = ['model'] + list(model_res[0].keys())
357
+ model_df = pd.DataFrame(model_res)
358
+ model_df['model'] = models[i]
359
+ model_df = model_df[cols]
360
+ model_dfs.append(model_df)
361
+ else:
362
+ message = f'no result found for model {models[i]}'
363
+ except Exception:
364
+ # if show_info:
365
+ # st.write(f'error while getting result for {models[i]}')
366
+ except_msg = traceback.format_exc()
367
+ message = f'error while getting result for {models[i]}: {except_msg}'
368
+ if show_info and len(message) > 0:
369
+ st.info(message)
370
+ percent_complete += 1 / len(models)
371
+ if i == len(models) - 1:
372
+ percent_complete = 1.0
373
+ time.sleep(0.1)
374
+ my_bar.progress(percent_complete)
375
+ model_df = pd.concat(model_dfs, axis=0).sort_values(by=['roundNumber'], ascending=False).reset_index(drop=True)
376
+ model_df = model_df[model_df['roundNumber'].isin(roundlist)].reset_index(drop=True)
377
+ return model_df
378
+
379
  def chart_pxline(data, x, y, color, hover_data=None, x_range=None):
380
  fig = px.line(data, x=x, y=y, color=color, hover_data=hover_data)
381
  fig.update_layout(plot_bgcolor='black', paper_bgcolor='black', font_color='white', height = max_height, margin=dict(l=0, r=10, t=20, b=20))
 
460
  def model_evaluation():
461
  models = []
462
  model_selection = []
463
+ model_dict = model_data_picker_bak(values=[True, True, True, True, True, True])
464
  mean_scale = [-0.05, 0.1]
465
  count_scale = [1, 50]
466
  sharpe_scale = [-0.2, 3]
 
675
  # roundlist = [i for i in range(latest_round_id, latest_round_id-4, -1]
676
 
677
 
678
+ def check_session_state(key):
679
  # st.write(data)
680
+ if key in st.session_state:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
681
  return st.session_state[key]
682
  else:
683
  return None
 
686
  def stake_overview():
687
  models = []
688
  model_selection = []
689
+ model_dict = model_data_picker_bak(values=[True, True, True, True, True, True])
690
  for k in model_dict.keys():
691
  if model_dict[k] not in models:
692
  models += model_dict[k]
 
749
  stake_models = ovdf['model'].tolist()
750
  liveround_stake_df = get_stake_by_liverounds(stake_models)
751
  # st.write(liveround_stake_df)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
752
 
753
+ round_view(liveround_stake_df,'live_round_stake')
 
 
 
 
 
 
 
 
 
 
 
754
 
755
 
756
 
757
+ def app_setting():
758
+ pfm_exp = st.expander('Perormance Data Setting', expanded=True)
759
+ with pfm_exp:
760
+ pfm_default_model= st.checkbox('download data for default model', value=True)
761
 
762
+ stake_exp = st.expander('stake overview data setting', expanded=True)
763
+ if st.button('confirm settiong'):
764
+ st.session_state['pfm_default_model'] = pfm_default_model
 
765
 
 
 
766
 
767
 
768
+ def performance_overview():
769
+ select_app = st.sidebar.selectbox("", list(pfm_opt.keys()), index=0, format_func=lambda x: pfm_opt[x])
770
+ if select_app=='data_op':
771
+ data_operation()
772
 
773
+ if select_app=='performance_overview':
774
+ performance_overview()
775
+ if select_app=='historic_trend':
776
+ histtrend()
777
+ if select_app=='model_evaluation':
778
+ model_evaluation()
779
 
780
 
781
 
782
  def show_content():
783
  st.sidebar.header('Dashboard Selection')
784
+ select_app = st.sidebar.selectbox("", list(app_opt.keys()), index=0, format_func=lambda x: app_opt[x])
785
  if select_app=='performance_overview':
786
  performance_overview()
 
 
 
 
 
 
787
  if select_app=='stake_overview':
788
  stake_overview()
789
+ if select_app=='app_setting':
790
+ app_setting()
 
 
791
 
792
 
793
  # main body
794
  # various configuration setting
795
  app_opt = {
796
  'performance_overview' : 'Performance Overview',
 
 
797
  'stake_overview': 'Stake Overview',
798
+ 'app_setting':''
 
799
  }
800
 
801
+
802
+ pfm_opt = {
803
+ 'data_op': 'Download Score Data',
804
+ 'liveround_view': 'Live Round Overview',
805
+ 'historic_trend': 'Historic Trend',
806
+ 'model_evaluation': 'Model Evaluation',
807
+ }
808
+
809
+
810
+
811
  tbl_opt = {
812
  'round_result':'Round Results',
813
  'dailyscore_metric':'Daily Score Metrics',
 
886
  'all':'Display all available data'
887
  }
888
 
889
+ def show_session_status_info():
890
+ # 'raw_performance_data'
891
+ key1 = 'model_data'
892
+ if check_session_state(key1) is None:
893
+ st.write(f'{key1} is None')
894
+ else:
895
+ st.write(f'{key1} shape is {st.session_state[key1].shape}')
896
+ pass
897
 
898
 
899
 
 
906
 
907
  st.title('Numerai Dashboard')
908
 
909
+ # key = 'pfm_default_model'
910
+ # if check_session_state('pfm_default_model') is None:
911
+ # st.write('set value')
912
+ # st.session_state['pfm_default_model'] = True
913
+ # else:
914
+ # st.write('use set value')
915
+ #
916
+ # st.write(st.session_state)
917
+
918
+ df = get_saved_data()
919
+ show_session_status_info()
920
+ # st.write(f'{key} is {chkval}')
921
+
922
  # trying out multi columns
923
  # col1, col2 = st.columns(2)
924
  # col1.header('col1')
project_tools/numerapi_utils.py CHANGED
@@ -175,6 +175,47 @@ def daily_submissions_performances(username: str) -> List[Dict]:
175
  return performances
176
 
177
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
 
179
 
180
 
 
175
  return performances
176
 
177
 
178
+ def daily_submissions_performances_V3(modelname: str) -> List[Dict]:
179
+ query = """
180
+ query($modelName: String!) {
181
+ v3UserProfile(modelName: $modelName) {
182
+ roundModelPerformances{
183
+ roundNumber
184
+ roundResolveTime
185
+ corr
186
+ corrPercentile
187
+ mmc
188
+ mmcMultiplier
189
+ mmcPercentile
190
+ tc
191
+ tcPercentile
192
+ corrWMetamodel
193
+ payout
194
+ roundResolved
195
+ roundResolveTime
196
+ corrMultiplier
197
+ mmcMultiplier
198
+ selectedStakeValue
199
+ }
200
+ stakeValue
201
+ nmrStaked
202
+ }
203
+ }
204
+ """
205
+ arguments = {'modelName': modelname}
206
+ data = napi.raw_query(query, arguments)['data']['v3UserProfile']
207
+ performances = data['roundModelPerformances']
208
+ # convert strings to python objects
209
+ for perf in performances:
210
+ utils.replace(perf, "date", utils.parse_datetime_string)
211
+ # remove useless items
212
+ performances = [p for p in performances
213
+ if any([p['corr'], p['tc'], p['mmc']])]
214
+ return performances
215
+
216
+
217
+
218
+
219
 
220
 
221
 
project_tools/project_config.py CHANGED
@@ -5,7 +5,19 @@ sys.path.append(os.path.dirname(os.getcwd()))
5
  DATETIME_FORMAT1 = '%Y%m%d%H%M'
6
  DATETIME_FORMAT2 = '%Y/%m/%d %H:%M'
7
  DATETIME_FORMAT3 = '%Y-%m-%d'
 
8
 
 
 
 
 
 
 
 
 
 
 
 
9
  MODEL_NAMES = ['yxbot', 'yxbot2', 'sforest_baihu', 'stree_qinlong', 'flyingbus_mcv6', 'starry_night','fish_and_chips', 'rogue_planet', 'three_body_problem', 'grinning_cat', 'schrodingers_cat', 'omega_weapon', 'ifirit','dark_bahamut', 'wen_score', 'qinlong', 'baihu','marlboro', 'hell_cerberus', 'fuxi', 'roci_fuxi', 'kupo_mcv7', 'yxbot_mcv2', 'yxbot_mcv10']
10
 
11
 
@@ -30,14 +42,6 @@ IAAI_MODELS = ['ia_ai', 'the_aijoe4','i_like_the_coin_08', 'i_like_the_coin_09'
30
 
31
  RESTRADE_MODELS = ['restrading', 'restrading2', 'restrading3', 'restrading4', 'restrading5', 'restrading6', 'restrading7', 'restrading8', 'restrading9']
32
 
33
-
34
- BENCHMARK_MODELS = ['integration_test', 'i_like_the_coin_01'] #'budbot_7'] #'integration_test_7'
35
  MCV_MODELS = ['mcv', 'mcv2', 'mcv3', 'mcv4', 'mcv5','mcv6','mcv7','mcv8','mcv9','mcv10','mcv11','mcv12','mcv13']
36
-
37
  MCV_NEW_MODELS = ['mcv14', 'mcv15', 'mcv16', 'mcv17', 'mcv18', 'mcv19', 'mcv20', 'mcv21', 'mcv22', 'mcv23', 'mcv24', 'mcv25', 'mcv26', 'mcv27', 'mcv28', 'mcv29', 'mcv30', 'mcv31', 'mcv32', 'mcv33', 'mcv34', 'mcv35', 'mcv36', 'mcv37', 'mcv38', 'mcv39', 'mcv40', 'mcv41', 'mcv42', 'mcv43', 'mcv44', 'mcv45', 'mcv46', 'mcv47', 'mcv48', 'mcv49', 'mcv50']
38
 
39
-
40
- DASHBOARD_MODEL_RESULT_FILE = '../feature_data/dashboard_model_result.pkl'
41
- NUMERATI_URL = 'https://raw.githubusercontent.com/woobe/numerati/master/data.csv'
42
- NUMERATI_FILE = '../feature_data/numerati_data.pkl'
43
- FEATURE_PATH = '../feature_data/'
 
5
  DATETIME_FORMAT1 = '%Y%m%d%H%M'
6
  DATETIME_FORMAT2 = '%Y/%m/%d %H:%M'
7
  DATETIME_FORMAT3 = '%Y-%m-%d'
8
+ SAVE_LOCAL_COPY = True
9
 
10
+ BENCHMARK_MODELS = ['integration_test', 'integration_test_7'] #'budbot_7'] #'integration_test_7'
11
+ MODEL_ROUND_RESULT_FILE = '../feature_data/model_round_result.pkl'
12
+ MODEL_DAILY_RESULT_FILE = '../feature_data/model_daily_result.pkl'
13
+
14
+ NUMERATI_URL = 'https://raw.githubusercontent.com/woobe/numerati/master/data.csv'
15
+ NUMERATI_FILE = '../feature_data/numerati_data.pkl'
16
+ FEATURE_PATH = '../feature_data/'
17
+
18
+
19
+
20
+ # to be discarded
21
  MODEL_NAMES = ['yxbot', 'yxbot2', 'sforest_baihu', 'stree_qinlong', 'flyingbus_mcv6', 'starry_night','fish_and_chips', 'rogue_planet', 'three_body_problem', 'grinning_cat', 'schrodingers_cat', 'omega_weapon', 'ifirit','dark_bahamut', 'wen_score', 'qinlong', 'baihu','marlboro', 'hell_cerberus', 'fuxi', 'roci_fuxi', 'kupo_mcv7', 'yxbot_mcv2', 'yxbot_mcv10']
22
 
23
 
 
42
 
43
  RESTRADE_MODELS = ['restrading', 'restrading2', 'restrading3', 'restrading4', 'restrading5', 'restrading6', 'restrading7', 'restrading8', 'restrading9']
44
 
 
 
45
  MCV_MODELS = ['mcv', 'mcv2', 'mcv3', 'mcv4', 'mcv5','mcv6','mcv7','mcv8','mcv9','mcv10','mcv11','mcv12','mcv13']
 
46
  MCV_NEW_MODELS = ['mcv14', 'mcv15', 'mcv16', 'mcv17', 'mcv18', 'mcv19', 'mcv20', 'mcv21', 'mcv22', 'mcv23', 'mcv24', 'mcv25', 'mcv26', 'mcv27', 'mcv28', 'mcv29', 'mcv30', 'mcv31', 'mcv32', 'mcv33', 'mcv34', 'mcv35', 'mcv36', 'mcv37', 'mcv38', 'mcv39', 'mcv40', 'mcv41', 'mcv42', 'mcv43', 'mcv44', 'mcv45', 'mcv46', 'mcv47', 'mcv48', 'mcv49', 'mcv50']
47
 
 
 
 
 
 
project_tools/project_utils.py CHANGED
@@ -660,6 +660,9 @@ def series_reverse_cumsum(a):
660
  return a.fillna(0).values[::-1].cumsum()[::-1]
661
 
662
 
 
 
 
663
 
664
  #### NumerDash specific functions ###
665
 
 
660
  return a.fillna(0).values[::-1].cumsum()[::-1]
661
 
662
 
663
+ def get_array_sharpe(values):
664
+ return values.mean()/values.std()
665
+
666
 
667
  #### NumerDash specific functions ###
668