Jun-14-2021, 04:52 PM
A first pass could be splitting the USA and Australia requests out into their own functions.
import requests import json import argparse import time import pandas as pd import warnings warnings.filterwarnings("ignore") def get_usa_data(df, year, latitude, longitude): parameters = { 'lat1': latitude, # [deg] 'lon1': longitude, # [deg] 'model': 'IGRF', # [Model] 'startYear': None, # [year] 'startMonth': 7, # [month] 'startDay':1, # [date] 'resultFormat': 'json', # [format] } hostname = "http://www.ngdc.noaa.gov/geomag-web/calculators/calculateDeclination?%s" for year in range(startYear, endYear): try: parameters["year"] = year response = requests.get(hostname, params=dict(parameters, ps=str(year))) # extract JSON payload of response as Python dictionary json_payload = response.json() # raise an Exception if we encoutnered any HTTP error codes like 404 response.raise_for_status() except requests.exceptions.ConnectionError as e: # handle any typo errors in url or endpoint, or just patchy internet connection print(e) except requests.exceptions.HTTPError as e: # handle HTTP error codes in the response print(e, json_payload['error']) except requests.exceptions.RequestException as e: # general error handling print(e, json_payload['error']) else: json_payload = response.json() #print(json.dumps(json_payload, indent=4, sort_keys=True)) row_df = pd.DataFrame(json_payload['result']) new_row = { "SourceFile": hostname, "Year": year, "Magnetic Declination": row_df.iloc[0, 2], "Latitude": -35, "Longitude": 145 } df = df.append(new_row, ignore_index=True) return df def get_australia_data(df, year, latitude, longitude): parameters = { "latd": latitude, # [deg] "latm": 00, # [deg] "lats": 00, # [deg] "lond": longitude, # [deg] "lonm": 00, # [deg] "lons": 00, # [deg] "elev" : 00, # [km] "year" : None, # [YYYY] "month" : '07', # [MM] "day": '01', # [DD] "Ein": 'D' # [Model] } hostname = "https://api.geomagnetism.ga.gov.au/agrf" try: parameters["year"] = year response = requests.get(hostname, params=dict(parameters, ps=str(year))) # extract JSON payload of response as Python dictionary json_payload = response.json() # raise an Exception if we encoutnered any HTTP error codes like 404 response.raise_for_status() except requests.exceptions.ConnectionError as e: # handle any typo errors in url or endpoint, or just patchy internet connection print(e) except requests.exceptions.HTTPError as e: # handle HTTP error codes in the response print(e, json_payload['error']) except requests.exceptions.RequestException as e: # general error handling print(e, json_payload['error']) else: json_payload = response.json() #print(json.dumps(json_payload, indent=4, sort_keys=True)) row_df = pd.DataFrame(json_payload) new_row = { "SourceFile": hostname, "Year": year, "Magnetic Declination": row_df.iloc[5, 3], "Latitude": latitude, "Longitude": longitude } df = df.append(new_row, ignore_index=True) if __name__ == '__main__': start = time.time() parser = argparse.ArgumentParser(description="Process some integers.") parser.add_argument("-latitude", help="Latitude(Degress)") parser.add_argument("-longitude", help="Longitude(Degress)") parser.add_argument("-startYear", help="Start of the Year") parser.add_argument("-endYear", help="End of the Year") parser.add_argument("--verbose", help="display processing information") args = parser.parse_args() latitude = args.latitude longitude = args.longitude startYear = int(args.startYear) endYear = int(args.endYear) verbose = args.verbose usa_data = pd.DataFrame() australia_data = pd.DataFrame() for year in range(startYear, endYear): if year < 1985: get_usa_data(usa_data, year, latitude, longitude) else: get_australia_data(australia_data, year, latitude, longitude) usa_data = usa_data[['Year', 'Latitude', 'Longitude','Magnetic Declination','SourceFile']] usa_data.to_csv('magnetic_declination_usa.csv', index=False) australia_data = australia_data[['Year', 'Latitude', 'Longitude','Magnetic Declination','SourceFile']] australia_data.to_csv('magnetic_declination_australia.csv', index=False) combined_data = pd.concat([usa_data, australia_data], axis=0) combined_data.to_csv('Magnetic_Declination_(USA+Australia).csv', index=False) print("Processed time:", time.time() - start) # Total Time