335 lines · 10.5 KB · Python
RawDownload
#!/usr/bin/env python3"""FDA API Usage Examples Demonstrates common use cases for querying FDA databases. Usage:    python fda_examples.py""" import osfrom fda_query import FDAQuery  def example_drug_safety_profile(fda, drug_name):    """    Create a comprehensive safety profile for a drug.     Includes:    - Total adverse events    - Most common reactions    - Serious events    - Recent recalls    """    print(f"\n{'='*60}")    print(f"DRUG SAFETY PROFILE: {drug_name}")    print(f"{'='*60}\n")     # 1. Count total adverse events    events = fda.query_drug_events(drug_name, limit=1)    if "meta" in events and "results" in events["meta"]:        total = events["meta"]["results"].get("total", 0)        print(f"Total Adverse Event Reports: {total:,}")     # 2. Most common reactions    print(f"\nMost Common Adverse Reactions:")    reactions = fda.count_by_field(        "drug", "event",        search=f"patient.drug.medicinalproduct:*{drug_name}*",        field="patient.reaction.reactionmeddrapt",        exact=True    )    if "results" in reactions:        for i, item in enumerate(reactions["results"][:10], 1):            print(f"  {i}. {item['term']}: {item['count']:,} reports")     # 3. Serious events    serious_events = fda.query(        "drug", "event",        search=f"patient.drug.medicinalproduct:*{drug_name}*+AND+serious:1",        limit=1    )    if "meta" in serious_events and "results" in serious_events["meta"]:        serious_total = serious_events["meta"]["results"].get("total", 0)        print(f"\nSerious Adverse Events: {serious_total:,}")     # 4. Check for recent recalls    recalls = fda.query_drug_recalls(drug_name=drug_name)    if "results" in recalls and len(recalls["results"]) > 0:        print(f"\nRecent Recalls: {len(recalls['results'])}")        for recall in recalls["results"][:3]:            print(f"  - {recall.get('reason_for_recall', 'Unknown')} "                  f"(Class {recall.get('classification', 'Unknown')})")    else:        print(f"\nRecent Recalls: None found")  def example_device_surveillance(fda, device_name):    """    Monitor medical device safety.     Includes:    - Adverse events    - Event types (death, injury, malfunction)    - Recent recalls    """    print(f"\n{'='*60}")    print(f"DEVICE SURVEILLANCE: {device_name}")    print(f"{'='*60}\n")     # 1. Count adverse events    events = fda.query_device_events(device_name, limit=1)    if "meta" in events and "results" in events["meta"]:        total = events["meta"]["results"].get("total", 0)        print(f"Total Adverse Event Reports: {total:,}")     # 2. Event types    print(f"\nEvent Type Distribution:")    event_types = fda.count_by_field(        "device", "event",        search=f"device.brand_name:*{device_name}*",        field="event_type",        exact=False    )    if "results" in event_types:        for item in event_types["results"]:            print(f"  {item['term']}: {item['count']:,}")     # 3. Recent events    recent = fda.query_device_events(device_name, limit=5)    if "results" in recent and len(recent["results"]) > 0:        print(f"\nRecent Events (sample):")        for i, event in enumerate(recent["results"][:3], 1):            event_type = event.get("event_type", "Unknown")            date = event.get("date_received", "Unknown")            print(f"  {i}. Type: {event_type}, Date: {date}")  def example_food_recall_monitoring(fda, allergen):    """    Monitor food recalls for specific allergen.     Args:        fda: FDAQuery instance        allergen: Allergen to monitor (e.g., "peanut", "milk", "soy")    """    print(f"\n{'='*60}")    print(f"ALLERGEN RECALL MONITORING: {allergen}")    print(f"{'='*60}\n")     # Find recalls mentioning this allergen    recalls = fda.query_food_recalls(reason=allergen)     if "results" in recalls and len(recalls["results"]) > 0:        print(f"Found {len(recalls['results'])} recalls mentioning '{allergen}':\n")         for recall in recalls["results"][:10]:            product = recall.get("product_description", "Unknown product")            classification = recall.get("classification", "Unknown")            reason = recall.get("reason_for_recall", "Unknown")            date = recall.get("recall_initiation_date", "Unknown")            status = recall.get("status", "Unknown")             print(f"Product: {product}")            print(f"  Classification: {classification}")            print(f"  Reason: {reason}")            print(f"  Date: {date}")            print(f"  Status: {status}")            print()    else:        print(f"No recent recalls found for allergen: {allergen}")  def example_substance_lookup(fda, substance_name):    """    Look up substance information.     Includes:    - UNII code    - CAS numbers    - Chemical structure    - Related substances    """    print(f"\n{'='*60}")    print(f"SUBSTANCE INFORMATION: {substance_name}")    print(f"{'='*60}\n")     substances = fda.query_substance_by_name(substance_name)     if "results" in substances and len(substances["results"]) > 0:        for i, substance in enumerate(substances["results"][:3], 1):            print(f"Match {i}:")             # Names            names = substance.get("names", [])            if names:                preferred = next((n["name"] for n in names if n.get("preferred")), names[0].get("name"))                print(f"  Name: {preferred}")             # UNII            unii = substance.get("approvalID")            if unii:                print(f"  UNII: {unii}")             # CAS numbers            codes = substance.get("codes", [])            cas_numbers = [c["code"] for c in codes if "CAS" in c.get("codeSystem", "")]            if cas_numbers:                print(f"  CAS: {', '.join(cas_numbers)}")             # Structure            if "structure" in substance:                structure = substance["structure"]                formula = structure.get("formula")                mol_weight = structure.get("molecularWeight")                 if formula:                    print(f"  Formula: {formula}")                if mol_weight:                    print(f"  Molecular Weight: {mol_weight}")             # Substance class            substance_class = substance.get("substanceClass")            if substance_class:                print(f"  Class: {substance_class}")             print()    else:        print(f"No substances found matching: {substance_name}")  def example_comparative_drug_analysis(fda, drug_list):    """    Compare safety profiles of multiple drugs.     Args:        fda: FDAQuery instance        drug_list: List of drug names to compare    """    print(f"\n{'='*60}")    print(f"COMPARATIVE DRUG ANALYSIS")    print(f"{'='*60}\n")     print(f"Comparing: {', '.join(drug_list)}\n")     comparison = {}     for drug in drug_list:        # Get total events        events = fda.query_drug_events(drug, limit=1)        total = 0        if "meta" in events and "results" in events["meta"]:            total = events["meta"]["results"].get("total", 0)         # Get serious events        serious = fda.query(            "drug", "event",            search=f"patient.drug.medicinalproduct:*{drug}*+AND+serious:1",            limit=1        )        serious_total = 0        if "meta" in serious and "results" in serious["meta"]:            serious_total = serious["meta"]["results"].get("total", 0)         serious_rate = (serious_total / total * 100) if total > 0 else 0         comparison[drug] = {            "total_events": total,            "serious_events": serious_total,            "serious_rate": serious_rate        }     # Display comparison    print(f"{'Drug':<20} {'Total Events':>15} {'Serious Events':>15} {'Serious %':>12}")    print("-" * 65)     for drug, data in comparison.items():        print(f"{drug:<20} {data['total_events']:>15,} "              f"{data['serious_events']:>15,} {data['serious_rate']:>11.2f}%")  def example_veterinary_analysis(fda, species, drug_name):    """    Analyze veterinary drug adverse events by species.     Args:        fda: FDAQuery instance        species: Animal species (e.g., "Dog", "Cat", "Horse")        drug_name: Veterinary drug name    """    print(f"\n{'='*60}")    print(f"VETERINARY DRUG ANALYSIS: {drug_name} in {species}")    print(f"{'='*60}\n")     events = fda.query_animal_events(species=species, drug_name=drug_name)     if "results" in events and len(events["results"]) > 0:        print(f"Found {len(events['results'])} adverse event reports\n")         # Collect reactions        reactions = []        serious_count = 0         for event in events["results"]:            if event.get("serious_ae") == "true":                serious_count += 1             if "reaction" in event:                for reaction in event["reaction"]:                    if "veddra_term_name" in reaction:                        reactions.append(reaction["veddra_term_name"])         print(f"Serious Events: {serious_count} ({serious_count/len(events['results'])*100:.1f}%)")         # Count reactions        from collections import Counter        reaction_counts = Counter(reactions)         print(f"\nMost Common Reactions:")        for reaction, count in reaction_counts.most_common(10):            print(f"  {reaction}: {count}")    else:        print(f"No adverse events found")  def main():    """Run example analyses."""    # Get API key from environment    api_key = os.environ.get("FDA_API_KEY")     if not api_key:        print("Warning: No FDA_API_KEY found in environment.")        print("You can still use the API but with lower rate limits.")        print("Set FDA_API_KEY environment variable for better performance.\n")     # Initialize FDA query client    fda = FDAQuery(api_key=api_key)     # Run examples    try:        # Example 1: Drug safety profile        example_drug_safety_profile(fda, "aspirin")         # Example 2: Device surveillance        example_device_surveillance(fda, "pacemaker")         # Example 3: Food recall monitoring        example_food_recall_monitoring(fda, "undeclared peanut")         # Example 4: Substance lookup        example_substance_lookup(fda, "ibuprofen")         # Example 5: Comparative analysis        example_comparative_drug_analysis(fda, ["aspirin", "ibuprofen", "naproxen"])         # Example 6: Veterinary analysis        example_veterinary_analysis(fda, "Dog", "flea collar")     except Exception as e:        print(f"\nError running examples: {e}")        print("This may be due to API rate limits or connectivity issues.")  if __name__ == "__main__":    main()