reddgr commited on
Commit
f885c11
·
1 Parent(s): b821ff2

spider plot enhancement

Browse files
Files changed (1) hide show
  1. src/app_utils.py +81 -2
src/app_utils.py CHANGED
@@ -192,7 +192,7 @@ def spider_plot(df: pd.DataFrame) -> None:
192
 
193
 
194
  # Create a new function in app_utils.py that returns the figure instead of showing it
195
- def get_spider_plot_fig(df: pd.DataFrame):
196
  spider_plot_cols = ['Beta norm.', 'Debt to Equity norm.', '1-year Return norm.', 'Revenue Growth norm.', 'Volatility norm.']
197
  plot_data = df[df['Field'].isin(spider_plot_cols)].set_index('Field')
198
  values = plot_data.loc[spider_plot_cols, 'Value'].fillna(0.5).astype(float).tolist()
@@ -252,4 +252,83 @@ def get_spider_plot_fig(df: pd.DataFrame):
252
  height=500
253
  )
254
 
255
- return fig
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
192
 
193
 
194
  # Create a new function in app_utils.py that returns the figure instead of showing it
195
+ def get_spider_plot_fig_v0(df: pd.DataFrame):
196
  spider_plot_cols = ['Beta norm.', 'Debt to Equity norm.', '1-year Return norm.', 'Revenue Growth norm.', 'Volatility norm.']
197
  plot_data = df[df['Field'].isin(spider_plot_cols)].set_index('Field')
198
  values = plot_data.loc[spider_plot_cols, 'Value'].fillna(0.5).astype(float).tolist()
 
252
  height=500
253
  )
254
 
255
+ return fig
256
+
257
+
258
+ def get_spider_plot_fig(df: pd.DataFrame):
259
+ spider_plot_cols = ['Beta norm.', 'Debt to Equity norm.', '1-year Return norm.', 'Revenue Growth norm.', 'Volatility norm.']
260
+ plot_data = df[df['Field'].isin(spider_plot_cols)].set_index('Field')
261
+ values = plot_data.loc[spider_plot_cols, 'Value'].fillna(0.5).astype(float).tolist()
262
+ metrics_to_invert = ['Debt to Equity norm.', 'Beta norm.', 'Volatility norm.']
263
+ values = [1 - v if col in metrics_to_invert else v for v, col in zip(values, spider_plot_cols)]
264
+
265
+ # Calculate average strength score
266
+ avg_strength = round(np.mean(values) * 100)
267
+
268
+ # Determine color based on score
269
+ if avg_strength < 30:
270
+ profile_color = 'red'
271
+ elif avg_strength < 50:
272
+ profile_color = 'gold'
273
+ elif avg_strength < 70:
274
+ profile_color = 'blue'
275
+ else:
276
+ profile_color = 'green'
277
+
278
+ categories = [s.replace(' norm.', '').replace('1-year', '1yr').replace('Debt to Equity', 'D/E') for s in spider_plot_cols]
279
+ company_name = df.loc[df['Field'] == 'Name', 'Value'].values[0]
280
+ fig = go.Figure()
281
+
282
+ fig.add_trace(go.Scatterpolar(
283
+ r=values + [values[0]],
284
+ theta=categories + [categories[0]],
285
+ fill='toself',
286
+ name='Company Profile',
287
+ line=dict(color=profile_color),
288
+ fillcolor=f'rgba({",".join(["255,0,0,0.2" if profile_color == "red" else "255,215,0,0.2" if profile_color == "gold" else "0,0,255,0.2" if profile_color == "blue" else "0,128,0,0.2"])})'
289
+ ))
290
+
291
+ fig.add_trace(go.Scatterpolar(
292
+ r=[0.5] * len(categories) + [0.5],
293
+ theta=categories + [categories[0]],
294
+ mode='lines',
295
+ line=dict(dash='dot', color='grey'),
296
+ fill='toself',
297
+ fillcolor='rgba(0,0,0,0)',
298
+ name='Median (0.5)'
299
+ ))
300
+
301
+ legend_text = (
302
+ f"<b>Avg. strength: {avg_strength}</b><br>"
303
+ "<b>Quantile Scale: 0 to 1</b><br>"
304
+ "D/E, Beta, and Volatility:<br>"
305
+ "0 is highest, 1 is lowest<br>"
306
+ "Rev. growth and 1yr return:<br>"
307
+ "0 is lowest, 1 is highest<br>"
308
+ )
309
+
310
+ fig.update_layout(
311
+ polar=dict(
312
+ radialaxis=dict(
313
+ visible=True,
314
+ range=[0, 1]
315
+ )),
316
+ showlegend=True,
317
+ title=f'{company_name} - Normalized Metrics',
318
+ annotations=[
319
+ go.layout.Annotation(
320
+ text=legend_text,
321
+ align='right',
322
+ showarrow=False,
323
+ xref='paper',
324
+ yref='paper',
325
+ x=1.41,
326
+ y=-0.1
327
+ )
328
+ ],
329
+ margin=dict(b=120),
330
+ width=600,
331
+ height=500
332
+ )
333
+
334
+ return fig