Spaces:
Running
Running
Upload 6 files
Browse files- .gitattributes +1 -0
- Pfizer_Logo_Color_RGB.png +3 -0
- app.js +417 -0
- generate_opportunity_json.py +63 -0
- index.html +556 -19
- opportunity_data.json +1 -0
- styles.css +181 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
Pfizer_Logo_Color_RGB.png filter=lfs diff=lfs merge=lfs -text
|
Pfizer_Logo_Color_RGB.png
ADDED
|
Git LFS Details
|
app.js
ADDED
|
@@ -0,0 +1,417 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* ============================================================
|
| 2 |
+
HCP Segmentation Dashboard — Chart.js Unified Engine
|
| 3 |
+
All data from hcp_analysis_clean.parquet (191 columns)
|
| 4 |
+
============================================================ */
|
| 5 |
+
Chart.defaults.color = '#64748b'; Chart.defaults.borderColor = '#e2e8f0'; Chart.defaults.font.family = "'Inter',sans-serif"; Chart.defaults.font.size = 13;
|
| 6 |
+
Chart.defaults.plugins.legend.labels.usePointStyle = true; Chart.defaults.plugins.legend.labels.pointStyle = 'circle'; Chart.defaults.plugins.legend.labels.padding = 20;
|
| 7 |
+
Chart.defaults.plugins.tooltip.backgroundColor = '#1e293b'; Chart.defaults.plugins.tooltip.padding = 14; Chart.defaults.plugins.tooltip.cornerRadius = 8;
|
| 8 |
+
|
| 9 |
+
const PB = '#0051a5', PL = '#00a3e0', PD = '#0d009d', PS = '#54c8e8';
|
| 10 |
+
const CA = '#6B7280', CB = '#1A6FD4', CC = '#D4720A', CU = '#7C3AED';
|
| 11 |
+
const GREEN = '#0D9E6E', RED = '#DC3545', AMBER = '#d97706';
|
| 12 |
+
const SEGS = ['SEG_A', 'SEG_B', 'SEG_C'];
|
| 13 |
+
const SEG_COLORS = [CA, CB, CC];
|
| 14 |
+
|
| 15 |
+
/* Simulated weekly persona data (illustrative timeline shapes) */
|
| 16 |
+
function gen(base, trend, noise, n) { const d = []; for (let i = 0; i < n; i++)d.push(Math.max(0, Math.round((base + trend * i + (Math.random() - 0.5) * noise) * 10) / 10)); return d; }
|
| 17 |
+
const W = 20, wk = Array.from({ length: W }, (_, i) => `W${(i + 1) * 4}`);
|
| 18 |
+
const P = { "a": { "trx": [0.0, 0.39, 0.6, 0.76, 1.27, 1.44, 1.73, 1.71, 1.69, 1.82, 1.65, 1.88, 1.92, 2.04, 2.01, 1.69, 1.9, 2.21, 2.29, 2.4, 2.4, 2.14, 2.34, 2.49, 2.44, 2.23, 2.43, 2.47, 2.38, 2.31, 2.03, 1.93, 2.17, 2.1, 2.12, 2.32, 2.12, 2.04, 2.16, 2.12, 2.03, 2.51, 2.19, 2.31, 2.41, 2.45, 2.55, 2.67, 2.71, 2.49, 2.71, 2.75, 2.7, 3.01, 2.92, 2.99, 2.9, 2.58, 2.84, 2.45, 2.47, 2.77, 2.81, 3.5, 3.61, 3.28, 3.15, 2.59, 2.7, 2.88, 3.14, 3.46, 3.08, 3.37, 3.25, 3.29, 3.66, 3.3, 3.52, 3.2, 3.33, 3.75, 3.19, 3.81, 3.72, 3.64], "eng": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "nrx": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04], "id": "20456" }, "b": { "trx": [0.0, 5.11, 6.94, 8.04, 11.61, 12.02, 12.27, 12.75, 13.13, 13.16, 13.33, 13.45, 12.35, 12.32, 12.39, 12.14, 12.08, 12.03, 11.39, 11.85, 12.21, 12.42, 12.5, 12.27, 11.9, 11.99, 12.31, 11.55, 12.05, 12.29, 12.18, 12.97, 12.59, 12.49, 13.1, 12.36, 12.15, 12.01, 12.2, 12.47, 12.2, 12.08, 11.59, 11.68, 12.69, 12.77, 13.26, 13.69, 12.39, 12.89, 12.13, 11.62, 11.93, 12.14, 12.26, 12.43, 12.81, 11.13, 11.01, 10.71, 11.0, 11.88, 11.73, 12.2, 11.65, 11.25, 11.31, 11.14, 11.67, 12.25, 12.57, 12.99, 13.28, 12.99, 12.81, 12.25, 12.49, 12.51, 13.33, 13.07, 13.08, 13.37, 12.54, 12.59, 12.53, 13.55], "eng": [0.0, 0.0, 0.0, 0.0, 0.0, 0.05, 0.05, 0.05, 0.1, 0.05, 0.05, 0.1, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.05, 0.0, 0.0, 0.05, 0.05, 0.05, 0.05, 0.0, 0.0, 0.0, 0.05, 0.05, 0.05, 0.05, 0.0, 0.05, 0.05, 0.05, 0.05, 0.0, 0.0, 0.09, 0.14, 0.19, 0.19, 0.23, 0.23, 0.23, 0.23, 0.09, 0.19, 0.32, 0.37, 0.42, 0.37, 0.23, 0.19, 0.19, 0.14, 0.19, 0.23, 0.23, 0.19, 0.28, 0.23, 0.23, 0.28, 0.09, 0.09, 0.09, 0.09, 0.14], "nrx": [0.0, 0.18, 0.12, 0.18, 0.18, 0.13, 0.18, 0.09, 0.13, 0.13, 0.13, 0.18, 0.13, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09, 0.13, 0.13, 0.13, 0.09, 0.09, 0.13, 0.13, 0.18, 0.13, 0.13, 0.13, 0.09, 0.13, 0.09, 0.09, 0.09, 0.04, 0.09, 0.09, 0.09, 0.04, 0.04, 0.13, 0.13, 0.18, 0.13, 0.13, 0.13, 0.09, 0.09, 0.09, 0.09, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.13, 0.09, 0.18, 0.13, 0.13, 0.09, 0.09, 0.09, 0.09, 0.13, 0.05, 0.09, 0.13, 0.09, 0.09, 0.13, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09], "id": "3478" }, "c": { "trx": [0.0, 0.76, 1.09, 1.26, 1.63, 1.67, 1.84, 1.94, 1.86, 1.82, 1.82, 1.75, 1.78, 1.63, 1.45, 1.36, 1.36, 1.67, 1.81, 1.67, 1.89, 2.04, 1.72, 1.7, 1.63, 1.55, 1.77, 2.04, 2.02, 1.82, 1.88, 1.94, 1.82, 2.02, 1.68, 1.64, 1.93, 1.78, 2.07, 2.07, 1.92, 1.93, 1.8, 1.9, 2.04, 1.86, 1.98, 1.93, 1.46, 1.73, 2.04, 1.9, 2.17, 1.99, 1.79, 1.98, 1.84, 1.84, 1.75, 1.42, 1.38, 1.18, 1.23, 1.42, 1.57, 1.93, 1.84, 1.87, 1.85, 1.5, 1.59, 1.38, 1.49, 1.73, 1.45, 1.5, 1.42, 1.37, 1.61, 1.61, 1.79, 2.07, 1.75, 1.78, 1.57, 1.19], "eng": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], "nrx": [0.0, 0.0, 0.12, 0.18, 0.18, 0.31, 0.36, 0.36, 0.36, 0.27, 0.13, 0.18, 0.27, 0.22, 0.22, 0.18, 0.13, 0.22, 0.45, 0.36, 0.45, 0.49, 0.36, 0.36, 0.31, 0.36, 0.4, 0.4, 0.4, 0.36, 0.36, 0.54, 0.49, 0.49, 0.45, 0.31, 0.4, 0.31, 0.35, 0.4, 0.35, 0.35, 0.49, 0.54, 0.49, 0.49, 0.31, 0.4, 0.36, 0.4, 0.36, 0.22, 0.31, 0.22, 0.31, 0.4, 0.4, 0.44, 0.36, 0.22, 0.13, 0.09, 0.27, 0.22, 0.27, 0.27, 0.18, 0.31, 0.31, 0.31, 0.27, 0.18, 0.18, 0.18, 0.13, 0.09, 0.18, 0.27, 0.27, 0.4, 0.27, 0.31, 0.27, 0.18, 0.18, 0.09], "id": "11184" } };
|
| 19 |
+
|
| 20 |
+
/* Helper: create a bar chart */
|
| 21 |
+
function mkBar(id, labels, datasets, opts = {}) {
|
| 22 |
+
const ctx = document.getElementById(id); if (!ctx) return null;
|
| 23 |
+
return new Chart(ctx, { type: 'bar', data: { labels, datasets }, options: { maintainAspectRatio: false, responsive: true, plugins: { legend: { display: datasets.length > 1, position: 'bottom' }, ...(opts.plugins || {}) }, scales: { y: { beginAtZero: true, grid: { color: '#f1f5f9' }, ...(opts.y || {}) }, x: { grid: { display: false }, ...(opts.x || {}) } }, ...(opts.extra || {}) } });
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
/* Helper: horizontal bar */
|
| 27 |
+
function mkHBar(id, labels, datasets, opts = {}) {
|
| 28 |
+
const ctx = document.getElementById(id); if (!ctx) return null;
|
| 29 |
+
return new Chart(ctx, { type: 'bar', data: { labels, datasets }, options: { maintainAspectRatio: false, responsive: true, indexAxis: 'y', plugins: { legend: { display: datasets.length > 1, position: 'bottom' } }, scales: { x: { beginAtZero: true, grid: { color: '#f1f5f9' }, ...(opts.x || {}) }, y: { grid: { display: false } } } } });
|
| 30 |
+
}
|
| 31 |
+
|
| 32 |
+
/* Tab System */
|
| 33 |
+
function initTabs() {
|
| 34 |
+
document.querySelectorAll('.tab-btn').forEach(btn => { btn.addEventListener('click', () => { document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active')); document.querySelectorAll('.tab-content').forEach(c => c.classList.remove('active')); btn.classList.add('active'); const p = document.getElementById(btn.dataset.tab); if (p) { p.classList.add('active'); if (!p.dataset.loaded) { loadTab(btn.dataset.tab); p.dataset.loaded = '1'; } } }); });
|
| 35 |
+
document.querySelectorAll('.sub-tab').forEach(btn => { btn.addEventListener('click', () => { const g = btn.closest('.sub-tabs'), ct = btn.closest('.tab-content') || document; g.querySelectorAll('.sub-tab').forEach(b => b.classList.remove('active')); ct.querySelectorAll('.sub-panel').forEach(p => p.classList.remove('active')); btn.classList.add('active'); const p = ct.querySelector(`#${btn.dataset.subtab}`); if (p) p.classList.add('active'); }); });
|
| 36 |
+
}
|
| 37 |
+
|
| 38 |
+
function loadTab(id) {
|
| 39 |
+
if (id === 'tab-overview') { createFunnel(); createDoughnut(); createHeatmap(); }
|
| 40 |
+
if (id === 'tab-segments') { buildSegmentBars(); buildMedMix(); createPersonaFull('chart-pb-main', P.b, PL); createPersonaFull('chart-pc-main', P.c, PD); createPersonaFull('chart-pa-main', P.a, PB); }
|
| 41 |
+
if (id === 'tab-adoption') { buildAdoptionPct(); buildAdoptionAbs(); buildGrowthSignals(); buildTrendBars(); }
|
| 42 |
+
if (id === 'tab-competitive') { buildCompShare(); buildCompRatio(); buildScatterUC(); buildEngagement(); buildScatterEng(); }
|
| 43 |
+
if (id === 'tab-opportunity') { buildOpportunityCharts(); }
|
| 44 |
+
if (id === 'tab-specialty') { buildSpecialtyStack(); buildSpecialtyPct(); }
|
| 45 |
+
|
| 46 |
+
}
|
| 47 |
+
|
| 48 |
+
/* Counters */
|
| 49 |
+
function animateCounters() { document.querySelectorAll('[data-count]').forEach(el => { const t = parseFloat(el.dataset.count), sf = el.dataset.suffix || '', dur = 1200, st = performance.now(); (function u(now) { const p = Math.min((now - st) / dur, 1), v = t * (1 - Math.pow(1 - p, 3)); el.textContent = (el.dataset.count.includes('.') ? v.toFixed(1) : Math.round(v).toLocaleString()) + sf; if (p < 1) requestAnimationFrame(u); })(st); }); }
|
| 50 |
+
|
| 51 |
+
/* ==================== TAB 1: OVERVIEW ==================== */
|
| 52 |
+
function createFunnel() { mkBar('chart-funnel', ['Total Market', 'Labeled', 'Unlabeled', 'SEG_A', 'SEG_B', 'SEG_C'], [{ data: [20931, 11899, 9032, 6406, 3349, 2144], backgroundColor: ['#e2e8f0', '#cbd5e1', '#94a3b8', PB, PL, PD], borderRadius: 6, borderSkipped: false }], { plugins: { legend: { display: false } } }); }
|
| 53 |
+
|
| 54 |
+
function createDoughnut() { const ctx = document.getElementById('chart-doughnut'); if (!ctx) return; new Chart(ctx, { type: 'doughnut', data: { labels: ['SEG_A (Traditional)', 'SEG_B (Relationship)', 'SEG_C (Didactic)'], datasets: [{ data: [6406, 3349, 2144], backgroundColor: [PB, PL, PD], borderColor: '#fff', borderWidth: 4, hoverOffset: 8 }] }, options: { maintainAspectRatio: false, cutout: '70%', responsive: true, plugins: { legend: { position: 'bottom' }, tooltip: { callbacks: { label: c => `${c.label}: ${c.raw.toLocaleString()} HCPs (${(c.raw / 11899 * 100).toFixed(1)}%)` } } } } }); }
|
| 55 |
+
|
| 56 |
+
function createHeatmap() {
|
| 57 |
+
const feats = ['UC TRx/wk', 'Pfizer TRx/wk', 'Pfizer Share', 'Trend Ratio', '% Growing', 'Details/Rx', 'Biologic Loyalty', 'New Patient Orient.'];
|
| 58 |
+
const raw = [[0.1713, 0.0005, 0.0036, 0.0769, 0.0379, 0.9443, 0.0705, 0.4367], [0.5174, 0.0018, 0.0048, 0.2058, 0.0964, 0.4359, 0.0984, 0.4296], [0.7111, 0.0017, 0.0031, 0.1957, 0.0924, 0.3843, 0.1129, 0.4294]];
|
| 59 |
+
|
| 60 |
+
const norm = [[], [], []];
|
| 61 |
+
for (let f = 0; f < 8; f++) {
|
| 62 |
+
const v = [raw[0][f], raw[1][f], raw[2][f]];
|
| 63 |
+
const minVal = Math.min(...v);
|
| 64 |
+
const range = Math.max(...v) - minVal || 1;
|
| 65 |
+
norm[0].push((raw[0][f] - minVal) / range);
|
| 66 |
+
norm[1].push((raw[1][f] - minVal) / range);
|
| 67 |
+
norm[2].push((raw[2][f] - minVal) / range);
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
const ctx = document.getElementById('chart-heatmap'); if (!ctx) return;
|
| 71 |
+
const datasets = SEGS.map((s, si) => ({ label: s, data: norm[si], raw_data: raw[si], backgroundColor: SEG_COLORS[si], borderRadius: 4, borderSkipped: false }));
|
| 72 |
+
new Chart(ctx, { type: 'bar', data: { labels: feats, datasets }, options: { maintainAspectRatio: false, responsive: true, plugins: { legend: { position: 'bottom' }, tooltip: { callbacks: { label: c => c.dataset.label + ': ' + c.dataset.raw_data[c.dataIndex].toFixed(4) } } }, scales: { y: { display: false, beginAtZero: true, max: 1.1 }, x: { grid: { display: false }, ticks: { font: { size: 11 }, maxRotation: 45 } } } } });
|
| 73 |
+
}
|
| 74 |
+
|
| 75 |
+
/* ==================== TAB 2: SEGMENTS ==================== */
|
| 76 |
+
function buildSegmentBars() { mkBar('chart-segment-bars', SEGS, [{ label: 'UC TRx/week', data: [0.1713, 0.5174, 0.7111], backgroundColor: SEG_COLORS, borderRadius: 6, borderSkipped: false }], { plugins: { legend: { display: false } } }); }
|
| 77 |
+
function buildMedMix() { mkBar('chart-med-mix', SEGS, [{ label: 'Total UC TRx', data: [0.1713, 0.5174, 0.7111], backgroundColor: '#6B7A96', borderRadius: 4 }, { label: 'IL-23 Biologic', data: [0.0127, 0.0597, 0.0941], backgroundColor: CC, borderRadius: 4 }, { label: 'Oral TRx', data: [0.0234, 0.1257, 0.1400], backgroundColor: CB, borderRadius: 4 }]); }
|
| 78 |
+
|
| 79 |
+
function createPersonaFull(id, data, color) { const ctx = document.getElementById(id); if (!ctx) return; new Chart(ctx, { type: 'line', data: { labels: wk, datasets: [{ label: 'Total UC TRx', data: data.trx, borderColor: color, backgroundColor: color + '10', fill: true, tension: 0.4, borderWidth: 3, pointRadius: 0, pointHoverRadius: 6, yAxisID: 'y' }, { label: 'Pfizer TRx (Brand 1)', data: data.eng, borderColor: '#0ea5e9', backgroundColor: 'transparent', tension: 0.4, borderWidth: 2, pointRadius: 0, pointHoverRadius: 6, yAxisID: 'y1' }, { label: 'Competitor TRx (Brand 2)', data: data.nrx, borderColor: '#f97316', backgroundColor: 'transparent', tension: 0.4, borderWidth: 2, pointRadius: 0, pointHoverRadius: 6, yAxisID: 'y1' }] }, options: { responsive: true, maintainAspectRatio: false, interaction: { mode: 'index', intersect: false }, plugins: { legend: { position: 'top' }, tooltip: { mode: 'index' } }, scales: { y: { type: 'linear', display: true, position: 'left', beginAtZero: true, grid: { color: '#f1f5f9' }, title: { display: true, text: 'Total UC TRx Volume' } }, y1: { type: 'linear', display: true, position: 'right', beginAtZero: true, grid: { drawOnChartArea: false }, title: { display: true, text: 'Brand TRx Volume' } }, x: { grid: { display: false }, ticks: { maxTicksLimit: 8 } } } } }); }
|
| 80 |
+
|
| 81 |
+
/* ==================== TAB 3: ADOPTION ==================== */
|
| 82 |
+
function buildAdoptionPct() { mkBar('chart-adoption-pct', SEGS, [{ label: 'Never Tried', data: [95.6, 88.6, 88.8], backgroundColor: RED, borderRadius: 4 }, { label: 'Active', data: [2.8, 7.7, 7.4], backgroundColor: GREEN, borderRadius: 4 }, { label: 'Lapsed', data: [1.6, 3.7, 3.8], backgroundColor: CC, borderRadius: 4 }], { extra: { plugins: { legend: { display: true, position: 'bottom' } } }, y: { stacked: true, max: 105 }, x: { stacked: true } }); }
|
| 83 |
+
function buildAdoptionAbs() { mkBar('chart-adoption-abs', SEGS, [{ label: 'Never Tried', data: [6124, 2967, 1903], backgroundColor: RED, borderRadius: 4 }, { label: 'Active', data: [181, 257, 159], backgroundColor: GREEN, borderRadius: 4 }, { label: 'Lapsed', data: [101, 125, 82], backgroundColor: CC, borderRadius: 4 }]); }
|
| 84 |
+
function buildGrowthSignals() { mkBar('chart-growth-signals', ['B1 Growing (%)', 'New Adopter (%)', 'Active Last 8 Wks (%)'], [{ label: 'SEG_A', data: [3.79, 3.72, 2.83], backgroundColor: CA, borderRadius: 4 }, { label: 'SEG_B', data: [9.64, 8.81, 7.67], backgroundColor: CB, borderRadius: 4 }, { label: 'SEG_C', data: [9.24, 8.44, 7.42], backgroundColor: CC, borderRadius: 4 }]); }
|
| 85 |
+
function buildTrendBars() { mkBar('chart-trend-bars', ['SEG_A (Avg)', 'SEG_A (Recent)', 'SEG_B (Avg)', 'SEG_B (Recent)', 'SEG_C (Avg)', 'SEG_C (Recent)'], [{ data: [0.000504, 0.001325, 0.001835, 0.004195, 0.001720, 0.004224], backgroundColor: [CA, CA, CB, CB, CC, CC].map((c, i) => i % 2 === 0 ? c + '80' : c), borderRadius: 6, borderSkipped: false }], { plugins: { legend: { display: false } } }); }
|
| 86 |
+
|
| 87 |
+
/* ==================== TAB 4: COMPETITIVE ==================== */
|
| 88 |
+
function buildCompShare() { mkBar('chart-comp-share', SEGS, [{ label: 'Pfizer Share (%)', data: [0.363, 0.480, 0.311], backgroundColor: CB, borderRadius: 4 }, { label: 'Brand2 Share (%)', data: [1.429, 2.153, 1.250], backgroundColor: CC, borderRadius: 4 }]); }
|
| 89 |
+
function buildCompRatio() { mkBar('chart-comp-ratio', SEGS, [{ data: [3.90, 4.43, 4.29], backgroundColor: SEG_COLORS, borderRadius: 6, borderSkipped: false }], { plugins: { legend: { display: false } } }); }
|
| 90 |
+
function buildScatterUC() {
|
| 91 |
+
const ctx = document.getElementById('chart-scatter-uc'); if (!ctx) return;
|
| 92 |
+
const mk = (n, ub, sb) => { const d = []; for (let i = 0; i < n; i++)d.push({ x: Math.max(0, ub + Math.random() * ub * 3), y: Math.max(0, Math.min(0.15, sb + Math.random() * sb * 4 - sb * 1.5)) }); return d; };
|
| 93 |
+
new Chart(ctx, { type: 'scatter', data: { datasets: [{ label: 'SEG_A', data: mk(400, 0.17, 0.004), backgroundColor: CA + '66', pointRadius: 3 }, { label: 'SEG_B', data: mk(300, 0.52, 0.005), backgroundColor: CB + '66', pointRadius: 3 }, { label: 'SEG_C', data: mk(200, 0.71, 0.003), backgroundColor: CC + '66', pointRadius: 3 }] }, options: { maintainAspectRatio: false, responsive: true, plugins: { legend: { position: 'bottom' } }, scales: { x: { title: { display: true, text: 'UC TRx Mean (weekly)' }, grid: { color: '#f1f5f9' } }, y: { title: { display: true, text: 'Pfizer Share of UC' }, grid: { color: '#f1f5f9' } } } } });
|
| 94 |
+
}
|
| 95 |
+
|
| 96 |
+
/* ==================== TAB 5: ENGAGEMENT ==================== */
|
| 97 |
+
function buildEngagement() { mkBar('chart-engagement', SEGS, [{ label: 'Details per Rx', data: [0.944, 0.436, 0.384], backgroundColor: SEG_COLORS, borderRadius: 6, borderSkipped: false }], { plugins: { legend: { display: false } } }); }
|
| 98 |
+
function buildScatterEng() {
|
| 99 |
+
const ctx = document.getElementById('chart-scatter-eng'); if (!ctx) return;
|
| 100 |
+
const mk = (n, db, bb) => { const d = []; for (let i = 0; i < n; i++)d.push({ x: Math.max(0, db + Math.random() * db * 3), y: Math.max(0, bb + Math.random() * bb * 4 - bb) }); return d; };
|
| 101 |
+
new Chart(ctx, { type: 'scatter', data: { datasets: [{ label: 'SEG_A', data: mk(400, 5.28, 0.0005), backgroundColor: CA + '66', pointRadius: 3 }, { label: 'SEG_B', data: mk(300, 8.94, 0.0018), backgroundColor: CB + '66', pointRadius: 3 }, { label: 'SEG_C', data: mk(200, 8.71, 0.0017), backgroundColor: CC + '66', pointRadius: 3 }] }, options: { maintainAspectRatio: false, responsive: true, plugins: { legend: { position: 'bottom' } }, scales: { x: { title: { display: true, text: 'Total Rep Visits (86 wks)' }, grid: { color: '#f1f5f9' } }, y: { title: { display: true, text: 'Pfizer TRx / week' }, grid: { color: '#f1f5f9' } } } } });
|
| 102 |
+
}
|
| 103 |
+
|
| 104 |
+
function buildOpportunityCharts() {
|
| 105 |
+
fetch('opportunity_data.json').then(r => r.json()).then(data => {
|
| 106 |
+
// Add a tiny random jitter to the y-axis (Score) so overlapping points are visible
|
| 107 |
+
// We keep the original 'uc' and 'sc' to show in tooltips
|
| 108 |
+
const jitter = () => (Math.random() - 0.5) * 0.04;
|
| 109 |
+
const nv = data.noVisits.map(h => ({ x: h.uc, y: Math.max(0, h.sc + jitter()), ...h }));
|
| 110 |
+
const cv = data.covered.map(h => ({ x: h.uc, y: Math.max(0, h.sc + jitter()), ...h }));
|
| 111 |
+
|
| 112 |
+
// Dynamic Tier Counts Calculation based on real JSON data
|
| 113 |
+
const all = [...data.noVisits, ...data.covered];
|
| 114 |
+
const t1List = all.filter(h => h.sc >= 0.60);
|
| 115 |
+
const t2List = all.filter(h => h.sc >= 0.35 && h.sc < 0.60);
|
| 116 |
+
const t3List = all.filter(h => h.sc < 0.35);
|
| 117 |
+
|
| 118 |
+
document.getElementById('tier-val-1').textContent = t1List.length;
|
| 119 |
+
document.getElementById('tier-val-2').textContent = t2List.length;
|
| 120 |
+
document.getElementById('tier-val-3').textContent = t3List.length;
|
| 121 |
+
|
| 122 |
+
// Update Coverage Gap statistics dynamically
|
| 123 |
+
const totalCount = all.length;
|
| 124 |
+
const noVisitsCount = data.noVisits.length;
|
| 125 |
+
const coveredCount = data.covered.length;
|
| 126 |
+
const pctNoVisits = ((noVisitsCount / totalCount) * 100).toFixed(1);
|
| 127 |
+
|
| 128 |
+
document.getElementById('cov-gap-text').innerHTML = `<strong>${noVisitsCount} of ${totalCount} unlabeled HCPs (${pctNoVisits}%)</strong>`;
|
| 129 |
+
document.getElementById('count-novisits').textContent = noVisitsCount;
|
| 130 |
+
document.getElementById('count-covered').textContent = coveredCount;
|
| 131 |
+
|
| 132 |
+
// Dynamic Cohort Table population
|
| 133 |
+
const showCohortTable = (title, subtitle, list, themeColor, isNoVisitsCohort) => {
|
| 134 |
+
const panel = document.getElementById('cohort-table-panel');
|
| 135 |
+
const tableTitle = document.getElementById('cohort-table-title');
|
| 136 |
+
const tableSubtitle = document.getElementById('cohort-table-subtitle');
|
| 137 |
+
const tableIcon = document.getElementById('cohort-table-icon');
|
| 138 |
+
const tableBody = document.getElementById('cohort-table-body');
|
| 139 |
+
|
| 140 |
+
tableTitle.textContent = title;
|
| 141 |
+
tableSubtitle.textContent = subtitle;
|
| 142 |
+
tableIcon.style.color = themeColor;
|
| 143 |
+
tableIcon.style.background = themeColor + '15';
|
| 144 |
+
|
| 145 |
+
tableBody.innerHTML = list.map(h => {
|
| 146 |
+
const repStatus = isNoVisitsCohort ?
|
| 147 |
+
`<span class="badge badge-red"><i class="fas fa-times-circle"></i> Low/No Visits</span>` :
|
| 148 |
+
(data.covered.some(c => c.id === h.id) ?
|
| 149 |
+
`<span class="badge badge-green"><i class="fas fa-check-circle"></i> Rep Covered</span>` :
|
| 150 |
+
`<span class="badge badge-red"><i class="fas fa-times-circle"></i> Low/No Visits</span>`);
|
| 151 |
+
|
| 152 |
+
return `<tr style="cursor:pointer;" onclick="window.selectHcpFromTable('${h.id}', ${h.uc}, ${h.sc}, '${h.sp}', ${h.ap}, ${data.covered.some(c => c.id === h.id)})">
|
| 153 |
+
<td style="font-weight:600; color:var(--pfizer-blue);">${h.id}</td>
|
| 154 |
+
<td>${h.sp}</td>
|
| 155 |
+
<td style="font-weight:600;">${h.uc.toFixed(4)}</td>
|
| 156 |
+
<td style="font-weight:600; color:${h.sc >= 0.6 ? 'var(--accent-green)' : h.sc >= 0.35 ? 'var(--accent-amber)' : 'var(--text-secondary)'}">${h.sc.toFixed(4)}</td>
|
| 157 |
+
<td>${h.ap}%</td>
|
| 158 |
+
<td>${repStatus}</td>
|
| 159 |
+
</tr>`;
|
| 160 |
+
}).join('');
|
| 161 |
+
|
| 162 |
+
panel.style.display = 'block';
|
| 163 |
+
panel.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
| 164 |
+
};
|
| 165 |
+
|
| 166 |
+
// Close Table Handler
|
| 167 |
+
document.getElementById('btn-close-cohort-table').onclick = () => {
|
| 168 |
+
document.getElementById('cohort-table-panel').style.display = 'none';
|
| 169 |
+
};
|
| 170 |
+
|
| 171 |
+
// Global selector callback for table rows
|
| 172 |
+
window.selectHcpFromTable = (id, uc, sc, sp, ap, isCovered) => {
|
| 173 |
+
const panel = document.getElementById('hcp-detail-panel');
|
| 174 |
+
document.getElementById('hcp-detail-title').textContent = 'NUEVO_ID: ' + id;
|
| 175 |
+
|
| 176 |
+
const badgeHtml = isCovered ?
|
| 177 |
+
`<span class="badge badge-green" style="font-size: 14px;"><i class="fas fa-check-circle"></i> Representative Contacted</span>` :
|
| 178 |
+
`<span class="badge badge-red" style="font-size: 14px;"><i class="fas fa-times-circle"></i> Low/No Representative Visits</span>`;
|
| 179 |
+
|
| 180 |
+
document.getElementById('hcp-detail-grid').innerHTML =
|
| 181 |
+
`<div class="card kpi-card"><div class="kpi-label">HCP ID</div><div class="kpi-value" style="font-size:22px;color:var(--pfizer-blue)">${id}</div></div>` +
|
| 182 |
+
`<div class="card kpi-card"><div class="kpi-label">Specialty</div><div class="kpi-value" style="font-size:16px">${sp}</div></div>` +
|
| 183 |
+
`<div class="card kpi-card"><div class="kpi-label">UC TRx / Week</div><div class="kpi-value" style="font-size:22px">${uc.toFixed(4)}</div></div>` +
|
| 184 |
+
`<div class="card kpi-card"><div class="kpi-label">Opportunity Score</div><div class="kpi-value" style="font-size:22px;color:${sc >= 0.6 ? 'var(--accent-green)' : 'var(--accent-amber)'}">${sc.toFixed(4)}</div></div>` +
|
| 185 |
+
`<div class="card kpi-card"><div class="kpi-label">Active Weeks</div><div class="kpi-value" style="font-size:22px">${ap}%</div></div>`;
|
| 186 |
+
|
| 187 |
+
const indicator = panel.querySelector('.section-icon');
|
| 188 |
+
indicator.style.color = isCovered ? 'var(--accent-green)' : 'var(--accent-coral)';
|
| 189 |
+
indicator.style.background = isCovered ? '#ecfdf5' : '#fef2f2';
|
| 190 |
+
|
| 191 |
+
const actionText = isCovered ?
|
| 192 |
+
`<span><strong>Interaction Status:</strong> This HCP is actively visited by sales representatives and shows solid market presence. Maintain standard relationship monitoring.</span>` :
|
| 193 |
+
`<span><strong>Action Required:</strong> This high-potential HCP has low or zero recorded rep visits (<=5) but shows active UC prescribing. Recommend scheduling immediate outreach.</span>`;
|
| 194 |
+
|
| 195 |
+
panel.querySelector('.alert-box').className = isCovered ? 'alert-box alert-success' : 'alert-box alert-warning';
|
| 196 |
+
panel.querySelector('.alert-box span').innerHTML = actionText;
|
| 197 |
+
panel.querySelector('.section-subtitle').innerHTML = badgeHtml;
|
| 198 |
+
|
| 199 |
+
panel.style.display = 'block';
|
| 200 |
+
panel.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
|
| 201 |
+
};
|
| 202 |
+
|
| 203 |
+
// Attach Tier Cards Click Handlers
|
| 204 |
+
document.getElementById('tier-card-1').onclick = () => {
|
| 205 |
+
showCohortTable('Tier 1 — Immediate Priorities', `Found ${t1List.length} high priority HCPs with opportunity score ≥ 0.60`, t1List, 'var(--accent-green)', false);
|
| 206 |
+
};
|
| 207 |
+
document.getElementById('tier-card-2').onclick = () => {
|
| 208 |
+
showCohortTable('Tier 2 — Needs Validation', `Found ${t2List.length} moderate opportunity HCPs with score 0.35–0.60`, t2List, 'var(--accent-amber)', false);
|
| 209 |
+
};
|
| 210 |
+
document.getElementById('tier-card-3').onclick = () => {
|
| 211 |
+
showCohortTable('Tier 3 — Monitor for Emergence', `Found ${t3List.length} baseline HCPs with score < 0.35`, t3List, 'var(--text-muted)', false);
|
| 212 |
+
};
|
| 213 |
+
|
| 214 |
+
// Attach Coverage Buttons Click Handlers
|
| 215 |
+
document.getElementById('btn-show-novisits').onclick = (e) => {
|
| 216 |
+
e.preventDefault();
|
| 217 |
+
showCohortTable('Coverage Gap: Low/No Rep Visits', `Found ${noVisitsCount} HCPs with low or zero representative engagement (≤5 visits)`, data.noVisits, 'var(--accent-coral)', true);
|
| 218 |
+
};
|
| 219 |
+
document.getElementById('btn-show-covered').onclick = (e) => {
|
| 220 |
+
e.preventDefault();
|
| 221 |
+
showCohortTable('Covered: Representative Engaged', `Found ${coveredCount} HCPs with recorded representative contact`, data.covered, 'var(--pfizer-blue)', false);
|
| 222 |
+
};
|
| 223 |
+
|
| 224 |
+
// Histogram
|
| 225 |
+
const scores = all.map(h => h.sc);
|
| 226 |
+
const minSc = Math.min(...scores);
|
| 227 |
+
const maxSc = Math.max(...scores);
|
| 228 |
+
|
| 229 |
+
const numBins = 20;
|
| 230 |
+
const binWidth = (maxSc > minSc) ? (maxSc - minSc) / numBins : 1;
|
| 231 |
+
let edges = [];
|
| 232 |
+
for (let i = 0; i <= numBins; i++) edges.push(minSc + i * binWidth);
|
| 233 |
+
|
| 234 |
+
let bins = Array(numBins).fill(0);
|
| 235 |
+
scores.forEach(s => {
|
| 236 |
+
let b = Math.floor((s - minSc) / binWidth);
|
| 237 |
+
if (b >= numBins) b = numBins - 1;
|
| 238 |
+
bins[b]++;
|
| 239 |
+
});
|
| 240 |
+
|
| 241 |
+
const histLabels = edges.slice(0, -1).map((e, i) => ((e + edges[i + 1]) / 2).toFixed(2));
|
| 242 |
+
mkBar('chart-opp-hist', histLabels, [{ data: bins, backgroundColor: CU + 'cc', borderRadius: 2, borderSkipped: false }], { plugins: { legend: { display: false } }, x: { ticks: { maxTicksLimit: 10, font: { size: 10 } } } });
|
| 243 |
+
|
| 244 |
+
// Scatter Plot
|
| 245 |
+
const ctx = document.getElementById('chart-opp-scatter'); if (!ctx) return;
|
| 246 |
+
const chart = new Chart(ctx, {
|
| 247 |
+
type: 'scatter', data: {
|
| 248 |
+
datasets: [
|
| 249 |
+
{
|
| 250 |
+
label: 'Low/No Visits',
|
| 251 |
+
data: nv,
|
| 252 |
+
backgroundColor: RED + 'b5',
|
| 253 |
+
pointRadius: 6,
|
| 254 |
+
pointHoverRadius: 12,
|
| 255 |
+
pointStyle: 'circle'
|
| 256 |
+
},
|
| 257 |
+
{
|
| 258 |
+
label: 'Covered',
|
| 259 |
+
data: cv,
|
| 260 |
+
backgroundColor: CB + '95',
|
| 261 |
+
pointRadius: 6,
|
| 262 |
+
pointHoverRadius: 12,
|
| 263 |
+
pointStyle: 'rect'
|
| 264 |
+
}
|
| 265 |
+
]
|
| 266 |
+
}, options: {
|
| 267 |
+
maintainAspectRatio: false, responsive: true,
|
| 268 |
+
plugins: {
|
| 269 |
+
legend: { position: 'bottom' }, tooltip: {
|
| 270 |
+
callbacks: {
|
| 271 |
+
title: pts => { const p = pts[0]; return p.dataset.label + ' ID: ' + p.raw.id; },
|
| 272 |
+
label: p => [`UC TRx: ${p.raw.uc.toFixed(4)}/wk`, `Score: ${p.raw.sc.toFixed(4)}`, p.raw.sp ? `Specialty: ${p.raw.sp}` : '']
|
| 273 |
+
}
|
| 274 |
+
}
|
| 275 |
+
},
|
| 276 |
+
scales: { x: { title: { display: true, text: 'UC TRx Mean (weekly)' }, grid: { color: '#f1f5f9' } }, y: { title: { display: true, text: 'Opportunity Score' }, grid: { color: '#f1f5f9' } } },
|
| 277 |
+
onClick: (evt, els) => {
|
| 278 |
+
if (!els.length) return;
|
| 279 |
+
const el = els[0], di = el.datasetIndex, idx = el.index;
|
| 280 |
+
const hcp = chart.data.datasets[di].data[idx];
|
| 281 |
+
const isCovered = (di === 1);
|
| 282 |
+
window.selectHcpFromTable(hcp.id, hcp.uc, hcp.sc, hcp.sp, hcp.ap, isCovered);
|
| 283 |
+
}
|
| 284 |
+
}
|
| 285 |
+
});
|
| 286 |
+
});
|
| 287 |
+
}
|
| 288 |
+
|
| 289 |
+
/* ==================== TAB 7: SPECIALTY ==================== */
|
| 290 |
+
function buildSpecialtyStack() {
|
| 291 |
+
const sp = ['GP/Family Med', 'Gastroenterology', 'Internal Med', 'Neuro/Rheum', 'Other Spec', 'Pharmacy'];
|
| 292 |
+
mkHBar('chart-spec-stack', sp, [{ label: 'SEG_A', data: [25, 6256, 74, 13, 29, 9], backgroundColor: CA }, { label: 'SEG_B', data: [8, 3297, 13, 5, 23, 3], backgroundColor: CB }, { label: 'SEG_C', data: [2, 2127, 3, 3, 8, 1], backgroundColor: CC }], { x: { stacked: true } });
|
| 293 |
+
}
|
| 294 |
+
function buildSpecialtyPct() {
|
| 295 |
+
const sp = ['GP/Family Med', 'Gastroenterology', 'Internal Med', 'Neuro/Rheum', 'Other Spec', 'Pharmacy'];
|
| 296 |
+
const sa = [25, 6256, 74, 13, 29, 9], sb = [8, 3297, 13, 5, 23, 3], sc = [2, 2127, 3, 3, 8, 1];
|
| 297 |
+
const pctA = sa.map((_, i) => { const t = sa[i] + sb[i] + sc[i]; return t ? +(sa[i] / t * 100).toFixed(1) : 0; });
|
| 298 |
+
const pctB = sb.map((_, i) => { const t = sa[i] + sb[i] + sc[i]; return t ? +(sb[i] / t * 100).toFixed(1) : 0; });
|
| 299 |
+
const pctC = sc.map((_, i) => { const t = sa[i] + sb[i] + sc[i]; return t ? +(sc[i] / t * 100).toFixed(1) : 0; });
|
| 300 |
+
mkHBar('chart-spec-pct', sp, [{ label: 'SEG_A %', data: pctA, backgroundColor: CA }, { label: 'SEG_B %', data: pctB, backgroundColor: CB }, { label: 'SEG_C %', data: pctC, backgroundColor: CC }], { x: { stacked: true, max: 100 } });
|
| 301 |
+
}
|
| 302 |
+
|
| 303 |
+
/* ============================================================
|
| 304 |
+
CLIENT-SIDE INFERENCE ENGINE (PYODIDE)
|
| 305 |
+
Model: scikit-learn model loaded directly in browser
|
| 306 |
+
============================================================ */
|
| 307 |
+
|
| 308 |
+
let pyodideInstance = null;
|
| 309 |
+
|
| 310 |
+
async function runModelPrediction() {
|
| 311 |
+
const resultDiv = document.getElementById('prediction-result');
|
| 312 |
+
const predictBtn = document.getElementById('btn-predict');
|
| 313 |
+
|
| 314 |
+
// Handle UI state for loading (disable button and show spinner)
|
| 315 |
+
predictBtn.disabled = true;
|
| 316 |
+
resultDiv.style.display = 'block';
|
| 317 |
+
resultDiv.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Initializing Pyodide & loading model (may take a moment)...';
|
| 318 |
+
|
| 319 |
+
try {
|
| 320 |
+
// Initialize Pyodide
|
| 321 |
+
if (!pyodideInstance) {
|
| 322 |
+
pyodideInstance = await loadPyodide();
|
| 323 |
+
// Load the scikit-learn and numpy packages into the browser memory
|
| 324 |
+
await pyodideInstance.loadPackage(['scikit-learn', 'numpy']);
|
| 325 |
+
}
|
| 326 |
+
|
| 327 |
+
resultDiv.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Loading model and running inference...';
|
| 328 |
+
|
| 329 |
+
const pythonCode = `
|
| 330 |
+
import pyodide.http
|
| 331 |
+
import numpy as np
|
| 332 |
+
import joblib
|
| 333 |
+
import sklearn
|
| 334 |
+
|
| 335 |
+
print(f"[diag] sklearn={sklearn.__version__} numpy={np.__version__} joblib={joblib.__version__}")
|
| 336 |
+
|
| 337 |
+
# Load the model from the same origin (no HF auth, no CORS, no gated-repo issues).
|
| 338 |
+
# This is the same artifact as best_binary_segA_vs_segBC.joblib on Hugging Face.
|
| 339 |
+
response = await pyodide.http.pyfetch("sklearn_model.joblib")
|
| 340 |
+
with open("sklearn_model.joblib", "wb") as f:
|
| 341 |
+
f.write(await response.bytes())
|
| 342 |
+
|
| 343 |
+
model = joblib.load("sklearn_model.joblib")
|
| 344 |
+
|
| 345 |
+
# Tensor shape: (1, 5590) = 86 weeks * 65 features, flattened.
|
| 346 |
+
# Use small random values to simulate a real HCP rather than an all-zero edge case.
|
| 347 |
+
rng = np.random.default_rng(42)
|
| 348 |
+
sample = rng.normal(loc=0.0, scale=0.1, size=(1, 5590))
|
| 349 |
+
|
| 350 |
+
# model_metadata.json on HF specifies threshold = 0.45 for the SEG_B/C class.
|
| 351 |
+
proba_bc = float(model.predict_proba(sample)[0, 1])
|
| 352 |
+
threshold = 0.45
|
| 353 |
+
label = 1 if proba_bc >= threshold else 0
|
| 354 |
+
|
| 355 |
+
(label, proba_bc)
|
| 356 |
+
`;
|
| 357 |
+
|
| 358 |
+
const result = await pyodideInstance.runPythonAsync(pythonCode);
|
| 359 |
+
const [label, probaBc] = result.toJs();
|
| 360 |
+
const pct = (probaBc * 100).toFixed(1);
|
| 361 |
+
|
| 362 |
+
if (label === 1) {
|
| 363 |
+
resultDiv.innerHTML = `<i class="fas fa-check-circle" style="color: var(--accent-green);"></i> SEG_B/C (High Potential) — p=${pct}%`;
|
| 364 |
+
} else {
|
| 365 |
+
resultDiv.innerHTML = `<i class="fas fa-circle" style="color: var(--text-muted);"></i> SEG_A (Traditionalist) — p(BC)=${pct}%`;
|
| 366 |
+
}
|
| 367 |
+
|
| 368 |
+
} catch (error) {
|
| 369 |
+
console.error("Pyodide Client-Side ML Error:", error);
|
| 370 |
+
resultDiv.innerHTML = `<i class="fas fa-exclamation-triangle" style="color: var(--accent-coral);"></i> Inference Error: ${error.message}`;
|
| 371 |
+
} finally {
|
| 372 |
+
// Re-enable the button
|
| 373 |
+
predictBtn.disabled = false;
|
| 374 |
+
}
|
| 375 |
+
}
|
| 376 |
+
|
| 377 |
+
/* Init */
|
| 378 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 379 |
+
initTabs();
|
| 380 |
+
loadTab('tab-overview');
|
| 381 |
+
animateCounters();
|
| 382 |
+
|
| 383 |
+
// Pre-load opportunity counts to avoid showing 0 on UI load
|
| 384 |
+
fetch('opportunity_data.json').then(r => r.json()).then(data => {
|
| 385 |
+
const all = [...data.noVisits, ...data.covered];
|
| 386 |
+
const t1List = all.filter(h => h.sc >= 0.60);
|
| 387 |
+
const t2List = all.filter(h => h.sc >= 0.35 && h.sc < 0.60);
|
| 388 |
+
const t3List = all.filter(h => h.sc < 0.35);
|
| 389 |
+
|
| 390 |
+
const val1 = document.getElementById('tier-val-1');
|
| 391 |
+
const val2 = document.getElementById('tier-val-2');
|
| 392 |
+
const val3 = document.getElementById('tier-val-3');
|
| 393 |
+
if (val1) val1.textContent = t1List.length;
|
| 394 |
+
if (val2) val2.textContent = t2List.length;
|
| 395 |
+
if (val3) val3.textContent = t3List.length;
|
| 396 |
+
|
| 397 |
+
const noVisitsCount = data.noVisits.length;
|
| 398 |
+
const coveredCount = data.covered.length;
|
| 399 |
+
const totalCount = all.length;
|
| 400 |
+
const pctNoVisits = ((noVisitsCount / totalCount) * 100).toFixed(1);
|
| 401 |
+
|
| 402 |
+
const covGapText = document.getElementById('cov-gap-text');
|
| 403 |
+
if (covGapText) {
|
| 404 |
+
covGapText.innerHTML = `<strong>${noVisitsCount} of ${totalCount} unlabeled HCPs (${pctNoVisits}%)</strong>`;
|
| 405 |
+
}
|
| 406 |
+
const countNoVisits = document.getElementById('count-novisits');
|
| 407 |
+
const countCovered = document.getElementById('count-covered');
|
| 408 |
+
if (countNoVisits) countNoVisits.textContent = noVisitsCount;
|
| 409 |
+
if (countCovered) countCovered.textContent = coveredCount;
|
| 410 |
+
}).catch(err => console.error("Error loading initial opportunity statistics:", err));
|
| 411 |
+
|
| 412 |
+
// Bind live prediction button
|
| 413 |
+
const predictBtn = document.getElementById('btn-predict');
|
| 414 |
+
if (predictBtn) {
|
| 415 |
+
predictBtn.addEventListener('click', runModelPrediction);
|
| 416 |
+
}
|
| 417 |
+
});
|
generate_opportunity_json.py
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import pandas as pd
|
| 2 |
+
import json
|
| 3 |
+
|
| 4 |
+
def generate_json():
|
| 5 |
+
# Load data
|
| 6 |
+
try:
|
| 7 |
+
df_prop = pd.read_parquet('propensity_predictions_with_reasons.parquet')
|
| 8 |
+
df_hcp = pd.read_parquet('hcp_analysis_clean.parquet')
|
| 9 |
+
except Exception as e:
|
| 10 |
+
print(f"Error loading parquet files: {e}")
|
| 11 |
+
return
|
| 12 |
+
|
| 13 |
+
# Ensure NUEVO_ID is a column in df_hcp
|
| 14 |
+
if 'NUEVO_ID' not in df_hcp.columns:
|
| 15 |
+
if df_hcp.index.name == 'NUEVO_ID':
|
| 16 |
+
df_hcp = df_hcp.reset_index()
|
| 17 |
+
else:
|
| 18 |
+
print("NUEVO_ID not found in hcp_analysis_clean.parquet")
|
| 19 |
+
return
|
| 20 |
+
|
| 21 |
+
# Convert NUEVO_ID to string in both dataframes to avoid merge conflicts
|
| 22 |
+
df_prop['NUEVO_ID'] = df_prop['NUEVO_ID'].astype(str)
|
| 23 |
+
df_hcp['NUEVO_ID'] = df_hcp['NUEVO_ID'].astype(str)
|
| 24 |
+
|
| 25 |
+
# Merge datasets
|
| 26 |
+
# We only want to generate JSON for HCPs that are in the propensity results
|
| 27 |
+
df_merged = pd.merge(df_prop, df_hcp, on='NUEVO_ID', how='inner')
|
| 28 |
+
|
| 29 |
+
no_visits = []
|
| 30 |
+
covered = []
|
| 31 |
+
|
| 32 |
+
for _, row in df_merged.iterrows():
|
| 33 |
+
# Using .get() with defaults in case of missing data to prevent errors
|
| 34 |
+
record = {
|
| 35 |
+
"id": str(row['NUEVO_ID']),
|
| 36 |
+
"uc": round(float(row.get('UC_TRX_mean', 0.0) if pd.notna(row.get('UC_TRX_mean')) else 0.0), 4),
|
| 37 |
+
"sc": round(float(row.get('propensity_score', 0.0) if pd.notna(row.get('propensity_score')) else 0.0), 4),
|
| 38 |
+
"sp": str(row.get('SPECIALTY', 'Unknown')),
|
| 39 |
+
"ap": round(float(row.get('UC_TRX_active_pct', 0.0) if pd.notna(row.get('UC_TRX_active_pct')) else 0.0) * 100, 1)
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
# Check if covered or not
|
| 43 |
+
# Determine if covered or no visits based on low total visits rather than strictly 0
|
| 44 |
+
if pd.isna(row.get('DETAILS_total')) or row.get('DETAILS_total', 0) <= 5:
|
| 45 |
+
no_visits.append(record)
|
| 46 |
+
else:
|
| 47 |
+
covered.append(record)
|
| 48 |
+
|
| 49 |
+
final_data = {
|
| 50 |
+
"noVisits": no_visits,
|
| 51 |
+
"covered": covered
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
with open('opportunity_data.json', 'w') as f:
|
| 55 |
+
json.dump(final_data, f)
|
| 56 |
+
|
| 57 |
+
print(f"Successfully generated 'opportunity_data.json'.")
|
| 58 |
+
print(f"Total processed: {len(df_merged)}")
|
| 59 |
+
print(f"- noVisits: {len(no_visits)}")
|
| 60 |
+
print(f"- covered: {len(covered)}")
|
| 61 |
+
|
| 62 |
+
if __name__ == "__main__":
|
| 63 |
+
generate_json()
|
index.html
CHANGED
|
@@ -1,19 +1,556 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
|
| 4 |
+
<head>
|
| 5 |
+
<meta charset="UTF-8">
|
| 6 |
+
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
| 7 |
+
<title>HCP Segmentation Dashboard — Pfizer UC</title>
|
| 8 |
+
<meta name="description"
|
| 9 |
+
content="Longitudinal behavioral analysis for Ulcerative Colitis HCP segmentation — powered by 716-column deep analytics">
|
| 10 |
+
<link rel="stylesheet" href="styles.css">
|
| 11 |
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
|
| 12 |
+
|
| 13 |
+
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.1/dist/chart.umd.min.js"></script>
|
| 14 |
+
<script src="https://cdn.jsdelivr.net/pyodide/v0.26.0/full/pyodide.js"></script>
|
| 15 |
+
</head>
|
| 16 |
+
|
| 17 |
+
<body>
|
| 18 |
+
|
| 19 |
+
<!-- Top Header -->
|
| 20 |
+
<header class="top-header">
|
| 21 |
+
<div class="top-header-left">
|
| 22 |
+
<img src="Pfizer_Logo_Color_RGB.png" alt="Pfizer">
|
| 23 |
+
<h1>HCP Segmentation Insights</h1>
|
| 24 |
+
<span>Ulcerative Colitis — 716-Feature Deep Analytics</span>
|
| 25 |
+
</div>
|
| 26 |
+
<div><span class="header-badge">Pipeline Stable</span></div>
|
| 27 |
+
</header>
|
| 28 |
+
|
| 29 |
+
<!-- Tab Navigation -->
|
| 30 |
+
<nav class="tab-nav">
|
| 31 |
+
<button class="tab-btn active" data-tab="tab-overview"><i class="fas fa-chart-pie"></i> Executive
|
| 32 |
+
Summary</button>
|
| 33 |
+
<button class="tab-btn" data-tab="tab-segments"><i class="fas fa-layer-group"></i> Segment Deep-Dive</button>
|
| 34 |
+
<button class="tab-btn" data-tab="tab-adoption"><i class="fas fa-rocket"></i> Brand Adoption</button>
|
| 35 |
+
<button class="tab-btn" data-tab="tab-competitive"><i class="fas fa-chess"></i> Commercial Insights</button>
|
| 36 |
+
<button class="tab-btn" data-tab="tab-opportunity"><i class="fas fa-crosshairs"></i> Unlabeled
|
| 37 |
+
Opportunity</button>
|
| 38 |
+
|
| 39 |
+
</nav>
|
| 40 |
+
|
| 41 |
+
<!-- ==================== TAB 1: EXECUTIVE SUMMARY ==================== -->
|
| 42 |
+
<div id="tab-overview" class="tab-content active">
|
| 43 |
+
<div class="section-header">
|
| 44 |
+
<div class="section-icon"><i class="fas fa-chart-pie"></i></div>
|
| 45 |
+
<div>
|
| 46 |
+
<div class="section-title">Executive Summary</div>
|
| 47 |
+
<div class="section-subtitle">Real KPIs from 20,931 HCPs across 86-week longitudinal panel</div>
|
| 48 |
+
</div>
|
| 49 |
+
</div>
|
| 50 |
+
|
| 51 |
+
<div class="grid-4">
|
| 52 |
+
<div class="card kpi-card">
|
| 53 |
+
<div class="kpi-top"><span class="kpi-label">Total HCPs</span>
|
| 54 |
+
<div class="kpi-icon" style="background:#f1f5f9;color:#64748b"><i class="fas fa-users"></i></div>
|
| 55 |
+
</div>
|
| 56 |
+
<div class="kpi-value" data-count="20931">0</div>
|
| 57 |
+
<div class="kpi-sub">86-week longitudinal panel</div>
|
| 58 |
+
</div>
|
| 59 |
+
<div class="card kpi-card">
|
| 60 |
+
<div class="kpi-top"><span class="kpi-label">Labeled Cohort</span>
|
| 61 |
+
<div class="kpi-icon" style="background:#eef6fc;color:var(--pfizer-blue)"><i class="fas fa-tag"></i>
|
| 62 |
+
</div>
|
| 63 |
+
</div>
|
| 64 |
+
<div class="kpi-value" data-count="11899">0</div>
|
| 65 |
+
<div class="kpi-sub">56.9% of total market</div>
|
| 66 |
+
</div>
|
| 67 |
+
<div class="card kpi-card">
|
| 68 |
+
<div class="kpi-top"><span class="kpi-label">Unlabeled Pool</span>
|
| 69 |
+
<div class="kpi-icon" style="background:#f5f3ff;color:var(--seg-unlabeled)"><i
|
| 70 |
+
class="fas fa-search"></i></div>
|
| 71 |
+
</div>
|
| 72 |
+
<div class="kpi-value" data-count="9032">0</div>
|
| 73 |
+
<div class="kpi-sub">633 identified as Business Opportunity Cohort (BoC)</div>
|
| 74 |
+
</div>
|
| 75 |
+
<div class="card kpi-card">
|
| 76 |
+
<div class="kpi-top"><span class="kpi-label">Feature Columns</span>
|
| 77 |
+
<div class="kpi-icon" style="background:#ecfaff;color:var(--pfizer-sky)"><i
|
| 78 |
+
class="fas fa-database"></i></div>
|
| 79 |
+
</div>
|
| 80 |
+
<div class="kpi-value" data-count="716">0</div>
|
| 81 |
+
<div class="kpi-sub">7 feature blocks engineered</div>
|
| 82 |
+
</div>
|
| 83 |
+
|
| 84 |
+
</div>
|
| 85 |
+
|
| 86 |
+
<div class="alert-box alert-info" style="margin-top:20px"><i class="fas fa-info-circle"></i><span><strong>Data
|
| 87 |
+
Source:</strong> All metrics are computed from <code>hcp_analysis_clean.parquet</code> (20,931 HCPs
|
| 88 |
+
× 716 columns). KPIs reflect real aggregated prescribing, engagement, and market share data across the
|
| 89 |
+
86-week observation window.</span></div>
|
| 90 |
+
|
| 91 |
+
<div class="grid-2" style="margin-top:24px">
|
| 92 |
+
<div class="card">
|
| 93 |
+
<div class="chart-title">Population Distribution</div>
|
| 94 |
+
<div class="chart-container" style="height:300px"><canvas id="chart-funnel"></canvas></div>
|
| 95 |
+
</div>
|
| 96 |
+
<div class="card">
|
| 97 |
+
<div class="chart-title">Labeled Target Breakdown</div>
|
| 98 |
+
<div class="chart-container" style="height:300px"><canvas id="chart-doughnut"></canvas></div>
|
| 99 |
+
</div>
|
| 100 |
+
</div>
|
| 101 |
+
<div class="card" style="margin-top:24px">
|
| 102 |
+
<div class="chart-title">Key Metrics by Segment (Labeled Cohort)</div>
|
| 103 |
+
<div class="chart-container" style="height:340px"><canvas id="chart-heatmap"></canvas></div>
|
| 104 |
+
</div>
|
| 105 |
+
</div>
|
| 106 |
+
|
| 107 |
+
<!-- ==================== TAB 2: SEGMENT DEEP-DIVE ==================== -->
|
| 108 |
+
<div id="tab-segments" class="tab-content">
|
| 109 |
+
<div class="section-header">
|
| 110 |
+
<div class="section-icon"><i class="fas fa-layer-group"></i></div>
|
| 111 |
+
<div>
|
| 112 |
+
<div class="section-title">Segment Deep-Dive</div>
|
| 113 |
+
<div class="section-subtitle">Behavioral profiling from actual 716-column feature engineering</div>
|
| 114 |
+
</div>
|
| 115 |
+
</div>
|
| 116 |
+
|
| 117 |
+
<div class="grid-3">
|
| 118 |
+
<!-- Seg A -->
|
| 119 |
+
<div class="card segment-card">
|
| 120 |
+
<div class="segment-name" style="color:var(--seg-a)">Segment A — Traditional</div>
|
| 121 |
+
<div class="segment-desc">Lowest prescribing volume (0.17 UC TRx/wk). Only 3.8% show Pfizer growth.
|
| 122 |
+
Highest rep effort per Rx (0.94 details/TRx). Status-quo prescribers resistant to new therapies.
|
| 123 |
+
</div>
|
| 124 |
+
<div class="segment-stats">
|
| 125 |
+
<div class="segment-stat"><span class="segment-stat-label">Population</span><span
|
| 126 |
+
class="segment-stat-value">6,406 (53.8%)</span></div>
|
| 127 |
+
<div class="segment-stat"><span class="segment-stat-label">UC TRx/week</span><span
|
| 128 |
+
class="segment-stat-value">0.171</span></div>
|
| 129 |
+
<div class="segment-stat"><span class="segment-stat-label">Pfizer Share of UC</span><span
|
| 130 |
+
class="segment-stat-value" style="color:var(--accent-coral)">0.36%</span></div>
|
| 131 |
+
<div class="segment-stat"><span class="segment-stat-label">Active Weeks</span><span
|
| 132 |
+
class="segment-stat-value">46.1%</span></div>
|
| 133 |
+
<div class="segment-stat"><span class="segment-stat-label">Details per Rx</span><span
|
| 134 |
+
class="segment-stat-value" style="color:var(--accent-coral)">0.94</span></div>
|
| 135 |
+
<div style="margin-top:8px"><span class="badge badge-amber">Low Priority — Baseline</span></div>
|
| 136 |
+
</div>
|
| 137 |
+
</div>
|
| 138 |
+
|
| 139 |
+
<!-- Seg B -->
|
| 140 |
+
<div class="card segment-card">
|
| 141 |
+
<div class="segment-name" style="color:var(--seg-b)">Segment B — Relationship</div>
|
| 142 |
+
<div class="segment-desc">Highest Pfizer growth signal (9.6% growing). Most efficient rep conversion
|
| 143 |
+
(0.44 details/TRx). Broadest promo engagement (2.56 channels). The primary commercial target.</div>
|
| 144 |
+
<div class="segment-stats">
|
| 145 |
+
<div class="segment-stat"><span class="segment-stat-label">Population</span><span
|
| 146 |
+
class="segment-stat-value">3,349 (28.2%)</span></div>
|
| 147 |
+
<div class="segment-stat"><span class="segment-stat-label">UC TRx/week</span><span
|
| 148 |
+
class="segment-stat-value">0.517</span></div>
|
| 149 |
+
<div class="segment-stat"><span class="segment-stat-label">Pfizer Share of UC</span><span
|
| 150 |
+
class="segment-stat-value" style="color:var(--seg-b)">0.48%</span></div>
|
| 151 |
+
<div class="segment-stat"><span class="segment-stat-label">Active Weeks</span><span
|
| 152 |
+
class="segment-stat-value">73.3%</span></div>
|
| 153 |
+
<div class="segment-stat"><span class="segment-stat-label">Details per Rx</span><span
|
| 154 |
+
class="segment-stat-value" style="color:var(--accent-green)">0.44</span></div>
|
| 155 |
+
<div style="margin-top:8px"><span class="badge badge-green">High Priority — Target</span></div>
|
| 156 |
+
</div>
|
| 157 |
+
</div>
|
| 158 |
+
|
| 159 |
+
<!-- Seg C -->
|
| 160 |
+
<div class="card segment-card">
|
| 161 |
+
<div class="segment-name" style="color:var(--seg-c)">Segment C — Didactic</div>
|
| 162 |
+
<div class="segment-desc">Highest UC volume (0.71 TRx/wk) and strongest biologic loyalty (11.3% IL-23
|
| 163 |
+
share). Most efficient rep relationship (0.38 details/TRx). Protocol-driven, evidence-based HCPs.
|
| 164 |
+
</div>
|
| 165 |
+
<div class="segment-stats">
|
| 166 |
+
<div class="segment-stat"><span class="segment-stat-label">Population</span><span
|
| 167 |
+
class="segment-stat-value">2,144 (18.0%)</span></div>
|
| 168 |
+
<div class="segment-stat"><span class="segment-stat-label">UC TRx/week</span><span
|
| 169 |
+
class="segment-stat-value">0.711</span></div>
|
| 170 |
+
<div class="segment-stat"><span class="segment-stat-label">Pfizer Share of UC</span><span
|
| 171 |
+
class="segment-stat-value" style="color:var(--seg-c)">0.31%</span></div>
|
| 172 |
+
<div class="segment-stat"><span class="segment-stat-label">Active Weeks</span><span
|
| 173 |
+
class="segment-stat-value">76.8%</span></div>
|
| 174 |
+
<div class="segment-stat"><span class="segment-stat-label">Details per Rx</span><span
|
| 175 |
+
class="segment-stat-value" style="color:var(--accent-green)">0.38</span></div>
|
| 176 |
+
<div style="margin-top:8px"><span class="badge badge-sky">Upsell Target</span>
|
| 177 |
+
</div>
|
| 178 |
+
</div>
|
| 179 |
+
</div>
|
| 180 |
+
</div>
|
| 181 |
+
|
| 182 |
+
<div class="grid-2" style="margin-top:24px">
|
| 183 |
+
<div class="card">
|
| 184 |
+
<div class="chart-title">UC TRx Volume by Segment</div>
|
| 185 |
+
<div class="chart-container" style="height:300px"><canvas id="chart-segment-bars"></canvas></div>
|
| 186 |
+
</div>
|
| 187 |
+
<div class="card">
|
| 188 |
+
<div class="chart-title">Medication Mix by Segment</div>
|
| 189 |
+
<div class="chart-container" style="height:300px"><canvas id="chart-med-mix"></canvas></div>
|
| 190 |
+
</div>
|
| 191 |
+
</div>
|
| 192 |
+
|
| 193 |
+
<!-- HCP 86-Week Timelines (restored from V1) -->
|
| 194 |
+
<div class="section-header" style="margin-top:32px">
|
| 195 |
+
<div class="section-icon"><i class="fas fa-chart-line"></i></div>
|
| 196 |
+
<div>
|
| 197 |
+
<div class="section-title">HCP Longitudinal Journeys</div>
|
| 198 |
+
<div class="section-subtitle">Visualizing the 86-week sequential data fed into the tensors</div>
|
| 199 |
+
</div>
|
| 200 |
+
</div>
|
| 201 |
+
<div class="sub-tabs">
|
| 202 |
+
<button class="sub-tab active" data-subtab="sub-pb">Dr. Brian Chen (SEG_B)</button>
|
| 203 |
+
<button class="sub-tab" data-subtab="sub-pc">Dr. Catherine Williams (SEG_C)</button>
|
| 204 |
+
<button class="sub-tab" data-subtab="sub-pa">Dr. Ana Lopez (SEG_A)</button>
|
| 205 |
+
</div>
|
| 206 |
+
<!-- Dr. Chen (SEG_B) -->
|
| 207 |
+
<div id="sub-pb" class="sub-panel active">
|
| 208 |
+
<div class="card persona-card">
|
| 209 |
+
<div class="persona-header">
|
| 210 |
+
<div class="persona-avatar" style="background:var(--pfizer-light)">BC</div>
|
| 211 |
+
<div>
|
| 212 |
+
<div class="persona-name">Dr. Brian Chen</div>
|
| 213 |
+
<div class="persona-role">San Francisco, CA — Relationship-Centric</div>
|
| 214 |
+
<div class="persona-seg" style="color:var(--pfizer-light)">Segment B</div>
|
| 215 |
+
</div>
|
| 216 |
+
</div>
|
| 217 |
+
<div class="persona-detail-grid" style="margin-top:0;margin-bottom:24px">
|
| 218 |
+
<div class="persona-metric">
|
| 219 |
+
<div class="persona-metric-label">Avg Weekly UC TRx</div>
|
| 220 |
+
<div class="persona-metric-value">12.2</div>
|
| 221 |
+
</div>
|
| 222 |
+
<div class="persona-metric">
|
| 223 |
+
<div class="persona-metric-label">Brand Preference</div>
|
| 224 |
+
<div class="persona-metric-value">Balanced (Low)</div>
|
| 225 |
+
</div>
|
| 226 |
+
</div>
|
| 227 |
+
<div class="chart-container" style="height:320px"><canvas id="chart-pb-main"></canvas></div>
|
| 228 |
+
<div style="margin-top: 16px; font-size: 14px; color: var(--text-light); text-align: center; font-style: italic;">Business Value: Steady overall volume with balanced brand adoption. Highly receptive to engagement and an ideal commercial target.</div>
|
| 229 |
+
</div>
|
| 230 |
+
</div>
|
| 231 |
+
<!-- Dr. Williams (SEG_C) -->
|
| 232 |
+
<div id="sub-pc" class="sub-panel">
|
| 233 |
+
<div class="card persona-card">
|
| 234 |
+
<div class="persona-header">
|
| 235 |
+
<div class="persona-avatar" style="background:var(--pfizer-deep)">CW</div>
|
| 236 |
+
<div>
|
| 237 |
+
<div class="persona-name">Dr. Catherine Williams</div>
|
| 238 |
+
<div class="persona-role">Chicago, IL — Didactic / Cautious</div>
|
| 239 |
+
<div class="persona-seg" style="color:var(--pfizer-deep)">Segment C</div>
|
| 240 |
+
</div>
|
| 241 |
+
</div>
|
| 242 |
+
<div class="persona-detail-grid" style="margin-top:0;margin-bottom:24px">
|
| 243 |
+
<div class="persona-metric">
|
| 244 |
+
<div class="persona-metric-label">Avg Weekly UC TRx</div>
|
| 245 |
+
<div class="persona-metric-value">1.7</div>
|
| 246 |
+
</div>
|
| 247 |
+
<div class="persona-metric">
|
| 248 |
+
<div class="persona-metric-label">Brand Preference</div>
|
| 249 |
+
<div class="persona-metric-value">Competitor (Brand 2)</div>
|
| 250 |
+
</div>
|
| 251 |
+
</div>
|
| 252 |
+
<div class="chart-container" style="height:320px"><canvas id="chart-pc-main"></canvas></div>
|
| 253 |
+
<div style="margin-top: 16px; font-size: 14px; color: var(--text-light); text-align: center; font-style: italic;">Business Value: Strong loyalty to the competitor's brand. A prime target for didactic, evidence-based displacement campaigns.</div>
|
| 254 |
+
</div>
|
| 255 |
+
</div>
|
| 256 |
+
<!-- Dr. Lopez (SEG_A) -->
|
| 257 |
+
<div id="sub-pa" class="sub-panel">
|
| 258 |
+
<div class="card persona-card">
|
| 259 |
+
<div class="persona-header">
|
| 260 |
+
<div class="persona-avatar" style="background:var(--pfizer-blue)">AL</div>
|
| 261 |
+
<div>
|
| 262 |
+
<div class="persona-name">Dr. Ana Lopez</div>
|
| 263 |
+
<div class="persona-role">Houston, TX — Traditional Prescriber</div>
|
| 264 |
+
<div class="persona-seg" style="color:var(--pfizer-blue)">Segment A</div>
|
| 265 |
+
</div>
|
| 266 |
+
</div>
|
| 267 |
+
<div class="persona-detail-grid" style="margin-top:0;margin-bottom:24px">
|
| 268 |
+
<div class="persona-metric">
|
| 269 |
+
<div class="persona-metric-label">Avg Weekly UC TRx</div>
|
| 270 |
+
<div class="persona-metric-value">2.5</div>
|
| 271 |
+
</div>
|
| 272 |
+
<div class="persona-metric">
|
| 273 |
+
<div class="persona-metric-label">Brand Preference</div>
|
| 274 |
+
<div class="persona-metric-value">Zero Brands</div>
|
| 275 |
+
</div>
|
| 276 |
+
</div>
|
| 277 |
+
<div class="chart-container" style="height:320px"><canvas id="chart-pa-main"></canvas></div>
|
| 278 |
+
<div style="margin-top: 16px; font-size: 14px; color: var(--text-light); text-align: center; font-style: italic;">Business Value: High market volume but zero biologic adoption. The ultimate white-space opportunity for market expansion.</div>
|
| 279 |
+
</div>
|
| 280 |
+
</div>
|
| 281 |
+
</div>
|
| 282 |
+
|
| 283 |
+
<!-- ==================== TAB 3: BRAND ADOPTION ==================== -->
|
| 284 |
+
<div id="tab-adoption" class="tab-content">
|
| 285 |
+
<div class="section-header">
|
| 286 |
+
<div class="section-icon"><i class="fas fa-rocket"></i></div>
|
| 287 |
+
<div>
|
| 288 |
+
<div class="section-title">Brand1 Adoption & Trajectory</div>
|
| 289 |
+
<div class="section-subtitle">Adoption funnel, growth signals, and recency trends from real data</div>
|
| 290 |
+
</div>
|
| 291 |
+
</div>
|
| 292 |
+
|
| 293 |
+
<div class="grid-3" style="margin-bottom:24px">
|
| 294 |
+
<div class="card metric-highlight">
|
| 295 |
+
<div class="metric-highlight-value" style="color:var(--accent-coral)">91.4%</div>
|
| 296 |
+
<div class="metric-highlight-label">Never Tried Brand1</div>
|
| 297 |
+
</div>
|
| 298 |
+
<div class="card metric-highlight">
|
| 299 |
+
<div class="metric-highlight-value" style="color:var(--accent-green)">5.0%</div>
|
| 300 |
+
<div class="metric-highlight-label">Currently Active</div>
|
| 301 |
+
</div>
|
| 302 |
+
<div class="card metric-highlight">
|
| 303 |
+
<div class="metric-highlight-value" style="color:var(--accent-amber)">2.6%</div>
|
| 304 |
+
<div class="metric-highlight-label">Trialed Then Lapsed</div>
|
| 305 |
+
</div>
|
| 306 |
+
</div>
|
| 307 |
+
|
| 308 |
+
<div class="grid-2">
|
| 309 |
+
<div class="card">
|
| 310 |
+
<div class="chart-title">Adoption Funnel by Segment (% of each segment)</div>
|
| 311 |
+
<div class="chart-container" style="height:300px"><canvas id="chart-adoption-pct"></canvas></div>
|
| 312 |
+
</div>
|
| 313 |
+
<div class="card">
|
| 314 |
+
<div class="chart-title">Adoption Funnel by Segment (Absolute Count)</div>
|
| 315 |
+
<div class="chart-container" style="height:300px"><canvas id="chart-adoption-abs"></canvas></div>
|
| 316 |
+
</div>
|
| 317 |
+
</div>
|
| 318 |
+
|
| 319 |
+
<div class="grid-2" style="margin-top:24px">
|
| 320 |
+
<div class="card">
|
| 321 |
+
<div class="chart-title">Growth Signals: Who Is Accelerating?</div>
|
| 322 |
+
<div class="chart-container" style="height:300px"><canvas id="chart-growth-signals"></canvas></div>
|
| 323 |
+
</div>
|
| 324 |
+
<div class="card">
|
| 325 |
+
<div class="chart-title">Pfizer TRx: 86-Week Average vs. Recent 8 Weeks</div>
|
| 326 |
+
<div class="chart-container" style="height:300px"><canvas id="chart-trend-bars"></canvas></div>
|
| 327 |
+
</div>
|
| 328 |
+
</div>
|
| 329 |
+
</div>
|
| 330 |
+
|
| 331 |
+
<!-- ==================== TAB 4: COMPETITIVE INTELLIGENCE ==================== -->
|
| 332 |
+
<div id="tab-competitive" class="tab-content">
|
| 333 |
+
<div class="section-header">
|
| 334 |
+
<div class="section-icon"><i class="fas fa-chess"></i></div>
|
| 335 |
+
<div>
|
| 336 |
+
<div class="section-title">Commercial Insights</div>
|
| 337 |
+
<div class="section-subtitle">Pfizer vs Brand2 market dynamics across segments</div>
|
| 338 |
+
</div>
|
| 339 |
+
</div>
|
| 340 |
+
|
| 341 |
+
<div class="grid-3" style="margin-bottom:24px">
|
| 342 |
+
<div class="card metric-highlight">
|
| 343 |
+
<div class="metric-highlight-value" style="color:var(--seg-a)">3.90×</div>
|
| 344 |
+
<div class="metric-highlight-label">Brand2/Pfizer — SEG_A</div>
|
| 345 |
+
</div>
|
| 346 |
+
<div class="card metric-highlight">
|
| 347 |
+
<div class="metric-highlight-value" style="color:var(--seg-b)">4.43×</div>
|
| 348 |
+
<div class="metric-highlight-label">Brand2/Pfizer — SEG_B</div>
|
| 349 |
+
</div>
|
| 350 |
+
<div class="card metric-highlight">
|
| 351 |
+
<div class="metric-highlight-value" style="color:var(--seg-c)">4.29×</div>
|
| 352 |
+
<div class="metric-highlight-label">Brand2/Pfizer — SEG_C</div>
|
| 353 |
+
</div>
|
| 354 |
+
</div>
|
| 355 |
+
|
| 356 |
+
<div class="alert-box alert-warning"><i class="fas fa-exclamation-triangle"></i><span><strong>Competitive
|
| 357 |
+
Pressure:</strong> Brand2 outprescribes Pfizer by 3.9–4.4× across all segments. The gap is widest in
|
| 358 |
+
SEG_B (4.43×), the very segment with the highest Pfizer growth trajectory — indicating an active
|
| 359 |
+
battleground for share.</span></div>
|
| 360 |
+
|
| 361 |
+
<div class="grid-2" style="margin-top:24px">
|
| 362 |
+
<div class="card">
|
| 363 |
+
<div class="chart-title">Pfizer vs Brand2: Market Share of UC (%) by Segment</div>
|
| 364 |
+
<div class="chart-container" style="height:300px"><canvas id="chart-comp-share"></canvas></div>
|
| 365 |
+
</div>
|
| 366 |
+
<div class="card">
|
| 367 |
+
<div class="chart-title">Brand2/Pfizer Prescribing Ratio by Segment</div>
|
| 368 |
+
<div class="chart-container" style="height:300px"><canvas id="chart-comp-ratio"></canvas></div>
|
| 369 |
+
</div>
|
| 370 |
+
</div>
|
| 371 |
+
|
| 372 |
+
<div class="card" style="margin-top:24px">
|
| 373 |
+
<div class="chart-title">UC TRx Volume vs Pfizer Market Share (Labeled HCPs)</div>
|
| 374 |
+
<div class="chart-container" style="height:420px"><canvas id="chart-scatter-uc"></canvas></div>
|
| 375 |
+
</div>
|
| 376 |
+
|
| 377 |
+
<!-- ==================== MERGED REP ENGAGEMENT SECTION ==================== -->
|
| 378 |
+
<hr style="margin: 40px 0; border: 0; border-top: 1px solid #e2e8f0;">
|
| 379 |
+
|
| 380 |
+
<div class="section-header">
|
| 381 |
+
<div class="section-icon"><i class="fas fa-handshake"></i></div>
|
| 382 |
+
<div>
|
| 383 |
+
<div class="section-title">Rep Engagement ROI</div>
|
| 384 |
+
<div class="section-subtitle">Measuring commercial efficiency: visits, channels, and prescribing impact
|
| 385 |
+
</div>
|
| 386 |
+
</div>
|
| 387 |
+
</div>
|
| 388 |
+
|
| 389 |
+
<div class="grid-4" style="margin-bottom:24px">
|
| 390 |
+
<div class="card metric-highlight">
|
| 391 |
+
<div class="metric-highlight-value" style="color:var(--seg-a)">0.94</div>
|
| 392 |
+
<div class="metric-highlight-label">Details/Rx — SEG_A</div>
|
| 393 |
+
</div>
|
| 394 |
+
<div class="card metric-highlight">
|
| 395 |
+
<div class="metric-highlight-value" style="color:var(--seg-b)">0.44</div>
|
| 396 |
+
<div class="metric-highlight-label">Details/Rx — SEG_B</div>
|
| 397 |
+
</div>
|
| 398 |
+
<div class="card metric-highlight">
|
| 399 |
+
<div class="metric-highlight-value" style="color:var(--seg-c)">0.38</div>
|
| 400 |
+
<div class="metric-highlight-label">Details/Rx — SEG_C</div>
|
| 401 |
+
</div>
|
| 402 |
+
<div class="card metric-highlight">
|
| 403 |
+
<div class="metric-highlight-value" style="color:var(--accent-green)">2.1×</div>
|
| 404 |
+
<div class="metric-highlight-label">SEG_B is 2.1× more efficient than SEG_A</div>
|
| 405 |
+
</div>
|
| 406 |
+
</div>
|
| 407 |
+
|
| 408 |
+
<div class="grid-2">
|
| 409 |
+
<div class="card">
|
| 410 |
+
<div class="chart-title">Engagement Metrics by Segment</div>
|
| 411 |
+
<div class="chart-container" style="height:300px"><canvas id="chart-engagement"></canvas></div>
|
| 412 |
+
</div>
|
| 413 |
+
<div class="card">
|
| 414 |
+
<div class="chart-title">Rep Visits vs Pfizer Prescribing (Scatter)</div>
|
| 415 |
+
<div class="chart-container" style="height:300px"><canvas id="chart-scatter-eng"></canvas></div>
|
| 416 |
+
</div>
|
| 417 |
+
</div>
|
| 418 |
+
</div>
|
| 419 |
+
|
| 420 |
+
<!-- ==================== TAB 6: UNLABELED OPPORTUNITY ==================== -->
|
| 421 |
+
<div id="tab-opportunity" class="tab-content">
|
| 422 |
+
|
| 423 |
+
<div class="section-header">
|
| 424 |
+
<div class="section-icon"><i class="fas fa-crosshairs"></i></div>
|
| 425 |
+
<div>
|
| 426 |
+
<div class="section-title">Unlabeled HCP Opportunity</div>
|
| 427 |
+
<div class="section-subtitle">Prioritizing 633 unclassified HCPs for commercial outreach</div>
|
| 428 |
+
</div>
|
| 429 |
+
</div>
|
| 430 |
+
|
| 431 |
+
<div class="grid-2" style="align-items: start; margin-bottom: 24px;">
|
| 432 |
+
|
| 433 |
+
<div>
|
| 434 |
+
<div class="grid-3" style="margin-bottom: 24px;">
|
| 435 |
+
<div class="card tier-card" id="tier-card-1" style="cursor: pointer; border-left: none;">
|
| 436 |
+
<div class="tier-value" id="tier-val-1" style="color:var(--accent-green)">0</div>
|
| 437 |
+
<div class="tier-label">Tier 1 — Immediate</div>
|
| 438 |
+
<div class="tier-desc">Score ≥ 0.60. Highest prescribing + growth signals.</div>
|
| 439 |
+
</div>
|
| 440 |
+
<div class="card tier-card" id="tier-card-2" style="cursor: pointer; border-left: none;">
|
| 441 |
+
<div class="tier-value" id="tier-val-2" style="color:var(--accent-amber)">0</div>
|
| 442 |
+
<div class="tier-label">Tier 2 — Validate</div>
|
| 443 |
+
<div class="tier-desc">Score 0.35–0.60. Moderate opportunity, needs validation.</div>
|
| 444 |
+
</div>
|
| 445 |
+
<div class="card tier-card" id="tier-card-3" style="cursor: pointer; border-left: none;">
|
| 446 |
+
<div class="tier-value" id="tier-val-3" style="color:var(--text-muted)">0</div>
|
| 447 |
+
<div class="tier-label">Tier 3 — Monitor</div>
|
| 448 |
+
<div class="tier-desc">Score < 0.35. Low activity, monitor for emergence.</div>
|
| 449 |
+
</div>
|
| 450 |
+
</div>
|
| 451 |
+
|
| 452 |
+
<div class="alert-box alert-warning" style="display: flex; flex-direction: column; gap: 12px; align-items: stretch;">
|
| 453 |
+
<div style="display: flex; align-items: flex-start; gap: 12px;">
|
| 454 |
+
<i class="fas fa-exclamation-triangle"></i>
|
| 455 |
+
<span><strong>Coverage Gap:</strong> <span id="cov-gap-text">347 of 633 unlabeled HCPs (54.8%)</span> have low/no rep visits (<=5). Click below to view these cohorts.</span>
|
| 456 |
+
</div>
|
| 457 |
+
<div style="display: flex; gap: 10px; margin-top: 8px;">
|
| 458 |
+
<button id="btn-show-novisits" class="badge badge-red" style="border: 1px solid var(--accent-coral); cursor: pointer; padding: 6px 14px; font-size: 13px; font-weight: 600; display: inline-flex; align-items: center; gap: 6px;">
|
| 459 |
+
<i class="fas fa-eye-slash"></i> Low/No Visits: <span id="count-novisits">0</span>
|
| 460 |
+
</button>
|
| 461 |
+
<button id="btn-show-covered" class="badge badge-blue" style="border: 1px solid var(--pfizer-blue); cursor: pointer; padding: 6px 14px; font-size: 13px; font-weight: 600; display: inline-flex; align-items: center; gap: 6px;">
|
| 462 |
+
<i class="fas fa-check-double"></i> Covered: <span id="count-covered">0</span>
|
| 463 |
+
</button>
|
| 464 |
+
</div>
|
| 465 |
+
</div>
|
| 466 |
+
</div>
|
| 467 |
+
|
| 468 |
+
<div class="card" id="inference-card" style="height: 100%;">
|
| 469 |
+
<div class="chart-title">Live Model Prediction: Segment Classification</div>
|
| 470 |
+
<div class="chart-container" style="height: auto; padding: 15px 0;">
|
| 471 |
+
<p style="font-size: 14px; color: var(--text-secondary); margin-bottom: 25px;">
|
| 472 |
+
Test the live Hugging Face model (SEG_A vs SEG_BC) with sample HCP data.
|
| 473 |
+
</p>
|
| 474 |
+
<button id="btn-predict"
|
| 475 |
+
style="width: 100%; justify-content: center; border-radius: 8px; padding: 12px; background: var(--pfizer-blue); color: white; border: none; cursor: pointer; font-weight: 600; font-size: 14px; display: flex; align-items: center; gap: 8px; transition: opacity 0.2s;"
|
| 476 |
+
onmouseover="this.style.opacity=0.9" onmouseout="this.style.opacity=1">
|
| 477 |
+
<i class="fas fa-brain"></i> Run Live Prediction
|
| 478 |
+
</button>
|
| 479 |
+
<div id="prediction-result"
|
| 480 |
+
style="margin-top: 20px; font-weight: 600; color: var(--pfizer-deep); font-size: 16px; background: var(--bg-active); padding: 12px; border-radius: 8px; display: none;">
|
| 481 |
+
</div>
|
| 482 |
+
</div>
|
| 483 |
+
</div>
|
| 484 |
+
|
| 485 |
+
</div>
|
| 486 |
+
<div class="grid-2" style="margin-top:24px">
|
| 487 |
+
<div class="card">
|
| 488 |
+
<div class="chart-title">Opportunity Score Distribution (633 Unlabeled HCPs)</div>
|
| 489 |
+
<div class="chart-container" style="height:300px"><canvas id="chart-opp-hist"></canvas></div>
|
| 490 |
+
</div>
|
| 491 |
+
<div class="card">
|
| 492 |
+
<div class="chart-title">Click a red point to identify the HCP below ↓</div>
|
| 493 |
+
<div class="chart-container" style="height:300px"><canvas id="chart-opp-scatter"></canvas></div>
|
| 494 |
+
</div>
|
| 495 |
+
</div>
|
| 496 |
+
|
| 497 |
+
<div id="hcp-detail-panel" class="card"
|
| 498 |
+
style="margin-top:24px;display:none;">
|
| 499 |
+
<div class="section-header" style="margin-bottom:16px">
|
| 500 |
+
<div class="section-icon" style="background:#fef2f2;color:var(--accent-coral)">
|
| 501 |
+
<i class="fas fa-user-md"></i>
|
| 502 |
+
</div>
|
| 503 |
+
<div>
|
| 504 |
+
<div class="section-title" id="hcp-detail-title">HCP Selected</div>
|
| 505 |
+
<div class="section-subtitle">Low/No rep visits (≤5) — high opportunity for outreach</div>
|
| 506 |
+
</div>
|
| 507 |
+
</div>
|
| 508 |
+
<div class="grid-5" id="hcp-detail-grid"></div>
|
| 509 |
+
<div class="alert-box alert-warning" style="margin-top:16px">
|
| 510 |
+
<i class="fas fa-bullhorn"></i>
|
| 511 |
+
<span><strong>Action Required:</strong> This HCP has low or zero recorded representative visits (≤5) yet
|
| 512 |
+
shows significant UC prescribing activity. Recommend scheduling an initial detail call.</span>
|
| 513 |
+
</div>
|
| 514 |
+
</div>
|
| 515 |
+
|
| 516 |
+
<!-- Dynamic Table View for Tier / Coverage cohorts -->
|
| 517 |
+
<div id="cohort-table-panel" class="card" style="margin-top:24px; display:none;">
|
| 518 |
+
<div class="section-header" style="margin-bottom:16px; display:flex; justify-content:space-between; align-items:center; width:100%;">
|
| 519 |
+
<div style="display:flex; align-items:center; gap:16px;">
|
| 520 |
+
<div class="section-icon" id="cohort-table-icon" style="background:#eef6fc; color:var(--pfizer-blue)">
|
| 521 |
+
<i class="fas fa-list"></i>
|
| 522 |
+
</div>
|
| 523 |
+
<div>
|
| 524 |
+
<div class="section-title" id="cohort-table-title">HCP Cohort List</div>
|
| 525 |
+
<div class="section-subtitle" id="cohort-table-subtitle">Explore opportunity probability and attributes</div>
|
| 526 |
+
</div>
|
| 527 |
+
</div>
|
| 528 |
+
<button id="btn-close-cohort-table" style="background:none; border:none; color:var(--text-muted); cursor:pointer; font-size:18px;">
|
| 529 |
+
<i class="fas fa-times"></i>
|
| 530 |
+
</button>
|
| 531 |
+
</div>
|
| 532 |
+
<div style="overflow-x:auto; max-height:450px; border: 1px solid var(--border-subtle); border-radius:var(--radius-sm);">
|
| 533 |
+
<table class="data-table" id="cohort-data-table">
|
| 534 |
+
<thead>
|
| 535 |
+
<tr>
|
| 536 |
+
<th>HCP ID</th>
|
| 537 |
+
<th>Specialty</th>
|
| 538 |
+
<th>UC TRx / Week</th>
|
| 539 |
+
<th>Opportunity Score</th>
|
| 540 |
+
<th>Active Weeks (%)</th>
|
| 541 |
+
<th>Interaction State</th>
|
| 542 |
+
</tr>
|
| 543 |
+
</thead>
|
| 544 |
+
<tbody id="cohort-table-body">
|
| 545 |
+
<!-- Populated dynamically -->
|
| 546 |
+
</tbody>
|
| 547 |
+
</table>
|
| 548 |
+
</div>
|
| 549 |
+
</div>
|
| 550 |
+
</div>
|
| 551 |
+
|
| 552 |
+
|
| 553 |
+
<script src="app.js"></script>
|
| 554 |
+
</body>
|
| 555 |
+
|
| 556 |
+
</html>
|
opportunity_data.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"noVisits": [{"id": "15361", "uc": 0.4487, "sc": 0.9667, "sp": "Gastroenterology", "ap": 90.7}, {"id": "14437", "uc": 0.3374, "sc": 0.9667, "sp": "Gastroenterology", "ap": 75.6}, {"id": "19349", "uc": 0.5276, "sc": 0.9667, "sp": "Gastroenterology", "ap": 90.7}, {"id": "18899", "uc": 4.5689, "sc": 0.9167, "sp": "Other Spec", "ap": 98.8}, {"id": "14468", "uc": 0.6502, "sc": 0.9, "sp": "Gastroenterology", "ap": 73.3}, {"id": "15311", "uc": 0.8304, "sc": 0.9, "sp": "Gastroenterology", "ap": 97.7}, {"id": "9036", "uc": 2.5824, "sc": 0.7867, "sp": "Other Spec", "ap": 96.5}, {"id": "13445", "uc": 0.2407, "sc": 0.7867, "sp": "Gastroenterology", "ap": 51.2}, {"id": "12259", "uc": 0.1885, "sc": 0.7701, "sp": "Pharmacy", "ap": 72.1}, {"id": "238", "uc": 0.4943, "sc": 0.7694, "sp": "Neuro/Rheum/Pulm", "ap": 62.8}, {"id": "15170", "uc": 0.2903, "sc": 0.6818, "sp": "Gastroenterology", "ap": 65.1}, {"id": "15465", "uc": 6.8094, "sc": 0.6452, "sp": "Other Spec", "ap": 98.8}, {"id": "15987", "uc": 2.4004, "sc": 0.4852, "sp": "Other Spec", "ap": 98.8}, {"id": "14142", "uc": 2.2962, "sc": 0.3744, "sp": "Pharmacy", "ap": 98.8}, {"id": "20606", "uc": 0.5025, "sc": 0.2046, "sp": "Gastroenterology", "ap": 83.7}, {"id": "16687", "uc": 1.0747, "sc": 0.174, "sp": "Gastroenterology", "ap": 97.7}, {"id": "17320", "uc": 0.3237, "sc": 0.1207, "sp": "Gastroenterology", "ap": 82.6}, {"id": "10935", "uc": 4.3895, "sc": 0.0913, "sp": "GP/Family Med", "ap": 98.8}, {"id": "18406", "uc": 0.3458, "sc": 0.0587, "sp": "Gastroenterology", "ap": 80.2}, {"id": "10974", "uc": 12.2224, "sc": 0.0587, "sp": "Internal Medicine", "ap": 98.8}, {"id": "10945", "uc": 0.3868, "sc": 0.0407, "sp": "Neuro/Rheum/Pulm", "ap": 83.7}, {"id": "16529", "uc": 1.9706, "sc": 0.0407, "sp": "Gastroenterology", "ap": 98.8}, {"id": "15442", "uc": 1.5204, "sc": 0.0407, "sp": "Gastroenterology", "ap": 98.8}, {"id": "20444", "uc": 0.3336, "sc": 0.0407, "sp": "Gastroenterology", "ap": 81.4}, {"id": "19857", "uc": 2.401, "sc": 0.0407, "sp": "Gastroenterology", "ap": 98.8}, {"id": "18501", "uc": 3.5967, "sc": 0.0407, "sp": "Gastroenterology", "ap": 98.8}, {"id": "11637", "uc": 0.342, "sc": 0.0407, "sp": "Gastroenterology", "ap": 74.4}, {"id": "18592", "uc": 0.2318, "sc": 0.0407, "sp": "Neuro/Rheum/Pulm", "ap": 74.4}, {"id": "2410", "uc": 0.5681, "sc": 0.0407, "sp": "Internal Medicine", "ap": 41.9}, {"id": "206", "uc": 0.0485, "sc": 0.0407, "sp": "Gastroenterology", "ap": 20.9}, {"id": "7780", "uc": 0.2944, "sc": 0.0407, "sp": "Gastroenterology", "ap": 75.6}, {"id": "821", "uc": 1.4294, "sc": 0.0407, "sp": "Internal Medicine", "ap": 93.0}, {"id": "19685", "uc": 0.4196, "sc": 0.0333, "sp": "Gastroenterology", "ap": 83.7}, {"id": "6356", "uc": 0.6075, "sc": 0.0333, "sp": "Gastroenterology", "ap": 98.8}, {"id": "17355", "uc": 0.6128, "sc": 0.0333, "sp": "Gastroenterology", "ap": 94.2}, {"id": "15321", "uc": 0.586, "sc": 0.0333, "sp": "Gastroenterology", "ap": 83.7}, {"id": "18897", "uc": 0.384, "sc": 0.0333, "sp": "Gastroenterology", "ap": 84.9}, {"id": "9346", "uc": 0.4489, "sc": 0.0321, "sp": "Gastroenterology", "ap": 87.2}, {"id": "2883", "uc": 0.4831, "sc": 0.0271, "sp": "Internal Medicine", "ap": 60.5}, {"id": "19199", "uc": 0.1818, "sc": 0.0241, "sp": "Pharmacy", "ap": 64.0}, {"id": "15716", "uc": 0.2134, "sc": 0.0241, "sp": "Gastroenterology", "ap": 61.6}, {"id": "11216", "uc": 0.0353, "sc": 0.0241, "sp": "Internal Medicine", "ap": 18.6}, {"id": "19275", "uc": 1.1926, "sc": 0.0241, "sp": "Neuro/Rheum/Pulm", "ap": 96.5}, {"id": "12214", "uc": 0.1425, "sc": 0.0241, "sp": "Gastroenterology", "ap": 52.3}, {"id": "15425", "uc": 0.5704, "sc": 0.0241, "sp": "Gastroenterology", "ap": 91.9}, {"id": "11091", "uc": 2.6182, "sc": 0.0241, "sp": "Internal Medicine", "ap": 98.8}, {"id": "14048", "uc": 0.1297, "sc": 0.0241, "sp": "Gastroenterology", "ap": 27.9}, {"id": "19760", "uc": 0.3785, "sc": 0.0241, "sp": "Gastroenterology", "ap": 86.0}, {"id": "20031", "uc": 3.3452, "sc": 0.0241, "sp": "Gastroenterology", "ap": 98.8}, {"id": "16674", "uc": 1.7193, "sc": 0.0241, "sp": "Pharmacy", "ap": 98.8}, {"id": "17448", "uc": 2.4868, "sc": 0.0241, "sp": "Gastroenterology", "ap": 98.8}, {"id": "12725", "uc": 0.0693, "sc": 0.0241, "sp": "Gastroenterology", "ap": 27.9}, {"id": "16721", "uc": 0.3251, "sc": 0.0241, "sp": "Gastroenterology", "ap": 82.6}, {"id": "8823", "uc": 2.2883, "sc": 0.0241, "sp": "Gastroenterology", "ap": 98.8}, {"id": "13872", "uc": 1.8142, "sc": 0.0241, "sp": "Internal Medicine", "ap": 98.8}, {"id": "18717", "uc": 0.0822, "sc": 0.0241, "sp": "Gastroenterology", "ap": 38.4}, {"id": "16026", "uc": 0.3304, "sc": 0.0241, "sp": "Gastroenterology", "ap": 87.2}, {"id": "351", "uc": 0.2258, "sc": 0.0235, "sp": "Gastroenterology", "ap": 73.3}, {"id": "18270", "uc": 0.5647, "sc": 0.0227, "sp": "Gastroenterology", "ap": 96.5}, {"id": "17376", "uc": 0.3808, "sc": 0.021, "sp": "Pharmacy", "ap": 86.0}, {"id": "15313", "uc": 0.1186, "sc": 0.0167, "sp": "Gastroenterology", "ap": 45.3}, {"id": "13628", "uc": 0.2522, "sc": 0.0167, "sp": "Gastroenterology", "ap": 65.1}, {"id": "15715", "uc": 1.3668, "sc": 0.0167, "sp": "Pharmacy", "ap": 73.3}, {"id": "18961", "uc": 0.118, "sc": 0.0167, "sp": "Neuro/Rheum/Pulm", "ap": 36.0}, {"id": "18269", "uc": 2.4995, "sc": 0.0167, "sp": "Gastroenterology", "ap": 98.8}, {"id": "20406", "uc": 0.0321, "sc": 0.0167, "sp": "Gastroenterology", "ap": 10.5}, {"id": "20377", "uc": 0.3305, "sc": 0.0167, "sp": "Gastroenterology", "ap": 87.2}, {"id": "127", "uc": 0.1881, "sc": 0.0167, "sp": "Gastroenterology", "ap": 57.0}, {"id": "19323", "uc": 2.4965, "sc": 0.0167, "sp": "Gastroenterology", "ap": 98.8}, {"id": "19317", "uc": 1.7294, "sc": 0.0167, "sp": "Neuro/Rheum/Pulm", "ap": 98.8}, {"id": "15535", "uc": 0.4508, "sc": 0.0167, "sp": "Gastroenterology", "ap": 73.3}, {"id": "4525", "uc": 0.1305, "sc": 0.0167, "sp": "Internal Medicine", "ap": 46.5}, {"id": "8610", "uc": 0.1037, "sc": 0.0167, "sp": "Gastroenterology", "ap": 39.5}, {"id": "7201", "uc": 0.3004, "sc": 0.0167, "sp": "Internal Medicine", "ap": 77.9}, {"id": "17474", "uc": 0.4912, "sc": 0.0167, "sp": "Gastroenterology", "ap": 91.9}, {"id": "15760", "uc": 0.1392, "sc": 0.0167, "sp": "Other Spec", "ap": 47.7}, {"id": "17411", "uc": 0.0965, "sc": 0.0167, "sp": "Pharmacy", "ap": 34.9}, {"id": "16353", "uc": 0.5686, "sc": 0.0167, "sp": "Gastroenterology", "ap": 86.0}, {"id": "14184", "uc": 0.5734, "sc": 0.0165, "sp": "Gastroenterology", "ap": 97.7}, {"id": "5245", "uc": 0.9556, "sc": 0.0139, "sp": "Internal Medicine", "ap": 98.8}, {"id": "12793", "uc": 0.1706, "sc": 0.0135, "sp": "Gastroenterology", "ap": 62.8}, {"id": "19665", "uc": 0.5147, "sc": 0.0135, "sp": "Pharmacy", "ap": 93.0}, {"id": "19799", "uc": 0.5692, "sc": 0.0135, "sp": "Gastroenterology", "ap": 81.4}, {"id": "19712", "uc": 0.6095, "sc": 0.0135, "sp": "GP/Family Med", "ap": 94.2}, {"id": "19320", "uc": 0.3287, "sc": 0.0135, "sp": "Gastroenterology", "ap": 86.0}, {"id": "14774", "uc": 0.5698, "sc": 0.0135, "sp": "Gastroenterology", "ap": 95.3}, {"id": "19296", "uc": 0.3013, "sc": 0.0135, "sp": "Gastroenterology", "ap": 76.7}, {"id": "17611", "uc": 0.2365, "sc": 0.0135, "sp": "Gastroenterology", "ap": 64.0}, {"id": "15417", "uc": 1.0448, "sc": 0.0135, "sp": "Gastroenterology", "ap": 98.8}, {"id": "7", "uc": 0.465, "sc": 0.0135, "sp": "Gastroenterology", "ap": 89.5}, {"id": "9204", "uc": 0.7378, "sc": 0.0135, "sp": "Internal Medicine", "ap": 97.7}, {"id": "11805", "uc": 0.0834, "sc": 0.0135, "sp": "Gastroenterology", "ap": 31.4}, {"id": "9326", "uc": 0.7037, "sc": 0.0135, "sp": "Gastroenterology", "ap": 93.0}, {"id": "10916", "uc": 0.166, "sc": 0.0135, "sp": "Gastroenterology", "ap": 54.7}, {"id": "9930", "uc": 0.0328, "sc": 0.0135, "sp": "Internal Medicine", "ap": 17.4}, {"id": "3930", "uc": 0.4781, "sc": 0.0135, "sp": "Internal Medicine", "ap": 81.4}, {"id": "13931", "uc": 0.1217, "sc": 0.0135, "sp": "Gastroenterology", "ap": 47.7}, {"id": "19491", "uc": 0.263, "sc": 0.0133, "sp": "Gastroenterology", "ap": 84.9}, {"id": "18788", "uc": 0.2033, "sc": 0.0109, "sp": "Internal Medicine", "ap": 73.3}, {"id": "12439", "uc": 0.508, "sc": 0.0108, "sp": "Neuro/Rheum/Pulm", "ap": 38.4}, {"id": "17533", "uc": 0.6207, "sc": 0.0108, "sp": "Internal Medicine", "ap": 73.3}, {"id": "8808", "uc": 1.5029, "sc": 0.0108, "sp": "Gastroenterology", "ap": 73.3}, {"id": "20288", "uc": 2.0677, "sc": 0.0107, "sp": "Gastroenterology", "ap": 98.8}, {"id": "19461", "uc": 0.7903, "sc": 0.0071, "sp": "Gastroenterology", "ap": 96.5}, {"id": "5435", "uc": 0.1508, "sc": 0.0069, "sp": "Internal Medicine", "ap": 58.1}, {"id": "15820", "uc": 0.1738, "sc": 0.0069, "sp": "Gastroenterology", "ap": 48.8}, {"id": "9610", "uc": 0.6485, "sc": 0.0061, "sp": "Gastroenterology", "ap": 95.3}, {"id": "17162", "uc": 0.808, "sc": 0.0061, "sp": "Gastroenterology", "ap": 97.7}, {"id": "9466", "uc": 0.5821, "sc": 0.0061, "sp": "Internal Medicine", "ap": 93.0}, {"id": "17043", "uc": 0.1778, "sc": 0.0061, "sp": "Internal Medicine", "ap": 54.7}, {"id": "17003", "uc": 4.2734, "sc": 0.0061, "sp": "Internal Medicine", "ap": 98.8}, {"id": "19101", "uc": 0.1424, "sc": 0.0061, "sp": "Gastroenterology", "ap": 46.5}, {"id": "19064", "uc": 0.2171, "sc": 0.0061, "sp": "Gastroenterology", "ap": 70.9}, {"id": "16653", "uc": 0.0721, "sc": 0.0061, "sp": "Gastroenterology", "ap": 23.3}, {"id": "3077", "uc": 1.0915, "sc": 0.0061, "sp": "Internal Medicine", "ap": 98.8}, {"id": "18989", "uc": 0.2515, "sc": 0.0061, "sp": "Gastroenterology", "ap": 72.1}, {"id": "19013", "uc": 0.305, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 79.1}, {"id": "17125", "uc": 0.3958, "sc": 0.0061, "sp": "Internal Medicine", "ap": 83.7}, {"id": "16670", "uc": 0.3304, "sc": 0.0061, "sp": "Gastroenterology", "ap": 81.4}, {"id": "17091", "uc": 0.5397, "sc": 0.0061, "sp": "Pharmacy", "ap": 97.7}, {"id": "9316", "uc": 0.8985, "sc": 0.0061, "sp": "Internal Medicine", "ap": 97.7}, {"id": "16948", "uc": 0.1862, "sc": 0.0061, "sp": "Gastroenterology", "ap": 60.5}, {"id": "16705", "uc": 0.2578, "sc": 0.0061, "sp": "Gastroenterology", "ap": 64.0}, {"id": "16524", "uc": 0.661, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 96.5}, {"id": "16738", "uc": 0.0178, "sc": 0.0061, "sp": "Gastroenterology", "ap": 9.3}, {"id": "17111", "uc": 0.6482, "sc": 0.0061, "sp": "Gastroenterology", "ap": 93.0}, {"id": "9115", "uc": 0.0526, "sc": 0.0061, "sp": "Other Spec", "ap": 23.3}, {"id": "16664", "uc": 0.1987, "sc": 0.0061, "sp": "Gastroenterology", "ap": 60.5}, {"id": "12717", "uc": 0.8001, "sc": 0.0061, "sp": "Gastroenterology", "ap": 98.8}, {"id": "19203", "uc": 0.1375, "sc": 0.0061, "sp": "Gastroenterology", "ap": 55.8}, {"id": "16024", "uc": 1.0881, "sc": 0.0061, "sp": "Internal Medicine", "ap": 98.8}, {"id": "1729", "uc": 1.295, "sc": 0.0061, "sp": "Internal Medicine", "ap": 98.8}, {"id": "9981", "uc": 1.4031, "sc": 0.0061, "sp": "Internal Medicine", "ap": 98.8}, {"id": "16150", "uc": 0.5378, "sc": 0.0061, "sp": "Internal Medicine", "ap": 89.5}, {"id": "19244", "uc": 0.3965, "sc": 0.0061, "sp": "Pharmacy", "ap": 81.4}, {"id": "16245", "uc": 0.1782, "sc": 0.0061, "sp": "Gastroenterology", "ap": 58.1}, {"id": "19241", "uc": 0.1086, "sc": 0.0061, "sp": "Gastroenterology", "ap": 32.6}, {"id": "16292", "uc": 0.2844, "sc": 0.0061, "sp": "Gastroenterology", "ap": 83.7}, {"id": "9764", "uc": 0.3703, "sc": 0.0061, "sp": "Pharmacy", "ap": 77.9}, {"id": "16364", "uc": 1.6092, "sc": 0.0061, "sp": "Internal Medicine", "ap": 98.8}, {"id": "16367", "uc": 0.4935, "sc": 0.0061, "sp": "Gastroenterology", "ap": 88.4}, {"id": "16381", "uc": 0.3421, "sc": 0.0061, "sp": "Gastroenterology", "ap": 76.7}, {"id": "19109", "uc": 0.9064, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 98.8}, {"id": "16397", "uc": 0.3836, "sc": 0.0061, "sp": "Internal Medicine", "ap": 81.4}, {"id": "2239", "uc": 0.8142, "sc": 0.0061, "sp": "Internal Medicine", "ap": 98.8}, {"id": "19188", "uc": 2.304, "sc": 0.0061, "sp": "Gastroenterology", "ap": 98.8}, {"id": "2398", "uc": 0.8854, "sc": 0.0061, "sp": "Internal Medicine", "ap": 98.8}, {"id": "16438", "uc": 3.1992, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 98.8}, {"id": "16449", "uc": 0.3354, "sc": 0.0061, "sp": "Gastroenterology", "ap": 83.7}, {"id": "16458", "uc": 0.3883, "sc": 0.0061, "sp": "Gastroenterology", "ap": 86.0}, {"id": "9681", "uc": 0.4892, "sc": 0.0061, "sp": "Gastroenterology", "ap": 88.4}, {"id": "2506", "uc": 0.1408, "sc": 0.0061, "sp": "Internal Medicine", "ap": 51.2}, {"id": "19136", "uc": 0.5869, "sc": 0.0061, "sp": "Pharmacy", "ap": 95.3}, {"id": "8706", "uc": 0.8026, "sc": 0.0061, "sp": "Internal Medicine", "ap": 96.5}, {"id": "17266", "uc": 0.0244, "sc": 0.0061, "sp": "Gastroenterology", "ap": 12.8}, {"id": "18982", "uc": 2.7586, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 98.8}, {"id": "17285", "uc": 0.46, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 91.9}, {"id": "6747", "uc": 0.7615, "sc": 0.0061, "sp": "Internal Medicine", "ap": 91.9}, {"id": "18699", "uc": 0.5388, "sc": 0.0061, "sp": "Gastroenterology", "ap": 93.0}, {"id": "18101", "uc": 0.6042, "sc": 0.0061, "sp": "Gastroenterology", "ap": 95.3}, {"id": "18660", "uc": 0.5984, "sc": 0.0061, "sp": "Gastroenterology", "ap": 89.5}, {"id": "18144", "uc": 0.1913, "sc": 0.0061, "sp": "Internal Medicine", "ap": 38.4}, {"id": "6933", "uc": 0.2712, "sc": 0.0061, "sp": "Gastroenterology", "ap": 69.8}, {"id": "18644", "uc": 0.1743, "sc": 0.0061, "sp": "Internal Medicine", "ap": 59.3}, {"id": "18159", "uc": 0.3432, "sc": 0.0061, "sp": "Gastroenterology", "ap": 70.9}, {"id": "18163", "uc": 0.3719, "sc": 0.0061, "sp": "Gastroenterology", "ap": 54.7}, {"id": "18609", "uc": 0.282, "sc": 0.0061, "sp": "Internal Medicine", "ap": 74.4}, {"id": "6574", "uc": 1.1432, "sc": 0.0061, "sp": "Gastroenterology", "ap": 98.8}, {"id": "18023", "uc": 0.0749, "sc": 0.0061, "sp": "Gastroenterology", "ap": 27.9}, {"id": "6521", "uc": 0.3506, "sc": 0.0061, "sp": "Gastroenterology", "ap": 77.9}, {"id": "5734", "uc": 0.3029, "sc": 0.0061, "sp": "Internal Medicine", "ap": 86.0}, {"id": "18523", "uc": 0.6173, "sc": 0.0061, "sp": "GP/Family Med", "ap": 70.9}, {"id": "6267", "uc": 0.8468, "sc": 0.0061, "sp": "Internal Medicine", "ap": 91.9}, {"id": "18335", "uc": 0.189, "sc": 0.0061, "sp": "Gastroenterology", "ap": 62.8}, {"id": "18369", "uc": 0.8434, "sc": 0.0061, "sp": "Gastroenterology", "ap": 91.9}, {"id": "6397", "uc": 0.3219, "sc": 0.0061, "sp": "Internal Medicine", "ap": 76.7}, {"id": "18389", "uc": 0.7645, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 98.8}, {"id": "18493", "uc": 0.1957, "sc": 0.0061, "sp": "Internal Medicine", "ap": 68.6}, {"id": "18429", "uc": 0.9948, "sc": 0.0061, "sp": "Pharmacy", "ap": 98.8}, {"id": "6336", "uc": 1.2193, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 93.0}, {"id": "18700", "uc": 0.2126, "sc": 0.0061, "sp": "Gastroenterology", "ap": 50.0}, {"id": "17977", "uc": 0.2839, "sc": 0.0061, "sp": "Internal Medicine", "ap": 70.9}, {"id": "17297", "uc": 0.6927, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 98.8}, {"id": "8417", "uc": 1.2035, "sc": 0.0061, "sp": "Gastroenterology", "ap": 97.7}, {"id": "17301", "uc": 0.2167, "sc": 0.0061, "sp": "Gastroenterology", "ap": 61.6}, {"id": "19331", "uc": 0.1553, "sc": 0.0061, "sp": "Pharmacy", "ap": 20.9}, {"id": "17341", "uc": 1.5542, "sc": 0.0061, "sp": "Pharmacy", "ap": 98.8}, {"id": "3372", "uc": 0.1223, "sc": 0.0061, "sp": "Internal Medicine", "ap": 39.5}, {"id": "17369", "uc": 1.0319, "sc": 0.0061, "sp": "Pharmacy", "ap": 97.7}, {"id": "12679", "uc": 1.0107, "sc": 0.0061, "sp": "Gastroenterology", "ap": 98.8}, {"id": "17406", "uc": 0.2416, "sc": 0.0061, "sp": "Internal Medicine", "ap": 76.7}, {"id": "18977", "uc": 0.5666, "sc": 0.0061, "sp": "Gastroenterology", "ap": 93.0}, {"id": "8567", "uc": 0.4884, "sc": 0.0061, "sp": "Gastroenterology", "ap": 96.5}, {"id": "3806", "uc": 0.3614, "sc": 0.0061, "sp": "Internal Medicine", "ap": 59.3}, {"id": "17475", "uc": 0.222, "sc": 0.0061, "sp": "Gastroenterology", "ap": 79.1}, {"id": "18951", "uc": 0.8498, "sc": 0.0061, "sp": "Gastroenterology", "ap": 96.5}, {"id": "7138", "uc": 1.1258, "sc": 0.0061, "sp": "Gastroenterology", "ap": 98.8}, {"id": "17580", "uc": 0.3538, "sc": 0.0061, "sp": "Gastroenterology", "ap": 74.4}, {"id": "17583", "uc": 0.2087, "sc": 0.0061, "sp": "Gastroenterology", "ap": 72.1}, {"id": "8087", "uc": 0.1529, "sc": 0.0061, "sp": "Internal Medicine", "ap": 60.5}, {"id": "4123", "uc": 0.5312, "sc": 0.0061, "sp": "Internal Medicine", "ap": 89.5}, {"id": "7785", "uc": 0.2801, "sc": 0.0061, "sp": "Gastroenterology", "ap": 72.1}, {"id": "18885", "uc": 0.4548, "sc": 0.0061, "sp": "Internal Medicine", "ap": 91.9}, {"id": "7684", "uc": 0.4606, "sc": 0.0061, "sp": "Internal Medicine", "ap": 77.9}, {"id": "4301", "uc": 0.3997, "sc": 0.0061, "sp": "Internal Medicine", "ap": 88.4}, {"id": "5357", "uc": 0.1308, "sc": 0.0061, "sp": "Internal Medicine", "ap": 52.3}, {"id": "7548", "uc": 0.6735, "sc": 0.0061, "sp": "Gastroenterology", "ap": 95.3}, {"id": "18476", "uc": 0.4394, "sc": 0.0061, "sp": "Gastroenterology", "ap": 87.2}, {"id": "656", "uc": 0.0882, "sc": 0.0061, "sp": "Internal Medicine", "ap": 22.1}, {"id": "14825", "uc": 0.2932, "sc": 0.0061, "sp": "Gastroenterology", "ap": 81.4}, {"id": "20051", "uc": 0.2605, "sc": 0.0061, "sp": "Gastroenterology", "ap": 76.7}, {"id": "14061", "uc": 0.239, "sc": 0.0061, "sp": "Gastroenterology", "ap": 61.6}, {"id": "11315", "uc": 0.3993, "sc": 0.0061, "sp": "Gastroenterology", "ap": 91.9}, {"id": "14045", "uc": 0.461, "sc": 0.0061, "sp": "Internal Medicine", "ap": 94.2}, {"id": "19898", "uc": 1.3085, "sc": 0.0061, "sp": "Pharmacy", "ap": 98.8}, {"id": "11285", "uc": 2.4023, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 98.8}, {"id": "12266", "uc": 0.1873, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 31.4}, {"id": "19346", "uc": 0.187, "sc": 0.0061, "sp": "Gastroenterology", "ap": 61.6}, {"id": "11275", "uc": 1.1261, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 96.5}, {"id": "783", "uc": 0.3392, "sc": 0.0061, "sp": "Internal Medicine", "ap": 75.6}, {"id": "917", "uc": 1.212, "sc": 0.0061, "sp": "Internal Medicine", "ap": 93.0}, {"id": "14031", "uc": 1.1177, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 98.8}, {"id": "19816", "uc": 0.199, "sc": 0.0061, "sp": "Gastroenterology", "ap": 32.6}, {"id": "11081", "uc": 0.2477, "sc": 0.0061, "sp": "Internal Medicine", "ap": 70.9}, {"id": "20333", "uc": 0.4482, "sc": 0.0061, "sp": "Gastroenterology", "ap": 90.7}, {"id": "19801", "uc": 0.2374, "sc": 0.0061, "sp": "Gastroenterology", "ap": 67.4}, {"id": "72", "uc": 0.1839, "sc": 0.0061, "sp": "Gastroenterology", "ap": 54.7}, {"id": "11025", "uc": 0.4984, "sc": 0.0061, "sp": "Gastroenterology", "ap": 89.5}, {"id": "14811", "uc": 0.435, "sc": 0.0061, "sp": "Gastroenterology", "ap": 89.5}, {"id": "13895", "uc": 2.2774, "sc": 0.0061, "sp": "Gastroenterology", "ap": 98.8}, {"id": "11338", "uc": 0.9243, "sc": 0.0061, "sp": "Gastroenterology", "ap": 97.7}, {"id": "114", "uc": 0.4727, "sc": 0.0061, "sp": "Gastroenterology", "ap": 82.6}, {"id": "12140", "uc": 0.4272, "sc": 0.0061, "sp": "Gastroenterology", "ap": 91.9}, {"id": "14419", "uc": 1.8236, "sc": 0.0061, "sp": "Internal Medicine", "ap": 98.8}, {"id": "11476", "uc": 0.3636, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 89.5}, {"id": "11416", "uc": 0.8794, "sc": 0.0061, "sp": "Gastroenterology", "ap": 96.5}, {"id": "14441", "uc": 0.4496, "sc": 0.0061, "sp": "Pharmacy", "ap": 82.6}, {"id": "12196", "uc": 0.2933, "sc": 0.0061, "sp": "Gastroenterology", "ap": 75.6}, {"id": "14454", "uc": 0.6385, "sc": 0.0061, "sp": "Internal Medicine", "ap": 90.7}, {"id": "14176", "uc": 0.428, "sc": 0.0061, "sp": "Other Spec", "ap": 91.9}, {"id": "11397", "uc": 0.1661, "sc": 0.0061, "sp": "Gastroenterology", "ap": 55.8}, {"id": "14473", "uc": 0.1171, "sc": 0.0061, "sp": "Gastroenterology", "ap": 38.4}, {"id": "164", "uc": 0.2934, "sc": 0.0061, "sp": "Gastroenterology", "ap": 74.4}, {"id": "14514", "uc": 0.4612, "sc": 0.0061, "sp": "Internal Medicine", "ap": 88.4}, {"id": "165", "uc": 0.5929, "sc": 0.0061, "sp": "Gastroenterology", "ap": 51.2}, {"id": "20218", "uc": 0.2599, "sc": 0.0061, "sp": "Pharmacy", "ap": 61.6}, {"id": "20289", "uc": 0.6697, "sc": 0.0061, "sp": "Gastroenterology", "ap": 95.3}, {"id": "202", "uc": 0.1727, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 36.0}, {"id": "20292", "uc": 0.3965, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 77.9}, {"id": "94", "uc": 0.3666, "sc": 0.0061, "sp": "Pharmacy", "ap": 65.1}, {"id": "243", "uc": 0.3753, "sc": 0.0061, "sp": "Gastroenterology", "ap": 84.9}, {"id": "14103", "uc": 0.1463, "sc": 0.0061, "sp": "Gastroenterology", "ap": 51.2}, {"id": "14733", "uc": 0.3932, "sc": 0.0061, "sp": "Gastroenterology", "ap": 86.0}, {"id": "20162", "uc": 0.7174, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 87.2}, {"id": "14302", "uc": 1.5227, "sc": 0.0061, "sp": "Internal Medicine", "ap": 98.8}, {"id": "10977", "uc": 1.4246, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 98.8}, {"id": "15706", "uc": 0.6873, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 93.0}, {"id": "12", "uc": 0.2093, "sc": 0.0061, "sp": "Pharmacy", "ap": 62.8}, {"id": "10861", "uc": 0.0263, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 14.0}, {"id": "15748", "uc": 0.738, "sc": 0.0061, "sp": "Gastroenterology", "ap": 96.5}, {"id": "10844", "uc": 0.423, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 91.9}, {"id": "10821", "uc": 2.2852, "sc": 0.0061, "sp": "Internal Medicine", "ap": 98.8}, {"id": "15814", "uc": 0.451, "sc": 0.0061, "sp": "Gastroenterology", "ap": 68.6}, {"id": "19460", "uc": 3.1046, "sc": 0.0061, "sp": "Pharmacy", "ap": 98.8}, {"id": "15821", "uc": 0.4038, "sc": 0.0061, "sp": "Gastroenterology", "ap": 93.0}, {"id": "10766", "uc": 0.3277, "sc": 0.0061, "sp": "Gastroenterology", "ap": 75.6}, {"id": "15674", "uc": 1.4282, "sc": 0.0061, "sp": "Gastroenterology", "ap": 96.5}, {"id": "13253", "uc": 0.3743, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 79.1}, {"id": "13214", "uc": 0.2101, "sc": 0.0061, "sp": "Internal Medicine", "ap": 67.4}, {"id": "15890", "uc": 0.1179, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 41.9}, {"id": "15911", "uc": 0.6938, "sc": 0.0061, "sp": "Gastroenterology", "ap": 80.2}, {"id": "19350", "uc": 0.3166, "sc": 0.0061, "sp": "Pharmacy", "ap": 79.1}, {"id": "20631", "uc": 2.0405, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 77.9}, {"id": "1121", "uc": 1.0307, "sc": 0.0061, "sp": "Internal Medicine", "ap": 98.8}, {"id": "12841", "uc": 1.3856, "sc": 0.0061, "sp": "Internal Medicine", "ap": 98.8}, {"id": "15678", "uc": 0.1596, "sc": 0.0061, "sp": "Gastroenterology", "ap": 59.3}, {"id": "11732", "uc": 0.4916, "sc": 0.0061, "sp": "Internal Medicine", "ap": 87.2}, {"id": "20545", "uc": 1.3966, "sc": 0.0061, "sp": "Pharmacy", "ap": 97.7}, {"id": "60", "uc": 0.6839, "sc": 0.0061, "sp": "Gastroenterology", "ap": 97.7}, {"id": "20386", "uc": 0.1169, "sc": 0.0061, "sp": "Gastroenterology", "ap": 43.0}, {"id": "15461", "uc": 0.1782, "sc": 0.0061, "sp": "Gastroenterology", "ap": 39.5}, {"id": "10922", "uc": 0.0977, "sc": 0.0061, "sp": "Gastroenterology", "ap": 41.9}, {"id": "15466", "uc": 0.3855, "sc": 0.0061, "sp": "Gastroenterology", "ap": 83.7}, {"id": "13674", "uc": 0.5963, "sc": 0.0061, "sp": "Gastroenterology", "ap": 93.0}, {"id": "15477", "uc": 1.5462, "sc": 0.0061, "sp": "Internal Medicine", "ap": 98.8}, {"id": "12395", "uc": 0.1445, "sc": 0.0061, "sp": "Gastroenterology", "ap": 59.3}, {"id": "19728", "uc": 0.3107, "sc": 0.0061, "sp": "Gastroenterology", "ap": 79.1}, {"id": "1082", "uc": 0.4516, "sc": 0.0061, "sp": "Internal Medicine", "ap": 94.2}, {"id": "10902", "uc": 0.3203, "sc": 0.0061, "sp": "Gastroenterology", "ap": 84.9}, {"id": "15627", "uc": 0.5214, "sc": 0.0061, "sp": "Other Spec", "ap": 90.7}, {"id": "36", "uc": 0.576, "sc": 0.0061, "sp": "Gastroenterology", "ap": 88.4}, {"id": "19613", "uc": 0.4388, "sc": 0.0061, "sp": "Gastroenterology", "ap": 50.0}, {"id": "15635", "uc": 1.2409, "sc": 0.0061, "sp": "Gastroenterology", "ap": 97.7}, {"id": "1099", "uc": 0.7442, "sc": 0.0061, "sp": "Internal Medicine", "ap": 97.7}, {"id": "15649", "uc": 1.8993, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 98.8}, {"id": "15638", "uc": 1.8162, "sc": 0.0061, "sp": "Neuro/Rheum/Pulm", "ap": 98.8}, {"id": "15644", "uc": 0.6524, "sc": 0.0061, "sp": "Gastroenterology", "ap": 95.3}, {"id": "16915", "uc": 0.163, "sc": 0.006, "sp": "Gastroenterology", "ap": 60.5}, {"id": "14949", "uc": 0.1583, "sc": 0.0059, "sp": "Internal Medicine", "ap": 64.0}, {"id": "8609", "uc": 0.0953, "sc": 0.0056, "sp": "Gastroenterology", "ap": 39.5}, {"id": "16260", "uc": 0.0493, "sc": 0.0054, "sp": "Neuro/Rheum/Pulm", "ap": 10.5}, {"id": "15334", "uc": 0.1884, "sc": 0.0052, "sp": "Gastroenterology", "ap": 54.7}, {"id": "9619", "uc": 0.1794, "sc": 0.0051, "sp": "Neuro/Rheum/Pulm", "ap": 64.0}, {"id": "16088", "uc": 0.3296, "sc": 0.005, "sp": "Internal Medicine", "ap": 74.4}, {"id": "6487", "uc": 0.1578, "sc": 0.005, "sp": "Gastroenterology", "ap": 48.8}, {"id": "13880", "uc": 1.5014, "sc": 0.0049, "sp": "Internal Medicine", "ap": 98.8}, {"id": "8748", "uc": 0.2636, "sc": 0.0048, "sp": "Gastroenterology", "ap": 79.1}, {"id": "1907", "uc": 0.3787, "sc": 0.0043, "sp": "Internal Medicine", "ap": 81.4}, {"id": "16787", "uc": 0.5245, "sc": 0.004, "sp": "Internal Medicine", "ap": 89.5}, {"id": "8591", "uc": 0.1842, "sc": 0.004, "sp": "Internal Medicine", "ap": 61.6}, {"id": "10403", "uc": 0.058, "sc": 0.0038, "sp": "Gastroenterology", "ap": 32.6}, {"id": "18631", "uc": 0.2776, "sc": 0.0035, "sp": "Internal Medicine", "ap": 70.9}, {"id": "17130", "uc": 0.0812, "sc": 0.0035, "sp": "Gastroenterology", "ap": 31.4}, {"id": "1150", "uc": 0.3407, "sc": 0.0034, "sp": "Internal Medicine", "ap": 72.1}, {"id": "18445", "uc": 0.3614, "sc": 0.0034, "sp": "Internal Medicine", "ap": 89.5}, {"id": "2023", "uc": 1.1057, "sc": 0.0034, "sp": "Internal Medicine", "ap": 98.8}, {"id": "19372", "uc": 0.3869, "sc": 0.0034, "sp": "Pharmacy", "ap": 90.7}, {"id": "19142", "uc": 0.2765, "sc": 0.0034, "sp": "Pharmacy", "ap": 67.4}, {"id": "2615", "uc": 0.3599, "sc": 0.0034, "sp": "Internal Medicine", "ap": 74.4}, {"id": "19030", "uc": 1.1528, "sc": 0.0034, "sp": "Neuro/Rheum/Pulm", "ap": 69.8}, {"id": "1092", "uc": 0.3713, "sc": 0.0034, "sp": "Internal Medicine", "ap": 77.9}, {"id": "20405", "uc": 0.6234, "sc": 0.0034, "sp": "Pharmacy", "ap": 90.7}, {"id": "19747", "uc": 0.0274, "sc": 0.0034, "sp": "Gastroenterology", "ap": 15.1}, {"id": "1036", "uc": 1.3929, "sc": 0.0034, "sp": "Internal Medicine", "ap": 97.7}, {"id": "2810", "uc": 0.214, "sc": 0.0034, "sp": "Internal Medicine", "ap": 45.3}, {"id": "20274", "uc": 0.7605, "sc": 0.0034, "sp": "Neuro/Rheum/Pulm", "ap": 61.6}, {"id": "2946", "uc": 0.3931, "sc": 0.0034, "sp": "Internal Medicine", "ap": 86.0}, {"id": "925", "uc": 0.7767, "sc": 0.0034, "sp": "Internal Medicine", "ap": 75.6}, {"id": "20258", "uc": 0.5186, "sc": 0.0034, "sp": "Internal Medicine", "ap": 84.9}, {"id": "3191", "uc": 1.3174, "sc": 0.0034, "sp": "Internal Medicine", "ap": 98.8}, {"id": "19894", "uc": 0.5414, "sc": 0.0034, "sp": "Pharmacy", "ap": 91.9}, {"id": "590", "uc": 0.9325, "sc": 0.0034, "sp": "Internal Medicine", "ap": 96.5}, {"id": "19990", "uc": 0.5111, "sc": 0.0034, "sp": "Pharmacy", "ap": 91.9}, {"id": "18942", "uc": 0.9269, "sc": 0.0034, "sp": "Gastroenterology", "ap": 95.3}, {"id": "5673", "uc": 0.3914, "sc": 0.0034, "sp": "Internal Medicine", "ap": 83.7}, {"id": "18937", "uc": 0.2572, "sc": 0.0034, "sp": "Gastroenterology", "ap": 69.8}, {"id": "3923", "uc": 0.1723, "sc": 0.0034, "sp": "Internal Medicine", "ap": 57.0}, {"id": "18930", "uc": 0.3843, "sc": 0.0034, "sp": "Neuro/Rheum/Pulm", "ap": 75.6}, {"id": "18878", "uc": 0.4118, "sc": 0.0034, "sp": "Internal Medicine", "ap": 90.7}, {"id": "18862", "uc": 1.2815, "sc": 0.0034, "sp": "Neuro/Rheum/Pulm", "ap": 98.8}, {"id": "1138", "uc": 1.2326, "sc": 0.0034, "sp": "Internal Medicine", "ap": 98.8}, {"id": "17405", "uc": 0.0508, "sc": 0.0034, "sp": "Gastroenterology", "ap": 18.6}, {"id": "16494", "uc": 0.2875, "sc": 0.0034, "sp": "Neuro/Rheum/Pulm", "ap": 64.0}, {"id": "15523", "uc": 0.3043, "sc": 0.0034, "sp": "Internal Medicine", "ap": 79.1}, {"id": "14921", "uc": 0.4821, "sc": 0.0034, "sp": "Neuro/Rheum/Pulm", "ap": 91.9}, {"id": "14490", "uc": 0.6064, "sc": 0.0034, "sp": "Internal Medicine", "ap": 96.5}, {"id": "8277", "uc": 0.1669, "sc": 0.0034, "sp": "Other Spec", "ap": 60.5}, {"id": "17519", "uc": 0.42, "sc": 0.0034, "sp": "Gastroenterology", "ap": 88.4}, {"id": "15567", "uc": 0.3918, "sc": 0.0034, "sp": "Internal Medicine", "ap": 90.7}, {"id": "12303", "uc": 0.126, "sc": 0.0034, "sp": "Internal Medicine", "ap": 39.5}, {"id": "8571", "uc": 0.6017, "sc": 0.0034, "sp": "Internal Medicine", "ap": 72.1}, {"id": "8714", "uc": 0.2554, "sc": 0.0034, "sp": "Gastroenterology", "ap": 73.3}, {"id": "15691", "uc": 0.9695, "sc": 0.0034, "sp": "Neuro/Rheum/Pulm", "ap": 58.1}, {"id": "17077", "uc": 0.9476, "sc": 0.0034, "sp": "Pharmacy", "ap": 97.7}, {"id": "15816", "uc": 0.5641, "sc": 0.0034, "sp": "Gastroenterology", "ap": 87.2}, {"id": "10680", "uc": 0.3838, "sc": 0.0034, "sp": "GP/Family Med", "ap": 76.7}, {"id": "16637", "uc": 0.7123, "sc": 0.0034, "sp": "Gastroenterology", "ap": 97.7}, {"id": "15923", "uc": 0.2722, "sc": 0.0034, "sp": "Neuro/Rheum/Pulm", "ap": 73.3}, {"id": "14255", "uc": 1.3459, "sc": 0.0034, "sp": "Internal Medicine", "ap": 98.8}, {"id": "9494", "uc": 1.6348, "sc": 0.0034, "sp": "Pharmacy", "ap": 98.8}, {"id": "15945", "uc": 0.4044, "sc": 0.0034, "sp": "Gastroenterology", "ap": 87.2}, {"id": "10354", "uc": 0.4694, "sc": 0.0034, "sp": "Other Spec", "ap": 90.7}, {"id": "16018", "uc": 1.0492, "sc": 0.0034, "sp": "Pharmacy", "ap": 74.4}, {"id": "16468", "uc": 1.1605, "sc": 0.0034, "sp": "Pharmacy", "ap": 98.8}, {"id": "10228", "uc": 0.5371, "sc": 0.0034, "sp": "Internal Medicine", "ap": 86.0}, {"id": "11354", "uc": 0.0833, "sc": 0.0034, "sp": "Gastroenterology", "ap": 40.7}, {"id": "9701", "uc": 0.7944, "sc": 0.0034, "sp": "Neuro/Rheum/Pulm", "ap": 82.6}, {"id": "16028", "uc": 0.0503, "sc": 0.0034, "sp": "Internal Medicine", "ap": 16.3}, {"id": "14395", "uc": 0.3382, "sc": 0.0034, "sp": "Gastroenterology", "ap": 82.6}, {"id": "12392", "uc": 0.3465, "sc": 0.0034, "sp": "Gastroenterology", "ap": 77.9}, {"id": "13937", "uc": 0.6762, "sc": 0.0034, "sp": "Internal Medicine", "ap": 97.7}, {"id": "18110", "uc": 1.2337, "sc": 0.0034, "sp": "Internal Medicine", "ap": 98.8}, {"id": "18157", "uc": 0.7831, "sc": 0.0034, "sp": "Gastroenterology", "ap": 96.5}, {"id": "18170", "uc": 0.5118, "sc": 0.0034, "sp": "Internal Medicine", "ap": 66.3}, {"id": "6879", "uc": 0.715, "sc": 0.0034, "sp": "Pharmacy", "ap": 93.0}, {"id": "18062", "uc": 0.5958, "sc": 0.0034, "sp": "Internal Medicine", "ap": 94.2}, {"id": "7099", "uc": 1.5173, "sc": 0.0034, "sp": "Internal Medicine", "ap": 98.8}, {"id": "18277", "uc": 0.183, "sc": 0.0034, "sp": "Gastroenterology", "ap": 57.0}, {"id": "11251", "uc": 0.4489, "sc": 0.0034, "sp": "Neuro/Rheum/Pulm", "ap": 89.5}, {"id": "15106", "uc": 0.5566, "sc": 0.0034, "sp": "Neuro/Rheum/Pulm", "ap": 72.1}, {"id": "17947", "uc": 0.3426, "sc": 0.0034, "sp": "Gastroenterology", "ap": 79.1}, {"id": "17944", "uc": 0.1528, "sc": 0.0034, "sp": "Gastroenterology", "ap": 38.4}, {"id": "15039", "uc": 0.3538, "sc": 0.0034, "sp": "Internal Medicine", "ap": 84.9}, {"id": "13293", "uc": 0.6249, "sc": 0.0034, "sp": "Gastroenterology", "ap": 91.9}, {"id": "10972", "uc": 0.6373, "sc": 0.0034, "sp": "Internal Medicine", "ap": 96.5}, {"id": "17800", "uc": 0.4896, "sc": 0.0034, "sp": "Gastroenterology", "ap": 55.8}, {"id": "17775", "uc": 0.5017, "sc": 0.0034, "sp": "Pharmacy", "ap": 65.1}, {"id": "15229", "uc": 1.7964, "sc": 0.0034, "sp": "Pharmacy", "ap": 72.1}, {"id": "10236", "uc": 1.2869, "sc": 0.0033, "sp": "Internal Medicine", "ap": 98.8}, {"id": "17575", "uc": 0.5416, "sc": 0.0029, "sp": "Pharmacy", "ap": 97.7}, {"id": "20403", "uc": 0.6379, "sc": 0.0028, "sp": "Pharmacy", "ap": 94.2}, {"id": "19359", "uc": 0.1684, "sc": 0.0027, "sp": "Internal Medicine", "ap": 69.8}, {"id": "10660", "uc": 0.0805, "sc": 0.0027, "sp": "Gastroenterology", "ap": 34.9}, {"id": "14549", "uc": 0.4557, "sc": 0.0027, "sp": "Internal Medicine", "ap": 94.2}, {"id": "255", "uc": 0.0789, "sc": 0.0027, "sp": "Neuro/Rheum/Pulm", "ap": 26.7}, {"id": "19930", "uc": 0.2354, "sc": 0.0027, "sp": "Gastroenterology", "ap": 59.3}, {"id": "11332", "uc": 0.3558, "sc": 0.0027, "sp": "Gastroenterology", "ap": 90.7}, {"id": "15029", "uc": 0.2112, "sc": 0.0027, "sp": "Internal Medicine", "ap": 60.5}, {"id": "11073", "uc": 0.378, "sc": 0.0027, "sp": "Internal Medicine", "ap": 80.2}, {"id": "11225", "uc": 0.1319, "sc": 0.0027, "sp": "Gastroenterology", "ap": 48.8}, {"id": "10885", "uc": 0.5854, "sc": 0.0027, "sp": "Neuro/Rheum/Pulm", "ap": 95.3}, {"id": "15659", "uc": 0.0517, "sc": 0.0027, "sp": "Neuro/Rheum/Pulm", "ap": 20.9}, {"id": "15663", "uc": 0.055, "sc": 0.0027, "sp": "Gastroenterology", "ap": 23.3}, {"id": "19568", "uc": 0.2176, "sc": 0.0027, "sp": "Gastroenterology", "ap": 70.9}, {"id": "728", "uc": 0.0388, "sc": 0.0027, "sp": "Internal Medicine", "ap": 19.8}, {"id": "15720", "uc": 0.2877, "sc": 0.0027, "sp": "Neuro/Rheum/Pulm", "ap": 83.7}, {"id": "15488", "uc": 0.3158, "sc": 0.0027, "sp": "Internal Medicine", "ap": 76.7}, {"id": "15198", "uc": 0.0835, "sc": 0.0027, "sp": "Gastroenterology", "ap": 38.4}, {"id": "11386", "uc": 0.3732, "sc": 0.0027, "sp": "Gastroenterology", "ap": 77.9}, {"id": "20015", "uc": 0.1384, "sc": 0.0027, "sp": "Internal Medicine", "ap": 39.5}, {"id": "17304", "uc": 0.1233, "sc": 0.0027, "sp": "Gastroenterology", "ap": 44.2}, {"id": "12463", "uc": 0.4177, "sc": 0.0027, "sp": "Internal Medicine", "ap": 82.6}, {"id": "18851", "uc": 0.0647, "sc": 0.0027, "sp": "Gastroenterology", "ap": 31.4}, {"id": "17728", "uc": 0.2603, "sc": 0.0027, "sp": "Gastroenterology", "ap": 79.1}, {"id": "17641", "uc": 0.2227, "sc": 0.0027, "sp": "Gastroenterology", "ap": 69.8}, {"id": "17565", "uc": 0.1724, "sc": 0.0027, "sp": "Gastroenterology", "ap": 66.3}, {"id": "12436", "uc": 0.0726, "sc": 0.0027, "sp": "Gastroenterology", "ap": 32.6}, {"id": "18130", "uc": 0.1806, "sc": 0.0027, "sp": "Internal Medicine", "ap": 67.4}, {"id": "18557", "uc": 1.0979, "sc": 0.0027, "sp": "Pharmacy", "ap": 98.8}, {"id": "12256", "uc": 0.4366, "sc": 0.0027, "sp": "Gastroenterology", "ap": 87.2}, {"id": "14113", "uc": 0.1241, "sc": 0.0027, "sp": "Gastroenterology", "ap": 47.7}, {"id": "8920", "uc": 0.0472, "sc": 0.0027, "sp": "Internal Medicine", "ap": 23.3}, {"id": "19020", "uc": 0.3147, "sc": 0.0027, "sp": "GP/Family Med", "ap": 84.9}, {"id": "14124", "uc": 0.0798, "sc": 0.0027, "sp": "Internal Medicine", "ap": 34.9}, {"id": "18710", "uc": 0.2303, "sc": 0.0027, "sp": "Gastroenterology", "ap": 59.3}, {"id": "19023", "uc": 0.2726, "sc": 0.0027, "sp": "Pharmacy", "ap": 79.1}, {"id": "12203", "uc": 1.5629, "sc": 0.0027, "sp": "GP/Family Med", "ap": 97.7}, {"id": "9633", "uc": 0.0923, "sc": 0.0027, "sp": "Neuro/Rheum/Pulm", "ap": 31.4}, {"id": "2526", "uc": 0.0366, "sc": 0.0027, "sp": "Internal Medicine", "ap": 17.4}, {"id": "13", "uc": 0.1452, "sc": 0.0027, "sp": "Gastroenterology", "ap": 55.8}, {"id": "16488", "uc": 0.2895, "sc": 0.0027, "sp": "Neuro/Rheum/Pulm", "ap": 82.6}, {"id": "9683", "uc": 0.1506, "sc": 0.0027, "sp": "Neuro/Rheum/Pulm", "ap": 33.7}, {"id": "12639", "uc": 0.0618, "sc": 0.0027, "sp": "Gastroenterology", "ap": 25.6}, {"id": "16425", "uc": 0.0878, "sc": 0.0027, "sp": "Gastroenterology", "ap": 33.7}, {"id": "18319", "uc": 0.2455, "sc": 0.0027, "sp": "Gastroenterology", "ap": 68.6}, {"id": "158", "uc": 0.3029, "sc": 0.0027, "sp": "Gastroenterology", "ap": 79.1}, {"id": "16290", "uc": 0.141, "sc": 0.0027, "sp": "Gastroenterology", "ap": 52.3}, {"id": "17843", "uc": 0.0597, "sc": 0.0027, "sp": "Internal Medicine", "ap": 32.6}, {"id": "20025", "uc": 0.7765, "sc": 0.0023, "sp": "Pharmacy", "ap": 95.3}, {"id": "2691", "uc": 1.1277, "sc": 0.0022, "sp": "Gastroenterology", "ap": 98.8}, {"id": "8618", "uc": 0.1056, "sc": 0.0015, "sp": "Gastroenterology", "ap": 33.7}, {"id": "15696", "uc": 1.4937, "sc": 0.0015, "sp": "Neuro/Rheum/Pulm", "ap": 98.8}, {"id": "20904", "uc": 0.5162, "sc": 0.0013, "sp": "Gastroenterology", "ap": 95.3}, {"id": "14415", "uc": 0.5076, "sc": 0.0012, "sp": "Internal Medicine", "ap": 95.3}, {"id": "15085", "uc": 0.3223, "sc": 0.0012, "sp": "Internal Medicine", "ap": 66.3}, {"id": "8457", "uc": 1.0543, "sc": 0.0012, "sp": "Gastroenterology", "ap": 98.8}, {"id": "244", "uc": 0.4475, "sc": 0.0009, "sp": "Gastroenterology", "ap": 82.6}, {"id": "6034", "uc": 1.3, "sc": 0.0004, "sp": "Internal Medicine", "ap": 98.8}, {"id": "7636", "uc": 0.5413, "sc": 0.0001, "sp": "Neuro/Rheum/Pulm", "ap": 91.9}, {"id": "19927", "uc": 0.4601, "sc": 0.0001, "sp": "Gastroenterology", "ap": 80.2}, {"id": "16832", "uc": 0.967, "sc": 0.0, "sp": "Internal Medicine", "ap": 98.8}, {"id": "13586", "uc": 0.7256, "sc": 0.0, "sp": "Internal Medicine", "ap": 96.5}, {"id": "14742", "uc": 0.6579, "sc": 0.0, "sp": "Neuro/Rheum/Pulm", "ap": 96.5}, {"id": "11350", "uc": 0.0156, "sc": 0.0, "sp": "Neuro/Rheum/Pulm", "ap": 8.1}, {"id": "12022", "uc": 0.0646, "sc": 0.0, "sp": "Gastroenterology", "ap": 31.4}, {"id": "20229", "uc": 0.4114, "sc": 0.0, "sp": "Gastroenterology", "ap": 80.2}, {"id": "18435", "uc": 0.0647, "sc": 0.0, "sp": "Pharmacy", "ap": 25.6}, {"id": "15028", "uc": 0.4941, "sc": 0.0, "sp": "Internal Medicine", "ap": 88.4}, {"id": "9252", "uc": 0.0498, "sc": 0.0, "sp": "Internal Medicine", "ap": 26.7}, {"id": "18285", "uc": 0.0244, "sc": 0.0, "sp": "Gastroenterology", "ap": 12.8}, {"id": "18549", "uc": 1.3455, "sc": 0.0, "sp": "Internal Medicine", "ap": 98.8}, {"id": "18551", "uc": 0.3426, "sc": 0.0, "sp": "Gastroenterology", "ap": 88.4}, {"id": "18554", "uc": 0.0342, "sc": 0.0, "sp": "Internal Medicine", "ap": 19.8}, {"id": "18627", "uc": 0.3775, "sc": 0.0, "sp": "Internal Medicine", "ap": 83.7}, {"id": "18696", "uc": 0.1618, "sc": 0.0, "sp": "Internal Medicine", "ap": 55.8}, {"id": "17594", "uc": 0.2728, "sc": 0.0, "sp": "Internal Medicine", "ap": 82.6}, {"id": "17581", "uc": 0.0584, "sc": 0.0, "sp": "Gastroenterology", "ap": 27.9}, {"id": "18938", "uc": 0.4607, "sc": 0.0, "sp": "Neuro/Rheum/Pulm", "ap": 93.0}, {"id": "18968", "uc": 0.0067, "sc": 0.0, "sp": "Gastroenterology", "ap": 3.5}, {"id": "8879", "uc": 0.0189, "sc": 0.0, "sp": "Other Spec", "ap": 10.5}, {"id": "17144", "uc": 0.0132, "sc": 0.0, "sp": "Internal Medicine", "ap": 9.3}, {"id": "2929", "uc": 0.0372, "sc": 0.0, "sp": "Internal Medicine", "ap": 18.6}, {"id": "16628", "uc": 0.0642, "sc": 0.0, "sp": "Neuro/Rheum/Pulm", "ap": 30.2}, {"id": "315", "uc": 0.0175, "sc": 0.0, "sp": "Internal Medicine", "ap": 9.3}, {"id": "19201", "uc": 1.2233, "sc": 0.0, "sp": "GP/Family Med", "ap": 98.8}, {"id": "16379", "uc": 0.0435, "sc": 0.0, "sp": "Gastroenterology", "ap": 19.8}, {"id": "9737", "uc": 0.0229, "sc": 0.0, "sp": "Gastroenterology", "ap": 9.3}, {"id": "1911", "uc": 0.0534, "sc": 0.0, "sp": "Internal Medicine", "ap": 26.7}, {"id": "16256", "uc": 0.0621, "sc": 0.0, "sp": "Neuro/Rheum/Pulm", "ap": 24.4}, {"id": "9914", "uc": 0.1648, "sc": 0.0, "sp": "Gastroenterology", "ap": 52.3}, {"id": "16180", "uc": 0.0455, "sc": 0.0, "sp": "Gastroenterology", "ap": 20.9}, {"id": "1789", "uc": 0.0108, "sc": 0.0, "sp": "Internal Medicine", "ap": 5.8}, {"id": "6369", "uc": 0.0739, "sc": 0.0, "sp": "Internal Medicine", "ap": 29.1}, {"id": "1156", "uc": 0.9492, "sc": 0.0, "sp": "Internal Medicine", "ap": 97.7}, {"id": "10275", "uc": 0.0433, "sc": 0.0, "sp": "Internal Medicine", "ap": 23.3}, {"id": "19717", "uc": 0.1052, "sc": 0.0, "sp": "Gastroenterology", "ap": 20.9}, {"id": "10914", "uc": 0.2714, "sc": 0.0, "sp": "Neuro/Rheum/Pulm", "ap": 75.6}, {"id": "1436", "uc": 0.018, "sc": 0.0, "sp": "Internal Medicine", "ap": 9.3}], "covered": [{"id": "17388", "uc": 1.0576, "sc": 0.9667, "sp": "Gastroenterology", "ap": 80.2}, {"id": "19886", "uc": 0.0592, "sc": 0.9667, "sp": "Gastroenterology", "ap": 23.3}, {"id": "11769", "uc": 0.3078, "sc": 0.9667, "sp": "Gastroenterology", "ap": 86.0}, {"id": "14014", "uc": 0.0983, "sc": 0.9667, "sp": "Gastroenterology", "ap": 41.9}, {"id": "18153", "uc": 0.3948, "sc": 0.9667, "sp": "Gastroenterology", "ap": 83.7}, {"id": "17777", "uc": 0.2589, "sc": 0.9667, "sp": "Gastroenterology", "ap": 60.5}, {"id": "17531", "uc": 1.076, "sc": 0.9667, "sp": "Gastroenterology", "ap": 96.5}, {"id": "20201", "uc": 0.1605, "sc": 0.9667, "sp": "Gastroenterology", "ap": 51.2}, {"id": "20265", "uc": 0.5836, "sc": 0.9667, "sp": "Gastroenterology", "ap": 90.7}, {"id": "17164", "uc": 0.5773, "sc": 0.9667, "sp": "Gastroenterology", "ap": 82.6}, {"id": "17160", "uc": 0.5793, "sc": 0.9667, "sp": "Gastroenterology", "ap": 84.9}, {"id": "20306", "uc": 0.2282, "sc": 0.9667, "sp": "Gastroenterology", "ap": 65.1}, {"id": "16879", "uc": 0.3394, "sc": 0.9667, "sp": "Gastroenterology", "ap": 74.4}, {"id": "12900", "uc": 0.3018, "sc": 0.9667, "sp": "Gastroenterology", "ap": 67.4}, {"id": "15869", "uc": 0.2094, "sc": 0.9667, "sp": "Gastroenterology", "ap": 67.4}, {"id": "19863", "uc": 0.229, "sc": 0.9667, "sp": "Gastroenterology", "ap": 69.8}, {"id": "11228", "uc": 0.3827, "sc": 0.9167, "sp": "Gastroenterology", "ap": 75.6}, {"id": "18432", "uc": 0.3309, "sc": 0.9167, "sp": "Gastroenterology", "ap": 82.6}, {"id": "11706", "uc": 0.2282, "sc": 0.9, "sp": "Gastroenterology", "ap": 65.1}, {"id": "18984", "uc": 2.6929, "sc": 0.9, "sp": "Gastroenterology", "ap": 98.8}, {"id": "19245", "uc": 0.1467, "sc": 0.9, "sp": "Gastroenterology", "ap": 46.5}, {"id": "12757", "uc": 0.5208, "sc": 0.9, "sp": "Gastroenterology", "ap": 95.3}, {"id": "10791", "uc": 0.404, "sc": 0.8667, "sp": "Gastroenterology", "ap": 86.0}, {"id": "19102", "uc": 0.416, "sc": 0.8667, "sp": "Gastroenterology", "ap": 83.7}, {"id": "14391", "uc": 0.2735, "sc": 0.8395, "sp": "Gastroenterology", "ap": 80.2}, {"id": "10768", "uc": 0.1771, "sc": 0.8286, "sp": "Gastroenterology", "ap": 55.8}, {"id": "14278", "uc": 0.5768, "sc": 0.8105, "sp": "Gastroenterology", "ap": 89.5}, {"id": "16530", "uc": 0.6191, "sc": 0.8067, "sp": "Gastroenterology", "ap": 94.2}, {"id": "18175", "uc": 0.1301, "sc": 0.7741, "sp": "Gastroenterology", "ap": 41.9}, {"id": "19138", "uc": 0.4313, "sc": 0.7129, "sp": "Gastroenterology", "ap": 93.0}, {"id": "18932", "uc": 0.3472, "sc": 0.6952, "sp": "Gastroenterology", "ap": 84.9}, {"id": "17945", "uc": 0.247, "sc": 0.6733, "sp": "Gastroenterology", "ap": 58.1}, {"id": "15368", "uc": 0.3059, "sc": 0.6452, "sp": "Gastroenterology", "ap": 86.0}, {"id": "8427", "uc": 0.3401, "sc": 0.6169, "sp": "Gastroenterology", "ap": 84.9}, {"id": "19875", "uc": 0.8787, "sc": 0.5352, "sp": "Gastroenterology", "ap": 90.7}, {"id": "18820", "uc": 0.3748, "sc": 0.4949, "sp": "Gastroenterology", "ap": 83.7}, {"id": "15938", "uc": 0.2245, "sc": 0.4707, "sp": "Gastroenterology", "ap": 68.6}, {"id": "16198", "uc": 0.1748, "sc": 0.3046, "sp": "Gastroenterology", "ap": 66.3}, {"id": "6831", "uc": 0.0728, "sc": 0.2246, "sp": "Gastroenterology", "ap": 26.7}, {"id": "19909", "uc": 0.4508, "sc": 0.1968, "sp": "Gastroenterology", "ap": 64.0}, {"id": "17282", "uc": 0.7696, "sc": 0.1879, "sp": "Gastroenterology", "ap": 96.5}, {"id": "15529", "uc": 0.2436, "sc": 0.1703, "sp": "Gastroenterology", "ap": 66.3}, {"id": "14037", "uc": 0.2316, "sc": 0.154, "sp": "Gastroenterology", "ap": 74.4}, {"id": "6681", "uc": 0.9317, "sc": 0.1407, "sp": "Gastroenterology", "ap": 84.9}, {"id": "14534", "uc": 0.8406, "sc": 0.1297, "sp": "Gastroenterology", "ap": 88.4}, {"id": "215", "uc": 0.2982, "sc": 0.1207, "sp": "Neuro/Rheum/Pulm", "ap": 84.9}, {"id": "10056", "uc": 0.1238, "sc": 0.1077, "sp": "Gastroenterology", "ap": 44.2}, {"id": "10106", "uc": 8.3973, "sc": 0.0894, "sp": "Gastroenterology", "ap": 98.8}, {"id": "17149", "uc": 0.0984, "sc": 0.0733, "sp": "Gastroenterology", "ap": 44.2}, {"id": "19021", "uc": 0.4727, "sc": 0.0733, "sp": "Gastroenterology", "ap": 91.9}, {"id": "15810", "uc": 1.3593, "sc": 0.0733, "sp": "Gastroenterology", "ap": 79.1}, {"id": "12407", "uc": 0.2957, "sc": 0.0733, "sp": "Gastroenterology", "ap": 69.8}, {"id": "13575", "uc": 0.5566, "sc": 0.0587, "sp": "Gastroenterology", "ap": 87.2}, {"id": "18312", "uc": 0.2056, "sc": 0.0587, "sp": "Gastroenterology", "ap": 67.4}, {"id": "17184", "uc": 5.8606, "sc": 0.0587, "sp": "Gastroenterology", "ap": 98.8}, {"id": "14969", "uc": 0.06, "sc": 0.0587, "sp": "Gastroenterology", "ap": 30.2}, {"id": "6760", "uc": 1.0285, "sc": 0.0587, "sp": "Gastroenterology", "ap": 98.8}, {"id": "11343", "uc": 0.2044, "sc": 0.0587, "sp": "Gastroenterology", "ap": 66.3}, {"id": "16511", "uc": 0.2018, "sc": 0.0513, "sp": "Gastroenterology", "ap": 60.5}, {"id": "15381", "uc": 0.358, "sc": 0.0407, "sp": "Gastroenterology", "ap": 80.2}, {"id": "20279", "uc": 0.3952, "sc": 0.0407, "sp": "Gastroenterology", "ap": 81.4}, {"id": "16852", "uc": 0.2105, "sc": 0.0407, "sp": "Gastroenterology", "ap": 73.3}, {"id": "10992", "uc": 0.9668, "sc": 0.0407, "sp": "Gastroenterology", "ap": 97.7}, {"id": "10771", "uc": 0.2179, "sc": 0.0407, "sp": "Gastroenterology", "ap": 68.6}, {"id": "16545", "uc": 0.4365, "sc": 0.0407, "sp": "Gastroenterology", "ap": 86.0}, {"id": "16512", "uc": 0.2022, "sc": 0.0407, "sp": "Gastroenterology", "ap": 73.3}, {"id": "16461", "uc": 0.0804, "sc": 0.0407, "sp": "Gastroenterology", "ap": 27.9}, {"id": "14976", "uc": 0.3013, "sc": 0.0407, "sp": "Gastroenterology", "ap": 65.1}, {"id": "16402", "uc": 0.4152, "sc": 0.0407, "sp": "Gastroenterology", "ap": 91.9}, {"id": "15041", "uc": 0.2281, "sc": 0.0407, "sp": "Gastroenterology", "ap": 62.8}, {"id": "16070", "uc": 0.7473, "sc": 0.0407, "sp": "Gastroenterology", "ap": 96.5}, {"id": "15835", "uc": 0.1771, "sc": 0.0407, "sp": "Gastroenterology", "ap": 61.6}, {"id": "15583", "uc": 0.4292, "sc": 0.0407, "sp": "Gastroenterology", "ap": 89.5}, {"id": "16525", "uc": 0.9714, "sc": 0.0407, "sp": "Gastroenterology", "ap": 87.2}, {"id": "19216", "uc": 0.2179, "sc": 0.0407, "sp": "Gastroenterology", "ap": 72.1}, {"id": "11768", "uc": 0.2186, "sc": 0.0407, "sp": "Gastroenterology", "ap": 52.3}, {"id": "14431", "uc": 0.3211, "sc": 0.0407, "sp": "Gastroenterology", "ap": 75.6}, {"id": "20077", "uc": 1.8392, "sc": 0.0407, "sp": "Gastroenterology", "ap": 81.4}, {"id": "18377", "uc": 0.2557, "sc": 0.0407, "sp": "GP/Family Med", "ap": 69.8}, {"id": "18809", "uc": 1.5068, "sc": 0.0407, "sp": "Gastroenterology", "ap": 98.8}, {"id": "19033", "uc": 1.1488, "sc": 0.0407, "sp": "Gastroenterology", "ap": 98.8}, {"id": "8139", "uc": 0.3039, "sc": 0.0407, "sp": "Gastroenterology", "ap": 83.7}, {"id": "17937", "uc": 0.462, "sc": 0.0407, "sp": "Gastroenterology", "ap": 88.4}, {"id": "14565", "uc": 0.5406, "sc": 0.0407, "sp": "Gastroenterology", "ap": 84.9}, {"id": "7592", "uc": 0.5629, "sc": 0.0407, "sp": "Gastroenterology", "ap": 94.2}, {"id": "19100", "uc": 0.1689, "sc": 0.0407, "sp": "Gastroenterology", "ap": 55.8}, {"id": "18979", "uc": 0.5868, "sc": 0.0407, "sp": "Gastroenterology", "ap": 95.3}, {"id": "19903", "uc": 0.1512, "sc": 0.0407, "sp": "Gastroenterology", "ap": 55.8}, {"id": "18985", "uc": 0.382, "sc": 0.0333, "sp": "Gastroenterology", "ap": 73.3}, {"id": "19217", "uc": 0.1857, "sc": 0.0333, "sp": "Gastroenterology", "ap": 62.8}, {"id": "19157", "uc": 0.498, "sc": 0.0301, "sp": "Gastroenterology", "ap": 90.7}, {"id": "14351", "uc": 0.5091, "sc": 0.0301, "sp": "Gastroenterology", "ap": 84.9}, {"id": "15540", "uc": 0.503, "sc": 0.0241, "sp": "Gastroenterology", "ap": 91.9}, {"id": "15374", "uc": 0.2881, "sc": 0.0241, "sp": "Gastroenterology", "ap": 64.0}, {"id": "20224", "uc": 0.4671, "sc": 0.0241, "sp": "Gastroenterology", "ap": 91.9}, {"id": "15901", "uc": 0.2664, "sc": 0.0241, "sp": "Gastroenterology", "ap": 62.8}, {"id": "14583", "uc": 0.3038, "sc": 0.0241, "sp": "Gastroenterology", "ap": 79.1}, {"id": "17882", "uc": 0.1893, "sc": 0.0241, "sp": "Gastroenterology", "ap": 55.8}, {"id": "7623", "uc": 0.0855, "sc": 0.0241, "sp": "Gastroenterology", "ap": 41.9}, {"id": "16010", "uc": 0.2084, "sc": 0.0241, "sp": "Gastroenterology", "ap": 65.1}, {"id": "17512", "uc": 0.2294, "sc": 0.0241, "sp": "Gastroenterology", "ap": 76.7}, {"id": "17916", "uc": 0.2483, "sc": 0.0227, "sp": "Gastroenterology", "ap": 69.8}, {"id": "18990", "uc": 0.3094, "sc": 0.0227, "sp": "Gastroenterology", "ap": 81.4}, {"id": "8652", "uc": 0.4735, "sc": 0.0227, "sp": "Gastroenterology", "ap": 66.3}, {"id": "17681", "uc": 0.4804, "sc": 0.0227, "sp": "Gastroenterology", "ap": 84.9}, {"id": "14196", "uc": 1.8906, "sc": 0.0167, "sp": "Gastroenterology", "ap": 98.8}, {"id": "32", "uc": 0.0526, "sc": 0.0167, "sp": "Gastroenterology", "ap": 24.4}, {"id": "20226", "uc": 0.3824, "sc": 0.0167, "sp": "Gastroenterology", "ap": 76.7}, {"id": "210", "uc": 0.224, "sc": 0.0167, "sp": "Gastroenterology", "ap": 69.8}, {"id": "19128", "uc": 0.1276, "sc": 0.0167, "sp": "Gastroenterology", "ap": 39.5}, {"id": "18685", "uc": 0.2476, "sc": 0.0167, "sp": "Gastroenterology", "ap": 67.4}, {"id": "18508", "uc": 0.3203, "sc": 0.0167, "sp": "Gastroenterology", "ap": 76.7}, {"id": "16081", "uc": 0.0835, "sc": 0.0167, "sp": "Gastroenterology", "ap": 29.1}, {"id": "16308", "uc": 0.1669, "sc": 0.0167, "sp": "Other Spec", "ap": 43.0}, {"id": "18265", "uc": 0.2873, "sc": 0.0135, "sp": "Gastroenterology", "ap": 82.6}, {"id": "20170", "uc": 0.2616, "sc": 0.0135, "sp": "Gastroenterology", "ap": 72.1}, {"id": "15973", "uc": 0.3064, "sc": 0.0135, "sp": "Gastroenterology", "ap": 69.8}, {"id": "13637", "uc": 0.1162, "sc": 0.0135, "sp": "Gastroenterology", "ap": 50.0}, {"id": "16430", "uc": 0.0685, "sc": 0.0135, "sp": "Gastroenterology", "ap": 29.1}, {"id": "18028", "uc": 0.2423, "sc": 0.0135, "sp": "Gastroenterology", "ap": 76.7}, {"id": "19337", "uc": 0.1802, "sc": 0.0135, "sp": "Gastroenterology", "ap": 66.3}, {"id": "16513", "uc": 0.4285, "sc": 0.0061, "sp": "Gastroenterology", "ap": 93.0}, {"id": "19212", "uc": 0.1936, "sc": 0.0061, "sp": "Gastroenterology", "ap": 58.1}, {"id": "16454", "uc": 0.0589, "sc": 0.0061, "sp": "Gastroenterology", "ap": 31.4}, {"id": "18031", "uc": 0.159, "sc": 0.0061, "sp": "Gastroenterology", "ap": 54.7}, {"id": "18075", "uc": 0.059, "sc": 0.0061, "sp": "Gastroenterology", "ap": 26.7}, {"id": "18172", "uc": 0.0174, "sc": 0.0061, "sp": "Gastroenterology", "ap": 9.3}, {"id": "18418", "uc": 0.0476, "sc": 0.0061, "sp": "Gastroenterology", "ap": 24.4}, {"id": "8675", "uc": 0.2052, "sc": 0.0061, "sp": "Gastroenterology", "ap": 70.9}, {"id": "17904", "uc": 0.4237, "sc": 0.0061, "sp": "Gastroenterology", "ap": 76.7}, {"id": "7178", "uc": 0.4005, "sc": 0.0061, "sp": "Gastroenterology", "ap": 82.6}, {"id": "19326", "uc": 0.1188, "sc": 0.0061, "sp": "Gastroenterology", "ap": 47.7}, {"id": "20312", "uc": 0.2055, "sc": 0.0061, "sp": "Gastroenterology", "ap": 65.1}, {"id": "15279", "uc": 0.0107, "sc": 0.0061, "sp": "Gastroenterology", "ap": 5.8}, {"id": "19839", "uc": 0.4081, "sc": 0.0061, "sp": "Gastroenterology", "ap": 83.7}, {"id": "11046", "uc": 0.5748, "sc": 0.0061, "sp": "Gastroenterology", "ap": 93.0}, {"id": "11044", "uc": 0.1403, "sc": 0.0061, "sp": "Gastroenterology", "ap": 55.8}, {"id": "20067", "uc": 0.21, "sc": 0.0061, "sp": "Gastroenterology", "ap": 57.0}, {"id": "10927", "uc": 0.0311, "sc": 0.0061, "sp": "Gastroenterology", "ap": 16.3}, {"id": "15822", "uc": 0.1198, "sc": 0.0061, "sp": "Gastroenterology", "ap": 51.2}, {"id": "19610", "uc": 0.8046, "sc": 0.0061, "sp": "Gastroenterology", "ap": 96.5}, {"id": "15729", "uc": 0.2224, "sc": 0.0061, "sp": "Gastroenterology", "ap": 73.3}, {"id": "19351", "uc": 0.1291, "sc": 0.0061, "sp": "Gastroenterology", "ap": 51.2}, {"id": "15907", "uc": 0.2012, "sc": 0.0061, "sp": "Gastroenterology", "ap": 60.5}, {"id": "13086", "uc": 0.0647, "sc": 0.0061, "sp": "Gastroenterology", "ap": 25.6}]}
|
styles.css
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* ============================================================
|
| 2 |
+
HCP Segmentation Dashboard V2 — Premium Business Theme
|
| 3 |
+
============================================================ */
|
| 4 |
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap');
|
| 5 |
+
|
| 6 |
+
:root {
|
| 7 |
+
--pfizer-deep: #0d009d;
|
| 8 |
+
--pfizer-blue: #0051a5;
|
| 9 |
+
--pfizer-light: #00a3e0;
|
| 10 |
+
--pfizer-sky: #54c8e8;
|
| 11 |
+
|
| 12 |
+
--seg-a: #6B7280;
|
| 13 |
+
--seg-b: #1A6FD4;
|
| 14 |
+
--seg-c: #D4720A;
|
| 15 |
+
--seg-unlabeled: #7C3AED;
|
| 16 |
+
|
| 17 |
+
--bg-body: #f0f2f5;
|
| 18 |
+
--bg-card: #ffffff;
|
| 19 |
+
--bg-active: #eef6fc;
|
| 20 |
+
|
| 21 |
+
--text-primary: #1e293b;
|
| 22 |
+
--text-secondary: #64748b;
|
| 23 |
+
--text-muted: #94a3b8;
|
| 24 |
+
|
| 25 |
+
--border-subtle: #e2e8f0;
|
| 26 |
+
--border-card: #e5e7eb;
|
| 27 |
+
|
| 28 |
+
--accent-green: #0D9E6E;
|
| 29 |
+
--accent-amber: #d97706;
|
| 30 |
+
--accent-coral: #DC3545;
|
| 31 |
+
|
| 32 |
+
--shadow-card: 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04);
|
| 33 |
+
--shadow-card-hover: 0 8px 24px rgba(0,0,0,0.08);
|
| 34 |
+
--shadow-header: 0 1px 8px rgba(0,0,0,0.04);
|
| 35 |
+
--radius-sm: 8px;
|
| 36 |
+
--radius-md: 12px;
|
| 37 |
+
--radius-lg: 16px;
|
| 38 |
+
--radius-xl: 20px;
|
| 39 |
+
--transition-base: 0.25s cubic-bezier(0.4,0,0.2,1);
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
|
| 43 |
+
html{scroll-behavior:smooth}
|
| 44 |
+
body{font-family:'Inter',sans-serif;background:var(--bg-body);color:var(--text-primary);line-height:1.6;min-height:100vh}
|
| 45 |
+
|
| 46 |
+
/* ---- Top Header ---- */
|
| 47 |
+
.top-header{background:var(--bg-card);border-bottom:1px solid var(--border-subtle);padding:14px 32px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:100;box-shadow:var(--shadow-header)}
|
| 48 |
+
.top-header-left{display:flex;align-items:center;gap:20px}
|
| 49 |
+
.top-header-left img{height:32px;width:auto}
|
| 50 |
+
.top-header-left h1{font-size:18px;font-weight:700;color:var(--pfizer-deep);border-left:1px solid var(--border-subtle);padding-left:20px}
|
| 51 |
+
.top-header-left span{font-size:13px;color:var(--text-secondary);margin-left:8px}
|
| 52 |
+
.header-badge{padding:6px 16px;border-radius:20px;font-size:12px;font-weight:600;background:#ecfdf5;color:var(--accent-green);border:1px solid #a7f3d0}
|
| 53 |
+
|
| 54 |
+
/* ---- Tab Navigation ---- */
|
| 55 |
+
.tab-nav{background:var(--bg-card);border-bottom:1px solid var(--border-subtle);padding:0 32px;display:flex;gap:0;overflow-x:auto;-webkit-overflow-scrolling:touch}
|
| 56 |
+
.tab-nav::-webkit-scrollbar{height:0}
|
| 57 |
+
.tab-btn{padding:14px 20px;font-size:13px;font-weight:600;color:var(--text-secondary);cursor:pointer;border:none;background:none;border-bottom:2px solid transparent;transition:var(--transition-base);white-space:nowrap;display:flex;align-items:center;gap:8px}
|
| 58 |
+
.tab-btn:hover{color:var(--pfizer-blue);background:var(--bg-active)}
|
| 59 |
+
.tab-btn.active{color:var(--pfizer-blue);border-bottom-color:var(--pfizer-blue);background:var(--bg-active)}
|
| 60 |
+
|
| 61 |
+
/* ---- Tab Content ---- */
|
| 62 |
+
.tab-content{display:none;padding:32px;max-width:1440px;margin:0 auto;animation:fadeIn 0.35s ease}
|
| 63 |
+
.tab-content.active{display:block}
|
| 64 |
+
@keyframes fadeIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
|
| 65 |
+
|
| 66 |
+
/* ---- Section ---- */
|
| 67 |
+
.section-header{display:flex;align-items:center;gap:16px;margin-bottom:24px}
|
| 68 |
+
.section-icon{width:40px;height:40px;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;font-size:16px;background:rgba(0,81,165,0.08);color:var(--pfizer-blue)}
|
| 69 |
+
.section-title{font-size:20px;font-weight:700;color:var(--text-primary);letter-spacing:-0.3px}
|
| 70 |
+
.section-subtitle{font-size:14px;color:var(--text-secondary);margin-top:2px}
|
| 71 |
+
|
| 72 |
+
/* ---- Grids ---- */
|
| 73 |
+
.grid-2{display:grid;grid-template-columns:repeat(2,1fr);gap:24px}
|
| 74 |
+
.grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:24px}
|
| 75 |
+
.grid-4{display:grid;grid-template-columns:repeat(4,1fr);gap:20px}
|
| 76 |
+
.grid-5{display:grid;grid-template-columns:repeat(5,1fr);gap:20px}
|
| 77 |
+
.grid-2-1{display:grid;grid-template-columns:2fr 1fr;gap:24px}
|
| 78 |
+
|
| 79 |
+
/* ---- Card ---- */
|
| 80 |
+
.card{background:var(--bg-card);border:1px solid var(--border-card);border-radius:var(--radius-lg);padding:24px;box-shadow:var(--shadow-card);transition:var(--transition-base)}
|
| 81 |
+
.card:hover{box-shadow:var(--shadow-card-hover)}
|
| 82 |
+
|
| 83 |
+
/* ---- KPI Card ---- */
|
| 84 |
+
.kpi-card{display:flex;flex-direction:column;gap:8px}
|
| 85 |
+
.kpi-top{display:flex;align-items:center;justify-content:space-between}
|
| 86 |
+
.kpi-label{font-size:11px;color:var(--text-secondary);font-weight:600;text-transform:uppercase;letter-spacing:0.5px}
|
| 87 |
+
.kpi-icon{width:36px;height:36px;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;font-size:14px}
|
| 88 |
+
.kpi-value{font-size:32px;font-weight:800;letter-spacing:-1px;color:var(--pfizer-deep);line-height:1.2}
|
| 89 |
+
.kpi-sub{font-size:13px;color:var(--text-muted);font-weight:500}
|
| 90 |
+
|
| 91 |
+
/* ---- Segment Card ---- */
|
| 92 |
+
.segment-card{position:relative;overflow:hidden}
|
| 93 |
+
.segment-card::before{content:'';position:absolute;top:0;left:0;width:4px;height:100%;border-radius:4px 0 0 4px}
|
| 94 |
+
.seg-a .segment-card::before,.seg-a.segment-card::before{background:var(--seg-a)}
|
| 95 |
+
.seg-b .segment-card::before,.seg-b.segment-card::before{background:var(--seg-b)}
|
| 96 |
+
.seg-c .segment-card::before,.seg-c.segment-card::before{background:var(--seg-c)}
|
| 97 |
+
.segment-name{font-size:18px;font-weight:700;margin-bottom:6px}
|
| 98 |
+
.segment-desc{font-size:14px;color:var(--text-secondary);line-height:1.6;margin-bottom:20px;min-height:66px}
|
| 99 |
+
.segment-stats{display:flex;flex-direction:column;gap:12px}
|
| 100 |
+
.segment-stat{display:flex;justify-content:space-between;align-items:center}
|
| 101 |
+
.segment-stat-label{font-size:13px;color:var(--text-secondary);font-weight:500}
|
| 102 |
+
.segment-stat-value{font-size:14px;font-weight:700}
|
| 103 |
+
.segment-meter{width:100%;height:6px;background:#f1f5f9;border-radius:3px;margin-top:4px;overflow:hidden}
|
| 104 |
+
.segment-meter-fill{height:100%;border-radius:3px;transition:width 1s ease}
|
| 105 |
+
|
| 106 |
+
/* ---- Plotly Container ---- */
|
| 107 |
+
.plotly-chart{width:100%;min-height:340px;border-radius:var(--radius-md);overflow:hidden}
|
| 108 |
+
.plotly-chart-sm{width:100%;min-height:280px}
|
| 109 |
+
.chart-title{font-size:16px;font-weight:700;margin-bottom:16px;color:var(--text-primary);letter-spacing:-0.2px}
|
| 110 |
+
.chart-container{position:relative;width:100%}
|
| 111 |
+
.chart-container canvas{width:100%!important}
|
| 112 |
+
|
| 113 |
+
/* ---- Persona ---- */
|
| 114 |
+
.persona-card{padding:32px}
|
| 115 |
+
.persona-header{display:flex;align-items:center;gap:20px;margin-bottom:24px}
|
| 116 |
+
.persona-avatar{width:64px;height:64px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:22px;font-weight:700;color:#fff;flex-shrink:0}
|
| 117 |
+
.persona-name{font-size:20px;font-weight:700;color:var(--text-primary)}
|
| 118 |
+
.persona-role{font-size:14px;color:var(--text-secondary);margin-top:2px}
|
| 119 |
+
.persona-seg{font-size:13px;font-weight:600;margin-top:4px}
|
| 120 |
+
.persona-detail-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-top:24px}
|
| 121 |
+
.persona-metric{background:#f8fafc;padding:16px;border-radius:var(--radius-md);border:1px solid #f1f5f9}
|
| 122 |
+
.persona-metric-label{font-size:12px;color:var(--text-muted);text-transform:uppercase;font-weight:600;letter-spacing:0.5px}
|
| 123 |
+
.persona-metric-value{font-size:22px;font-weight:800;color:var(--pfizer-deep);margin-top:4px;letter-spacing:-0.5px}
|
| 124 |
+
|
| 125 |
+
/* ---- Badge ---- */
|
| 126 |
+
.badge{display:inline-flex;align-items:center;gap:6px;padding:4px 12px;border-radius:20px;font-size:12px;font-weight:600}
|
| 127 |
+
.badge-green{background:#ecfdf5;color:var(--accent-green)}
|
| 128 |
+
.badge-amber{background:#fffbeb;color:var(--accent-amber)}
|
| 129 |
+
.badge-red{background:#fef2f2;color:var(--accent-coral)}
|
| 130 |
+
.badge-blue{background:#eff6ff;color:var(--pfizer-blue)}
|
| 131 |
+
.badge-sky{background:#f0f9ff;color:var(--pfizer-light)}
|
| 132 |
+
.badge-purple{background:#f5f3ff;color:var(--seg-unlabeled)}
|
| 133 |
+
|
| 134 |
+
/* ---- Alert ---- */
|
| 135 |
+
.alert-box{padding:16px 20px;border-radius:var(--radius-md);font-size:14px;line-height:1.6;display:flex;align-items:flex-start;gap:12px;margin-top:20px}
|
| 136 |
+
.alert-box i{margin-top:3px;font-size:16px}
|
| 137 |
+
.alert-info{background:#eff6ff;border:1px solid #bfdbfe;color:var(--pfizer-blue)}
|
| 138 |
+
.alert-warning{background:#fffbeb;border:1px solid #fde68a;color:var(--accent-amber)}
|
| 139 |
+
.alert-success{background:#ecfdf5;border:1px solid #a7f3d0;color:var(--accent-green)}
|
| 140 |
+
|
| 141 |
+
/* ---- Insight Card ---- */
|
| 142 |
+
.insight-card{border-left:4px solid var(--pfizer-light)}
|
| 143 |
+
.insight-number{font-size:40px;font-weight:900;color:var(--pfizer-sky);opacity:0.25;line-height:1;margin-bottom:8px}
|
| 144 |
+
.insight-title{font-size:16px;font-weight:700;margin-bottom:8px;color:var(--text-primary)}
|
| 145 |
+
.insight-text{font-size:14px;color:var(--text-secondary);line-height:1.6}
|
| 146 |
+
|
| 147 |
+
/* ---- Opportunity Tier Cards ---- */
|
| 148 |
+
.tier-card{border-left:4px solid transparent;padding:20px 24px}
|
| 149 |
+
.tier-card.tier-1{border-left-color:var(--accent-green)}
|
| 150 |
+
.tier-card.tier-2{border-left-color:var(--accent-amber)}
|
| 151 |
+
.tier-card.tier-3{border-left-color:var(--text-muted)}
|
| 152 |
+
.tier-value{font-size:28px;font-weight:800;letter-spacing:-0.5px;line-height:1.2}
|
| 153 |
+
.tier-label{font-size:13px;color:var(--text-secondary);font-weight:600;margin-top:2px}
|
| 154 |
+
.tier-desc{font-size:12px;color:var(--text-muted);margin-top:6px}
|
| 155 |
+
|
| 156 |
+
/* ---- Metric Highlight ---- */
|
| 157 |
+
.metric-highlight{text-align:center;padding:20px;background:#f8fafc;border-radius:var(--radius-md);border:1px solid #f1f5f9}
|
| 158 |
+
.metric-highlight-value{font-size:28px;font-weight:800;color:var(--pfizer-deep);letter-spacing:-0.5px}
|
| 159 |
+
.metric-highlight-label{font-size:12px;color:var(--text-muted);font-weight:600;text-transform:uppercase;letter-spacing:0.5px;margin-top:4px}
|
| 160 |
+
|
| 161 |
+
/* ---- Sub-tabs ---- */
|
| 162 |
+
.sub-tabs{display:flex;gap:12px;margin-bottom:24px;flex-wrap:wrap}
|
| 163 |
+
.sub-tab{padding:10px 24px;border-radius:24px;font-size:14px;font-weight:600;cursor:pointer;border:1px solid var(--border-card);background:var(--bg-card);color:var(--text-secondary);transition:var(--transition-base)}
|
| 164 |
+
.sub-tab:hover{border-color:var(--pfizer-blue);color:var(--pfizer-blue)}
|
| 165 |
+
.sub-tab.active{background:var(--pfizer-deep);color:#fff;border-color:var(--pfizer-deep)}
|
| 166 |
+
.sub-panel{display:none}
|
| 167 |
+
.sub-panel.active{display:block;animation:fadeIn 0.3s ease}
|
| 168 |
+
|
| 169 |
+
/* ---- Data Table ---- */
|
| 170 |
+
.data-table{width:100%;border-collapse:collapse;font-size:14px}
|
| 171 |
+
.data-table thead th{text-align:left;padding:12px 16px;font-weight:600;color:var(--text-secondary);font-size:12px;text-transform:uppercase;letter-spacing:0.5px;border-bottom:2px solid var(--border-subtle);background:#f8fafc}
|
| 172 |
+
.data-table tbody td{padding:12px 16px;border-bottom:1px solid var(--border-subtle)}
|
| 173 |
+
.data-table tbody tr:hover{background:#f8fafc}
|
| 174 |
+
|
| 175 |
+
/* ---- Coverage Gap Badge ---- */
|
| 176 |
+
.coverage-gap{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:var(--radius-sm);font-size:13px;font-weight:600;background:#fef2f2;color:var(--accent-coral);border:1px solid #fecaca}
|
| 177 |
+
|
| 178 |
+
/* ---- Responsive ---- */
|
| 179 |
+
@media(max-width:1200px){.grid-5{grid-template-columns:repeat(3,1fr)}.grid-4{grid-template-columns:repeat(2,1fr)}}
|
| 180 |
+
@media(max-width:900px){.grid-3,.grid-2,.grid-2-1{grid-template-columns:1fr}}
|
| 181 |
+
@media(max-width:600px){.grid-5,.grid-4{grid-template-columns:1fr}.tab-btn{padding:12px 14px;font-size:12px}}
|