From ac875b1763c9ac02ac1f0b84b7b651a13d433efe Mon Sep 17 00:00:00 2001 From: Daniela Huppenkothen Date: Fri, 3 Feb 2017 17:22:14 -0500 Subject: [PATCH 01/20] Data Wrangling for Drug Use Visualizations (#24) * Pulling drug use classes out of the CMS PUF files for categorizing the Plan D data * Fixed directory creating, refactored df, shortened loop --- cms/druguse_definitions.ipynb | 1484 +++++++++++++++++++++++++++++++++ 1 file changed, 1484 insertions(+) create mode 100644 cms/druguse_definitions.ipynb diff --git a/cms/druguse_definitions.ipynb b/cms/druguse_definitions.ipynb new file mode 100644 index 0000000..2faeaa3 --- /dev/null +++ b/cms/druguse_definitions.ipynb @@ -0,0 +1,1484 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# What are the various drugs prescribed for?\n", + "\n", + "We need some kind of knowledge of which drug is prescribed for which condition. Thankfully, CMS seems to have this information." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'../data/2010_PD_Profiles_PUF.csv'" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import requests # to download the dataset\n", + "import zipfile # to extract from archive\n", + "import shutil # to write the dataset to file\n", + "import os # rename file to something more type-able\n", + "import numpy as np\n", + "\n", + "data_dir = \"../data/\"\n", + "\n", + "try:\n", + " os.stat(data_dir)\n", + "except FileNotFoundError:\n", + " os.mkdir(data_dir)\n", + " \n", + "url = \"https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/BSAPUFS/Downloads/2010_PD_Profiles_PUF.zip\"\n", + "response = requests.get(url, stream=True)\n", + "\n", + "with open(data_dir + 'drug_profiles_dataset.zip', 'wb') as ds_zipout:\n", + " shutil.copyfileobj(response.raw, ds_zipout)\n", + "\n", + "zip = zipfile.ZipFile(data_dir + 'drug_profiles_dataset.zip', 'r')\n", + "ds_filename = zip.namelist()[0]\n", + "zip.extract(ds_filename, path=data_dir)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's load the data and have a look at what's in it:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "puf = pd.read_csv(\"../data/2010_PD_Profiles_PUF.csv\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's drop the columns we don't need right now:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "puf.drop(\"BENE_SEX_IDENT_CD\", axis=1, inplace=True)\n", + "puf.drop(\"BENE_AGE_CAT_CD\", axis=1, inplace=True)\n", + "puf.drop(\"PDE_DRUG_TYPE_CD\", axis=1, inplace=True)\n", + "puf.drop(\"PLAN_TYPE\", axis=1, inplace=True)\n", + "puf.drop([\"COVERAGE_TYPE\", \"benefit_phase\",\"DRUG_BENEFIT_TYPE\",\n", + " \"PRESCRIBER_TYPE\", \"GAP_COVERAGE\", \"TIER_ID\", \"MEAN_RXHCC_SCORE\",\n", + " \"AVE_DAYS_SUPPLY\", \"AVE_TOT_DRUG_COST\", \"AVE_PTNT_PAY_AMT\",\n", + " \"PDE_CNT\", \"BENE_CNT_CAT\"], axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1229" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(puf[\"RXNORM_RXCUI\"].unique())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## RXNorm Identifiers\n", + "\n", + "I need the identifiers for the `RXNORM_RXCUI` column and the `DRUG_MAJOR_CLASS` column.\n", + "\n", + "The former comes from the NIH in the form of a downloadable data table:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "data_dir = '../data/'\n", + "url = \"https://download.nlm.nih.gov/rxnorm/RxNorm_full_prescribe_01032017.zip\"\n", + "response = requests.get(url, stream=True)\n", + "\n", + "with open(data_dir + 'rxnorm_dataset.zip', 'wb') as ds_zipout:\n", + " shutil.copyfileobj(response.raw, ds_zipout)\n", + "\n", + "try:\n", + " os.stat(data_dir+\"rxnorm/\")\n", + "except FileNotFoundError:\n", + " os.mkdir(data_dir+\"rxnorm/\")\n", + " \n", + "zip = zipfile.ZipFile(data_dir + 'rxnorm_dataset.zip', 'r')\n", + "\n", + "ds_filenames = zip.namelist()\n", + "\n", + "for d in ds_filenames:\n", + " zip.extract(d, path=data_dir+\"rxnorm/\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Columns:\n", + "\n", + "* RXCUI\tRxNorm Unique identifier for concept (concept ID)\n", + "* LAT\tLanguage of Term\n", + "* TS\tTerm status (no value provided)\n", + "* LUI\tUnique identifier for term (no value provided)\n", + "* STT\tString type (no value provided)\n", + "* SUI\tUnique identifier for string (no value provided)\n", + "* ISPREF\tAtom status - preferred (Y) or not (N) for this string within this concept (no value provided)\n", + "* RXAUI\tUnique identifier for atom (RxNorm Atom ID)\n", + "* SAUI\tSource asserted atom identifier [optional]\n", + "* SCUI\tSource asserted concept identifier [optional]\n", + "* SDUI\tSource asserted descriptor identifier [optional]\n", + "* SAB\tSource abbreviation\n", + "* TTY\tTerm type in source\n", + "* CODE\t\"Most useful\" source asserted identifier (if the source vocabulary has more than one identifier), or a RxNorm-generated source entry identifier (if the source vocabulary has none.)\n", + "* STR\tString\n", + "* SRL\tSource Restriction Level (no value provided)\n", + "* SUPPRESS\tSuppressible flag. Values = N, O, Y, or E. N - not suppressible. O - Specific individual names (atoms) set as Obsolete because the name is no longer provided by the original source. Y - Suppressed by RxNorm editor. E - unquantified, non-prescribable drug with related quantified, prescribable drugs. NLM strongly recommends that users not alter editor-assigned suppressibility.\n", + "* CVF" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "names = [\"RXCUI\", \"LAT\", \"TS\", \"LUI\", \"STT\", \"SUI\", \"ISPREF\", \"RXAUI\",\n", + " \"SAUI\", \"SCUI\", \"SDUI\", \"SAB\", \"TTY\", \"CODE\", \"STR\", \"SRL\", \"SUPPRESS\", \"CVF\"]\n", + "\n", + "rxnorm = pd.read_csv(\"../data/rxnorm/rrf/RXNCONSO.RRF\", sep=\"|\", names=names, index_col=False,\n", + " usecols=[0,14])" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RXCUISTR
038Parlodel
144mesna
244MESNA
344Mesna
473Docosahexaenoate
\n", + "
" + ], + "text/plain": [ + " RXCUI STR\n", + "0 38 Parlodel\n", + "1 44 mesna\n", + "2 44 MESNA\n", + "3 44 Mesna\n", + "4 73 Docosahexaenoate" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rxnorm.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RXCUISTR
30703228476GATIFLOXACIN
\n", + "
" + ], + "text/plain": [ + " RXCUI STR\n", + "30703 228476 GATIFLOXACIN" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rxnorm[rxnorm[\"STR\"] == \"GATIFLOXACIN\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We need alll the names to be lowercase:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "rxnorm[\"STR\"] = rxnorm[\"STR\"].str.lower()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We are going load the generic brand names from the Part D table so we can match them to RXCUI identifiers:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import feather\n", + "drugnames = feather.read_dataframe('../data/drugnames.feather')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
drugname_branddrugname_generic
010 WASHSULFACETAMIDE SODIUM
11ST TIER UNIFINE PENTIPSPEN NEEDLE, DIABETIC
21ST TIER UNIFINE PENTIPS PLUSPEN NEEDLE, DIABETIC
360PSE-400GFN-20DMGUAIFENESIN/DM/PSEUDOEPHEDRINE
48-MOPMETHOXSALEN
\n", + "
" + ], + "text/plain": [ + " drugname_brand drugname_generic\n", + "0 10 WASH SULFACETAMIDE SODIUM\n", + "1 1ST TIER UNIFINE PENTIPS PEN NEEDLE, DIABETIC\n", + "2 1ST TIER UNIFINE PENTIPS PLUS PEN NEEDLE, DIABETIC\n", + "3 60PSE-400GFN-20DM GUAIFENESIN/DM/PSEUDOEPHEDRINE\n", + "4 8-MOP METHOXSALEN" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "drugnames.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Messing with the Drug Names\n", + "\n", + "Some of the drug names have multiple generic names. We need to pull those apart into their own categories. Also, we're going to transform them all to lowercase letters. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "drugnames[\"drugname_generic\"] = drugnames[\"drugname_generic\"].str.lower()\n", + "drugnames[\"drugname_brand\"] = drugnames[\"drugname_brand\"].str.lower()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
drugname_branddrugname_generic
010 washsulfacetamide sodium
11st tier unifine pentipspen needle, diabetic
21st tier unifine pentips pluspen needle, diabetic
360pse-400gfn-20dmguaifenesin/dm/pseudoephedrine
48-mopmethoxsalen
\n", + "
" + ], + "text/plain": [ + " drugname_brand drugname_generic\n", + "0 10 wash sulfacetamide sodium\n", + "1 1st tier unifine pentips pen needle, diabetic\n", + "2 1st tier unifine pentips plus pen needle, diabetic\n", + "3 60pse-400gfn-20dm guaifenesin/dm/pseudoephedrine\n", + "4 8-mop methoxsalen" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "drugnames.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We need a placeholder for the `RXCUI` values:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "drugnames[\"RXCUI\"] = \"0.0\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can try to associate the drug names with their `RXCUI` codes:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "for idx in drugnames.index:\n", + "\n", + " rxcui = []\n", + "\n", + " for c in [\"drugname_generic\", \"drugname_brand\"]:\n", + " \n", + " d = drugnames.loc[idx, c]\n", + " dsplit = d.split(\"/\")\n", + "\n", + " for di in dsplit:\n", + " displit = di.split(\" \")\n", + " v = rxnorm[rxnorm[\"STR\"] == displit[0]]\n", + "\n", + " if len(v) > 0:\n", + " rxcui.extend(v[\"RXCUI\"].unique())\n", + " else:\n", + " continue\n", + "\n", + " if len(rxcui) > 1:\n", + " rxcui_str = \"|\".join(np.array(rxcui, dtype=str))\n", + " \n", + " elif len(rxcui) == 1:\n", + " rxcui_str = str(rxcui[0])\n", + " else:\n", + " rxcui_str = 0.0\n", + " \n", + " drugnames.loc[idx, \"RXCUI\"] = rxcui_str\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "How many am I missing?" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "634" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(drugnames[drugnames[\"RXCUI\"] == 0.0])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What fraction is that of all drug names?" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.14095153401511784" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(drugnames[drugnames[\"RXCUI\"] == 0.0])/len(drugnames)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "14% isn't so bad as a first turn-out." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
drugname_branddrugname_genericRXCUI
11st tier unifine pentipspen needle, diabetic0
21st tier unifine pentips pluspen needle, diabetic0
22accusuresyring w-ndl,disp,insul,0.5 ml0
23accusuresyringe and needle,insulin,1ml0
26acetaminoph-caff-dihydrocodeindhcodeine bt/acetaminophn/caff0
\n", + "
" + ], + "text/plain": [ + " drugname_brand drugname_generic RXCUI\n", + "1 1st tier unifine pentips pen needle, diabetic 0\n", + "2 1st tier unifine pentips plus pen needle, diabetic 0\n", + "22 accusure syring w-ndl,disp,insul,0.5 ml 0\n", + "23 accusure syringe and needle,insulin,1ml 0\n", + "26 acetaminoph-caff-dihydrocodein dhcodeine bt/acetaminophn/caff 0" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "drugnames[drugnames[\"RXCUI\"] == 0.0].head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This seems to include things like prenatal vitamins, devices (like needles and syringes) and abbreviated names I can't automatically include. \n", + "**I am going to ignore this for the moment, but we should fix this in the long run!**\n", + "\n", + "## Associating Drug Classes\n", + "\n", + "Drug classes come originally from the Veteran's Health Administration [National Drug File](http://www.pbm.va.gov/PBM/nationalformulary/NDF_January_2016.xlsx). It turns out, they're also listed in the PUF SAS manual. Go figure:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "data_dir = '../data/'\n", + "url = \"https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/BSAPUFS/Downloads/2010_PD_Profiles_PUF_DUG.zip\"\n", + "response = requests.get(url, stream=True)\n", + "\n", + "with open(data_dir + 'drug_classes_dataset.zip', 'wb') as ds_zipout:\n", + " shutil.copyfileobj(response.raw, ds_zipout)\n", + "\n", + "zip = zipfile.ZipFile(data_dir + 'drug_classes_dataset.zip', 'r')\n", + "ds_filenames = zip.namelist()\n", + "for f in ds_filenames:\n", + " zip.extract(f, path=data_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "drug_major_class = pd.read_csv(data_dir+\"DRUG_MAJOR_CLASS_TABLE.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
drug_major_classdrug_major_class_desc
00UNKNOWN/MISSING
1AD000ANTIDOTES,DETERRENTS AND POISON CONTROL
2AH000ANTIHISTAMINES
3AM000ANTIMICROBIALS
4AN000ANTINEOPLASTICS
\n", + "
" + ], + "text/plain": [ + " drug_major_class drug_major_class_desc\n", + "0 0 UNKNOWN/MISSING\n", + "1 AD000 ANTIDOTES,DETERRENTS AND POISON CONTROL\n", + "2 AH000 ANTIHISTAMINES\n", + "3 AM000 ANTIMICROBIALS\n", + "4 AN000 ANTINEOPLASTICS" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "drug_major_class.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "drug_class = pd.read_csv(data_dir+\"DRUG_CLASS_TABLE.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
drug_classdrug_class_desc
00UNKNOWN/MISSING
1AD100ALCOHOL DETERRENTS
2AD200CYANIDE ANTIDOTES
3AD300HEAVY METAL ANTAGONISTS
4AD400ANTIDOTES,DETERRENTS,AND POISON CONTROL EXCHAN...
\n", + "
" + ], + "text/plain": [ + " drug_class drug_class_desc\n", + "0 0 UNKNOWN/MISSING\n", + "1 AD100 ALCOHOL DETERRENTS\n", + "2 AD200 CYANIDE ANTIDOTES\n", + "3 AD300 HEAVY METAL ANTAGONISTS\n", + "4 AD400 ANTIDOTES,DETERRENTS,AND POISON CONTROL EXCHAN..." + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "drug_class.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "drug_class.replace(to_replace=np.nan, value=\"N/A\", inplace=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Okay, cool, I think that's all the information I need!\n", + "\n", + "## Adding Drug classes to the Drug information Table\n", + "\n", + "We can now use the available information to add a column `drug_major_class` and `drug_class` to the `drugnames` table for use in identification and visualization.\n", + "\n", + "To revise, I have four tables:" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
drugname_branddrugname_genericRXCUI
010 washsulfacetamide sodium10169
11st tier unifine pentipspen needle, diabetic0
21st tier unifine pentips pluspen needle, diabetic0
360pse-400gfn-20dmguaifenesin/dm/pseudoephedrine5032|8896
48-mopmethoxsalen6854|227713
\n", + "
" + ], + "text/plain": [ + " drugname_brand drugname_generic RXCUI\n", + "0 10 wash sulfacetamide sodium 10169\n", + "1 1st tier unifine pentips pen needle, diabetic 0\n", + "2 1st tier unifine pentips plus pen needle, diabetic 0\n", + "3 60pse-400gfn-20dm guaifenesin/dm/pseudoephedrine 5032|8896\n", + "4 8-mop methoxsalen 6854|227713" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "drugnames.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the brand names, the generic names and the RxNorm identifier of the drug. " + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
RXNORM_RXCUIDRUG_MAJOR_CLASSDRUG_CLASS
0000
1000
2000
3000
4000
\n", + "
" + ], + "text/plain": [ + " RXNORM_RXCUI DRUG_MAJOR_CLASS DRUG_CLASS\n", + "0 0 0 0\n", + "1 0 0 0\n", + "2 0 0 0\n", + "3 0 0 0\n", + "4 0 0 0" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "puf.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "with the RxNorm values as well as major/minor classes of the drug. \n", + "\n", + "And finally, " + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
drug_major_classdrug_major_class_desc
00UNKNOWN/MISSING
1AD000ANTIDOTES,DETERRENTS AND POISON CONTROL
2AH000ANTIHISTAMINES
3AM000ANTIMICROBIALS
4AN000ANTINEOPLASTICS
\n", + "
" + ], + "text/plain": [ + " drug_major_class drug_major_class_desc\n", + "0 0 UNKNOWN/MISSING\n", + "1 AD000 ANTIDOTES,DETERRENTS AND POISON CONTROL\n", + "2 AH000 ANTIHISTAMINES\n", + "3 AM000 ANTIMICROBIALS\n", + "4 AN000 ANTINEOPLASTICS" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "drug_major_class.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "and " + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
drug_classdrug_class_desc
00UNKNOWN/MISSING
1AD100ALCOHOL DETERRENTS
2AD200CYANIDE ANTIDOTES
3AD300HEAVY METAL ANTAGONISTS
4AD400ANTIDOTES,DETERRENTS,AND POISON CONTROL EXCHAN...
\n", + "
" + ], + "text/plain": [ + " drug_class drug_class_desc\n", + "0 0 UNKNOWN/MISSING\n", + "1 AD100 ALCOHOL DETERRENTS\n", + "2 AD200 CYANIDE ANTIDOTES\n", + "3 AD300 HEAVY METAL ANTAGONISTS\n", + "4 AD400 ANTIDOTES,DETERRENTS,AND POISON CONTROL EXCHAN..." + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "drug_class.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "have the identifiers for the major and minor drug classes.\n", + "\n", + "I'm going to add four columns to `drugnames`, one for each major and minor drug class, and one for the string representations of those classes, which will make the table bigger, but easier to use in the long term." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "drugnames[\"drug_major_class\"] = \"\"\n", + "drugnames[\"dmc_string\"] = \"\"\n", + "drugnames[\"drug_class\"] = \"\"\n", + "drugnames[\"dc_string\"] = \"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It looks like there are a bunch of drug classes that don't match between the drug classes in the key and the drug classes in the table. Because of course there are. \n", + "**For now, any drug class we don't have an explanation for will be considered missing!**\n", + "\n", + "How many are those?" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "drugnames[\"RXCUI\"] = drugnames[\"RXCUI\"].astype(str)" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "for idx in drugnames.index:\n", + "\n", + " drug_rxcui = drugnames.loc[idx, \"RXCUI\"].split(\"|\")\n", + " dmc, dc = [], []\n", + " for rxcui in drug_rxcui:\n", + " r = puf[puf[\"RXNORM_RXCUI\"] == np.float(rxcui)]\n", + "\n", + " rxc = r.loc[r.index, \"RXNORM_RXCUI\"].unique()\n", + "\n", + " dmc.extend(r.loc[r.index, \"DRUG_MAJOR_CLASS\"].unique())\n", + " dc.extend(r.loc[r.index, \"DRUG_CLASS\"].unique())\n", + "\n", + "\n", + " dmc = np.unique(dmc)\n", + " dc = np.unique(dc)\n", + "\n", + " if len(dmc) != 0:\n", + " drugnames.loc[idx, \"drug_major_class\"] = \"|\".join(dmc)\n", + " dmc_name = np.hstack([drug_major_class.loc[drug_major_class[\"drug_major_class\"] == d, \n", + " \"drug_major_class_desc\"].values for d in dmc])\n", + " drugnames.loc[idx, \"dmc_name\"] = \"|\".join(dmc_name)\n", + "\n", + " else:\n", + " drugnames.loc[idx, \"drug_major_class\"] = \"0\"\n", + " drugnames.loc[idx, \"dmc_name\"] = \"0\"\n", + "\n", + " if len(dc) != 0:\n", + " drugnames.loc[idx, \"drug_class\"] = \"|\".join(dc)\n", + " dc_name = np.hstack([drug_class.loc[drug_class[\"drug_class\"] == d, \n", + " \"drug_class_desc\"].values for d in dc]) \n", + "\n", + " drugnames.loc[idx, \"dc_name\"] = \"|\".join(dc_name)\n", + " else:\n", + " drugnames.loc[idx, \"drug_class\"] = \"0\"\n", + " drugnames.loc[idx, \"dc_name\"] = \"0\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
drugname_branddrugname_genericRXCUIdrug_major_classdmc_stringdrug_classdc_stringdmc_namedc_name
010 washsulfacetamide sodium101690|DE000|OP0000|DE101|OP210UNKNOWN/MISSING|DERMATOLOGICAL AGENTS|OPHTHALM...UNKNOWN/MISSING|ANTI-INFECTIVE,TOPICAL|ANTI-IN...
11st tier unifine pentipspen needle, diabetic0.000UNKNOWN/MISSINGUNKNOWN/MISSING
21st tier unifine pentips pluspen needle, diabetic0.000UNKNOWN/MISSINGUNKNOWN/MISSING
360pse-400gfn-20dmguaifenesin/dm/pseudoephedrine5032|8896RE000RE200|RE302RESPIRATORY TRACT MEDICATIONSDECONGESTANTS,SYSTEMIC|ANTITUSSIVES/EXPECTORANTS
48-mopmethoxsalen6854|227713DE000DE810DERMATOLOGICAL AGENTSANTIPSORIATIC
\n", + "
" + ], + "text/plain": [ + " drugname_brand drugname_generic RXCUI \\\n", + "0 10 wash sulfacetamide sodium 10169 \n", + "1 1st tier unifine pentips pen needle, diabetic 0.0 \n", + "2 1st tier unifine pentips plus pen needle, diabetic 0.0 \n", + "3 60pse-400gfn-20dm guaifenesin/dm/pseudoephedrine 5032|8896 \n", + "4 8-mop methoxsalen 6854|227713 \n", + "\n", + " drug_major_class dmc_string drug_class dc_string \\\n", + "0 0|DE000|OP000 0|DE101|OP210 \n", + "1 0 0 \n", + "2 0 0 \n", + "3 RE000 RE200|RE302 \n", + "4 DE000 DE810 \n", + "\n", + " dmc_name \\\n", + "0 UNKNOWN/MISSING|DERMATOLOGICAL AGENTS|OPHTHALM... \n", + "1 UNKNOWN/MISSING \n", + "2 UNKNOWN/MISSING \n", + "3 RESPIRATORY TRACT MEDICATIONS \n", + "4 DERMATOLOGICAL AGENTS \n", + "\n", + " dc_name \n", + "0 UNKNOWN/MISSING|ANTI-INFECTIVE,TOPICAL|ANTI-IN... \n", + "1 UNKNOWN/MISSING \n", + "2 UNKNOWN/MISSING \n", + "3 DECONGESTANTS,SYSTEMIC|ANTITUSSIVES/EXPECTORANTS \n", + "4 ANTIPSORIATIC " + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "drugnames.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Serialize drug names to feather file for use in both Python and R\n", + "import feather\n", + "feather.write_dataframe(drugnames, data_dir + 'drugnames_withclasses.feather')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From df5ae74a4c170bc77d493af54538f3b227e28ace Mon Sep 17 00:00:00 2001 From: Daniela Huppenkothen Date: Sat, 4 Feb 2017 15:55:30 -0500 Subject: [PATCH 02/20] Script for data reading/wrangling (#25) * Fix gitignore to ignore XLSX/ZIP and move CMS data to its own dir * Add drug names back into annual spending data, for ease of use * Forgot to add notebook in last commit * Fix exploration notebook after earlier changes * Add .DS_Store files to .gitignore * Remove Medicare drug spending dataset (migrated to data.world) * Remove data in favor of using data.world - (External) Move all data files to data.world repository (https://data.world/data4democracy/drug-spending) - Remove data/ directory - Correct notebook code to work with data.world as a source * Wrote a helper function that gets data from a URL, wrote function that downloads Part D data based on notebook * Added docstring to function * Added more functions that load data wrangle it * Added argument parser and squashed some bugs * Removed dependence on openpyxl, since Pandas does the trick * Notebook runs * Minor change to command line arg and addition to help string * Move comments into Markdown cells and add CSV output * Added functionality to decide between input/output data formats; supports cvs and feather at the moment --- cms/part-d_clean_and_separate_data.ipynb | 309 +++ cms/part-d_convert_to_feather.ipynb | 2539 ---------------------- scripts/read_data.py | 645 ++++++ 3 files changed, 954 insertions(+), 2539 deletions(-) create mode 100644 cms/part-d_clean_and_separate_data.ipynb delete mode 100644 cms/part-d_convert_to_feather.ipynb create mode 100644 scripts/read_data.py diff --git a/cms/part-d_clean_and_separate_data.ipynb b/cms/part-d_clean_and_separate_data.ipynb new file mode 100644 index 0000000..0be84b9 --- /dev/null +++ b/cms/part-d_clean_and_separate_data.ipynb @@ -0,0 +1,309 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Medicare Part D Drug Spending Data Downloading, extracting, and cleaning" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import requests # to download the dataset\n", + "import zipfile # to extract from archive\n", + "import shutil # to write the dataset to file\n", + "import os # rename file to something more type-able\n", + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "url = 'https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/Information-on-Prescription-Drugs/Downloads/Part_D_All_Drugs_2015.zip'\n", + "response = requests.get(url, stream=True)\n", + "\n", + "zip_filename = 'dataset.zip'\n", + "with open(zip_filename, 'wb') as ds_zipout:\n", + " shutil.copyfileobj(response.raw, ds_zipout)\n", + "\n", + "zip = zipfile.ZipFile(zip_filename, 'r')\n", + "xls_filename = zip.namelist()[0]\n", + "zip.extract(xls_filename)\n", + "\n", + "os.remove(zip_filename)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We're going to read the data into a `pandas.DataFrame`, but because the data is in several work sheets, we need to read out the right work sheet:" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "xls = pd.ExcelFile(xls_filename)\n", + "df = xls.parse('Data', skiprows=3)\n", + "df.index = np.arange(1, len(df) + 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we need to start capturing relevant data. The easiest way to start is by getting a list of prescribed drug names, both brand and generic." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Capture ONLY the drug names (the first two columns)\n", + "df_drugnames = df.iloc[:, :2]\n", + "df_drugnames.columns = [\n", + " 'drugname_brand',\n", + " 'drugname_generic'\n", + "]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The drug names may contain leading or trailing whitespace in their \"raw\" state direct from the XLSX file; let's scrub that whitespace." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Strip extraneous whitespace from drug names\n", + "df_drugnames.loc[:, 'drugname_brand'] = df_drugnames.loc[:, 'drugname_brand'].map(lambda x: x.strip())\n", + "df_drugnames.loc[:, 'drugname_generic'] = df_drugnames.loc[:, 'drugname_generic'].map(lambda x: x.strip())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that this portion of the data is clean, we can safely write it out to both feather and CSV files." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Write to feather ...\n", + "import feather\n", + "feather.write_dataframe(df_drugnames, 'drugnames.feather')\n", + "\n", + "# Now write to CSV ...\n", + "df_drugnames.to_csv('drugnames.csv', index=False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Okay! With drug names, out of the way, we can concentrate on annual spending data.\n", + "\n", + "We can parse out spending for each year by extracting their corresponding column ranges in the XLS. After we do that, it's easy to add back the drug names we just gathered. That way, people don't have to reference two DataFrames every time they want to track drug spending for a given year." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Separate column groups by year\n", + "cols_by_year = [\n", + " { 'year': 2011, 'start': 2, 'end': 12 },\n", + " { 'year': 2012, 'start': 12, 'end': 22 },\n", + " { 'year': 2013, 'start': 22, 'end': 32 },\n", + " { 'year': 2014, 'start': 32, 'end': 42 },\n", + " { 'year': 2015, 'start': 42, 'end': 53 },\n", + "]\n", + "\n", + "df_years = {}\n", + "\n", + "col_brandname = 0\n", + "col_genericname = 1\n", + "for cols in cols_by_year:\n", + " year, start, end = cols['year'], cols['start'], cols['end']\n", + "\n", + " df_years[year] = pd.concat(\n", + " [\n", + " df_drugnames,\n", + " df.iloc[:, start:end]\n", + " ],\n", + " axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's go ahead and remove the final column of the 2015 data (\"Annual Change in Average Cost per Unit\"). None of the other years have it, so it doesn't give us a lot of opportunity for comparison and analysis; plus, it's only available for drugs used at least 1,000 beneficiaries." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "df_years[2015] = df_years[2015].drop(df_years[2015].columns[-1], axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "From year to year, the list of prescribed drugs changes; some are added, and some are removed. We should probably get rid of any rows where that drug was not prescribed, just to reduce noise in our data." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "for year in df_years:\n", + " nonnull_rows = df_years[year].iloc[:, 2:].apply(lambda x: x.notnull().any(), axis=1)\n", + " df_years[year] = df_years[year][nonnull_rows]\n", + " df_years[year].index = np.arange(1, len(df_years[year]) + 1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's make our column names easier to type and not year-specific, while still retaining most of their original meanings." + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "generic_columns = [\n", + " \"drugname_brand\",\n", + " \"drugname_generic\",\n", + " \"claim_count\",\n", + " \"total_spending\",\n", + " \"user_count\",\n", + " \"total_spending_per_user\",\n", + " \"unit_count\",\n", + " \"unit_cost_wavg\",\n", + " \"user_count_non_lowincome\",\n", + " \"out_of_pocket_avg_non_lowincome\",\n", + " \"user_count_lowincome\",\n", + " \"out_of_pocket_avg_lowincome\"\n", + "]\n", + "\n", + "for year in df_years:\n", + " df_years[year].columns = generic_columns" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All fields in the annual spending data -- excluding drug names -- are numeric. Let's make sure pandas knows this, because otherwise we'll have trouble writing the data to feather and CSV." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Suppress SettingWithCopyWarnings because I think it's\n", + "# tripping on the fact that we have a dict of DataFrames\n", + "pd.options.mode.chained_assignment = None\n", + "for year in df_years:\n", + " # Ignore the first two columns, which are strings and contain drug names\n", + " for col in df_years[year].columns[2:]:\n", + " df_years[year].loc[:, col] = pd.to_numeric(df_years[year][col])\n", + "pd.options.mode.chained_assignment = 'warn'" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "All done cleaning the annual spending data! Let's write to disk in feather and CSV format" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Write each year's data\n", + "for year in df_years:\n", + " # To feather ...\n", + " feather.write_dataframe(df_years[year], 'spending-{year}.feather'.format(year=year))\n", + " # And to CSV ...\n", + " df_years[year].to_csv('spending-{year}.csv'.format(year=year), index=False)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/cms/part-d_convert_to_feather.ipynb b/cms/part-d_convert_to_feather.ipynb deleted file mode 100644 index f49584e..0000000 --- a/cms/part-d_convert_to_feather.ipynb +++ /dev/null @@ -1,2539 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'../data/Medicare_Drug_Spending_PartD_All_Drugs_YTD_2015_12_06_2016.xlsx'" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Download and extract the dataset from CMS\n", - "\n", - "import requests # to download the dataset\n", - "import zipfile # to extract from archive\n", - "import shutil # to write the dataset to file\n", - "import os # rename file to something more type-able\n", - "\n", - "data_dir = '../data/'\n", - "\n", - "url = 'https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/Information-on-Prescription-Drugs/Downloads/Part_D_All_Drugs_2015.zip'\n", - "response = requests.get(url, stream=True)\n", - "\n", - "os.mkdir(data_dir)\n", - "with open(data_dir + 'dataset.zip', 'wb') as ds_zipout:\n", - " shutil.copyfileobj(response.raw, ds_zipout)\n", - "\n", - "zip = zipfile.ZipFile(data_dir + 'dataset.zip', 'r')\n", - "ds_filename = zip.namelist()[0]\n", - "zip.extract(ds_filename, path=data_dir)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Read in the raw data file and focus only on the sheet with the data in it\n", - "from openpyxl import load_workbook\n", - "workbook = load_workbook(data_dir + ds_filename)\n", - "data_sheet = workbook['Data']" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Brand NameGeneric NameClaim Count, 2011Total Spending, 2011Beneficiary Count, 2011Total Annual Spending Per User, 2011Unit Count, 2011Average Cost Per Unit (Weighted), 2011Beneficiary Count No LIS, 2011Average Beneficiary Cost Share No LIS, 2011...Total Spending, 2015Beneficiary Count, 2015Total Annual Spending Per User, 2015Unit Count, 2015Average Cost Per Unit (Weighted), 2015Beneficiary Count No LIS, 2015Average Beneficiary Cost Share No LIS, 2015Beneficiary Count LIS, 2015Average Beneficiary Cost Share LIS, 2015Annual Change in Average Cost Per Unit, 2015
110 WASHSULFACETAMIDE SODIUM241569.191698.074451700.303518NoneNone...NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
21ST TIER UNIFINE PENTIPSPEN NEEDLE, DIABETIC247257666.789364.57642931600.19676642242.3472...257896517349.854213351320.193205287827.305322953.987890.0222081
31ST TIER UNIFINE PENTIPS PLUSPEN NEEDLE, DIABETICNoneNoneNoneNoneNoneNoneNoneNone...73396.6147049.92973698860.1984371028.07197603.51078None
460PSE-400GFN-20DMGUAIFENESIN/DM/PSEUDOEPHEDRINE12350.11131.82734970.704427NoneNone...NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
58-MOPMETHOXSALEN119003.26NoneNone29830.2123NoneNone...NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
6A-B OTICANTIPYRINE/BENZOCAINE30212.86297.344510.471973NoneNone...NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
7ABACAVIRABACAVIR SULFATENoneNoneNoneNoneNoneNoneNoneNone...2.45788e+0793192637.544241635.555592046236.94272736.14634-0.137496
8ABACAVIR-LAMIVUDINE-ZIDOVUDINEABACAVIR/LAMIVUDINE/ZIDOVUDINENoneNoneNoneNoneNoneNoneNoneNone...1.66262e+07162110256.875993321.8785377945.154124424.1874-0.0228733
9ABELCETAMPHOTERICIN B LIPID COMPLEX363455566974696.56490279.2921549402.048...5528481025420.084760011.614468303.143431.55None
10ABILIFYARIPIPRAZOLE244796514696611033606754074.757.74748e+0719.218657408466.026...1.57243e+093225824874.514.7855e+0733.122453024519.77726955816.49780.139258
11ABILIFY DISCMELTARIPIPRAZOLE46773.92971e+069614089.1818935220.753983439.876...3.73519e+067425033.9510276436.344553663.64768918.0646None
12ABILIFY MAINTENAARIPIPRAZOLENoneNoneNoneNoneNoneNoneNoneNone...1.48259e+081400110589.292724.415993591131.721364215.85250.0578594
13ABRAXANEPACLITAXEL PROTEIN-BOUND2339507035118641.2975975.08141262.69...4.48199e+0622619831.844781000.891051324.671218.34917None
14ABSORICAISOTRETINOINNoneNoneNoneNoneNoneNoneNoneNone...2873891062711.211054027.192558375.1954814.1008None
15ABSTRALFENTANYL CITRATE82123814323869.18545821.289NoneNone...7.19214e+0617241814.89652667.5199681807.4810450.0728None
16ACAMPROSATE CALCIUMACAMPROSATE CALCIUMNoneNoneNoneNoneNoneNoneNoneNone...4.29217e+068976478.18346049050.9320873190113.11357865.14128-0.0524259
17ACANYACLINDAMYCIN PHOS/BENZOYL PEROX43289540289309.827216014.14517134104.139...360521452797.612420108.58179302110.99615013.9405None
18ACARBOSEACARBOSE1710711.16934e+0732843356.0381.8845e+070.6200331529766.968...1.18727e+0742221281.2042.53059e+070.4689842245489.7874197676.97572-0.0461981
19ACCOLATEZAFIRLUKAST219242.6195e+066409408.7221.43616e+061.823582871179.78...4725243611308.931509523.12993217345.38214423.4429None
20ACCUNEBALBUTEROL SULFATE1207415.189082.3909129210.573662NoneNone...NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
21ACCUPRILQUINAPRIL HCL80527678251786429.9134381771.75241259242.105...1.12926e+0610891036.973875802.91367903335.85118633.89280.157929
22ACCURETICQUINAPRIL/HYDROCHLOROTHIAZIDE87080475.1209385.048468201.71669145252.086...77105.491847.312273202.8230572333.7611946.8647None
23ACCUSURESYRING W-NDL,DISP,INSUL,0.5 ML88916181.532649.6366772620.2093437612.5071...NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
24ACCUSURESYRINGE AND NEEDLE,INSULIN,1ML76813543.226950.3465640460.21113812510.1267...NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
25ACEBUTOLOL HCLACEBUTOLOL HCL1277453.49941e+0620981166.7899.50169e+060.3698131734959.5097...2.75558e+0623590116.811109682860.2516652041158.8611317910.5109-0.19268
26ACEONPERINDOPRIL ERBUMINE2605287874685420.2541200942.38649507237.186...NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
27ACETAMINOPH-CAFF-DIHYDROCODEINDHCODEINE BT/ACETAMINOPHN/CAFF49974845721582306.3043400651.42494635105.184...NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
28ACETAMINOPHEN-CODEINEACETAMINOPHEN WITH CODEINE28038223.75362e+07119241731.47911.72267e+080.22561760051813.5833...4.379e+07172196925.43022.14269e+080.2071969833789.520737385911.814140.0862521
29ACETASOL HCACETIC ACID/HYDROCORTISONE46078549523546241.1035992614.2668205030.4146...76243462165.028596512.781730226.07811601.89637None
30ACETAZOLAMIDEACETAZOLAMIDE2258031.28949e+0773929174.4231.29046e+071.149074367429.1383...3.717e+07105306352.9721.7796e+072.119767098148.4498343255.312820.147628
..................................................................
4469ZORTRESSEVEROLIMUS270418049636635.73640912.86629537.551...7.89136e+0667111760.652925915.08693601069.5631128.5761None
4470ZORVOLEXDICLOFENAC SUBMICRONIZEDNoneNoneNoneNoneNoneNoneNoneNone...3.49109e+066954502.02612048482.897514148136.64928069.731230.104361
4471ZOSTAVAXZOSTER VACCINE LIVE/PF6068021.08185e+08602389179.593613163176.43750831264.5175...2.19063e+081056666207.3151.05749e+06207.15377750767.93122791595.333440.0601523
4472ZOSYNPIPERACILLIN SODIUM/TAZOBACTAM71912.22303e+062883771.0821.04523e+062.44466688267.177...401326864464.4983305081.32096319182.0275457.76112None
4473ZOSYNPIPERACILLIN-TAZO-DEXTROSE,ISO60631.70203e+062137796.4573.99374e+060.442342282200.558...2.19107e+062859766.37649381510.458346371238.77424883.228960.00337603
4474ZOVIA 1-35EETHYNODIOL D-ETHINYL ESTRADIOL69022147881048204.9512558880.83938514559.5161...83449.7547152.5591158100.7205746398.82654845.27165None
4475ZOVIA 1-50EETHYNODIOL D-ETHINYL ESTRADIOL208166564.1307216.82169046.30.9640512878.8321...46482.4244190.502571290.81363934112.8462106.55167None
4476ZOVIRAXACYCLOVIR1810334.72158e+07116512405.2443.08564e+0620.53195286676.3689...29366268223361314.75303507127.3621190588.2972104315.608090.133281
4477Z-TUSS ACCHLORPHENIRAMINE/CODEINE PHOS36640.192525.607658630.10919225None...NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
4478Z-TUSS DMGUAIFENESIN/D-METHORPHAN HB/PE24587.312325.535245600.12879623None...NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
4479ZUBSOLVBUPRENORPHINE HCL/NALOXONE HCLNoneNoneNoneNoneNoneNoneNoneNone...1.91584e+0612421542.542819866.8728352370.43389022.3777None
4480ZUPLENZONDANSETRON33482831.5195424.777804410.295911092.6741...1203981061135.83522123.0835789.2494.33449None
4481ZUTRIPROHYDROCODONE/CPM/PSEUDOEPHED494128.064984.246194800.43544949None...NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
4482ZYBANBUPROPION HCL18334521.1107322.627111983.0827941110.795...22402.240560.05471403.1375619113.8732123.8043None
4483ZYCLARAIMIQUIMOD107756.40663e+069117702.71329327121.84547895100.222...5.91449e+0643231368.1469584.4113.7223883107.7734407.376550.135396
4484ZYDELIGIDELALISIBNoneNoneNoneNoneNoneNoneNoneNone...4.72436e+07144832626.8353475133.65511612640.428770.9182None
4485ZYDONEHYDROCODONE/ACETAMINOPHEN1258112811356316.8841431610.781167223213.915...NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
4486ZYFLOZILEUTON4842632962001316.48524675.0183186308.681...4.05193e+064239579.0416533424.5076230442.6141935.55606None
4487ZYFLO CRZILEUTON74785.14282e+0617502938.769453605.44007817503.209...1.77405e+07104217025.472250724.5545761174.8646617.8530.333055
4488ZYKADIACERITINIBNoneNoneNoneNoneNoneNoneNoneNone...1.93638e+0735754240.421132191.63232703062.187102.6None
4489ZYLETTOBRAMYCIN/LOTEPRED ETAB427475.39725e+0631159173.21723193723.27032010759.7491...4.03467e+0612728316.99210133239.8161888365.275738455.121930.100992
4490ZYLOPRIMALLOPURINOL1759119791426281.2899371.44961336181.975...212772338629.503813792.8291257228.816819.98728None
4491ZYMARGATIFLOXACIN1042097.87267e+068063797.63153649214.67436068649.4561...NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
4492ZYMAXIDGATIFLOXACIN2671552.29187e+07186218123.07570003332.739513333463.7376...1.76474e+0610328170.8694825336.5726909124.651712373.98673-0.120066
4493ZYPREXAOLANZAPINE24082031.62535e+093125965199.528.17722e+0719.872159409477.108...2.44672e+0740486044.27112722422.0989549585.565349917.1297-0.00740394
4494ZYPREXA RELPREVVOLANZAPINE PAMOATE56675.97403e+067687778.696512930.425221364.51...7.36494e+0657312853.373371001.65162145.7255722.4254None
4495ZYPREXA ZYDISOLANZAPINE1944901.57562e+08328454797.136.7539e+0623.2724212411.607...5.20257e+067427011.5520164226.417766505.44367615.3938None
4496ZYRTEC-DCETIRIZINE HCL/PSEUDOEPHEDRINE12434.691236.22424770.9113NoneNone...NoneNoneNoneNoneNoneNoneNoneNoneNoneNone
4497ZYTIGAABIRATERONE ACETATE134777.10094e+07393618041164830443.080329492135.04...7.9005e+081696546569.41.20221e+0765.7165134243299.863541163.5160.100033
4498ZYVOXLINEZOLID521398.73054e+07376272320.291.33593e+0779.386611621438.768...8.57606e+07211754050.094781132147.1667935607.4151324017.62660.169913
\n", - "

4498 rows × 53 columns

\n", - "
" - ], - "text/plain": [ - " Brand Name Generic Name \\\n", - "1 10 WASH SULFACETAMIDE SODIUM \n", - "2 1ST TIER UNIFINE PENTIPS PEN NEEDLE, DIABETIC \n", - "3 1ST TIER UNIFINE PENTIPS PLUS PEN NEEDLE, DIABETIC \n", - "4 60PSE-400GFN-20DM GUAIFENESIN/DM/PSEUDOEPHEDRINE \n", - "5 8-MOP METHOXSALEN \n", - "6 A-B OTIC ANTIPYRINE/BENZOCAINE \n", - "7 ABACAVIR ABACAVIR SULFATE \n", - "8 ABACAVIR-LAMIVUDINE-ZIDOVUDINE ABACAVIR/LAMIVUDINE/ZIDOVUDINE \n", - "9 ABELCET AMPHOTERICIN B LIPID COMPLEX \n", - "10 ABILIFY ARIPIPRAZOLE \n", - "11 ABILIFY DISCMELT ARIPIPRAZOLE \n", - "12 ABILIFY MAINTENA ARIPIPRAZOLE \n", - "13 ABRAXANE PACLITAXEL PROTEIN-BOUND \n", - "14 ABSORICA ISOTRETINOIN \n", - "15 ABSTRAL FENTANYL CITRATE \n", - "16 ACAMPROSATE CALCIUM ACAMPROSATE CALCIUM \n", - "17 ACANYA CLINDAMYCIN PHOS/BENZOYL PEROX \n", - "18 ACARBOSE ACARBOSE \n", - "19 ACCOLATE ZAFIRLUKAST \n", - "20 ACCUNEB ALBUTEROL SULFATE \n", - "21 ACCUPRIL QUINAPRIL HCL \n", - "22 ACCURETIC QUINAPRIL/HYDROCHLOROTHIAZIDE \n", - "23 ACCUSURE SYRING W-NDL,DISP,INSUL,0.5 ML \n", - "24 ACCUSURE SYRINGE AND NEEDLE,INSULIN,1ML \n", - "25 ACEBUTOLOL HCL ACEBUTOLOL HCL \n", - "26 ACEON PERINDOPRIL ERBUMINE \n", - "27 ACETAMINOPH-CAFF-DIHYDROCODEIN DHCODEINE BT/ACETAMINOPHN/CAFF \n", - "28 ACETAMINOPHEN-CODEINE ACETAMINOPHEN WITH CODEINE \n", - "29 ACETASOL HC ACETIC ACID/HYDROCORTISONE \n", - "30 ACETAZOLAMIDE ACETAZOLAMIDE \n", - "... ... ... \n", - "4469 ZORTRESS EVEROLIMUS \n", - "4470 ZORVOLEX DICLOFENAC SUBMICRONIZED \n", - "4471 ZOSTAVAX ZOSTER VACCINE LIVE/PF \n", - "4472 ZOSYN PIPERACILLIN SODIUM/TAZOBACTAM \n", - "4473 ZOSYN PIPERACILLIN-TAZO-DEXTROSE,ISO \n", - "4474 ZOVIA 1-35E ETHYNODIOL D-ETHINYL ESTRADIOL \n", - "4475 ZOVIA 1-50E ETHYNODIOL D-ETHINYL ESTRADIOL \n", - "4476 ZOVIRAX ACYCLOVIR \n", - "4477 Z-TUSS AC CHLORPHENIRAMINE/CODEINE PHOS \n", - "4478 Z-TUSS DM GUAIFENESIN/D-METHORPHAN HB/PE \n", - "4479 ZUBSOLV BUPRENORPHINE HCL/NALOXONE HCL \n", - "4480 ZUPLENZ ONDANSETRON \n", - "4481 ZUTRIPRO HYDROCODONE/CPM/PSEUDOEPHED \n", - "4482 ZYBAN BUPROPION HCL \n", - "4483 ZYCLARA IMIQUIMOD \n", - "4484 ZYDELIG IDELALISIB \n", - "4485 ZYDONE HYDROCODONE/ACETAMINOPHEN \n", - "4486 ZYFLO ZILEUTON \n", - "4487 ZYFLO CR ZILEUTON \n", - "4488 ZYKADIA CERITINIB \n", - "4489 ZYLET TOBRAMYCIN/LOTEPRED ETAB \n", - "4490 ZYLOPRIM ALLOPURINOL \n", - "4491 ZYMAR GATIFLOXACIN \n", - "4492 ZYMAXID GATIFLOXACIN \n", - "4493 ZYPREXA OLANZAPINE \n", - "4494 ZYPREXA RELPREVV OLANZAPINE PAMOATE \n", - "4495 ZYPREXA ZYDIS OLANZAPINE \n", - "4496 ZYRTEC-D CETIRIZINE HCL/PSEUDOEPHEDRINE \n", - "4497 ZYTIGA ABIRATERONE ACETATE \n", - "4498 ZYVOX LINEZOLID \n", - "\n", - " Claim Count, 2011 Total Spending, 2011 Beneficiary Count, 2011 \\\n", - "1 24 1569.19 16 \n", - "2 2472 57666.7 893 \n", - "3 None None None \n", - "4 12 350.1 11 \n", - "5 11 9003.26 None \n", - "6 30 212.86 29 \n", - "7 None None None \n", - "8 None None None \n", - "9 363 455566 97 \n", - "10 2447965 1469661103 360675 \n", - "11 4677 3.92971e+06 961 \n", - "12 None None None \n", - "13 233 950703 51 \n", - "14 None None None \n", - "15 82 123814 32 \n", - "16 None None None \n", - "17 432 89540 289 \n", - "18 171071 1.16934e+07 32843 \n", - "19 21924 2.6195e+06 6409 \n", - "20 120 7415.18 90 \n", - "21 8052 767825 1786 \n", - "22 870 80475.1 209 \n", - "23 889 16181.5 326 \n", - "24 768 13543.2 269 \n", - "25 127745 3.49941e+06 20981 \n", - "26 2605 287874 685 \n", - "27 4997 484572 1582 \n", - "28 2803822 3.75362e+07 1192417 \n", - "29 4607 854952 3546 \n", - "30 225803 1.28949e+07 73929 \n", - "... ... ... ... \n", - "4469 270 418049 63 \n", - "4470 None None None \n", - "4471 606802 1.08185e+08 602389 \n", - "4472 7191 2.22303e+06 2883 \n", - "4473 6063 1.70203e+06 2137 \n", - "4474 6902 214788 1048 \n", - "4475 2081 66564.1 307 \n", - "4476 181033 4.72158e+07 116512 \n", - "4477 36 640.19 25 \n", - "4478 24 587.31 23 \n", - "4479 None None None \n", - "4480 334 82831.5 195 \n", - "4481 49 4128.06 49 \n", - "4482 183 34521.1 107 \n", - "4483 10775 6.40663e+06 9117 \n", - "4484 None None None \n", - "4485 1258 112811 356 \n", - "4486 484 263296 200 \n", - "4487 7478 5.14282e+06 1750 \n", - "4488 None None None \n", - "4489 42747 5.39725e+06 31159 \n", - "4490 1759 119791 426 \n", - "4491 104209 7.87267e+06 80637 \n", - "4492 267155 2.29187e+07 186218 \n", - "4493 2408203 1.62535e+09 312596 \n", - "4494 5667 5.97403e+06 768 \n", - "4495 194490 1.57562e+08 32845 \n", - "4496 12 434.69 12 \n", - "4497 13477 7.10094e+07 3936 \n", - "4498 52139 8.73054e+07 37627 \n", - "\n", - " Total Annual Spending Per User, 2011 Unit Count, 2011 \\\n", - "1 98.0744 5170 \n", - "2 64.5764 293160 \n", - "3 None None \n", - "4 31.8273 497 \n", - "5 None 298 \n", - "6 7.34 451 \n", - "7 None None \n", - "8 None None \n", - "9 4696.56 49027 \n", - "10 4074.75 7.74748e+07 \n", - "11 4089.18 189352 \n", - "12 None None \n", - "13 18641.2 975 \n", - "14 None None \n", - "15 3869.18 5458 \n", - "16 None None \n", - "17 309.827 21601 \n", - "18 356.038 1.8845e+07 \n", - "19 408.722 1.43616e+06 \n", - "20 82.3909 12921 \n", - "21 429.913 438177 \n", - "22 385.048 46820 \n", - "23 49.6366 77262 \n", - "24 50.3465 64046 \n", - "25 166.789 9.50169e+06 \n", - "26 420.254 120094 \n", - "27 306.304 340065 \n", - "28 31.4791 1.72267e+08 \n", - "29 241.103 59926 \n", - "30 174.423 1.29046e+07 \n", - "... ... ... \n", - "4469 6635.7 36409 \n", - "4470 None None \n", - "4471 179.593 613163 \n", - "4472 771.082 1.04523e+06 \n", - "4473 796.457 3.99374e+06 \n", - "4474 204.951 255888 \n", - "4475 216.821 69046.3 \n", - "4476 405.244 3.08564e+06 \n", - "4477 25.6076 5863 \n", - "4478 25.5352 4560 \n", - "4479 None None \n", - "4480 424.777 8044 \n", - "4481 84.2461 9480 \n", - "4482 322.627 11198 \n", - "4483 702.713 293271 \n", - "4484 None None \n", - "4485 316.884 143161 \n", - "4486 1316.48 52467 \n", - "4487 2938.76 945360 \n", - "4488 None None \n", - "4489 173.217 231937 \n", - "4490 281.2 89937 \n", - "4491 97.631 536492 \n", - "4492 123.075 700033 \n", - "4493 5199.52 8.17722e+07 \n", - "4494 7778.69 6512 \n", - "4495 4797.13 6.7539e+06 \n", - "4496 36.2242 477 \n", - "4497 18041 1648304 \n", - "4498 2320.29 1.33593e+07 \n", - "\n", - " Average Cost Per Unit (Weighted), 2011 Beneficiary Count No LIS, 2011 \\\n", - "1 0.303518 None \n", - "2 0.196766 422 \n", - "3 None None \n", - "4 0.704427 None \n", - "5 30.2123 None \n", - "6 0.471973 None \n", - "7 None None \n", - "8 None None \n", - "9 9.29215 49 \n", - "10 19.2186 57408 \n", - "11 20.7539 83 \n", - "12 None None \n", - "13 975.08 14 \n", - "14 None None \n", - "15 21.289 None \n", - "16 None None \n", - "17 4.14517 134 \n", - "18 0.620033 15297 \n", - "19 1.82358 2871 \n", - "20 0.573662 None \n", - "21 1.7524 1259 \n", - "22 1.71669 145 \n", - "23 0.209343 76 \n", - "24 0.211138 125 \n", - "25 0.369813 17349 \n", - "26 2.38649 507 \n", - "27 1.42494 635 \n", - "28 0.225617 600518 \n", - "29 14.2668 2050 \n", - "30 1.14907 43674 \n", - "... ... ... \n", - "4469 12.866 29 \n", - "4470 None None \n", - "4471 176.437 508312 \n", - "4472 2.44466 688 \n", - "4473 0.442342 282 \n", - "4474 0.839385 145 \n", - "4475 0.964051 28 \n", - "4476 20.5319 52866 \n", - "4477 0.109192 25 \n", - "4478 0.128796 23 \n", - "4479 None None \n", - "4480 10.2959 110 \n", - "4481 0.435449 49 \n", - "4482 3.08279 41 \n", - "4483 21.8454 7895 \n", - "4484 None None \n", - "4485 0.781167 223 \n", - "4486 5.01831 86 \n", - "4487 5.44007 817 \n", - "4488 None None \n", - "4489 23.2703 20107 \n", - "4490 1.44961 336 \n", - "4491 14.6743 60686 \n", - "4492 32.7395 133334 \n", - "4493 19.8721 59409 \n", - "4494 930.425 22 \n", - "4495 23.272 4212 \n", - "4496 0.9113 None \n", - "4497 43.0803 2949 \n", - "4498 79.3866 11621 \n", - "\n", - " Average Beneficiary Cost Share No LIS, 2011 \\\n", - "1 None \n", - "2 42.3472 \n", - "3 None \n", - "4 None \n", - "5 None \n", - "6 None \n", - "7 None \n", - "8 None \n", - "9 402.048 \n", - "10 466.026 \n", - "11 439.876 \n", - "12 None \n", - "13 1262.69 \n", - "14 None \n", - "15 None \n", - "16 None \n", - "17 104.139 \n", - "18 66.968 \n", - "19 179.78 \n", - "20 None \n", - "21 242.105 \n", - "22 252.086 \n", - "23 12.5071 \n", - "24 10.1267 \n", - "25 59.5097 \n", - "26 237.186 \n", - "27 105.184 \n", - "28 13.5833 \n", - "29 30.4146 \n", - "30 29.1383 \n", - "... ... \n", - "4469 537.551 \n", - "4470 None \n", - "4471 64.5175 \n", - "4472 267.177 \n", - "4473 200.558 \n", - "4474 59.5161 \n", - "4475 78.8321 \n", - "4476 76.3689 \n", - "4477 None \n", - "4478 None \n", - "4479 None \n", - "4480 92.6741 \n", - "4481 None \n", - "4482 110.795 \n", - "4483 100.222 \n", - "4484 None \n", - "4485 213.915 \n", - "4486 308.681 \n", - "4487 503.209 \n", - "4488 None \n", - "4489 59.7491 \n", - "4490 181.975 \n", - "4491 49.4561 \n", - "4492 63.7376 \n", - "4493 477.108 \n", - "4494 1364.51 \n", - "4495 411.607 \n", - "4496 None \n", - "4497 2135.04 \n", - "4498 438.768 \n", - "\n", - " ... Total Spending, 2015 \\\n", - "1 ... None \n", - "2 ... 257896 \n", - "3 ... 73396.6 \n", - "4 ... None \n", - "5 ... None \n", - "6 ... None \n", - "7 ... 2.45788e+07 \n", - "8 ... 1.66262e+07 \n", - "9 ... 552848 \n", - "10 ... 1.57243e+09 \n", - "11 ... 3.73519e+06 \n", - "12 ... 1.48259e+08 \n", - "13 ... 4.48199e+06 \n", - "14 ... 287389 \n", - "15 ... 7.19214e+06 \n", - "16 ... 4.29217e+06 \n", - "17 ... 360521 \n", - "18 ... 1.18727e+07 \n", - "19 ... 472524 \n", - "20 ... None \n", - "21 ... 1.12926e+06 \n", - "22 ... 77105.4 \n", - "23 ... None \n", - "24 ... None \n", - "25 ... 2.75558e+06 \n", - "26 ... None \n", - "27 ... None \n", - "28 ... 4.379e+07 \n", - "29 ... 76243 \n", - "30 ... 3.717e+07 \n", - "... ... ... \n", - "4469 ... 7.89136e+06 \n", - "4470 ... 3.49109e+06 \n", - "4471 ... 2.19063e+08 \n", - "4472 ... 401326 \n", - "4473 ... 2.19107e+06 \n", - "4474 ... 83449.7 \n", - "4475 ... 46482.4 \n", - "4476 ... 29366268 \n", - "4477 ... None \n", - "4478 ... None \n", - "4479 ... 1.91584e+06 \n", - "4480 ... 120398 \n", - "4481 ... None \n", - "4482 ... 22402.2 \n", - "4483 ... 5.91449e+06 \n", - "4484 ... 4.72436e+07 \n", - "4485 ... None \n", - "4486 ... 4.05193e+06 \n", - "4487 ... 1.77405e+07 \n", - "4488 ... 1.93638e+07 \n", - "4489 ... 4.03467e+06 \n", - "4490 ... 212772 \n", - "4491 ... None \n", - "4492 ... 1.76474e+06 \n", - "4493 ... 2.44672e+07 \n", - "4494 ... 7.36494e+06 \n", - "4495 ... 5.20257e+06 \n", - "4496 ... None \n", - "4497 ... 7.9005e+08 \n", - "4498 ... 8.57606e+07 \n", - "\n", - " Beneficiary Count, 2015 Total Annual Spending Per User, 2015 \\\n", - "1 None None \n", - "2 5173 49.8542 \n", - "3 1470 49.9297 \n", - "4 None None \n", - "5 None None \n", - "6 None None \n", - "7 9319 2637.5 \n", - "8 1621 10256.8 \n", - "9 102 5420.08 \n", - "10 322582 4874.51 \n", - "11 742 5033.95 \n", - "12 14001 10589.2 \n", - "13 226 19831.8 \n", - "14 106 2711.21 \n", - "15 172 41814.8 \n", - "16 8976 478.183 \n", - "17 452 797.612 \n", - "18 42221 281.204 \n", - "19 361 1308.93 \n", - "20 None None \n", - "21 1089 1036.97 \n", - "22 91 847.312 \n", - "23 None None \n", - "24 None None \n", - "25 23590 116.811 \n", - "26 None None \n", - "27 None None \n", - "28 1721969 25.4302 \n", - "29 462 165.028 \n", - "30 105306 352.972 \n", - "... ... ... \n", - "4469 671 11760.6 \n", - "4470 6954 502.026 \n", - "4471 1056666 207.315 \n", - "4472 864 464.498 \n", - "4473 2859 766.376 \n", - "4474 547 152.559 \n", - "4475 244 190.502 \n", - "4476 22336 1314.75 \n", - "4477 None None \n", - "4478 None None \n", - "4479 1242 1542.54 \n", - "4480 106 1135.83 \n", - "4481 None None \n", - "4482 40 560.054 \n", - "4483 4323 1368.14 \n", - "4484 1448 32626.8 \n", - "4485 None None \n", - "4486 423 9579.04 \n", - "4487 1042 17025.4 \n", - "4488 357 54240.4 \n", - "4489 12728 316.992 \n", - "4490 338 629.503 \n", - "4491 None None \n", - "4492 10328 170.869 \n", - "4493 4048 6044.27 \n", - "4494 573 12853.3 \n", - "4495 742 7011.55 \n", - "4496 None None \n", - "4497 16965 46569.4 \n", - "4498 21175 4050.09 \n", - "\n", - " Unit Count, 2015 Average Cost Per Unit (Weighted), 2015 \\\n", - "1 None None \n", - "2 1335132 0.193205 \n", - "3 369886 0.19843 \n", - "4 None None \n", - "5 None None \n", - "6 None None \n", - "7 4424163 5.55559 \n", - "8 759933 21.8785 \n", - "9 47600 11.6144 \n", - "10 4.7855e+07 33.1224 \n", - "11 102764 36.3445 \n", - "12 92724.4 1599 \n", - "13 4478 1000.89 \n", - "14 10540 27.1925 \n", - "15 96526 67.5199 \n", - "16 4604905 0.932087 \n", - "17 42010 8.58179 \n", - "18 2.53059e+07 0.468984 \n", - "19 150952 3.12993 \n", - "20 None None \n", - "21 387580 2.91367 \n", - "22 27320 2.82305 \n", - "23 None None \n", - "24 None None \n", - "25 10968286 0.251665 \n", - "26 None None \n", - "27 None None \n", - "28 2.14269e+08 0.207196 \n", - "29 5965 12.7817 \n", - "30 1.7796e+07 2.11976 \n", - "... ... ... \n", - "4469 529259 15.0869 \n", - "4470 1204848 2.89751 \n", - "4471 1.05749e+06 207.153 \n", - "4472 330508 1.32096 \n", - "4473 4938151 0.458346 \n", - "4474 115810 0.720574 \n", - "4475 57129 0.813639 \n", - "4476 303507 127.362 \n", - "4477 None None \n", - "4478 None None \n", - "4479 281986 6.8728 \n", - "4480 5221 23.083 \n", - "4481 None None \n", - "4482 7140 3.13756 \n", - "4483 69584.4 113.722 \n", - "4484 353475 133.655 \n", - "4485 None None \n", - "4486 165334 24.5076 \n", - "4487 722507 24.554 \n", - "4488 211321 91.6323 \n", - "4489 101332 39.8161 \n", - "4490 81379 2.8291 \n", - "4491 None None \n", - "4492 48253 36.5726 \n", - "4493 1127224 22.0989 \n", - "4494 7337 1001.65 \n", - "4495 201642 26.4177 \n", - "4496 None None \n", - "4497 1.20221e+07 65.7165 \n", - "4498 4781132 147.166 \n", - "\n", - " Beneficiary Count No LIS, 2015 \\\n", - "1 None \n", - "2 2878 \n", - "3 710 \n", - "4 None \n", - "5 None \n", - "6 None \n", - "7 2046 \n", - "8 377 \n", - "9 68 \n", - "10 53024 \n", - "11 53 \n", - "12 359 \n", - "13 105 \n", - "14 58 \n", - "15 68 \n", - "16 3190 \n", - "17 302 \n", - "18 22454 \n", - "19 217 \n", - "20 None \n", - "21 903 \n", - "22 72 \n", - "23 None \n", - "24 None \n", - "25 20411 \n", - "26 None \n", - "27 None \n", - "28 983378 \n", - "29 302 \n", - "30 70981 \n", - "... ... \n", - "4469 360 \n", - "4470 4148 \n", - "4471 777507 \n", - "4472 319 \n", - "4473 371 \n", - "4474 63 \n", - "4475 34 \n", - "4476 11905 \n", - "4477 None \n", - "4478 None \n", - "4479 352 \n", - "4480 57 \n", - "4481 None \n", - "4482 19 \n", - "4483 3883 \n", - "4484 1161 \n", - "4485 None \n", - "4486 230 \n", - "4487 576 \n", - "4488 270 \n", - "4489 8883 \n", - "4490 257 \n", - "4491 None \n", - "4492 9091 \n", - "4493 549 \n", - "4494 16 \n", - "4495 66 \n", - "4496 None \n", - "4497 13424 \n", - "4498 7935 \n", - "\n", - " Average Beneficiary Cost Share No LIS, 2015 Beneficiary Count LIS, 2015 \\\n", - "1 None None \n", - "2 27.3053 2295 \n", - "3 28.0719 760 \n", - "4 None None \n", - "5 None None \n", - "6 None None \n", - "7 236.942 7273 \n", - "8 945.154 1244 \n", - "9 303.14 34 \n", - "10 519.777 269558 \n", - "11 663.647 689 \n", - "12 1131.72 13642 \n", - "13 1324.67 121 \n", - "14 375.195 48 \n", - "15 1807.48 104 \n", - "16 113.113 5786 \n", - "17 110.996 150 \n", - "18 89.7874 19767 \n", - "19 345.382 144 \n", - "20 None None \n", - "21 335.851 186 \n", - "22 333.761 19 \n", - "23 None None \n", - "24 None None \n", - "25 58.8611 3179 \n", - "26 None None \n", - "27 None None \n", - "28 9.52073 738591 \n", - "29 26.0781 160 \n", - "30 48.4498 34325 \n", - "... ... ... \n", - "4469 1069.56 311 \n", - "4470 136.649 2806 \n", - "4471 67.9312 279159 \n", - "4472 182.027 545 \n", - "4473 238.774 2488 \n", - "4474 98.8265 484 \n", - "4475 112.846 210 \n", - "4476 88.2972 10431 \n", - "4477 None None \n", - "4478 None None \n", - "4479 370.433 890 \n", - "4480 89.2 49 \n", - "4481 None None \n", - "4482 113.873 21 \n", - "4483 107.773 440 \n", - "4484 2640.4 287 \n", - "4485 None None \n", - "4486 442.614 193 \n", - "4487 1174.86 466 \n", - "4488 3062.1 87 \n", - "4489 65.2757 3845 \n", - "4490 228.816 81 \n", - "4491 None None \n", - "4492 24.6517 1237 \n", - "4493 585.565 3499 \n", - "4494 2145.72 557 \n", - "4495 505.443 676 \n", - "4496 None None \n", - "4497 3299.86 3541 \n", - "4498 607.415 13240 \n", - "\n", - " Average Beneficiary Cost Share LIS, 2015 \\\n", - "1 None \n", - "2 3.98789 \n", - "3 3.51078 \n", - "4 None \n", - "5 None \n", - "6 None \n", - "7 6.14634 \n", - "8 24.1874 \n", - "9 31.55 \n", - "10 16.4978 \n", - "11 18.0646 \n", - "12 15.8525 \n", - "13 8.34917 \n", - "14 14.1008 \n", - "15 50.0728 \n", - "16 5.14128 \n", - "17 13.9405 \n", - "18 6.97572 \n", - "19 23.4429 \n", - "20 None \n", - "21 33.8928 \n", - "22 46.8647 \n", - "23 None \n", - "24 None \n", - "25 10.5109 \n", - "26 None \n", - "27 None \n", - "28 1.81414 \n", - "29 1.89637 \n", - "30 5.31282 \n", - "... ... \n", - "4469 28.5761 \n", - "4470 9.73123 \n", - "4471 5.33344 \n", - "4472 7.76112 \n", - "4473 3.22896 \n", - "4474 5.27165 \n", - "4475 6.55167 \n", - "4476 5.60809 \n", - "4477 None \n", - "4478 None \n", - "4479 22.3777 \n", - "4480 4.33449 \n", - "4481 None \n", - "4482 23.8043 \n", - "4483 7.37655 \n", - "4484 70.9182 \n", - "4485 None \n", - "4486 5.55606 \n", - "4487 17.853 \n", - "4488 102.6 \n", - "4489 5.12193 \n", - "4490 9.98728 \n", - "4491 None \n", - "4492 3.98673 \n", - "4493 17.1297 \n", - "4494 22.4254 \n", - "4495 15.3938 \n", - "4496 None \n", - "4497 163.516 \n", - "4498 17.6266 \n", - "\n", - " Annual Change in Average Cost Per Unit, 2015 \n", - "1 None \n", - "2 0.0222081 \n", - "3 None \n", - "4 None \n", - "5 None \n", - "6 None \n", - "7 -0.137496 \n", - "8 -0.0228733 \n", - "9 None \n", - "10 0.139258 \n", - "11 None \n", - "12 0.0578594 \n", - "13 None \n", - "14 None \n", - "15 None \n", - "16 -0.0524259 \n", - "17 None \n", - "18 -0.0461981 \n", - "19 None \n", - "20 None \n", - "21 0.157929 \n", - "22 None \n", - "23 None \n", - "24 None \n", - "25 -0.19268 \n", - "26 None \n", - "27 None \n", - "28 0.0862521 \n", - "29 None \n", - "30 0.147628 \n", - "... ... \n", - "4469 None \n", - "4470 0.104361 \n", - "4471 0.0601523 \n", - "4472 None \n", - "4473 0.00337603 \n", - "4474 None \n", - "4475 None \n", - "4476 0.133281 \n", - "4477 None \n", - "4478 None \n", - "4479 None \n", - "4480 None \n", - "4481 None \n", - "4482 None \n", - "4483 0.135396 \n", - "4484 None \n", - "4485 None \n", - "4486 None \n", - "4487 0.333055 \n", - "4488 None \n", - "4489 0.100992 \n", - "4490 None \n", - "4491 None \n", - "4492 -0.120066 \n", - "4493 -0.00740394 \n", - "4494 None \n", - "4495 None \n", - "4496 None \n", - "4497 0.100033 \n", - "4498 0.169913 \n", - "\n", - "[4498 rows x 53 columns]" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Extract XLSX data into a pandas DataFrame\n", - "import pandas as pd\n", - "import numpy as np\n", - "df = pd.DataFrame(data_sheet.values)\n", - "df.columns = list(df.iloc[3].values)\n", - "df.drop(df.index[0:4], inplace=True)\n", - "df.index = np.arange(1, len(df) + 1)\n", - "\n", - "df" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Capture only the drug names (we'll need this later)\n", - "df_drugnames = df.iloc[:, :2]\n", - "df_drugnames.columns = [\n", - " 'drugname_brand',\n", - " 'drugname_generic'\n", - "]" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/matt/projects/d4d/drug-spending/.env/lib/python3.6/site-packages/pandas/core/indexing.py:561: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy\n", - " self.obj[item_labels[indexer[info_axis]]] = value\n" - ] - } - ], - "source": [ - "# Strip extraneous whitespace from drug names\n", - "df_drugnames.loc[:, 'drugname_brand'] = df_drugnames.loc[:, 'drugname_brand'].map(lambda x: x.strip())\n", - "df_drugnames.loc[:, 'drugname_generic'] = df_drugnames.loc[:, 'drugname_generic'].map(lambda x: x.strip())" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Serialize drug names to feather file for use in both Python and R\n", - "import feather\n", - "feather.write_dataframe(df_drugnames, data_dir + 'drugnames.feather')" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Separate column groups by year\n", - "cols_by_year = [\n", - " { 'year': 2011, 'start': 2, 'end': 12 },\n", - " { 'year': 2012, 'start': 12, 'end': 22 },\n", - " { 'year': 2013, 'start': 22, 'end': 32 },\n", - " { 'year': 2014, 'start': 32, 'end': 42 },\n", - " { 'year': 2015, 'start': 42, 'end': 53 },\n", - "]\n", - "\n", - "df_years = {}\n", - "\n", - "col_brandname = 0\n", - "col_genericname = 1\n", - "for cols in cols_by_year:\n", - " year, start, end = cols['year'], cols['start'], cols['end']\n", - " \n", - " df_years[year] = pd.concat(\n", - " [\n", - " df_drugnames,\n", - " df.iloc[:, start:end]\n", - " ],\n", - " axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Remove 2015's extra column for \"Annual Change in Average Cost Per Unit\" (we can calculate it, anyhow)\n", - "df_years[2015] = df_years[2015].drop(df_years[2015].columns[-1], axis=1)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Drop any rows in each year that have absolutely no data, then reset their row indices\n", - "for year in df_years:\n", - " nonnull_rows = df_years[year].iloc[:, 2:].apply(lambda x: x.notnull().any(), axis=1)\n", - " df_years[year] = df_years[year][nonnull_rows]\n", - " df_years[year].index = np.arange(1, len(df_years[year]) + 1)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Make columns easier to type and more generic w.r.t. year\n", - "generic_columns = [\n", - " \"drugname_brand\",\n", - " \"drugname_generic\",\n", - " \"claim_count\",\n", - " \"total_spending\",\n", - " \"user_count\",\n", - " \"total_spending_per_user\",\n", - " \"unit_count\",\n", - " \"unit_cost_wavg\",\n", - " \"user_count_non_lowincome\",\n", - " \"out_of_pocket_avg_non_lowincome\",\n", - " \"user_count_lowincome\",\n", - " \"out_of_pocket_avg_lowincome\"\n", - "]\n", - "\n", - "for year in df_years:\n", - " df_years[year].columns = generic_columns" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Cast all column data to appropriate numeric types\n", - "\n", - "# Suppress SettingWithCopyWarnings because I think it's\n", - "# tripping on the fact that we have a dict of DataFrames\n", - "pd.options.mode.chained_assignment = None\n", - "for year in df_years:\n", - " # Ignore the first two columns, which are strings and contain drug names\n", - " for col in df_years[year].columns[2:]:\n", - " df_years[year].loc[:, col] = pd.to_numeric(df_years[year][col])\n", - "pd.options.mode.chained_assignment = 'warn'" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Serialize data for each year to feather file for use in both Python and R\n", - "for year in df_years:\n", - " feather.write_dataframe(df_years[year], data_dir + 'spending-' + str(year) + '.feather')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.0" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/scripts/read_data.py b/scripts/read_data.py new file mode 100644 index 0000000..cdaa9f0 --- /dev/null +++ b/scripts/read_data.py @@ -0,0 +1,645 @@ +import requests # to download the dataset +import zipfile # to extract from archive +import shutil # to write the dataset to file +import os # rename file to something more type-able +import argparse # argument parsing for command line options + +import pandas as pd +import numpy as np + +import feather + +# custom exception for undefined option +class OptionUndefinedError(Exception): + def __init__(self, expression): + print("Option for output file format not recognized!") + + +def _download_data(url, data_dir="../data/", data_name="dataset", zipped_data=False): + """ + Helper function to download the data from a given URL into a + directory to be specified. If it's a zip file, unzip. + + Parameters + ---------- + url : string + String with the URL from where to download the data + + data_dir : string, optional, default: "../data/" + Path to the directory where to store the new data + + zipped_data: bool, optional, default: False + Is the file we download a zip file? If True, unzip it. + """ + + # figure out if data directory exists + # if not, create it! + try: + os.stat(data_dir) + except FileNotFoundError: + os.mkdir(data_dir) + + # open a connection to the URL + response = requests.get(url, stream=True) + + # store file to disk + with open(data_dir + data_name, 'wb') as ds_zipout: + shutil.copyfileobj(response.raw, ds_zipout) + + # if it's a zip file, then unzip: + if zipped_data: + zip = zipfile.ZipFile(data_dir + data_name, 'r') + + # get list of file names in zip file: + ds_filenames = zip.namelist() + # loop through file names and extract each + for f in ds_filenames: + zip.extract(f, path=data_dir) + + return + + +def download_partd(data_dir="../data/", output_format="feather"): + """ + Download the Medicare Part D expenditure data from the CMS website. + This function will dowload the data, load the original Excel file into + a pandas DataFrame and do some data wrangling and cleaning. + + The end result are a file with drug names (both generic and brand) as well + as one file per year with the actual data. The file type of the output files + is determined by the `output_format` keyword argument. + + Parameters + ---------- + data_dir : string + The path to the directory where the data should be stored. + + output_format : string, optional, default: "feather" + The file format for the output file. Currently supported data formats are: + * "cvs": return comma-separated values in a simple ASCII file + * "feather": return a `.feather` file (required `feather` Python package!) + + """ + + + # URL for the CMS Part D data + url = 'https://www.cms.gov/Research-Statistics-Data-and-Systems/'+ \ + 'Statistics-Trends-and-Reports/Information-on-Prescription-Drugs/'+ \ + 'Downloads/Part_D_All_Drugs_2015.zip' + + # download data from CMS: + _download_data(url, data_dir=data_dir, data_name="part_d.zip", zipped_data=True) + + # data is in a form of an Excel sheet (because of course it is) + # we need to make sure we read the right work sheet (i.e. the one with the data): + xls = pd.ExcelFile(data_dir + "Medicare_Drug_Spending_PartD_All_Drugs_YTD_2015_12_06_2016.xlsx") + partd = xls.parse('Data', skiprows=3) + partd.index = np.arange(1, len(partd) + 1) + + # First part: get out the drug names (generic + brand) and store them to a file + + # Capture only the drug names (we'll need this later) + partd_drugnames = partd.iloc[:, :2] + partd_drugnames.columns = ['drugname_brand', 'drugname_generic'] + + # Strip extraneous whitespace from drug names + partd_drugnames.loc[:, 'drugname_brand'] = partd_drugnames.loc[:, 'drugname_brand'].map(lambda x: x.strip()) + partd_drugnames.loc[:, 'drugname_generic'] = partd_drugnames.loc[:, 'drugname_generic'].map(lambda x: x.strip()) + + # make all drugnames lowercase: + partd_drugnames["drugname_generic"] = partd_drugnames["drugname_generic"].str.lower() + partd_drugnames["drugname_brand"] = partd_drugnames["drugname_brand"].str.lower() + + + if output_format == "csv": + # get all the column names for the file header + hdr = list(partd_drugnames.columns) + # add a `#` to the first element of the list so header + # won't be confused for data + hdr[0] = "#" + hdr[0] + partd_drugnames.to_csv(data_dir + "drugnames.csv", sep="\t", header=hdr, + index=False) + elif output_format == "feather": + # write the results to a feather file: + feather.write_dataframe(partd_drugnames, data_dir + 'drugnames.feather') + else: + raise OptionUndefinedError() + + # Separate column groups by year + cols_by_year = [ + { 'year': 2011, 'start': 2, 'end': 12 }, + { 'year': 2012, 'start': 12, 'end': 22 }, + { 'year': 2013, 'start': 22, 'end': 32 }, + { 'year': 2014, 'start': 32, 'end': 42 }, + { 'year': 2015, 'start': 42, 'end': 53 }, + ] + + partd_years = {} + + col_brandname = 0 + col_genericname = 1 + for cols in cols_by_year: + year, start, end = cols['year'], cols['start'], cols['end'] + + partd_years[year] = pd.concat([partd_drugnames, + partd.iloc[:, start:end]], + axis=1) + + # Remove 2015's extra column for "Annual Change in Average Cost Per Unit" (we can calculate it, anyhow) + partd_years[2015] = partd_years[2015].drop(partd_years[2015].columns[-1], axis=1) + + # Drop any rows in each year that have absolutely no data, then reset their row indices + for year in partd_years: + nonnull_rows = partd_years[year].iloc[:, 2:].apply(lambda x: x.notnull().any(), axis=1) + partd_years[year] = partd_years[year][nonnull_rows] + partd_years[year].index = np.arange(1, len(partd_years[year]) + 1) + + # Make columns easier to type and more generic w.r.t. year + generic_columns = [ + "drugname_brand", + "drugname_generic", + "claim_count", + "total_spending", + "user_count", + "total_spending_per_user", + "unit_count", + "unit_cost_wavg", + "user_count_non_lowincome", + "out_of_pocket_avg_non_lowincome", + "user_count_lowincome", + "out_of_pocket_avg_lowincome" + ] + + for year in partd_years: + partd_years[year].columns = generic_columns + + # Cast all column data to appropriate numeric types + + # Suppress SettingWithCopyWarnings because I think it's + # tripping on the fact that we have a dict of DataFrames + pd.options.mode.chained_assignment = None + for year in partd_years: + # Ignore the first two columns, which are strings and contain drug names + for col in partd_years[year].columns[2:]: + partd_years[year].loc[:, col] = pd.to_numeric(partd_years[year][col]) + pd.options.mode.chained_assignment = 'warn' + + + if output_format == "csv": + for year in partd_years: + hdr = list(partd_years[year].columns) + hdr[0] = "#" + hdr[0] + partd_years[year].to_csv(data_dir + "spending-" + str(year) + ".csv", sep="\t", header=hdr, + index=False) + elif output_format == "feather": + # Serialize data for each year to feather file for use in both Python and R + for year in partd_years: + feather.write_dataframe(partd_years[year], data_dir + 'spending-' + str(year) + '.feather') + + else: + raise OptionUndefinedError() + + return + +def download_puf(data_dir="../data/", all_columns=True , output_format="feather"): + """ + Download the CMS prescription drug profiles. + This function will dowload the data, load the original CSV file into + a pandas DataFrame and do some data wrangling and cleaning. + + The end result will be a feather file with the prescription drug + profiles. + + Parameters + ---------- + data_dir : string + The path to the directory where the data should be stored. + + all_columns : bool, optional, default: True + If True, store all columns in a feather file. + If False, only store the columns with RXCUI ID, drug major class + and drug class + + output_format : string, optional, default: "feather" + The file format for the output file. Currently supported data formats are: + * "cvs": return comma-separated values in a simple ASCII file + * "feather": return a `.feather` file (required `feather` Python package!) + + """ + url = "https://www.cms.gov/Research-Statistics-Data-and-Systems/"+\ + "Statistics-Trends-and-Reports/BSAPUFS/Downloads/2010_PD_Profiles_PUF.zip" + + + # download data from CMS: + _download_data(url, data_dir=data_dir, data_name="puf.zip", zipped_data=True) + + # read CSV into DataFrame + puf = pd.read_csv("../data/2010_PD_Profiles_PUF.csv") + + # if we don't want to save all columns, drop those except for the three columns + # we're interested in. + if not all_columns: + puf.drop(["BENE_SEX_IDENT_CD", "BENE_AGE_CAT_CD", "PDE_DRUG_TYPE_CD", "PLAN_TYPE", + "COVERAGE_TYPE", "benefit_phase","DRUG_BENEFIT_TYPE", + "PRESCRIBER_TYPE", "GAP_COVERAGE", "TIER_ID", "MEAN_RXHCC_SCORE", + "AVE_DAYS_SUPPLY", "AVE_TOT_DRUG_COST", "AVE_PTNT_PAY_AMT", + "PDE_CNT", "BENE_CNT_CAT"], axis=1, inplace=True) + + if output_format == "csv": + # get all the column names for the file header + hdr = list(puf.columns) + # add a `#` to the first element of the list so header + # won't be confused for data + hdr[0] = "#" + hdr[0] + puf.to_csv(data_dir + "puf.csv", sep="\t", header=hdr, + index=False) + elif output_format == "feather": + # write the results to a feather file: + feather.write_dataframe(puf, data_dir + 'puf.feather') + else: + raise OptionUndefinedError() + + return + +def download_rxnorm(data_dir="../data/", output_format="feather"): + """ + Download RxNorm data for *currently prescribable* drugs. The RxNorm data + describes a standard identifier for drugs, along with commonly used names, + ingredients and relationships. The full data set is very large and requires a + special licence. Here, we use the subset of drugs that can currently be + prescribed, which are available without licence. We are also going to ignore + the relational data and focus on commonly used identifiers and the RxNorm ID. + + Parameters + ---------- + data_dir : string + The path to the directory where the data should be stored. + + output_format : string, optional, default: "feather" + The file format for the output file. Currently supported data formats are: + * "cvs": return comma-separated values in a simple ASCII file + * "feather": return a `.feather` file (required `feather` Python package!) + + """ + # URL to the data file + url = "https://download.nlm.nih.gov/rxnorm/RxNorm_full_prescribe_01032017.zip" + + # download data from NIH: + _download_data(url, data_dir=data_dir, data_name="rxnorm.zip", zipped_data=True) + + + # Column names as copied from the NIH website + names = ["RXCUI", "LAT", "TS", "LUI", "STT", "SUI", "ISPREF", "RXAUI", + "SAUI", "SCUI", "SDUI", "SAB", "TTY", "CODE", "STR", "SRL", "SUPPRESS", "CVF"] + + # we only want column 0 (the RXCUI identifier) and 14 (the commonly used name) + rxnorm = pd.read_csv("../data/rrf/RXNCONSO.RRF", sep="|", names=names, index_col=False, + usecols=[0,14]) + + # make all strings lowercase + rxnorm["STR"] = rxnorm["STR"].str.lower() + + if output_format == "csv": + # get all the column names for the file header + hdr = list(rxnorm.columns) + # add a `#` to the first element of the list so header + # won't be confused for data + hdr[0] = "#" + hdr[0] + rxnorm.to_csv(data_dir + "rxnorm.csv", sep="\t", header=hdr, + index=False) + elif output_format == "feather": + # write the results to a feather file: + feather.write_dataframe(rxnorm, data_dir + 'rxnorm.feather') + else: + raise OptionUndefinedError() + + return + +def download_drug_class_ids(data_dir="../data/", output_format="feather"): + """ + Download the table associating major and minor classes with alphanumeric codes. + This data originates in the VA's National Drug File, but also exists in more accessible + for in the SAS files related to the CMS PUF files. + + Parameters + ---------- + data_dir : string + The path to the directory where the data should be stored. + + output_format : string, optional, default: "feather" + The file format for the output file. Currently supported data formats are: + * "cvs": return comma-separated values in a simple ASCII file + * "feather": return a `.feather` file (required `feather` Python package!) + """ + + url = "https://www.cms.gov/Research-Statistics-Data-and-Systems/" + \ + "Statistics-Trends-and-Reports/BSAPUFS/Downloads/2010_PD_Profiles_PUF_DUG.zip" + + # download data from CMS: + _download_data(url, data_dir=data_dir, data_name="drug_classes_dataset.zip", zipped_data=True) + + # read drug major classes + drug_major_class = pd.read_csv(data_dir+"DRUG_MAJOR_CLASS_TABLE.csv") + + # read drug minor classes + drug_class = pd.read_csv(data_dir+"DRUG_CLASS_TABLE.csv") + + # replace NaN values in drug_class table + drug_class.replace(to_replace=np.nan, value="N/A", inplace=True) + + if output_format == "csv": + # get all the column names for the file header + hdr_dmc = list(drug_major_class.columns) + hdr_dc = list(drug_class.columns) + # add a `#` to the first element of the list so header + # won't be confused for data + hdr_dmc[0] = "#" + hdr_dmc[0] + hdr_dc[0] = "#" + hdr_dc[0] + + drug_major_class.to_csv(data_dir + "drug_major_class.csv", sep="\t", header=hdr_dmc, + index=False) + drug_class.to_csv(data_dir + "drug_class.csv", sep="\t", header=hdr_dc, + index=False) + + elif output_format == "feather": + # write the results to a feather file: + feather.write_dataframe(drug_major_class, data_dir + 'drug_major_class.feather') + feather.write_dataframe(drug_class, data_dir + 'drug_class.feather') + else: + raise OptionUndefinedError() + + return + + +def make_drug_table(data_dir="../data/", data_local=True, file_format="feather"): + """ + Make a table that associates: + * drug brand name + * drug generic name + * drug RxNorm RXCUI Identifier + * drug major class + * drug minor class + + If the data doesn't exist locally, it will be downloaded. + The output is a feather file called `drugnames_withclasses.feather`. + + Parameters + ---------- + data_dir : string, optional, default: "../data/" + The directory that contains the data as .feather files. + + data_local : bool, optional, default: True + If True, code assumes that the data exists locally. If this is not + the case, the function will exit with an error. If False, data will + be downloaded to the directory specified in `data_dir`. + + file_format : string, optional, default: "feather" + The file format for the input files. If `data_local=False`, also the file format for the + output files. Currently supported data formats are: + * "cvs": return comma-separated values in a simple ASCII file + * "feather": return a `.feather` file (required `feather` Python package!) + + """ + # if data_local is False, download all the necessary data + if not data_local: + download_partd(data_dir, output_format=file_format) + download_puf(data_dir, all_columns=False, output_format=file_format) + download_rxnorm(data_dir, output_format=file_format) + download_drug_class_ids(data_dir, output_format=file_format) + + # assert that data directory and all necessary files exist. + assert os.path.isdir(data_dir), "Data directory does not exist!" + assert (os.path.isfile(data_dir+"drugnames.feather") | os.path.isfile(data_dir+"drugnames.csv")), \ + "Drugnames file does not exist!" + assert (os.path.isfile(data_dir+"puf.feather") | os.path.isfile(data_dir+"puf.csv")), \ + "Prescription drug profile data file does not exist!" + assert (os.path.isfile(data_dir+"rxnorm.feather") | os.path.isfile(data_dir+"rxnorm.csv")), \ + "RxNorm data file does not exist!" + assert (os.path.isfile(data_dir+"drug_major_class.feather") | os.path.isfile(data_dir+"drug_major_class.csv")), \ + "Drug major class file does not exist." + assert (os.path.isfile(data_dir+"drug_class.feather") | os.path.isfile(data_dir+"drug_class.csv")), \ + "Drug class file does not exist." + + if file_format == "feather": + # load data files from disk + drugnames = feather.read_dataframe(data_dir + "drugnames.feather") + puf = feather.read_dataframe(data_dir + "puf.feather") + rxnorm = feather.read_dataframe(data_dir + "rxnorm.feather") + drug_major_class = feather.read_dataframe(data_dir + "drug_major_class.feather") + drug_class = feather.read_dataframe(data_dir + "drug_class.feather") + + elif file_format == "csv": + drugnames = pd.read_csv(data_dir + "drugnames.csv", sep="\t", header=0) + drugnames.columns = drugnames.columns.str.strip("#") + + puf = pd.read_csv(data_dir + "puf.csv", sep="\t", header=0) + puf.columns = puf.columns.str.strip("#") + + rxnorm = pd.read_csv(data_dir + "rxnorm.csv", sep="\t", header=0) + rxnorm.columns = rxnorm.columns.str.strip("#") + + drug_major_class = pd.read_csv(data_dir + "drug_major_class.csv", sep="\t", header=0) + drug_major_class.columns = drug_major_class.columns.str.strip("#") + + drug_class = pd.read_csv(data_dir + "drug_class.csv", sep="\t", header=0) + drug_class.columns = drug_class.columns.str.strip("#") + drug_class.drug_class = drug_class.drug_class.astype(str) + drug_class.drug_class_desc = drug_class.drug_class_desc.astype(str) + + else: + raise OptionUndefinedError() + + drugnames["RXCUI"] = "0.0" + + # associate drug names with RXCUI codes + # NOTE: THIS IS A BIT HACKY! + + # loop over indices in list of drug names + for idx in drugnames.index: + + # sometimes, we might have more than one RXCUI + # associated with a drug, because the names can + # be a bit ambivalent, so make a list + rxcui = [] + + # we are going to look for RXCUI codes for both the + # generic name of the drug and the brand name of the drug + # because sometimes one might be associated and the other + # one isn't + for c in ["drugname_generic", "drugname_brand"]: + + # get out the correct row in the table + d = drugnames.loc[idx, c] + # sometimes a drug has two names, split by a slash + # we are going to try and find RXCUI codes for both + dsplit = d.split("/") + + # loop over drug names + for di in dsplit: + # sometimes, a drug has a suffix attached to it + # since this doesn't usually exist in the RxNorm table, + # we strip anything after a free space + displit = di.split(" ") + v = rxnorm[rxnorm["STR"] == displit[0]] + + # include all unique RXCUI codes in the list + if len(v) > 0: + rxcui.extend(v["RXCUI"].unique()) + else: + continue + + # if there are more than one RXCUI identifier for a drug, + # make a string containing all codes, separated by a '|' + if len(rxcui) > 1: + rxcui_str = "|".join(np.array(rxcui, dtype=str)) + + elif len(rxcui) == 1: + rxcui_str = str(rxcui[0]) + else: + # if there is no RXCUI code associated, include a 0 + rxcui_str = '0.0' + + # associate string with RXCUI codes with the correct row + drugnames.loc[idx, "RXCUI"] = rxcui_str + + # number of drugs that I can't find RXCUI codes for: + n_missing = len(drugnames[drugnames["RXCUI"] == '0.0']) + + print("A fraction of %.2f drugs has no RxNorm entry that I can find."%(n_missing/len(drugnames))) + + # add empty columns for drug classes and associated strings + drugnames["drug_major_class"] = "" + drugnames["dmc_string"] = "" + drugnames["drug_class"] = "" + drugnames["dc_string"] = "" + + # make sure RXCUI codes are all strings: + drugnames["RXCUI"] = drugnames["RXCUI"].astype(str) + + # loop over drug names again + for idx in drugnames.index: + + # get out the RxCUI codes for this entry + drug_rxcui = drugnames.loc[idx, "RXCUI"].split("|") + + # the same way that one drug may have multiple RXCUI codes, + # it may also have multiple classes, so make an empty list for them + dmc, dc = [], [] + + # if there are multiple RXCUIs, we'll need to loop over them: + for rxcui in drug_rxcui: + # find the right entry in the prescription drug profile data for + # this RXCUI + r = puf[puf["RXNORM_RXCUI"] == np.float(rxcui)] + + # there will be duplicates, so let's pick only the set of unique IDs + rxc = r.loc[r.index, "RXNORM_RXCUI"].unique() + + # add drug classes for this RXCUI to list + dmc.extend(r.loc[r.index, "DRUG_MAJOR_CLASS"].unique()) + dc.extend(r.loc[r.index, "DRUG_CLASS"].unique()) + + # multiple RXCUIs might have the same class, and we only care + # about unique entires + dmc = np.unique(dmc) + dc = np.unique(dc) + + # if there is at least one drug class associated with the drug, + # make a string of all associated drug classes separated by `|` + # and store in correct row and column + if len(dmc) != 0: + drugnames.loc[idx, "drug_major_class"] = "|".join(dmc) + dmc_name = np.hstack([drug_major_class.loc[drug_major_class["drug_major_class"] == d, + "drug_major_class_desc"].values for d in dmc]) + drugnames.loc[idx, "dmc_name"] = "|".join(dmc_name) + + # if there is no class associated, this entry will be zero + else: + drugnames.loc[idx, "drug_major_class"] = "0" + drugnames.loc[idx, "dmc_name"] = "0" + + # same procedure as if-statement just above + if len(dc) != 0: + drugnames.loc[idx, "drug_class"] = "|".join(dc) + dc_name = np.hstack([drug_class.loc[drug_class["drug_class"] == d, + "drug_class_desc"].values for d in dc]) + + drugnames.loc[idx, "dc_name"] = "|".join(dc_name) + else: + drugnames.loc[idx, "drug_class"] = "0" + drugnames.loc[idx, "dc_name"] = "0" + + + if file_format == "csv": + # get all the column names for the file header + hdr = list(drugnames.columns) + # add a `#` to the first element of the list so header + # won't be confused for data + hdr[0] = "#" + hdr[0] + drugnames.to_csv(data_dir + "drugnames_withclasses.csv", sep="\t", header=hdr, + index=False) + elif file_format == "feather": + # write the results to a feather file: + feather.write_dataframe(drugnames, data_dir + 'drugnames_withclasses.feather') + else: + raise OptionUndefinedError() + + return + + +# if script is called from the command, line, code below is executed. +if __name__ == "__main__": + + # make an argument parser object to parse command line arguments + parser = argparse.ArgumentParser(description="Download and wrangle Medicare drug use data.") + + # define possible command line arguments + parser.add_argument("-d", "--data-dir", action="store", required=False, default="../data/", + dest="data_dir", help="Optional path to the data directory where data is " + + "stored/retrieved. Default: '../data/'") + parser.add_argument("-f", "--output-format", action="store", required=False, default="feather", + dest="output_format", help="File format for output files. {'csv' | 'feather'}") + + parser.add_argument("-a", "--download-all", action="store_true", dest="dl_all", + help="If this flag is set, download all data sets") + parser.add_argument("--download-partd", action="store_true", dest="dl_partd", + help="If this flag is set, download Medicare Part D data set.") + parser.add_argument("--download-rxnorm", action="store_true", dest="dl_rxnorm", + help="If this flag is set, download RxNorm data.") + parser.add_argument("--download-puf", action="store_true", dest="dl_puf", + help="If this flag is set, download prescription drug profile data.") + parser.add_argument("--download-drug-classes", action="store_true", dest="dl_drugclass", + help="If this flag is set, download drug class ID tables for PUF data.") + parser.add_argument("--make-drug-table", action="store_true", dest="make_dtable", + help="If this flag is set, make a table associating drug names in "+ + "the Part D data with RxNorm IDs and drug classes from the PUF data.") + + # parse arguments + clargs = parser.parse_args() + + if clargs.dl_all: + print("You have chosen to download all data.") + print("Downloading Medicare Part D data ...") + download_partd(clargs.data_dir, output_format=clargs.output_format) + print("Downloading Prescription Drug Profile data ...") + download_puf(clargs.data_dir, all_columns=True, output_format=clargs.output_format) + print("Downloading RxNorm data ...") + download_rxnorm(clargs.data_dir, output_format=clargs.output_format) + print("Download drug class IDs ...") + download_drug_class_ids(clargs.data_dir, output_format=clargs.output_format) + print("All done!") + elif clargs.dl_partd: + download_partd(clargs.data_dir, output_format=clargs.output_format) + elif clargs.dl_rxnorm: + download_rxnorm(clargs.data_dir, output_format=clargs.output_format) + elif clargs.dl_puf: + download_puf(clargs.data_dir, all_columns=True, output_format=clargs.output_format) + elif clargs.dl_drugclass: + download_drug_class_ids(clargs.data_dir, output_format=clargs.output_format) + else: + print("No data to be downloaded.") + + if clargs.make_dtable: + print("Combining data sets to associate drug names with IDs and classes ...") + make_drug_table(clargs.data_dir, data_local=True, file_format=clargs.output_format) + From a471e8301646d1ae09df0f18908753a496a5ad12 Mon Sep 17 00:00:00 2001 From: Daniela Huppenkothen Date: Sat, 4 Feb 2017 17:36:06 -0500 Subject: [PATCH 03/20] Small bug fix to remove hard-coded directory paths (#28) --- scripts/read_data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/read_data.py b/scripts/read_data.py index cdaa9f0..cb85282 100644 --- a/scripts/read_data.py +++ b/scripts/read_data.py @@ -234,7 +234,7 @@ def download_puf(data_dir="../data/", all_columns=True , output_format="feather" _download_data(url, data_dir=data_dir, data_name="puf.zip", zipped_data=True) # read CSV into DataFrame - puf = pd.read_csv("../data/2010_PD_Profiles_PUF.csv") + puf = pd.read_csv(data_dir + "2010_PD_Profiles_PUF.csv") # if we don't want to save all columns, drop those except for the three columns # we're interested in. @@ -293,7 +293,7 @@ def download_rxnorm(data_dir="../data/", output_format="feather"): "SAUI", "SCUI", "SDUI", "SAB", "TTY", "CODE", "STR", "SRL", "SUPPRESS", "CVF"] # we only want column 0 (the RXCUI identifier) and 14 (the commonly used name) - rxnorm = pd.read_csv("../data/rrf/RXNCONSO.RRF", sep="|", names=names, index_col=False, + rxnorm = pd.read_csv(data_dir + "rrf/RXNCONSO.RRF", sep="|", names=names, index_col=False, usecols=[0,14]) # make all strings lowercase From 0228bbb0507d53ac88dd41cc5b62fc5756cf5351 Mon Sep 17 00:00:00 2001 From: Jennifer Thompson Date: Sat, 4 Feb 2017 22:41:32 -0600 Subject: [PATCH 04/20] Markdown version of goals statement - first draft. --- objectives.md | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 objectives.md diff --git a/objectives.md b/objectives.md new file mode 100644 index 0000000..08ff0d8 --- /dev/null +++ b/objectives.md @@ -0,0 +1,70 @@ +# Drug Spending Project Goals and Objectives + +*This document is an overarching view of project goals and research questions. For an up-to-date list of specific to-do items and work in progress, see our [GitHub Issues](https://github.com/Data4Democracy/drug-spending/issues) or [weekly update](https://docs.google.com/document/d/1azJZBPo9438ZOc73Gq2_AWbciKXgwBXiJk5gUAwGA0c/edit).* + +At its heart, this project seeks to gain a deeper understanding of where and how United States Medicare tax dollars are being spent. Healthcare is an increasingly important issue for many Americans; the Centers for Medicare and Medicaid Services estimate nearly 41 million Americans were enrolled in Medicare prescription drug coverage programs as of October 2016.^1^ + +Because healthcare spending is a very real concern, we want to make it real - not just for people who like reading graphs and looking at statistics, but for everybody. We're harnessing the power of data and modern computing to find answers to the questions people keep asking, and to make those answers clear and easy to understand - questions like: + +- Which conditions are we spending the most to treat? +- How much are people paying out of their own pockets for prescription drugs? +- What could Medicare and the American people do to save money, while also ensuring the same quality of care? + +In conducting this research, we hope to gain new insights and create a positive impact for healthcare consumers and providers across the United States. + +## Medicare-Specific Goals + +[Medicare](https://en.wikipedia.org/wiki/Medicare_(United_States)) is a US government health care program for Americans age 65 and older, as well as a few smaller groups. Goals 1-3 are primarily driven by the data that inspired this project: [data released by the Centers for Medicare & Medicaid Services](https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/Information-on-Prescription-Drugs/2015MedicareData.html) to describe, in aggregate, prescription counts and spending for Medicare Parts B and D between 2011 and 2015. + +### Goal 1: Understand how Medicare-related US taxpayer dollars are spent and how this program directly affects older Americans + +Medicare is a huge expenditure for the federal government, paid for in part by US citizens’ taxes; in 2015, it accounted for 15% of the federal budget.^2^ We want to help the public understand what these funds are paying for and how this program affects our older generation (and, by extension, all Americans), specifically relating to prescription costs and claims. + +We’ll answer questions like: + +- What are the most common conditions that Medicare pays to treat, and how many older Americans are affected by them? +- What proportion of Medicare prescription spending/claims is spent on, for example, diabetes medications? How has this changed over time? +- How much does Medicare spend on brand-name drugs vs generics, where available? +- Medicare recipients are still responsible for some out-of-pocket prescription costs even after receiving their benefits. How much does a typical Medicare recipient pay for a given prescription? How does this differ for patients who receive a low-income subsidy vs those who do not? + +### Goal 2: Understand changes in spending and claims over time + +With a few years of prescription data, we can see how prescribing practice and prices change for a condition, drug class or specific formulation. Some examples of what we’re looking for: + +- New medications or classes changing prescribing habits +- Competition between brand names affecting costs +- Introduction of generics leading to less brand name use and lower overall spending, even with the same number of prescriptions +- Evolution of clinical practice - for example, more awareness of a condition means more diagnoses and thus more prescriptions +- Changes in the financial or legislative realms (company mergers or partial convergence of the “[doughnut hole](https://en.wikipedia.org/wiki/Medicare_Part_D_coverage_gap)”, for example) + +### Goal 3: Add informative context to raw numbers + +Seeing a spending pattern can raise a lot of questions: What caused a big spike in a particular brand-name drug’s cost in a certain year? Why did the number of prescriptions for all drugs in a particular class seem to suddenly get higher? + +By combining CMS data with additional information, we can help the public understand changes in spending and prescribing patterns. Examples might include: + +- Change in Medicare rules allowing coverage of benzodiazepines in 2013 ([link](https://www.propublica.org/article/medicare-paid-for-nearly-40-million-tranquilizer-prescriptions-in-2013)) +- Price spike after a specific brand of medication is acquired by a new company ([example](https://www.nytimes.com/2015/10/05/business/valeants-drug-price-strategy-enriches-it-but-infuriates-patients-and-lawmakers.html?_r=0)) +- A generic form of a popular brand-name drug becomes available +- Clinical guideline changes +- More broadly: Out of all Medicare spending, how much is on Part D (outpatient prescriptions)? Part B (inpatient prescriptions)? + +## Additional Goals/Research Questions + +These questions don’t have obvious data sources as of yet, but are most definitely of interest to us and to the public. We’ll look for data sources to help refine and answer these questions as well. + +### Variation in Retail, Insurance & Out of Pocket Costs +What one individual pays for a certain medication can vary widely depending on his or her health care coverage, pharmacy, and use of coupons or other discount programs. We’d like to describe this variation in costs, look for factors that contribute to it, and find opportunities to make the public more aware of available resources. + +### Medicaid Spending + +Medicaid is another US government health program which provides health insurance for low-income families and individuals. It is jointly funded and run by the federal and state governments, so data structures as well as the conclusions we draw might vary from state to state. We’d like to answer questions similar to our Medicare goals for this program. + +### Relationship between R&D and Drug Prices + +Drug development is undeniably incredibly expensive; do the medications which took the most in R&D spending also cost the most to insurance companies/government programs/individuals? + +## Citations + +1. Hoadley, Jack; Cubanski, Juliette; and Neuman, Tricia. “Medicare Part D in 2016 and Trends Over Time.” Kaiser Family Foundation, http://kff.org/report-section/medicare-part-d-in-2016-and-trends-over-time-section-1-part-d-enrollment-and-plan-availability/ . Accessed January 31, 2017. +2. Cubanski, Juliette, and Neuman, Tricia. “The Facts on Medicare Spending and Financing.” Kaiser Family Foundation, http://kff.org/medicare/issue-brief/the-facts-on-medicare-spending-and-financing/ . Accessed January 31, 2017. From 03bfc1779bad149a74d3d32b1709d66e13f296e1 Mon Sep 17 00:00:00 2001 From: Claire Duvallet Date: Sun, 5 Feb 2017 14:49:24 -0500 Subject: [PATCH 05/20] add USP drug classification tidying and data dictionary --- datacentral/README.md | 15 ++++ datacentral/usp_drug_classification.md | 69 +++++++++++++++++++ .../usp_drug_classification_tidying_script.py | 50 ++++++++++++++ 3 files changed, 134 insertions(+) create mode 100644 datacentral/usp_drug_classification.md create mode 100644 datacentral/usp_drug_classification_tidying_script.py diff --git a/datacentral/README.md b/datacentral/README.md index cafa69b..592873c 100644 --- a/datacentral/README.md +++ b/datacentral/README.md @@ -113,3 +113,18 @@ Link to full data dictionary [in progress] OpenSecrets has data on lobbying transactions from pharmaceutical companies and their subsidiaries, totaled by year. Link to full data dictionary [in progress] + +--- + +#### 8. USP Drug Classification -- *waiting for access to data.world to upload raw and tidy* + +###### Formats: text, CSV +###### Original Source: [KEGG](http://www.genome.jp/kegg-bin/get_htext?htext=br08302.keg) + +The US Pharmacopeial Convention Drug Classification system. Contains category and class information on outpatient +drugs available in the US market. TBD if data also contains information on Part D eligible +drugs only, though it seems like it likely doesn't: "The USP DC is intended to be complementary to +the [USP MMG](http://www.usp.org/usp-healthcare-professionals/usp-medicare-model-guidelines) and +is developed with similar guiding principles, taxonomy, and structure of the USP Categories and Classes." + +Link to full data dictionary: [usp_drug_classification.md](https://github.com/Data4Democracy/drug-spending/blob/data-dictionaries/data/usp_drug_classification.md) \ No newline at end of file diff --git a/datacentral/usp_drug_classification.md b/datacentral/usp_drug_classification.md new file mode 100644 index 0000000..f7ea84a --- /dev/null +++ b/datacentral/usp_drug_classification.md @@ -0,0 +1,69 @@ +# USP Drug Classifications + +## Data files ([available at data.world](https://data.world/data4democracy/drug-spending)) +* Raw text: `br08302.keg` +* Tidy CSV: `usp_drug_classifications.csv` + +## Link(s) to code used for scraping, tidying, etc, if applicable: + +Data was directly downloaded from [KEGG](http://www.genome.jp/kegg-bin/get_htext?htext=br08302.keg), +no scraping needed. + +* `usp_drug_classifications_tidying_script.py` + +## Data types +* **string**: a sequence of characters + +## Field listing +|Name |Type |Description| +|---------|--------|-----------| +|usp_category |string |USP Category | +|usp_class |string |USP Class | +|usp_drug |string |The general drug (e.g. Naproxen, Ibuprofen, etc)| +|drug_example | string | The specific drug (e.g. Naproxen sodium, Ibuprofen arginine salt, etc)| +|kegg_id_drug |string |The KEGG identifier for the `usp_drug` (e.g. DG00245)| +|kegg_id_drug_example | string| The KEGG identifier for the `drug_example` (e.g. D01122)| +|nomenclature| string | (Unparsed) nomenclature description (e.g. '(JP17/USP/INN)')| + +## Important notes + +Frome the US Pharmacopeial Convention's [website](http://www.usp.org/usp-healthcare-professionals/usp-drug-classification-system): +the USP Drug Classification system (USP DC) is an independent drug classification system currently +under development by the USP Healthcare Quality Expert Committee. The USP DC is designed to address +stakeholder needs emerging from the extended use of the USP Medicare Model Guidelines (USP MMG) +beyond the Medicare Part D benefit. + +This system is essentially an expanded version of the MMG: it includes outpatient drugs as well as +the Part D eligible drugs in the MMG. + +The USP DC is intended to be complementary to the USP MMG and is developed with similar guiding principles, +taxonomy, and structure of the [USP Categories and Classes](http://www.usp.org/sites/default/files/usp_pdf/EN/healthcareProfessionals/2016_usp_mmg_guiding_principles.pdf). + +The raw data was downloaded from the KEGG website: http://www.genome.jp/kegg-bin/get_htext?htext=br08302.keg + +`br08302.keg` is a text file with the hierarchical USP drug classifications. Lines beginning with `A` are +USP Categories, subsequent lines beginning with `B` are USP Classes in that category, lines beginning +with `C` are the `drugs` (i.e. the general drug compound), and lines beginning with `D` are `example_drugs` +(i.e. the medication or formulation you would buy) of that drug. + +More specifically, a **USP Category** is the broadest classification which provides a high level formulary +structure designed to include all potential therapeutic agents for diseases and conditions. +A **USP Class** is a more granular classification, occurring within a specific USP Category in the USP +Drug Classifications, which provides for therapeutic or pharmacologic groupings of FDA approved medications, +consistent with current U.S. healthcare practices and standards of care. + +TBD whether this data includes medications covered by Part D Medicare or is complementary to that data. + +Note that the individual KEGG pages (e.g. [D00903](http://www.genome.jp/dbget-bin/www_bget?dr:D00903)) +for these drugs have a wealth of information, including product and generic names, chemical formula, +additional classes, ATC codes, biochemical information, other classifications, and links to the compound +in other databases (e.g. PubChem, DrugBank, etc). + +From what I understand, the **nomenclature** string indicates to which official nomenclature system +that name belongs to. For example, "a [British Approved Name (BAN)](https://en.wikipedia.org/wiki/British_Approved_Name) +is the official non-proprietary or generic name given to a pharmaceutical substance, as defined in the +British Pharmacopoeia (BP)" whereas "[United States Adopted Names](https://en.wikipedia.org/wiki/United_States_Adopted_Name) +are unique nonproprietary names assigned to pharmaceuticals marketed in the United States." + +I'm not sure of the best way to store this information (or how useful it will be), so for now these strings +remain unparsed. \ No newline at end of file diff --git a/datacentral/usp_drug_classification_tidying_script.py b/datacentral/usp_drug_classification_tidying_script.py new file mode 100644 index 0000000..6933827 --- /dev/null +++ b/datacentral/usp_drug_classification_tidying_script.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- +""" +Parse and tidy the USP Drug Classification data from KEGG +Raw data from http://www.genome.jp/kegg-bin/get_htext?htext=br08302.keg + +Created on Sun Feb 5 13:15:04 2017 + +@author: claire +""" + +import numpy as np +import pandas as pd + +if __name__ == "__main__": + + fname = 'br08302.keg' + with open(fname, 'r') as f: + all_lines = f.readlines() + + usp = [] + for line in all_lines: + if line.startswith('A'): + current_category = line.strip()[1:] + elif line.startswith('B'): + current_class = line[1:].strip() + elif line.startswith('C'): + current_drug = line[1:].split('[')[0].strip() + try: + current_drug_id = line[1:].split(':')[1].strip(']\n') + except: + current_drug_id = np.nan + elif line.startswith('D'): + line = line[1:].strip() + # The KEGG ID is the first 6 characters (after the 'D') + example_drug_id = line[0:6] + # The drug name is after the KEGG ID and before parentheses (if any) + example_drug_name = line[6:].strip().split('(')[0].strip() + if line.endswith(')'): + nomenclature = '(' + line.split('(')[-1] + else: + nomenclature = np.nan + usp.append([current_category, current_class, current_drug, + current_drug_id, example_drug_name, + example_drug_id, nomenclature]) + + uspdf = pd.DataFrame(usp, columns=['usp_category', 'usp_class', 'usp_drug', + 'kegg_id_drug', 'drug_example', + 'kegg_id_drug_example', 'nomenclature']) + uspdf.to_csv('usp_drug_classification.csv', index=False) \ No newline at end of file From b5f2cda4a2dad89a6e8066c9b18ae2d67e52e24a Mon Sep 17 00:00:00 2001 From: Matt Gawarecki Date: Mon, 6 Feb 2017 08:00:51 -0600 Subject: [PATCH 06/20] Added anchor for citations and superscripted refs --- objectives.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/objectives.md b/objectives.md index 08ff0d8..9eede3d 100644 --- a/objectives.md +++ b/objectives.md @@ -2,7 +2,7 @@ *This document is an overarching view of project goals and research questions. For an up-to-date list of specific to-do items and work in progress, see our [GitHub Issues](https://github.com/Data4Democracy/drug-spending/issues) or [weekly update](https://docs.google.com/document/d/1azJZBPo9438ZOc73Gq2_AWbciKXgwBXiJk5gUAwGA0c/edit).* -At its heart, this project seeks to gain a deeper understanding of where and how United States Medicare tax dollars are being spent. Healthcare is an increasingly important issue for many Americans; the Centers for Medicare and Medicaid Services estimate nearly 41 million Americans were enrolled in Medicare prescription drug coverage programs as of October 2016.^1^ +At its heart, this project seeks to gain a deeper understanding of where and how United States Medicare tax dollars are being spent. Healthcare is an increasingly important issue for many Americans; the Centers for Medicare and Medicaid Services estimate nearly 41 million Americans were enrolled in Medicare prescription drug coverage programs as of October 2016.[[1]](#citations) Because healthcare spending is a very real concern, we want to make it real - not just for people who like reading graphs and looking at statistics, but for everybody. We're harnessing the power of data and modern computing to find answers to the questions people keep asking, and to make those answers clear and easy to understand - questions like: @@ -18,7 +18,7 @@ In conducting this research, we hope to gain new insights and create a positive ### Goal 1: Understand how Medicare-related US taxpayer dollars are spent and how this program directly affects older Americans -Medicare is a huge expenditure for the federal government, paid for in part by US citizens’ taxes; in 2015, it accounted for 15% of the federal budget.^2^ We want to help the public understand what these funds are paying for and how this program affects our older generation (and, by extension, all Americans), specifically relating to prescription costs and claims. +Medicare is a huge expenditure for the federal government, paid for in part by US citizens’ taxes; in 2015, it accounted for 15% of the federal budget.[[2]](#citations) We want to help the public understand what these funds are paying for and how this program affects our older generation (and, by extension, all Americans), specifically relating to prescription costs and claims. We’ll answer questions like: @@ -64,7 +64,7 @@ Medicaid is another US government health program which provides health insurance Drug development is undeniably incredibly expensive; do the medications which took the most in R&D spending also cost the most to insurance companies/government programs/individuals? -## Citations +## Citations 1. Hoadley, Jack; Cubanski, Juliette; and Neuman, Tricia. “Medicare Part D in 2016 and Trends Over Time.” Kaiser Family Foundation, http://kff.org/report-section/medicare-part-d-in-2016-and-trends-over-time-section-1-part-d-enrollment-and-plan-availability/ . Accessed January 31, 2017. 2. Cubanski, Juliette, and Neuman, Tricia. “The Facts on Medicare Spending and Financing.” Kaiser Family Foundation, http://kff.org/medicare/issue-brief/the-facts-on-medicare-spending-and-financing/ . Accessed January 31, 2017. From 1cbf1e200d9dd7cb7fac7f55554990e9cab0b1de Mon Sep 17 00:00:00 2001 From: Stephanie Kirmer Date: Mon, 6 Feb 2017 11:55:57 -0600 Subject: [PATCH 07/20] Cleaning drug manufacturer data source: https://www.cms.gov/Medicare/Medicare-Fee-for-Service-Part-B-Drugs/McrPartBDrugAvgSalesPrice/2016ASPFiles.html --- .../drug_manufacturer_data_cleaning_2016.R | 48 +++++++ .../drug_manufacturer_data_cleaning_2017.R | 47 +++++++ manufacturers/drug_manufacturer_name_tidy.R | 124 ++++++++++++++++++ 3 files changed, 219 insertions(+) create mode 100644 manufacturers/drug_manufacturer_data_cleaning_2016.R create mode 100644 manufacturers/drug_manufacturer_data_cleaning_2017.R create mode 100644 manufacturers/drug_manufacturer_name_tidy.R diff --git a/manufacturers/drug_manufacturer_data_cleaning_2016.R b/manufacturers/drug_manufacturer_data_cleaning_2016.R new file mode 100644 index 0000000..40986b9 --- /dev/null +++ b/manufacturers/drug_manufacturer_data_cleaning_2016.R @@ -0,0 +1,48 @@ +# Cleaning January 2016 CMS drug name, manufacturer, and dosage data +# S. Kirmer +# Data4Democracy - Drug Spending Project +# January 2017 + +list1 <- read.csv("U://Medicaid_Drug/2016-January-ASP-NDC-HCPCS-Crosswalk/Section 508 version of Jan 2016 AWP NDC-HCPCS Crosswalk 120815.csv", skip = 7, stringsAsFactors=FALSE) +list2 <- read.csv("U://Medicaid_Drug/2016-January-ASP-NDC-HCPCS-Crosswalk/section 508 version of January 2016 ASP NDC-HCPCS Crosswalk 010716.csv", skip = 6, stringsAsFactors=FALSE) +list3 <- read.csv("U://Medicaid_Drug/2016-January-ASP-NDC-HCPCS-Crosswalk/section 508 version of January 2016 NOC NDC-HCPCS Crosswalk 120915.csv", skip = 6, stringsAsFactors=FALSE) +list4 <- read.csv("U://Medicaid_Drug/2016-January-ASP-NDC-HCPCS-Crosswalk/section 508 version of January 2016 OPPS NDC-HCPCS Crosswalk 120915.csv", skip = 6, stringsAsFactors=FALSE) + +list5 <- read.csv("U://Medicaid_Drug/2016-January-ASP-NDC-HCPCS-Crosswalk/section 508 version of NDC-HCPCS Crosswalk Introduction Text 120915.csv") + +colnames(list1) <- toupper(names(list1)) +colnames(list2) <- toupper(names(list2)) +colnames(list3) <- toupper(names(list3)) +colnames(list4) <- toupper(names(list4)) + +colnames(list2)[1] <- "HCPCS CODE" +colnames(list4)[1] <- "HCPCS CODE" +colnames(list1)[2] <- "SHORT DESCRIPTION" +colnames(list3)[5] <- "HCPCS DOSAGE" +colnames(list2)[4] <- "NDC" +colnames(list3)[3] <- "NDC" +colnames(list4)[4] <- "NDC" + +mergedlist <- merge(list1, list2, by=c("HCPCS CODE", "SHORT DESCRIPTION", "LABELER NAME","DRUG NAME", "NDC","HCPCS DOSAGE", "PKG SIZE","PKG QTY", + "BILLUNITS","BILLUNITSPKG"), all=T) + +mergedlist <- merge(mergedlist, list3, by.x=c("SHORT DESCRIPTION", "LABELER NAME","DRUG NAME","NDC", "HCPCS DOSAGE", "PKG SIZE","PKG QTY", + "BILLUNITS","BILLUNITSPKG"), + by.y=c("DRUG GENERIC NAME", "LABELER NAME","DRUG NAME", "NDC","HCPCS DOSAGE", "PKG SIZE","PKG QTY", + "BILLUNITS","BILLUNITSPKG"), all=T) +mergedlist <- merge(mergedlist, list4, by.x=c("HCPCS CODE","SHORT DESCRIPTION", "LABELER NAME","DRUG NAME","NDC", "HCPCS DOSAGE", "PKG SIZE","PKG QTY", + "BILLUNITS","BILLUNITSPKG"), + by.y=c("HCPCS CODE","SHORT DESCRIPTOR", "LABELER NAME","DRUG NAME", "NDC","HCPCS DOSAGE", "PKG SIZE","PKG QTY", + "BILLUNITS","BILLUNITSPKG"), all=T) + + +mergedlist$`HCPCS DOSAGE` <- gsub('MG', ' MG', mergedlist$`HCPCS DOSAGE`) +mergedlist$`HCPCS DOSAGE` <- gsub('mg', ' MG', mergedlist$`HCPCS DOSAGE`) + +mergedlist <- tidyr::separate(mergedlist, `HCPCS DOSAGE` ,c("DOSAGENUM", "DOSAGEUNITS"), " ", extra="merge", remove=FALSE) +mergedlist$DOSAGENUM <- as.numeric(mergedlist$DOSAGENUM) + +mergedlist <- mergedlist[,c(1,5,3, 4, 2, 6:12)] +mergedlist$ASOFDATE <- "01/01/2016" + +write.csv(mergedlist, "U://Medicaid_Drug/2016drugdata.csv") diff --git a/manufacturers/drug_manufacturer_data_cleaning_2017.R b/manufacturers/drug_manufacturer_data_cleaning_2017.R new file mode 100644 index 0000000..f89bcaa --- /dev/null +++ b/manufacturers/drug_manufacturer_data_cleaning_2017.R @@ -0,0 +1,47 @@ +# Cleaning January 2017 CMS drug name, manufacturer, and dosage data +# S. Kirmer +# Data4Democracy - Drug Spending Project +# January 2017 + + +list1 <- read.csv("U://Medicaid_Drug/January-2017-ASP-NDC-HCPCS-Crosswalk/Section 508 version of Jan 2017 AWP NDC-HCPCS Crosswalk_12062016.csv", skip = 7, stringsAsFactors=FALSE) +list2 <- read.csv("U://Medicaid_Drug/January-2017-ASP-NDC-HCPCS-Crosswalk/section 508 version of January 2017 ASP NDC-HCPCS Crosswalk 121316.csv", skip = 6, stringsAsFactors=FALSE) +list3 <- read.csv("U://Medicaid_Drug/January-2017-ASP-NDC-HCPCS-Crosswalk/section 508 version of January 2017 NOC NDC-HCPCS Crosswalk 120216.csv", skip = 6, stringsAsFactors=FALSE) +list4 <- read.csv("U://Medicaid_Drug/January-2017-ASP-NDC-HCPCS-Crosswalk/section 508 version of January 2017 OPPS NDC-HCPCS Crosswalk 120216.csv", skip = 6, stringsAsFactors=FALSE) + +colnames(list1) <- toupper(names(list1)) +colnames(list2) <- toupper(names(list2)) +colnames(list3) <- toupper(names(list3)) +colnames(list4) <- toupper(names(list4)) + +colnames(list2)[1] <- "HCPCS CODE" +colnames(list4)[1] <- "HCPCS CODE" +colnames(list1)[2] <- "SHORT DESCRIPTION" +colnames(list3)[5] <- "HCPCS DOSAGE" +colnames(list2)[4] <- "NDC" +colnames(list3)[3] <- "NDC" +colnames(list4)[4] <- "NDC" + +mergedlist <- merge(list1, list2, by=c("HCPCS CODE", "SHORT DESCRIPTION", "LABELER NAME","DRUG NAME", "NDC","HCPCS DOSAGE", "PKG SIZE","PKG QTY", + "BILLUNITS","BILLUNITSPKG"), all=T) + +mergedlist <- merge(mergedlist[,-11], list3, by.x=c("SHORT DESCRIPTION", "LABELER NAME","DRUG NAME","NDC", "HCPCS DOSAGE", "PKG SIZE","PKG QTY", + "BILLUNITS","BILLUNITSPKG"), + by.y=c("DRUG GENERIC NAME", "LABELER NAME","DRUG NAME", "NDC","HCPCS DOSAGE", "PKG SIZE","PKG QTY", + "BILLUNITS","BILLUNITSPKG"), all=T) +mergedlist <- merge(mergedlist, list4, by.x=c("HCPCS CODE","SHORT DESCRIPTION", "LABELER NAME","DRUG NAME","NDC", "HCPCS DOSAGE", "PKG SIZE","PKG QTY", + "BILLUNITS","BILLUNITSPKG"), + by.y=c("HCPCS CODE","SHORT DESCRIPTOR", "LABELER NAME","DRUG NAME", "NDC","HCPCS DOSAGE", "PKG SIZE","PKG QTY", + "BILLUNITS","BILLUNITSPKG"), all=T) + + +mergedlist$`HCPCS DOSAGE` <- gsub('MG', ' MG', mergedlist$`HCPCS DOSAGE`) +mergedlist$`HCPCS DOSAGE` <- gsub('mg', ' MG', mergedlist$`HCPCS DOSAGE`) + +mergedlist <- tidyr::separate(mergedlist, `HCPCS DOSAGE` ,c("DOSAGENUM", "DOSAGEUNITS"), " ", extra="merge", remove=FALSE) +mergedlist$DOSAGENUM <- as.numeric(mergedlist$DOSAGENUM) + +mergedlist <- mergedlist[,c(1,5,3, 4, 2, 6:12)] +mergedlist$ASOFDATE <- "01/01/2017" + +write.csv(mergedlist, "U://Medicaid_Drug/2017drugdata.csv") diff --git a/manufacturers/drug_manufacturer_name_tidy.R b/manufacturers/drug_manufacturer_name_tidy.R new file mode 100644 index 0000000..ead26f7 --- /dev/null +++ b/manufacturers/drug_manufacturer_name_tidy.R @@ -0,0 +1,124 @@ +# Cleaning January 2017 CMS drug name, manufacturer, and dosage data +# S. Kirmer +# Data4Democracy - Drug Spending Project +# January 2017 + +# Script follows the drug_manufacturer_data_cleaning scripts. + +drugs_2017 <- read.csv("U://Medicaid_Drug/2017drugdata.csv", stringsAsFactors = FALSE) +drugs_2016 <- read.csv("U://Medicaid_Drug/2016drugdata.csv", stringsAsFactors = FALSE) + +drugs <- rbind(drugs_2017, drugs_2016) + +drugs$LABELER.NAME <- toupper(drugs$LABELER.NAME) + +drugs$LABELER.NAME <- ifelse(grepl("abbvie",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "ABBVIE US, LLC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("ACCORD",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "ACCORD HEALTHCARE INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("ACTAVIS",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "ACTAVIS INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("AKORN",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "AKORN", drugs$LABELER.NAME) + +drugs$LABELER.NAME <- ifelse(grepl("AMGEN",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "AMGEN USA, INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("AMNEAL",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "AMNEAL PHARMACEUTICALS, LLC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("AMPHASTAR",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "AMPHASTAR PHARMACEUTICALS, INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("ASTRAZENECA",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "ASTRAZENECA PHARMACEUTICALS", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("BAUSCH & LOMB",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "BAUSCH & LOMB", drugs$LABELER.NAME) + +drugs$LABELER.NAME <- ifelse(grepl("ASTRAZENECA",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "ASTRAZENECA PHARMACEUTICALS", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("ASTRAZENECA",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "ASTRAZENECA PHARMACEUTICALS", drugs$LABELER.NAME) + +drugs$LABELER.NAME <- ifelse(grepl("BAXALTA",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "BAXALTA US INC.", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("BAXTER",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "BAXTER HEALTHCARE CORPORATION", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("BAYER",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "BAYER HEALTHCARE PHARMACEUTICALS", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("BIOCSL",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "BIOCSL INC", drugs$LABELER.NAME) + +drugs$LABELER.NAME <- ifelse(grepl("BIOGEN",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "BIOGEN IDEC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("BLUEPOINT",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "BLUE POINT LABORATORIES", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("BRACCO",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "BRACCO DIAGNOSTICS", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("BRISTOL-MYERS",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "BRISTOL-MYERS SQUIBB COMPANY", drugs$LABELER.NAME) + +drugs$LABELER.NAME <- ifelse(grepl("CANGENE",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "CANGENE BIOPHARMA, INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("CEPHALON",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "CEPHALON INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("CHIESI",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "CHIESI USA, INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("COVIS PHARMACEUTICALS",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "COVIS PHARMACEUTICALS", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("CREALTA",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "CREALTA PHARMACEUTICALS", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("CSL BEHRING",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "CSL BEHRING LLC", drugs$LABELER.NAME) + +drugs$LABELER.NAME <- ifelse(grepl("REDDY'S",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "DR. REDDY'S LABORATORIES, INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("DURATA",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "DURATA PHARMACEUTICALS", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("DYAX",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "DYAX CORPORATION", drugs$LABELER.NAME) + +drugs$LABELER.NAME <- ifelse(grepl("ENDO",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "ENDO PHARMACEUTICALS VALERA INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("FERRING",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "FERRING PHARMACEUTICALS INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("FRESENIUS",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "FRESENIUS KABI USA LLC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("GENZYME",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "GENZYME CORPORATION", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("GREENSTONE",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "GREENSTONE LLC", drugs$LABELER.NAME) + +drugs$LABELER.NAME <- ifelse(grepl("GRIFOLS",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "GRIFOLS USA, LLC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("HALOZYME",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "HALOZYME THERAPEUTICS", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("HERITAGE",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "HERITAGE PHARMACEUTICALS", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("HI-TECH",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "HI-TECH PHARMACEUTICAL CO, INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("IPSEN",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "IPSEN BIOPHARMACEUTICALS", drugs$LABELER.NAME) + +drugs$LABELER.NAME <- ifelse(grepl("JANSSEN",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "JANSSEN PHARMACEUTICALS, INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("JHP",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "JHP PHARMACEUTICALS", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("KEDRION",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "KEDRION BIOPHARMA, INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("KINETIC",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "KINETIC CONCEPTS INCORPORATED", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("LANTHEUS",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "LANTHEUS MEDICAL IMAGING", drugs$LABELER.NAME) + +drugs$LABELER.NAME <- ifelse(grepl("MEDICIS",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "MEDICIS PHARMACEUTICALS, INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("MERCK",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "MERCK", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("MERZ",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "MERZ PHARMACEUTICALS, LLC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("MYLAN",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "MYLAN PHARMACEUTICALS, INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("NOVARTIS",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "NOVARTIS", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("NOVO NORDISK",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "NOVO NORDISK, INC", drugs$LABELER.NAME) + +drugs$LABELER.NAME <- ifelse(grepl("OMEROS",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "OMEROS CORPORATION", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("PAR ",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "PAR PHARMACEUTICAL", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("PERRIGO",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "PERRIGO PHARMACEUTICALS", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("PFIZER",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "PFIZER INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("RITEDOSE",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "RITEDOSE PHARMACEUTICALS", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("ROXANE",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "ROXANE LABORATORIES", drugs$LABELER.NAME) + +drugs$LABELER.NAME <- ifelse(grepl("SAGENT",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "SAGENT PHARMACEUTICALS INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("SANDOZ",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "SANDOZ, INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("SANOFI",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "SANOFI-AVENTIS", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("SCHERING",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "SCHERING CORPORATION", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("SHIRE",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "SHIRE US, INC", drugs$LABELER.NAME) + +drugs$LABELER.NAME <- ifelse(grepl("SICOR",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "SICOR PHARMACEUTICALS, INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("STRIDES",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "STRIDES PHARMA INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("SUN PHARMACEUTICAL",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "SUN PHARMACEUTICAL INDUSTRIES, LTD", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("TARO",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "TARO PHARMACEUTICALS", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("THERAVANCE",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "THERAVANCE BIOPHARMA, INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("TEVA",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "TEVA PHARMACEUTICALS USA, INC", drugs$LABELER.NAME) + +drugs$LABELER.NAME <- ifelse(grepl("UNITED THERAPEUTICS",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "UNITED THERAPEUTICS CORPORATION", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("TOLMAR",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "TOLMAR PHARMACEUTICALS, INC", drugs$LABELER.NAME) + +drugs$LABELER.NAME <- ifelse(grepl("WATSON",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "WATSON PHARMACEUTICALS", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("WG CRITICAL",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "WG CRITICAL CARE LLC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("WYETH",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "WYETH PHARMACEUTICAL", drugs$LABELER.NAME) + +drugs$LABELER.NAME <- ifelse(grepl("WEST-WARD",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "WEST-WARD PHARMACEUTICALS CORP", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("X-GEN",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "X-GEN PHARMACEUTICALS, INC", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("ZYDUS",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "ZYDUS PHARMACEUTICALS", drugs$LABELER.NAME) +drugs$LABELER.NAME <- ifelse(grepl("ZIMMER",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE, "ZIMMER BIOMET, INC/SEIKAGAKU CORP", drugs$LABELER.NAME) + +# abbvie <- drugs[grepl("X-GEN",drugs$LABELER.NAME, ignore.case = TRUE) == TRUE,] + +drugs <- unique(drugs) + +write.csv(drugs[,c(2:14)], "U://Medicaid_Drug/drugdata_clean.csv") + + + + + + + + + + + + + From c6e4f2b92cf7629adcd29a596949d6656e4e64f9 Mon Sep 17 00:00:00 2001 From: Claire Duvallet Date: Mon, 6 Feb 2017 20:29:27 -0500 Subject: [PATCH 08/20] move USP Drug Classification to --- data/README.md | 16 ++++++++++++++++ {datacentral => data}/usp_drug_classification.md | 0 .../usp_drug_classification_tidying_script.py | 0 3 files changed, 16 insertions(+) rename {datacentral => data}/usp_drug_classification.md (100%) rename {datacentral => data}/usp_drug_classification_tidying_script.py (100%) diff --git a/data/README.md b/data/README.md index 29fc4b0..62b750d 100644 --- a/data/README.md +++ b/data/README.md @@ -122,3 +122,19 @@ Link to full data dictionary [in progress] OpenSecrets has data on lobbying transactions from pharmaceutical companies and their subsidiaries, totaled by year. Link to full data dictionary [in progress] + +--- + +#### 8. USP Drug Classification -- *waiting for access to data.world to upload raw and tidy* + +###### Formats: text, CSV +###### Original Source: [KEGG](http://www.genome.jp/kegg-bin/get_htext?htext=br08302.keg) + +The US Pharmacopeial Convention Drug Classification system. Contains category and class information on outpatient +drugs available in the US market. TBD if data also contains information on Part D eligible +drugs only, though it seems like it likely doesn't: "The USP DC is intended to be complementary to +the [USP MMG](http://www.usp.org/usp-healthcare-professionals/usp-medicare-model-guidelines) and +is developed with similar guiding principles, taxonomy, and structure of the USP Categories and Classes." + +Link to full data dictionary: [usp_drug_classification.md](https://github.com/Data4Democracy/drug-spending/blob/data-dictionaries/data/usp_drug_classification\ +.md) diff --git a/datacentral/usp_drug_classification.md b/data/usp_drug_classification.md similarity index 100% rename from datacentral/usp_drug_classification.md rename to data/usp_drug_classification.md diff --git a/datacentral/usp_drug_classification_tidying_script.py b/data/usp_drug_classification_tidying_script.py similarity index 100% rename from datacentral/usp_drug_classification_tidying_script.py rename to data/usp_drug_classification_tidying_script.py From dcd95fa3ba8f5e91850fddda8e296a76f63fa493 Mon Sep 17 00:00:00 2001 From: Claire Duvallet Date: Mon, 6 Feb 2017 20:42:17 -0500 Subject: [PATCH 09/20] clarify usp drug classification data dict info --- data/usp_drug_classification.md | 37 ++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/data/usp_drug_classification.md b/data/usp_drug_classification.md index f7ea84a..66ab5a4 100644 --- a/data/usp_drug_classification.md +++ b/data/usp_drug_classification.md @@ -9,7 +9,7 @@ Data was directly downloaded from [KEGG](http://www.genome.jp/kegg-bin/get_htext?htext=br08302.keg), no scraping needed. -* `usp_drug_classifications_tidying_script.py` +* `usp_drug_classification_tidying_script.py` ## Data types * **string**: a sequence of characters @@ -23,22 +23,22 @@ no scraping needed. |drug_example | string | The specific drug (e.g. Naproxen sodium, Ibuprofen arginine salt, etc)| |kegg_id_drug |string |The KEGG identifier for the `usp_drug` (e.g. DG00245)| |kegg_id_drug_example | string| The KEGG identifier for the `drug_example` (e.g. D01122)| -|nomenclature| string | (Unparsed) nomenclature description (e.g. '(JP17/USP/INN)')| +|nomenclature| string | (Unparsed) nomenclature description (e.g. `'(JP17/USP/INN)'`)| ## Important notes -Frome the US Pharmacopeial Convention's [website](http://www.usp.org/usp-healthcare-professionals/usp-drug-classification-system): +### Background +From the US Pharmacopeial Convention's [website](http://www.usp.org/usp-healthcare-professionals/usp-drug-classification-system): the USP Drug Classification system (USP DC) is an independent drug classification system currently under development by the USP Healthcare Quality Expert Committee. The USP DC is designed to address stakeholder needs emerging from the extended use of the USP Medicare Model Guidelines (USP MMG) beyond the Medicare Part D benefit. -This system is essentially an expanded version of the MMG: it includes outpatient drugs as well as -the Part D eligible drugs in the MMG. - The USP DC is intended to be complementary to the USP MMG and is developed with similar guiding principles, taxonomy, and structure of the [USP Categories and Classes](http://www.usp.org/sites/default/files/usp_pdf/EN/healthcareProfessionals/2016_usp_mmg_guiding_principles.pdf). +### Raw data + The raw data was downloaded from the KEGG website: http://www.genome.jp/kegg-bin/get_htext?htext=br08302.keg `br08302.keg` is a text file with the hierarchical USP drug classifications. Lines beginning with `A` are @@ -46,19 +46,16 @@ USP Categories, subsequent lines beginning with `B` are USP Classes in that cate with `C` are the `drugs` (i.e. the general drug compound), and lines beginning with `D` are `example_drugs` (i.e. the medication or formulation you would buy) of that drug. -More specifically, a **USP Category** is the broadest classification which provides a high level formulary +### Interpreting the fields + +According to the [guidelines](http://www.usp.org/sites/default/files/usp_pdf/EN/healthcareProfessionals/2016_usp_mmg_guiding_pri\ +nciples.pdf), +a **USP Category** is the broadest classification which provides a high level formulary structure designed to include all potential therapeutic agents for diseases and conditions. A **USP Class** is a more granular classification, occurring within a specific USP Category in the USP Drug Classifications, which provides for therapeutic or pharmacologic groupings of FDA approved medications, consistent with current U.S. healthcare practices and standards of care. -TBD whether this data includes medications covered by Part D Medicare or is complementary to that data. - -Note that the individual KEGG pages (e.g. [D00903](http://www.genome.jp/dbget-bin/www_bget?dr:D00903)) -for these drugs have a wealth of information, including product and generic names, chemical formula, -additional classes, ATC codes, biochemical information, other classifications, and links to the compound -in other databases (e.g. PubChem, DrugBank, etc). - From what I understand, the **nomenclature** string indicates to which official nomenclature system that name belongs to. For example, "a [British Approved Name (BAN)](https://en.wikipedia.org/wiki/British_Approved_Name) is the official non-proprietary or generic name given to a pharmaceutical substance, as defined in the @@ -66,4 +63,14 @@ British Pharmacopoeia (BP)" whereas "[United States Adopted Names](https://en.wi are unique nonproprietary names assigned to pharmaceuticals marketed in the United States." I'm not sure of the best way to store this information (or how useful it will be), so for now these strings -remain unparsed. \ No newline at end of file +remain unparsed. + +### Other notes + +*TBD whether this data includes medications covered by Part D Medicare or if it only complementary to that data.* + +Note that the individual KEGG pages (e.g. [D00903](http://www.genome.jp/dbget-bin/www_bget?dr:D00903)) +for these drugs have a wealth of information, including product and generic names, chemical formula, +additional classes, ATC codes, biochemical information, other classifications, and links to the compound +in other databases (e.g. PubChem, DrugBank, etc). + From 53563a486d7253dee59292a50cf353f853ebc81b Mon Sep 17 00:00:00 2001 From: Claire Duvallet Date: Mon, 6 Feb 2017 20:43:43 -0500 Subject: [PATCH 10/20] small changes --- data/usp_drug_classification.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/usp_drug_classification.md b/data/usp_drug_classification.md index 66ab5a4..2b55efc 100644 --- a/data/usp_drug_classification.md +++ b/data/usp_drug_classification.md @@ -62,14 +62,14 @@ is the official non-proprietary or generic name given to a pharmaceutical substa British Pharmacopoeia (BP)" whereas "[United States Adopted Names](https://en.wikipedia.org/wiki/United_States_Adopted_Name) are unique nonproprietary names assigned to pharmaceuticals marketed in the United States." -I'm not sure of the best way to store this information (or how useful it will be), so for now these strings -remain unparsed. +I'm not sure of the best way to store this information (or how useful it will be), so for now the +nomunclature strings are in the tidy data unparsed. ### Other notes -*TBD whether this data includes medications covered by Part D Medicare or if it only complementary to that data.* +- *TBD whether this data includes medications covered by Part D Medicare or if it is only complementary to that data.* -Note that the individual KEGG pages (e.g. [D00903](http://www.genome.jp/dbget-bin/www_bget?dr:D00903)) +- Note that the individual KEGG pages (e.g. [D00903](http://www.genome.jp/dbget-bin/www_bget?dr:D00903)) for these drugs have a wealth of information, including product and generic names, chemical formula, additional classes, ATC codes, biochemical information, other classifications, and links to the compound in other databases (e.g. PubChem, DrugBank, etc). From dc023fdd16130af94b78686ed1c949597827b6ab Mon Sep 17 00:00:00 2001 From: Claire Duvallet Date: Mon, 6 Feb 2017 20:48:34 -0500 Subject: [PATCH 11/20] update links --- data/README.md | 7 +++---- ...sification.md => usp_drug_classification_dictionary.md} | 0 2 files changed, 3 insertions(+), 4 deletions(-) rename data/{usp_drug_classification.md => usp_drug_classification_dictionary.md} (100%) diff --git a/data/README.md b/data/README.md index 62b750d..fc06b8b 100644 --- a/data/README.md +++ b/data/README.md @@ -125,10 +125,10 @@ Link to full data dictionary [in progress] --- -#### 8. USP Drug Classification -- *waiting for access to data.world to upload raw and tidy* +#### 8. [USP Drug Classification](https://data.world/data4democracy/drug-spending/query/?query=--+usp_drug_classification.csv%2Fusp_drug_classification+%28usp_drug_classification.csv%29%0ASELECT+%2A+FROM+%60usp_drug_classification.csv%2Fusp_drug_classification%60) ###### Formats: text, CSV -###### Original Source: [KEGG](http://www.genome.jp/kegg-bin/get_htext?htext=br08302.keg) +###### Original Source: [KEGG](http://www.genome.jp/kegg-bin/get_htext?htext=br08302.keg) ("USP drug classification" in the drop-down menu) The US Pharmacopeial Convention Drug Classification system. Contains category and class information on outpatient drugs available in the US market. TBD if data also contains information on Part D eligible @@ -136,5 +136,4 @@ drugs only, though it seems like it likely doesn't: "The USP DC is intended to b the [USP MMG](http://www.usp.org/usp-healthcare-professionals/usp-medicare-model-guidelines) and is developed with similar guiding principles, taxonomy, and structure of the USP Categories and Classes." -Link to full data dictionary: [usp_drug_classification.md](https://github.com/Data4Democracy/drug-spending/blob/data-dictionaries/data/usp_drug_classification\ -.md) +Link to full data dictionary: [usp_drug_classification_dictionary.md](usp_drug_classification_dictionary.md) diff --git a/data/usp_drug_classification.md b/data/usp_drug_classification_dictionary.md similarity index 100% rename from data/usp_drug_classification.md rename to data/usp_drug_classification_dictionary.md From 8fc78cf5d89439624eeb1253c3e852025b1a415f Mon Sep 17 00:00:00 2001 From: Claire Duvallet Date: Mon, 6 Feb 2017 20:50:59 -0500 Subject: [PATCH 12/20] small changes --- data/usp_drug_classification_dictionary.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/data/usp_drug_classification_dictionary.md b/data/usp_drug_classification_dictionary.md index 2b55efc..832b5c3 100644 --- a/data/usp_drug_classification_dictionary.md +++ b/data/usp_drug_classification_dictionary.md @@ -2,14 +2,14 @@ ## Data files ([available at data.world](https://data.world/data4democracy/drug-spending)) * Raw text: `br08302.keg` -* Tidy CSV: `usp_drug_classifications.csv` +* Tidy CSV: `usp_drug_classification.csv` ## Link(s) to code used for scraping, tidying, etc, if applicable: Data was directly downloaded from [KEGG](http://www.genome.jp/kegg-bin/get_htext?htext=br08302.keg), -no scraping needed. +(click on `Download htext` in the upper left-hand corner) no scraping needed. -* `usp_drug_classification_tidying_script.py` +* Tidying script: `usp_drug_classification_tidying_script.py` ## Data types * **string**: a sequence of characters From 8a15e47c553e10eca79761dc3e1eeb9f9c38b156 Mon Sep 17 00:00:00 2001 From: Claire Duvallet Date: Tue, 7 Feb 2017 21:57:10 -0500 Subject: [PATCH 13/20] download from data.world, clean up functions, add comments --- .../usp_drug_classification_tidying_script.py | 62 +++++++++++++++++-- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/data/usp_drug_classification_tidying_script.py b/data/usp_drug_classification_tidying_script.py index 6933827..2548b65 100644 --- a/data/usp_drug_classification_tidying_script.py +++ b/data/usp_drug_classification_tidying_script.py @@ -8,23 +8,57 @@ @author: claire """ +import requests # download data from data.world +import os # check that file exists +import numpy as np, pandas as pd # data tidying -import numpy as np -import pandas as pd +def download_from_url(url, out_file): + """ Download the raw USP Drug Classification data from data.world """ + + resp = requests.get(url) + resp.raise_for_status() + + with open(out_file, 'wb') as f: + for block in resp.iter_content(1024): + f.write(block) + + return None + +def tidy_usp_dc_from_kegg(fname, fout): + """ + Read the raw USP Drug Classification file, parse and tidy + the data into a dataframe, and write tidy data to file. + + Parameters + ---------- + fname : string + Raw data file name, i.e. br08302.keg + + fout : string + File to write tidy data to, i.e. usp_drug_classification.csv + """ + + # Check that the raw data exists. + assert(os.path.isfile(fname)) -if __name__ == "__main__": - - fname = 'br08302.keg' with open(fname, 'r') as f: all_lines = f.readlines() usp = [] for line in all_lines: + # Data is hierarchically structured: a USP_Category comes first on a + # line that starts with 'A'. All subsequent non-'A' lines belong to that + # category. if line.startswith('A'): current_category = line.strip()[1:] + # Lines with USP Classes start with 'B'. All subsequent non-'B' lines + # belong to that class. elif line.startswith('B'): current_class = line[1:].strip() elif line.startswith('C'): + # Sometimes the drug has a KEGG ID after it, like + # "C [DG:DG12345]". But drugs sometimes have spaces + # in them, so we can't just split on white space. current_drug = line[1:].split('[')[0].strip() try: current_drug_id = line[1:].split(':')[1].strip(']\n') @@ -36,10 +70,12 @@ example_drug_id = line[0:6] # The drug name is after the KEGG ID and before parentheses (if any) example_drug_name = line[6:].strip().split('(')[0].strip() + # Some drug names are followed by the nomenclature, in parentheses if line.endswith(')'): nomenclature = '(' + line.split('(')[-1] else: nomenclature = np.nan + # Add each drug example to our tidy data usp.append([current_category, current_class, current_drug, current_drug_id, example_drug_name, example_drug_id, nomenclature]) @@ -47,4 +83,18 @@ uspdf = pd.DataFrame(usp, columns=['usp_category', 'usp_class', 'usp_drug', 'kegg_id_drug', 'drug_example', 'kegg_id_drug_example', 'nomenclature']) - uspdf.to_csv('usp_drug_classification.csv', index=False) \ No newline at end of file + uspdf.to_csv('usp_drug_classification.csv', index=False) + + return None + +if __name__ == "__main__": + # data.world download link for br08302.keg + url = 'https://query.data.world/s/5jd8dr323erk97yhr2zrr5coe' + keg_file = 'br08302.keg' + csv_file = 'usp_drug_classification.csv' + + # Download the data from data.world + download_from_url(url, keg_file) + + # Read and tidy the data + tidy_usp_dc_from_kegg(keg_file, csv_file) From 468a753634dbfc2b00e0112d17579c48ccb75eed Mon Sep 17 00:00:00 2001 From: Selah Lynch Date: Wed, 8 Feb 2017 11:45:10 -0500 Subject: [PATCH 14/20] added direct link to the datasets of interest --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 4b18bcb..4f845d8 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,9 @@ To download the code and data inside this repository, you'll need [Git](https:// * **Source code and notebooks**: For now, you'll find these in the repository's root directory. This will probably change in the future as we accumulate more files. * **Data files**: All data files are located in the `/data` directory. At the moment, there is no further hierarchy beyond this; again, as we accumulate more data, this is likely to change. +### Core data sets +https://data.world/data4democracy/drug-spending + ### Performing data analysis There are many ways to analyze the data in this repository, but "notebook" formats like [Jupyter](http://jupyter.org/install.html) and [R Markdown](http://rmarkdown.rstudio.com/r_notebooks.html) are the most common. The setup process for these tools is in-depth enough to be outside the scope of this README, so please refer to documentation at the aforementioned links if necessary. If something isn't working quite right for you, that's okay! Continue reading to see how you can reach out for assistance. From 57124351333d854f84797a50d08470741e4f1e16 Mon Sep 17 00:00:00 2001 From: Jennifer Thompson Date: Thu, 9 Feb 2017 07:56:49 -0600 Subject: [PATCH 15/20] Restructuring of repo (#36) * Reorganization FTW * Reorganization FTW, part 2 * Add .gitignore * Add READMEs to each subdirectory. Rename data dictionary template (now TEMPLATE) and remove suffix from manufacturer_datadict.md. * Add link to data.world Python client * Update main README to reflect new file structure * Fix link to datadictionaries * Really fix it this time * Fix the other datadictionaries links to overview and template * More streamlining and edits to README --- .gitignore | 1 + R/README.md | 10 + R/analysis-vis/README.md | 5 + .../analysis-vis/explore_drugspending.Rmd | 36 +- .../analysis-vis/explore_drugspending.md | 0 .../analysis-vis/explore_drugspending.nb.html | 0 .../plot_aripiprazole-1.png | Bin R/apps/README.md | 5 + .../shiny_medicared_draft}/combine-data.r | 0 .../apps/shiny_medicared_draft}/global.r | 0 .../shinyapps.io/burrbank/R-shiny.dcf | 0 .../apps/shiny_medicared_draft}/server.R | 0 .../testing-top100-byuser.feather | Bin .../apps/shiny_medicared_draft}/ui.R | 0 .../apps/shinydashboard-medicared}/.Rhistory | 336 +-- .../shinydashboard-medicared}/combine_data.R | 0 .../apps/shinydashboard-medicared}/global.R | 0 .../shinydashboard-medicared.dcf | 10 + .../apps/shinydashboard-medicared}/server.R | 0 .../testing-random-overall.feather | Bin 0 -> 41848 bytes .../testing-random.feather | Bin 0 -> 116128 bytes .../testing-top100-byuser-overall.feather | Bin .../testing-top100-byuser.feather | Bin .../apps/shinydashboard-medicared}/ui.R | 0 R/d4ddrugspending/README.md | 5 + .../datawrangling}/Pharma_Lobby.R | 0 .../datawrangling}/Pharma_Lobby.csv | 0 R/datawrangling/README.md | 5 + .../datawrangling}/data_definitons.csv | 0 .../drug_manufacturer_data_cleaning_2016.R | 0 .../drug_manufacturer_data_cleaning_2017.R | 0 .../drug_manufacturer_name_tidy.R | 0 .../datawrangling}/part_b_spend_clean.csv | 0 .../datawrangling}/part_b_spend_clean.r | 0 README.md | 33 +- cms/druguse_definitions.ipynb | 1484 ----------- cms/part-d_clean_and_separate_data.ipynb | 309 --- cms/part-d_exploration_tutorial.ipynb | 2310 ----------------- datacentral/README.html | 257 -- datacentral/README.md | 115 - {data => datadictionaries}/README.md | 4 +- .../TEMPLATE.md | 0 .../manufacturer.md | 0 .../part-d_spending_2011.md | 0 .../part-d_spending_2012.md | 0 .../part-d_spending_2013.md | 0 .../part-d_spending_2014.md | 0 .../part-d_spending_2015.md | 0 docs/README.md | 4 + objectives.md => docs/objectives.md | 0 part_b_spend_clean/.gitignore | 38 - part_b_spend_clean/data/.gitignore | 38 - part_b_spend_clean/part_b_spend_clean.Rproj | 13 - python/README.md | 11 + python/analysis-vis/README.md | 5 + python/apps/README.md | 5 + python/d4ddrugspending/README.md | 5 + .../centerwatch}/drug_spend/__init__.py | 0 .../centerwatch}/drug_spend/items.py | 0 .../centerwatch}/drug_spend/middlewares.py | 0 .../centerwatch}/drug_spend/pipelines.py | 0 .../centerwatch}/drug_spend/settings.py | 0 .../drug_spend/spiders/__init__.py | 0 .../drug_spend/spiders/centerwatch_spider.py | 0 .../centerwatch/requirements.txt | 0 .../d4ddrugspending/centerwatch}/scrapy.cfg | 0 .../d4ddrugspending}/read_data.py | 0 python/datawrangling/README.md | 5 + .../datawrangling/parse_atc_codes.py | 0 python/notebooks/README.md | 5 + .../testing-random-overall.feather | Bin 40864 -> 0 bytes .../testing-random.feather | Bin 88216 -> 0 bytes 72 files changed, 322 insertions(+), 4732 deletions(-) create mode 100644 R/README.md create mode 100644 R/analysis-vis/README.md rename explore_drugspending.Rmd => R/analysis-vis/explore_drugspending.Rmd (85%) rename explore_drugspending.md => R/analysis-vis/explore_drugspending.md (100%) rename explore_drugspending.nb.html => R/analysis-vis/explore_drugspending.nb.html (100%) rename {explore_drugspending_files => R/analysis-vis/explore_drugspending_files}/figure-markdown_github/plot_aripiprazole-1.png (100%) create mode 100644 R/apps/README.md rename {R-shiny => R/apps/shiny_medicared_draft}/combine-data.r (100%) rename {R-shiny => R/apps/shiny_medicared_draft}/global.r (100%) rename {R-shiny => R/apps/shiny_medicared_draft}/rsconnect/shinyapps.io/burrbank/R-shiny.dcf (100%) rename {R-shiny => R/apps/shiny_medicared_draft}/server.R (100%) rename {R-shiny => R/apps/shiny_medicared_draft}/testing-top100-byuser.feather (100%) rename {R-shiny => R/apps/shiny_medicared_draft}/ui.R (100%) rename {shinydashboard-medicared => R/apps/shinydashboard-medicared}/.Rhistory (67%) rename {shinydashboard-medicared => R/apps/shinydashboard-medicared}/combine_data.R (100%) rename {shinydashboard-medicared => R/apps/shinydashboard-medicared}/global.R (100%) create mode 100644 R/apps/shinydashboard-medicared/rsconnect/shinyapps.io/jenniferthompson/shinydashboard-medicared.dcf rename {shinydashboard-medicared => R/apps/shinydashboard-medicared}/server.R (100%) create mode 100644 R/apps/shinydashboard-medicared/testing-random-overall.feather create mode 100644 R/apps/shinydashboard-medicared/testing-random.feather rename {shinydashboard-medicared => R/apps/shinydashboard-medicared}/testing-top100-byuser-overall.feather (100%) rename {shinydashboard-medicared => R/apps/shinydashboard-medicared}/testing-top100-byuser.feather (100%) rename {shinydashboard-medicared => R/apps/shinydashboard-medicared}/ui.R (100%) create mode 100644 R/d4ddrugspending/README.md rename {Lobbying Data => R/datawrangling}/Pharma_Lobby.R (100%) rename {Lobbying Data => R/datawrangling}/Pharma_Lobby.csv (100%) create mode 100644 R/datawrangling/README.md rename {part_b_spend_clean/output => R/datawrangling}/data_definitons.csv (100%) rename {manufacturers => R/datawrangling/manufacturers}/drug_manufacturer_data_cleaning_2016.R (100%) rename {manufacturers => R/datawrangling/manufacturers}/drug_manufacturer_data_cleaning_2017.R (100%) rename {manufacturers => R/datawrangling/manufacturers}/drug_manufacturer_name_tidy.R (100%) rename {part_b_spend_clean/output => R/datawrangling}/part_b_spend_clean.csv (100%) rename {part_b_spend_clean/R => R/datawrangling}/part_b_spend_clean.r (100%) delete mode 100644 cms/druguse_definitions.ipynb delete mode 100644 cms/part-d_clean_and_separate_data.ipynb delete mode 100644 cms/part-d_exploration_tutorial.ipynb delete mode 100644 datacentral/README.html delete mode 100644 datacentral/README.md rename {data => datadictionaries}/README.md (95%) rename data/data_dictionary_template.md => datadictionaries/TEMPLATE.md (100%) rename data/manufacturer_datadict.md => datadictionaries/manufacturer.md (100%) rename {data => datadictionaries}/part-d_spending_2011.md (100%) rename {data => datadictionaries}/part-d_spending_2012.md (100%) rename {data => datadictionaries}/part-d_spending_2013.md (100%) rename {data => datadictionaries}/part-d_spending_2014.md (100%) rename {data => datadictionaries}/part-d_spending_2015.md (100%) create mode 100644 docs/README.md rename objectives.md => docs/objectives.md (100%) delete mode 100644 part_b_spend_clean/.gitignore delete mode 100644 part_b_spend_clean/data/.gitignore delete mode 100644 part_b_spend_clean/part_b_spend_clean.Rproj create mode 100644 python/README.md create mode 100644 python/analysis-vis/README.md create mode 100644 python/apps/README.md create mode 100644 python/d4ddrugspending/README.md rename {centerwatch => python/d4ddrugspending/centerwatch}/drug_spend/__init__.py (100%) rename {centerwatch => python/d4ddrugspending/centerwatch}/drug_spend/items.py (100%) rename {centerwatch => python/d4ddrugspending/centerwatch}/drug_spend/middlewares.py (100%) rename {centerwatch => python/d4ddrugspending/centerwatch}/drug_spend/pipelines.py (100%) rename {centerwatch => python/d4ddrugspending/centerwatch}/drug_spend/settings.py (100%) rename {centerwatch => python/d4ddrugspending/centerwatch}/drug_spend/spiders/__init__.py (100%) rename {centerwatch => python/d4ddrugspending/centerwatch}/drug_spend/spiders/centerwatch_spider.py (100%) rename requirements.txt => python/d4ddrugspending/centerwatch/requirements.txt (100%) rename {centerwatch => python/d4ddrugspending/centerwatch}/scrapy.cfg (100%) rename {scripts => python/d4ddrugspending}/read_data.py (100%) create mode 100644 python/datawrangling/README.md rename parse_atc_codes.py => python/datawrangling/parse_atc_codes.py (100%) create mode 100644 python/notebooks/README.md delete mode 100644 shinydashboard-medicared/testing-random-overall.feather delete mode 100644 shinydashboard-medicared/testing-random.feather diff --git a/.gitignore b/.gitignore index e73acf6..5a672c5 100644 --- a/.gitignore +++ b/.gitignore @@ -97,3 +97,4 @@ ENV/ # Mac OS files .DS_Store .Rproj.user + diff --git a/R/README.md b/R/README.md new file mode 100644 index 0000000..f23747a --- /dev/null +++ b/R/README.md @@ -0,0 +1,10 @@ +## R + +All R scripts and notebooks are here! Organizational structure: + +- `analysis-vis`: Analyses and visualizations +- `apps`: Shiny app files (subfolder for each) +- `d4ddrugspending`: Anything that could be put in an R package - for example, functions to join specific datasets in our project +- `datawrangling`: Dataset-specific scripts to collect and clean + +Note that data.world has an [R client](https://github.com/datadotworld/data.world-r)! This makes it easy to import data directly from our repo there. diff --git a/R/analysis-vis/README.md b/R/analysis-vis/README.md new file mode 100644 index 0000000..4897927 --- /dev/null +++ b/R/analysis-vis/README.md @@ -0,0 +1,5 @@ +## analysis-vis + +Analysis and visualization scripts/Rmd files. + +Note that data.world has a [R client](https://github.com/datadotworld/data.world-r)! Great for importing datasets directly from our repo there. diff --git a/explore_drugspending.Rmd b/R/analysis-vis/explore_drugspending.Rmd similarity index 85% rename from explore_drugspending.Rmd rename to R/analysis-vis/explore_drugspending.Rmd index 1298aa5..b38c711 100644 --- a/explore_drugspending.Rmd +++ b/R/analysis-vis/explore_drugspending.Rmd @@ -16,9 +16,6 @@ library(jsonlite) ```{r load_spending_data} ## -- Spending data -------------------------------------------------------------------------------- -## Read in drug names (brand + generic) -drugnames <- read_feather('data/drugnames.feather') - ## Function to add a column with spending year to a data frame add_drug_year <- function(df, yr){ mutate(df, drug_year = yr) @@ -27,9 +24,8 @@ add_drug_year <- function(df, yr){ drug.years <- 2011:2015 ## Read in each year's data set, add year and drug names, and combine into a single data.frame -spending.data <- map(paste0('data/spending-', drug.years, '.feather'), read_feather) %>% +spending.data <- map(paste0('dataworld/spending-', drug.years, '.feather'), read_feather) %>% map2(drug.years, add_drug_year) %>% - map(bind_cols, drugnames) %>% bind_rows() ``` @@ -39,6 +35,24 @@ head(spending.data) ``` +```{r load_atc} +atc.data <- read.csv('dataworld/atc-codes.csv') +head(atc.data) +``` + +```{r check_drug_uses} +matt.drug.uses <- read_feather('dataworld/drug_uses.feather') + +matt.drug.uses + +``` + +```{r dig} +length(intersect()) + +``` + + ```{r combine_generics} ## -- Combine data by year for all brand names for the same generic -------------------------------- spending.data.bygeneric <- spending.data %>% @@ -95,6 +109,18 @@ head(therapeutic.areas) ``` +# Try to merge therapeutic classes with drug names +```{r join_class_names} +library(fuzzyjoin) + +## Need to extract generic names from name column + +# ## -- Separate generic and brand names in therapeutic.areas ---------------------------------------- +# therapeutic.areas <- therapeutic.areas %>% +# separate(name, into = c('brand', 'generic'), sep = ' \\(', remove = FALSE, fill = ) + +``` + # Out-of-pocket cost over time for low-income vs non-low-income users of aripiprazole (Aricept) ```{r plot_aripiprazole} plotdata <- spending.data.bygeneric %>% diff --git a/explore_drugspending.md b/R/analysis-vis/explore_drugspending.md similarity index 100% rename from explore_drugspending.md rename to R/analysis-vis/explore_drugspending.md diff --git a/explore_drugspending.nb.html b/R/analysis-vis/explore_drugspending.nb.html similarity index 100% rename from explore_drugspending.nb.html rename to R/analysis-vis/explore_drugspending.nb.html diff --git a/explore_drugspending_files/figure-markdown_github/plot_aripiprazole-1.png b/R/analysis-vis/explore_drugspending_files/figure-markdown_github/plot_aripiprazole-1.png similarity index 100% rename from explore_drugspending_files/figure-markdown_github/plot_aripiprazole-1.png rename to R/analysis-vis/explore_drugspending_files/figure-markdown_github/plot_aripiprazole-1.png diff --git a/R/apps/README.md b/R/apps/README.md new file mode 100644 index 0000000..48d2383 --- /dev/null +++ b/R/apps/README.md @@ -0,0 +1,5 @@ +## apps + +Scripts for R Shiny apps. Store each app in a separate subdirectory. + +Note that data.world has a [R client](https://github.com/datadotworld/data.world-r)! Great for importing datasets directly from our repo there. diff --git a/R-shiny/combine-data.r b/R/apps/shiny_medicared_draft/combine-data.r similarity index 100% rename from R-shiny/combine-data.r rename to R/apps/shiny_medicared_draft/combine-data.r diff --git a/R-shiny/global.r b/R/apps/shiny_medicared_draft/global.r similarity index 100% rename from R-shiny/global.r rename to R/apps/shiny_medicared_draft/global.r diff --git a/R-shiny/rsconnect/shinyapps.io/burrbank/R-shiny.dcf b/R/apps/shiny_medicared_draft/rsconnect/shinyapps.io/burrbank/R-shiny.dcf similarity index 100% rename from R-shiny/rsconnect/shinyapps.io/burrbank/R-shiny.dcf rename to R/apps/shiny_medicared_draft/rsconnect/shinyapps.io/burrbank/R-shiny.dcf diff --git a/R-shiny/server.R b/R/apps/shiny_medicared_draft/server.R similarity index 100% rename from R-shiny/server.R rename to R/apps/shiny_medicared_draft/server.R diff --git a/R-shiny/testing-top100-byuser.feather b/R/apps/shiny_medicared_draft/testing-top100-byuser.feather similarity index 100% rename from R-shiny/testing-top100-byuser.feather rename to R/apps/shiny_medicared_draft/testing-top100-byuser.feather diff --git a/R-shiny/ui.R b/R/apps/shiny_medicared_draft/ui.R similarity index 100% rename from R-shiny/ui.R rename to R/apps/shiny_medicared_draft/ui.R diff --git a/shinydashboard-medicared/.Rhistory b/R/apps/shinydashboard-medicared/.Rhistory similarity index 67% rename from shinydashboard-medicared/.Rhistory rename to R/apps/shinydashboard-medicared/.Rhistory index 0e25167..51b0965 100644 --- a/shinydashboard-medicared/.Rhistory +++ b/R/apps/shinydashboard-medicared/.Rhistory @@ -1,148 +1,3 @@ -getwd() -library(feather) -junk <- read_feather('combined_spending.feather') -junk <- read_feather('combined-spending.feather') -devtools::install_github("datadotworld/data.world-r") -?echo -system("echo 'token=YOUR_API_TOKEN'") -library(data.world) -conn <- data.world() -file.path('~', '.data.world') -echo('~/.data.world') -print('~/.data.world') -conn <- data.world() -conn <- data.world() -atc_codes <- query('data4democracy/drug-spending/atc_codes.csv') -library(data.world) -conn <- data.world() -atc_codes <- query(conn, dataset = 'data4democracy/drug-spending/atc_codes.csv') -df <- query(conn, -dataset = 'data4democracy/drug-spending', -query = "SELECT * FROM Tables") -df -atc_codes <- query(conn, -dataset = 'data4democracy/drug-spending', -query = "SELECT * FROM atc-codes") -dim(atc_codes) -atc_codes -atc_codes <- query(conn, -dataset = 'data4democracy/drug-spending', -query = "SELECT * FROM atc-codes.name") -atc_codes -data_list -## What data tables are available? -data_list <- query(conn, -dataset = 'data4democracy/drug-spending', -query = "SELECT * FROM Tables") -data_list -atc_codes <- query(conn, -dataset = 'data4democracy/drug-spending', -query = "SELECT * FROM atc-codes.csv/atc-codes") -atc_codes -## ATC code data -atc_codes <- query(conn, -dataset = 'data4democracy/drug-spending', -query = "SELECT * FROM atc-codes") -atc_codes -data_list$tableName -atc_codes <- query(conn, -dataset = 'data4democracy/drug-spending', -query = "SELECT * FROM Data") -atc_codes -atc_codes <- query(conn, -dataset = 'data4democracy/drug-spending', -query = "SELECT * FROM atc-codes") -atc_codes -data_list -atc_codes <- query(conn, -dataset = 'data4democracy/drug-spending', -query = "SELECT * FROM atc-codes.csv/atc-codes") -atc_codes -spending_2011 <- query(conn, -dataset = 'data4democracy/drug-spending', -query = "SELECT * FROM spending-2011") -spending_2011 -medicare_data <- query(conn, -dataset = 'data4democracy/drug-spending', -query = "SELECT * FROM Data") -spec() -names(medicare_data) -dim(medicare_data) -head(medicare_data) -drug_list <- query(conn, -dataset = 'data4democracy/drug-spending', -query = "SELECT * FROM drug_list") -drug_list -data_list -medicare_methods <- query(conn, -dataset = 'data4democracy/drug-spending', -query = "SELECT * FROM Methods") -medicare_methods -## Drug uses -drug_uses <- query(conn, -dataset = 'data4democracy/drug-spending', -query = "SELECT * FROM drug_uses") -drug_uses -atc_codes <- query(conn, -dataset = 'data4democracy/drug-spending', -query = "SELECT * FROM `atc-codes`") -atc_codes -drug_list -data_list -rm(list = ls()) -library(data.world) -library(feather) -library(jsonlite) -library(dplyr) -## Set connection (see package README for details: https://github.com/datadotworld/data.world-r) -conn <- data.world() -## What data tables are available? -data_list <- query(conn, -dataset = 'data4democracy/drug-spending', -query = "SELECT * FROM Tables") -?query -## What data tables are available? (both dplyr and data.world have a query()) -data_list <- data.world::query(conn, -dataset = 'data4democracy/drug-spending', -query = "SELECT * FROM Tables") -data_list -library(tidyverse) -?map -?data.world::query -## Function to add a column with spending year to a data frame -add_drug_year <- function(df, yr){ -mutate(df, drug_year = yr) -} -drug.years <- 2011:2015 -spending.data <- map(paste0('SELECT * FROM `spending-', drug.years, '`'), data.world::query, -connection = conn, dataset = 'data4democracy/drug-spending') -## Function to read in one year's CSV from data.world -get_year <- function(yr){ -data.world::query(connection = conn, -dataset = 'data4democracy/drug-spending', -query = paste0("SELECT * FROM `spending-", yr, "`")) -} -## Function to read in one year's CSV from data.world -get_year <- function(yr){ -data.world::query(connection = conn, -dataset = 'data4democracy/drug-spending', -query = paste0("SELECT * FROM `spending-", yr, "`")) -} -drug_years <- 2011:2015 -spending.data <- map(drug_years, get_year) -length(spending.data) -spending.data <- map(drug_years, get_year) %>% -map2(drug_years, add_drug_year) %>% -bind_rows() -dim(spending.data) -head(spending.data) -spend_data <- map(drug_years, get_year) %>% -map2(drug_years, add_drug_year) %>% -bind_rows() -spend <- map(drug_years, get_year) %>% -map2(drug_years, add_drug_year) %>% -bind_rows() -dim(spend) drug_list <- unique(spend$drugname_generic) drug_list ?filter @@ -464,3 +319,194 @@ print(p) naproxen_df p <- ggplot(data = naproxen_df, aes(x = year, y = user_count, group = drugname_brand)) + geom_point() + geom_line() p +shiny::runApp() +dev.list() +dev.off() +dev.off() +dev.off() +dev.off() +dev.off() +runApp() +runApp() +runApp() +runApp() +?textOutput +runApp() +runApp() +runApp() +runApp() +runApp() +?need +runApp() +head(drug_costs$drugname_generic) +runApp() +runApp() +runApp() +arrange(drug_costs, user_counts) +names(drug_costs) +arrange(drug_costs, user_count) +arrange(drug_costs, user_count, decrease = TRUE) +?arrange +dplyr::arrange(drug_costs, user_count, desc = TRUE) +dplyr::arrange(drug_costs, desc(user_count)) +dplyr::arrange(drug_costs_overall, desc(user_count)) +?selectInput +runApp() +runApp() +sort(unique(drug_costs$drugname_generic)) +runApp() +runApp() +head(as.data.frame(table(drug_costs$drugname_generic, drug_costs$drugname_brand))) +dplyr::arrange(as.data.frame(table(drug_costs$drugname_generic, drug_costs$drugname_brand), desc(Freq))) +dplyr::arrange(as.data.frame(table(drug_costs$drugname_generic, drug_costs$drugname_brand)), desc(Freq)) +## How many unique brand names do we have for each generic? +brand_vs_generic <- drug_costs %>% +dplyr::select(drugname_brand, drugname_generic) %>% +unique() +brand_vs_generic +dplyr::arrange(as.data.frame(table(brand_vs_generic$drugname_generic)), desc(Freq)) +library(wesanderson) +?wes_palettes +wes_palettes$BottleRocket +wes_palette("BottleRocket") +runApp() +runApp() +by_user_top100 +rm(list = ls()) +source('combine_data.R') +by_user_top100 +drug_costs <- read_feather('testing-top100-byuser.feather') +head(drug_costs) +brand_indicators <- drug_costs %>% +group_by(drugname_brand, drugname_generic) %>% +summarise(total_users = sum(user_count, na.rm = TRUE)) +brand_indicators +brand_indicators <- drug_costs %>% +group_by(drugname_brand, drugname_generic) %>% +summarise(total_users = sum(user_count, na.rm = TRUE)) +arrange(desc(total_users)) %>% +mutate(generic_num = 1:n()) +brand_indicators <- drug_costs %>% +group_by(drugname_brand, drugname_generic) %>% +summarise(total_users = sum(user_count, na.rm = TRUE)) %>% +arrange(desc(total_users)) %>% +mutate(generic_num = 1:n()) +brand_indicators +brand_indicators <- drug_costs %>% +group_by(drugname_brand, drugname_generic) %>% +summarise(total_users = sum(user_count, na.rm = TRUE)) %>% +arrange(drugname_generic, desc(total_users)) %>% +mutate(generic_num = 1:n()) +brand_indicators +brand_indicators <- drug_costs %>% +group_by(drugname_brand, drugname_generic) %>% +summarise(total_users = sum(user_count, na.rm = TRUE)) %>% +arrange(drugname_generic, desc(total_users)) %>% +mutate(generic_num = 1:count()) +?n +brand_indicators <- drug_costs %>% +group_by(drugname_brand, drugname_generic) %>% +summarise(total_users = sum(user_count, na.rm = TRUE)) %>% +arrange(drugname_generic, desc(total_users)) +brand_indicators +brand_indicators <- drug_costs %>% +group_by(drugname_brand, drugname_generic) %>% +summarise(total_users = sum(user_count, na.rm = TRUE)) %>% +arrange(drugname_generic, desc(total_users)) %>% +ungroup() %>% +group_by(drugname_generic) %>% +mutate(generic_num = 1:n()) +brand_indicators +drug_costs2 <- left_join(drug_costs, +dplyr::select(brand_indicators, -total_users), +by = c('drugname_brand', 'drugname_generic')) +head(drug_costs2) +head(as.data.frame(drug_costs)) +head(as.data.frame(drug_costs2)) +runApp() +source('global.R') +head(drug_costs) +runApp() +runApp() +class(drug_costs$drugname_brand) +drug_costs +subset(drug_costs, drugname_generic == 'PEN NEEDLE, DIABETIC') +as.data.frame(subset(drug_costs, drugname_generic == 'PEN NEEDLE, DIABETIC')) +runApp() +source('combine_data.R') +runApp() +runApp() +runApp() +shiny::runApp() +?read_excel +readxl::read_excel() +?readxl::read_excel() +?readxl::read_excel +atc_codes <- read_csv('dataworld/atc_codes.csv') +atc_codes <- read_csv('../dataworld/atc_codes.csv') +atc_codes <- read_csv('/Users/jthompson/DataForDemocracy/drug-spending/dataworld/atc_codes.csv') +atc_codes <- read_csv('/Users/jthompson/DataForDemocracy/drug-spending/dataworld/atc-codes.csv') +head(atc_codes) +grep('ALZHEIMER', atc_codes) +unique(atc_codes$A) +unique(atc_codes$B) +ls() +grep('NALOXONE', drug_costs$drugname_generic) +#################################################################################################### +## Combine 2011-2015 data housed on data.world into a single feather file +#################################################################################################### +library(data.world) +library(feather) +library(jsonlite) +library(tidyverse) +## Set connection (see package README for details: https://github.com/datadotworld/data.world-r) +conn <- data.world() +## What data tables are available? (both dplyr and data.world have a query(); must specify) +data_list <- data.world::query(conn, +dataset = 'data4democracy/drug-spending', +query = "SELECT * FROM Tables") +drug_uses <- data.world::query(conn, +dataset = 'data4democracy/drug-spending', +query = "SELECT * FROM drug_uses") +## -- Read in each year's data set, add year and drug names, combine into a single data.frame ------ +## Function to add a column with spending year to a data frame +add_drug_year <- function(df, yr){ +mutate(df, year = yr) +} +## Function to read in one year's CSV from data.world +## First column is a row number; don't need that +get_year <- function(yr){ +data.world::query(connection = conn, +dataset = 'data4democracy/drug-spending', +query = paste0("SELECT * FROM `spending-", yr, "`"))[,-1] +} +drug_years <- 2011:2015 +spend <- map(drug_years, get_year) %>% +map2(drug_years, add_drug_year) %>% +bind_rows() +## -- Add a row for each generic with overall summaries of each variable --------------------------- +spend_overall <- spend %>% +group_by(drugname_generic, year) %>% +summarise(claim_count = sum(claim_count, na.rm = TRUE), +total_spending = sum(total_spending, na.rm = TRUE), +user_count = sum(user_count, na.rm = TRUE), +unit_count = sum(unit_count, na.rm = TRUE), +user_count_non_lowincome = sum(user_count_non_lowincome, na.rm = TRUE), +user_count_lowincome = sum(user_count_lowincome, na.rm = TRUE)) %>% +mutate(total_spending_per_user = total_spending / user_count, +drugname_brand = "ALL BRAND NAMES", +## Add NA values for variables that are brand-specific +unit_cost_wavg = NA, +out_of_pocket_avg_lowincome = NA, +out_of_pocket_avg_non_lowincome = NA) %>% +ungroup() +## -- For testing: data set of 100 random generics ------------------------------------------------- +drug_list <- unique(spend$drugname_generic) +drug_list_random <- sample(drug_list, size = 100) +write_feather(spend[spend$drugname_generic %in% drug_list_random,], 'testing-random.feather') +write_feather(spend_overall[spend_overall$drugname_generic %in% drug_list_random,], +'testing-random-overall.feather') +grep('NALOXONE', spend$drugname_generic) +spend[grep('NALOXONE', spend$drugname_generic),] +as.data.frame(spend[grep('NALOXONE', spend$drugname_generic),]) +runApp() diff --git a/shinydashboard-medicared/combine_data.R b/R/apps/shinydashboard-medicared/combine_data.R similarity index 100% rename from shinydashboard-medicared/combine_data.R rename to R/apps/shinydashboard-medicared/combine_data.R diff --git a/shinydashboard-medicared/global.R b/R/apps/shinydashboard-medicared/global.R similarity index 100% rename from shinydashboard-medicared/global.R rename to R/apps/shinydashboard-medicared/global.R diff --git a/R/apps/shinydashboard-medicared/rsconnect/shinyapps.io/jenniferthompson/shinydashboard-medicared.dcf b/R/apps/shinydashboard-medicared/rsconnect/shinyapps.io/jenniferthompson/shinydashboard-medicared.dcf new file mode 100644 index 0000000..8e06a21 --- /dev/null +++ b/R/apps/shinydashboard-medicared/rsconnect/shinyapps.io/jenniferthompson/shinydashboard-medicared.dcf @@ -0,0 +1,10 @@ +name: shinydashboard-medicared +title: shinydashboard-medicared +account: jenniferthompson +server: shinyapps.io +appId: 153806 +bundleId: 697527 +url: https://jenniferthompson.shinyapps.io/shinydashboard-medicared/ +when: 1485966317.5111 +asMultiple: FALSE +asStatic: FALSE diff --git a/shinydashboard-medicared/server.R b/R/apps/shinydashboard-medicared/server.R similarity index 100% rename from shinydashboard-medicared/server.R rename to R/apps/shinydashboard-medicared/server.R diff --git a/R/apps/shinydashboard-medicared/testing-random-overall.feather b/R/apps/shinydashboard-medicared/testing-random-overall.feather new file mode 100644 index 0000000000000000000000000000000000000000..661b1febf6d2e8eb161af944cd4d23391fc6dd16 GIT binary patch literal 41848 zcmeI52UHZv`t}P2MKO!6VbxJFqo9Ift_Fsn1A_zwLjj^J@2Gjx^c!Lno1@r+iU=)Z0Gr(rB z3mgO|z&UUY+yl?R8(@~5vC^Oc2n2mW0+t!_ zAP{r{QD72S2@Zk`@E%xLFqR(_2jxL^&LC5}XIu!9DO4yap@}vI49@X;2x|15H6I&l1 z5i#wvjZ zKo8o3{$Lu|2u_1%Ag?uJB|s(M02JU2x`FW^2^<1$z{5A*=zz;bX9+y-Vv z87l)CfmUDum;p9}GvGPM{{#9pXa*v{7_b!V2RFe7@Ix`w8K?)Ef>t0JOamLhDex1> zT^#X%7PJFH!CbHnoCnvzJ@6FdEWwxt)C0btD;NRhfQ{f7xDDQbyd}}jpf1pXHXsJf z1}We?$O4~$<&TUN0zZO^peASt+<`A>4F-Z4U=uhEu7dmE1^5UoOQFvL2hbFRf_`8) zhy%01GOz*c1cyKxxD4)qOz;6%ViK?h8c+q)0u6vG@B*zs1n3V&fhk})*a1#~+u&!A zy$sq3lmwMPZ6FRs(bTSBr`2g){C)MhAb)Lje;;p+pI+x}=dKI-2SXh-73^FTor`CH zmz~I$pPj2V&|gy%{>aro6Y8S%57OCrY5hHdbk&_}*0R%iY2EZX#b2v&QI!8A)XURN z@8|F7jf8xI{QMQ24xg33!&mRB`0A0ahl>vB{WX`j;_j=}dAd?6f7#{l;j5rriuWJ* z;HTL6A+k#la&0H77Mb_f`*@&FxVbsIxNCHtEwukuk!i00FU8sUcRqOfc?I};h*m{C zdAi#9{hPTs&R>giGt@uLOI#dU_!niX7Lz$hxhk9}4`x4e~_!wcg^Y zf9R8kPVejEq4oCk72Q!QO@W__-Ul|o%iBeS2I~V+zuwxv3uwX^?`PN%{;v| zE;_B^?WgtCc}kbI@poF z%g0smQQUQ&ZaRIir?;p}H@z>aRhX*Z4f1u?`slT=mKsIprf8sOfFM7;ue0J0YxmED zYIO>RtgA5LURpnxEq|@+-|iO(8|A0f)U?-B&?w%n8v7a!mfcB4{ZjpZiwEW@tuJOcOtXLVlZW0fAkb5k7VYt;Kl|&^wQ=6> zsheWw?TNnTE$h_ICBVlQvl{Ghus8nxn^07Xo2RpwOfe9>^Dl;i2_W{5}0W{WQ)RPcN?km>_q|MFF_X z|1!wa8zUSg^Y-!3cwo8ct-(sf#{=E-e-`3{?jxpN-0Ubiu_nRIn6x{nY0rNkP*+1N z=}-xtx&S{r=NitQZl10IUKMqEZ}$K%o#NsjphJ)NV;{Uxo4#_@sl$5aPkn~T^-=sV zvD*3Rafjp_fRDOg_iUlZLPAU!-a74{|Lm>zb=Ug&ql;IEu|Q`K4h2S8CsO-ILiPUQ zKETx*Jpm)mS+2@-{{>Gkt&e95#YGV-04%-ieB8vmC)!I|!@ug#!kA)Fr*YN=XziR$ zw{vzLL3)wmKNT9Jlk0a^j4P3i|ICS}68^Yt$6)nVQ~S?-Xde3Qzvuy;-k#2)rMx}= zio+WVQ$?hpu2Q`{|BsK}SB?QJjl8whDBtaQo<|xZ#nRt*fVk8%&q~W~i^Hzuvos23NwJAQlwm>sH4dk)~D++#mUPx6qV# zvcruv?iBqr6*V3ht@57H$IeX=p;(AJ>&rXTm2u#wDPPmh)#HC2)Y8-615Xmm*L6@c zqQ?_3`EW&K@*fVR3Pk1n>!~MlRlaULQ>DTG%fnE$_I^LqkxsS6lOyMfZdm#tZC5`$ z=#@49`=NE}P(}X0l1Qn))#jb;t`pr3m#TsDTdDV-}i4J zZgt(o6I<~>Q$F|h#gg}L_r%Z=?+`F%oPDusaMjXdD~+7p#lsp;Utdpm@pdi1A5U5T zxlk{<+e8lj=qC&t+=pP%>8Jk_9|N4LH^=i?y1jPAI}H~YfLivN0K9$h`)>t`B6<2? z`R0eY;g5d&df~2tA;3E-7|H*duSbxt-qY3ANAKGVHz9xSvmVcyynu>eL&8-(+fXQz1 zXFtpL=2x)y=PI}cu7exk-}(L7`2Q~5U%TGleT}cn_n)NwNAvn?@%~*se4DSY-M^OJ zZ~6V2|JP~#RvZ78|F5O@XZ`+c{IA>Vzj5v#P4myT*{`K5>i*aK{}+CLNB;k4KELf_ zrgHz$^F=&U+`pRdKXd-K*Z9^g`k*PjztSK7)APTr&;KMZ|J1oIm}UHc4X6yTg^js` zHlPo<2h6drcN_LQ7Q_C!8`!sot$3^g5OJ}Uj@cA1!`AH5u!fConA6G%Y`SA5)^I)2 z+lYN~M#g%AW?Qh&5plbLMW8Qm1R-D$(q92y10DAI?gy>FOzfrg!hY5o*hg9&`v`Yo zzuQ}6GPWxA#UURq*vn~C19`z7Gr#QE`-ikDWnrHlaQcY7i>I*H6c;NG|0JXriZ~7c zr^$Rbgw_YXxb7q{6`yAT4L)B+yp^CO_5q&--EjT{gmuZ4jb$w`V{N9Iu{|x!Sn1+s zGQBzoLzcwWRVKEu_VY)2!PuvXO3Xb7d;9{h2M+#D)+m2HGxq2?>JgPY`3&~xEl1k8 zMsr**71t5_riUUA*pA7teN=J_6`g>+h+>~=H-zoN-r;(eu}AYd_Gdq0>~IG5hF+p` z9^m}yNNWkwv_c)WgO*1+_BhW5D(dOYz#J^WDJRPpV98bt%Ebbbak(+h zs*4S_hx4#YFY>UKbdW47oyPJ1e_pXyX#7FVmXM2G4u;*}lqi?e6D1MS&>Ak=** z_K0>uIvub_6}k;+H3H_K1E>J7)sT$y4R`@<6Z^X25h8#ytN8@ zmA?vey-mV_VJ&l)VMV8DSXrAg*ej}G#=2!# zk@KZkCA1ssotSO5`MvG z+a9oO<*_Gw8Tx-`bl50pTlgI}r~Vq=tQ30{Rf4sDS&S9vR*3aU$iq%m!TwRSL+<7n zbEvzL{jhdKy2V1V@3Vm!(^fWP*66SKbC@yLx2RvF-wVtJ6Oq0P2pU_AW#d0E?^-3; z&d?IKla03-*)Wyi=M1mdJHSFek^N^eqQ(n z(s+k13 z6~IFPbH$beaedKVb|4ZIgj?hTRmoa|vEWv+1-q7D!S>+`09HjT*oQ^tY<`wG3tVH) zo>s76+WHo(xdCB_yY{ddYjwel-8pW?*6uQ6jaHelH$g}{40VnI?COdB-528+o5WWi zE5HIL6k>gOVdjEO)_R{j$8_N-po%K5acT9FRb!v9jG(9^zn$4Wub1`SvF`$m%OBCsL z=4>mz2+LEb$355c zPU0B7nb*d#(QG-df(T2MyVBon!7b_5e!9j-J#L<|`~6*hbD;Iw&zG}!8F*M{SS#?J zKYBnFMT9$!t)YlyPXxZ8^S1rO#dUS&ccr^v|4fdnCq!E;@(wx6MSbKca9h@A)L>@?kbwwN5Z>_5(%W+t&`VB6|K}g$)vOf2<9LZ5nVLvSIBg$jbqhXY| ze(a^3eMEW@Q=jz``JJ*WHd2cbGTdS6X^FZTa3PP8u?rubbs+#MGUvC+nq$d z^IRHPU&POrPv1}xb|dDlBHXtsFLjmWbDv=)#!c-C#jIqx{O$9~aox1Gm8_Q|XA8*o zs`>P^?C*-zS+v9OWQ(TTlpm0q#7f^5&S7FA@s`DUvo?a0vE*QFf|zmrGy zt5M~wWw}yTFj<~)Yu|93A6?UaG5TMPHPiPjMg4S5$a{G?(t9`G?%_&NFUv+gUyFK- z^?P-27t&3te=^93{48?0G1iFlo{n2NcaPAQep|(ifMd%H(O(DJX6-8E$D(tK*yR`x^Pf$avO>78?Hs>U#5>yZ&?1~y zZtdPH2au1e{F(hbQLiN%K1>$<$aSXg6xqM|+=(LnRVB8>iR~kwME|(9dw!4zcX_%oRMeMM@}tfo-%+pqBgOTPuia@b$M=dpujTkS z@0Tg1;S3jczwqq*vK`aTS<7~{Szl6I|LPH&@}j@)d+A+4wttU)^U-?6dH5T(n`He-J%l79h8lXN-$6f8T3H>p8_~mS>_X}P%W zsf0-`BEJqhFDN4Zp~p?QIRD2jlN-o!6>z{w)>qHAFXg;Yv%^a<|Au_-m&HXlN!CA? z^-$R>6a8iC%S#nji259oedlVF->J`y;~OxJ7Vhfiv<2x`G}OMi4fVURQX|`iV!o>7 z*>W+;-SXb>qANss_uEbr=cNod{%Rfi)v>^B)lZ^-EPt`FbsF-q+p=xYY2+_@!0u`ANE&-5 z%aJX^Ji%vK5qRe+jT^6ZfQ^29myu!?{3b^(vG*yc*D^@BJU=c$^H==Zsfw= zK6-FL_5-^GX|i69KS`1Gc5~8kX_u?^J0s`WzQIT2d|9JnnzX+ugLX-KKO=3640qhP zQ_d5XBM(ST%1Gg&zu)_?ob26Jdeg06RNsZ8h9(%Eu8o|qw+d? zhaRGQ{+uT4Q0dLJZ%g-shsn}Cs?t6=&#m%5C*$XyQ$p5f)SY~?pP#&!N3`48Rr_fj z75%0V=968~W_Q+LoIA%=(5w^v{Gj{mbt0ba^*!s*FN3Dluu2x=C*3{!Br#5P?)hUy z`$RkLA20gx$V`{9qW=zEa7nI{a$nfkR^+E~-UwIG@1I3Daba(wC$z66?P zj+mb&2zwA6J2h6=rRbwKCX4tHHP1{H?v(jmXNZ1Ou?F#KL*Y_bT~({9O1}U4Yp?p7w2A6&psF)zT0CjUOw!0Dq^#mM%6@T7 z^(!g!v&5>D)XYH|skUXxN!?P6lnvQM={W3`Y8YZ9_i<9g3Ds?ELH^vA)S$Wz-sENt zReznTok@+|NE7>z#`jls04WP3HK_3;Bgw5%<6quLZu6a_Pxh0pI6!)FJL%3Tq-U3r z8t1F3ro+^uhMJCU2Zircb<`Gemt0S3YR5Oj$X#qCY4iv+oc;b`XiM>Uuo~Z$)ZjsC zY)DY;+v1+?p8pzGtNHq+*FEw%FEvXrLQg-UPbQ_jll8Pr6q^9e!`l>(s z#bGp0lm7g!s&VI}+fej^RCe?fDbtgN%q2Z}LaO1-VRElZCDk7yP2Ee%!blB4q}-p> zsP-e~sm5c!ez+~B@VN^~W2cfPhLf^MQZ-j^lV-akHS{=X;x+OQwIRim96FD8Cr#`{ z8fxm7(d3R)-OPd9#@3|lmxsZf=J&LVA7pswNBQWMd0fe^h?wESa!6(BczILm2kB0o zPkP6!gmfp@Ae~!+lx5wL>9H&-2Veg{x0K*rb9qx=kPMfStyJ=v4FwMji5|0wfcAcf+cjUu}fdWQUC zhLT!7Cx13_H|3*&YG1CY{p5_QW%g0Hy*h5OK49VqRqcY0>P}YOGEn?!$myfWj;ig< zRQvlRzszT7#R62{>*+o^x-I#qC6SvsRHS&HD@Yw%!B*;)ayF!1<)t#!?mbvQ^-^ef zS?Pc13Tf0?(r$KSXUE!>mf>l;sXh#0q{kmoy=1IZ+x<3;pX8VqqCAG`1-U#gvYoS3 z+r@5DFFte^YN&d`Q@UB!X%U|p&!3gbVoCXvbm`^=&q#f6i29?`+g$QI%{VIm)Z$bx z#oE$+Abx3t(n+Op&eD!aw_(0I?l&H#@M7w?kB%jGVn0=Tl4{g(#ynJaZ&Dw%eM8mp z#$(9e z39VgF>VbLW9_v8)=Pk(Xw8v707aK+SPwGnUz{;wBFKWl6g*9ZnR`E5Zws&xlYIUrR z)XS^oeIPUVQNQ9_$<7-lQNJ*xUZMOk(@}%m_TxwmqewLaNh61m@{y#T`$^lX>xhd} z$epCl!?Tx=+u%pa+o^7{FZksdaE@$JGoDd6epN*J8?7mxq3Q#Qw}IUJ=soFX(RWGntRb~lHD@xp3#|Wzj;*NL8yo7k zDZ8y?zf4=6SL(%jWPg}JEoZoDN9+?RowJKbZ>jyOv60*h_mQR?kZLGN$}Up4q3}WS zPf_E|RLAqHjdb2mcStwimddB9Uvw8LM`9f+hsQ{=pWz*;JnWHL zuNKebd1=?4Q@ZnGRb>=Np?+xg$HgmGLs8Y{Y%(#sW>`d}uH~F5R^o`BawYjxxQk@dX zt|cXsy=F6q)AbGQNKNYy-i{}huv@!6eH!j3E!^%douOoX^nWt5;2hkSbhe_ioBk|ZXaDYax3YgB+^dn zNIxWy-kGWDT+$_~J&0OL?y3t(TW*tTSZn0-pDjN$XDHQoTsNBkm#nEO^Vy{mwe!js zq_NMdNdJc;s9y{W^Oo+|&aP79ThTnhDpUV=pQMximB)}yo8~3mmFzvFE_p%g1eVyH zR~u9GQjePJd4n7Ji9er9q31;{HdB71*ODIHNBPdJ_OCE{zVxgPwR2+nCmF68N8`oN zg2sP=yjkjb>bhW%+FwgiKQg>JF2kAcUW%7|Ts&9me7bCV<%dfrE7fh?R^&Ii$*MLo z-$hpi3pK=dZz0_*aR;5h^eQRNM>t+?tL=#U8}x%&RjOHt`~Bm^n$S4NIzZ#{cxY~! zjz?QFN^cppYkZ}GO4;Pz;bnh(E}u_TEA^P3I|V=DeWw&N|Kv#ToA%edEw9HNX?$l~ zRL8+^THhP{QT=GNG|t&@)t>0cZWuPbmgm1ITwGp1HIUYKhF)avjEm39@JMe;FDq5H zo8gU(i->R7?MUrkxCE(ggY?Hnm(}t-R)DUXc9iT((xErk%ow;&m z`8V9!EBf`2H%(h8^*5y+vfLW1RH|ti<-MbgGNIf3_XqohDj!xnf8D27n37}Iv=Oa* z9hAvWVuor?*HPLP2pmvjdwr!tgBx};oTOba4sdE9(&ek0aarDxcS)0OD&jf$gy-j| zAICkQa@%vVBbn)Bhu>_Y_Kxh4P3A9UjoQw>X|nv>=8R}pvt8R~Dw|UKJ+&V-LkX<6 zsmJA`vqk*Njs50|=UAsZ=UO28!#%sj1I2TnAv1$xlsA62C;4w5q70knlC?gELFpYn z*(%1?AfLB?%%JDCRaSiF-S59&k^2Et>fr*1&oTL&Z|)Jb-iyW2d+Yh*Wqw%lSQ>xF zCy;yWIMUE=q^A40PK(HWaiV;l=RRjNuUylzQ_%Rq3hLixaAJ(oX1iyX^GPv^q07$g zO(w;N=Wy?;-;7aqFPQy$^vk)*LhTl3{gC;}%IE1xT^7z)8s0e7)uYsW@f_{0VmDvb z7yGb;=NLB6EZ2q$D0j=n5#=u_yP{g{Jh}BU`a`xFtzEC+Ib4+rKiFSU+_v=D)}z&Q z1;gXy?F-YD;^ybe)V@7ajJu+GyICUL$nlkC$#iw=%L(OS$66}ml+gDM4*irSj&02A z#Kb5tLq(sjAFedblg+YD#Bh<`-Ic3G$nzYYN_%FQQHJc_#g$SGgV%d2Ph*+{99rlt z%5&|7hqFkxBV!&9?o%ey$s_kS?{6yX#O|My)E4tU2jP>6g?zWvzXRF866&zf8k82Y%|U8 zX&-1j+OMbiH}$|fI&b)UseA#ATVwUJ;{6aWTyeH|-s#kT+Dzqixhun+3(XYsnpx4^ z3F3LB#;6}J>t{_{S})ApP*;>^Xk{xJFL@Tr@)}0JaFg+P%v~Pbp~2_pJ!t(u=z_E# zhE65Pjw~8Q@h?xH@nv3!G&zXMZ)i@M`HJk9p%K~n#3{~UVVM>`wmA$e1la(nQuPClG-nQ zAJ2dpQpqNd}e zuAgny^@aT$3XfLTd!N*Gc4Rd98>2|MYCn?ukXxg!Q)(=s_bgo(k^c~N9g{MZ+)>j= zP0t;DW|5oECiNpb%DU5h&hDw@etnU`ou-f`FDC7^MZVV>cKD;TTXhHDl<##C7Cn^V z#_&6G{!y-Gih1gEw%D@LUY2W4+U=Z#PyGdRHywB z-D>3$QHN|FA!=c%M_d>>ipwLT1pqChg{DId5b*&^UbXDoecQTRP)G zxKbg7u{eDARD~@fpdnL{e6Yq)UZP?jCq?^aRaVKH7=P2QwQ9s-7 zM_pep($(%6xL%b1{Zl`oHSV-rvPRTj9p784Wql-{pmkGtK3czKJfL;I{W7vI@s~0= z+Ig+hoG1m&UcY~v-lE=}i(l@eWUDr28LJy5)WJTokAi8oSF!qqWx9)|SW7i#qvt%q zZRk1Mo%1%*A7%f0kIHdeCK#jM4`fa!_rJMHNI|k2<`XI3k#_XFH}VRt2dCa7W%bCe zu*O>`U2D}I+)?$ss;1}oU!G^^D89j&l+{$V0cl34svSvT=cYHD1MK_)gWH zvRdS}??)OsK-K=F?B5->YP_nyAK!i;g{KW7ojFpCKbkbsR8Nhi+tBlpRKDnpRHOAd z^7lAR+UvMf_T_N-#{DHgelWPH^TJ$OU$DC;WqiXHvcHC8y05~nWlE<*Jn4D0z8uv1 z)+MXS-+2XTqI!R7@FKVA`I@Q!7)<$Uq=vI!Ki;U<)2RJlGlt?D+K}=gQh7g`7Yt+6 z`pHN4ZHB&AWVqq1`aFuMM`%0g&oVlZYI>3;Mv|J|12XmajrT9S{Bs#Ux%Nw`k#%Vu zkQV)3x{Z#XrQ%x!QUhbiE{(mEN7{?bePpMtbCI1&Ekeo{QvEXzwVhi~xmXh_4=b;_ z4Sgy7FZ1$Xa+}`U84Tn$)%Ta@l+LQZs=x7mE~Pc)_swa_XL2Dmf1ETXoHTPe-4|t= z({md8w{-t|u`r!q`7F6vsHvZ*<8S;%%Ey~cq(fCZ#MJg>svXgUsrhY3s!^4Fd;I!% zOCCq}XJa?e{aWH$(&)?CWjk1AktRK-`{R^+q)w;F-WSM0?G@OE?(eb7U*;pV9hFvh2w+U1J2bukkFc5BJP+kol}= zCGT5Vr+kg1J8^##smxzpH$~2u=d;y`q+DIkS(4h%`XK!;KBIZw@*dsCrf#NkWN7KW zftikJdu4pX5+mu|eNtH+@@JvD$(=fiv_LOXqiXj<+mo9$AT>RY<^kk3jblT*U%KPf zervM7U*79BUtKqI?qA1BR*<QC|H&zgUuI@N8mf8Np^_>ua_gL+iod?$^Iw594e*+uT; ziqt-dwWz(4aevQn@Dx&G1F|bAYiJ%%+DPyB7L_hfY5rfAai_YW#2YH?CJqU0;Q${o>+0I^R}p?~4=u^_Kj8D zGiS(fLtb^>OQ!kJ=tJ`&U#rfK#jaC2YJLpYPfNFP!WlaMB&{!u%}EWT&r=jPZV!Dsb)LngEdpfyV(XAZg4VE zyc&DRJ!~(z+24Ga_IrGJ&+7b#t`j+u>Xm;a&4{P@Iqe|LPst0^d1}0AoT~Gj>HSC= z^*?5<`hVG<(OA8{qNllyH6q4QWvRn?fL`#{r)ru`C`Q54S*Notz6d1rE~@3#$8&XM~d*%?;!6uI*r zlWMqhNR7|b!_+P&_cuCvE0;bYTS$ARkQ&r+UptxHtPW`=-9H#E(sc}v_mcl`RX@^r zU`92aFZYk0YC0~eI;-laD*N@rV;Y4Qn@nojM`GH4W*kcXBWZja-X14+5w$)h(D*kz z_@-Wr0Tj;|NXpx)ZdIA7{n+mw29I0vJl^!S)Wp$bzYK#ONVjG-*%y49PP%9Aq48+h zf%L&(Qm1C5Nx4XkZfZLxo|oqttuB(jBISEXnL(XLLR5XDYKmHKKI%AN>bNtlJ52il znYTkVfv5do=&dv>>%l%_r?|3ifS_1mf3_Y97TG*s>PruDC>eKesIZd&)slfM2_i^9M5!so<8AEbYz!+WWk z9B-tu+&@c=k9Z~3wkPfD>d>F`r=2vP_$c)LFVOVdhjAId8=f~Z9M&gDlPZ(OKPn>q zldFMqzfnW>A~7pdh8qjLkZSMtlHBje9a)RQnd#`1BEwlr)jssz zOz!s^NDr#^*r>J_p5rocnC!YiweP0=HHjvB)=iBUNy_^C(w#Vv+@|LUiR!#y2qS-k zyHuV;>j*Z3+BbB&nXC_u^=lb!7^#jw%dvD`S{!M-YEJ^EklSQuO!his0{Q1UEY*-- zRddzu6*@@ah4+*4Xj0R@(|FY#+L!zjdrM6|L;Wu~i27grCsM=cw-kPz`eT8b&!t)GI@#%bVUHU2~l@*Hx*8{Fg{S(EW=s=Dc(pbr&dJ8*=l*o%(W z%R}u)-Qp>|aml3h){~Z0?T_OoaxdIS8knT&8qz$f+q8dFeZR<#?~~yMOLhFtQr+#< zajlN`NQLZTqK-7poHR2pX?!9n&ygn6Glr&9x^GF14bDh6e*8nKefctSJUVry`Nj4C zJ%4y`oZLU)K=s$DYeU&^P}bGP}Fo`%L%=!uV%?ghHPVk^kL#BU)tpGbCvRbETy zWmDI`*Ef*+ma2{$_>Jp0Mn>{zuNvW9o*DSz!;c;mN}HkBXcPBS>XHoOXd4{ zw*`xMMvKqgU%iT>@B8PS&FgnhJacH=BA&ZLY)aa-K0Kn;ymRAs82J0S+C4ws@6Qdr zb5`EEZadcnA6#^Cym`XihS#f(<-;ppKYa7hcrLz|?PhLj9~C8}NLa(?fpBwaKkD zEg$nebt_$uS@4v9ULDhMN$KbOMY)W@*Ji)uCB?Ddm#-Y&+;d(=5byV-e7ycZ7@w20 zZ$jINCj0xZ_B6GtNjp3Fv2^P`e0Qj3)40gN^d9==Ab#R<*&YvP4CHsSh97@aV;J{0 zo6)J|@~-@GUhUS)GrIDq5Z(GtbtC!vFtaH?9PP(Dq}EI@zY@*2#&0M$dU;=-(C2{1 za-Sx=$iyF-^(^YlH&zQDQQYXot5hkr!hL%X=lZz95jEQJyiu3=@@75w%?o=<82a?& zlatCFxbj?mzwlK*d3t(r+8Fb?Ja?f3rOZ~=<8z&c6smW#9&a*ytV^-o^|*b$x;bk; ztG%R#*L0mtptgA;gIy@CrXjoZKzE{|?>tKB9(eAm?Y8BUvci2i`~q}yh` z`@@~s&QrGXH5rB7OSD|d>!0bCBcsYP{<7BHjYr&)__L=t$}QvAXSDRn>E&PA$5ekN z%`DtMt#-~Hd}i^2?-tGL!)MOAdhp}YD4zS{YWA#jB=7tta8kNNsqoNsHe zW67*moR@N|HhD@M=jR4aD!MvC;g1I8>v?#!3m@yXwCw%)wfR!bg~r>L598*S<4Ofw z9Ll%eT`;y$DMQhV7;PMD-F8L=ghm+sM)kQZfUp3?m*6XzTWX&@q4!?@n;RMzD;nR z!ZWrke!Y9%G(N1s$AVU;7x4b?$`_4nynq`QR-Jk~|6;y>_Unv*7Yph8q}r9dWcis7 zo(+!TTa$K|%0Hn8Z?S8tuHMx+Uh7FvjnebR^8jV9wbkKq+}7@O&buE+@k(Q6@6y~D z%BK!o_q@T(cs^y!m7E6$OyYa`tWp+qis#MyB%FvWJDD%_8RQgudNQwG$){k|wcGiL zJ~3TV*X-oi(khMC)!EH+o1dH3qV^s>YSNU5?iNPwJg%;n{@P-`tZTJM-Mu9|%Wvg{ z33f|)hi*GJjxV#E+l||GsNY@H4x>Md{RJb38~K{e=Yx->9^iGRjhz$H<7{oWjENe> z(^u3wRQkvmetwqyvo^7%KX0L`2E4-n~lzJ;!dZsoL9K`^O$CC zqxwzpBpN6ez5p+l_z}G-m}LZuYAoTW_FlY=|U)@zT>l2{{MzA6v|R+i2imUd)jGZn4#H9yTc^=Z+PzJaXRo>`#)X z@zd##{j2Fa^LZhipL_1@$(xs6zQ5C`NWRhLqv42EFS&ms&$5C1x(#+l-krdwFQ2pc zrSoKdZFckV?W!km+qL~((4~z z$y07T?=`7mDz{l_`Mlr0R9^OG-0PF4V!7AtUUt>XOy>J%raQOujN?@T$K~77TCh*F64~};^GM%5*9Bg-c^dz2m_Q_VS(-ZketNtsU22SA17f+tFsmges z{m9jMn(AZth=iI=w^k12BPXu3tKYX1w~o5KSex3JpMIv_|6oV>7rTc2KskoJ3g$T* zwCua@RY(3LYDTvQLG8KLWAp0ln>+DZyhwKcVI6tJY(H%0gF5q(pT`&1UUTF_Qi?cU z>F>acPPOV(?4tv3q#W7UezL-c8ZJGz(lz5}9b2Dqd=kv9diPo3@wx-Au_L&bZdW+J zx^R1`l{+H%nA1c2=1=Lx>(3sRUeLTfk1W{tNt-7fd5JR}4D~YF^D!%Z;>sv~Ji5V- zRjZFSRlmOsZdwEt3$mlG=N34GLz8@DxlKc`x2E|PC%-=1fm zS0^o^UKsyS>0WBqqELP)p{?!P{b3y2p(j5{3*l26Kb+F|p~9c$UbB={cj0wkm0Xam zsvEc8wW?lji)K8jlU^BRq5pE7Di7aeZ9eEob`$$bu1sy!olv1UWo--(Rj{%#!x`xP*9^M_1#^ykgI z+_N2Hr`6uU9iBO94{z8b_bo@i*~j-x%uyrZ?GB!`|B!E8pWR%uwcy*tggtzJ^{@j| zZ1(b8(_fFY3fj+)-7nty^X3G;?EL2w^DU?Fmp7vJ#m$K4$*YdmecUyUj|%%(^L^Gh zKIz)Mi{0~8;z1i{t|_V0@h(wyn~of)<+T%v$Jw59;uhDVKW`Y?h-W6$npJ0%!kr^m zTjcXiAZuJ-}4KL&+@}*y{EK$a)Iy7bKDrY;VNH#{ovy=t=jVenbrMb z)`szGGZ(Gdyf2IoT+#Aaj|OeHcZSX3+1|lC`_c|?PBb0CeJn?x%vo&=cgxo?Hha~0 ze)f3lm6?^M^1PpZh?`P=0xx-dMuU>~#`CR#F_W`;$MPl3EA|?)b0VL!Q*RNnXCmKS ztHF;Iqr37Rjt;p`dvxO$>UIyez`Q)h+A;d#=m?&WYu>=T7rO9c(}!HUG0THn^;=S> za0x9Bc~mOL-uGIbwzZ+#r+Yq}uV_3!VNn}?!ukHY>_0p3zE3*lyVtiauW-#f^~h3B zKHs<9-8W-=_*Q?Lp_{Vld8>`1ACDR3!>wWtTD`GWe#_`Q}4lhc46UPrfUb{JENCMAiw!U1yYO(yvV4FT8I}hRcmXz(v zj`ilbTG#LKW>|mzxJi|V&BKTAzGtGl80*LI8U5FHn_?Hk>y0s+o-jFz*UTEPOtS9J zKNWJZ{NOf-uf5(sUC#}?WWTItHJwNBww0Wg?1-Mk<34rHF?ho?e#W73m7aqp^D>pX zO`X0emNz@G+rfM`J+H~n==TDvLmPr-AQ(h|XfOs$2TQ>wupgv@n;;W>2KmhJKdgZ* zXaJgmAP^4vgVA6bSOPYJec&|60MEcDkT)BC!wpme^?@e{1f4-YFbYfsi@^r47o>q3 z;3>e*xv@Oi@w@&`2r7X(Knwgqd(ayU1My%1SPR5&ULFTmz$5S$Smwm<{egT|fWaUZ%mFLGHjoM~ zfP3H-Ft@^QFoJTRCg4C1+JNpL22236!3vN94ukXHF31Ae^Wb+xL0MoAngDOm8gv7L zz<4kVB!R8q5I6_!fR`X!Ui@|<&;UEo7v6 z45$Gb0Uc-sx_|*-ESLe7fz99mI0J5h=Ro{;YJN}}R0j<~GY||SKr|Qwrh}zm6W9;Z z!A+0}K7)J(F#drpXaJgmAP^4vgVA6bSOPYJec&|60MEcDkhdVlKd1)k15XeLI)i>- z6qpJYgAHIWNCP*(Q}7YwDTMJ4s)BmJ1GEI4KwmHtOaY6)dSC>nz;*Bh;O9}9Rbh;O zPz5*vchCZK1W{lFNB|2#GS~x7f@|O>@E+v0#`p)7L0#Ym0ze1Q2Mh<3K_XZOc7qe( zDtHXufm}r}{y`;B2WWvmXb*aWVIUqX0BgZ6a2#9#kHA}CSrp?RR0NK|75IU6pcgQJ zNnk!$19pOA;4*j!-hiAxVEls$zyY`bUl0Z&!B7wf=7H5<2RI5Yfd@bw_)qHiXB^^x z<>KGb;oo|FcYd#p@15cMSom%VzFWfYmhihJ{B8-qTf*;_@Vh1aZVA6z!ta*wyCwW? z3BOyy@0RepCH!s)zgxoZmhk@{OGr=qzyJNaY5=c+aO7h`^DuLUSE=&k23h% zvu{+}o}Jo8_H5s^V^rI)ex2L)=-H!fx1RkYdbID^y(8nFKYuPZpW>VHVbVzQmVcXm zplfir#5GMvNqqRf*Z5cZ1(=PDYL1dyvmfREtV^0lXPd5LQq%ResMq?oJmOVn-yRWB zZQJ+k6VmAmk1Kv*} zF1)QC48dOBBB+bLJ)*v9Q23`%eshO+q*P4#HKkh=*A?g6 zgRk>i4DPSe{AEW$SOGP^Nr7FyWl;zny>I$2*mMizP#16zO6TG zCt&Tng++9y#z3F6Vc2qkab5s_@xLqa7e{tW(K&FK(hbGl4%4wxP5ayaBl0|;W0>qA z1z5RXO*g3mrSgB%&4+7~y%Cm2lv&h;6ZpC=ME<_?`OY1CbnG3`9$q+C^J~|$681|R Rrt2lD*MERS-Ly*0{|DkSsWkuq literal 0 HcmV?d00001 diff --git a/R/apps/shinydashboard-medicared/testing-random.feather b/R/apps/shinydashboard-medicared/testing-random.feather new file mode 100644 index 0000000000000000000000000000000000000000..2ff9c70defd10d6b9d817be92d6cf89ff5110f9a GIT binary patch literal 116128 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 literal 0 HcmV?d00001 diff --git a/shinydashboard-medicared/testing-top100-byuser-overall.feather b/R/apps/shinydashboard-medicared/testing-top100-byuser-overall.feather similarity index 100% rename from shinydashboard-medicared/testing-top100-byuser-overall.feather rename to R/apps/shinydashboard-medicared/testing-top100-byuser-overall.feather diff --git a/shinydashboard-medicared/testing-top100-byuser.feather b/R/apps/shinydashboard-medicared/testing-top100-byuser.feather similarity index 100% rename from shinydashboard-medicared/testing-top100-byuser.feather rename to R/apps/shinydashboard-medicared/testing-top100-byuser.feather diff --git a/shinydashboard-medicared/ui.R b/R/apps/shinydashboard-medicared/ui.R similarity index 100% rename from shinydashboard-medicared/ui.R rename to R/apps/shinydashboard-medicared/ui.R diff --git a/R/d4ddrugspending/README.md b/R/d4ddrugspending/README.md new file mode 100644 index 0000000..c2c4e72 --- /dev/null +++ b/R/d4ddrugspending/README.md @@ -0,0 +1,5 @@ +## d4ddrugspending + +Scripts for R functions that can be used across this project (eg, joining two specific datasets). May eventually be combined into an R package. + +Note that data.world has a [R client](https://github.com/datadotworld/data.world-r)! Great for importing datasets directly from our repo there. diff --git a/Lobbying Data/Pharma_Lobby.R b/R/datawrangling/Pharma_Lobby.R similarity index 100% rename from Lobbying Data/Pharma_Lobby.R rename to R/datawrangling/Pharma_Lobby.R diff --git a/Lobbying Data/Pharma_Lobby.csv b/R/datawrangling/Pharma_Lobby.csv similarity index 100% rename from Lobbying Data/Pharma_Lobby.csv rename to R/datawrangling/Pharma_Lobby.csv diff --git a/R/datawrangling/README.md b/R/datawrangling/README.md new file mode 100644 index 0000000..1cd0af6 --- /dev/null +++ b/R/datawrangling/README.md @@ -0,0 +1,5 @@ +## datawrangling + +R scripts for collecting and tidying datasets in preparation for uploading them to data.world. + +Note that data.world has a [R client](https://github.com/datadotworld/data.world-r)! Great for importing datasets directly from our repo there. diff --git a/part_b_spend_clean/output/data_definitons.csv b/R/datawrangling/data_definitons.csv similarity index 100% rename from part_b_spend_clean/output/data_definitons.csv rename to R/datawrangling/data_definitons.csv diff --git a/manufacturers/drug_manufacturer_data_cleaning_2016.R b/R/datawrangling/manufacturers/drug_manufacturer_data_cleaning_2016.R similarity index 100% rename from manufacturers/drug_manufacturer_data_cleaning_2016.R rename to R/datawrangling/manufacturers/drug_manufacturer_data_cleaning_2016.R diff --git a/manufacturers/drug_manufacturer_data_cleaning_2017.R b/R/datawrangling/manufacturers/drug_manufacturer_data_cleaning_2017.R similarity index 100% rename from manufacturers/drug_manufacturer_data_cleaning_2017.R rename to R/datawrangling/manufacturers/drug_manufacturer_data_cleaning_2017.R diff --git a/manufacturers/drug_manufacturer_name_tidy.R b/R/datawrangling/manufacturers/drug_manufacturer_name_tidy.R similarity index 100% rename from manufacturers/drug_manufacturer_name_tidy.R rename to R/datawrangling/manufacturers/drug_manufacturer_name_tidy.R diff --git a/part_b_spend_clean/output/part_b_spend_clean.csv b/R/datawrangling/part_b_spend_clean.csv similarity index 100% rename from part_b_spend_clean/output/part_b_spend_clean.csv rename to R/datawrangling/part_b_spend_clean.csv diff --git a/part_b_spend_clean/R/part_b_spend_clean.r b/R/datawrangling/part_b_spend_clean.r similarity index 100% rename from part_b_spend_clean/R/part_b_spend_clean.r rename to R/datawrangling/part_b_spend_clean.r diff --git a/README.md b/README.md index 4f845d8..eceb19b 100644 --- a/README.md +++ b/README.md @@ -4,29 +4,35 @@ [**Project Leads:**](https://github.com/Data4Democracy/read-this-first/blob/master/lead-role-description.md) @mattgawarecki, @jenniferthompson -**Maintainers (people with commit access)**: TBD +**Maintainers (people with commit access)**: @dhuppenkothen **Project Description:** At its heart, this project seeks to gain a deeper understanding of where and how Medicare tax dollars are being spent. Healthcare is an increasingly important issue for many Americans; the Centers for Medicare and Medicaid Services estimate *over 41 million Americans* were enrolled in Medicare prescription drug coverage programs as of October 2016. Because healthcare spending is a very real concern, we want to make it real -- not just for people who like reading graphs and looking at statistics, but for everybody. We're harnessing the power of data and modern computing to find answers to the questions people keep asking, and to make those answers easily understandable for anyone who wants to know more; questions like: + * Which conditions are we spending the most to treat? * How much are people paying out of their own pockets for prescription drugs? * What could Medicare and the American people do to save money, while also ensuring the same quality of care? -In conducting this research, we hope to gain new insights and create a positive impact for healthcare consumers and providers across the United States. +In conducting this research, we hope to gain new insights and create a positive impact for healthcare consumers and providers across the United States. For more details, head to our [objectives](docs/objectives.md). ## Getting started +If you haven't already, [read this first](https://github.com/Data4Democracy/read-this-first). Then: + ### Things you should know about * **"First-timers" are welcome!** Whether you're trying to learn data science, hone your coding skills, or get started collaborating over the web, we're happy to help. *(Sidenote: with respect to Git and GitHub specifically, our [github-playground](https://github.com/Data4Democracy/github-playground) repo and the [#github-help](https://datafordemocracy.slack.com/messages/github-help/) Slack channel are good places to start.)* -* **We've got (GitHub) Issues.** Ready to dive in and do some good? Check out our issues board. Issues are how we officially keep track of the work we're doing, what we've done, and what we'd like to do next. You can identify different issue types by their tags: - * `first-pr`: smaller issues to cut your teeth on as a first-time contributor - * `beginner-friendly`: issues suitable for those with less experience or in need of mentorship +* **We've got (GitHub) Issues.** Ready to dive in and do some good? Check out our [weekly update](https://docs.google.com/document/d/1azJZBPo9438ZOc73Gq2_AWbciKXgwBXiJk5gUAwGA0c) and our [issues board](https://github.com/Data4Democracy/drug-spending/issues). Issues are how we officially keep track of the work we're doing, what we've done, and what we'd like to do next. If you'd like to work on something, comment on the issue and/or ping a lead on Slack so we can make assignments. + + You can identify different issue types by their tags. If you're new to either Github or data science, pay special attention to: + * `first-pr`: smaller issues to cut your teeth on as a first-time contributor + * `beginner-friendly`: issues suitable for those with less experience or in need of mentorship * **We believe good code is reviewed code.** All commits to this repository are approved by project maintainers and/or leads (listed above). The goal here is *not* to criticize or judge your abilities! Rather, sharing insights and achievements this way ensures that we all continue to learn and grow. Code reviews help us continually refine the project's scope and direction, as well as encourage the discussion we need for it to thrive. * **This README belongs to everyone.** If we've missed some crucial information or left anything unclear, edit this document and submit a pull request. We welcome the feedback! Up-to-date documentation is critical to what we do, and changes like this are a great way to make your first contribution to the project. ### Currently utilized skills Take a look at this list to get an idea of the tools and knowledge we're leveraging. If you're good with any of these, or if you'd like to get better at them, this might be a good project to get involved with! + * **Python 3** (scripting, analysis, Jupyter notebooks, visualization) * **R** (analysis, R Markdown notebooks, visualization) * **JavaScript** (visualization) @@ -35,12 +41,16 @@ Take a look at this list to get an idea of the tools and knowledge we're leverag * **Data analysis** ## FAQ and other useful info + ### Downloading this repository To download the code and data inside this repository, you'll need [Git](https://git-scm.com/). Once you've got the necessary tools, open a command prompt and run `git clone https://github.com/data4democracy/drug-spending.git` to start downloading your own working copy. Once the command finishes, you should see a new `drug-spending` directory in the current directory's file listing. That's where you'll find it! ### Project structure (or, "how do I find `thing`?") -* **Source code and notebooks**: For now, you'll find these in the repository's root directory. This will probably change in the future as we accumulate more files. -* **Data files**: All data files are located in the `/data` directory. At the moment, there is no further hierarchy beyond this; again, as we accumulate more data, this is likely to change. +* **Data**: all our datasets are housed in our [repo on data.world](https://data.world/data4democracy/drug-spending), which both keeps our Github repo streamlined and allows us to take advantage of data.world features like querying and discussion. If you're using R or Python, data.world has query clients for both. ([R client](https://github.com/datadotworld/data.world-r); [Python client](https://github.com/datadotworld/data.world-py)) +* **Documentation**: + * See our [`docs`](docs) directory for general documentation, including more detailed [objectives](docs/objectives.md) and (coming soon) a glossary of terms. We'll add other docs there as we go. + * Our [`datadictionaries`](datadictionaries) directory contains an [overview](datadictionaries/README.md) of our current available datasets, as well as detailed data dictionaries for each and [tips](datadictionaries/README.md) on how to most effectively contribute more data. +* **Source code and notebooks**: We currently have one directory each for Python and R code, with subdirectories for analyses/visualizations; notebooks; apps (eg, Flask/Shiny); and data collection/cleaning scripts. ### Core data sets https://data.world/data4democracy/drug-spending @@ -56,12 +66,3 @@ If you have questions or you'd like to discuss something on your mind, reach out * **An analytical language of your choice** (Python, R, Julia, etc.) * **Python 3** (for Jupyter/`.ipynb` notebook files) * **RStudio** (for R Markdown/`.Rmd` notebook files) - -## Completed goals -* Retrieve and clean [Medicare Part D spending data](https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/Information-on-Prescription-Drugs/2015MedicareData.html) from CMS -* Retrieve a listing of codes that link drugs to their therapeutic use(s) - -## To be completed -* **Link drugs with their therapeutic use(s):** We know which drugs Medicare funding is helping to pay for, but we don't yet have a good idea of which conditions they're being used to treat. Linking these two data points will grant enormous insight into how the American public uses Medicare. -* **More data:** We could really use some more data to give our analyses some depth and relatability. -* ***Lots more ideas to come:*** Join us in [#drug-spending](https://datafordemocracy.slack.com/messages/drug-spending/) on Slack to contribute your ideas! diff --git a/cms/druguse_definitions.ipynb b/cms/druguse_definitions.ipynb deleted file mode 100644 index 2faeaa3..0000000 --- a/cms/druguse_definitions.ipynb +++ /dev/null @@ -1,1484 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# What are the various drugs prescribed for?\n", - "\n", - "We need some kind of knowledge of which drug is prescribed for which condition. Thankfully, CMS seems to have this information." - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "'../data/2010_PD_Profiles_PUF.csv'" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import requests # to download the dataset\n", - "import zipfile # to extract from archive\n", - "import shutil # to write the dataset to file\n", - "import os # rename file to something more type-able\n", - "import numpy as np\n", - "\n", - "data_dir = \"../data/\"\n", - "\n", - "try:\n", - " os.stat(data_dir)\n", - "except FileNotFoundError:\n", - " os.mkdir(data_dir)\n", - " \n", - "url = \"https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/BSAPUFS/Downloads/2010_PD_Profiles_PUF.zip\"\n", - "response = requests.get(url, stream=True)\n", - "\n", - "with open(data_dir + 'drug_profiles_dataset.zip', 'wb') as ds_zipout:\n", - " shutil.copyfileobj(response.raw, ds_zipout)\n", - "\n", - "zip = zipfile.ZipFile(data_dir + 'drug_profiles_dataset.zip', 'r')\n", - "ds_filename = zip.namelist()[0]\n", - "zip.extract(ds_filename, path=data_dir)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's load the data and have a look at what's in it:" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import pandas as pd" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "puf = pd.read_csv(\"../data/2010_PD_Profiles_PUF.csv\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's drop the columns we don't need right now:" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "puf.drop(\"BENE_SEX_IDENT_CD\", axis=1, inplace=True)\n", - "puf.drop(\"BENE_AGE_CAT_CD\", axis=1, inplace=True)\n", - "puf.drop(\"PDE_DRUG_TYPE_CD\", axis=1, inplace=True)\n", - "puf.drop(\"PLAN_TYPE\", axis=1, inplace=True)\n", - "puf.drop([\"COVERAGE_TYPE\", \"benefit_phase\",\"DRUG_BENEFIT_TYPE\",\n", - " \"PRESCRIBER_TYPE\", \"GAP_COVERAGE\", \"TIER_ID\", \"MEAN_RXHCC_SCORE\",\n", - " \"AVE_DAYS_SUPPLY\", \"AVE_TOT_DRUG_COST\", \"AVE_PTNT_PAY_AMT\",\n", - " \"PDE_CNT\", \"BENE_CNT_CAT\"], axis=1, inplace=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "1229" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(puf[\"RXNORM_RXCUI\"].unique())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## RXNorm Identifiers\n", - "\n", - "I need the identifiers for the `RXNORM_RXCUI` column and the `DRUG_MAJOR_CLASS` column.\n", - "\n", - "The former comes from the NIH in the form of a downloadable data table:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "data_dir = '../data/'\n", - "url = \"https://download.nlm.nih.gov/rxnorm/RxNorm_full_prescribe_01032017.zip\"\n", - "response = requests.get(url, stream=True)\n", - "\n", - "with open(data_dir + 'rxnorm_dataset.zip', 'wb') as ds_zipout:\n", - " shutil.copyfileobj(response.raw, ds_zipout)\n", - "\n", - "try:\n", - " os.stat(data_dir+\"rxnorm/\")\n", - "except FileNotFoundError:\n", - " os.mkdir(data_dir+\"rxnorm/\")\n", - " \n", - "zip = zipfile.ZipFile(data_dir + 'rxnorm_dataset.zip', 'r')\n", - "\n", - "ds_filenames = zip.namelist()\n", - "\n", - "for d in ds_filenames:\n", - " zip.extract(d, path=data_dir+\"rxnorm/\")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Columns:\n", - "\n", - "* RXCUI\tRxNorm Unique identifier for concept (concept ID)\n", - "* LAT\tLanguage of Term\n", - "* TS\tTerm status (no value provided)\n", - "* LUI\tUnique identifier for term (no value provided)\n", - "* STT\tString type (no value provided)\n", - "* SUI\tUnique identifier for string (no value provided)\n", - "* ISPREF\tAtom status - preferred (Y) or not (N) for this string within this concept (no value provided)\n", - "* RXAUI\tUnique identifier for atom (RxNorm Atom ID)\n", - "* SAUI\tSource asserted atom identifier [optional]\n", - "* SCUI\tSource asserted concept identifier [optional]\n", - "* SDUI\tSource asserted descriptor identifier [optional]\n", - "* SAB\tSource abbreviation\n", - "* TTY\tTerm type in source\n", - "* CODE\t\"Most useful\" source asserted identifier (if the source vocabulary has more than one identifier), or a RxNorm-generated source entry identifier (if the source vocabulary has none.)\n", - "* STR\tString\n", - "* SRL\tSource Restriction Level (no value provided)\n", - "* SUPPRESS\tSuppressible flag. Values = N, O, Y, or E. N - not suppressible. O - Specific individual names (atoms) set as Obsolete because the name is no longer provided by the original source. Y - Suppressed by RxNorm editor. E - unquantified, non-prescribable drug with related quantified, prescribable drugs. NLM strongly recommends that users not alter editor-assigned suppressibility.\n", - "* CVF" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "names = [\"RXCUI\", \"LAT\", \"TS\", \"LUI\", \"STT\", \"SUI\", \"ISPREF\", \"RXAUI\",\n", - " \"SAUI\", \"SCUI\", \"SDUI\", \"SAB\", \"TTY\", \"CODE\", \"STR\", \"SRL\", \"SUPPRESS\", \"CVF\"]\n", - "\n", - "rxnorm = pd.read_csv(\"../data/rxnorm/rrf/RXNCONSO.RRF\", sep=\"|\", names=names, index_col=False,\n", - " usecols=[0,14])" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RXCUISTR
038Parlodel
144mesna
244MESNA
344Mesna
473Docosahexaenoate
\n", - "
" - ], - "text/plain": [ - " RXCUI STR\n", - "0 38 Parlodel\n", - "1 44 mesna\n", - "2 44 MESNA\n", - "3 44 Mesna\n", - "4 73 Docosahexaenoate" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rxnorm.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RXCUISTR
30703228476GATIFLOXACIN
\n", - "
" - ], - "text/plain": [ - " RXCUI STR\n", - "30703 228476 GATIFLOXACIN" - ] - }, - "execution_count": 9, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rxnorm[rxnorm[\"STR\"] == \"GATIFLOXACIN\"]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We need alll the names to be lowercase:" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "rxnorm[\"STR\"] = rxnorm[\"STR\"].str.lower()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We are going load the generic brand names from the Part D table so we can match them to RXCUI identifiers:" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import feather\n", - "drugnames = feather.read_dataframe('../data/drugnames.feather')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
drugname_branddrugname_generic
010 WASHSULFACETAMIDE SODIUM
11ST TIER UNIFINE PENTIPSPEN NEEDLE, DIABETIC
21ST TIER UNIFINE PENTIPS PLUSPEN NEEDLE, DIABETIC
360PSE-400GFN-20DMGUAIFENESIN/DM/PSEUDOEPHEDRINE
48-MOPMETHOXSALEN
\n", - "
" - ], - "text/plain": [ - " drugname_brand drugname_generic\n", - "0 10 WASH SULFACETAMIDE SODIUM\n", - "1 1ST TIER UNIFINE PENTIPS PEN NEEDLE, DIABETIC\n", - "2 1ST TIER UNIFINE PENTIPS PLUS PEN NEEDLE, DIABETIC\n", - "3 60PSE-400GFN-20DM GUAIFENESIN/DM/PSEUDOEPHEDRINE\n", - "4 8-MOP METHOXSALEN" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "drugnames.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Messing with the Drug Names\n", - "\n", - "Some of the drug names have multiple generic names. We need to pull those apart into their own categories. Also, we're going to transform them all to lowercase letters. " - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "drugnames[\"drugname_generic\"] = drugnames[\"drugname_generic\"].str.lower()\n", - "drugnames[\"drugname_brand\"] = drugnames[\"drugname_brand\"].str.lower()" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
drugname_branddrugname_generic
010 washsulfacetamide sodium
11st tier unifine pentipspen needle, diabetic
21st tier unifine pentips pluspen needle, diabetic
360pse-400gfn-20dmguaifenesin/dm/pseudoephedrine
48-mopmethoxsalen
\n", - "
" - ], - "text/plain": [ - " drugname_brand drugname_generic\n", - "0 10 wash sulfacetamide sodium\n", - "1 1st tier unifine pentips pen needle, diabetic\n", - "2 1st tier unifine pentips plus pen needle, diabetic\n", - "3 60pse-400gfn-20dm guaifenesin/dm/pseudoephedrine\n", - "4 8-mop methoxsalen" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "drugnames.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We need a placeholder for the `RXCUI` values:" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "drugnames[\"RXCUI\"] = \"0.0\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can try to associate the drug names with their `RXCUI` codes:" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "for idx in drugnames.index:\n", - "\n", - " rxcui = []\n", - "\n", - " for c in [\"drugname_generic\", \"drugname_brand\"]:\n", - " \n", - " d = drugnames.loc[idx, c]\n", - " dsplit = d.split(\"/\")\n", - "\n", - " for di in dsplit:\n", - " displit = di.split(\" \")\n", - " v = rxnorm[rxnorm[\"STR\"] == displit[0]]\n", - "\n", - " if len(v) > 0:\n", - " rxcui.extend(v[\"RXCUI\"].unique())\n", - " else:\n", - " continue\n", - "\n", - " if len(rxcui) > 1:\n", - " rxcui_str = \"|\".join(np.array(rxcui, dtype=str))\n", - " \n", - " elif len(rxcui) == 1:\n", - " rxcui_str = str(rxcui[0])\n", - " else:\n", - " rxcui_str = 0.0\n", - " \n", - " drugnames.loc[idx, \"RXCUI\"] = rxcui_str\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "How many am I missing?" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "634" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(drugnames[drugnames[\"RXCUI\"] == 0.0])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "What fraction is that of all drug names?" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "0.14095153401511784" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(drugnames[drugnames[\"RXCUI\"] == 0.0])/len(drugnames)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "14% isn't so bad as a first turn-out." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
drugname_branddrugname_genericRXCUI
11st tier unifine pentipspen needle, diabetic0
21st tier unifine pentips pluspen needle, diabetic0
22accusuresyring w-ndl,disp,insul,0.5 ml0
23accusuresyringe and needle,insulin,1ml0
26acetaminoph-caff-dihydrocodeindhcodeine bt/acetaminophn/caff0
\n", - "
" - ], - "text/plain": [ - " drugname_brand drugname_generic RXCUI\n", - "1 1st tier unifine pentips pen needle, diabetic 0\n", - "2 1st tier unifine pentips plus pen needle, diabetic 0\n", - "22 accusure syring w-ndl,disp,insul,0.5 ml 0\n", - "23 accusure syringe and needle,insulin,1ml 0\n", - "26 acetaminoph-caff-dihydrocodein dhcodeine bt/acetaminophn/caff 0" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "drugnames[drugnames[\"RXCUI\"] == 0.0].head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "This seems to include things like prenatal vitamins, devices (like needles and syringes) and abbreviated names I can't automatically include. \n", - "**I am going to ignore this for the moment, but we should fix this in the long run!**\n", - "\n", - "## Associating Drug Classes\n", - "\n", - "Drug classes come originally from the Veteran's Health Administration [National Drug File](http://www.pbm.va.gov/PBM/nationalformulary/NDF_January_2016.xlsx). It turns out, they're also listed in the PUF SAS manual. Go figure:\n" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "data_dir = '../data/'\n", - "url = \"https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/BSAPUFS/Downloads/2010_PD_Profiles_PUF_DUG.zip\"\n", - "response = requests.get(url, stream=True)\n", - "\n", - "with open(data_dir + 'drug_classes_dataset.zip', 'wb') as ds_zipout:\n", - " shutil.copyfileobj(response.raw, ds_zipout)\n", - "\n", - "zip = zipfile.ZipFile(data_dir + 'drug_classes_dataset.zip', 'r')\n", - "ds_filenames = zip.namelist()\n", - "for f in ds_filenames:\n", - " zip.extract(f, path=data_dir)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "drug_major_class = pd.read_csv(data_dir+\"DRUG_MAJOR_CLASS_TABLE.csv\")" - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
drug_major_classdrug_major_class_desc
00UNKNOWN/MISSING
1AD000ANTIDOTES,DETERRENTS AND POISON CONTROL
2AH000ANTIHISTAMINES
3AM000ANTIMICROBIALS
4AN000ANTINEOPLASTICS
\n", - "
" - ], - "text/plain": [ - " drug_major_class drug_major_class_desc\n", - "0 0 UNKNOWN/MISSING\n", - "1 AD000 ANTIDOTES,DETERRENTS AND POISON CONTROL\n", - "2 AH000 ANTIHISTAMINES\n", - "3 AM000 ANTIMICROBIALS\n", - "4 AN000 ANTINEOPLASTICS" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "drug_major_class.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "drug_class = pd.read_csv(data_dir+\"DRUG_CLASS_TABLE.csv\")" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
drug_classdrug_class_desc
00UNKNOWN/MISSING
1AD100ALCOHOL DETERRENTS
2AD200CYANIDE ANTIDOTES
3AD300HEAVY METAL ANTAGONISTS
4AD400ANTIDOTES,DETERRENTS,AND POISON CONTROL EXCHAN...
\n", - "
" - ], - "text/plain": [ - " drug_class drug_class_desc\n", - "0 0 UNKNOWN/MISSING\n", - "1 AD100 ALCOHOL DETERRENTS\n", - "2 AD200 CYANIDE ANTIDOTES\n", - "3 AD300 HEAVY METAL ANTAGONISTS\n", - "4 AD400 ANTIDOTES,DETERRENTS,AND POISON CONTROL EXCHAN..." - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "drug_class.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "drug_class.replace(to_replace=np.nan, value=\"N/A\", inplace=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Okay, cool, I think that's all the information I need!\n", - "\n", - "## Adding Drug classes to the Drug information Table\n", - "\n", - "We can now use the available information to add a column `drug_major_class` and `drug_class` to the `drugnames` table for use in identification and visualization.\n", - "\n", - "To revise, I have four tables:" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
drugname_branddrugname_genericRXCUI
010 washsulfacetamide sodium10169
11st tier unifine pentipspen needle, diabetic0
21st tier unifine pentips pluspen needle, diabetic0
360pse-400gfn-20dmguaifenesin/dm/pseudoephedrine5032|8896
48-mopmethoxsalen6854|227713
\n", - "
" - ], - "text/plain": [ - " drugname_brand drugname_generic RXCUI\n", - "0 10 wash sulfacetamide sodium 10169\n", - "1 1st tier unifine pentips pen needle, diabetic 0\n", - "2 1st tier unifine pentips plus pen needle, diabetic 0\n", - "3 60pse-400gfn-20dm guaifenesin/dm/pseudoephedrine 5032|8896\n", - "4 8-mop methoxsalen 6854|227713" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "drugnames.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "With the brand names, the generic names and the RxNorm identifier of the drug. " - ] - }, - { - "cell_type": "code", - "execution_count": 27, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
RXNORM_RXCUIDRUG_MAJOR_CLASSDRUG_CLASS
0000
1000
2000
3000
4000
\n", - "
" - ], - "text/plain": [ - " RXNORM_RXCUI DRUG_MAJOR_CLASS DRUG_CLASS\n", - "0 0 0 0\n", - "1 0 0 0\n", - "2 0 0 0\n", - "3 0 0 0\n", - "4 0 0 0" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "puf.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "with the RxNorm values as well as major/minor classes of the drug. \n", - "\n", - "And finally, " - ] - }, - { - "cell_type": "code", - "execution_count": 28, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
drug_major_classdrug_major_class_desc
00UNKNOWN/MISSING
1AD000ANTIDOTES,DETERRENTS AND POISON CONTROL
2AH000ANTIHISTAMINES
3AM000ANTIMICROBIALS
4AN000ANTINEOPLASTICS
\n", - "
" - ], - "text/plain": [ - " drug_major_class drug_major_class_desc\n", - "0 0 UNKNOWN/MISSING\n", - "1 AD000 ANTIDOTES,DETERRENTS AND POISON CONTROL\n", - "2 AH000 ANTIHISTAMINES\n", - "3 AM000 ANTIMICROBIALS\n", - "4 AN000 ANTINEOPLASTICS" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "drug_major_class.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "and " - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
drug_classdrug_class_desc
00UNKNOWN/MISSING
1AD100ALCOHOL DETERRENTS
2AD200CYANIDE ANTIDOTES
3AD300HEAVY METAL ANTAGONISTS
4AD400ANTIDOTES,DETERRENTS,AND POISON CONTROL EXCHAN...
\n", - "
" - ], - "text/plain": [ - " drug_class drug_class_desc\n", - "0 0 UNKNOWN/MISSING\n", - "1 AD100 ALCOHOL DETERRENTS\n", - "2 AD200 CYANIDE ANTIDOTES\n", - "3 AD300 HEAVY METAL ANTAGONISTS\n", - "4 AD400 ANTIDOTES,DETERRENTS,AND POISON CONTROL EXCHAN..." - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "drug_class.head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "have the identifiers for the major and minor drug classes.\n", - "\n", - "I'm going to add four columns to `drugnames`, one for each major and minor drug class, and one for the string representations of those classes, which will make the table bigger, but easier to use in the long term." - ] - }, - { - "cell_type": "code", - "execution_count": 30, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "drugnames[\"drug_major_class\"] = \"\"\n", - "drugnames[\"dmc_string\"] = \"\"\n", - "drugnames[\"drug_class\"] = \"\"\n", - "drugnames[\"dc_string\"] = \"\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "It looks like there are a bunch of drug classes that don't match between the drug classes in the key and the drug classes in the table. Because of course there are. \n", - "**For now, any drug class we don't have an explanation for will be considered missing!**\n", - "\n", - "How many are those?" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "drugnames[\"RXCUI\"] = drugnames[\"RXCUI\"].astype(str)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "for idx in drugnames.index:\n", - "\n", - " drug_rxcui = drugnames.loc[idx, \"RXCUI\"].split(\"|\")\n", - " dmc, dc = [], []\n", - " for rxcui in drug_rxcui:\n", - " r = puf[puf[\"RXNORM_RXCUI\"] == np.float(rxcui)]\n", - "\n", - " rxc = r.loc[r.index, \"RXNORM_RXCUI\"].unique()\n", - "\n", - " dmc.extend(r.loc[r.index, \"DRUG_MAJOR_CLASS\"].unique())\n", - " dc.extend(r.loc[r.index, \"DRUG_CLASS\"].unique())\n", - "\n", - "\n", - " dmc = np.unique(dmc)\n", - " dc = np.unique(dc)\n", - "\n", - " if len(dmc) != 0:\n", - " drugnames.loc[idx, \"drug_major_class\"] = \"|\".join(dmc)\n", - " dmc_name = np.hstack([drug_major_class.loc[drug_major_class[\"drug_major_class\"] == d, \n", - " \"drug_major_class_desc\"].values for d in dmc])\n", - " drugnames.loc[idx, \"dmc_name\"] = \"|\".join(dmc_name)\n", - "\n", - " else:\n", - " drugnames.loc[idx, \"drug_major_class\"] = \"0\"\n", - " drugnames.loc[idx, \"dmc_name\"] = \"0\"\n", - "\n", - " if len(dc) != 0:\n", - " drugnames.loc[idx, \"drug_class\"] = \"|\".join(dc)\n", - " dc_name = np.hstack([drug_class.loc[drug_class[\"drug_class\"] == d, \n", - " \"drug_class_desc\"].values for d in dc]) \n", - "\n", - " drugnames.loc[idx, \"dc_name\"] = \"|\".join(dc_name)\n", - " else:\n", - " drugnames.loc[idx, \"drug_class\"] = \"0\"\n", - " drugnames.loc[idx, \"dc_name\"] = \"0\"\n" - ] - }, - { - "cell_type": "code", - "execution_count": 33, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
drugname_branddrugname_genericRXCUIdrug_major_classdmc_stringdrug_classdc_stringdmc_namedc_name
010 washsulfacetamide sodium101690|DE000|OP0000|DE101|OP210UNKNOWN/MISSING|DERMATOLOGICAL AGENTS|OPHTHALM...UNKNOWN/MISSING|ANTI-INFECTIVE,TOPICAL|ANTI-IN...
11st tier unifine pentipspen needle, diabetic0.000UNKNOWN/MISSINGUNKNOWN/MISSING
21st tier unifine pentips pluspen needle, diabetic0.000UNKNOWN/MISSINGUNKNOWN/MISSING
360pse-400gfn-20dmguaifenesin/dm/pseudoephedrine5032|8896RE000RE200|RE302RESPIRATORY TRACT MEDICATIONSDECONGESTANTS,SYSTEMIC|ANTITUSSIVES/EXPECTORANTS
48-mopmethoxsalen6854|227713DE000DE810DERMATOLOGICAL AGENTSANTIPSORIATIC
\n", - "
" - ], - "text/plain": [ - " drugname_brand drugname_generic RXCUI \\\n", - "0 10 wash sulfacetamide sodium 10169 \n", - "1 1st tier unifine pentips pen needle, diabetic 0.0 \n", - "2 1st tier unifine pentips plus pen needle, diabetic 0.0 \n", - "3 60pse-400gfn-20dm guaifenesin/dm/pseudoephedrine 5032|8896 \n", - "4 8-mop methoxsalen 6854|227713 \n", - "\n", - " drug_major_class dmc_string drug_class dc_string \\\n", - "0 0|DE000|OP000 0|DE101|OP210 \n", - "1 0 0 \n", - "2 0 0 \n", - "3 RE000 RE200|RE302 \n", - "4 DE000 DE810 \n", - "\n", - " dmc_name \\\n", - "0 UNKNOWN/MISSING|DERMATOLOGICAL AGENTS|OPHTHALM... \n", - "1 UNKNOWN/MISSING \n", - "2 UNKNOWN/MISSING \n", - "3 RESPIRATORY TRACT MEDICATIONS \n", - "4 DERMATOLOGICAL AGENTS \n", - "\n", - " dc_name \n", - "0 UNKNOWN/MISSING|ANTI-INFECTIVE,TOPICAL|ANTI-IN... \n", - "1 UNKNOWN/MISSING \n", - "2 UNKNOWN/MISSING \n", - "3 DECONGESTANTS,SYSTEMIC|ANTITUSSIVES/EXPECTORANTS \n", - "4 ANTIPSORIATIC " - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "drugnames.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Serialize drug names to feather file for use in both Python and R\n", - "import feather\n", - "feather.write_dataframe(drugnames, data_dir + 'drugnames_withclasses.feather')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.3" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/cms/part-d_clean_and_separate_data.ipynb b/cms/part-d_clean_and_separate_data.ipynb deleted file mode 100644 index 0be84b9..0000000 --- a/cms/part-d_clean_and_separate_data.ipynb +++ /dev/null @@ -1,309 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Medicare Part D Drug Spending Data Downloading, extracting, and cleaning" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import requests # to download the dataset\n", - "import zipfile # to extract from archive\n", - "import shutil # to write the dataset to file\n", - "import os # rename file to something more type-able\n", - "import pandas as pd\n", - "import numpy as np\n", - "\n", - "url = 'https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/Information-on-Prescription-Drugs/Downloads/Part_D_All_Drugs_2015.zip'\n", - "response = requests.get(url, stream=True)\n", - "\n", - "zip_filename = 'dataset.zip'\n", - "with open(zip_filename, 'wb') as ds_zipout:\n", - " shutil.copyfileobj(response.raw, ds_zipout)\n", - "\n", - "zip = zipfile.ZipFile(zip_filename, 'r')\n", - "xls_filename = zip.namelist()[0]\n", - "zip.extract(xls_filename)\n", - "\n", - "os.remove(zip_filename)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We're going to read the data into a `pandas.DataFrame`, but because the data is in several work sheets, we need to read out the right work sheet:" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "xls = pd.ExcelFile(xls_filename)\n", - "df = xls.parse('Data', skiprows=3)\n", - "df.index = np.arange(1, len(df) + 1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we need to start capturing relevant data. The easiest way to start is by getting a list of prescribed drug names, both brand and generic." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Capture ONLY the drug names (the first two columns)\n", - "df_drugnames = df.iloc[:, :2]\n", - "df_drugnames.columns = [\n", - " 'drugname_brand',\n", - " 'drugname_generic'\n", - "]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The drug names may contain leading or trailing whitespace in their \"raw\" state direct from the XLSX file; let's scrub that whitespace." - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Strip extraneous whitespace from drug names\n", - "df_drugnames.loc[:, 'drugname_brand'] = df_drugnames.loc[:, 'drugname_brand'].map(lambda x: x.strip())\n", - "df_drugnames.loc[:, 'drugname_generic'] = df_drugnames.loc[:, 'drugname_generic'].map(lambda x: x.strip())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now that this portion of the data is clean, we can safely write it out to both feather and CSV files." - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Write to feather ...\n", - "import feather\n", - "feather.write_dataframe(df_drugnames, 'drugnames.feather')\n", - "\n", - "# Now write to CSV ...\n", - "df_drugnames.to_csv('drugnames.csv', index=False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Okay! With drug names, out of the way, we can concentrate on annual spending data.\n", - "\n", - "We can parse out spending for each year by extracting their corresponding column ranges in the XLS. After we do that, it's easy to add back the drug names we just gathered. That way, people don't have to reference two DataFrames every time they want to track drug spending for a given year." - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Separate column groups by year\n", - "cols_by_year = [\n", - " { 'year': 2011, 'start': 2, 'end': 12 },\n", - " { 'year': 2012, 'start': 12, 'end': 22 },\n", - " { 'year': 2013, 'start': 22, 'end': 32 },\n", - " { 'year': 2014, 'start': 32, 'end': 42 },\n", - " { 'year': 2015, 'start': 42, 'end': 53 },\n", - "]\n", - "\n", - "df_years = {}\n", - "\n", - "col_brandname = 0\n", - "col_genericname = 1\n", - "for cols in cols_by_year:\n", - " year, start, end = cols['year'], cols['start'], cols['end']\n", - "\n", - " df_years[year] = pd.concat(\n", - " [\n", - " df_drugnames,\n", - " df.iloc[:, start:end]\n", - " ],\n", - " axis=1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's go ahead and remove the final column of the 2015 data (\"Annual Change in Average Cost per Unit\"). None of the other years have it, so it doesn't give us a lot of opportunity for comparison and analysis; plus, it's only available for drugs used at least 1,000 beneficiaries." - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "df_years[2015] = df_years[2015].drop(df_years[2015].columns[-1], axis=1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "From year to year, the list of prescribed drugs changes; some are added, and some are removed. We should probably get rid of any rows where that drug was not prescribed, just to reduce noise in our data." - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "for year in df_years:\n", - " nonnull_rows = df_years[year].iloc[:, 2:].apply(lambda x: x.notnull().any(), axis=1)\n", - " df_years[year] = df_years[year][nonnull_rows]\n", - " df_years[year].index = np.arange(1, len(df_years[year]) + 1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's make our column names easier to type and not year-specific, while still retaining most of their original meanings." - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "generic_columns = [\n", - " \"drugname_brand\",\n", - " \"drugname_generic\",\n", - " \"claim_count\",\n", - " \"total_spending\",\n", - " \"user_count\",\n", - " \"total_spending_per_user\",\n", - " \"unit_count\",\n", - " \"unit_cost_wavg\",\n", - " \"user_count_non_lowincome\",\n", - " \"out_of_pocket_avg_non_lowincome\",\n", - " \"user_count_lowincome\",\n", - " \"out_of_pocket_avg_lowincome\"\n", - "]\n", - "\n", - "for year in df_years:\n", - " df_years[year].columns = generic_columns" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "All fields in the annual spending data -- excluding drug names -- are numeric. Let's make sure pandas knows this, because otherwise we'll have trouble writing the data to feather and CSV." - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Suppress SettingWithCopyWarnings because I think it's\n", - "# tripping on the fact that we have a dict of DataFrames\n", - "pd.options.mode.chained_assignment = None\n", - "for year in df_years:\n", - " # Ignore the first two columns, which are strings and contain drug names\n", - " for col in df_years[year].columns[2:]:\n", - " df_years[year].loc[:, col] = pd.to_numeric(df_years[year][col])\n", - "pd.options.mode.chained_assignment = 'warn'" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "All done cleaning the annual spending data! Let's write to disk in feather and CSV format" - ] - }, - { - "cell_type": "code", - "execution_count": 29, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Write each year's data\n", - "for year in df_years:\n", - " # To feather ...\n", - " feather.write_dataframe(df_years[year], 'spending-{year}.feather'.format(year=year))\n", - " # And to CSV ...\n", - " df_years[year].to_csv('spending-{year}.csv'.format(year=year), index=False)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/cms/part-d_exploration_tutorial.ipynb b/cms/part-d_exploration_tutorial.ipynb deleted file mode 100644 index 5104234..0000000 --- a/cms/part-d_exploration_tutorial.ipynb +++ /dev/null @@ -1,2310 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Necessary libs\n", - "import requests # download data files from data.world\n", - "import os # delete downloaded files after parsing/loading\n", - "import feather # import data from file\n", - "import pandas as pd, numpy as np # data structures and analysis\n", - "\n", - "import matplotlib.pyplot as plt # graphical plotting\n", - "plt.style.use('ggplot') # Pretty style" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
drugname_branddrugname_generic
010 WASHSULFACETAMIDE SODIUM
11ST TIER UNIFINE PENTIPSPEN NEEDLE, DIABETIC
21ST TIER UNIFINE PENTIPS PLUSPEN NEEDLE, DIABETIC
360PSE-400GFN-20DMGUAIFENESIN/DM/PSEUDOEPHEDRINE
48-MOPMETHOXSALEN
5A-B OTICANTIPYRINE/BENZOCAINE
6ABACAVIRABACAVIR SULFATE
7ABACAVIR-LAMIVUDINE-ZIDOVUDINEABACAVIR/LAMIVUDINE/ZIDOVUDINE
8ABELCETAMPHOTERICIN B LIPID COMPLEX
9ABILIFYARIPIPRAZOLE
10ABILIFY DISCMELTARIPIPRAZOLE
11ABILIFY MAINTENAARIPIPRAZOLE
12ABRAXANEPACLITAXEL PROTEIN-BOUND
13ABSORICAISOTRETINOIN
14ABSTRALFENTANYL CITRATE
15ACAMPROSATE CALCIUMACAMPROSATE CALCIUM
16ACANYACLINDAMYCIN PHOS/BENZOYL PEROX
17ACARBOSEACARBOSE
18ACCOLATEZAFIRLUKAST
19ACCUNEBALBUTEROL SULFATE
20ACCUPRILQUINAPRIL HCL
21ACCURETICQUINAPRIL/HYDROCHLOROTHIAZIDE
22ACCUSURESYRING W-NDL,DISP,INSUL,0.5 ML
23ACCUSURESYRINGE AND NEEDLE,INSULIN,1ML
24ACEBUTOLOL HCLACEBUTOLOL HCL
25ACEONPERINDOPRIL ERBUMINE
26ACETAMINOPH-CAFF-DIHYDROCODEINDHCODEINE BT/ACETAMINOPHN/CAFF
27ACETAMINOPHEN-CODEINEACETAMINOPHEN WITH CODEINE
28ACETASOL HCACETIC ACID/HYDROCORTISONE
29ACETAZOLAMIDEACETAZOLAMIDE
.........
4468ZORTRESSEVEROLIMUS
4469ZORVOLEXDICLOFENAC SUBMICRONIZED
4470ZOSTAVAXZOSTER VACCINE LIVE/PF
4471ZOSYNPIPERACILLIN SODIUM/TAZOBACTAM
4472ZOSYNPIPERACILLIN-TAZO-DEXTROSE,ISO
4473ZOVIA 1-35EETHYNODIOL D-ETHINYL ESTRADIOL
4474ZOVIA 1-50EETHYNODIOL D-ETHINYL ESTRADIOL
4475ZOVIRAXACYCLOVIR
4476Z-TUSS ACCHLORPHENIRAMINE/CODEINE PHOS
4477Z-TUSS DMGUAIFENESIN/D-METHORPHAN HB/PE
4478ZUBSOLVBUPRENORPHINE HCL/NALOXONE HCL
4479ZUPLENZONDANSETRON
4480ZUTRIPROHYDROCODONE/CPM/PSEUDOEPHED
4481ZYBANBUPROPION HCL
4482ZYCLARAIMIQUIMOD
4483ZYDELIGIDELALISIB
4484ZYDONEHYDROCODONE/ACETAMINOPHEN
4485ZYFLOZILEUTON
4486ZYFLO CRZILEUTON
4487ZYKADIACERITINIB
4488ZYLETTOBRAMYCIN/LOTEPRED ETAB
4489ZYLOPRIMALLOPURINOL
4490ZYMARGATIFLOXACIN
4491ZYMAXIDGATIFLOXACIN
4492ZYPREXAOLANZAPINE
4493ZYPREXA RELPREVVOLANZAPINE PAMOATE
4494ZYPREXA ZYDISOLANZAPINE
4495ZYRTEC-DCETIRIZINE HCL/PSEUDOEPHEDRINE
4496ZYTIGAABIRATERONE ACETATE
4497ZYVOXLINEZOLID
\n", - "

4498 rows × 2 columns

\n", - "
" - ], - "text/plain": [ - " drugname_brand drugname_generic\n", - "0 10 WASH SULFACETAMIDE SODIUM \n", - "1 1ST TIER UNIFINE PENTIPS PEN NEEDLE, DIABETIC \n", - "2 1ST TIER UNIFINE PENTIPS PLUS PEN NEEDLE, DIABETIC \n", - "3 60PSE-400GFN-20DM GUAIFENESIN/DM/PSEUDOEPHEDRINE \n", - "4 8-MOP METHOXSALEN \n", - "5 A-B OTIC ANTIPYRINE/BENZOCAINE \n", - "6 ABACAVIR ABACAVIR SULFATE \n", - "7 ABACAVIR-LAMIVUDINE-ZIDOVUDINE ABACAVIR/LAMIVUDINE/ZIDOVUDINE \n", - "8 ABELCET AMPHOTERICIN B LIPID COMPLEX \n", - "9 ABILIFY ARIPIPRAZOLE \n", - "10 ABILIFY DISCMELT ARIPIPRAZOLE \n", - "11 ABILIFY MAINTENA ARIPIPRAZOLE \n", - "12 ABRAXANE PACLITAXEL PROTEIN-BOUND \n", - "13 ABSORICA ISOTRETINOIN \n", - "14 ABSTRAL FENTANYL CITRATE \n", - "15 ACAMPROSATE CALCIUM ACAMPROSATE CALCIUM \n", - "16 ACANYA CLINDAMYCIN PHOS/BENZOYL PEROX \n", - "17 ACARBOSE ACARBOSE \n", - "18 ACCOLATE ZAFIRLUKAST \n", - "19 ACCUNEB ALBUTEROL SULFATE \n", - "20 ACCUPRIL QUINAPRIL HCL \n", - "21 ACCURETIC QUINAPRIL/HYDROCHLOROTHIAZIDE \n", - "22 ACCUSURE SYRING W-NDL,DISP,INSUL,0.5 ML \n", - "23 ACCUSURE SYRINGE AND NEEDLE,INSULIN,1ML \n", - "24 ACEBUTOLOL HCL ACEBUTOLOL HCL \n", - "25 ACEON PERINDOPRIL ERBUMINE \n", - "26 ACETAMINOPH-CAFF-DIHYDROCODEIN DHCODEINE BT/ACETAMINOPHN/CAFF \n", - "27 ACETAMINOPHEN-CODEINE ACETAMINOPHEN WITH CODEINE \n", - "28 ACETASOL HC ACETIC ACID/HYDROCORTISONE \n", - "29 ACETAZOLAMIDE ACETAZOLAMIDE \n", - "... ... ...\n", - "4468 ZORTRESS EVEROLIMUS \n", - "4469 ZORVOLEX DICLOFENAC SUBMICRONIZED \n", - "4470 ZOSTAVAX ZOSTER VACCINE LIVE/PF \n", - "4471 ZOSYN PIPERACILLIN SODIUM/TAZOBACTAM \n", - "4472 ZOSYN PIPERACILLIN-TAZO-DEXTROSE,ISO \n", - "4473 ZOVIA 1-35E ETHYNODIOL D-ETHINYL ESTRADIOL \n", - "4474 ZOVIA 1-50E ETHYNODIOL D-ETHINYL ESTRADIOL \n", - "4475 ZOVIRAX ACYCLOVIR \n", - "4476 Z-TUSS AC CHLORPHENIRAMINE/CODEINE PHOS \n", - "4477 Z-TUSS DM GUAIFENESIN/D-METHORPHAN HB/PE \n", - "4478 ZUBSOLV BUPRENORPHINE HCL/NALOXONE HCL \n", - "4479 ZUPLENZ ONDANSETRON \n", - "4480 ZUTRIPRO HYDROCODONE/CPM/PSEUDOEPHED \n", - "4481 ZYBAN BUPROPION HCL \n", - "4482 ZYCLARA IMIQUIMOD \n", - "4483 ZYDELIG IDELALISIB \n", - "4484 ZYDONE HYDROCODONE/ACETAMINOPHEN \n", - "4485 ZYFLO ZILEUTON \n", - "4486 ZYFLO CR ZILEUTON \n", - "4487 ZYKADIA CERITINIB \n", - "4488 ZYLET TOBRAMYCIN/LOTEPRED ETAB \n", - "4489 ZYLOPRIM ALLOPURINOL \n", - "4490 ZYMAR GATIFLOXACIN \n", - "4491 ZYMAXID GATIFLOXACIN \n", - "4492 ZYPREXA OLANZAPINE \n", - "4493 ZYPREXA RELPREVV OLANZAPINE PAMOATE \n", - "4494 ZYPREXA ZYDIS OLANZAPINE \n", - "4495 ZYRTEC-D CETIRIZINE HCL/PSEUDOEPHEDRINE \n", - "4496 ZYTIGA ABIRATERONE ACETATE \n", - "4497 ZYVOX LINEZOLID \n", - "\n", - "[4498 rows x 2 columns]" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Load up drug names data\n", - "def download_drugnames():\n", - " filename = 'drugnames.feather'\n", - " resp = requests.get('https://query.data.world/s/a0rj42sc17vhn7cyejxtyy8kv')\n", - " resp.raise_for_status()\n", - "\n", - " with open(filename, 'wb') as handle:\n", - " for block in resp.iter_content(1024):\n", - " handle.write(block)\n", - "\n", - " out = feather.read_dataframe(filename)\n", - " os.remove(filename)\n", - " return out\n", - " \n", - "df_drugnames = download_drugnames()\n", - "df_drugnames" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "{2011: drugname_brand drugname_generic \\\n", - " 0 10 WASH SULFACETAMIDE SODIUM \n", - " 1 1ST TIER UNIFINE PENTIPS PEN NEEDLE, DIABETIC \n", - " 2 60PSE-400GFN-20DM GUAIFENESIN/DM/PSEUDOEPHEDRINE \n", - " 3 8-MOP METHOXSALEN \n", - " 4 A-B OTIC ANTIPYRINE/BENZOCAINE \n", - " 5 ABELCET AMPHOTERICIN B LIPID COMPLEX \n", - " 6 ABILIFY ARIPIPRAZOLE \n", - " 7 ABILIFY DISCMELT ARIPIPRAZOLE \n", - " 8 ABRAXANE PACLITAXEL PROTEIN-BOUND \n", - " 9 ABSTRAL FENTANYL CITRATE \n", - " 10 ACANYA CLINDAMYCIN PHOS/BENZOYL PEROX \n", - " 11 ACARBOSE ACARBOSE \n", - " 12 ACCOLATE ZAFIRLUKAST \n", - " 13 ACCUNEB ALBUTEROL SULFATE \n", - " 14 ACCUPRIL QUINAPRIL HCL \n", - " 15 ACCURETIC QUINAPRIL/HYDROCHLOROTHIAZIDE \n", - " 16 ACCUSURE SYRING W-NDL,DISP,INSUL,0.5 ML \n", - " 17 ACCUSURE SYRINGE AND NEEDLE,INSULIN,1ML \n", - " 18 ACEBUTOLOL HCL ACEBUTOLOL HCL \n", - " 19 ACEON PERINDOPRIL ERBUMINE \n", - " 20 ACETAMINOPH-CAFF-DIHYDROCODEIN DHCODEINE BT/ACETAMINOPHN/CAFF \n", - " 21 ACETAMINOPHEN-CODEINE ACETAMINOPHEN WITH CODEINE \n", - " 22 ACETASOL HC ACETIC ACID/HYDROCORTISONE \n", - " 23 ACETAZOLAMIDE ACETAZOLAMIDE \n", - " 24 ACETIC ACID ACETIC ACID \n", - " 25 ACETIC ACID-ALUMINUM ACETIC ACID/ALUMINUM ACETATE \n", - " 26 ACETYLCYSTEINE ACETYLCYSTEINE \n", - " 27 ACID JELLY ACETIC AC/RICINOLEIC/OXYQUINOL \n", - " 28 ACIPHEX RABEPRAZOLE SODIUM \n", - " 29 ACLOVATE ALCLOMETASONE DIPROPIONATE \n", - " ... ... ... \n", - " 3553 ZONATUSS BENZONATATE \n", - " 3554 ZONEGRAN ZONISAMIDE \n", - " 3555 ZONISAMIDE ZONISAMIDE \n", - " 3556 ZORBTIVE SOMATROPIN \n", - " 3557 ZORTRESS EVEROLIMUS \n", - " 3558 ZOSTAVAX ZOSTER VACCINE LIVE/PF \n", - " 3559 ZOSYN PIPERACILLIN SODIUM/TAZOBACTAM \n", - " 3560 ZOSYN PIPERACILLIN-TAZO-DEXTROSE,ISO \n", - " 3561 ZOVIA 1-35E ETHYNODIOL D-ETHINYL ESTRADIOL \n", - " 3562 ZOVIA 1-50E ETHYNODIOL D-ETHINYL ESTRADIOL \n", - " 3563 ZOVIRAX ACYCLOVIR \n", - " 3564 Z-TUSS AC CHLORPHENIRAMINE/CODEINE PHOS \n", - " 3565 Z-TUSS DM GUAIFENESIN/D-METHORPHAN HB/PE \n", - " 3566 ZUPLENZ ONDANSETRON \n", - " 3567 ZUTRIPRO HYDROCODONE/CPM/PSEUDOEPHED \n", - " 3568 ZYBAN BUPROPION HCL \n", - " 3569 ZYCLARA IMIQUIMOD \n", - " 3570 ZYDONE HYDROCODONE/ACETAMINOPHEN \n", - " 3571 ZYFLO ZILEUTON \n", - " 3572 ZYFLO CR ZILEUTON \n", - " 3573 ZYLET TOBRAMYCIN/LOTEPRED ETAB \n", - " 3574 ZYLOPRIM ALLOPURINOL \n", - " 3575 ZYMAR GATIFLOXACIN \n", - " 3576 ZYMAXID GATIFLOXACIN \n", - " 3577 ZYPREXA OLANZAPINE \n", - " 3578 ZYPREXA RELPREVV OLANZAPINE PAMOATE \n", - " 3579 ZYPREXA ZYDIS OLANZAPINE \n", - " 3580 ZYRTEC-D CETIRIZINE HCL/PSEUDOEPHEDRINE \n", - " 3581 ZYTIGA ABIRATERONE ACETATE \n", - " 3582 ZYVOX LINEZOLID \n", - " \n", - " claim_count total_spending user_count total_spending_per_user \\\n", - " 0 24 1.569190e+03 16.0 98.074375 \n", - " 1 2472 5.766673e+04 893.0 64.576405 \n", - " 2 12 3.501000e+02 11.0 31.827273 \n", - " 3 11 9.003260e+03 NaN NaN \n", - " 4 30 2.128600e+02 29.0 7.340000 \n", - " 5 363 4.555661e+05 97.0 4696.557732 \n", - " 6 2447965 1.469661e+09 360675.0 4074.751793 \n", - " 7 4677 3.929706e+06 961.0 4089.183975 \n", - " 8 233 9.507034e+05 51.0 18641.242745 \n", - " 9 82 1.238138e+05 32.0 3869.182188 \n", - " 10 432 8.953996e+04 289.0 309.826851 \n", - " 11 171071 1.169336e+07 32843.0 356.038201 \n", - " 12 21924 2.619497e+06 6409.0 408.721693 \n", - " 13 120 7.415180e+03 90.0 82.390889 \n", - " 14 8052 7.678249e+05 1786.0 429.913152 \n", - " 15 870 8.047508e+04 209.0 385.048230 \n", - " 16 889 1.618152e+04 326.0 49.636564 \n", - " 17 768 1.354321e+04 269.0 50.346506 \n", - " 18 127745 3.499407e+06 20981.0 166.789355 \n", - " 19 2605 2.878742e+05 685.0 420.254336 \n", - " 20 4997 4.845722e+05 1582.0 306.303515 \n", - " 21 2803822 3.753617e+07 1192417.0 31.479062 \n", - " 22 4607 8.549517e+05 3546.0 241.103142 \n", - " 23 225803 1.289488e+07 73929.0 174.422519 \n", - " 24 44440 1.267348e+06 22923.0 55.287196 \n", - " 25 5859 3.684252e+05 4271.0 86.262044 \n", - " 26 35634 1.555543e+06 14055.0 110.675383 \n", - " 27 229 8.237440e+03 136.0 60.569412 \n", - " 28 404412 1.318898e+08 88282.0 1493.960407 \n", - " 29 61 4.452640e+03 48.0 92.763333 \n", - " ... ... ... ... ... \n", - " 3553 55 3.225550e+03 47.0 68.628723 \n", - " 3554 12513 6.092836e+06 1577.0 3863.561496 \n", - " 3555 264225 1.381649e+07 38199.0 361.697651 \n", - " 3556 24 2.140475e+05 NaN NaN \n", - " 3557 270 4.180488e+05 63.0 6635.695238 \n", - " 3558 606802 1.081848e+08 602389.0 179.592951 \n", - " 3559 7191 2.223030e+06 2883.0 771.082116 \n", - " 3560 6063 1.702028e+06 2137.0 796.456752 \n", - " 3561 6902 2.147885e+05 1048.0 204.950830 \n", - " 3562 2081 6.656411e+04 307.0 216.821205 \n", - " 3563 181033 4.721575e+07 116512.0 405.243689 \n", - " 3564 36 6.401900e+02 25.0 25.607600 \n", - " 3565 24 5.873100e+02 23.0 25.535217 \n", - " 3566 334 8.283146e+04 195.0 424.776718 \n", - " 3567 49 4.128060e+03 49.0 84.246122 \n", - " 3568 183 3.452112e+04 107.0 322.627290 \n", - " 3569 10775 6.406633e+06 9117.0 702.712858 \n", - " 3570 1258 1.128107e+05 356.0 316.884101 \n", - " 3571 484 2.632957e+05 200.0 1316.478300 \n", - " 3572 7478 5.142822e+06 1750.0 2938.755543 \n", - " 3573 42747 5.397254e+06 31159.0 173.216529 \n", - " 3574 1759 1.197912e+05 426.0 281.199977 \n", - " 3575 104209 7.872670e+06 80637.0 97.630986 \n", - " 3576 267155 2.291869e+07 186218.0 123.074524 \n", - " 3577 2408203 1.625350e+09 312596.0 5199.523765 \n", - " 3578 5667 5.974033e+06 768.0 7778.688177 \n", - " 3579 194490 1.575617e+08 32845.0 4797.129978 \n", - " 3580 12 4.346900e+02 12.0 36.224167 \n", - " 3581 13477 7.100941e+07 3936.0 18041.008435 \n", - " 3582 52139 8.730541e+07 37627.0 2320.286144 \n", - " \n", - " unit_count unit_cost_wavg user_count_non_lowincome \\\n", - " 0 5.170000e+03 0.303518 NaN \n", - " 1 2.931600e+05 0.196766 422.0 \n", - " 2 4.970000e+02 0.704427 NaN \n", - " 3 2.980000e+02 30.212282 NaN \n", - " 4 4.510000e+02 0.471973 NaN \n", - " 5 4.902700e+04 9.292147 49.0 \n", - " 6 7.747481e+07 19.218621 57408.0 \n", - " 7 1.893515e+05 20.753897 83.0 \n", - " 8 9.750000e+02 975.080390 14.0 \n", - " 9 5.458000e+03 21.289045 NaN \n", - " 10 2.160100e+04 4.145166 134.0 \n", - " 11 1.884502e+07 0.620033 15297.0 \n", - " 12 1.436161e+06 1.823579 2871.0 \n", - " 13 1.292100e+04 0.573662 NaN \n", - " 14 4.381766e+05 1.752397 1259.0 \n", - " 15 4.682000e+04 1.716690 145.0 \n", - " 16 7.726200e+04 0.209343 76.0 \n", - " 17 6.404600e+04 0.211138 125.0 \n", - " 18 9.501688e+06 0.369813 17349.0 \n", - " 19 1.200940e+05 2.386485 507.0 \n", - " 20 3.400650e+05 1.424940 635.0 \n", - " 21 1.722670e+08 0.225617 600518.0 \n", - " 22 5.992600e+04 14.266791 2050.0 \n", - " 23 1.290460e+07 1.149070 43674.0 \n", - " 24 3.018925e+07 1.186918 11382.0 \n", - " 25 3.606810e+05 1.021471 2615.0 \n", - " 26 2.464842e+06 0.633200 5865.0 \n", - " 27 2.369000e+04 0.347718 111.0 \n", - " 28 1.821615e+07 7.240267 44579.0 \n", - " 29 2.220000e+03 2.133009 27.0 \n", - " ... ... ... ... \n", - " 3553 2.119000e+03 1.522204 NaN \n", - " 3554 1.768348e+06 3.412087 271.0 \n", - " 3555 3.220678e+07 0.427589 11876.0 \n", - " 3556 2.820000e+02 759.033511 NaN \n", - " 3557 3.640900e+04 12.865985 29.0 \n", - " 3558 6.131632e+05 176.437246 508312.0 \n", - " 3559 1.045231e+06 2.444665 688.0 \n", - " 3560 3.993740e+06 0.442342 282.0 \n", - " 3561 2.558880e+05 0.839385 145.0 \n", - " 3562 6.904628e+04 0.964051 28.0 \n", - " 3563 3.085635e+06 20.531930 52866.0 \n", - " 3564 5.863000e+03 0.109192 25.0 \n", - " 3565 4.560000e+03 0.128796 23.0 \n", - " 3566 8.044000e+03 10.295895 110.0 \n", - " 3567 9.480000e+03 0.435449 49.0 \n", - " 3568 1.119800e+04 3.082793 41.0 \n", - " 3569 2.932710e+05 21.845433 7895.0 \n", - " 3570 1.431610e+05 0.781167 223.0 \n", - " 3571 5.246700e+04 5.018310 86.0 \n", - " 3572 9.453600e+05 5.440067 817.0 \n", - " 3573 2.319372e+05 23.270327 20107.0 \n", - " 3574 8.993700e+04 1.449611 336.0 \n", - " 3575 5.364923e+05 14.674340 60686.0 \n", - " 3576 7.000329e+05 32.739450 133334.0 \n", - " 3577 8.177216e+07 19.872070 59409.0 \n", - " 3578 6.512000e+03 930.424683 22.0 \n", - " 3579 6.753901e+06 23.272028 4212.0 \n", - " 3580 4.770000e+02 0.911300 NaN \n", - " 3581 1.648304e+06 43.080287 2949.0 \n", - " 3582 1.335935e+07 79.386638 11621.0 \n", - " \n", - " out_of_pocket_avg_non_lowincome user_count_lowincome \\\n", - " 0 NaN NaN \n", - " 1 42.347204 471.0 \n", - " 2 NaN NaN \n", - " 3 NaN NaN \n", - " 4 NaN NaN \n", - " 5 402.047959 48.0 \n", - " 6 466.025894 303267.0 \n", - " 7 439.876386 878.0 \n", - " 8 1262.687143 37.0 \n", - " 9 NaN NaN \n", - " 10 104.138582 155.0 \n", - " 11 66.968047 17546.0 \n", - " 12 179.779526 3538.0 \n", - " 13 NaN NaN \n", - " 14 242.104504 527.0 \n", - " 15 252.086276 64.0 \n", - " 16 12.507105 250.0 \n", - " 17 10.126720 144.0 \n", - " 18 59.509666 3632.0 \n", - " 19 237.185858 178.0 \n", - " 20 105.183512 947.0 \n", - " 21 13.583327 591899.0 \n", - " 22 30.414620 1496.0 \n", - " 23 29.138261 30255.0 \n", - " 24 10.088422 11541.0 \n", - " 25 10.944157 1656.0 \n", - " 26 15.124384 8190.0 \n", - " 27 25.693964 25.0 \n", - " 28 315.603929 43703.0 \n", - " 29 36.903333 21.0 \n", - " ... ... ... \n", - " 3553 NaN NaN \n", - " 3554 582.690074 1306.0 \n", - " 3555 68.677215 26323.0 \n", - " 3556 NaN NaN \n", - " 3557 537.550690 34.0 \n", - " 3558 64.517514 94077.0 \n", - " 3559 267.177384 2195.0 \n", - " 3560 200.557518 1855.0 \n", - " 3561 59.516138 903.0 \n", - " 3562 78.832143 279.0 \n", - " 3563 76.368872 63646.0 \n", - " 3564 NaN 0.0 \n", - " 3565 NaN 0.0 \n", - " 3566 92.674091 85.0 \n", - " 3567 NaN 0.0 \n", - " 3568 110.794878 66.0 \n", - " 3569 100.221582 1222.0 \n", - " 3570 213.915291 133.0 \n", - " 3571 308.680698 114.0 \n", - " 3572 503.209045 933.0 \n", - " 3573 59.749094 11052.0 \n", - " 3574 181.975119 90.0 \n", - " 3575 49.456149 19951.0 \n", - " 3576 63.737597 52884.0 \n", - " 3577 477.108320 253187.0 \n", - " 3578 1364.510454 746.0 \n", - " 3579 411.607187 28633.0 \n", - " 3580 NaN NaN \n", - " 3581 2135.038379 987.0 \n", - " 3582 438.768326 26006.0 \n", - " \n", - " out_of_pocket_avg_lowincome \n", - " 0 NaN \n", - " 1 7.545860 \n", - " 2 NaN \n", - " 3 NaN \n", - " 4 NaN \n", - " 5 6.412500 \n", - " 6 23.082797 \n", - " 7 22.165581 \n", - " 8 4.605405 \n", - " 9 NaN \n", - " 10 5.484516 \n", - " 11 7.403934 \n", - " 12 13.275040 \n", - " 13 NaN \n", - " 14 22.965294 \n", - " 15 16.458437 \n", - " 16 8.116080 \n", - " 17 9.573611 \n", - " 18 12.229389 \n", - " 19 18.836180 \n", - " 20 6.955618 \n", - " 21 3.235404 \n", - " 22 2.882166 \n", - " 23 5.025750 \n", - " 24 1.754810 \n", - " 25 1.675495 \n", - " 26 0.963855 \n", - " 27 2.481600 \n", - " 28 21.152397 \n", - " 29 2.419048 \n", - " ... ... \n", - " 3553 NaN \n", - " 3554 22.476149 \n", - " 3555 8.356016 \n", - " 3556 NaN \n", - " 3557 6.679412 \n", - " 3558 5.896208 \n", - " 3559 8.244724 \n", - " 3560 3.247768 \n", - " 3561 7.900144 \n", - " 3562 8.518602 \n", - " 3563 6.189270 \n", - " 3564 NaN \n", - " 3565 NaN \n", - " 3566 10.097765 \n", - " 3567 NaN \n", - " 3568 7.608333 \n", - " 3569 12.045859 \n", - " 3570 11.346617 \n", - " 3571 7.955263 \n", - " 3572 16.471961 \n", - " 3573 5.751633 \n", - " 3574 19.265667 \n", - " 3575 6.750638 \n", - " 3576 7.288748 \n", - " 3577 24.884649 \n", - " 3578 12.646850 \n", - " 3579 17.817662 \n", - " 3580 NaN \n", - " 3581 50.838045 \n", - " 3582 10.791395 \n", - " \n", - " [3583 rows x 12 columns],\n", - " 2012: drugname_brand drugname_generic \\\n", - " 0 1ST TIER UNIFINE PENTIPS PEN NEEDLE, DIABETIC \n", - " 1 ABACAVIR ABACAVIR SULFATE \n", - " 2 ABELCET AMPHOTERICIN B LIPID COMPLEX \n", - " 3 ABILIFY ARIPIPRAZOLE \n", - " 4 ABILIFY DISCMELT ARIPIPRAZOLE \n", - " 5 ABRAXANE PACLITAXEL PROTEIN-BOUND \n", - " 6 ABSTRAL FENTANYL CITRATE \n", - " 7 ACANYA CLINDAMYCIN PHOS/BENZOYL PEROX \n", - " 8 ACARBOSE ACARBOSE \n", - " 9 ACCOLATE ZAFIRLUKAST \n", - " 10 ACCUNEB ALBUTEROL SULFATE \n", - " 11 ACCUPRIL QUINAPRIL HCL \n", - " 12 ACCURETIC QUINAPRIL/HYDROCHLOROTHIAZIDE \n", - " 13 ACCUSURE SYRING W-NDL,DISP,INSUL,0.5 ML \n", - " 14 ACCUSURE SYRINGE AND NEEDLE,INSULIN,1ML \n", - " 15 ACEBUTOLOL HCL ACEBUTOLOL HCL \n", - " 16 ACEON PERINDOPRIL ERBUMINE \n", - " 17 ACETAMINOPH-CAFF-DIHYDROCODEIN DHCODEINE BT/ACETAMINOPHN/CAFF \n", - " 18 ACETAMINOPHEN-CODEINE ACETAMINOPHEN WITH CODEINE \n", - " 19 ACETASOL HC ACETIC ACID/HYDROCORTISONE \n", - " 20 ACETAZOLAMIDE ACETAZOLAMIDE \n", - " 21 ACETAZOLAMIDE SODIUM ACETAZOLAMIDE SODIUM \n", - " 22 ACETIC ACID ACETIC ACID \n", - " 23 ACETIC ACID-ALUMINUM ACETIC ACID/ALUMINUM ACETATE \n", - " 24 ACETYLCYSTEINE ACETYLCYSTEINE \n", - " 25 ACID JELLY ACETIC AC/RICINOLEIC/OXYQUINOL \n", - " 26 ACIPHEX RABEPRAZOLE SODIUM \n", - " 27 ACLOVATE ALCLOMETASONE DIPROPIONATE \n", - " 28 ACTEMRA TOCILIZUMAB \n", - " 29 ACTHIB HAEMOPH B POLY CONJ-TET TOX/PF \n", - " ... ... ... \n", - " 3480 ZOMIG ZOLMITRIPTAN \n", - " 3481 ZOMIG ZMT ZOLMITRIPTAN \n", - " 3482 ZONALON DOXEPIN HCL \n", - " 3483 ZONATUSS BENZONATATE \n", - " 3484 ZONEGRAN ZONISAMIDE \n", - " 3485 ZONISAMIDE ZONISAMIDE \n", - " 3486 ZORTRESS EVEROLIMUS \n", - " 3487 ZOSTAVAX ZOSTER VACCINE LIVE/PF \n", - " 3488 ZOSYN PIPERACILLIN SODIUM/TAZOBACTAM \n", - " 3489 ZOSYN PIPERACILLIN-TAZO-DEXTROSE,ISO \n", - " 3490 ZOVIA 1-35E ETHYNODIOL D-ETHINYL ESTRADIOL \n", - " 3491 ZOVIA 1-50E ETHYNODIOL D-ETHINYL ESTRADIOL \n", - " 3492 ZOVIRAX ACYCLOVIR \n", - " 3493 Z-TUSS AC CHLORPHENIRAMINE/CODEINE PHOS \n", - " 3494 ZUPLENZ ONDANSETRON \n", - " 3495 ZUTRIPRO HYDROCODONE/CPM/PSEUDOEPHED \n", - " 3496 ZYBAN BUPROPION HCL \n", - " 3497 ZYCLARA IMIQUIMOD \n", - " 3498 ZYDONE HYDROCODONE/ACETAMINOPHEN \n", - " 3499 ZYFLO ZILEUTON \n", - " 3500 ZYFLO CR ZILEUTON \n", - " 3501 ZYLET TOBRAMYCIN/LOTEPRED ETAB \n", - " 3502 ZYLOPRIM ALLOPURINOL \n", - " 3503 ZYMAR GATIFLOXACIN \n", - " 3504 ZYMAXID GATIFLOXACIN \n", - " 3505 ZYPREXA OLANZAPINE \n", - " 3506 ZYPREXA RELPREVV OLANZAPINE PAMOATE \n", - " 3507 ZYPREXA ZYDIS OLANZAPINE \n", - " 3508 ZYTIGA ABIRATERONE ACETATE \n", - " 3509 ZYVOX LINEZOLID \n", - " \n", - " claim_count total_spending user_count total_spending_per_user \\\n", - " 0 3486 7.578601e+04 1261.0 60.099929 \n", - " 1 20895 1.033721e+07 5618.0 1840.016515 \n", - " 2 465 5.854537e+05 109.0 5371.134404 \n", - " 3 2572031 1.758070e+09 376604.0 4668.218123 \n", - " 4 4705 4.529795e+06 915.0 4950.595924 \n", - " 5 307 1.592914e+06 82.0 19425.777317 \n", - " 6 127 2.533982e+05 33.0 7678.734849 \n", - " 7 626 1.572776e+05 392.0 401.218495 \n", - " 8 184107 1.232611e+07 35925.0 343.106745 \n", - " 9 6331 8.552214e+05 1494.0 572.437343 \n", - " 10 53 3.877040e+03 37.0 104.784865 \n", - " 11 7303 8.786806e+05 1506.0 583.453267 \n", - " 12 675 8.532431e+04 159.0 536.630880 \n", - " 13 80 1.515860e+03 28.0 54.137857 \n", - " 14 34 6.842500e+02 15.0 45.616667 \n", - " 15 127305 3.543152e+06 21601.0 164.027204 \n", - " 16 936 1.039742e+05 320.0 324.919438 \n", - " 17 3967 4.199769e+05 1036.0 405.383127 \n", - " 18 2698378 3.512185e+07 1171519.0 29.979756 \n", - " 19 3097 5.656908e+05 2403.0 235.410216 \n", - " 20 247398 1.544110e+07 81674.0 189.057698 \n", - " 21 16 4.740570e+03 12.0 395.047500 \n", - " 22 46448 1.216825e+06 24236.0 50.207321 \n", - " 23 5307 3.299454e+05 3893.0 84.753514 \n", - " 24 28352 1.307055e+06 10134.0 128.977165 \n", - " 25 28 8.985500e+02 25.0 35.942000 \n", - " 26 372419 1.477074e+08 76690.0 1926.031951 \n", - " 27 23 1.856550e+03 20.0 92.827500 \n", - " 28 2770 4.127018e+06 359.0 11495.872117 \n", - " 29 404 1.433274e+04 377.0 38.017878 \n", - " ... ... ... ... ... \n", - " 3480 26304 9.219154e+06 6492.0 1420.079238 \n", - " 3481 4894 1.625984e+06 1318.0 1233.675379 \n", - " 3482 3348 7.714406e+05 1974.0 390.800699 \n", - " 3483 39 2.334770e+03 36.0 64.854722 \n", - " 3484 12080 7.307074e+06 1446.0 5053.301383 \n", - " 3485 279639 1.378062e+07 40702.0 338.573535 \n", - " 3486 619 9.573750e+05 117.0 8182.692564 \n", - " 3487 1286692 2.336115e+08 1279171.0 182.627225 \n", - " 3488 3953 1.260636e+06 1580.0 797.870639 \n", - " 3489 5128 1.501075e+06 1858.0 807.898149 \n", - " 3490 6108 1.952951e+05 1014.0 192.598679 \n", - " 3491 1986 6.747739e+04 306.0 220.514346 \n", - " 3492 170814 6.841609e+07 110504.0 619.127723 \n", - " 3493 35 6.793900e+02 27.0 25.162593 \n", - " 3494 48 9.182290e+03 35.0 262.351143 \n", - " 3495 418 3.200530e+04 368.0 86.970924 \n", - " 3496 167 3.088811e+04 83.0 372.145904 \n", - " 3497 8545 5.752533e+06 7151.0 804.437621 \n", - " 3498 1043 9.325647e+04 280.0 333.058821 \n", - " 3499 623 6.703242e+05 182.0 3683.100000 \n", - " 3500 7687 9.477538e+06 1734.0 5465.708431 \n", - " 3501 37588 5.621452e+06 27617.0 203.550411 \n", - " 3502 1573 1.733841e+05 343.0 505.492915 \n", - " 3503 7478 5.333546e+05 6635.0 80.385016 \n", - " 3504 252498 2.604380e+07 169399.0 153.742341 \n", - " 3505 333227 2.483230e+08 78968.0 3144.602248 \n", - " 3506 7569 8.120525e+06 885.0 9175.733921 \n", - " 3507 21961 1.882312e+07 5924.0 3177.434475 \n", - " 3508 37934 2.242602e+08 8357.0 26835.010515 \n", - " 3509 52089 1.025143e+08 37014.0 2769.608718 \n", - " \n", - " unit_count unit_cost_wavg user_count_non_lowincome \\\n", - " 0 4.054840e+05 0.186918 607.0 \n", - " 1 1.330356e+06 7.770261 941.0 \n", - " 2 5.991700e+04 9.771077 61.0 \n", - " 3 8.216218e+07 21.667432 66009.0 \n", - " 4 1.926155e+05 23.522216 89.0 \n", - " 5 1.623000e+03 981.462563 30.0 \n", - " 6 9.674000e+03 23.114383 16.0 \n", - " 7 3.140000e+04 5.008786 216.0 \n", - " 8 2.081458e+07 0.591634 17590.0 \n", - " 9 4.479626e+05 1.908886 830.0 \n", - " 10 6.972000e+03 0.556137 NaN \n", - " 11 4.414270e+05 1.989534 1109.0 \n", - " 12 4.321250e+04 1.973352 120.0 \n", - " 13 7.430000e+03 0.204243 NaN \n", - " 14 3.330000e+03 0.205070 NaN \n", - " 15 9.912423e+06 0.358745 17997.0 \n", - " 16 4.300000e+04 2.419315 249.0 \n", - " 17 2.894970e+05 1.450713 501.0 \n", - " 18 1.651675e+08 0.220291 609034.0 \n", - " 19 3.954100e+04 14.306435 1564.0 \n", - " 20 1.441248e+07 1.203447 49854.0 \n", - " 21 2.980000e+03 1.590795 NaN \n", - " 22 4.116372e+07 1.113169 12192.0 \n", - " 23 3.295020e+05 1.001346 2426.0 \n", - " 24 1.864273e+06 0.693889 3650.0 \n", - " 25 2.465000e+03 0.364523 NaN \n", - " 26 1.756546e+07 8.408969 40534.0 \n", - " 27 1.531000e+03 1.223248 NaN \n", - " 28 5.985500e+04 68.038174 122.0 \n", - " 29 5.000000e+02 28.665480 319.0 \n", - " ... ... ... ... \n", - " 3480 2.837625e+05 32.704462 3875.0 \n", - " 3481 5.336600e+04 30.426216 734.0 \n", - " 3482 1.620455e+05 4.760642 1170.0 \n", - " 3483 1.484000e+03 1.573295 NaN \n", - " 3484 1.750228e+06 4.134925 266.0 \n", - " 3485 3.056761e+07 0.447698 13329.0 \n", - " 3486 7.491900e+04 13.195398 56.0 \n", - " 3487 2.332269e+06 100.164902 1032199.0 \n", - " 3488 6.029101e+05 2.203162 472.0 \n", - " 3489 3.479008e+06 0.448771 253.0 \n", - " 3490 2.346460e+05 0.832297 126.0 \n", - " 3491 7.104000e+04 0.949851 45.0 \n", - " 3492 3.634097e+06 27.060088 50082.0 \n", - " 3493 6.500000e+03 0.104522 27.0 \n", - " 3494 8.800000e+02 10.434359 19.0 \n", - " 3495 7.378300e+04 0.433776 356.0 \n", - " 3496 1.020600e+04 3.026466 31.0 \n", - " 3497 1.322406e+05 63.741586 6432.0 \n", - " 3498 1.194160e+05 0.775924 201.0 \n", - " 3499 6.814200e+04 9.837167 94.0 \n", - " 3500 9.893500e+05 9.579561 850.0 \n", - " 3501 2.113675e+05 26.595629 18291.0 \n", - " 3502 8.627100e+04 2.118224 293.0 \n", - " 3503 3.864900e+04 13.799958 5768.0 \n", - " 3504 6.790166e+05 38.355170 126142.0 \n", - " 3505 1.131814e+07 21.887174 7595.0 \n", - " 3506 8.771207e+03 938.942424 24.0 \n", - " 3507 7.800315e+05 24.164831 527.0 \n", - " 3508 4.594078e+06 48.815058 6252.0 \n", - " 3509 1.223548e+07 95.300649 11526.0 \n", - " \n", - " out_of_pocket_avg_non_lowincome user_count_lowincome \\\n", - " 0 38.242323 654.0 \n", - " 1 78.652306 4677.0 \n", - " 2 561.525902 48.0 \n", - " 3 501.533066 310595.0 \n", - " 4 440.755955 826.0 \n", - " 5 1694.815667 52.0 \n", - " 6 409.263750 17.0 \n", - " 7 98.067037 176.0 \n", - " 8 65.041950 18335.0 \n", - " 9 225.231133 664.0 \n", - " 10 NaN NaN \n", - " 11 298.777638 397.0 \n", - " 12 275.522667 39.0 \n", - " 13 NaN NaN \n", - " 14 NaN NaN \n", - " 15 60.182904 3604.0 \n", - " 16 174.061847 71.0 \n", - " 17 120.124072 535.0 \n", - " 18 13.718335 562485.0 \n", - " 19 29.207065 839.0 \n", - " 20 30.713293 31820.0 \n", - " 21 NaN NaN \n", - " 22 10.341512 12044.0 \n", - " 23 11.411645 1467.0 \n", - " 24 18.428205 6484.0 \n", - " 25 NaN NaN \n", - " 26 352.344018 36156.0 \n", - " 27 NaN NaN \n", - " 28 1191.663689 237.0 \n", - " 29 18.973009 58.0 \n", - " ... ... ... \n", - " 3480 303.109032 2617.0 \n", - " 3481 268.528787 584.0 \n", - " 3482 74.726265 804.0 \n", - " 3483 NaN NaN \n", - " 3484 692.358083 1180.0 \n", - " 3485 63.805976 27373.0 \n", - " 3486 878.703750 61.0 \n", - " 3487 64.927760 246972.0 \n", - " 3488 303.973898 1108.0 \n", - " 3489 196.429605 1605.0 \n", - " 3490 65.932302 888.0 \n", - " 3491 65.242000 261.0 \n", - " 3492 85.493039 60422.0 \n", - " 3493 NaN 0.0 \n", - " 3494 81.535789 16.0 \n", - " 3495 39.903090 12.0 \n", - " 3496 149.385161 52.0 \n", - " 3497 93.386017 719.0 \n", - " 3498 188.566517 79.0 \n", - " 3499 383.224043 88.0 \n", - " 3500 655.753659 884.0 \n", - " 3501 63.117120 9326.0 \n", - " 3502 252.468874 50.0 \n", - " 3503 37.670811 867.0 \n", - " 3504 66.459805 43257.0 \n", - " 3505 345.127472 71373.0 \n", - " 3506 1453.265833 861.0 \n", - " 3507 399.065161 5397.0 \n", - " 3508 2628.541464 2105.0 \n", - " 3509 484.438922 25488.0 \n", - " \n", - " out_of_pocket_avg_lowincome \n", - " 0 6.501223 \n", - " 1 0.720626 \n", - " 2 17.958750 \n", - " 3 21.231591 \n", - " 4 12.490230 \n", - " 5 2.521154 \n", - " 6 23.654706 \n", - " 7 7.229261 \n", - " 8 6.900732 \n", - " 9 14.501190 \n", - " 10 NaN \n", - " 11 24.303526 \n", - " 12 26.950513 \n", - " 13 NaN \n", - " 14 NaN \n", - " 15 10.921834 \n", - " 16 18.433099 \n", - " 17 9.970879 \n", - " 18 2.930919 \n", - " 19 2.174946 \n", - " 20 4.591585 \n", - " 21 NaN \n", - " 22 1.187295 \n", - " 23 1.307587 \n", - " 24 0.985783 \n", - " 25 NaN \n", - " 26 21.097450 \n", - " 27 NaN \n", - " 28 31.820802 \n", - " 29 3.918966 \n", - " ... ... \n", - " 3480 18.250459 \n", - " 3481 17.001866 \n", - " 3482 5.411791 \n", - " 3483 NaN \n", - " 3484 18.429856 \n", - " 3485 6.566169 \n", - " 3486 32.127049 \n", - " 3487 5.376837 \n", - " 3488 8.200487 \n", - " 3489 3.435134 \n", - " 3490 5.009606 \n", - " 3491 6.057088 \n", - " 3492 5.759506 \n", - " 3493 NaN \n", - " 3494 9.713125 \n", - " 3495 54.070833 \n", - " 3496 9.876346 \n", - " 3497 10.412462 \n", - " 3498 9.042278 \n", - " 3499 7.897159 \n", - " 3500 13.664717 \n", - " 3501 5.582963 \n", - " 3502 22.609400 \n", - " 3503 5.875767 \n", - " 3504 7.564077 \n", - " 3505 8.710854 \n", - " 3506 16.471440 \n", - " 3507 10.442055 \n", - " 3508 102.905853 \n", - " 3509 11.831571 \n", - " \n", - " [3510 rows x 12 columns],\n", - " 2013: drugname_brand drugname_generic \\\n", - " 0 1ST TIER UNIFINE PENTIPS PEN NEEDLE, DIABETIC \n", - " 1 8-MOP METHOXSALEN \n", - " 2 ABACAVIR ABACAVIR SULFATE \n", - " 3 ABACAVIR-LAMIVUDINE-ZIDOVUDINE ABACAVIR/LAMIVUDINE/ZIDOVUDINE \n", - " 4 ABELCET AMPHOTERICIN B LIPID COMPLEX \n", - " 5 ABILIFY ARIPIPRAZOLE \n", - " 6 ABILIFY DISCMELT ARIPIPRAZOLE \n", - " 7 ABILIFY MAINTENA ARIPIPRAZOLE \n", - " 8 ABRAXANE PACLITAXEL PROTEIN-BOUND \n", - " 9 ABSORICA ISOTRETINOIN \n", - " 10 ABSTRAL FENTANYL CITRATE \n", - " 11 ACAMPROSATE CALCIUM ACAMPROSATE CALCIUM \n", - " 12 ACANYA CLINDAMYCIN PHOS/BENZOYL PEROX \n", - " 13 ACARBOSE ACARBOSE \n", - " 14 ACCOLATE ZAFIRLUKAST \n", - " 15 ACCUNEB ALBUTEROL SULFATE \n", - " 16 ACCUPRIL QUINAPRIL HCL \n", - " 17 ACCURETIC QUINAPRIL/HYDROCHLOROTHIAZIDE \n", - " 18 ACCUSURE SYRING W-NDL,DISP,INSUL,0.5 ML \n", - " 19 ACCUSURE SYRINGE AND NEEDLE,INSULIN,1ML \n", - " 20 ACEBUTOLOL HCL ACEBUTOLOL HCL \n", - " 21 ACEON PERINDOPRIL ERBUMINE \n", - " 22 ACETAMINOPH-CAFF-DIHYDROCODEIN DHCODEINE BT/ACETAMINOPHN/CAFF \n", - " 23 ACETAMINOPHEN-CODEINE ACETAMINOPHEN WITH CODEINE \n", - " 24 ACETASOL HC ACETIC ACID/HYDROCORTISONE \n", - " 25 ACETAZOLAMIDE ACETAZOLAMIDE \n", - " 26 ACETAZOLAMIDE SODIUM ACETAZOLAMIDE SODIUM \n", - " 27 ACETIC ACID ACETIC ACID \n", - " 28 ACETIC ACID-ALUMINUM ACETIC ACID/ALUMINUM ACETATE \n", - " 29 ACETYLCYSTEINE ACETYLCYSTEINE \n", - " ... ... ... \n", - " 3430 ZOMETA ZOLEDRONIC ACID \n", - " 3431 ZOMETA ZOLEDRONIC ACID/MANNITOL&WATER \n", - " 3432 ZOMIG ZOLMITRIPTAN \n", - " 3433 ZOMIG ZMT ZOLMITRIPTAN \n", - " 3434 ZONALON DOXEPIN HCL \n", - " 3435 ZONATUSS BENZONATATE \n", - " 3436 ZONEGRAN ZONISAMIDE \n", - " 3437 ZONISAMIDE ZONISAMIDE \n", - " 3438 ZORTRESS EVEROLIMUS \n", - " 3439 ZOSTAVAX ZOSTER VACCINE LIVE/PF \n", - " 3440 ZOSYN PIPERACILLIN SODIUM/TAZOBACTAM \n", - " 3441 ZOSYN PIPERACILLIN-TAZO-DEXTROSE,ISO \n", - " 3442 ZOVIA 1-35E ETHYNODIOL D-ETHINYL ESTRADIOL \n", - " 3443 ZOVIA 1-50E ETHYNODIOL D-ETHINYL ESTRADIOL \n", - " 3444 ZOVIRAX ACYCLOVIR \n", - " 3445 ZUBSOLV BUPRENORPHINE HCL/NALOXONE HCL \n", - " 3446 ZUTRIPRO HYDROCODONE/CPM/PSEUDOEPHED \n", - " 3447 ZYBAN BUPROPION HCL \n", - " 3448 ZYCLARA IMIQUIMOD \n", - " 3449 ZYDONE HYDROCODONE/ACETAMINOPHEN \n", - " 3450 ZYFLO ZILEUTON \n", - " 3451 ZYFLO CR ZILEUTON \n", - " 3452 ZYLET TOBRAMYCIN/LOTEPRED ETAB \n", - " 3453 ZYLOPRIM ALLOPURINOL \n", - " 3454 ZYMAXID GATIFLOXACIN \n", - " 3455 ZYPREXA OLANZAPINE \n", - " 3456 ZYPREXA RELPREVV OLANZAPINE PAMOATE \n", - " 3457 ZYPREXA ZYDIS OLANZAPINE \n", - " 3458 ZYTIGA ABIRATERONE ACETATE \n", - " 3459 ZYVOX LINEZOLID \n", - " \n", - " claim_count total_spending user_count total_spending_per_user \\\n", - " 0 4413 9.530409e+04 1633.0 58.361353 \n", - " 1 14 1.959075e+04 NaN NaN \n", - " 2 59121 2.692348e+07 8360.0 3220.512208 \n", - " 3 49 7.823003e+04 49.0 1596.531225 \n", - " 4 435 5.820029e+05 130.0 4476.945615 \n", - " 5 2886837 2.107092e+09 396764.0 5310.692339 \n", - " 6 5033 5.221988e+06 967.0 5400.194167 \n", - " 7 14694 2.127800e+07 3986.0 5338.184714 \n", - " 8 557 2.915287e+06 161.0 18107.374472 \n", - " 9 78 7.655036e+04 40.0 1913.759000 \n", - " 10 136 4.334174e+05 47.0 9221.646596 \n", - " 11 7020 1.207181e+06 3528.0 342.171576 \n", - " 12 888 2.909356e+05 574.0 506.856376 \n", - " 13 202961 1.325543e+07 40342.0 328.576538 \n", - " 14 3011 4.509135e+05 695.0 648.796432 \n", - " 15 44 2.050600e+03 23.0 89.156522 \n", - " 16 7400 1.063447e+06 1454.0 731.394127 \n", - " 17 651 9.228554e+04 145.0 636.452000 \n", - " 18 26 4.437600e+02 NaN NaN \n", - " 19 16 3.651300e+02 NaN NaN \n", - " 20 134256 3.888337e+06 23942.0 162.406512 \n", - " 21 120 1.137218e+04 36.0 315.893889 \n", - " 22 2058 2.162224e+05 607.0 356.214778 \n", - " 23 2716272 3.294699e+07 1212371.0 27.175665 \n", - " 24 1974 3.608088e+05 1530.0 235.822771 \n", - " 25 266844 1.758808e+07 91387.0 192.457185 \n", - " 26 11 1.526680e+03 NaN NaN \n", - " 27 53177 1.251716e+06 26476.0 47.277365 \n", - " 28 5283 3.194708e+05 3868.0 82.593270 \n", - " 29 12363 1.530784e+06 5924.0 258.403832 \n", - " ... ... ... ... ... \n", - " 3430 1679 1.557635e+06 614.0 2536.865114 \n", - " 3431 189 1.811950e+05 75.0 2415.932667 \n", - " 3432 18007 9.571877e+06 5893.0 1624.279067 \n", - " 3433 2956 1.643060e+06 1044.0 1573.812625 \n", - " 3434 3581 9.624592e+05 2174.0 442.713542 \n", - " 3435 124 7.388840e+03 97.0 76.173608 \n", - " 3436 11422 8.246175e+06 1370.0 6019.106168 \n", - " 3437 304033 1.236351e+07 45598.0 271.141520 \n", - " 3438 1339 2.262381e+06 245.0 9234.207102 \n", - " 3439 1392489 2.590245e+08 1385249.0 186.987704 \n", - " 3440 3572 1.312266e+06 1416.0 926.741709 \n", - " 3441 4248 1.200823e+06 1557.0 771.241381 \n", - " 3442 5668 1.799965e+05 930.0 193.544677 \n", - " 3443 1899 6.286188e+04 290.0 216.765103 \n", - " 3444 104133 6.685955e+07 68985.0 969.189650 \n", - " 3445 180 4.907907e+04 91.0 539.330440 \n", - " 3446 651 7.047534e+04 553.0 127.441844 \n", - " 3447 155 2.993999e+04 81.0 369.629506 \n", - " 3448 7637 6.070010e+06 6063.0 1001.156145 \n", - " 3449 295 1.969069e+04 104.0 189.333558 \n", - " 3450 676 1.158369e+06 209.0 5542.437608 \n", - " 3451 7413 1.516217e+07 1621.0 9353.590358 \n", - " 3452 30625 5.381155e+06 22639.0 237.694036 \n", - " 3453 1689 2.404898e+05 384.0 626.275521 \n", - " 3454 178766 2.022359e+07 121191.0 166.873706 \n", - " 3455 37062 3.123051e+07 6741.0 4632.919310 \n", - " 3456 7627 8.128809e+06 856.0 9496.272675 \n", - " 3457 6177 6.452714e+06 1183.0 5454.534370 \n", - " 3458 71423 4.696617e+08 14191.0 33095.744624 \n", - " 3459 54501 1.222904e+08 39058.0 3130.994553 \n", - " \n", - " unit_count unit_cost_wavg user_count_non_lowincome \\\n", - " 0 5.227800e+05 0.182282 833.0 \n", - " 1 7.500000e+02 26.121000 NaN \n", - " 2 3.761037e+06 7.158526 1594.0 \n", - " 3 3.473000e+03 22.525203 14.0 \n", - " 4 5.657400e+04 10.287463 83.0 \n", - " 5 8.615030e+07 24.708043 79066.0 \n", - " 6 1.933000e+05 27.019006 74.0 \n", - " 7 1.479370e+04 1438.478444 90.0 \n", - " 8 3.380000e+03 862.511033 62.0 \n", - " 9 3.280000e+03 23.251226 20.0 \n", - " 10 1.018800e+04 41.533763 23.0 \n", - " 11 1.149195e+06 1.050458 1052.0 \n", - " 12 4.626500e+04 6.288459 367.0 \n", - " 13 2.382530e+07 0.555803 21111.0 \n", - " 14 2.380595e+05 1.894073 396.0 \n", - " 15 4.611000e+03 0.436642 NaN \n", - " 16 4.837680e+05 2.198518 1174.0 \n", - " 17 4.277100e+04 2.156757 105.0 \n", - " 18 2.340000e+03 0.189788 NaN \n", - " 19 1.720000e+03 0.212537 NaN \n", - " 20 1.110055e+07 0.351240 20531.0 \n", - " 21 4.862000e+03 2.312935 NaN \n", - " 22 1.531180e+05 1.412129 344.0 \n", - " 23 1.661786e+08 0.203116 677975.0 \n", - " 24 2.028000e+04 17.791363 999.0 \n", - " 25 1.571094e+07 1.231194 59338.0 \n", - " 26 4.200000e+01 36.349524 NaN \n", - " 27 3.830370e+07 1.024644 13733.0 \n", - " 28 3.241150e+05 0.985671 2517.0 \n", - " 29 8.339297e+05 1.588967 2983.0 \n", - " ... ... ... ... \n", - " 3430 9.691125e+03 160.728004 227.0 \n", - " 3431 1.980100e+04 9.150798 30.0 \n", - " 3432 2.000240e+05 47.588738 3690.0 \n", - " 3433 3.342100e+04 49.078651 623.0 \n", - " 3434 1.789762e+05 5.377581 1329.0 \n", - " 3435 4.027000e+03 1.834825 NaN \n", - " 3436 1.675992e+06 4.875366 283.0 \n", - " 3437 3.382730e+07 0.362378 16529.0 \n", - " 3438 1.614680e+05 14.126642 134.0 \n", - " 3439 1.396699e+06 185.454847 1122511.0 \n", - " 3440 5.617384e+05 2.371342 550.0 \n", - " 3441 2.737822e+06 0.453595 207.0 \n", - " 3442 2.211680e+05 0.813845 138.0 \n", - " 3443 6.781800e+04 0.926920 35.0 \n", - " 3444 1.811813e+06 58.984697 32150.0 \n", - " 3445 7.089000e+03 6.899968 24.0 \n", - " 3446 1.159520e+05 0.607798 540.0 \n", - " 3447 1.044800e+04 2.865619 35.0 \n", - " 3448 1.005535e+05 83.018583 5617.0 \n", - " 3449 2.986300e+04 0.657270 88.0 \n", - " 3450 7.926100e+04 14.614621 113.0 \n", - " 3451 1.045439e+06 14.503161 904.0 \n", - " 3452 1.714380e+05 31.388346 16003.0 \n", - " 3453 1.025190e+05 2.554301 330.0 \n", - " 3454 4.849215e+05 41.704876 94442.0 \n", - " 3455 1.466591e+06 21.957925 1139.0 \n", - " 3456 9.972000e+03 849.818051 28.0 \n", - " 3457 2.485939e+05 26.537529 136.0 \n", - " 3458 8.630869e+06 54.416503 10864.0 \n", - " 3459 1.264478e+07 106.187338 14084.0 \n", - " \n", - " out_of_pocket_avg_non_lowincome user_count_lowincome \\\n", - " 0 35.618511 800.0 \n", - " 1 NaN NaN \n", - " 2 282.046305 6766.0 \n", - " 3 44.842143 35.0 \n", - " 4 533.815422 47.0 \n", - " 5 502.007282 317698.0 \n", - " 6 493.977297 893.0 \n", - " 7 471.989111 3896.0 \n", - " 8 1031.503387 99.0 \n", - " 9 236.276500 20.0 \n", - " 10 667.247391 24.0 \n", - " 11 83.884686 2476.0 \n", - " 12 85.810163 207.0 \n", - " 13 77.038412 19231.0 \n", - " 14 254.406515 299.0 \n", - " 15 NaN NaN \n", - " 16 315.274080 280.0 \n", - " 17 328.594000 40.0 \n", - " 18 NaN NaN \n", - " 19 NaN NaN \n", - " 20 55.953487 3411.0 \n", - " 21 NaN NaN \n", - " 22 141.407558 263.0 \n", - " 23 12.813869 534396.0 \n", - " 24 33.359770 531.0 \n", - " 25 31.198135 32049.0 \n", - " 26 NaN NaN \n", - " 27 11.037738 12743.0 \n", - " 28 12.744239 1351.0 \n", - " 29 40.217616 2941.0 \n", - " ... ... ... \n", - " 3430 370.799824 387.0 \n", - " 3431 351.461000 45.0 \n", - " 3432 236.745816 2203.0 \n", - " 3433 225.697817 421.0 \n", - " 3434 79.339691 845.0 \n", - " 3435 NaN NaN \n", - " 3436 698.461555 1087.0 \n", - " 3437 60.866545 29069.0 \n", - " 3438 696.876791 111.0 \n", - " 3439 60.242947 262738.0 \n", - " 3440 290.154218 866.0 \n", - " 3441 231.618889 1350.0 \n", - " 3442 80.157681 792.0 \n", - " 3443 104.917429 255.0 \n", - " 3444 84.241102 36835.0 \n", - " 3445 113.320417 67.0 \n", - " 3446 34.243204 13.0 \n", - " 3447 96.486286 46.0 \n", - " 3448 93.092272 446.0 \n", - " 3449 107.884886 16.0 \n", - " 3450 441.129027 96.0 \n", - " 3451 709.687412 717.0 \n", - " 3452 61.575892 6636.0 \n", - " 3453 256.211818 54.0 \n", - " 3454 68.850713 26749.0 \n", - " 3455 451.216971 5602.0 \n", - " 3456 1360.663929 828.0 \n", - " 3457 355.830662 1047.0 \n", - " 3458 2535.579871 3327.0 \n", - " 3459 492.445567 24974.0 \n", - " \n", - " out_of_pocket_avg_lowincome \n", - " 0 5.880125 \n", - " 1 NaN \n", - " 2 7.734042 \n", - " 3 0.227143 \n", - " 4 11.655745 \n", - " 5 21.633706 \n", - " 6 12.986976 \n", - " 7 7.784877 \n", - " 8 3.285960 \n", - " 9 5.510000 \n", - " 10 91.942500 \n", - " 11 2.962686 \n", - " 12 8.164734 \n", - " 13 6.818383 \n", - " 14 14.545786 \n", - " 15 NaN \n", - " 16 31.491536 \n", - " 17 24.499250 \n", - " 18 NaN \n", - " 19 NaN \n", - " 20 11.165538 \n", - " 21 NaN \n", - " 22 9.469087 \n", - " 23 2.979679 \n", - " 24 2.176403 \n", - " 25 4.958112 \n", - " 26 NaN \n", - " 27 1.180721 \n", - " 28 1.260881 \n", - " 29 1.427385 \n", - " ... ... \n", - " 3430 7.565116 \n", - " 3431 8.601556 \n", - " 3432 15.809374 \n", - " 3433 14.775819 \n", - " 3434 5.346320 \n", - " 3435 NaN \n", - " 3436 13.749788 \n", - " 3437 6.604125 \n", - " 3438 64.162973 \n", - " 3439 5.403622 \n", - " 3440 9.415901 \n", - " 3441 3.912044 \n", - " 3442 5.505265 \n", - " 3443 7.359922 \n", - " 3444 6.002533 \n", - " 3445 8.088955 \n", - " 3446 43.655385 \n", - " 3447 5.043913 \n", - " 3448 9.749260 \n", - " 3449 8.858125 \n", - " 3450 10.497292 \n", - " 3451 17.607894 \n", - " 3452 5.583121 \n", - " 3453 21.184815 \n", - " 3454 7.393066 \n", - " 3455 18.261114 \n", - " 3456 19.975507 \n", - " 3457 14.798883 \n", - " 3458 93.843003 \n", - " 3459 14.258235 \n", - " \n", - " [3460 rows x 12 columns],\n", - " 2014: drugname_brand drugname_generic \\\n", - " 0 1ST TIER UNIFINE PENTIPS PEN NEEDLE, DIABETIC \n", - " 1 1ST TIER UNIFINE PENTIPS PLUS PEN NEEDLE, DIABETIC \n", - " 2 ABACAVIR ABACAVIR SULFATE \n", - " 3 ABACAVIR-LAMIVUDINE-ZIDOVUDINE ABACAVIR/LAMIVUDINE/ZIDOVUDINE \n", - " 4 ABELCET AMPHOTERICIN B LIPID COMPLEX \n", - " 5 ABILIFY ARIPIPRAZOLE \n", - " 6 ABILIFY DISCMELT ARIPIPRAZOLE \n", - " 7 ABILIFY MAINTENA ARIPIPRAZOLE \n", - " 8 ABRAXANE PACLITAXEL PROTEIN-BOUND \n", - " 9 ABSORICA ISOTRETINOIN \n", - " 10 ABSTRAL FENTANYL CITRATE \n", - " 11 ACAMPROSATE CALCIUM ACAMPROSATE CALCIUM \n", - " 12 ACANYA CLINDAMYCIN PHOS/BENZOYL PEROX \n", - " 13 ACARBOSE ACARBOSE \n", - " 14 ACCOLATE ZAFIRLUKAST \n", - " 15 ACCUPRIL QUINAPRIL HCL \n", - " 16 ACCURETIC QUINAPRIL/HYDROCHLOROTHIAZIDE \n", - " 17 ACEBUTOLOL HCL ACEBUTOLOL HCL \n", - " 18 ACETAMINOPHEN-CODEINE ACETAMINOPHEN WITH CODEINE \n", - " 19 ACETASOL HC ACETIC ACID/HYDROCORTISONE \n", - " 20 ACETAZOLAMIDE ACETAZOLAMIDE \n", - " 21 ACETIC ACID ACETIC ACID \n", - " 22 ACETIC ACID-ALUMINUM ACETIC ACID/ALUMINUM ACETATE \n", - " 23 ACETYLCYSTEINE ACETYLCYSTEINE \n", - " 24 ACIPHEX RABEPRAZOLE SODIUM \n", - " 25 ACIPHEX SPRINKLE RABEPRAZOLE SODIUM \n", - " 26 ACITRETIN ACITRETIN \n", - " 27 ACTEMRA TOCILIZUMAB \n", - " 28 ACTHIB HAEMOPH B POLY CONJ-TET TOX/PF \n", - " 29 ACTIGALL URSODIOL \n", - " ... ... ... \n", - " 3329 ZOMIG ZOLMITRIPTAN \n", - " 3330 ZOMIG ZMT ZOLMITRIPTAN \n", - " 3331 ZONALON DOXEPIN HCL \n", - " 3332 ZONEGRAN ZONISAMIDE \n", - " 3333 ZONISAMIDE ZONISAMIDE \n", - " 3334 ZONTIVITY VORAPAXAR SULFATE \n", - " 3335 ZORTRESS EVEROLIMUS \n", - " 3336 ZORVOLEX DICLOFENAC SUBMICRONIZED \n", - " 3337 ZOSTAVAX ZOSTER VACCINE LIVE/PF \n", - " 3338 ZOSYN PIPERACILLIN SODIUM/TAZOBACTAM \n", - " 3339 ZOSYN PIPERACILLIN-TAZO-DEXTROSE,ISO \n", - " 3340 ZOVIA 1-35E ETHYNODIOL D-ETHINYL ESTRADIOL \n", - " 3341 ZOVIA 1-50E ETHYNODIOL D-ETHINYL ESTRADIOL \n", - " 3342 ZOVIRAX ACYCLOVIR \n", - " 3343 ZUBSOLV BUPRENORPHINE HCL/NALOXONE HCL \n", - " 3344 ZUPLENZ ONDANSETRON \n", - " 3345 ZYBAN BUPROPION HCL \n", - " 3346 ZYCLARA IMIQUIMOD \n", - " 3347 ZYDELIG IDELALISIB \n", - " 3348 ZYFLO ZILEUTON \n", - " 3349 ZYFLO CR ZILEUTON \n", - " 3350 ZYKADIA CERITINIB \n", - " 3351 ZYLET TOBRAMYCIN/LOTEPRED ETAB \n", - " 3352 ZYLOPRIM ALLOPURINOL \n", - " 3353 ZYMAXID GATIFLOXACIN \n", - " 3354 ZYPREXA OLANZAPINE \n", - " 3355 ZYPREXA RELPREVV OLANZAPINE PAMOATE \n", - " 3356 ZYPREXA ZYDIS OLANZAPINE \n", - " 3357 ZYTIGA ABIRATERONE ACETATE \n", - " 3358 ZYVOX LINEZOLID \n", - " \n", - " claim_count total_spending user_count total_spending_per_user \\\n", - " 0 6788 1.507497e+05 2769.0 54.441914 \n", - " 1 1137 2.728297e+04 619.0 44.075880 \n", - " 2 68259 2.796171e+07 9076.0 3080.840300 \n", - " 3 12201 1.716722e+07 1821.0 9427.358819 \n", - " 4 419 5.142402e+05 116.0 4433.105172 \n", - " 5 2964075 2.527319e+09 405160.0 6237.829577 \n", - " 6 5186 6.282391e+06 951.0 6606.089779 \n", - " 7 54759 8.336284e+07 9639.0 8648.495027 \n", - " 8 835 4.546657e+06 257.0 17691.271167 \n", - " 9 239 3.068246e+05 115.0 2668.039826 \n", - " 10 612 3.820093e+06 210.0 18190.919476 \n", - " 11 24852 3.926355e+06 7758.0 506.103997 \n", - " 12 911 3.511564e+05 572.0 613.909790 \n", - " 13 206501 1.232581e+07 42012.0 293.387731 \n", - " 14 2276 3.652497e+05 467.0 782.119251 \n", - " 15 6114 1.050336e+06 1317.0 797.521701 \n", - " 16 465 7.661999e+04 113.0 678.053009 \n", - " 17 130835 3.525465e+06 24326.0 144.925784 \n", - " 18 2854695 3.156936e+07 1347069.0 23.435594 \n", - " 19 1023 1.503939e+05 780.0 192.812718 \n", - " 20 288834 3.123597e+07 100157.0 311.870023 \n", - " 21 53865 1.232021e+06 26687.0 46.165595 \n", - " 22 4393 2.547186e+05 3227.0 78.933554 \n", - " 23 20896 1.413703e+06 7237.0 195.343857 \n", - " 24 50757 3.326328e+07 12160.0 2735.467218 \n", - " 25 33 1.911297e+04 18.0 1061.831667 \n", - " 26 35054 3.316817e+07 8971.0 3697.265979 \n", - " 27 12040 2.466772e+07 2187.0 11279.250585 \n", - " 28 597 2.193320e+04 544.0 40.318382 \n", - " 29 860 7.772995e+05 187.0 4156.682032 \n", - " ... ... ... ... ... \n", - " 3329 8922 5.167970e+06 2353.0 2196.332223 \n", - " 3330 679 5.697948e+05 189.0 3014.787355 \n", - " 3331 2981 1.108364e+06 1774.0 624.782678 \n", - " 3332 10858 1.002577e+07 1315.0 7624.161627 \n", - " 3333 320312 1.259632e+07 48209.0 261.285553 \n", - " 3334 105 3.868382e+04 61.0 634.160984 \n", - " 3335 2722 5.286490e+06 461.0 11467.439436 \n", - " 3336 6777 1.251564e+06 3798.0 329.532420 \n", - " 3337 1259930 2.456943e+08 1253405.0 196.021476 \n", - " 3338 2601 7.764976e+05 1010.0 768.809455 \n", - " 3339 4019 1.144036e+06 1523.0 751.173007 \n", - " 3340 3970 1.217607e+05 689.0 176.720929 \n", - " 3341 1686 5.596448e+04 259.0 216.079073 \n", - " 3342 55541 4.531150e+07 35111.0 1290.521465 \n", - " 3343 3004 8.886636e+05 817.0 1087.715569 \n", - " 3344 230 1.402272e+05 177.0 792.244237 \n", - " 3345 137 2.449643e+04 66.0 371.158030 \n", - " 3346 6228 5.832158e+06 4916.0 1186.362427 \n", - " 3347 1081 7.877479e+06 461.0 17087.806421 \n", - " 3348 784 1.812725e+06 225.0 8056.554711 \n", - " 3349 6409 1.683369e+07 1291.0 13039.263292 \n", - " 3350 756 8.862169e+06 251.0 35307.445339 \n", - " 3351 27230 5.576955e+06 19754.0 282.320299 \n", - " 3352 1434 2.402353e+05 374.0 642.340481 \n", - " 3353 34613 4.187883e+06 24135.0 173.519081 \n", - " 3354 29674 2.589051e+07 4523.0 5724.190615 \n", - " 3355 6943 7.467438e+06 705.0 10592.110355 \n", - " 3356 5244 5.740192e+06 793.0 7238.577390 \n", - " 3357 98469 7.070979e+08 17044.0 41486.614924 \n", - " 3358 48693 1.273776e+08 34914.0 3648.324529 \n", - " \n", - " unit_count unit_cost_wavg user_count_non_lowincome \\\n", - " 0 8.132550e+05 0.185352 1481.0 \n", - " 1 1.372900e+05 0.198725 313.0 \n", - " 2 4.341050e+06 6.441231 1870.0 \n", - " 3 7.667130e+05 22.390673 388.0 \n", - " 4 5.529000e+04 9.300781 78.0 \n", - " 5 8.819869e+07 28.969357 78377.0 \n", - " 6 1.981610e+05 31.703590 85.0 \n", - " 7 5.513360e+04 1512.110199 255.0 \n", - " 8 5.000000e+03 909.331338 110.0 \n", - " 9 1.179100e+04 25.976187 46.0 \n", - " 10 5.725000e+04 57.595096 79.0 \n", - " 11 3.991594e+06 0.983656 2719.0 \n", - " 12 4.664500e+04 7.528275 381.0 \n", - " 13 2.499312e+07 0.492543 22320.0 \n", - " 14 1.942100e+05 1.880804 273.0 \n", - " 15 4.174480e+05 2.516733 1060.0 \n", - " 16 3.139300e+04 2.441037 86.0 \n", - " 17 1.126290e+07 0.313727 20972.0 \n", - " 18 1.721804e+08 0.188076 756070.0 \n", - " 19 1.058000e+04 14.214926 499.0 \n", - " 20 1.697379e+07 1.889624 66503.0 \n", - " 21 4.041151e+07 0.924772 13858.0 \n", - " 22 2.680150e+05 0.950389 2028.0 \n", - " 23 1.609849e+06 0.844989 2928.0 \n", - " 24 2.846366e+06 11.686228 8094.0 \n", - " 25 1.652000e+03 11.574258 NaN \n", - " 26 1.311375e+06 25.437775 4285.0 \n", - " 27 1.132413e+05 520.301951 756.0 \n", - " 28 6.015000e+02 36.464173 458.0 \n", - " 29 1.175640e+05 6.611714 130.0 \n", - " ... ... ... ... \n", - " 3329 9.206400e+04 54.454890 1281.0 \n", - " 3330 8.733000e+03 65.201987 101.0 \n", - " 3331 1.448040e+05 7.654239 1061.0 \n", - " 3332 1.632945e+06 6.135236 280.0 \n", - " 3333 3.621502e+07 0.344359 17992.0 \n", - " 3334 4.302000e+03 8.992055 29.0 \n", - " 3335 3.756450e+05 14.254630 253.0 \n", - " 3336 4.770370e+05 2.623620 2390.0 \n", - " 3337 1.257396e+06 195.399274 960052.0 \n", - " 3338 5.339743e+05 1.485818 382.0 \n", - " 3339 2.540553e+06 0.462075 180.0 \n", - " 3340 1.567680e+05 0.776694 83.0 \n", - " 3341 6.543600e+04 0.855255 35.0 \n", - " 3342 5.583524e+05 110.426018 16754.0 \n", - " 3343 1.299110e+05 6.835568 201.0 \n", - " 3344 6.966000e+03 20.133262 98.0 \n", - " 3345 8.384000e+03 2.921807 23.0 \n", - " 3346 8.045312e+04 98.008422 4490.0 \n", - " 3347 6.417800e+04 122.749805 364.0 \n", - " 3348 9.875100e+04 18.356521 106.0 \n", - " 3349 9.139120e+05 18.419376 717.0 \n", - " 3350 9.623600e+04 92.087875 191.0 \n", - " 3351 1.542135e+05 36.163858 13747.0 \n", - " 3352 9.325200e+04 2.849821 301.0 \n", - " 3353 1.007602e+05 41.562849 19380.0 \n", - " 3354 1.195800e+06 22.294253 706.0 \n", - " 3355 8.458000e+03 901.004792 19.0 \n", - " 3356 2.201872e+05 26.629006 88.0 \n", - " 3357 1.183616e+07 59.740484 13459.0 \n", - " 3358 1.113470e+07 122.211151 13046.0 \n", - " \n", - " out_of_pocket_avg_non_lowincome user_count_lowincome \\\n", - " 0 32.143275 1288.0 \n", - " 1 23.865783 306.0 \n", - " 2 263.717973 7206.0 \n", - " 3 825.371289 1433.0 \n", - " 4 351.808718 38.0 \n", - " 5 552.002600 326783.0 \n", - " 6 546.043176 866.0 \n", - " 7 872.149098 9384.0 \n", - " 8 1295.597000 147.0 \n", - " 9 288.809783 69.0 \n", - " 10 865.338101 131.0 \n", - " 11 123.584082 5039.0 \n", - " 12 84.587165 191.0 \n", - " 13 80.511871 19692.0 \n", - " 14 304.957106 194.0 \n", - " 15 295.665906 257.0 \n", - " 16 325.871860 27.0 \n", - " 17 56.890184 3354.0 \n", - " 18 9.053303 590999.0 \n", - " 19 31.748557 281.0 \n", - " 20 39.921924 33654.0 \n", - " 21 12.371589 12829.0 \n", - " 22 17.500059 1199.0 \n", - " 23 35.076991 4309.0 \n", - " 24 374.098519 4066.0 \n", - " 25 NaN NaN \n", - " 26 450.405081 4686.0 \n", - " 27 686.234762 1431.0 \n", - " 28 21.915830 86.0 \n", - " 29 530.954308 57.0 \n", - " ... ... ... \n", - " 3329 287.845371 1072.0 \n", - " 3330 345.937426 88.0 \n", - " 3331 87.656164 713.0 \n", - " 3332 690.130750 1035.0 \n", - " 3333 64.987233 30217.0 \n", - " 3334 158.121379 32.0 \n", - " 3335 1022.408142 208.0 \n", - " 3336 92.639757 1408.0 \n", - " 3337 63.440910 293353.0 \n", - " 3338 240.165602 628.0 \n", - " 3339 219.750833 1343.0 \n", - " 3340 102.461325 606.0 \n", - " 3341 108.753714 224.0 \n", - " 3342 85.046550 18357.0 \n", - " 3343 268.114627 616.0 \n", - " 3344 74.237653 79.0 \n", - " 3345 88.254348 43.0 \n", - " 3346 92.351472 426.0 \n", - " 3347 1620.619835 97.0 \n", - " 3348 530.618868 119.0 \n", - " 3349 920.585439 574.0 \n", - " 3350 1584.980890 60.0 \n", - " 3351 75.006866 6007.0 \n", - " 3352 252.379402 73.0 \n", - " 3353 49.283889 4755.0 \n", - " 3354 516.085878 3817.0 \n", - " 3355 1801.657368 686.0 \n", - " 3356 510.771932 705.0 \n", - " 3357 3011.499409 3585.0 \n", - " 3358 597.453833 21868.0 \n", - " \n", - " out_of_pocket_avg_lowincome \n", - " 0 5.132989 \n", - " 1 2.619869 \n", - " 2 7.365580 \n", - " 3 11.766329 \n", - " 4 4.390789 \n", - " 5 19.383236 \n", - " 6 10.375242 \n", - " 7 13.429633 \n", - " 8 9.677551 \n", - " 9 8.235072 \n", - " 10 27.069389 \n", - " 11 5.628156 \n", - " 12 6.695812 \n", - " 13 7.002352 \n", - " 14 17.610773 \n", - " 15 28.944825 \n", - " 16 33.515185 \n", - " 17 10.577868 \n", - " 18 1.622222 \n", - " 19 2.086655 \n", - " 20 4.999314 \n", - " 21 1.246013 \n", - " 22 1.554921 \n", - " 23 1.541868 \n", - " 24 19.800450 \n", - " 25 NaN \n", - " 26 8.340779 \n", - " 27 17.781104 \n", - " 28 3.833372 \n", - " 29 13.871053 \n", - " ... ... \n", - " 3329 15.282584 \n", - " 3330 10.549545 \n", - " 3331 6.016690 \n", - " 3332 15.000754 \n", - " 3333 6.737856 \n", - " 3334 2.600000 \n", - " 3335 40.635913 \n", - " 3336 6.182706 \n", - " 3337 5.188686 \n", - " 3338 7.329459 \n", - " 3339 3.874326 \n", - " 3340 5.126535 \n", - " 3341 6.797723 \n", - " 3342 5.512716 \n", - " 3343 14.826071 \n", - " 3344 3.871772 \n", - " 3345 11.147907 \n", - " 3346 13.901573 \n", - " 3347 14.484742 \n", - " 3348 11.141176 \n", - " 3349 13.952666 \n", - " 3350 75.399500 \n", - " 3351 5.348372 \n", - " 3352 15.020000 \n", - " 3353 5.693003 \n", - " 3354 17.564614 \n", - " 3355 20.829927 \n", - " 3356 14.604411 \n", - " 3357 131.711961 \n", - " 3358 15.012725 \n", - " \n", - " [3359 rows x 12 columns],\n", - " 2015: drugname_brand drugname_generic \\\n", - " 0 1ST TIER UNIFINE PENTIPS PEN NEEDLE, DIABETIC \n", - " 1 1ST TIER UNIFINE PENTIPS PLUS PEN NEEDLE, DIABETIC \n", - " 2 ABACAVIR ABACAVIR SULFATE \n", - " 3 ABACAVIR-LAMIVUDINE-ZIDOVUDINE ABACAVIR/LAMIVUDINE/ZIDOVUDINE \n", - " 4 ABELCET AMPHOTERICIN B LIPID COMPLEX \n", - " 5 ABILIFY ARIPIPRAZOLE \n", - " 6 ABILIFY DISCMELT ARIPIPRAZOLE \n", - " 7 ABILIFY MAINTENA ARIPIPRAZOLE \n", - " 8 ABRAXANE PACLITAXEL PROTEIN-BOUND \n", - " 9 ABSORICA ISOTRETINOIN \n", - " 10 ABSTRAL FENTANYL CITRATE \n", - " 11 ACAMPROSATE CALCIUM ACAMPROSATE CALCIUM \n", - " 12 ACANYA CLINDAMYCIN PHOS/BENZOYL PEROX \n", - " 13 ACARBOSE ACARBOSE \n", - " 14 ACCOLATE ZAFIRLUKAST \n", - " 15 ACCUPRIL QUINAPRIL HCL \n", - " 16 ACCURETIC QUINAPRIL/HYDROCHLOROTHIAZIDE \n", - " 17 ACEBUTOLOL HCL ACEBUTOLOL HCL \n", - " 18 ACETAMINOPHEN-CODEINE ACETAMINOPHEN WITH CODEINE \n", - " 19 ACETASOL HC ACETIC ACID/HYDROCORTISONE \n", - " 20 ACETAZOLAMIDE ACETAZOLAMIDE \n", - " 21 ACETIC ACID ACETIC ACID \n", - " 22 ACETIC ACID-ALUMINUM ACETIC ACID/ALUMINUM ACETATE \n", - " 23 ACETYLCYSTEINE ACETYLCYSTEINE \n", - " 24 ACIPHEX RABEPRAZOLE SODIUM \n", - " 25 ACIPHEX SPRINKLE RABEPRAZOLE SODIUM \n", - " 26 ACITRETIN ACITRETIN \n", - " 27 ACTEMRA TOCILIZUMAB \n", - " 28 ACTHIB HAEMOPH B POLY CONJ-TET TOX/PF \n", - " 29 ACTIGALL URSODIOL \n", - " ... ... ... \n", - " 3360 ZOMIG ZMT ZOLMITRIPTAN \n", - " 3361 ZONALON DOXEPIN HCL \n", - " 3362 ZONEGRAN ZONISAMIDE \n", - " 3363 ZONISAMIDE ZONISAMIDE \n", - " 3364 ZONTIVITY VORAPAXAR SULFATE \n", - " 3365 ZORBTIVE SOMATROPIN \n", - " 3366 ZORTRESS EVEROLIMUS \n", - " 3367 ZORVOLEX DICLOFENAC SUBMICRONIZED \n", - " 3368 ZOSTAVAX ZOSTER VACCINE LIVE/PF \n", - " 3369 ZOSYN PIPERACILLIN SODIUM/TAZOBACTAM \n", - " 3370 ZOSYN PIPERACILLIN-TAZO-DEXTROSE,ISO \n", - " 3371 ZOVIA 1-35E ETHYNODIOL D-ETHINYL ESTRADIOL \n", - " 3372 ZOVIA 1-50E ETHYNODIOL D-ETHINYL ESTRADIOL \n", - " 3373 ZOVIRAX ACYCLOVIR \n", - " 3374 ZUBSOLV BUPRENORPHINE HCL/NALOXONE HCL \n", - " 3375 ZUPLENZ ONDANSETRON \n", - " 3376 ZYBAN BUPROPION HCL \n", - " 3377 ZYCLARA IMIQUIMOD \n", - " 3378 ZYDELIG IDELALISIB \n", - " 3379 ZYFLO ZILEUTON \n", - " 3380 ZYFLO CR ZILEUTON \n", - " 3381 ZYKADIA CERITINIB \n", - " 3382 ZYLET TOBRAMYCIN/LOTEPRED ETAB \n", - " 3383 ZYLOPRIM ALLOPURINOL \n", - " 3384 ZYMAXID GATIFLOXACIN \n", - " 3385 ZYPREXA OLANZAPINE \n", - " 3386 ZYPREXA RELPREVV OLANZAPINE PAMOATE \n", - " 3387 ZYPREXA ZYDIS OLANZAPINE \n", - " 3388 ZYTIGA ABIRATERONE ACETATE \n", - " 3389 ZYVOX LINEZOLID \n", - " \n", - " claim_count total_spending user_count total_spending_per_user \\\n", - " 0 10749 2.578956e+05 5173.0 49.854172 \n", - " 1 2943 7.339665e+04 1470.0 49.929694 \n", - " 2 69216 2.457883e+07 9319.0 2637.496991 \n", - " 3 12216 1.662621e+07 1621.0 10256.763603 \n", - " 4 439 5.528478e+05 102.0 5420.075980 \n", - " 5 1635610 1.572428e+09 322582.0 4874.507390 \n", - " 6 2790 3.735193e+06 742.0 5033.952615 \n", - " 7 92211 1.482594e+08 14001.0 10589.199204 \n", - " 8 824 4.481988e+06 226.0 19831.804292 \n", - " 9 224 2.873885e+05 106.0 2711.212547 \n", - " 10 838 7.192141e+06 172.0 41814.770523 \n", - " 11 29170 4.292171e+06 8976.0 478.183065 \n", - " 12 799 3.605208e+05 452.0 797.612478 \n", - " 13 205723 1.187271e+07 42221.0 281.203798 \n", - " 14 1711 4.725241e+05 361.0 1308.931108 \n", - " 15 5762 1.129256e+06 1089.0 1036.966327 \n", - " 16 373 7.710543e+04 91.0 847.312418 \n", - " 17 124036 2.755576e+06 23590.0 116.811181 \n", - " 18 3678580 4.379004e+07 1721969.0 25.430215 \n", - " 19 564 7.624300e+04 462.0 165.028139 \n", - " 20 300569 3.717003e+07 105306.0 352.971628 \n", - " 21 56631 1.211100e+06 28896.0 41.912371 \n", - " 22 4633 2.727221e+05 3348.0 81.458202 \n", - " 23 25500 1.373842e+06 7633.0 179.987111 \n", - " 24 36489 3.082188e+07 7200.0 4280.816511 \n", - " 25 85 5.725266e+04 39.0 1468.016923 \n", - " 26 34369 3.093343e+07 7971.0 3880.746837 \n", - " 27 17896 4.350617e+07 2925.0 14873.902715 \n", - " 28 679 2.637143e+04 588.0 44.849371 \n", - " 29 865 8.359323e+05 190.0 4399.643789 \n", - " ... ... ... ... ... \n", - " 3360 420 5.022709e+05 103.0 4876.416505 \n", - " 3361 2508 1.293729e+06 1524.0 848.903346 \n", - " 3362 10657 1.581656e+07 1260.0 12552.823786 \n", - " 3363 337721 1.033212e+07 51124.0 202.099294 \n", - " 3364 2492 8.344622e+05 804.0 1037.888308 \n", - " 3365 16 3.903891e+05 NaN NaN \n", - " 3366 3757 7.891357e+06 671.0 11760.591073 \n", - " 3367 16384 3.491091e+06 6954.0 502.026337 \n", - " 3368 1058941 2.190629e+08 1056666.0 207.315135 \n", - " 3369 1884 4.013259e+05 864.0 464.497523 \n", - " 3370 7817 2.191070e+06 2859.0 766.376282 \n", - " 3371 2869 8.344970e+04 547.0 152.558867 \n", - " 3372 1427 4.648237e+04 244.0 190.501516 \n", - " 3373 33334 2.936627e+07 22336.0 1314.750537 \n", - " 3374 6231 1.915839e+06 1242.0 1542.543833 \n", - " 3375 143 1.203979e+05 106.0 1135.828868 \n", - " 3376 112 2.240216e+04 40.0 560.054000 \n", - " 3377 5498 5.914487e+06 4323.0 1368.144173 \n", - " 3378 5983 4.724355e+07 1448.0 32626.763170 \n", - " 3379 1256 4.051933e+06 423.0 9579.036998 \n", - " 3380 5188 1.774046e+07 1042.0 17025.395701 \n", - " 3381 1720 1.936382e+07 357.0 54240.402353 \n", - " 3382 17602 4.034668e+06 12728.0 316.991509 \n", - " 3383 1292 2.127721e+05 338.0 629.503343 \n", - " 3384 14577 1.764737e+06 10328.0 170.869162 \n", - " 3385 27439 2.446720e+07 4048.0 6044.268444 \n", - " 3386 6181 7.364940e+06 573.0 12853.298656 \n", - " 3387 4750 5.202573e+06 742.0 7011.554501 \n", - " 3388 100376 7.900497e+08 16965.0 46569.390575 \n", - " 3389 27769 8.576057e+07 21175.0 4050.085854 \n", - " \n", - " unit_count unit_cost_wavg user_count_non_lowincome \\\n", - " 0 1.335132e+06 0.193205 2878.0 \n", - " 1 3.698860e+05 0.198430 710.0 \n", - " 2 4.424163e+06 5.555590 2046.0 \n", - " 3 7.599330e+05 21.878526 377.0 \n", - " 4 4.760000e+04 11.614449 68.0 \n", - " 5 4.785505e+07 33.122425 53024.0 \n", - " 6 1.027640e+05 36.344484 53.0 \n", - " 7 9.272439e+04 1598.998908 359.0 \n", - " 8 4.478000e+03 1000.890525 105.0 \n", - " 9 1.054000e+04 27.192468 58.0 \n", - " 10 9.652600e+04 67.519883 68.0 \n", - " 11 4.604905e+06 0.932087 3190.0 \n", - " 12 4.201000e+04 8.581786 302.0 \n", - " 13 2.530595e+07 0.468984 22454.0 \n", - " 14 1.509520e+05 3.129934 217.0 \n", - " 15 3.875800e+05 2.913666 903.0 \n", - " 16 2.732000e+04 2.823054 72.0 \n", - " 17 1.096829e+07 0.251665 20411.0 \n", - " 18 2.142685e+08 0.207196 983378.0 \n", - " 19 5.965000e+03 12.781727 302.0 \n", - " 20 1.779603e+07 2.119760 70981.0 \n", - " 21 4.026651e+07 0.915819 15314.0 \n", - " 22 2.847840e+05 0.957645 2116.0 \n", - " 23 1.924030e+06 0.682714 2510.0 \n", - " 24 2.211045e+06 13.939960 4859.0 \n", - " 25 4.391000e+03 13.034604 27.0 \n", - " 26 1.287670e+06 24.189027 4502.0 \n", - " 27 1.193245e+05 677.147256 962.0 \n", - " 28 7.180000e+02 36.729011 480.0 \n", - " 29 1.191530e+05 7.015621 136.0 \n", - " ... ... ... ... \n", - " 3360 6.527000e+03 76.935470 62.0 \n", - " 3361 1.206170e+05 10.725921 963.0 \n", - " 3362 1.606968e+06 9.834950 239.0 \n", - " 3363 3.867621e+07 0.265743 19540.0 \n", - " 3364 9.364600e+04 8.910815 409.0 \n", - " 3365 3.710000e+02 1052.261725 NaN \n", - " 3366 5.292589e+05 15.086914 360.0 \n", - " 3367 1.204848e+06 2.897515 4148.0 \n", - " 3368 1.057493e+06 207.152989 777507.0 \n", - " 3369 3.305082e+05 1.320963 319.0 \n", - " 3370 4.938151e+06 0.458346 371.0 \n", - " 3371 1.158100e+05 0.720574 63.0 \n", - " 3372 5.712900e+04 0.813639 34.0 \n", - " 3373 3.035070e+05 127.361866 11905.0 \n", - " 3374 2.819860e+05 6.872800 352.0 \n", - " 3375 5.221000e+03 23.083017 57.0 \n", - " 3376 7.140000e+03 3.137557 19.0 \n", - " 3377 6.958444e+04 113.722327 3883.0 \n", - " 3378 3.534750e+05 133.654822 1161.0 \n", - " 3379 1.653340e+05 24.507558 230.0 \n", - " 3380 7.225070e+05 24.554035 576.0 \n", - " 3381 2.113210e+05 91.632273 270.0 \n", - " 3382 1.013325e+05 39.816129 8883.0 \n", - " 3383 8.137900e+04 2.829098 257.0 \n", - " 3384 4.825300e+04 36.572580 9091.0 \n", - " 3385 1.127224e+06 22.098872 549.0 \n", - " 3386 7.337000e+03 1001.650099 16.0 \n", - " 3387 2.016420e+05 26.417716 66.0 \n", - " 3388 1.202209e+07 65.716507 13424.0 \n", - " 3389 4.781132e+06 147.165852 7935.0 \n", - " \n", - " out_of_pocket_avg_non_lowincome user_count_lowincome \\\n", - " 0 27.305271 2295.0 \n", - " 1 28.071930 760.0 \n", - " 2 236.941960 7273.0 \n", - " 3 945.154324 1244.0 \n", - " 4 303.140000 34.0 \n", - " 5 519.777229 269558.0 \n", - " 6 663.647358 689.0 \n", - " 7 1131.716490 13642.0 \n", - " 8 1324.671333 121.0 \n", - " 9 375.195345 48.0 \n", - " 10 1807.481618 104.0 \n", - " 11 113.113028 5786.0 \n", - " 12 110.996424 150.0 \n", - " 13 89.787420 19767.0 \n", - " 14 345.382350 144.0 \n", - " 15 335.850853 186.0 \n", - " 16 333.760694 19.0 \n", - " 17 58.861067 3179.0 \n", - " 18 9.520728 738591.0 \n", - " 19 26.078079 160.0 \n", - " 20 48.449797 34325.0 \n", - " 21 13.230765 13582.0 \n", - " 22 20.714712 1232.0 \n", - " 23 38.077446 5123.0 \n", - " 24 485.943861 2341.0 \n", - " 25 122.832222 12.0 \n", - " 26 482.439787 3469.0 \n", - " 27 796.857017 1963.0 \n", - " 28 26.159417 108.0 \n", - " 29 597.610662 54.0 \n", - " ... ... ... \n", - " 3360 436.698226 41.0 \n", - " 3361 98.568453 561.0 \n", - " 3362 927.339414 1021.0 \n", - " 3363 60.855800 31584.0 \n", - " 3364 237.302861 395.0 \n", - " 3365 NaN NaN \n", - " 3366 1069.555889 311.0 \n", - " 3367 136.648903 2806.0 \n", - " 3368 67.931197 279159.0 \n", - " 3369 182.026928 545.0 \n", - " 3370 238.774016 2488.0 \n", - " 3371 98.826508 484.0 \n", - " 3372 112.846471 210.0 \n", - " 3373 88.297242 10431.0 \n", - " 3374 370.432756 890.0 \n", - " 3375 89.200000 49.0 \n", - " 3376 113.873158 21.0 \n", - " 3377 107.773500 440.0 \n", - " 3378 2640.403945 287.0 \n", - " 3379 442.614478 193.0 \n", - " 3380 1174.856441 466.0 \n", - " 3381 3062.101037 87.0 \n", - " 3382 65.275723 3845.0 \n", - " 3383 228.816031 81.0 \n", - " 3384 24.651745 1237.0 \n", - " 3385 585.564517 3499.0 \n", - " 3386 2145.721875 557.0 \n", - " 3387 505.443030 676.0 \n", - " 3388 3299.857621 3541.0 \n", - " 3389 607.414653 13240.0 \n", - " \n", - " out_of_pocket_avg_lowincome \n", - " 0 3.987891 \n", - " 1 3.510776 \n", - " 2 6.146343 \n", - " 3 24.187428 \n", - " 4 31.550000 \n", - " 5 16.497839 \n", - " 6 18.064644 \n", - " 7 15.852520 \n", - " 8 8.349174 \n", - " 9 14.100833 \n", - " 10 50.072788 \n", - " 11 5.141281 \n", - " 12 13.940467 \n", - " 13 6.975717 \n", - " 14 23.442917 \n", - " 15 33.892849 \n", - " 16 46.864737 \n", - " 17 10.510862 \n", - " 18 1.814137 \n", - " 19 1.896375 \n", - " 20 5.312822 \n", - " 21 1.381281 \n", - " 22 1.483076 \n", - " 23 1.547763 \n", - " 24 24.050611 \n", - " 25 11.337500 \n", - " 26 12.921012 \n", - " 27 18.302012 \n", - " 28 3.808333 \n", - " 29 12.399444 \n", - " ... ... \n", - " 3360 17.234878 \n", - " 3361 5.341515 \n", - " 3362 11.181077 \n", - " 3363 6.490770 \n", - " 3364 12.546304 \n", - " 3365 NaN \n", - " 3366 28.576141 \n", - " 3367 9.731226 \n", - " 3368 5.333436 \n", - " 3369 7.761119 \n", - " 3370 3.228963 \n", - " 3371 5.271653 \n", - " 3372 6.551667 \n", - " 3373 5.608086 \n", - " 3374 22.377742 \n", - " 3375 4.334490 \n", - " 3376 23.804286 \n", - " 3377 7.376545 \n", - " 3378 70.918188 \n", - " 3379 5.556062 \n", - " 3380 17.853004 \n", - " 3381 102.600000 \n", - " 3382 5.121927 \n", - " 3383 9.987284 \n", - " 3384 3.986726 \n", - " 3385 17.129660 \n", - " 3386 22.425404 \n", - " 3387 15.393757 \n", - " 3388 163.516326 \n", - " 3389 17.626555 \n", - " \n", - " [3390 rows x 12 columns]}" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Load up spending data for each available year\n", - "def download_year_data():\n", - " year_url_map = {\n", - " 2011: 'https://query.data.world/s/1mjkt1yjuug5hj4edxhgwhnom',\n", - " 2012: 'https://query.data.world/s/ee3n1cpxfupn33ozq515iifij',\n", - " 2013: 'https://query.data.world/s/1igu5omsev4g97xiowwpj3igr',\n", - " 2014: 'https://query.data.world/s/86zkfbit8wd3argjlnmh63daw',\n", - " 2015: 'https://query.data.world/s/2aohoqfccunny99afpktzudla'\n", - " }\n", - " \n", - " year_data = {}\n", - "\n", - " for year in year_url_map:\n", - " resp = requests.get(year_url_map[year])\n", - " resp.raise_for_status()\n", - " \n", - " filename = 'spending_{0}.feather'.format(year)\n", - " with open(filename, 'wb') as handle:\n", - " for block in resp.iter_content(1024):\n", - " handle.write(block)\n", - " \n", - " year_data[year] = feather.read_dataframe(filename)\n", - " os.remove(filename)\n", - " \n", - " return year_data\n", - "\n", - "df_years = download_year_data()\n", - "df_years" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Set the index of each DataFrame to be drug names, then remove those columns\n", - "for year in df_years:\n", - " index_values = df_years[year].iloc[:, :2].values.T\n", - " df_years[year].index = pd.MultiIndex.from_arrays(index_values)\n", - " df_years[year] = df_years[year].iloc[:, 2:]" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "\n", - "Dimensions: 5 (items) x 4498 (major_axis) x 10 (minor_axis)\n", - "Items axis: 2011 to 2015\n", - "Major_axis axis: (10 WASH , SULFACETAMIDE SODIUM ) to (ZYVOX , LINEZOLID )\n", - "Minor_axis axis: claim_count to out_of_pocket_avg_lowincome" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Create a Panel from all the individual year data\n", - "drug_spending = pd.Panel(df_years)\n", - "drug_spending" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "LANTUS/LANTUS SOLOSTAR INSULIN GLARGINE,HUM.REC.ANLOG $ 14.2B\n", - "NEXIUM ESOMEPRAZOLE MAGNESIUM $ 11.3B\n", - "CRESTOR ROSUVASTATIN CALCIUM $ 10.8B\n", - "ADVAIR DISKUS FLUTICASONE/SALMETEROL $ 10.4B\n", - "ABILIFY ARIPIPRAZOLE $ 9.4B\n", - "SPIRIVA TIOTROPIUM BROMIDE $ 9.2B\n", - "HARVONI LEDIPASVIR/SOFOSBUVIR $ 7.7B\n", - "JANUVIA SITAGLIPTIN PHOSPHATE $ 7.3B\n", - "REVLIMID LENALIDOMIDE $ 6.9B\n", - "NAMENDA MEMANTINE HCL $ 6.0B\n", - "dtype: object" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Top 10 drugs by total cumulative dollars spent, 2011-2015, descending (in billions of dollars)\n", - "(drug_spending.loc[:, :, 'total_spending'].sum().dropna().sort_values(ascending=False) / 1000000000) \\\n", - " .head(10) \\\n", - " .map(lambda x: '$ ' + ('%.1fB' % x).rjust(5, ' '))" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "SIMVASTATIN SIMVASTATIN 181.3M\n", - "LISINOPRIL LISINOPRIL 181.1M\n", - "LEVOTHYROXINE SODIUM LEVOTHYROXINE SODIUM 169.9M\n", - "AMLODIPINE BESYLATE AMLODIPINE BESYLATE 167.6M\n", - "HYDROCODONE-ACETAMINOPHEN HYDROCODONE/ACETAMINOPHEN 162.0M\n", - "OMEPRAZOLE OMEPRAZOLE 155.9M\n", - "FUROSEMIDE FUROSEMIDE 129.2M\n", - "ATORVASTATIN CALCIUM ATORVASTATIN CALCIUM 114.8M\n", - "METFORMIN HCL METFORMIN HCL 109.0M\n", - "METOPROLOL TARTRATE METOPROLOL TARTRATE 102.1M\n", - "dtype: object" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Top 10 drugs by total cumulative claims, 2011-2015, descending (in millions of claims)\n", - "(drug_spending.loc[:, :, 'claim_count'].sum().dropna().sort_values(ascending=False) / 1000000) \\\n", - " .head(10) \\\n", - " .map(lambda x: '%.1fM' % x)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
claim_counttotal_spending
OMEPRAZOLEOMEPRAZOLE27360685.06.768475e+08
NEXIUMESOMEPRAZOLE MAGNESIUM8224024.01.970138e+09
OMEPRAZOLE-SODIUM BICARBONATEOMEPRAZOLE/SODIUM BICARBONATE71956.01.547595e+07
VIMOVONAPROXEN/ESOMEPRAZOLE MAG34216.03.201527e+06
ZEGERIDOMEPRAZOLE/SODIUM BICARBONATE25275.07.420869e+06
PRILOSECOMEPRAZOLE10950.04.080108e+06
OMEPRAZOLE MAGNESIUM2056.06.260247e+05
NEXIUM I.V.ESOMEPRAZOLE SODIUM704.02.164515e+05
\n", - "
" - ], - "text/plain": [ - " claim_count \\\n", - "OMEPRAZOLE OMEPRAZOLE 27360685.0 \n", - "NEXIUM ESOMEPRAZOLE MAGNESIUM 8224024.0 \n", - "OMEPRAZOLE-SODIUM BICARBONATE OMEPRAZOLE/SODIUM BICARBONATE 71956.0 \n", - "VIMOVO NAPROXEN/ESOMEPRAZOLE MAG 34216.0 \n", - "ZEGERID OMEPRAZOLE/SODIUM BICARBONATE 25275.0 \n", - "PRILOSEC OMEPRAZOLE 10950.0 \n", - " OMEPRAZOLE MAGNESIUM 2056.0 \n", - "NEXIUM I.V. ESOMEPRAZOLE SODIUM 704.0 \n", - "\n", - " total_spending \n", - "OMEPRAZOLE OMEPRAZOLE 6.768475e+08 \n", - "NEXIUM ESOMEPRAZOLE MAGNESIUM 1.970138e+09 \n", - "OMEPRAZOLE-SODIUM BICARBONATE OMEPRAZOLE/SODIUM BICARBONATE 1.547595e+07 \n", - "VIMOVO NAPROXEN/ESOMEPRAZOLE MAG 3.201527e+06 \n", - "ZEGERID OMEPRAZOLE/SODIUM BICARBONATE 7.420869e+06 \n", - "PRILOSEC OMEPRAZOLE 4.080108e+06 \n", - " OMEPRAZOLE MAGNESIUM 6.260247e+05 \n", - "NEXIUM I.V. ESOMEPRAZOLE SODIUM 2.164515e+05 " - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Find claim counts and total spending in 2011 for all forms of omeprazole (Nexium)\n", - "all_omeprazoles = ['OMEPRAZOLE' in generic for (brand, generic) in drug_spending[2011].index.values]\n", - "drug_spending[2011][all_omeprazoles][['claim_count', 'total_spending']].dropna().sort_values(by='claim_count', ascending=False)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/datacentral/README.html b/datacentral/README.html deleted file mode 100644 index 41aefe9..0000000 --- a/datacentral/README.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - -
-

Data Central: How to Contribute, Sources, and Data Dictionaries

-

As our work continues to expand, this will be a central repository to document summaries, sources, and field names for all our data sets. Data is housed in our repo on data.world.

-
-

How Do I Contribute Data?

-
-

We’re glad you asked!

-

If you have a data source that would help with our objectives [need md version of goals statement], we’d be grateful to have it. Here’s an overview of how to most effectively contribute. Please join the discussion on our Slack channel - our group would love to work with you. (If you’re not already in the Data for Democracy Slack team, you’ll need an invitation - more info here.)

-
    -
  1. Tidy the data, using lower_snake_case for variable and file names.
  2. -
  3. Submit a pull request to this repo with a file containing a data dictionary for your data source named [datasource]_dictionary.md; it’ll be reviewed by our maintainers. We have a data dictionary template here [need to create a template], or you can look at our other dictionary files for inspiration.
  4. -
  5. Once the PR is merged, become a contributor to our repo at data.world if you haven’t already, then upload your final data set.
  6. -
  7. Edit the info for each field in your data.world dataset with a detailed description. This will help other users tremendously.
  8. -
  9. Submit a PR to update this overview file (this can be done by contributors or maintainers).
  10. -
  11. Receive our grateful thanks.
  12. -
-
-
-

Overview of Currently Available Datasets

-
-
-

1. Medicare Part D Spending Data, 2011-2015

-
-
Formats: XLSX (original); CSV, feather (tidied)
-
-
-
Original Source: US Centers for Medicare and Medicaid Services (CMS.gov)
-

This is the data that initially inspired our project.

-

The Excel file contains aggregate data for total and average spending by Medicare and by consumers, as well as total and average number of claims, for each brand name drug by year. Generic names are also included.

-

In our data.world repo, the original file has been tidied and split into one dataset per year, available in both .csv and .feather format; these are titled, for example, spending-2011.feather. We also have a feather file containing solely the unique brand names + generic names included in all five years of data (drugnames.feather).

-

Link to full data dictionary [need link - Matt will cover this]

-
-
-
-
-

2. ATC Codes

-
-
Formats: KEG (original); CSV (tidied)
-
-
-
Original Source: www.genome.jp
-

The Anatomical Therapeutic Chemical Classification System, maintained by the WHO, is used to classify drugs based on both the organ or system on which they act and their therapeutic, pharmacological and chemical properties. Procuring the codes from WHO is prohibitively expensive; our dataset is scraped from www.genome.jp.

-

Link to full data dictionary [in progress]

-
-
-
- -
-

4. Drug Uses

-
-
Formats: CSV, feather
-
-
-
Original Source: n/a
-

This is a first pass at a crosswalk between the ATC codes and Medicare Part D spending data. Work to finalize this is welcome!

-

Link to full data dictionary [in progress]

-
-
-
-
-

5. Cleaned drug data

-
-
Formats: CSV
-
-
-
Original Source: CMS.gov
-

I’ll need Stephanie to write this one!

-
-
-
-
-

6. Medical Expenditure Panel Survey (too large to query; stored on DW)

-
-
Formats: zip, CSV, feather
-
-
-
Original Source: meps.ahrq.gov
-

I’ll need Alex to write this one, and/or I’ll look at it later.

-

Link to full data dictionary [in progress]

-
-
-
-
-

7. Pharmaceutical Lobbying Transactions

-
-
Formats: CSV
-
-
-
Original Source: OpenSecrets
-

OpenSecrets has data on lobbying transactions from pharmaceutical companies and their subsidiaries, totaled by year.

-

Link to full data dictionary [in progress]

-
-
-
-
- - - - -
- - - - - - - - diff --git a/datacentral/README.md b/datacentral/README.md deleted file mode 100644 index cafa69b..0000000 --- a/datacentral/README.md +++ /dev/null @@ -1,115 +0,0 @@ -## Data Central: How to Contribute, Sources, and Data Dictionaries - -As our work continues to expand, this will be a central repository to document summaries, sources, -and field names for all our data sets. Data is housed in our [repo on data.world](https://data.world/data4democracy/drug-spending). - -### How Do I Contribute Data? - ---- - -We're glad you asked! - -If you have a data source that would help with our objectives [need md version of goals statement], -we'd be grateful to have it. Here's an overview of how to most effectively contribute. Please join -the discussion on our [Slack channel](https://datafordemocracy.slack.com/messages/drug-spending/) - -our group would love to work with you. (If you're not already in the Data for Democracy Slack team, -you'll need an invitation - more info [here](https://github.com/Data4Democracy/read-this-first).) - -1. [Tidy the data](https://en.wikipedia.org/wiki/Tidy_data), using `lower_snake_case` for variable -and file names. -1. Submit a pull request to this repo with a file containing a data dictionary for your data source -named `[datasource]_dictionary.md`; it'll be reviewed by our maintainers. We have a data dictionary -template here [need to create a template], or you can look at our other dictionary files for -inspiration. -1. Once the PR is merged, become a contributor to our -[repo at data.world](https://data.world/data4democracy/drug-spending) if you haven't already, then -upload your final data set. -1. Edit the info for each field in your data.world dataset with a detailed description. This will help other users *tremendously*. -1. Submit a PR to update this overview file (this can be done by contributors or maintainers). -1. Receive our grateful thanks. - -### Overview of Currently Available Datasets - ---- - -#### 1. [Medicare Part D Spending Data, 2011-2015](https://data.world/data4democracy/drug-spending/query/?query=--+Medicare_Drug_Spending_PartD_All_Drugs_YTD_2015_12_06_2016.xlsx%2FMethods+%28Medicare_Drug_Spending_PartD_All_Drugs_YTD_2015_12_06_2016.xlsx%29%0ASELECT+%2A+FROM+%60Medicare_Drug_Spending_PartD_All_Drugs_YTD_2015_12_06_2016.xlsx%2FMethods%60) - -###### Formats: XLSX (original); CSV, feather (tidied) -###### Original Source: US Centers for Medicare and Medicaid Services ([CMS.gov](https://www.cms.gov/Research-Statistics-Data-and-Systems/Statistics-Trends-and-Reports/Information-on-Prescription-Drugs/Downloads/Part_D_All_Drugs_2015.zip)) - -This is the data that initially inspired our project. - -The Excel file contains aggregate data for total and average spending by Medicare and by consumers, -as well as total and average number of claims, for each brand name drug by year. Generic names are -also included. - -In our data.world repo, the original file has been tidied and split into one dataset per year, -available in both .csv and .feather format; these are titled, for example, `spending-2011.feather`. -We also have a `feather` file containing solely the unique brand names + generic names included in -all five years of data (`drugnames.feather`). - -Link to full data dictionary [need link - Matt will cover this] - ---- - -#### 2. [ATC Codes](https://data.world/data4democracy/drug-spending/query/?query=--+atc-codes.csv%2Fatc-codes+%28atc-codes.csv%29%0ASELECT+%2A+FROM+%60atc-codes.csv%2Fatc-codes%60+LIMIT+5000) - -###### Formats: KEG (original); CSV (tidied) -###### Original Source: www.genome.jp - -The [Anatomical Therapeutic Chemical Classification System](https://en.wikipedia.org/wiki/Anatomical_Therapeutic_Chemical_Classification_System), maintained by the WHO, is used to classify drugs based on both the organ or system on which they act and their therapeutic, pharmacological and chemical properties. Procuring the codes from WHO is prohibitively expensive; our dataset is scraped from www.genome.jp. - -Link to full data dictionary [in progress] - ---- - -#### 3. FDA-Approved Drugs (can't get DW query link to go anywhere? will check in on this later) - -###### Formats: JSON -###### Original Source: [Center Watch](http://www.centerwatch.com/drug-information/fda-approved-drugs/therapeutic-areas) - -This dataset contains a list of FDA-approved drugs, their approval date, manufacturer, and specific -purpose. - ---- - -#### 4. [Drug Uses](https://data.world/data4democracy/drug-spending/query/?query=--+drug_uses.csv%2Fdrug_uses+%28drug_uses.csv%29%0ASELECT+%2A+FROM+%60drug_uses.csv%2Fdrug_uses%60+LIMIT+5000) - -###### Formats: CSV, feather -###### Original Source: n/a - -This is a first pass at a crosswalk between the ATC codes and Medicare Part D spending data. Work to -finalize this is welcome! - -Link to full data dictionary [in progress] - ---- - -#### 5. [Cleaned drug data](https://data.world/data4democracy/drug-spending/query/?query=--+drugdata_clean.csv%2Fdrugdata_clean+%28drugdata_clean.csv%29%0ASELECT+%2A+FROM+%60drugdata_clean.csv%2Fdrugdata_clean%60+LIMIT+5000) - -###### Formats: CSV -###### Original Source: CMS.gov - -I'll need Stephanie to write this one! - ---- - -#### 6. Medical Expenditure Panel Survey *(too large to query; stored on DW)* - -###### Formats: zip, CSV, feather -###### Original Source: meps.ahrq.gov - -I'll need Alex to write this one, and/or I'll look at it later. - -Link to full data dictionary [in progress] - ---- - -#### 7. [Pharmaceutical Lobbying Transactions](https://data.world/data4democracy/drug-spending/query/?query=--+Pharma_Lobby.csv%2FPharma_Lobby+%28Pharma_Lobby.csv%29%0ASELECT+%2A+FROM+%60Pharma_Lobby.csv%2FPharma_Lobby%60+LIMIT+5000) - -###### Formats: CSV -###### Original Source: [OpenSecrets](https://www.opensecrets.org/lobby/indusclient.php?id=h04&year=2016) - -OpenSecrets has data on lobbying transactions from pharmaceutical companies and their subsidiaries, totaled by year. - -Link to full data dictionary [in progress] diff --git a/data/README.md b/datadictionaries/README.md similarity index 95% rename from data/README.md rename to datadictionaries/README.md index b54b8f6..d8848ff 100644 --- a/data/README.md +++ b/datadictionaries/README.md @@ -17,8 +17,8 @@ you'll need an invitation - more info [here](https://github.com/Data4Democracy/r 1. [Tidy the data](https://en.wikipedia.org/wiki/Tidy_data), using `lower_snake_case` for variable and file names and ISO format (YYYY-MM-DD) for dates. -1. Fork this repo, if you haven't already. In `/data`, add a data dictionary for your data source named `[datasource]_dictionary.md`, along with any script(s) you used to scrape, tidy, etc. - - We have a [data dictionary template](data_dictionary_template.md); for more specifics, check out the other data dictionaries available in this folder. +1. Fork this repo, if you haven't already. In `/data`, add a data dictionary for your data source named `[datasource].md`, along with any script(s) you used to scrape, tidy, etc. + - We have a [data dictionary template](TEMPLATE.md); for more specifics, check out the other data dictionaries available in this folder. - Feel free to create a subfolder for your scripts if you have several files. - Be specific when you name the scripts - eg, `scrape_druglist_from_genomejp.py` is better than `drugscraping.py`. 1. Submit a pull request to this repo with your data dictionary and scripts; it'll be reviewed by our maintainers. diff --git a/data/data_dictionary_template.md b/datadictionaries/TEMPLATE.md similarity index 100% rename from data/data_dictionary_template.md rename to datadictionaries/TEMPLATE.md diff --git a/data/manufacturer_datadict.md b/datadictionaries/manufacturer.md similarity index 100% rename from data/manufacturer_datadict.md rename to datadictionaries/manufacturer.md diff --git a/data/part-d_spending_2011.md b/datadictionaries/part-d_spending_2011.md similarity index 100% rename from data/part-d_spending_2011.md rename to datadictionaries/part-d_spending_2011.md diff --git a/data/part-d_spending_2012.md b/datadictionaries/part-d_spending_2012.md similarity index 100% rename from data/part-d_spending_2012.md rename to datadictionaries/part-d_spending_2012.md diff --git a/data/part-d_spending_2013.md b/datadictionaries/part-d_spending_2013.md similarity index 100% rename from data/part-d_spending_2013.md rename to datadictionaries/part-d_spending_2013.md diff --git a/data/part-d_spending_2014.md b/datadictionaries/part-d_spending_2014.md similarity index 100% rename from data/part-d_spending_2014.md rename to datadictionaries/part-d_spending_2014.md diff --git a/data/part-d_spending_2015.md b/datadictionaries/part-d_spending_2015.md similarity index 100% rename from data/part-d_spending_2015.md rename to datadictionaries/part-d_spending_2015.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..87e1d67 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,4 @@ +## Project Documentation + +- [Project Objectives](objectives.md) +- Glossary of Pharmaceutical/Healthcare Terms (in progress) diff --git a/objectives.md b/docs/objectives.md similarity index 100% rename from objectives.md rename to docs/objectives.md diff --git a/part_b_spend_clean/.gitignore b/part_b_spend_clean/.gitignore deleted file mode 100644 index 010fea8..0000000 --- a/part_b_spend_clean/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -## Standard R .gitignore -# History files -.Rhistory -.Rapp.history - -# Session Data files -.RData - -# Example code in package build process -*-Ex.R - -# Output files from R CMD build -/*.tar.gz - -# Output files from R CMD check -/*.Rcheck/ - -# RStudio files -.Rproj.user/ - -# produced vignettes -vignettes/*.html -vignettes/*.pdf - -# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 -.httr-oauth - -# knitr and R markdown default cache directories -/*_cache/ -/cache/ - -# Temporary files created by R markdown -*.utf8.md -*.knit.md - -# drug_spending project-specific .gitignore override -!/output/part_b_spend_clean.csv -!/output/data_definitions.csv diff --git a/part_b_spend_clean/data/.gitignore b/part_b_spend_clean/data/.gitignore deleted file mode 100644 index 010fea8..0000000 --- a/part_b_spend_clean/data/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -## Standard R .gitignore -# History files -.Rhistory -.Rapp.history - -# Session Data files -.RData - -# Example code in package build process -*-Ex.R - -# Output files from R CMD build -/*.tar.gz - -# Output files from R CMD check -/*.Rcheck/ - -# RStudio files -.Rproj.user/ - -# produced vignettes -vignettes/*.html -vignettes/*.pdf - -# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 -.httr-oauth - -# knitr and R markdown default cache directories -/*_cache/ -/cache/ - -# Temporary files created by R markdown -*.utf8.md -*.knit.md - -# drug_spending project-specific .gitignore override -!/output/part_b_spend_clean.csv -!/output/data_definitions.csv diff --git a/part_b_spend_clean/part_b_spend_clean.Rproj b/part_b_spend_clean/part_b_spend_clean.Rproj deleted file mode 100644 index 8e3c2eb..0000000 --- a/part_b_spend_clean/part_b_spend_clean.Rproj +++ /dev/null @@ -1,13 +0,0 @@ -Version: 1.0 - -RestoreWorkspace: Default -SaveWorkspace: Default -AlwaysSaveHistory: Default - -EnableCodeIndexing: Yes -UseSpacesForTab: Yes -NumSpacesForTab: 2 -Encoding: UTF-8 - -RnwWeave: Sweave -LaTeX: pdfLaTeX diff --git a/python/README.md b/python/README.md new file mode 100644 index 0000000..eb6742f --- /dev/null +++ b/python/README.md @@ -0,0 +1,11 @@ +## Python + +All Python scripts and notebooks are here! Organizational structure: + +- `analysis-vis`: Formal analyses and visualizations +- `apps`: Flask app files +- `d4ddrugspending`: Anything that could be put in an importable library - scripts to read data, eg +- `datawrangling`: Dataset-specific scripts to collect and clean +- `notebooks`: Exploratory notebooks/tutorials + +Note that data.world has a [Python client](https://github.com/datadotworld/data.world-py)! Great for importing datasets directly from our repo there. diff --git a/python/analysis-vis/README.md b/python/analysis-vis/README.md new file mode 100644 index 0000000..6406641 --- /dev/null +++ b/python/analysis-vis/README.md @@ -0,0 +1,5 @@ +## analysis-vis + +Python scripts for analysis and visualizations. + +Note that data.world has a [Python client](https://github.com/datadotworld/data.world-py)! Great for importing datasets directly from our repo there. diff --git a/python/apps/README.md b/python/apps/README.md new file mode 100644 index 0000000..def3c42 --- /dev/null +++ b/python/apps/README.md @@ -0,0 +1,5 @@ +## apps + +Python app scripts. + +Note that data.world has a [Python client](https://github.com/datadotworld/data.world-py)! Great for importing datasets directly from our repo there. diff --git a/python/d4ddrugspending/README.md b/python/d4ddrugspending/README.md new file mode 100644 index 0000000..08ceb59 --- /dev/null +++ b/python/d4ddrugspending/README.md @@ -0,0 +1,5 @@ +## d4ddrugspending + +Python scripts that can be used across the project; may eventually be made into an importable package. + +Note that data.world has a [Python client](https://github.com/datadotworld/data.world-py)! Great for importing datasets directly from our repo there. diff --git a/centerwatch/drug_spend/__init__.py b/python/d4ddrugspending/centerwatch/drug_spend/__init__.py similarity index 100% rename from centerwatch/drug_spend/__init__.py rename to python/d4ddrugspending/centerwatch/drug_spend/__init__.py diff --git a/centerwatch/drug_spend/items.py b/python/d4ddrugspending/centerwatch/drug_spend/items.py similarity index 100% rename from centerwatch/drug_spend/items.py rename to python/d4ddrugspending/centerwatch/drug_spend/items.py diff --git a/centerwatch/drug_spend/middlewares.py b/python/d4ddrugspending/centerwatch/drug_spend/middlewares.py similarity index 100% rename from centerwatch/drug_spend/middlewares.py rename to python/d4ddrugspending/centerwatch/drug_spend/middlewares.py diff --git a/centerwatch/drug_spend/pipelines.py b/python/d4ddrugspending/centerwatch/drug_spend/pipelines.py similarity index 100% rename from centerwatch/drug_spend/pipelines.py rename to python/d4ddrugspending/centerwatch/drug_spend/pipelines.py diff --git a/centerwatch/drug_spend/settings.py b/python/d4ddrugspending/centerwatch/drug_spend/settings.py similarity index 100% rename from centerwatch/drug_spend/settings.py rename to python/d4ddrugspending/centerwatch/drug_spend/settings.py diff --git a/centerwatch/drug_spend/spiders/__init__.py b/python/d4ddrugspending/centerwatch/drug_spend/spiders/__init__.py similarity index 100% rename from centerwatch/drug_spend/spiders/__init__.py rename to python/d4ddrugspending/centerwatch/drug_spend/spiders/__init__.py diff --git a/centerwatch/drug_spend/spiders/centerwatch_spider.py b/python/d4ddrugspending/centerwatch/drug_spend/spiders/centerwatch_spider.py similarity index 100% rename from centerwatch/drug_spend/spiders/centerwatch_spider.py rename to python/d4ddrugspending/centerwatch/drug_spend/spiders/centerwatch_spider.py diff --git a/requirements.txt b/python/d4ddrugspending/centerwatch/requirements.txt similarity index 100% rename from requirements.txt rename to python/d4ddrugspending/centerwatch/requirements.txt diff --git a/centerwatch/scrapy.cfg b/python/d4ddrugspending/centerwatch/scrapy.cfg similarity index 100% rename from centerwatch/scrapy.cfg rename to python/d4ddrugspending/centerwatch/scrapy.cfg diff --git a/scripts/read_data.py b/python/d4ddrugspending/read_data.py similarity index 100% rename from scripts/read_data.py rename to python/d4ddrugspending/read_data.py diff --git a/python/datawrangling/README.md b/python/datawrangling/README.md new file mode 100644 index 0000000..70ed54b --- /dev/null +++ b/python/datawrangling/README.md @@ -0,0 +1,5 @@ +## datawrangling + +Python scripts for collecting/tidying specific datasets in preparation for uploading them to data.world. + +Note that data.world has a [Python client](https://github.com/datadotworld/data.world-py)! Great for importing datasets directly from our repo there. diff --git a/parse_atc_codes.py b/python/datawrangling/parse_atc_codes.py similarity index 100% rename from parse_atc_codes.py rename to python/datawrangling/parse_atc_codes.py diff --git a/python/notebooks/README.md b/python/notebooks/README.md new file mode 100644 index 0000000..3253044 --- /dev/null +++ b/python/notebooks/README.md @@ -0,0 +1,5 @@ +## notebooks + +Jupyter/iPython notebooks for exploratory analyses and tutorials. + +Note that data.world has a [Python client](https://github.com/datadotworld/data.world-py)! Great for importing datasets directly from our repo there. diff --git a/shinydashboard-medicared/testing-random-overall.feather b/shinydashboard-medicared/testing-random-overall.feather deleted file mode 100644 index 302eb9113dbeaa85138c425080d1dd6ba138b46c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40864 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 z 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 OO)WninL29~yZ;0Aywhd? diff --git a/shinydashboard-medicared/testing-random.feather b/shinydashboard-medicared/testing-random.feather deleted file mode 100644 index 470fcd31bc2b9c374c50acafe3efef1dfbcf1285..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88216 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 z 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 From cc445b28161cf42d33e2f16e7f43cbdedafdef5e Mon Sep 17 00:00:00 2001 From: Jennifer Thompson Date: Thu, 9 Feb 2017 12:33:49 -0600 Subject: [PATCH 16/20] Add @skirmer to maintainers! --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eceb19b..cafd7b0 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [**Project Leads:**](https://github.com/Data4Democracy/read-this-first/blob/master/lead-role-description.md) @mattgawarecki, @jenniferthompson -**Maintainers (people with commit access)**: @dhuppenkothen +**Maintainers (people with commit access)**: @dhuppenkothen, @skirmer **Project Description:** At its heart, this project seeks to gain a deeper understanding of where and how Medicare tax dollars are being spent. Healthcare is an increasingly important issue for many Americans; the Centers for Medicare and Medicaid Services estimate *over 41 million Americans* were enrolled in Medicare prescription drug coverage programs as of October 2016. From 22db3e76656f9b20ed2d303c7139eced96090c1d Mon Sep 17 00:00:00 2001 From: Jennifer Thompson Date: Thu, 9 Feb 2017 14:34:12 -0600 Subject: [PATCH 17/20] Correct directory name for datadictionaries --- datadictionaries/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datadictionaries/README.md b/datadictionaries/README.md index d8848ff..f4da861 100644 --- a/datadictionaries/README.md +++ b/datadictionaries/README.md @@ -17,8 +17,8 @@ you'll need an invitation - more info [here](https://github.com/Data4Democracy/r 1. [Tidy the data](https://en.wikipedia.org/wiki/Tidy_data), using `lower_snake_case` for variable and file names and ISO format (YYYY-MM-DD) for dates. -1. Fork this repo, if you haven't already. In `/data`, add a data dictionary for your data source named `[datasource].md`, along with any script(s) you used to scrape, tidy, etc. - - We have a [data dictionary template](TEMPLATE.md); for more specifics, check out the other data dictionaries available in this folder. +1. Fork this repo, if you haven't already. In `/datadictionaries`, add a data dictionary for your data source named `[datasource].md`, along with any script(s) you used to scrape, tidy, etc. + - We have a [data dictionary template](TEMPLATE.md); for more specifics, check out the other dictionaries available in this folder. - Feel free to create a subfolder for your scripts if you have several files. - Be specific when you name the scripts - eg, `scrape_druglist_from_genomejp.py` is better than `drugscraping.py`. 1. Submit a pull request to this repo with your data dictionary and scripts; it'll be reviewed by our maintainers. From 02b95af9d56c4b1cc6a7ca2f3fdd0106bc01296b Mon Sep 17 00:00:00 2001 From: Jennifer Thompson Date: Thu, 9 Feb 2017 15:51:42 -0600 Subject: [PATCH 18/20] Add link to objectives doc --- datadictionaries/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/datadictionaries/README.md b/datadictionaries/README.md index f4da861..7efbbdb 100644 --- a/datadictionaries/README.md +++ b/datadictionaries/README.md @@ -9,7 +9,7 @@ and field names for all our data sets. Data is housed in our [repo on data.world We're glad you asked! -If you have a data source that would help with our objectives [need md version of goals statement], +If you have a data source that would help with our [objectives](../docs/objectives.md), we'd be grateful to have it. Here's an overview of how to most effectively contribute. Please join the discussion on our [Slack channel](https://datafordemocracy.slack.com/messages/drug-spending/) - our group would love to work with you. (If you're not already in the Data for Democracy Slack team, From 62c92b9c02b5d02d369cf2eb972bce845a9bfe95 Mon Sep 17 00:00:00 2001 From: Jennifer Thompson Date: Thu, 9 Feb 2017 15:56:17 -0600 Subject: [PATCH 19/20] Update datadictionaries/README.md to reflect updated repo structure --- datadictionaries/README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/datadictionaries/README.md b/datadictionaries/README.md index 7efbbdb..fea0a66 100644 --- a/datadictionaries/README.md +++ b/datadictionaries/README.md @@ -17,10 +17,9 @@ you'll need an invitation - more info [here](https://github.com/Data4Democracy/r 1. [Tidy the data](https://en.wikipedia.org/wiki/Tidy_data), using `lower_snake_case` for variable and file names and ISO format (YYYY-MM-DD) for dates. -1. Fork this repo, if you haven't already. In `/datadictionaries`, add a data dictionary for your data source named `[datasource].md`, along with any script(s) you used to scrape, tidy, etc. - - We have a [data dictionary template](TEMPLATE.md); for more specifics, check out the other dictionaries available in this folder. - - Feel free to create a subfolder for your scripts if you have several files. - - Be specific when you name the scripts - eg, `scrape_druglist_from_genomejp.py` is better than `drugscraping.py`. +1. Fork this repo, if you haven't already. +1. In either [`python/datawrangling`](../python/datawrangling) or [`R/datawrangling`](../R/datawrangling), as appropriate, add any script(s) you used to scrape, tidy, etc. (If you have multiple scripts, feel free to create a subdirectory.) Be specific when you name the scripts and directories - eg, `scrape_druglist_from_genomejp.py` is better than `drugscraping.py`. +1. In `/datadictionaries`, add a data dictionary for your data source named `[datasource].md`. We have a [data dictionary template](TEMPLATE.md); for more specifics, check out the other dictionaries available in this folder. 1. Submit a pull request to this repo with your data dictionary and scripts; it'll be reviewed by our maintainers. 1. Once the PR is merged, become a contributor to our [repo at data.world](https://data.world/data4democracy/drug-spending) if you haven't already, then From e63ff4db971c9bff671d146ce13712b96122423c Mon Sep 17 00:00:00 2001 From: Claire Duvallet Date: Mon, 13 Feb 2017 20:50:29 -0500 Subject: [PATCH 20/20] update files to reflect repo structure changes --- datadictionaries/README.md | 2 +- .../usp_drug_classification.md | 0 .../datawrangling}/usp_drug_classification_tidying_script.py | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename data/usp_drug_classification_dictionary.md => datadictionaries/usp_drug_classification.md (100%) rename {data => python/datawrangling}/usp_drug_classification_tidying_script.py (100%) diff --git a/datadictionaries/README.md b/datadictionaries/README.md index a3fd808..1834188 100644 --- a/datadictionaries/README.md +++ b/datadictionaries/README.md @@ -135,4 +135,4 @@ drugs only, though it seems like it likely doesn't: "The USP DC is intended to b the [USP MMG](http://www.usp.org/usp-healthcare-professionals/usp-medicare-model-guidelines) and is developed with similar guiding principles, taxonomy, and structure of the USP Categories and Classes." -Link to full data dictionary: [usp_drug_classification_dictionary.md](usp_drug_classification_dictionary.md) +Link to full data dictionary: [usp_drug_classification.md](usp_drug_classification.md) diff --git a/data/usp_drug_classification_dictionary.md b/datadictionaries/usp_drug_classification.md similarity index 100% rename from data/usp_drug_classification_dictionary.md rename to datadictionaries/usp_drug_classification.md diff --git a/data/usp_drug_classification_tidying_script.py b/python/datawrangling/usp_drug_classification_tidying_script.py similarity index 100% rename from data/usp_drug_classification_tidying_script.py rename to python/datawrangling/usp_drug_classification_tidying_script.py