From caa51157f0ce365e76170343a8fe2908b93532fd Mon Sep 17 00:00:00 2001 From: Nivedita Singh Date: Wed, 11 Feb 2026 12:47:46 +0000 Subject: [PATCH 1/5] Code changes to fetch 2025 montly file --- .../cpi_category/cpi_category_download.py | 117 ++++++++++++++---- 1 file changed, 91 insertions(+), 26 deletions(-) diff --git a/statvar_imports/us_bls/cpi_category/cpi_category_download.py b/statvar_imports/us_bls/cpi_category/cpi_category_download.py index c282c9a8c0..9af534082e 100644 --- a/statvar_imports/us_bls/cpi_category/cpi_category_download.py +++ b/statvar_imports/us_bls/cpi_category/cpi_category_download.py @@ -118,6 +118,36 @@ def get_year_month_from_filename(filename: str) -> tuple[int, int] | None: return (year, month) return None +def url_exists(url: str, timeout: int = 10) -> bool: + """ + Checks if a URL exists without downloading the full file. + Uses GET with stream=True because BLS often blocks HEAD requests. + + Returns True if the URL is reachable (HTTP 200), + otherwise False. + """ + try: + response = requests.get( + url, + stream=True, + timeout=timeout, + allow_redirects=True + ) + + if response.status_code == 200: + return True + + logging.info( + f"URL not available (status={response.status_code}): {url}" + ) + return False + + except requests.RequestException as e: + logging.warning( + f"URL existence check failed for {url}: {e}" + ) + return False + def unzip_all_excel_files(zip_file_path: str, temp_extract_base_path: str, final_destination_base_path: str, cpi_u_w_rules: dict[str, list[int]], c_cpi_u_rules: dict[str, int])-> bool: """ @@ -298,14 +328,36 @@ def main(): logging.info("\n--- Starting targeted download process for individual Excel files ---") + # If January file of current_year is not available yet, + # treat previous year as the "current" data year. + # This prevents loss of Feb–Dec data during year rollover. + + effective_current_year = current_year + + for category_prefix in ["cpi-u", "cpi-w"]: + jan_url = ( + f"https://www.bls.gov/cpi/tables/supplemental-files/" + f"{category_prefix}-{current_year}01.xlsx" + ) + if not url_exists(jan_url, timeout=args.timeout): + effective_current_year = current_year - 1 + logging.info( + f"January {current_year} not available for {category_prefix}. " + f"Using {effective_current_year} as effective current year." + ) + if effective_current_year == current_year: + effective_max_month = current_month + else: + effective_max_month = 12 + # --- RULE 1: For 'c-cpi-u' files: Even months only, starting from Dec 2021 --- logging.info("\n--- Processing c-cpi-u files (even months, from Dec 2021 onwards) ---") start_year_ccpiu_rule = 2021 c_cpi_u_filter_rules = {'start_year': start_year_ccpiu_rule} - for year in range(start_year_ccpiu_rule, current_year + 1): + for year in range(start_year_ccpiu_rule, effective_current_year + 1): start_month_for_year_ccpiu = 12 if year == start_year_ccpiu_rule else 2 - end_month_for_year_ccpiu = current_month if year == current_year else 12 + end_month_for_year_ccpiu = effective_max_month if year == effective_current_year else 12 for month in range(start_month_for_year_ccpiu, end_month_for_year_ccpiu + 1): if month % 2 == 0: @@ -327,7 +379,7 @@ def main(): # Download January files for years *prior* to the current year (e.g., 2010-2024 January). start_year_january_cpi_uw_rule = 2010 - for year in range(start_year_january_cpi_uw_rule, current_year): # Loop up to, but *not including* current_year + for year in range(start_year_january_cpi_uw_rule, effective_current_year): # Loop up to, but *not including* current_year month = 1 # Always January month_str = f"{month:02d}" @@ -347,35 +399,48 @@ def main(): logging.error(f"Download of {category_prefix} January file {url} failed after multiple retries: {e}") # --- Handle current_year (2025) files for cpi-u and cpi-w: Ensure January AND the latest available are downloaded --- - latest_current_year_month_cpi_uw = 0 # Stores the absolute highest month found for current year (e.g., if May 2025 is found, it's 5) + # --- NEW RULE: Download ALL monthly files for effective_current_year for cpi-u and cpi-w --- + logging.info( + f"\n--- Downloading ALL monthly files for {effective_current_year} " + f"(cpi-u and cpi-w) ---" + ) - logging.info(f"\n--- Attempting to download January {current_year} files for cpi-u and cpi-w ---") - for category_prefix in ["cpi-u", "cpi-w"]: - # Explicitly attempt to download January current_year - month_jan = 1 - month_jan_str = f"{month_jan:02d}" - url_jan = f"https://www.bls.gov/cpi/tables/supplemental-files/{category_prefix}-{current_year}{month_jan_str}.xlsx" - filename_jan = url_jan.split('/')[-1] + latest_current_year_month_cpi_uw = 0 - file_save_path_jan = os.path.join(cpi_u_folder if category_prefix == "cpi-u" else cpi_w_folder, filename_jan) - try: - if download_file(url_jan, file_save_path_jan,timeout=args.timeout): - logging.info(f"Downloaded January {current_year} {category_prefix} file: {filename_jan}") - # If January is found, update latest_current_year_month_cpi_uw in case it's the only month out so far - latest_current_year_month_cpi_uw = max(latest_current_year_month_cpi_uw, month_jan) - except Exception as e: - logging.error(f"Download attempt for January {current_year} {category_prefix} file {url_jan} failed: {e}") + for category_prefix in ["cpi-u", "cpi-w"]: + for month in range(1, effective_max_month + 1): + month_str = f"{month:02d}" + url = ( + f"https://www.bls.gov/cpi/tables/supplemental-files/" + f"{category_prefix}-{effective_current_year}{month_str}.xlsx" + ) + filename = url.split("/")[-1] + + file_save_path = os.path.join( + cpi_u_folder if category_prefix == "cpi-u" else cpi_w_folder, + filename + ) - logging.info(f"\n--- Attempting to download absolute latest available {current_year} files for cpi-u and cpi-w ---") + try: + if download_file(url, file_save_path, timeout=args.timeout): + latest_current_year_month_cpi_uw = max( + latest_current_year_month_cpi_uw, month + ) + except Exception as e: + logging.error( + f"Failed to download {category_prefix} " + f"{effective_current_year}{month_str}: {e}" + ) + logging.info(f"\n--- Attempting to download absolute latest available {effective_current_year} files for cpi-u and cpi-w ---") for category_prefix in ["cpi-u", "cpi-w"]: # Iterate backward from current_month to find the highest available month. # This loop will ensure the absolute latest file (e.g., April, May) is downloaded. # If January is the only file available, this loop will also ensure it's captured # as the latest and `download_file` will skip re-downloading if already present. - for month_iter in range(current_month, 0, -1): + for month_iter in range(effective_max_month, 0, -1): month_iter_str = f"{month_iter:02d}" - url_latest = f"https://www.bls.gov/cpi/tables/supplemental-files/{category_prefix}-{current_year}{month_iter_str}.xlsx" + url_latest = f"https://www.bls.gov/cpi/tables/supplemental-files/{category_prefix}-{effective_current_year}{month_iter_str}.xlsx" filename_latest = url_latest.split('/')[-1] file_save_path_latest = os.path.join(cpi_u_folder if category_prefix == "cpi-u" else cpi_w_folder, filename_latest) @@ -384,13 +449,13 @@ def main(): # download_file will return True if downloaded or if file already existed but HTTP status was 200, # or False if 404. We want to stop at the first existing/downloadable file. if download_file(url_latest, file_save_path_latest,timeout=args.timeout): - logging.info(f"Found and downloaded/confirmed latest {category_prefix} file for {current_year}: {filename_latest}") + logging.info(f"Found and downloaded/confirmed latest {category_prefix} file for {effective_current_year}: {filename_latest}") # Update overall latest_current_year_month_cpi_uw latest_current_year_month_cpi_uw = max(latest_current_year_month_cpi_uw, month_iter) break # Found the latest for this specific category_prefix, so stop iterating for this category # else: File not found for this month, continue to next earlier month except Exception as e: - logging.error(f"Download attempt for {category_prefix} {current_year}{month_iter_str} failed after retries: {e}") + logging.error(f"Download attempt for {category_prefix} {effective_current_year}{month_iter_str} failed after retries: {e}") # Define the rules to pass to the unzip function @@ -399,12 +464,12 @@ def main(): # The `unzip_all_excel_files` function logic has been updated to handle the `latest_year` (2025) more precisely. cpi_u_w_filter_rules = { 'months': [1], # This refers to general January files from historical ZIPs (prior to current_year). - 'latest_year': current_year, + 'latest_year': effective_current_year, 'latest_month': latest_current_year_month_cpi_uw # This captures the single highest month found for current year (2025) } logging.info("\n--- Starting download process for yearly ZIP archives ---") - years_to_download_zip = list(range(2010, 2024)) # Covers 2010 up to and including 2023 + years_to_download_zip = list(range(2010, effective_current_year)) # Covers 2010 up to and including 2023 for year in years_to_download_zip: zip_url = generate_zip_url(year) From 6775466b16f1eb0eeae1579b24c50f42f12056a3 Mon Sep 17 00:00:00 2001 From: Nivedita Singh Date: Wed, 11 Feb 2026 13:03:01 +0000 Subject: [PATCH 2/5] Code changes to fetch 2025 montly file --- .../us_bls/cpi_category/cpi_category_download.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/statvar_imports/us_bls/cpi_category/cpi_category_download.py b/statvar_imports/us_bls/cpi_category/cpi_category_download.py index 9af534082e..bac9450ba1 100644 --- a/statvar_imports/us_bls/cpi_category/cpi_category_download.py +++ b/statvar_imports/us_bls/cpi_category/cpi_category_download.py @@ -345,10 +345,11 @@ def main(): f"January {current_year} not available for {category_prefix}. " f"Using {effective_current_year} as effective current year." ) - if effective_current_year == current_year: - effective_max_month = current_month - else: - effective_max_month = 12 + break + if effective_current_year == current_year: + effective_max_month = current_month + else: + effective_max_month = 12 # --- RULE 1: For 'c-cpi-u' files: Even months only, starting from Dec 2021 --- logging.info("\n--- Processing c-cpi-u files (even months, from Dec 2021 onwards) ---") From 18eddb53e906ada3a2adf17472a4b02c4c61dc07 Mon Sep 17 00:00:00 2001 From: Tarun Bali Date: Tue, 17 Feb 2026 19:08:07 +0000 Subject: [PATCH 3/5] fixed bug to consider monthly files until yearly archive --- .../cpi_category/cpi_category_download.py | 134 ++++++------------ 1 file changed, 42 insertions(+), 92 deletions(-) diff --git a/statvar_imports/us_bls/cpi_category/cpi_category_download.py b/statvar_imports/us_bls/cpi_category/cpi_category_download.py index bac9450ba1..4e0deebebc 100644 --- a/statvar_imports/us_bls/cpi_category/cpi_category_download.py +++ b/statvar_imports/us_bls/cpi_category/cpi_category_download.py @@ -118,36 +118,6 @@ def get_year_month_from_filename(filename: str) -> tuple[int, int] | None: return (year, month) return None -def url_exists(url: str, timeout: int = 10) -> bool: - """ - Checks if a URL exists without downloading the full file. - Uses GET with stream=True because BLS often blocks HEAD requests. - - Returns True if the URL is reachable (HTTP 200), - otherwise False. - """ - try: - response = requests.get( - url, - stream=True, - timeout=timeout, - allow_redirects=True - ) - - if response.status_code == 200: - return True - - logging.info( - f"URL not available (status={response.status_code}): {url}" - ) - return False - - except requests.RequestException as e: - logging.warning( - f"URL existence check failed for {url}: {e}" - ) - return False - def unzip_all_excel_files(zip_file_path: str, temp_extract_base_path: str, final_destination_base_path: str, cpi_u_w_rules: dict[str, list[int]], c_cpi_u_rules: dict[str, int])-> bool: """ @@ -328,37 +298,14 @@ def main(): logging.info("\n--- Starting targeted download process for individual Excel files ---") - # If January file of current_year is not available yet, - # treat previous year as the "current" data year. - # This prevents loss of Feb–Dec data during year rollover. - - effective_current_year = current_year - - for category_prefix in ["cpi-u", "cpi-w"]: - jan_url = ( - f"https://www.bls.gov/cpi/tables/supplemental-files/" - f"{category_prefix}-{current_year}01.xlsx" - ) - if not url_exists(jan_url, timeout=args.timeout): - effective_current_year = current_year - 1 - logging.info( - f"January {current_year} not available for {category_prefix}. " - f"Using {effective_current_year} as effective current year." - ) - break - if effective_current_year == current_year: - effective_max_month = current_month - else: - effective_max_month = 12 - # --- RULE 1: For 'c-cpi-u' files: Even months only, starting from Dec 2021 --- logging.info("\n--- Processing c-cpi-u files (even months, from Dec 2021 onwards) ---") start_year_ccpiu_rule = 2021 c_cpi_u_filter_rules = {'start_year': start_year_ccpiu_rule} - for year in range(start_year_ccpiu_rule, effective_current_year + 1): + for year in range(start_year_ccpiu_rule, current_year + 1): start_month_for_year_ccpiu = 12 if year == start_year_ccpiu_rule else 2 - end_month_for_year_ccpiu = effective_max_month if year == effective_current_year else 12 + end_month_for_year_ccpiu = current_month if year == current_year else 12 for month in range(start_month_for_year_ccpiu, end_month_for_year_ccpiu + 1): if month % 2 == 0: @@ -380,7 +327,7 @@ def main(): # Download January files for years *prior* to the current year (e.g., 2010-2024 January). start_year_january_cpi_uw_rule = 2010 - for year in range(start_year_january_cpi_uw_rule, effective_current_year): # Loop up to, but *not including* current_year + for year in range(start_year_january_cpi_uw_rule, current_year): # Loop up to, but *not including* current_year month = 1 # Always January month_str = f"{month:02d}" @@ -400,48 +347,35 @@ def main(): logging.error(f"Download of {category_prefix} January file {url} failed after multiple retries: {e}") # --- Handle current_year (2025) files for cpi-u and cpi-w: Ensure January AND the latest available are downloaded --- - # --- NEW RULE: Download ALL monthly files for effective_current_year for cpi-u and cpi-w --- - logging.info( - f"\n--- Downloading ALL monthly files for {effective_current_year} " - f"(cpi-u and cpi-w) ---" - ) - - latest_current_year_month_cpi_uw = 0 + latest_current_year_month_cpi_uw = 0 # Stores the absolute highest month found for current year (e.g., if May 2025 is found, it's 5) + logging.info(f"\n--- Attempting to download January {current_year} files for cpi-u and cpi-w ---") for category_prefix in ["cpi-u", "cpi-w"]: - for month in range(1, effective_max_month + 1): - month_str = f"{month:02d}" - url = ( - f"https://www.bls.gov/cpi/tables/supplemental-files/" - f"{category_prefix}-{effective_current_year}{month_str}.xlsx" - ) - filename = url.split("/")[-1] - - file_save_path = os.path.join( - cpi_u_folder if category_prefix == "cpi-u" else cpi_w_folder, - filename - ) + # Explicitly attempt to download January current_year + month_jan = 1 + month_jan_str = f"{month_jan:02d}" + url_jan = f"https://www.bls.gov/cpi/tables/supplemental-files/{category_prefix}-{current_year}{month_jan_str}.xlsx" + filename_jan = url_jan.split('/')[-1] - try: - if download_file(url, file_save_path, timeout=args.timeout): - latest_current_year_month_cpi_uw = max( - latest_current_year_month_cpi_uw, month - ) - except Exception as e: - logging.error( - f"Failed to download {category_prefix} " - f"{effective_current_year}{month_str}: {e}" - ) - logging.info(f"\n--- Attempting to download absolute latest available {effective_current_year} files for cpi-u and cpi-w ---") + file_save_path_jan = os.path.join(cpi_u_folder if category_prefix == "cpi-u" else cpi_w_folder, filename_jan) + try: + if download_file(url_jan, file_save_path_jan,timeout=args.timeout): + logging.info(f"Downloaded January {current_year} {category_prefix} file: {filename_jan}") + # If January is found, update latest_current_year_month_cpi_uw in case it's the only month out so far + latest_current_year_month_cpi_uw = max(latest_current_year_month_cpi_uw, month_jan) + except Exception as e: + logging.error(f"Download attempt for January {current_year} {category_prefix} file {url_jan} failed: {e}") + + logging.info(f"\n--- Attempting to download absolute latest available {current_year} files for cpi-u and cpi-w ---") for category_prefix in ["cpi-u", "cpi-w"]: # Iterate backward from current_month to find the highest available month. # This loop will ensure the absolute latest file (e.g., April, May) is downloaded. # If January is the only file available, this loop will also ensure it's captured # as the latest and `download_file` will skip re-downloading if already present. - for month_iter in range(effective_max_month, 0, -1): + for month_iter in range(current_month, 0, -1): month_iter_str = f"{month_iter:02d}" - url_latest = f"https://www.bls.gov/cpi/tables/supplemental-files/{category_prefix}-{effective_current_year}{month_iter_str}.xlsx" + url_latest = f"https://www.bls.gov/cpi/tables/supplemental-files/{category_prefix}-{current_year}{month_iter_str}.xlsx" filename_latest = url_latest.split('/')[-1] file_save_path_latest = os.path.join(cpi_u_folder if category_prefix == "cpi-u" else cpi_w_folder, filename_latest) @@ -450,13 +384,13 @@ def main(): # download_file will return True if downloaded or if file already existed but HTTP status was 200, # or False if 404. We want to stop at the first existing/downloadable file. if download_file(url_latest, file_save_path_latest,timeout=args.timeout): - logging.info(f"Found and downloaded/confirmed latest {category_prefix} file for {effective_current_year}: {filename_latest}") + logging.info(f"Found and downloaded/confirmed latest {category_prefix} file for {current_year}: {filename_latest}") # Update overall latest_current_year_month_cpi_uw latest_current_year_month_cpi_uw = max(latest_current_year_month_cpi_uw, month_iter) break # Found the latest for this specific category_prefix, so stop iterating for this category # else: File not found for this month, continue to next earlier month except Exception as e: - logging.error(f"Download attempt for {category_prefix} {effective_current_year}{month_iter_str} failed after retries: {e}") + logging.error(f"Download attempt for {category_prefix} {current_year}{month_iter_str} failed after retries: {e}") # Define the rules to pass to the unzip function @@ -465,12 +399,12 @@ def main(): # The `unzip_all_excel_files` function logic has been updated to handle the `latest_year` (2025) more precisely. cpi_u_w_filter_rules = { 'months': [1], # This refers to general January files from historical ZIPs (prior to current_year). - 'latest_year': effective_current_year, + 'latest_year': current_year, 'latest_month': latest_current_year_month_cpi_uw # This captures the single highest month found for current year (2025) } logging.info("\n--- Starting download process for yearly ZIP archives ---") - years_to_download_zip = list(range(2010, effective_current_year)) # Covers 2010 up to and including 2023 + years_to_download_zip = list(range(2010, 2026)) # Covers 2010 up to and including 2023 for year in years_to_download_zip: zip_url = generate_zip_url(year) @@ -493,6 +427,22 @@ def main(): logging.fatal(f"CRITICAL ERROR: Unzipping or processing of {filename} failed. Cannot proceed.") else: logging.info(f"Successfully processed ZIP for Year {year}.") + else: + logging.info(f"ZIP archive for {year} not found. Downloading all monthly files for cpi-u and cpi-w.") + for month in range(1, 13): + month_str = f"{month:02d}" + for category_prefix in ["cpi-u", "cpi-w"]: + url = f"https://www.bls.gov/cpi/tables/supplemental-files/{category_prefix}-{year}{month_str}.xlsx" + filename = url.split('/')[-1] + if category_prefix == "cpi-u": + file_save_path = os.path.join(cpi_u_folder, filename) + else: + file_save_path = os.path.join(cpi_w_folder, filename) + + try: + download_file(url, file_save_path, timeout=args.timeout) + except Exception as e: + logging.warning(f"Failed to download monthly file {url} for year {year} (fallback): {e}") logging.info("\n--- Listing files in respective folders after all downloads/extractions ---") logging.info("Files in 'cpi-u' folder:") From 513939a3ac68aa97165b3e0f123b1af7adc8f4aa Mon Sep 17 00:00:00 2001 From: Tarun Bali Date: Tue, 17 Feb 2026 19:37:12 +0000 Subject: [PATCH 4/5] dynamically fetch year --- statvar_imports/us_bls/cpi_category/cpi_category_download.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/statvar_imports/us_bls/cpi_category/cpi_category_download.py b/statvar_imports/us_bls/cpi_category/cpi_category_download.py index 4e0deebebc..1ab76a8f43 100644 --- a/statvar_imports/us_bls/cpi_category/cpi_category_download.py +++ b/statvar_imports/us_bls/cpi_category/cpi_category_download.py @@ -404,7 +404,7 @@ def main(): } logging.info("\n--- Starting download process for yearly ZIP archives ---") - years_to_download_zip = list(range(2010, 2026)) # Covers 2010 up to and including 2023 + years_to_download_zip = list(range(2010, current_year)) # Covers 2010 up to and including previous year for year in years_to_download_zip: zip_url = generate_zip_url(year) From 1346be1a0d9448ba53f27e899a0a868a7c33f280 Mon Sep 17 00:00:00 2001 From: Tarun Bali Date: Wed, 25 Feb 2026 04:41:14 +0000 Subject: [PATCH 5/5] modifying pvmap to add changed keys --- statvar_imports/us_bls/cpi_category/cpi_u_pvmap.csv | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/statvar_imports/us_bls/cpi_category/cpi_u_pvmap.csv b/statvar_imports/us_bls/cpi_category/cpi_u_pvmap.csv index 481366e8b2..ab5eb4d27a 100644 --- a/statvar_imports/us_bls/cpi_category/cpi_u_pvmap.csv +++ b/statvar_imports/us_bls/cpi_category/cpi_u_pvmap.csv @@ -219,6 +219,7 @@ Candy and chewing gum(5),consumerGoodsCategory,CandyAndChewingGum,unit,IndexPoin Candy and chewing gum(5)(6),consumerGoodsCategory,CandyAndChewingGum,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Canned fruits and vegetables(5),consumerGoodsCategory,CannedFruitsAndVegetables,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Canned fruits and vegetables(6),consumerGoodsCategory,CannedFruitsAndVegetables,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, +Canned fruits(4)(5)(6),consumerGoodsCategory,CannedFruits,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Canned fruits(5)(6),consumerGoodsCategory,CannedFruits,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Canned fruits(6)(7),consumerGoodsCategory,CannedFruits,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Canned vegetables(5)(6),consumerGoodsCategory,CannedVegetables,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, @@ -284,6 +285,7 @@ Delivery services(4)(5),consumerGoodsCategory,DeliveryServices,unit,IndexPointBa Delivery services(5),consumerGoodsCategory,DeliveryServices,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Delivery services(6),consumerGoodsCategory,DeliveryServices,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Dental services,consumerGoodsCategory,DentalServices,,,,,,,,,, +Dental services(4),consumerGoodsCategory,DentalServices,,,,,,,,,, Dental services(11),consumerGoodsCategory,DentalServices,,,,,,,,,, Dishes and flatware(4)(5),consumerGoodsCategory,DishesAndFlatware,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Dishes and flatware(5)(6),consumerGoodsCategory,DishesAndFlatware,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, @@ -621,6 +623,7 @@ Nonprescription drugs(11),consumerGoodsCategory,NonprescriptionDrugs,unit,IndexP Nonprescription drugs(4)(11),consumerGoodsCategory,NonprescriptionDrugs,unit,IndexPointBasePeriodDecember2009Equals100,,,,,,,, Nonprescription drugs(4)(12),consumerGoodsCategory,NonprescriptionDrugs,unit,IndexPointBasePeriodDecember2009Equals100,,,,,,,, Nonprescription drugs(5)(12),consumerGoodsCategory,NonprescriptionDrugs,unit,IndexPointBasePeriodDecember2009Equals100,,,,,,,, +Nursing homes and adult day services(4)(17),consumerGoodsCategory,NursingHomesAndAdultDayServices,unit,IndexPointBasePeriodDecember1996Equals100,,,,,,,, Nursing homes and adult day services(11)(17),consumerGoodsCategory,NursingHomesAndAdultDayServices,unit,IndexPointBasePeriodDecember1996Equals100,,,,,,,, Nursing homes and adult day services(16),consumerGoodsCategory,NursingHomesAndAdultDayServices,unit,IndexPointBasePeriodDecember1996Equals100,,,,,,,, Nursing homes and adult day services(17),consumerGoodsCategory,NursingHomesAndAdultDayServices,unit,IndexPointBasePeriodDecember1996Equals100,,,,,,,, @@ -647,6 +650,7 @@ Other fats and oils including peanut butter(6),consumerGoodsCategory,OtherFatsAn Other food at home,consumerGoodsCategory,OtherFoodAtHome,,,,,,,,,, Other food away from home(4)(5),consumerGoodsCategory,OtherFoodAwayFromHome,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Other food away from home(5)(6),consumerGoodsCategory,OtherFoodAwayFromHome,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, +Other food away from home(5),consumerGoodsCategory,OtherFoodAwayFromHome,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Other foods,consumerGoodsCategory,OtherFoods,,,,,,,,,, Other fresh fruits(5),consumerGoodsCategory,OtherFreshFruits,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Other fresh fruits(6),consumerGoodsCategory,OtherFreshFruits,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, @@ -678,6 +682,7 @@ Other personal services(4)(12),consumerGoodsCategory,OtherPersonalServices,unit, Other personal services(5)(12),consumerGoodsCategory,OtherPersonalServices,unit,IndexPointBasePeriodDecember2009Equals100,,,,,,,, Other pork including roasts and picnics(5),consumerGoodsCategory,OtherPorkIncludingRoastAndPicnic,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, "Other pork including roasts, steaks, and ribs(5)",consumerGoodsCategory,OtherPorkIncludingRoastsSteaksAndRibs,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, +"Other pork including roasts, steaks, and ribs(4)(5)",consumerGoodsCategory,OtherPorkIncludingRoastsSteaksAndRibs,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, "Other pork including roasts, steaks, and ribs(6)",consumerGoodsCategory,OtherPorkIncludingRoastsSteaksAndRibs,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Other poultry including turkey(5),consumerGoodsCategory,OtherPoultryIncludingTurkey,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Other processed fruits and vegetables including dried(5),consumerGoodsCategory,OtherProcessedFruitsAndVegetablesIncludingDried,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, @@ -687,6 +692,7 @@ Other recreation services(6),consumerGoodsCategory,OtherRecreationServices,unit, Other recreational goods(5),consumerGoodsCategory,OtherRecreationalGoods,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Other recreational goods(6),consumerGoodsCategory,OtherRecreationalGoods,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Other services,consumerGoodsCategory,OtherServices,,,,,,,,,, +Other sweets(4)(5),consumerGoodsCategory,OtherSweets,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Other sweets(5),consumerGoodsCategory,OtherSweets,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Other sweets(6),consumerGoodsCategory,OtherSweets,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Other uncooked poultry including turkey(5),consumerGoodsCategory,OtherUncookedPoultryIncludingTurkey,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, @@ -717,6 +723,7 @@ Parking fees and tolls(6)(7),consumerGoodsCategory,ParkingFeesAndTolls,unit,Inde Peanut butter(4)(5)(6),consumerGoodsCategory,PeanutButter,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Peanut butter(5)(6)(7),consumerGoodsCategory,PeanutButter,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Personal care,consumerGoodsCategory,PersonalCare,,,,,,,,,, +Personal care products,consumerGoodsCategory,PersonalCareProducts,,,,,,,,,, Personal care products(4),consumerGoodsCategory,PersonalCareProducts,,,,,,,,,, Personal care products(5),consumerGoodsCategory,PersonalCareProducts,,,,,,,,,, Personal care services(4),consumerGoodsCategory,PersonalCareServices,,,,,,,,,, @@ -745,6 +752,7 @@ Photographers and film processing(4)(5),consumerGoodsCategory,PhotographerAndFil Photographers and photo processing(4)(5),consumerGoodsCategory,PhotographersAndPhotoProcessing,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Photographers and photo processing(5)(6),consumerGoodsCategory,PhotographersAndPhotoProcessing,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Photographic equipment and supplies,consumerGoodsCategory,PhotographicEquipmentAndSupplies,,,,,,,,,, +Photographic equipment and supplies(4),consumerGoodsCategory,PhotographicEquipmentAndSupplies,,,,,,,,,, Photographic equipment(4)(5)(6),consumerGoodsCategory,PhotographicEquipment,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Photographic equipment(5)(6),consumerGoodsCategory,PhotographicEquipment,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Photographic equipment(6)(7),consumerGoodsCategory,PhotographicEquipment,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, @@ -778,6 +786,7 @@ Processed fish and seafood(6),consumerGoodsCategory,ProcessedFishAndSeafood,unit Processed fruits and vegetables(5),consumerGoodsCategory,ProcessedFruitsAndVegetables,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Processed fruits and vegetables(6),consumerGoodsCategory,ProcessedFruitsAndVegetables,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Professional services,consumerGoodsCategory,ProfessionalServices,,,,,,,,,, +Professional services(4),consumerGoodsCategory,ProfessionalServices,,,,,,,,,, "Propane, kerosene, and firewood(10)",consumerGoodsCategory,PropaneKeroseneAndFirewood,unit,IndexPointBasePeriodDecember1986Equals100,,,,,,,, "Propane, kerosene, and firewood(4)(9)",consumerGoodsCategory,PropaneKeroseneAndFirewood,unit,IndexPointBasePeriodDecember1986Equals100,,,,,,,, "Propane, kerosene, and firewood(9)",consumerGoodsCategory,PropaneKeroseneAndFirewood,unit,IndexPointBasePeriodDecember1986Equals100,,,,,,,, @@ -908,6 +917,7 @@ Uncooked beef roasts(5)(6),consumerGoodsCategory,UncookedBeefRoasts,unit,IndexPo Uncooked beef steaks(4)(5),consumerGoodsCategory,UncookedBeefSteaks,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Uncooked beef steaks(5),consumerGoodsCategory,UncookedBeefSteaks,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, Uncooked beef steaks(6),consumerGoodsCategory,UncookedBeefSteaks,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,, +Uncooked ground beef,consumerGoodsCategory,UncookedGroundBeef,,,,,,,,,, Uncooked ground beef(4),consumerGoodsCategory,UncookedGroundBeef,,,,,,,,,, Uncooked ground beef(5),consumerGoodsCategory,UncookedGroundBeef,,,,,,,,,, Uncooked other beef and veal(4)(5),consumerGoodsCategory,UncookedOtherBeefAndVeal,unit,IndexPointBasePeriodDecember1997Equals100,,,,,,,,