cryogenic22/phy_dig_twin
0
1import pandas as pd2import numpy as np3import random4from datetime import datetime, timedelta5 6def generate_physician_segments():7 """Generate simulated physician segment data"""8 segments = [9 "High Volume PCPs",10 "Early Adopter Endocrinologists",11 "Conservative PCPs",12 "Academic Endocrinologists",13 "Urban Health System PCPs",14 "Rural Independent PCPs",15 "Diabetes-Focused PCPs",16 "Cardiologists with Diabetes Interest",17 "Nurse Practitioners in Primary Care",18 "Physician Assistants in Endocrinology"19 ]20 21 data = []22 for segment in segments:23 data.append({24 "Segment": segment,25 "Size": random.randint(1000, 15000),26 "Prescribing Volume": random.randint(50, 200),27 "Digital Engagement": random.uniform(0.1, 0.9),28 "XenoGlip Affinity": random.uniform(0.2, 0.8),29 "Message Receptivity": random.uniform(0.3, 0.9)30 })31 32 return pd.DataFrame(data)33 34def generate_prescription_data():35 """Generate simulated prescription data for the past year"""36 # Create date range for the past year37 end_date = datetime.now()38 start_date = end_date - timedelta(days=365)39 dates = pd.date_range(start=start_date, end=end_date, freq='W')40 41 # Competitors42 competitors = ["XenoGlip", "CompDPP4", "GLP1-A", "GLP1-B", "SGLT2-A", "SGLT2-B"]43 44 # Generate data45 data = []46 for date in dates:47 # Base values48 base_values = {49 "XenoGlip": 8000 + random.randint(-500, 500),50 "CompDPP4": 12000 + random.randint(-800, 800),51 "GLP1-A": 9000 + random.randint(-600, 600),52 "GLP1-B": 7500 + random.randint(-500, 500),53 "SGLT2-A": 11000 + random.randint(-700, 700),54 "SGLT2-B": 6500 + random.randint(-400, 400)55 }56 57 # Add trend over time58 week_num = (date - start_date).days / 759 growth_factor = 1 + (week_num / 52) * 0.15 # 15% annual growth for XenoGlip60 base_values["XenoGlip"] = int(base_values["XenoGlip"] * growth_factor)61 62 # Add data points63 for comp in competitors:64 data.append({65 "Date": date,66 "Product": comp,67 "Prescriptions": base_values[comp]68 })69 70 return pd.DataFrame(data)71 72def generate_key_drivers():73 """Generate key prescription drivers data"""74 drivers = [75 "Efficacy in A1C reduction",76 "Safety profile",77 "Tolerability",78 "Once-daily dosing",79 "Formulary status",80 "Patient cost",81 "Cardiovascular benefits",82 "Weight neutrality",83 "Renal considerations",84 "Low hypoglycemia risk"85 ]86 87 segments = ["PCP", "Endocrinologist", "Cardiologist"]88 89 data = []90 for driver in drivers:91 for segment in segments:92 data.append({93 "Driver": driver,94 "Segment": segment,95 "Importance": random.uniform(0.5, 0.95)96 })97 98 return pd.DataFrame(data)99 100def generate_regional_data():101 """Generate regional prescription data"""102 regions = ["Northeast", "Southeast", "Midwest", "Southwest", "West"]103 104 data = []105 for region in regions:106 data.append({107 "Region": region,108 "Market Share": random.uniform(0.05, 0.25),109 "Growth Rate": random.uniform(-0.05, 0.15),110 "Prescription Volume": random.randint(5000, 20000),111 "Physician Adoption": random.uniform(0.2, 0.6)112 })113 114 return pd.DataFrame(data)115 116def generate_formulary_scenario_data():117 """Generate formulary scenario impact data"""118 scenarios = [119 "Current (Tier 3, PA required)",120 "Tier 2, PA required",121 "Tier 3, No PA",122 "Tier 2, No PA",123 "Tier 1, No PA"124 ]125 126 impact_metrics = ["New Rx Growth", "Overall Share", "Switch from Competitors", "Adherence"]127 128 data = []129 baselines = {130 "New Rx Growth": 0.0,131 "Overall Share": 0.11,132 "Switch from Competitors": 0.0,133 "Adherence": 0.68134 }135 136 # Improvements for each scenario, relative to baseline137 improvements = {138 "Tier 2, PA required": {"New Rx Growth": 0.15, "Overall Share": 0.02, "Switch from Competitors": 0.08, "Adherence": 0.03},139 "Tier 3, No PA": {"New Rx Growth": 0.22, "Overall Share": 0.015, "Switch from Competitors": 0.12, "Adherence": 0.05},140 "Tier 2, No PA": {"New Rx Growth": 0.35, "Overall Share": 0.04, "Switch from Competitors": 0.25, "Adherence": 0.08},141 "Tier 1, No PA": {"New Rx Growth": 0.65, "Overall Share": 0.07, "Switch from Competitors": 0.38, "Adherence": 0.12}142 }143 144 for scenario in scenarios:145 for metric in impact_metrics:146 if scenario == "Current (Tier 3, PA required)":147 value = baselines[metric]148 else:149 value = baselines[metric] + improvements[scenario][metric]150 151 data.append({152 "Scenario": scenario,153 "Metric": metric,154 "Value": value155 })156 157 return pd.DataFrame(data)158 159def generate_message_testing_data():160 """Generate message testing data"""161 messages = [162 "Once-daily dosing for simplicity",163 "Proven efficacy in A1C reduction",164 "Established cardiovascular safety",165 "Minimal hypoglycemia risk",166 "Suitable for renal impairment patients",167 "Weight neutral option",168 "Extensive clinical experience"169 ]170 171 segments = ["High Volume PCPs", "Early Adopter Endocrinologists", "Conservative PCPs", "Academic Endocrinologists"]172 173 data = []174 for message in messages:175 for segment in segments:176 data.append({177 "Message": message,178 "Segment": segment,179 "Receptivity": random.uniform(0.3, 0.9),180 "Impact Score": random.uniform(2.5, 9.5)181 })182 183 return pd.DataFrame(data)184 185def generate_patient_profile_data():186 """Generate patient profile data"""187 # Patient profiles188 profiles = []189 190 # Age groups191 age_groups = ["30-45", "46-60", "61-75", "76+"]192 193 # Comorbidities194 comorbidities = ["Hypertension", "Obesity", "Dyslipidemia", "CKD", "CVD", "None"]195 196 # A1C ranges197 a1c_ranges = ["<7.0", "7.0-7.9", "8.0-8.9", "9.0+"]198 199 # Medications200 current_meds = ["Metformin only", "Met+SU", "Met+DPP4", "Met+SGLT2", "Met+GLP1", "Complex regimen"]201 202 # Generate 50 profiles203 for i in range(50):204 profile = {205 "ID": i + 1,206 "Age Group": random.choice(age_groups),207 "Gender": random.choice(["Male", "Female"]),208 "BMI Category": random.choice(["Normal", "Overweight", "Obese", "Severely Obese"]),209 "A1C Range": random.choice(a1c_ranges),210 "Primary Comorbidity": random.choice(comorbidities),211 "Secondary Comorbidity": random.choice(comorbidities),212 "Current Medication": random.choice(current_meds),213 "Insurance": random.choice(["Commercial", "Medicare", "Medicaid", "Uninsured"]),214 "Years with T2DM": random.randint(1, 20)215 }216 profiles.append(profile)217 218 return pd.DataFrame(profiles)219 220def generate_competitive_analysis_data():221 """Generate competitive analysis data"""222 products = [223 "XenoGlip (DPP-4)",224 "CompDPP4",225 "GLP1-A",226 "GLP1-B",227 "SGLT2-A",228 "SGLT2-B"229 ]230 231 attributes = [232 "A1C Reduction",233 "Weight Effect",234 "Hypoglycemia Risk",235 "Cardiovascular Benefit",236 "Renal Benefit",237 "GI Side Effects",238 "Injection Required",239 "Cost to Patient",240 "Formulary Status"241 ]242 243 # Values for each product-attribute combination244 values = {245 "XenoGlip (DPP-4)": {246 "A1C Reduction": 0.7,247 "Weight Effect": 0.0,248 "Hypoglycemia Risk": 0.05,249 "Cardiovascular Benefit": 0.0,250 "Renal Benefit": 0.1,251 "GI Side Effects": 0.1,252 "Injection Required": 0.0,253 "Cost to Patient": 0.5,254 "Formulary Status": 0.6255 },256 "CompDPP4": {257 "A1C Reduction": 0.65,258 "Weight Effect": 0.0,259 "Hypoglycemia Risk": 0.05,260 "Cardiovascular Benefit": 0.0,261 "Renal Benefit": 0.1,262 "GI Side Effects": 0.1,263 "Injection Required": 0.0,264 "Cost to Patient": 0.5,265 "Formulary Status": 0.7266 },267 "GLP1-A": {268 "A1C Reduction": 1.2,269 "Weight Effect": -0.8,270 "Hypoglycemia Risk": 0.1,271 "Cardiovascular Benefit": 0.8,272 "Renal Benefit": 0.5,273 "GI Side Effects": 0.7,274 "Injection Required": 1.0,275 "Cost to Patient": 0.85,276 "Formulary Status": 0.5277 },278 "GLP1-B": {279 "A1C Reduction": 1.4,280 "Weight Effect": -0.9,281 "Hypoglycemia Risk": 0.1,282 "Cardiovascular Benefit": 0.8,283 "Renal Benefit": 0.6,284 "GI Side Effects": 0.8,285 "Injection Required": 1.0,286 "Cost to Patient": 0.9,287 "Formulary Status": 0.4288 },289 "SGLT2-A": {290 "A1C Reduction": 0.8,291 "Weight Effect": -0.5,292 "Hypoglycemia Risk": 0.05,293 "Cardiovascular Benefit": 0.7,294 "Renal Benefit": 0.8,295 "GI Side Effects": 0.2,296 "Injection Required": 0.0,297 "Cost to Patient": 0.7,298 "Formulary Status": 0.6299 },300 "SGLT2-B": {301 "A1C Reduction": 0.7,302 "Weight Effect": -0.4,303 "Hypoglycemia Risk": 0.05,304 "Cardiovascular Benefit": 0.6,305 "Renal Benefit": 0.7,306 "GI Side Effects": 0.2,307 "Injection Required": 0.0,308 "Cost to Patient": 0.6,309 "Formulary Status": 0.5310 }311 }312 313 data = []314 for product in products:315 for attribute in attributes:316 data.append({317 "Product": product,318 "Attribute": attribute,319 "Value": values[product][attribute]320 })321 322 return pd.DataFrame(data)