Tutorial: access to web services

The web services that operate in the background of the Groundwater Data website can be accessed directly from Python. This short tutorial shows you how to use them.

[1]:
import sa_gwdata

The WaterConnectSession object has some useful tools so I suggest loading the background session to use directly:

[2]:
session = sa_gwdata.get_global_session()

I think all the services are documented here.

To pick one service at random. Let’s find a list of wells in the Pike and Katarapko groundwater monitoring networks.

[3]:
response = session.get("GetObswellNetworkData", params={"Network": "KAT_FP,PIKE_FP"})
response
[3]:
<sa_gwdata.waterconnect.Response at 0x1a8918b5d50>

This object provides the raw HTTP response:

[4]:
response.response
[4]:
<Response [200]>

Most responses return JSON (some, the “bulk download” ones, return CSV)

[5]:
response.json[:5]
[5]:
[{'NAME': 'LD 5',
  'DHNO': 174806,
  'LAT': -34.3242586,
  'LON': 140.494952,
  'MAPNUM': 692900829.0,
  'MAX_DEPTH': 25.4,
  'OBSNUMBER': 'KTR043',
  'PERMIT_NO': 48454,
  'DRILL_DATE': '1999-03-24',
  'PURP_DESC': 'OBS',
  'AQ_MON': 'Tpl',
  'SWL': 18.81,
  'TDS': 2909,
  'CLASS': 'WW',
  'NRM': 'South Australian Murray-Darling Basin',
  'LOGDRILL': 'N',
  'LITHOLOG': 'Y',
  'CHEM': 'N',
  'WATER': 'Y',
  'SAL': 'Y',
  'LATEST_SWL_DATE': '2023-05-24',
  'LATEST_SAL_DATE': '2021-07-13',
  'OBSNETWORK': 'KAT_FP',
  'SWLSTATUS': 'C',
  'SALSTATUS': 'N',
  'LATEST_OPEN_DEPTH': 25.4,
  'LATEST_OPEN_DATE': '2009-06-02'},
 {'NAME': 'M27',
  'DHNO': 127433,
  'LAT': -34.3387926,
  'LON': 140.520968,
  'MAPNUM': 702900616.0,
  'MAX_DEPTH': 183.3,
  'OBSNUMBER': 'KTR023',
  'PERMIT_NO': 90777,
  'DRILL_DATE': '1980-09-25',
  'PURP_DESC': 'OBS',
  'AQ_MON': 'Ty(conf)',
  'SWL': 16.72,
  'YIELD': 0.19,
  'TDS': 15290,
  'STAT_DESC': 'UKN',
  'CLASS': 'WW',
  'NRM': 'South Australian Murray-Darling Basin',
  'LOGDRILL': 'N',
  'LITHOLOG': 'N',
  'CHEM': 'Y',
  'WATER': 'Y',
  'SAL': 'Y',
  'LATEST_SWL_DATE': '2023-05-23',
  'LATEST_SAL_DATE': '1980-09-26',
  'LATEST_YIELD_DATE': '1980-09-25',
  'OBSNETWORK': 'KAT_FP',
  'SWLSTATUS': 'C',
  'SALSTATUS': 'N',
  'LATEST_OPEN_DEPTH': 180.3,
  'LATEST_OPEN_DATE': '1980-09-25'},
 {'NAME': 'M30',
  'DHNO': 127436,
  'LAT': -34.3980486,
  'LON': 140.520293,
  'MAPNUM': 702900619.0,
  'MAX_DEPTH': 72.0,
  'OBSNUMBER': 'KTR025',
  'PERMIT_NO': 90780,
  'DRILL_DATE': '1980-09-11',
  'PURP_DESC': 'OBS',
  'AQ_MON': 'Ty(conf)',
  'SWL': 17.15,
  'YIELD': 0.95,
  'TDS': 22074,
  'STAT_DESC': 'CAP',
  'CLASS': 'WW',
  'NRM': 'South Australian Murray-Darling Basin',
  'LOGDRILL': 'N',
  'LITHOLOG': 'N',
  'CHEM': 'Y',
  'WATER': 'Y',
  'SAL': 'Y',
  'LATEST_SWL_DATE': '2023-05-24',
  'LATEST_SAL_DATE': '1980-09-12',
  'LATEST_YIELD_DATE': '1980-09-12',
  'OBSNETWORK': 'KAT_FP',
  'SWLSTATUS': 'C',
  'SALSTATUS': 'N',
  'LATEST_OPEN_DEPTH': 72.0,
  'LATEST_OPEN_DATE': '2009-06-02'},
 {'NAME': 'M31',
  'DHNO': 127437,
  'LAT': -34.4236476,
  'LON': 140.52022,
  'MAPNUM': 702900620.0,
  'MAX_DEPTH': 30.0,
  'OBSNUMBER': 'KTR026',
  'PERMIT_NO': 90781,
  'DRILL_DATE': '1980-09-16',
  'PURP_DESC': 'OBS',
  'AQ_MON': 'Qam',
  'SWL': 1.28,
  'YIELD': 0.0,
  'TDS': 12761,
  'STAT_DESC': 'CAP',
  'CLASS': 'WW',
  'NRM': 'South Australian Murray-Darling Basin',
  'LOGDRILL': 'N',
  'LITHOLOG': 'N',
  'CHEM': 'Y',
  'WATER': 'Y',
  'SAL': 'Y',
  'LATEST_SWL_DATE': '2023-05-24',
  'LATEST_SAL_DATE': '1981-01-27',
  'LATEST_YIELD_DATE': '1980-09-15',
  'OBSNETWORK': 'KAT_FP',
  'SWLSTATUS': 'C',
  'SALSTATUS': 'N',
  'LATEST_OPEN_DEPTH': 29.4,
  'LATEST_OPEN_DATE': '2009-06-22'},
 {'NAME': 'M35',
  'DHNO': 127438,
  'LAT': -34.4643006,
  'LON': 140.535539,
  'MAPNUM': 702900621.0,
  'MAX_DEPTH': 72.0,
  'OBSNUMBER': 'PYP008',
  'PERMIT_NO': 90782,
  'DRILL_DATE': '1980-06-12',
  'PURP_DESC': 'OBS',
  'AQ_MON': 'Ty(conf)',
  'SWL': 30.16,
  'YIELD': 0.25,
  'TDS': 3663,
  'STAT_DESC': 'CAP',
  'CLASS': 'WW',
  'NRM': 'South Australian Murray-Darling Basin',
  'LOGDRILL': 'N',
  'LITHOLOG': 'N',
  'CHEM': 'Y',
  'WATER': 'Y',
  'SAL': 'Y',
  'LATEST_SWL_DATE': '2020-06-12',
  'LATEST_SAL_DATE': '1985-06-21',
  'LATEST_YIELD_DATE': '1980-06-12',
  'OBSNETWORK': 'KAT_FP',
  'SWLSTATUS': 'H',
  'SALSTATUS': 'N',
  'LATEST_OPEN_DEPTH': 69.9,
  'LATEST_OPEN_DATE': '2009-06-22'}]

The majority of JSON is composed of a relatively flat list, and the sa_gwdata.Response object converts this to a pandas DataFrame:

[6]:
response.df.head()
[6]:
name dhno lat lon mapnum max_depth obsnumber permit_no drill_date purp_desc ... obsnetwork swlstatus salstatus latest_open_depth latest_open_date yield stat_desc latest_yield_date pwa replaceunitnum
0 LD 5 174806 -34.324259 140.494952 692900829.0 25.4 KTR043 48454.0 1999-03-24 OBS ... KAT_FP C N 25.4 2009-06-02 NaN NaN NaN NaN NaN
1 M27 127433 -34.338793 140.520968 702900616.0 183.3 KTR023 90777.0 1980-09-25 OBS ... KAT_FP C N 180.3 1980-09-25 0.19 UKN 1980-09-25 NaN NaN
2 M30 127436 -34.398049 140.520293 702900619.0 72.0 KTR025 90780.0 1980-09-11 OBS ... KAT_FP C N 72.0 2009-06-02 0.95 CAP 1980-09-12 NaN NaN
3 M31 127437 -34.423648 140.520220 702900620.0 30.0 KTR026 90781.0 1980-09-16 OBS ... KAT_FP C N 29.4 2009-06-22 0.00 CAP 1980-09-15 NaN NaN
4 M35 127438 -34.464301 140.535539 702900621.0 72.0 PYP008 90782.0 1980-06-12 OBS ... KAT_FP H N 69.9 2009-06-22 0.25 CAP 1980-06-12 NaN NaN

5 rows × 32 columns

[7]:
response.df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 222 entries, 0 to 221
Data columns (total 32 columns):
 #   Column             Non-Null Count  Dtype
---  ------             --------------  -----
 0   name               194 non-null    object
 1   dhno               222 non-null    int64
 2   lat                222 non-null    float64
 3   lon                222 non-null    float64
 4   mapnum             222 non-null    float64
 5   max_depth          221 non-null    float64
 6   obsnumber          222 non-null    object
 7   permit_no          157 non-null    float64
 8   drill_date         193 non-null    object
 9   purp_desc          213 non-null    object
 10  aq_mon             217 non-null    object
 11  swl                200 non-null    float64
 12  tds                184 non-null    float64
 13  class              222 non-null    object
 14  nrm                222 non-null    object
 15  logdrill           222 non-null    object
 16  litholog           222 non-null    object
 17  chem               222 non-null    object
 18  water              222 non-null    object
 19  sal                222 non-null    object
 20  latest_swl_date    220 non-null    object
 21  latest_sal_date    184 non-null    object
 22  obsnetwork         222 non-null    object
 23  swlstatus          222 non-null    object
 24  salstatus          222 non-null    object
 25  latest_open_depth  213 non-null    float64
 26  latest_open_date   221 non-null    object
 27  yield              81 non-null     float64
 28  stat_desc          57 non-null     object
 29  latest_yield_date  81 non-null     object
 30  pwa                101 non-null    object
 31  replaceunitnum     1 non-null      object
dtypes: float64(9), int64(1), object(22)
memory usage: 55.6+ KB
[ ]:

[ ]:

[ ]: