diff --git a/clinicaltrials/frontend/management/commands/fdaaa_regulatory_snapshot.csv.gz b/clinicaltrials/frontend/management/commands/fdaaa_regulatory_snapshot.csv.gz new file mode 100644 index 0000000..3edd4a3 Binary files /dev/null and b/clinicaltrials/frontend/management/commands/fdaaa_regulatory_snapshot.csv.gz differ diff --git a/clinicaltrials/frontend/management/commands/load_data.py b/clinicaltrials/frontend/management/commands/load_data.py index fb66532..fd6a48e 100644 --- a/clinicaltrials/frontend/management/commands/load_data.py +++ b/clinicaltrials/frontend/management/commands/load_data.py @@ -13,11 +13,21 @@ import subprocess import json import glob +import gzip import datetime import tempfile import shutil import requests import contextlib +import os +from bs4 import BeautifulSoup +import xmltodict +import json +from datetime import date +from datetime import datetime +from datetime import timedelta +from dateutil.relativedelta import relativedelta +import csv import re from google.cloud.exceptions import NotFound from xml.parsers.expat import ExpatError @@ -28,9 +38,8 @@ logger = logging.getLogger(__name__) - def raw_json_name(): - date = datetime.datetime.now().strftime('%Y-%m-%d') + date = datetime.now().strftime('%Y-%m-%d') return "raw_clincialtrials_json_{}.csv".format(date) @@ -104,7 +113,7 @@ def convert_to_json(): logger.info("Converting to JSON...") dpath = os.path.join(settings.WORKING_DIR, 'NCT*/') files = [x for x in sorted(glob.glob(dpath + '*.xml'))] - start = datetime.datetime.now() + start = datetime.now() completed = 0 with open(os.path.join(settings.WORKING_DIR, raw_json_name()), 'w') as f2: for source in files: @@ -123,13 +132,12 @@ def convert_to_json(): completed += 1 if completed % 100 == 0: - elapsed = datetime.datetime.now() - start + elapsed = datetime.now() - start per_file = elapsed.seconds / completed remaining = int(per_file * (len(files) - completed) / 60.0) logger.info("%s minutes remaining", remaining) - def convert_and_download(): logger.info("Executing SQL in cloud and downloading results...") storage_path = os.path.join(settings.STORAGE_PREFIX, raw_json_name()) @@ -204,10 +212,450 @@ def process_data(): sys.exit(1) +################################### +# Helper functions for CSV assenbly +################################### + +def is_covered_phase(phase): + return phase in [ + "Phase 1/Phase 2", + "Phase 2", + "Phase 2/Phase 3", + "Phase 3", + "Phase 4", + "N/A", + ] + + +def is_not_withdrawn(study_status): + return study_status != "Withdrawn" + + +def is_interventional(study_type): + return study_type == "Interventional" + + +def is_covered_intervention(intervention_type_list): + covered_intervention_type = [ + "Drug", + "Device", + "Biological", + "Genetic", + "Radiation", + "Combination Prodcut", + "Diagnostic Test", + ] + a_set = set(covered_intervention_type) + b_set = set(intervention_type_list) + if a_set & b_set: + return True + else: + return False + + +def is_not_device_feasibility(primary_purpose): + return primary_purpose != "Device Feasibility" + + +def is_fda_reg(fda_reg_drug, fda_reg_device): + if fda_reg_drug == "Yes" or fda_reg_device == "Yes": + return True + else: + return False + + +def is_old_fda_regulated(is_fda_regulated, fda_reg_drug, fda_reg_device): + if ( + fda_reg_drug is None and fda_reg_device is None + ) and is_fda_regulated is not False: + return True + else: + return False + + +def has_us_loc(locs): + us_locs = [ + "United States", + "American Samoa", + "Guam", + "Northern Mariana Islands", + "Puerto Rico", + "Virgin Islands (U.S.)", + ] + if locs: + for us_loc in us_locs: + if us_loc in locs: + return True + return False + + +def dict_or_none(data, keys): + for k in keys: + try: + data = data[k] + except KeyError: + return None + return json.dumps(data, separators=(',', ':')) + + +# Some dates on clinicaltrials.gov are only Month-Year not +# Day-Month-Year. When this happens, we assign them to the last day +# of the month so our "results due" assessments are conservative +def str_to_date(datestr): + is_defaulted_date = False + if datestr is not None: + try: + parsed_date = datetime.strptime(datestr.text, "%B %d, %Y").date() + except ValueError: + parsed_date = ( + datetime.strptime(datestr.text, "%B %Y").date() + + relativedelta(months=+1) + - timedelta(days=1) + ) + is_defaulted_date = True + else: + parsed_date = None + return (parsed_date, is_defaulted_date) + + +def t(textish): + if textish is None: + return None + return textish.text + + +def does_it_exist(dataloc): + if dataloc is None: + return False + else: + return True + + +def convert_bools_to_ints(row): + for k, v in row.items(): + if v is True: + v = 1 + row[k] = v + elif v is False: + v = 0 + row[k] = v + return row + + +def convert_to_csv(): + headers = [ + "nct_id", + "act_flag", + "included_pact_flag", + "has_results", + "pending_results", + "pending_data", + "has_certificate", + "results_due", + "start_date", + "available_completion_date", + "used_primary_completion_date", + "defaulted_pcd_flag", + "defaulted_cd_flag", + "results_submitted_date", + "last_updated_date", + "certificate_date", + "phase", + "enrollment", + "location", + "study_status", + "study_type", + "primary_purpose", + "sponsor", + "sponsor_type", + "collaborators", + "exported", + "fda_reg_drug", + "fda_reg_device", + "is_fda_regulated", + "url", + "title", + "official_title", + "brief_title", + "discrep_date_status", + "late_cert", + "defaulted_date", + "condition", + "condition_mesh", + "intervention", + "intervention_mesh", + "keywords", + ] + + cs = "clinical_study" + effective_date = date(2017, 1, 18) + + # This is a snapshot of CT.gov at a time when it included FDA + # regulation metadata + fda_reg_dict = {} + with gzip.open( + os.path.join(settings.BASE_DIR, + 'frontend', 'management', 'commands', + 'fdaaa_regulatory_snapshot.csv.gz'), 'rt') as old_fda_reg: + reader = csv.DictReader(old_fda_reg) + for d in reader: + fda_reg_dict[d["nct_id"]] = d["is_fda_regulated"] + + + with open(settings.INTERMEDIATE_CSV_PATH, 'w', newline="", encoding="utf-8") as test_csv: + writer = csv.DictWriter(test_csv, fieldnames=headers) + writer.writeheader() + dpath = os.path.join(settings.WORKING_DIR, 'NCT*/') + files = [x for x in sorted(glob.glob(dpath + '*.xml'))] + + for xml_filename in files: + with open(xml_filename) as raw_xml: + soup = BeautifulSoup(raw_xml, "xml") + with open(xml_filename) as xml_to_json: + parsed_json = xmltodict.parse(xml_to_json.read()) + + td = {} + + td["nct_id"] = t(soup.nct_id) + + td["study_type"] = t(soup.study_type) + + td["has_certificate"] = does_it_exist(soup.disposition_first_submitted) + + td["phase"] = t(soup.phase) + + td["fda_reg_drug"] = t(soup.is_fda_regulated_drug) + + td["fda_reg_device"] = t(soup.is_fda_regulated_device) + + td["primary_purpose"] = t(soup.find("primary_purpose")) + + try: + if fda_reg_dict[td["nct_id"]] == "false": + td["is_fda_regulated"] = False + elif fda_reg_dict[td["nct_id"]] == "true": + td["is_fda_regulated"] = True + else: + td["is_fda_regulated"] = None + except KeyError: + td["is_fda_regulated"] = None + td["study_status"] = t(soup.overall_status) + + td["start_date"] = (str_to_date(soup.start_date))[0] + + primary_completion_date, td["defaulted_pcd_flag"] = str_to_date( + soup.primary_completion_date + ) + + completion_date, td["defaulted_cd_flag"] = str_to_date( + soup.completion_date + ) + + if not primary_completion_date and not completion_date: + td["available_completion_date"] = None + elif completion_date and not primary_completion_date: + td["available_completion_date"] = completion_date + td["used_primary_completion_date"] = False + else: + td["available_completion_date"] = primary_completion_date + td["used_primary_completion_date"] = True + + if ( + is_interventional(td["study_type"]) + and is_fda_reg(td["fda_reg_drug"], td["fda_reg_device"]) + and is_covered_phase(td["phase"]) + and is_not_device_feasibility(td["primary_purpose"]) + and td["start_date"] + and td["start_date"] >= effective_date + and is_not_withdrawn(td["study_status"]) + ): + td["act_flag"] = True + else: + td["act_flag"] = False + + intervention_type_field = soup.find_all("intervention_type") + trial_intervention_types = [] + for tag in intervention_type_field: + trial_intervention_types.append(tag.get_text()) + + locs = t(soup.location_countries) + + if ( + is_interventional(td["study_type"]) + and is_covered_intervention(trial_intervention_types) + and is_covered_phase(td["phase"]) + and is_not_device_feasibility(td["primary_purpose"]) + and td["available_completion_date"] + and td["available_completion_date"] >= effective_date + and td["start_date"] + and td["start_date"] < effective_date + and is_not_withdrawn(td["study_status"]) + and ( + is_fda_reg(td["fda_reg_drug"], td["fda_reg_device"]) + or is_old_fda_regulated( + td["is_fda_regulated"], + td["fda_reg_drug"], + td["fda_reg_device"], + ) + ) + and has_us_loc(locs) + ): + old_pact_flag = True + else: + old_pact_flag = False + + if ( + is_interventional(td["study_type"]) + and is_fda_reg(td["fda_reg_drug"], td["fda_reg_device"]) + and is_covered_phase(td["phase"]) + and is_not_device_feasibility(td["primary_purpose"]) + and td["start_date"] + and td["start_date"] < effective_date + and td["available_completion_date"] + and td["available_completion_date"] >= effective_date + and is_not_withdrawn(td["study_status"]) + ): + new_pact_flag = True + else: + new_pact_flag = False + + if old_pact_flag == True or new_pact_flag == True: + td["included_pact_flag"] = True + else: + td["included_pact_flag"] = False + + td["location"] = dict_or_none(parsed_json, [cs, "location_countries"]) + + td["has_results"] = does_it_exist(soup.results_first_submitted) + + td["pending_results"] = does_it_exist(soup.pending_results) + + td["pending_data"] = dict_or_none(parsed_json, [cs, "pending_results"]) + + if ( + (td["act_flag"] == True or td["included_pact_flag"] == True) + and date.today() + > td["available_completion_date"] + + relativedelta(years=1) + + timedelta(days=30) + and ( + td["has_certificate"] == 0 + or ( + date.today() + > td["available_completion_date"] + + relativedelta(years=3) + + timedelta(days=30) + ) + ) + ): + td["results_due"] = True + else: + td["results_due"] = False + + td["results_submitted_date"] = ( + str_to_date(soup.results_first_submitted) + )[0] + + td["last_updated_date"] = (str_to_date(soup.last_update_submitted))[0] + + td["certificate_date"] = ( + str_to_date(soup.disposition_first_submitted) + )[0] + + td["enrollment"] = t(soup.enrollment) + if soup.sponsors and soup.sponsors.lead_sponsor: + td["sponsor"] = t(soup.sponsors.lead_sponsor.agency) + td["sponsor_type"] = t(soup.sponsors.lead_sponsor.agency_class) + else: + td["sponsor"] = td["sponsor_type"] = None + + td["collaborators"] = dict_or_none( + parsed_json, [cs, "sponsors", "collaborator"] + ) + + td["exported"] = t(soup.oversight_info and soup.oversight_info.is_us_export) + + td["url"] = t(soup.url) + + td["official_title"] = t(soup.official_title) + + td["brief_title"] = t(soup.brief_title) + + td["title"] = td["official_title"] or td["brief_title"] + + if td["official_title"] is not None: + td["title"] = td["official_title"] + elif td["official_title"] is None and td["brief_title"] is not None: + td["title"] = td["brief_title"] + else: + td["title"] = None + + not_ongoing = [ + "Unknown status", + "Active, not recruiting", + "Not yet recruiting", + "Enrolling by invitation", + "Suspended", + "Recruiting", + ] + if ( + ( + primary_completion_date is None or + primary_completion_date < date.today() + ) + and completion_date is not None + and completion_date < date.today() + and td["study_status"] in not_ongoing + ): + td["discrep_date_status"] = True + else: + td["discrep_date_status"] = False + + if td["certificate_date"] is not None and td["available_completion_date"] is not None: + if td["certificate_date"] > ( + td["available_completion_date"] + relativedelta(years=1) + ): + td["late_cert"] = True + else: + td["late_cert"] = False + else: + td["late_cert"] = False + + if ( + ( + td.get("used_primary_completion_date", False) + and td.get("defaulted_pcd_flag", False) + ) + or + ( + td.get("used_primary_completion_date", False) + and td.get("defaulted_cd_flag", False) + ) + ): + td["defaulted_date"] = True + else: + td["defaulted_date"] = False + + td["condition"] = dict_or_none(parsed_json, [cs, "condition"]) + + td["condition_mesh"] = dict_or_none( + parsed_json, [cs, "condition_browse"] + ) + + td["intervention"] = dict_or_none(parsed_json, [cs, "intervention"]) + + td["intervention_mesh"] = dict_or_none( + parsed_json, [cs, "intervention_browse"] + ) + + td["keywords"] = dict_or_none(parsed_json, [cs, "keyword"]) + + writer.writerow(convert_bools_to_ints(td)) + + class Command(BaseCommand): help = '''Generate a CSV that can be consumed by the `process_data` command, and run that command ''' - def handle(self, *args, **options): with contextlib.suppress(OSError): os.remove(settings.INTERMEDIATE_CSV_PATH) @@ -215,7 +663,7 @@ def handle(self, *args, **options): download_and_extract() convert_to_json() upload_to_cloud() - convert_and_download() + convert_to_csv() process_data() except: notify_slack("Error in FDAAA import: {}".format(traceback.format_exc())) diff --git a/clinicaltrials/frontend/tests/fixtures/expected_trials_data.csv b/clinicaltrials/frontend/tests/fixtures/expected_trials_data.csv index 9d8ac07..358799d 100644 --- a/clinicaltrials/frontend/tests/fixtures/expected_trials_data.csv +++ b/clinicaltrials/frontend/tests/fixtures/expected_trials_data.csv @@ -1,6 +1,6 @@ nct_id,act_flag,included_pact_flag,has_results,pending_results,pending_data,has_certificate,results_due,start_date,available_completion_date,used_primary_completion_date,defaulted_pcd_flag,defaulted_cd_flag,results_submitted_date,last_updated_date,certificate_date,phase,enrollment,location,study_status,study_type,primary_purpose,sponsor,sponsor_type,collaborators,exported,fda_reg_drug,fda_reg_device,is_fda_regulated,url,title,official_title,brief_title,discrep_date_status,late_cert,defaulted_date,condition,condition_mesh,intervention,intervention_mesh,keywords -NCT01275365,0,1,1,0,,0,1,2011-05-31,2017-01-19,1,0,0,2018-01-19,2018-01-19,,Phase 3,92,"{""country"":""United States""}",Completed,Interventional,Treatment,Brigham and Women's Hospital,Other,,,,,true,https://clinicaltrials.gov/show/NCT01275365,Optimizing Protein Intake in Older Americans With Mobility Limitations,Optimizing Protein Intake in Older Americans With Mobility Limitations,Optimizing Protein Intake in Older Americans With Mobility Limitations,0,0,0,"""Mobility Limitation""","{""mesh_term"":""Mobility Limitation""}","[{""intervention_type"":""Drug"",""intervention_name"":""Testosterone enanthate"",""description"":""Testosterone enanthate 100 mg intramuscularly weekly"",""arm_group_label"":""Testosterone/Low Protein""},{""intervention_type"":""Drug"",""intervention_name"":""Testosterone enanthate"",""description"":""Testosterone enanthate 100 mg intramuscularly weekly"",""arm_group_label"":""Testosterone/High Protein""}]","{""mesh_term"":[""Testosterone"",""Testosterone enanthate"",""Testosterone undecanoate"",""Testosterone 17 beta-cypionate"",""Methyltestosterone""]}","[""Mobility Limitation"",""Low Protein Intake"",""Older Men"",""Testosterone""]" -NCT02251236,0,1,0,0,,0,1,2016-01-31,2017-01-18,1,0,0,,2017-05-22,,N/A,14,"{""country"":""United States""}",Completed,Interventional,Treatment,"University of California, San Diego",Other,"[{""agency"":""Gilead Sciences"",""agency_class"":""Industry""},{""agency"":""University at Buffalo"",""agency_class"":""Other""}]",,,,true,https://clinicaltrials.gov/show/NCT02251236,Elvitegravir (EVG) Cerebrospinal Fluid (CSF) Pharmacokinetics in HIV-Infected Individuals,Elvitegravir (EVG) Cerebrospinal Fluid (CSF) Pharmacokinetics in HIV-Infected Individuals,Elvitegravir (EVG) Cerebrospinal Fluid (CSF) Pharmacokinetics in HIV-Infected Individuals,0,0,0,"""HIV""",,"[{""intervention_type"":""Drug"",""intervention_name"":""Stribild"",""description"":""To be administered orally, once daily with food."",""arm_group_label"":[""Track A"",""Track B""],""other_name"":""Co-formulated elvitegravir/ cobicistat/ emtricitabine/ tenofovir disoproxil fumarate""},{""intervention_type"":""Drug"",""intervention_name"":""Genvoya"",""description"":""To be administered orally, once daily with food."",""arm_group_label"":[""Track A"",""Track B""],""other_name"":""Co-formulated elvitegravir/ cobicistat/ emtricitabine/ tenofovir alafenamide""}]","{""mesh_term"":[""Tenofovir"",""Emtricitabine"",""Emtricitabine, Tenofovir Disoproxil Fumarate Drug Combination"",""Cobicistat"",""Elvitegravir, Cobicistat, Emtricitabine, Tenofovir Disoproxil Fumarate Drug Combination""]}","[""Stribild"",""Genvoya"",""elvitegravir"",""Cerebrospinal Fluid"",""HIV""]" -NCT01891968,0,1,0,0,,0,1,2013-08-07,2017-01-18,1,0,0,,2017-01-24,,Phase 2,15,"{""country"":""United States""}",Completed,Interventional,Treatment,M.D. Anderson Cancer Center,Other,"{""agency"":""Millennium Pharmaceuticals, Inc."",""agency_class"":""Industry""}",,,,true,https://clinicaltrials.gov/show/NCT01891968,Phase II Study of Subcutaneous Bortezomib for Patients With Low or Intermediate-1 Risk Myelodysplastic Syndrome,Phase II Study of Subcutaneous Bortezomib for Patients With Low or Intermediate-1 Risk Myelodysplastic Syndrome,Bortezomib for Low or Intermediate-1 Myelodysplastic Syndrome (MDS) With p65 Activation,0,0,0,"""Leukemia""","{""mesh_term"":[""Myelodysplastic Syndromes"",""Preleukemia""]}","{""intervention_type"":""Drug"",""intervention_name"":""Bortezomib"",""description"":""1.3 mg/m2 subcutaneously on days 1, 4, 8 and 11 of a 28 day cycle."",""arm_group_label"":""Bortezomib"",""other_name"":[""Velcade"",""LDP-341"",""MLN341"",""PS-341""]}","{""mesh_term"":""Bortezomib""}","[""Leukemia"",""Myelodysplastic syndrome"",""MDS"",""Low or intermediate-1"",""Bortezomib"",""Velcade"",""LDP-341"",""MLN341"",""PS-341""]" +NCT01275365,0,1,1,0,,0,1,2011-05-31,2017-01-19,1,0,0,2018-01-19,2018-01-19,,Phase 3,92,"{""country"":""United States""}",Completed,Interventional,Treatment,Brigham and Women's Hospital,Other,,,,,1,https://clinicaltrials.gov/show/NCT01275365,Optimizing Protein Intake in Older Americans With Mobility Limitations,Optimizing Protein Intake in Older Americans With Mobility Limitations,Optimizing Protein Intake in Older Americans With Mobility Limitations,0,0,0,"""Mobility Limitation""","{""mesh_term"":""Mobility Limitation""}","[{""intervention_type"":""Drug"",""intervention_name"":""Testosterone enanthate"",""description"":""Testosterone enanthate 100 mg intramuscularly weekly"",""arm_group_label"":""Testosterone/Low Protein""},{""intervention_type"":""Drug"",""intervention_name"":""Testosterone enanthate"",""description"":""Testosterone enanthate 100 mg intramuscularly weekly"",""arm_group_label"":""Testosterone/High Protein""}]","{""mesh_term"":[""Testosterone"",""Testosterone enanthate"",""Testosterone undecanoate"",""Testosterone 17 beta-cypionate"",""Methyltestosterone""]}","[""Mobility Limitation"",""Low Protein Intake"",""Older Men"",""Testosterone""]" +NCT02251236,0,1,0,0,,0,1,2016-01-31,2017-01-18,1,0,0,,2017-05-22,,N/A,14,"{""country"":""United States""}",Completed,Interventional,Treatment,"University of California, San Diego",Other,"[{""agency"":""Gilead Sciences"",""agency_class"":""Industry""},{""agency"":""University at Buffalo"",""agency_class"":""Other""}]",,,,1,https://clinicaltrials.gov/show/NCT02251236,Elvitegravir (EVG) Cerebrospinal Fluid (CSF) Pharmacokinetics in HIV-Infected Individuals,Elvitegravir (EVG) Cerebrospinal Fluid (CSF) Pharmacokinetics in HIV-Infected Individuals,Elvitegravir (EVG) Cerebrospinal Fluid (CSF) Pharmacokinetics in HIV-Infected Individuals,0,0,0,"""HIV""",,"[{""intervention_type"":""Drug"",""intervention_name"":""Stribild"",""description"":""To be administered orally, once daily with food."",""arm_group_label"":[""Track A"",""Track B""],""other_name"":""Co-formulated elvitegravir/ cobicistat/ emtricitabine/ tenofovir disoproxil fumarate""},{""intervention_type"":""Drug"",""intervention_name"":""Genvoya"",""description"":""To be administered orally, once daily with food."",""arm_group_label"":[""Track A"",""Track B""],""other_name"":""Co-formulated elvitegravir/ cobicistat/ emtricitabine/ tenofovir alafenamide""}]","{""mesh_term"":[""Tenofovir"",""Emtricitabine"",""Emtricitabine, Tenofovir Disoproxil Fumarate Drug Combination"",""Cobicistat"",""Elvitegravir, Cobicistat, Emtricitabine, Tenofovir Disoproxil Fumarate Drug Combination""]}","[""Stribild"",""Genvoya"",""elvitegravir"",""Cerebrospinal Fluid"",""HIV""]" +NCT01891968,0,1,0,0,,0,1,2013-08-07,2017-01-18,1,0,0,,2017-01-24,,Phase 2,15,"{""country"":""United States""}",Completed,Interventional,Treatment,M.D. Anderson Cancer Center,Other,"{""agency"":""Millennium Pharmaceuticals, Inc."",""agency_class"":""Industry""}",,,,1,https://clinicaltrials.gov/show/NCT01891968,Phase II Study of Subcutaneous Bortezomib for Patients With Low or Intermediate-1 Risk Myelodysplastic Syndrome,Phase II Study of Subcutaneous Bortezomib for Patients With Low or Intermediate-1 Risk Myelodysplastic Syndrome,Bortezomib for Low or Intermediate-1 Myelodysplastic Syndrome (MDS) With p65 Activation,0,0,0,"""Leukemia""","{""mesh_term"":[""Myelodysplastic Syndromes"",""Preleukemia""]}","{""intervention_type"":""Drug"",""intervention_name"":""Bortezomib"",""description"":""1.3 mg/m2 subcutaneously on days 1, 4, 8 and 11 of a 28 day cycle."",""arm_group_label"":""Bortezomib"",""other_name"":[""Velcade"",""LDP-341"",""MLN341"",""PS-341""]}","{""mesh_term"":""Bortezomib""}","[""Leukemia"",""Myelodysplastic syndrome"",""MDS"",""Low or intermediate-1"",""Bortezomib"",""Velcade"",""LDP-341"",""MLN341"",""PS-341""]" NCT03400163,0,1,0,0,,1,0,2015-05-08,2017-01-18,1,0,0,,2018-01-17,2018-01-17,Phase 2,3,"{""country"":""United States""}",Completed,Interventional,Treatment,Bristol-Myers Squibb,Industry,,,Yes,No,,https://clinicaltrials.gov/show/NCT03400163,"A Randomized, Double-Blind, Placebo-Controlled, Parallel Group, Multiple Dose Sub-study to Evaluate the Safety, Pharmacokinetics and Pharmacodynamic Effects of BMS-986036 in Adults With Non-alcoholic Steatohepatitis","A Randomized, Double-Blind, Placebo-Controlled, Parallel Group, Multiple Dose Sub-study to Evaluate the Safety, Pharmacokinetics and Pharmacodynamic Effects of BMS-986036 in Adults With Non-alcoholic Steatohepatitis",A Sub-study of BMS-986036 in Subjects With Non-Alcoholic Steatohepatitis (NASH),0,0,0,"""Non-Alcoholic Steatohepatitis""","{""mesh_term"":[""Fatty Liver"",""Non-alcoholic Fatty Liver Disease""]}","[{""intervention_type"":""Drug"",""intervention_name"":""BMS-986036"",""description"":""BMS-986036 20 mg QD"",""arm_group_label"":""Treatment Group D:""},{""intervention_type"":""Drug"",""intervention_name"":""Placebo"",""description"":""Placebo QD"",""arm_group_label"":""Treatment Group E:""}]",,"[""First Line Therapy"",""NASH""]" -NCT02413372,0,1,0,0,,1,0,2015-05-08,2017-01-18,1,0,0,,2018-01-17,2018-01-17,Phase 2,202,"{""country"":""United States""}",Completed,Interventional,Treatment,Bristol-Myers Squibb,Industry,,,Yes,No,true,https://clinicaltrials.gov/show/NCT02413372,"A Randomized, Double-Blind, Placebo-Controlled, Parallel Group, Multiple Dose Study to Evaluate the Safety, Pharmacokinetics and Pharmacodynamic Effects of BMS-986036 in Adults With Non-alcoholic Steatohepatitis","A Randomized, Double-Blind, Placebo-Controlled, Parallel Group, Multiple Dose Study to Evaluate the Safety, Pharmacokinetics and Pharmacodynamic Effects of BMS-986036 in Adults With Non-alcoholic Steatohepatitis",A Study of BMS-986036 in Subjects With Non-Alcoholic Steatohepatitis (NASH),0,0,0,"""Non-Alcoholic Steatohepatitis""","{""mesh_term"":[""Fatty Liver"",""Non-alcoholic Fatty Liver Disease""]}","[{""intervention_type"":""Drug"",""intervention_name"":""BMS-986036"",""arm_group_label"":""Treatment Group A: BMS-986036""},{""intervention_type"":""Drug"",""intervention_name"":""BMS-986036"",""arm_group_label"":""Treatment Group B: BMS-986036""},{""intervention_type"":""Drug"",""intervention_name"":""Placebo"",""arm_group_label"":""Treatment Group C: Placebo""}]",,"[""First Line Therapy"",""NASH""]" +NCT02413372,0,1,0,0,,1,0,2015-05-08,2017-01-18,1,0,0,,2018-01-17,2018-01-17,Phase 2,202,"{""country"":""United States""}",Completed,Interventional,Treatment,Bristol-Myers Squibb,Industry,,,Yes,No,1,https://clinicaltrials.gov/show/NCT02413372,"A Randomized, Double-Blind, Placebo-Controlled, Parallel Group, Multiple Dose Study to Evaluate the Safety, Pharmacokinetics and Pharmacodynamic Effects of BMS-986036 in Adults With Non-alcoholic Steatohepatitis","A Randomized, Double-Blind, Placebo-Controlled, Parallel Group, Multiple Dose Study to Evaluate the Safety, Pharmacokinetics and Pharmacodynamic Effects of BMS-986036 in Adults With Non-alcoholic Steatohepatitis",A Study of BMS-986036 in Subjects With Non-Alcoholic Steatohepatitis (NASH),0,0,0,"""Non-Alcoholic Steatohepatitis""","{""mesh_term"":[""Fatty Liver"",""Non-alcoholic Fatty Liver Disease""]}","[{""intervention_type"":""Drug"",""intervention_name"":""BMS-986036"",""arm_group_label"":""Treatment Group A: BMS-986036""},{""intervention_type"":""Drug"",""intervention_name"":""BMS-986036"",""arm_group_label"":""Treatment Group B: BMS-986036""},{""intervention_type"":""Drug"",""intervention_name"":""Placebo"",""arm_group_label"":""Treatment Group C: Placebo""}]",,"[""First Line Therapy"",""NASH""]" diff --git a/requirements.in b/requirements.in index 7aa2ab3..1b428ed 100644 --- a/requirements.in +++ b/requirements.in @@ -23,4 +23,5 @@ mistune python-twitter ipython django-extensions -ipdb \ No newline at end of file +ipdb +bs4 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 5ca6b93..3a2b14c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,6 +7,8 @@ asn1crypto==0.24.0 # via cryptography backcall==0.1.0 # via ipython bcrypt==3.1.6 # via paramiko +beautifulsoup4==4.7.1 # via bs4 +bs4==0.0.1 cachetools==3.1.0 # via google-auth certifi==2018.11.29 # via requests cffi==1.11.5 # via bcrypt, cryptography, pynacl @@ -70,6 +72,7 @@ requests==2.21.0 rjsmin==1.0.12 # via django-compressor rsa==4.0 # via google-auth, oauth2client six==1.12.0 # via bcrypt, cryptography, django-extensions, djangorestframework-csv, fabric3, google-api-python-client, google-auth, google-cloud-core, google-resumable-media, libsass, oauth2client, prompt-toolkit, protobuf, pynacl, python-dateutil, tenacity, traitlets +soupsieve==1.9.1 # via beautifulsoup4 tenacity==4.12.0 # via google-cloud-core traitlets==4.3.2 # via ipython tzlocal==1.5.1 # via dateparser