From 3fea897660fffdd9efeced287e1b4baef0a295e9 Mon Sep 17 00:00:00 2001 From: Smarth Gupta Date: Wed, 5 Aug 2026 12:34:49 +0000 Subject: [PATCH 1/3] adding download script, goldens and validation_config, updated mapping for latest data --- .../nces_employed_college_grads/download.py | 167 ++ .../golden_data/golden_observations.csv | 2 + .../golden_data/golden_summary_report.csv | 20 + .../nces_employed_college_grads/manifest.json | 7 +- .../test_data/nces_input.xlsx | Bin 20839 -> 19043 bytes .../test_data/ncses_output.csv | 1407 +---------------- .../test_data/ncses_output.tmcf | 14 +- .../validation_config.json | 23 + 8 files changed, 246 insertions(+), 1394 deletions(-) create mode 100644 statvar_imports/us_nces/nces_employed_college_grads/download.py create mode 100644 statvar_imports/us_nces/nces_employed_college_grads/golden_data/golden_observations.csv create mode 100644 statvar_imports/us_nces/nces_employed_college_grads/golden_data/golden_summary_report.csv create mode 100644 statvar_imports/us_nces/nces_employed_college_grads/validation_config.json diff --git a/statvar_imports/us_nces/nces_employed_college_grads/download.py b/statvar_imports/us_nces/nces_employed_college_grads/download.py new file mode 100644 index 0000000000..0537291db1 --- /dev/null +++ b/statvar_imports/us_nces/nces_employed_college_grads/download.py @@ -0,0 +1,167 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import sys +import re +from urllib.parse import urlparse +from absl import app +from absl import logging +import openpyxl +import requests + +# Add data/util to sys.path so we can import the shared wrapper functions +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) +PROJECT_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, '../../..')) +UTIL_DIR = os.path.join(PROJECT_ROOT, 'util') +if UTIL_DIR not in sys.path: + sys.path.insert(0, UTIL_DIR) + +try: + from download_util_script import download_file, _retry_method +except ImportError: + logging.fatal( + "Could not import download_file from 'util/download_util_script.py'." + ) + sys.exit(1) + +LANDING_PAGE_URL = "https://ncses.nsf.gov/surveys/national-survey-college-graduates" +FILE_PATTERN = r'/pubs/[^/]+/assets/data-tables/tables/[^/]*tab006-002\.(?:xlsx|csv)' +OUTPUT_FOLDER = os.path.join(SCRIPT_DIR, "source_files") +YEAR_HEADER_PATTERN = re.compile(r'^\s*(\d{4})[a-zA-Z*#]+\s*$') + + +def resolve_url(landing_url=LANDING_PAGE_URL, + file_pattern=FILE_PATTERN, + headers=None, + tries=3, + delay=5, + backoff=2): + """ + Scrapes landing page HTML to dynamically find matching table URL. + + Args: + landing_url: URL of the webpage containing table links. + file_pattern: Regex pattern to match the target link. + headers: Optional dictionary of HTTP headers to send with the request. + tries: Number of retry attempts. + delay: Initial delay for retries. + backoff: Backoff factor for retries. + + Returns: + str: Absolute URL of the target file, or None if not found. + """ + logging.info(f"Attempting to resolve target URL from landing page: {landing_url}") + + try: + response = _retry_method(landing_url, headers, tries, delay, backoff) + response.raise_for_status() + except (requests.exceptions.RequestException, ValueError, OSError) as e: + logging.error(f"Failed to fetch landing page '{landing_url}': {e}") + return None + except Exception as e: + logging.fatal( + f"An unexpected error occurred while fetching landing page '{landing_url}': {e}" + ) + return None + + matches = re.findall(file_pattern, response.text) + if not matches: + logging.error( + f"No link matching pattern '{file_pattern}' found on '{landing_url}'." + ) + return None + + resolved_path = matches[0] + parsed_landing = urlparse(landing_url) + base_domain = f"{parsed_landing.scheme}://{parsed_landing.netloc}" + resolved_url = f"{base_domain}{resolved_path}" + logging.info(f"Dynamically resolved download URL: {resolved_url}") + return resolved_url + + +def clean_year_headers(folder_path, max_header_row=4): + """ + Cleans year headers in downloaded Excel files by removing footnote suffixes + (e.g., '2023a' -> '2023') strictly in the top header rows (rows 1-4). + Leaves all data rows (row 5+) completely untouched. + + Args: + folder_path: Path to the directory containing downloaded Excel files. + max_header_row: Maximum row index to inspect for header columns. + + Returns: + bool: True if header cleaning succeeded, False if an error occurred. + """ + if not folder_path or not os.path.exists(folder_path): + return True + + for filename in os.listdir(folder_path): + if not filename.endswith('.xlsx'): + continue + + file_path = os.path.join(folder_path, filename) + wb = None + try: + wb = openpyxl.load_workbook(file_path) + sheet = wb.active + modified = False + for row in sheet.iter_rows(max_row=max_header_row): + for cell in row: + if isinstance(cell.value, str): + new_val = YEAR_HEADER_PATTERN.sub(r'\1', cell.value) + if new_val != cell.value: + cell.value = new_val + modified = True + if modified: + wb.save(file_path) + logging.info(f"Successfully cleaned year headers in '{file_path}'") + except (ValueError, OSError) as e: + logging.error(f"Error cleaning headers in file '{file_path}': {e}") + return False + except Exception as e: + logging.fatal( + f"An unexpected error occurred while cleaning headers in '{file_path}': {e}" + ) + return False + finally: + if wb is not None: + wb.close() + + return True + + +def main(_): + logging.set_verbosity(logging.INFO) + logging.info("Script execution started...") + + resolved_url = resolve_url(LANDING_PAGE_URL, FILE_PATTERN, None) + if not resolved_url: + logging.error("Failed to resolve URL from landing page.") + sys.exit(1) + + if not download_file(resolved_url, OUTPUT_FOLDER, False, None): + logging.error( + "File download or processing failed. Check logs for details.") + sys.exit(1) + + if not clean_year_headers(OUTPUT_FOLDER): + logging.error("Year header cleaning failed. Check logs for details.") + sys.exit(1) + + logging.info("Script processing completed successfully.") + + +if __name__ == '__main__': + app.run(main) diff --git a/statvar_imports/us_nces/nces_employed_college_grads/golden_data/golden_observations.csv b/statvar_imports/us_nces/nces_employed_college_grads/golden_data/golden_observations.csv new file mode 100644 index 0000000000..fe31f68afd --- /dev/null +++ b/statvar_imports/us_nces/nces_employed_college_grads/golden_data/golden_observations.csv @@ -0,0 +1,2 @@ +"observationAbout" +"country/USA" diff --git a/statvar_imports/us_nces/nces_employed_college_grads/golden_data/golden_summary_report.csv b/statvar_imports/us_nces/nces_employed_college_grads/golden_data/golden_summary_report.csv new file mode 100644 index 0000000000..1c9b4f84a8 --- /dev/null +++ b/statvar_imports/us_nces/nces_employed_college_grads/golden_data/golden_summary_report.csv @@ -0,0 +1,20 @@ +"ScalingFactors","MinDate","MeasurementMethods","observationPeriods","StatVar","Units","NumPlaces" +"[]","2003","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_WhiteAlone","[]","1" +"[]","2003","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino_SOCSocialScientistsRelatedWorkersOccupation","[]","1" +"[]","2003","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_AmericanIndianOrAlaskaNative","[]","1" +"[]","2003","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_AmericanIndianOrAlaskaNative","[]","1" +"[]","2003","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_OtherPacificIslander","[]","1" +"[]","2003","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino_SOCPhysicalScientistsOccupation","[]","1" +"[]","2003","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino","[]","1" +"[]","2003","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Male_SOCEngineersOccupation","[]","1" +"[]","2015","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_Asian","[]","1" +"[]","2003","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_WhiteAlone","[]","1" +"[]","2003","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_OtherPacificIslander","[]","1" +"[]","2003","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_WhiteAlone","[]","1" +"[]","2003","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Female_SOCEngineersOccupation","[]","1" +"[]","2003","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino_SOCLifeScientistsOccupation","[]","1" +"[]","2003","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCComputerMathematicalOccupation_AmericanIndianOrAlaskaNative","[]","1" +"[]","2003","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_OtherPacificIslander","[]","1" +"[]","2013","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_AmericanIndianOrAlaskaNative","[]","1" +"[]","2003","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino_SOCComputerMathematicalOccupation","[]","1" +"[]","2019","[]","[]","Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCComputerMathematicalOccupation_OtherPacificIslander","[]","1" diff --git a/statvar_imports/us_nces/nces_employed_college_grads/manifest.json b/statvar_imports/us_nces/nces_employed_college_grads/manifest.json index 720b942338..491cf40aaa 100644 --- a/statvar_imports/us_nces/nces_employed_college_grads/manifest.json +++ b/statvar_imports/us_nces/nces_employed_college_grads/manifest.json @@ -8,11 +8,12 @@ "provenance_url": "https://ncsesdata.nsf.gov/explorer/datatables?term=race&exactMatch=no&page=1&filterSuperTopic=Demographics&filterTopic=Sex&datatablespage=2", "provenance_description": "NCSES is the U.S. agency that collects and reports data on science, engineering, and technology", "scripts": [ - "../../../util/download_util_script.py --download_url=https://ncses.nsf.gov/pubs/nsf23306/assets/data-tables/tables/nsf23306-tab006-002.xlsx --output_folder=source_files", - "../../../tools/statvar_importer/stat_var_processor.py --input_data=source_files/*.xlsx --pv_map=pv_map.csv --config_file=metadata.csv --output_path=output/nces_college" + "download.py", + "../../../tools/statvar_importer/stat_var_processor.py --input_data=source_files/*.xlsx --pv_map=pv_map.csv --config_file=metadata.csv --output_path=output/nces_college --output_counters=counters/nces_college.csv" ], "source_files": [ - "source_files/*.xlsx" + "source_files/*.xlsx", + "counters/*.csv" ], "import_inputs": [ { diff --git a/statvar_imports/us_nces/nces_employed_college_grads/test_data/nces_input.xlsx b/statvar_imports/us_nces/nces_employed_college_grads/test_data/nces_input.xlsx index 103a19af4a2c84f38505dc5600779cb378fea886..38588c2661fb9b0e25ed2fd38fef3ab4e6e03949 100644 GIT binary patch literal 19043 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 -observationAbout: C:nces_college->observationAbout -observationDate: C:nces_college->observationDate -value: C:nces_college->value -variableMeasured: C:nces_college->variableMeasured -unit: C:nces_college->unit -scalingFactor: C:nces_college->scalingFactor -measurementMethod: C:nces_college->measurementMethod -observationPeriod: C:nces_college->observationPeriod +Node: E:ncses_output->E0 +observationDate: C:ncses_output->observationDate +value: C:ncses_output->value +variableMeasured: C:ncses_output->variableMeasured +observationAbout: country/USA typeOf: dcs:StatVarObservation diff --git a/statvar_imports/us_nces/nces_employed_college_grads/validation_config.json b/statvar_imports/us_nces/nces_employed_college_grads/validation_config.json new file mode 100644 index 0000000000..8a7d91f780 --- /dev/null +++ b/statvar_imports/us_nces/nces_employed_college_grads/validation_config.json @@ -0,0 +1,23 @@ +{ + "schema_version": "1.0", + "rules": [ + { + "rule_id": "check_goldens_summary_report", + "description": "Validates summary_report.csv against the golden summary data", + "validator": "GOLDENS_CHECK", + "params": { + "golden_files": "../../../../golden_data/golden_summary_report.csv", + "input_files": "../../input0/genmcf/summary_report.csv" + } + }, + { + "rule_id": "check_goldens_output_csv", + "description": "Verifies the generated output CSV data matches established critical golden records", + "validator": "GOLDENS_CHECK", + "params": { + "golden_files": "../../../../golden_data/golden_observations.csv", + "input_files": "../../nces_college.csv" + } + } + ] +} From 0592d3c78ebe23c455262088bf1df872f9144ca5 Mon Sep 17 00:00:00 2001 From: Smarth Gupta Date: Wed, 5 Aug 2026 12:40:13 +0000 Subject: [PATCH 2/3] updated test data --- .../test_data/ncses_output.csv | 112 ++++++++++++++---- .../test_data/ncses_output.tmcf | 14 ++- 2 files changed, 96 insertions(+), 30 deletions(-) diff --git a/statvar_imports/us_nces/nces_employed_college_grads/test_data/ncses_output.csv b/statvar_imports/us_nces/nces_employed_college_grads/test_data/ncses_output.csv index 5b5a44516d..2574d89d83 100644 --- a/statvar_imports/us_nces/nces_employed_college_grads/test_data/ncses_output.csv +++ b/statvar_imports/us_nces/nces_employed_college_grads/test_data/ncses_output.csv @@ -1,25 +1,87 @@ -observationDate,value,variableMeasured -2003,1710000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino -2010,2898000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino -2013,3394000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino -2015,3786000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino -2017,4280000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino -2019,4803000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino -2021,5307000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino -2023,6016000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino -2003,15111000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Female_SOCEngineersOccupation -2010,19978000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Female_SOCEngineersOccupation -2013,22052000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Female_SOCEngineersOccupation -2015,23218000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Female_SOCEngineersOccupation -2017,24900000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Female_SOCEngineersOccupation -2019,26341000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Female_SOCEngineersOccupation -2021,26493000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Female_SOCEngineersOccupation -2023,29603000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Female_SOCEngineersOccupation -2003,17463000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Male_SOCEngineersOccupation -2010,20644000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Male_SOCEngineersOccupation -2013,21787000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Male_SOCEngineersOccupation -2015,22723000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Male_SOCEngineersOccupation -2017,23323000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Male_SOCEngineersOccupation -2019,24183000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Male_SOCEngineersOccupation -2021,25271000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Male_SOCEngineersOccupation -2023,26458000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Male_SOCEngineersOccupation +observationAbout,observationDate,value,variableMeasured,unit,scalingFactor,measurementMethod,observationPeriod +country/USA,2003,1710000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino,,,, +country/USA,2010,2898000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino,,,, +country/USA,2013,3394000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino,,,, +country/USA,2015,3786000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino,,,, +country/USA,2017,4280000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino,,,, +country/USA,2019,4803000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino,,,, +country/USA,2021,5307000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino,,,, +country/USA,2023,6016000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino,,,, +country/USA,2003,15111000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Female_SOCEngineersOccupation,,,, +country/USA,2010,19978000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Female_SOCEngineersOccupation,,,, +country/USA,2013,22052000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Female_SOCEngineersOccupation,,,, +country/USA,2015,23218000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Female_SOCEngineersOccupation,,,, +country/USA,2017,24900000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Female_SOCEngineersOccupation,,,, +country/USA,2019,26341000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Female_SOCEngineersOccupation,,,, +country/USA,2021,26493000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Female_SOCEngineersOccupation,,,, +country/USA,2023,29603000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Female_SOCEngineersOccupation,,,, +country/USA,2015,18000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino_SOCLifeScientistsOccupation,,,, +country/USA,2017,46000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_HispanicOrLatino_SOCSocialScientistsRelatedWorkersOccupation,,,, +country/USA,2003,2000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCComputerMathematicalOccupation_AmericanIndianOrAlaskaNative,,,, +country/USA,2013,1000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCComputerMathematicalOccupation_AmericanIndianOrAlaskaNative,,,, +country/USA,2003,1000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_AmericanIndianOrAlaskaNative,,,, +country/USA,2017,1000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_AmericanIndianOrAlaskaNative,,,, +country/USA,2015,57000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_Asian,,,, +country/USA,2003,122000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_OtherPacificIslander,,,, +country/USA,2010,200000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_OtherPacificIslander,,,, +country/USA,2017,196000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_OtherPacificIslander,,,, +country/USA,2019,212000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_OtherPacificIslander,,,, +country/USA,2021,223000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_OtherPacificIslander,,,, +country/USA,2023,264000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_OtherPacificIslander,,,, +country/USA,2019,519000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCComputerMathematicalOccupation_OtherPacificIslander,,,, +country/USA,2003,61000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_OtherPacificIslander,,,, +country/USA,2010,72000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_OtherPacificIslander,,,, +country/USA,2013,71000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_OtherPacificIslander,,,, +country/USA,2015,64000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_OtherPacificIslander,,,, +country/USA,2017,72000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_OtherPacificIslander,,,, +country/USA,2019,105000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_OtherPacificIslander,,,, +country/USA,2021,98000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_OtherPacificIslander,,,, +country/USA,2023,116000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_OtherPacificIslander,,,, +country/USA,2003,204000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_OtherPacificIslander,,,, +country/USA,2010,244000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_OtherPacificIslander,,,, +country/USA,2013,279000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_OtherPacificIslander,,,, +country/USA,2015,240000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_OtherPacificIslander,,,, +country/USA,2017,266000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_OtherPacificIslander,,,, +country/USA,2019,296000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_OtherPacificIslander,,,, +country/USA,2021,307000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_OtherPacificIslander,,,, +country/USA,2023,233000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_OtherPacificIslander,,,, +country/USA,2003,17463000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Male_SOCEngineersOccupation,,,, +country/USA,2010,20644000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Male_SOCEngineersOccupation,,,, +country/USA,2013,21787000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Male_SOCEngineersOccupation,,,, +country/USA,2015,22723000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Male_SOCEngineersOccupation,,,, +country/USA,2017,23323000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Male_SOCEngineersOccupation,,,, +country/USA,2019,24183000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Male_SOCEngineersOccupation,,,, +country/USA,2021,25271000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Male_SOCEngineersOccupation,,,, +country/USA,2023,26458000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_Male_SOCEngineersOccupation,,,, +country/USA,2003,3000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_AmericanIndianOrAlaskaNative,,,, +country/USA,2013,1000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_AmericanIndianOrAlaskaNative,,,, +country/USA,2015,2000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_AmericanIndianOrAlaskaNative,,,, +country/USA,2010,2000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCComputerMathematicalOccupation_AmericanIndianOrAlaskaNative,,,, +country/USA,2015,1000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCComputerMathematicalOccupation_AmericanIndianOrAlaskaNative,,,, +country/USA,2019,1000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_AmericanIndianOrAlaskaNative,,,, +country/USA,2021,1000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_AmericanIndianOrAlaskaNative,,,, +country/USA,2013,2000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_AmericanIndianOrAlaskaNative,,,, +country/USA,2003,199000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_WhiteAlone,,,, +country/USA,2010,228000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_WhiteAlone,,,, +country/USA,2013,242000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_WhiteAlone,,,, +country/USA,2015,241000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_WhiteAlone,,,, +country/USA,2017,218000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_WhiteAlone,,,, +country/USA,2019,227000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_WhiteAlone,,,, +country/USA,2021,278000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_WhiteAlone,,,, +country/USA,2023,277000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCLifeScientistsOccupation_WhiteAlone,,,, +country/USA,2003,176000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_WhiteAlone,,,, +country/USA,2010,184000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_WhiteAlone,,,, +country/USA,2013,170000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_WhiteAlone,,,, +country/USA,2015,169000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_WhiteAlone,,,, +country/USA,2017,194000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_WhiteAlone,,,, +country/USA,2019,196000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_WhiteAlone,,,, +country/USA,2021,191000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_WhiteAlone,,,, +country/USA,2023,195000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCPhysicalScientistsOccupation_WhiteAlone,,,, +country/USA,2003,190000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_WhiteAlone,,,, +country/USA,2010,183000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_WhiteAlone,,,, +country/USA,2013,188000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_WhiteAlone,,,, +country/USA,2015,168000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_WhiteAlone,,,, +country/USA,2017,186000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_WhiteAlone,,,, +country/USA,2019,185000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_WhiteAlone,,,, +country/USA,2021,206000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_WhiteAlone,,,, +country/USA,2023,159000,dcid:Count_Person_EducationalAttainmentBachelorsDegreeOrHigher_Employed_SOCSocialScientistsRelatedWorkersOccupation_WhiteAlone,,,, diff --git a/statvar_imports/us_nces/nces_employed_college_grads/test_data/ncses_output.tmcf b/statvar_imports/us_nces/nces_employed_college_grads/test_data/ncses_output.tmcf index e9a1c9096d..b3a54a13ec 100644 --- a/statvar_imports/us_nces/nces_employed_college_grads/test_data/ncses_output.tmcf +++ b/statvar_imports/us_nces/nces_employed_college_grads/test_data/ncses_output.tmcf @@ -1,6 +1,10 @@ -Node: E:ncses_output->E0 -observationDate: C:ncses_output->observationDate -value: C:ncses_output->value -variableMeasured: C:ncses_output->variableMeasured -observationAbout: country/USA +Node: E:nces_college->E0 +observationAbout: C:nces_college->observationAbout +observationDate: C:nces_college->observationDate +value: C:nces_college->value +variableMeasured: C:nces_college->variableMeasured +unit: C:nces_college->unit +scalingFactor: C:nces_college->scalingFactor +measurementMethod: C:nces_college->measurementMethod +observationPeriod: C:nces_college->observationPeriod typeOf: dcs:StatVarObservation From 1f46b60c76c3e525d4784028d278f672c5bd76d1 Mon Sep 17 00:00:00 2001 From: Smarth Gupta Date: Thu, 6 Aug 2026 09:28:54 +0000 Subject: [PATCH 3/3] updated pvmap --- .../nces_employed_college_grads/download.py | 4 +- .../nces_employed_college_grads/pv_map.csv | 60 ++++++++++--------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/statvar_imports/us_nces/nces_employed_college_grads/download.py b/statvar_imports/us_nces/nces_employed_college_grads/download.py index 0537291db1..ff9616f3b9 100644 --- a/statvar_imports/us_nces/nces_employed_college_grads/download.py +++ b/statvar_imports/us_nces/nces_employed_college_grads/download.py @@ -45,7 +45,7 @@ def resolve_url(landing_url=LANDING_PAGE_URL, file_pattern=FILE_PATTERN, headers=None, - tries=3, + tries=10, delay=5, backoff=2): """ @@ -151,7 +151,7 @@ def main(_): logging.error("Failed to resolve URL from landing page.") sys.exit(1) - if not download_file(resolved_url, OUTPUT_FOLDER, False, None): + if not download_file(resolved_url, OUTPUT_FOLDER, False, None, tries=10): logging.error( "File download or processing failed. Check logs for details.") sys.exit(1) diff --git a/statvar_imports/us_nces/nces_employed_college_grads/pv_map.csv b/statvar_imports/us_nces/nces_employed_college_grads/pv_map.csv index d5e4294f2c..0052499e8d 100644 --- a/statvar_imports/us_nces/nces_employed_college_grads/pv_map.csv +++ b/statvar_imports/us_nces/nces_employed_college_grads/pv_map.csv @@ -1,38 +1,42 @@ -key,p1,v1,p2,v2,p3,v3,p4,v4,p5,v5,p6,v6,p7,v7 -2003,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2003,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed -2010,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2010,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed -2013,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2013,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed -2015,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2015,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed -2017,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2017,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed -2019,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2019,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed -2021,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2021,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed -2022,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2022,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed -2023,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2023,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed -2024,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2024,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed -2025,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2025,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed -2026,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2026,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed -2027,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2027,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed -2028,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2028,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed -2029,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2029,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed -2030,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2030,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed -Male,gender,Male,race,"""""",ethnicity,"""""",,,,,,,, -Female,gender,Female,race,"""""",ethnicity,"""""",,,,,,,, -Both sexes,gender,"""""",race,"""""",ethnicity,"""""",,,,,,,, -White,race,WhiteAlone,ethnicity,"""""",,,,,,,,,, -Black or African American,race,BlackOrAfricanAmericanAlone,ethnicity,"""""",,,,,,,,,, -Hispanic or Latino,ethnicity,HispanicOrLatino,race,"""""",,,,,,,,,, -Asian,race,Asian,ethnicity,"""""",,,,,,,,,, -American Indian or Alaska Native,race,AmericanIndianOrAlaskaNative,ethnicity,"""""",,,,,,,,,, -Native Hawaiian or Other Pacific Islander,race,OtherPacificIslander,ethnicity,"""""",,,,,,,,,, -More than one race,race,TwoOrMoreRaces,ethnicity,"""""",,,,,,,,,, +key,p1,v1,p2,v2,p3,v3,p4,v4,p5,v5,p6,v6,p7,v7,p8,v8 +2003,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2003,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed,, +2010,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2010,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed,, +2013,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2013,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed,, +2015,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2015,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed,, +2017,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2017,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed,, +2019,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2019,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed,, +2021,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2021,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed,, +2022,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2022,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed,, +2023,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2023,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed,, +2024,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2024,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed,, +2025,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2025,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed,, +2026,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2026,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed,, +2027,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2027,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed,, +2028,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2028,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed,, +2029,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2029,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed,, +2030,populationType,Person,measuredProperty,count,value,@Number,observationAbout,country/USA,observationDate,2030,educationalAttainment,BachelorsDegreeOrHigher,employmentStatus,Employed,, +Male,gender,Male,race,"""""",ethnicity,"""""",#Header,"gender,race,ethnicity",,, +Female,gender,Female,race,"""""",ethnicity,"""""",#Header,"gender,race,ethnicity",,, +Both sexes,gender,"""""",race,"""""",ethnicity,"""""",#Header,"gender,race,ethnicity",,, +Hispanic or Latino,ethnicity,HispanicOrLatino,race,"""""",#Header,"ethnicity,race",,,,, +Not Hispanic or Latino,ethnicity,NotHispanicOrLatino,race,"""""",#Header,"ethnicity,race",,,,, +White,race,WhiteAlone,ethnicity,NotHispanicOrLatino,#Header,"race,ethnicity",,,,, +Black or African American,race,BlackOrAfricanAmericanAlone,ethnicity,NotHispanicOrLatino,#Header,"race,ethnicity",,,,, +Asian,race,Asian,ethnicity,NotHispanicOrLatino,#Header,"race,ethnicity",,,,, +American Indian or Alaska Native,race,AmericanIndianOrAlaskaNative,ethnicity,NotHispanicOrLatino,#Header,"race,ethnicity",,,,, +Native Hawaiian or Other Pacific Islander,race,OtherPacificIslander,ethnicity,NotHispanicOrLatino,#Header,"race,ethnicity",,,,, +More than one race,race,TwoOrMoreRaces,ethnicity,NotHispanicOrLatino,#Header,"race,ethnicity",,,,, +Biological, agricultural, and other life scientists,occupation,SOCv2018/19-1000,,,,,,,,,,,, "Biological, agricultural, and other life scientists",occupation,SOCv2018/19-1000,,,,,,,,,,,, Computer and mathematical scientists,occupation,SOCv2018/15-0000,,,,,,,,,,,, Physical and related scientists,occupation,SOCv2018/19-2000,,,,,,,,,,,, Social and related scientists,occupation,SOCv2018/19-3000,,,,,,,,,,,, Engineers,occupation,SOCv2018/17-2000,,,,,,,,,,,, +S&E occupations,occupation,ScienceAndEngineering,,,,,,,,,,,, All S&E occupations,occupation,ScienceAndEngineering,,,,,,,,,,,, +S&E-related occupations,occupation,ScienceAndEngineeringRelated,,,,,,,,,,,, All S&E-related occupations,occupation,ScienceAndEngineeringRelated,,,,,,,,,,,, -,,,,,,,,,,,,,, +Non-S&E occupations,occupation,NonScienceAndEngineering,,,,,,,,,,,, All Non-S&E occupations,occupation,NonScienceAndEngineering,,,,,,,,,,,, D,value,0,#ignore,suppressed,,,,,,,,,, S,value,0,#ignore,suppressed,,,,,,,,,,