Initial commit
This commit is contained in:
335
skills/fda-database/scripts/fda_examples.py
Normal file
335
skills/fda-database/scripts/fda_examples.py
Normal file
@@ -0,0 +1,335 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
FDA API Usage Examples
|
||||
|
||||
Demonstrates common use cases for querying FDA databases.
|
||||
|
||||
Usage:
|
||||
python fda_examples.py
|
||||
"""
|
||||
|
||||
import os
|
||||
from 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()
|
||||
Reference in New Issue
Block a user