diff --git a/aodn_cloud_optimised/bin/vessel_underway_csiro.py b/aodn_cloud_optimised/bin/vessel_underway_csiro.py new file mode 120000 index 00000000..579d8acc --- /dev/null +++ b/aodn_cloud_optimised/bin/vessel_underway_csiro.py @@ -0,0 +1 @@ +generic_launcher.py \ No newline at end of file diff --git a/aodn_cloud_optimised/config/dataset/vessel_underway_csiro.json b/aodn_cloud_optimised/config/dataset/vessel_underway_csiro.json new file mode 100644 index 00000000..d997f7a7 --- /dev/null +++ b/aodn_cloud_optimised/config/dataset/vessel_underway_csiro.json @@ -0,0 +1,1046 @@ +{ + "dataset_name": "vessel_underway_csiro", + "logger_name": "vessel_underway_csiro", + "cloud_optimised_format": "parquet", + "run_settings": { + "paths": [ + { + "s3_uri": "s3://imos-data/IMOS_UDW", + "filter": [ + ".*\\.nc" + ], + "year_range": [] + } + ], + "cluster": { + "mode": "local", + "restart_every_path": false + }, + "clear_existing_data": true, + "raise_error": false, + "coiled_cluster_options": { + "n_workers": [ + 1, + 20 + ], + "scheduler_vm_types": "m7i-flex.large", + "worker_vm_types": "m7i-flex.large", + "allow_ingress_from": "me", + "compute_purchase_option": "spot_with_fallback", + "worker_options": { + "nthreads": 4, + "memory_limit": "8GB" + } + }, + "batch_size": 5, + "s3_bucket_opts": { + "input_data": { + "bucket": "imos-data", + "s3_fs_opts": { + "key": "minioadmin", + "secret": "minioadmin", + "client_kwargs": { + "endpoint_url": "http://localhost:9000" + } + } + }, + "output_data": { + "bucket": "aodn-cloud-optimised", + "s3_fs_opts": { + "key": "minioadmin", + "secret": "minioadmin", + "client_kwargs": { + "endpoint_url": "http://localhost:9000" + } + } + } + }, + "force_previous_parquet_deletion": false + }, + "metadata_uuid": null, + "schema": { + "history": { + "type": "string", + "long_name": "History entry" + }, + "historyIdent": { + "type": "string", + "long_name": "Person making history entry" + }, + "historyDate": { + "type": "double", + "long_name": "Date of history entry", + "units": "yyyymmdd UTC" + }, + "rawLatitude": { + "type": "double", + "long_name": "Raw Latitude", + "units": "degree_north" + }, + "latitude": { + "type": "double", + "long_name": "Latitude", + "units": "degree_north" + }, + "latitudeQC": { + "type": "float" + }, + "rawLongitude": { + "type": "double", + "long_name": "Raw Longitude", + "units": "degree_east" + }, + "longitude": { + "type": "double", + "long_name": "Longitude", + "units": "degree_east" + }, + "longitudeQC": { + "type": "float" + }, + "rawAlt": { + "type": "double", + "long_name": "Raw Altitude", + "units": "m" + }, + "alt": { + "type": "double", + "long_name": "Altitude", + "units": "m" + }, + "altQC": { + "type": "float" + }, + "rawSpeedOG": { + "type": "double", + "long_name": "Raw Speed Over Ground", + "units": "knot" + }, + "speedOG": { + "type": "double", + "long_name": "Speed Over Ground", + "units": "knot" + }, + "speedOGQC": { + "type": "float" + }, + "rawCourseOG": { + "type": "double", + "long_name": "Raw Course Over Ground", + "units": "degree" + }, + "courseOG": { + "type": "double", + "long_name": "Course Over Ground", + "units": "degree" + }, + "courseOGQC": { + "type": "float" + }, + "rawShipHeading": { + "type": "double", + "long_name": "Raw Ship Heading", + "units": "degree" + }, + "shipHeading": { + "type": "double", + "long_name": "Ship Heading", + "units": "degree" + }, + "shipHeadingQC": { + "type": "float" + }, + "rawDepth": { + "type": "double", + "long_name": "Raw Depth", + "units": "m" + }, + "depth": { + "type": "double", + "long_name": "Depth", + "units": "m" + }, + "depthQC": { + "type": "float" + }, + "longitudinalWaterSpeed": { + "type": "double", + "long_name": "Longitudinal Water Speed", + "units": "knot" + }, + "longitudinalWaterSpeedQC": { + "type": "float" + }, + "transverseWaterSpeed": { + "type": "double", + "long_name": "Transverse Water Speed", + "units": "knot" + }, + "transverseWaterSpeedQC": { + "type": "float" + }, + "longitudinalGroundSpeed": { + "type": "double", + "long_name": "Longitudinal Ground Speed", + "units": "knot" + }, + "longitudinalGroundSpeedQC": { + "type": "float" + }, + "transverseGroundSpeed": { + "type": "double", + "long_name": "Transverse Ground Speed", + "units": "knot" + }, + "transverseGroundSpeedQC": { + "type": "float" + }, + "lockOnWater": { + "type": "float" + }, + "lockonGround": { + "type": "float" + }, + "rawPortAirTemp": { + "type": "double", + "long_name": "Raw Port Air Temperature", + "units": "degC" + }, + "portAirTemp": { + "type": "double", + "long_name": "Port Air Temperature", + "units": "degC" + }, + "portAirTempQC": { + "type": "float" + }, + "rawPortHumidity": { + "type": "double", + "long_name": "Raw Port Humidity", + "units": "%" + }, + "portHumidity": { + "type": "double", + "long_name": "Port Humidity", + "units": "%" + }, + "portHumidityQC": { + "type": "float" + }, + "rawStbdAirTemp": { + "type": "double", + "long_name": "Raw Starboard Air Temperature", + "units": "degC" + }, + "stbdAirTemp": { + "type": "double", + "long_name": "Starboard Air Temperature", + "units": "degC" + }, + "stbdAirTempQC": { + "type": "float" + }, + "rawStbdHumidity": { + "type": "double", + "long_name": "Raw Starboard Humidity", + "units": "%" + }, + "stbdHumidity": { + "type": "double", + "long_name": "Starboard Humidity", + "units": "%" + }, + "stbdHumidityQC": { + "type": "float" + }, + "rawMaxWindGust": { + "type": "double", + "long_name": "Raw Maximum Wind Gust", + "units": "knot" + }, + "maxWindGust": { + "type": "double", + "long_name": "Maximum Wind Gust", + "units": "knot" + }, + "maxWindGustQC": { + "type": "float" + }, + "rawPortRelWindDir": { + "type": "double", + "long_name": "Raw Port Relative Wind Direction", + "units": "degree" + }, + "portRelWindDir": { + "type": "double", + "long_name": "Port Relative Wind Direction", + "units": "degree" + }, + "portRelWindDirQC": { + "type": "float" + }, + "rawPortRelWindSpeed": { + "type": "double", + "long_name": "Raw Port Relative Wind Speed", + "units": "knot" + }, + "portRelWindSpeed": { + "type": "double", + "long_name": "Port Relative Wind Speed", + "units": "knot" + }, + "portRelWindSpeedQC": { + "type": "float" + }, + "rawPortTrueWindDir": { + "type": "double", + "long_name": "Raw Port True Wind Direction", + "units": "degree" + }, + "portTrueWindDir": { + "type": "double", + "long_name": "Port True Wind Direction", + "units": "degree" + }, + "portTrueWindDirQC": { + "type": "float" + }, + "rawPortTrueWindSpeed": { + "type": "double", + "long_name": "Raw Port True Wind Speed", + "units": "knot" + }, + "portTrueWindSpeed": { + "type": "double", + "long_name": "Port True Wind Speed", + "units": "knot" + }, + "portTrueWindSpeedQC": { + "type": "float" + }, + "rawStbdRelWindDir": { + "type": "double", + "long_name": "Raw Starboard Relative Wind Direction", + "units": "degree" + }, + "stbdRelWindDir": { + "type": "double", + "long_name": "Starboard Relative Wind Direction", + "units": "degree" + }, + "stbdRelWindDirQC": { + "type": "float" + }, + "rawStbdRelWindSpeed": { + "type": "double", + "long_name": "Raw Starboard Relative Wind Speed", + "units": "knot" + }, + "stbdRelWindSpeed": { + "type": "double", + "long_name": "Starboard Relative Wind Speed", + "units": "knot" + }, + "stbdRelWindSpeedQC": { + "type": "float" + }, + "rawStbdTrueWindDir": { + "type": "double", + "long_name": "Raw Starboard True Wind Direction", + "units": "degree" + }, + "stbdTrueWindDir": { + "type": "double", + "long_name": "Starboard True Wind Direction", + "units": "degree" + }, + "stbdTrueWindDirQC": { + "type": "float" + }, + "rawStbdTrueWindSpeed": { + "type": "double", + "long_name": "Raw Starboard True Wind Speed", + "units": "knot" + }, + "stbdTrueWindSpeed": { + "type": "double", + "long_name": "Starboard True Wind Speed", + "units": "knot" + }, + "stbdTrueWindSpeedQC": { + "type": "float" + }, + "rawAtmPressure": { + "type": "double", + "long_name": "Raw Atmospheric Pressure", + "units": "mbar" + }, + "atmPressure": { + "type": "double", + "long_name": "Atmospheric Pressure", + "units": "mbar" + }, + "atmPressureQC": { + "type": "float" + }, + "rawUltrasonicRelWindSpeed": { + "type": "double", + "long_name": "Raw Ultrasonic Relative Wind Speed", + "units": "knot" + }, + "ultrasonicRelWindSpeed": { + "type": "double", + "long_name": "Ultrasonic Relative Wind Speed", + "units": "knot" + }, + "ultrasonicRelWindSpeedQC": { + "type": "float" + }, + "rawUltrasonicRelWindDir": { + "type": "double", + "long_name": "Raw Ultrasonic Relative Wind Direction", + "units": "degree" + }, + "ultrasonicRelWindDir": { + "type": "double", + "long_name": "Ultrasonic Relative Wind Direction", + "units": "degree" + }, + "ultrasonicRelWindDirQC": { + "type": "float" + }, + "rawUltrasonicTrueWindSpeed": { + "type": "double", + "long_name": "Raw Ultrasonic True Wind Speed", + "units": "knot" + }, + "ultrasonicTrueWindSpeed": { + "type": "double", + "long_name": "Ultrasonic True Wind Speed", + "units": "knot" + }, + "ultrasonicTrueWindSpeedQC": { + "type": "float" + }, + "rawUltrasonicTrueWindDir": { + "type": "double", + "long_name": "Raw Ultrasonic True Wind Direction", + "units": "degree" + }, + "ultrasonicTrueWindDir": { + "type": "double", + "long_name": "Ultrasonic True Wind Direction", + "units": "degree" + }, + "ultrasonicTrueWindDirQC": { + "type": "float" + }, + "rawRain": { + "type": "double", + "long_name": "Raw Accumulated Hourly Rain", + "units": "mm" + }, + "rain": { + "type": "double", + "long_name": "Accumulated Hourly Rain", + "units": "mm" + }, + "rainQC": { + "type": "float" + }, + "rawPortRadiometer": { + "type": "double", + "long_name": "Raw Port Radiometer", + "units": "W/m^2" + }, + "portRadiometer": { + "type": "double", + "long_name": "Port Radiometer", + "units": "W/m^2" + }, + "portRadiometerQC": { + "type": "float" + }, + "rawStbdRadiometer": { + "type": "double", + "long_name": "Raw Starboard Radiometer", + "units": "W/m^2" + }, + "stbdRadiometer": { + "type": "double", + "long_name": "Starboard Radiometer", + "units": "W/m^2" + }, + "stbdRadiometerQC": { + "type": "float" + }, + "rawPortPyranometer": { + "type": "double", + "long_name": "Raw Port Pyranometer", + "units": "W/m^2" + }, + "portPyranometer": { + "type": "double", + "long_name": "Port Pyranometer", + "units": "W/m^2" + }, + "portPyranometerQC": { + "type": "float" + }, + "rawStbdPyranometer": { + "type": "double", + "long_name": "Raw Starboard Pyranometer", + "units": "W/m^2" + }, + "stbdPyranometer": { + "type": "double", + "long_name": "Starboard Pyranometer", + "units": "W/m^2" + }, + "stbdPyranometerQC": { + "type": "float" + }, + "rawPortPAR": { + "type": "double", + "long_name": "Raw Port PAR", + "units": "uE/m^2/s" + }, + "portPAR": { + "type": "double", + "long_name": "Port PAR", + "units": "uE/m^2/s" + }, + "portPARQC": { + "type": "float" + }, + "rawStbdPAR": { + "type": "double", + "long_name": "Raw Starboard PAR", + "units": "uE/m^2/s" + }, + "stbdPAR": { + "type": "double", + "long_name": "Starboard PAR", + "units": "uE/m^2/s" + }, + "stbdPARQC": { + "type": "float" + }, + "rawGyroHeading": { + "type": "double", + "long_name": "Raw Gyro Heading", + "units": "degree" + }, + "gyroHeading": { + "type": "double", + "long_name": "Gyro Heading", + "units": "degree" + }, + "gyroHeadingQC": { + "type": "float" + }, + "equTemp": { + "type": "double", + "long_name": "Equilibrator Water Temperature", + "units": "degC" + }, + "equTempQC": { + "type": "float" + }, + "XCO2": { + "type": "double", + "long_name": "XCO2", + "units": "ppm" + }, + "XCO2QC": { + "type": "float" + }, + "waterVapour": { + "type": "double", + "long_name": "Water Vapour", + "units": "mmol/mole" + }, + "waterVapourQC": { + "type": "float" + }, + "licorPressure": { + "type": "double", + "long_name": "Licor Pressure", + "units": "hPa" + }, + "licorPressureQC": { + "type": "float" + }, + "equPressure": { + "type": "double", + "long_name": "Equilibrator Pressure", + "units": "hPa" + }, + "equPressureQC": { + "type": "float" + }, + "waterFlow": { + "type": "double", + "long_name": "Water Flow", + "units": "l/min" + }, + "waterFlowQC": { + "type": "float" + }, + "licorFlow": { + "type": "double", + "long_name": "Licor flow", + "units": "ml/min" + }, + "licorFlowQC": { + "type": "float" + }, + "ventFlow": { + "type": "double", + "long_name": "Vent Flow", + "units": "ml/min" + }, + "ventFlowQC": { + "type": "float" + }, + "condTemp": { + "type": "double", + "long_name": "Condenser Temperature", + "units": "degC" + }, + "condTempQC": { + "type": "float" + }, + "pumpSpeed": { + "type": "double", + "long_name": "CO2 Pump Speed", + "units": "l/min" + }, + "pumpSpeedQC": { + "type": "float" + }, + "rawIsarWaterTemp": { + "type": "double", + "long_name": "Raw ISAR Water Temperature", + "units": "degC" + }, + "isarWaterTemp": { + "type": "double", + "long_name": "ISAR Water Temperature", + "units": "degC" + }, + "isarWaterTempQC": { + "type": "float" + }, + "portKeelExtension": { + "type": "double", + "long_name": "Port Drop Keel Extension", + "units": "m" + }, + "portKeelExtensionQC": { + "type": "float" + }, + "starboardKeelExtension": { + "type": "double", + "long_name": "Starboard Drop Keel Extension", + "units": "m" + }, + "starboardKeelExtensionQC": { + "type": "float" + }, + "blackCarbonConc": { + "type": "double", + "long_name": "Concentration of Black Carbon", + "units": "ug/m^3" + }, + "blackCarbonConcQC": { + "type": "float" + }, + "airFlow": { + "type": "double", + "long_name": "Air Flow Rate", + "units": "L/h" + }, + "airFlowQC": { + "type": "float" + }, + "absorptionPhotometerStatus": { + "type": "float" + }, + "o3Ozone1": { + "type": "double", + "long_name": "Ozone1", + "units": "ppb" + }, + "o3Ozone1QC": { + "type": "float" + }, + "ozone1Meterflags": { + "type": "float" + }, + "o3Ozone2": { + "type": "double", + "long_name": "Ozone2", + "units": "ppb" + }, + "o3Ozone2QC": { + "type": "float" + }, + "ozone2Meterflags": { + "type": "float" + }, + "co2Dry": { + "type": "double", + "long_name": "CO2 Dry Concentration", + "units": "ppm" + }, + "co2DryQC": { + "type": "float" + }, + "ch4Dry": { + "type": "double", + "long_name": "CH4 Dry Concentration", + "units": "ppm" + }, + "ch4DryQC": { + "type": "float" + }, + "h2O": { + "type": "double", + "long_name": "Water Concentration Percentage", + "units": "dimensionless" + }, + "h2OQC": { + "type": "float" + }, + "inletBearing": { + "type": "double", + "long_name": "Air Sampling Inlet Bearing", + "units": "degree" + }, + "inletBearingQC": { + "type": "float" + }, + "trackingBearing": { + "type": "double", + "long_name": "Tracking Target Bearing", + "units": "degree" + }, + "trackingBearingQC": { + "type": "float" + }, + "trackingMode": { + "type": "float" + }, + "rawWaterTemp": { + "type": "double", + "long_name": "Raw Water Temperature", + "units": "degC" + }, + "waterTemp": { + "type": "double", + "long_name": "Water Temperature", + "units": "degC" + }, + "waterTempQC": { + "type": "float" + }, + "rawTsgSensorTemp": { + "type": "double", + "long_name": "Raw TSG Sensor Temperature", + "units": "degC" + }, + "tsgSensorTemp": { + "type": "double", + "long_name": "TSG Sensor Temperature", + "units": "degC" + }, + "tsgSensorTempQC": { + "type": "float" + }, + "rawSalinity": { + "type": "double", + "long_name": "Raw Salinity", + "units": "PSU" + }, + "salinity": { + "type": "double", + "long_name": "Salinity", + "units": "PSU" + }, + "salinityQC": { + "type": "float" + }, + "rawTsgFlow": { + "type": "double", + "long_name": "Raw TSG Flow Rate", + "units": "l/min" + }, + "tsgFlow": { + "type": "double", + "long_name": "TSG Flow Rate", + "units": "l/min" + }, + "tsgFlowQC": { + "type": "float" + }, + "rawFluorescence": { + "type": "double", + "long_name": "Raw Fluorescence", + "units": "dimensionless" + }, + "fluorescence": { + "type": "double", + "long_name": "Fluorescence", + "units": "dimensionless" + }, + "fluorescenceQC": { + "type": "float" + }, + "rawLabMainFlow": { + "type": "double", + "long_name": "Raw UWY Lab Main Flow", + "units": "l/min" + }, + "labMainFlow": { + "type": "double", + "long_name": "UWY Lab Main Flow", + "units": "l/min" + }, + "labMainFlowQC": { + "type": "float" + }, + "rawLabBranchFlow": { + "type": "double", + "long_name": "Raw UWY Lab Branch Flow", + "units": "l/min" + }, + "labBranchFlow": { + "type": "double", + "long_name": "UWY Lab Branch Flow", + "units": "l/min" + }, + "labBranchFlowQC": { + "type": "float" + }, + "rawDo": { + "type": "double", + "long_name": "Raw Oxygen at the Optode", + "units": "uM/L" + }, + "do": { + "type": "double", + "long_name": "Oxygen at the Optode", + "units": "uM/L" + }, + "doQC": { + "type": "float" + }, + "rawDoSaturation": { + "type": "double", + "long_name": "Raw Oxygen Saturation at the Optode", + "units": "%" + }, + "doSaturation": { + "type": "double", + "long_name": "Oxygen Saturation at the Optode", + "units": "%" + }, + "doSaturationQC": { + "type": "float" + }, + "rawOptodeWaterTemp": { + "type": "double", + "long_name": "Raw Water Temperature at the Optode", + "units": "degC" + }, + "optodeWaterTemp": { + "type": "double", + "long_name": "Water Temperature at the Optode", + "units": "degC" + }, + "optodeWaterTempQC": { + "type": "float" + }, + "stbdRainQC": { + "type": "float" + }, + "rawPortRain": { + "type": "float", + "long_name": "Raw Port Accumulated Hourly Rain", + "units": "mm" + }, + "rawStbdRain": { + "type": "float", + "long_name": "Raw Starboard Accumulated Hourly Rain", + "units": "mm" + }, + "portRain": { + "type": "float", + "long_name": "Port Accumulated Hourly Rain", + "units": "mm" + }, + "rawFluorometerFlow": { + "type": "float", + "long_name": "Raw Water Flow in Fluorometer Branch", + "units": "l/min" + }, + "fluorescenceConcentration": { + "type": "float", + "long_name": "Fluorescence Concentration", + "units": "ug/L" + }, + "fluorescenceConcentrationQC": { + "type": "float" + }, + "modeoftheAirSamplingInlet": { + "type": "float" + }, + "bPhase": { + "type": "float", + "long_name": "Optode bPhase", + "units": "dimensionless" + }, + "bPhaseQC": { + "type": "float" + }, + "portRainQC": { + "type": "float" + }, + "TIME": { + "type": "timestamp[ns]" + } + }, + "aws_opendata_registry": { + "Name": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "Description": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "Documentation": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "Contact": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "ManagedBy": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "UpdateFrequency": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "Tags": [ + "FILL UP MANUALLY - CHECK DOCUMENTATION" + ], + "License": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "Resources": [ + { + "Description": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "ARN": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "Region": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "Type": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "Explore": [ + "FILL UP MANUALLY - CHECK DOCUMENTATION" + ] + } + ], + "DataAtWork": { + "Tutorials": [ + { + "Title": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "URL": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "Services": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "AuthorName": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "AuthorURL": "FILL UP MANUALLY - CHECK DOCUMENTATION" + } + ], + "Tools & Applications": [ + { + "Title": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "URL": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "AuthorName": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "AuthorURL": "FILL UP MANUALLY - CHECK DOCUMENTATION" + } + ], + "Publications": [ + { + "Title": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "URL": "FILL UP MANUALLY - CHECK DOCUMENTATION", + "AuthorName": "FILL UP MANUALLY - CHECK DOCUMENTATION" + } + ] + } + }, + "schema_transformation": { + "drop_variables": [ + "historyIdent", + "historyDate", + "history" + ], + "add_variables": { + "filename": { + "source": "@filename", + "schema": { + "type": "string", + "units": "1", + "long_name": "Filename of the source file" + } + }, + "voyage": { + "source": "@global_attribute:Voyage", + "schema": { + "type": "string", + "units": "1", + "long_name": "Name of the voyage" + } + }, + "ship_name": { + "source": "@global_attribute:Ship", + "schema": { + "type": "string", + "units": "1", + "long_name": "Name of the vessel" + } + }, + "timestamp": { + "source": "@partitioning:time_extent", + "schema": { + "type": "int64", + "units": "1", + "long_name": "Partition timestamp" + } + }, + "polygon": { + "source": "@partitioning:spatial_extent", + "schema": { + "type": "string", + "units": "1", + "long_name": "Spatial partition polygon" + } + } + }, + "partitioning": [ + { + "source_variable": "voyage" + }, + { + "source_variable": "timestamp", + "type": "time_extent", + "time_extent": { + "time_varname": "TIME", + "partition_period": "Q" + } + }, + { + "source_variable": "polygon", + "type": "spatial_extent", + "spatial_extent": { + "lat_varname": "latitude", + "lon_varname": "longitude", + "spatial_resolution": 10 + } + } + ], + "global_attributes": { + "delete": [ + "geospatial_lat_max", + "geospatial_lat_min", + "geospatial_lon_max", + "geospatial_lon_min", + "date_created" + ], + "set": { + "title": "CSIRO Underway" + } + } + } +} diff --git a/notebooks/vessel_underway_csiro.ipynb b/notebooks/vessel_underway_csiro.ipynb new file mode 100644 index 00000000..171dc39b --- /dev/null +++ b/notebooks/vessel_underway_csiro.ipynb @@ -0,0 +1,899 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5cd860d7", + "metadata": {}, + "source": [ + "## Access Vessel Underway Csiro (Parquet)\n", + "This Jupyter notebook demonstrates how to access and plot vessel_underway_csiro data, available as a [Parquet](https://parquet.apache.org) dataset stored on S3.\n", + "\n", + "🔗 More information about the dataset is available [in the AODN metadata catalogue](https://catalogue-imos.aodn.org.au/geonetwork/srv/eng/catalog.search#/metadata/None).\n", + "\n", + "📌 The source of truth for this notebook is maintained on [GitHub](https://github.com/aodn/aodn_cloud_optimised/tree/main/notebooks/vessel_underway_csiro.ipynb).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "7f45a6ff", + "metadata": {}, + "outputs": [], + "source": [ + "dataset_name = \"vessel_underway_csiro\"" + ] + }, + { + "cell_type": "markdown", + "id": "8d3ac421", + "metadata": {}, + "source": [ + "## Install/Update packages and Load common functions" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5ea788c1", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using CPython 3.12.11 interpreter at: \u001b[36m/home/lbesnard/miniforge3/envs/AodnCloudOptimised/bin/python\u001b[39m\n", + "Creating virtual environment at: \u001b[36m.venv\u001b[39m\n", + "Activate with: \u001b[32msource .venv/bin/activate\u001b[39m\n", + "\u001b[2mUsing Python 3.12.11 environment at: /home/lbesnard/miniforge3/envs/AodnCloudOptimised\u001b[0m\n", + "\u001b[2mAudited \u001b[1m256 packages\u001b[0m \u001b[2min 49ms\u001b[0m\u001b[0m\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "✅ Local version 0.2.5 is up to date (remote: 0.2.5)\n" + ] + } + ], + "source": [ + "import os, requests, importlib.util\n", + "\n", + "open('setup.py', 'w').write(requests.get('https://raw.githubusercontent.com/aodn/aodn_cloud_optimised/main/notebooks/setup.py').text)\n", + "\n", + "spec = importlib.util.spec_from_file_location(\"setup\", \"setup.py\")\n", + "setup = importlib.util.module_from_spec(spec)\n", + "spec.loader.exec_module(setup)\n", + "\n", + "setup.install_requirements()\n", + "setup.load_dataquery()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8e48b8c7", + "metadata": {}, + "outputs": [], + "source": [ + "from DataQuery import GetAodn" + ] + }, + { + "cell_type": "markdown", + "id": "ee9e8edb", + "metadata": {}, + "source": [ + "# Understanding the Dataset" + ] + }, + { + "cell_type": "markdown", + "id": "674d9433", + "metadata": {}, + "source": [ + "## Understanding Parquet Partitioning\n", + "\n", + "Parquet files can be **partitioned** by one or more columns, which means the data is physically organised into folders based on the values in those columns. This is similar to how databases use indexes to optimise query performance.\n", + "\n", + "Partitioning enables **faster filtering**: when you query data using a partitioned column, only the relevant subset of files needs to be read—improving performance significantly.\n", + "\n", + "For example, if a dataset is partitioned by `\"site_code\"`, `\"timestamp\"`, and `\"polygon\"`, filtering on `\"site_code\"` allows the system to skip unrelated files entirely.\n", + "\n", + "In this notebook, the `GetAodn` class includes built-in methods to efficiently filter data by **time** and **latitude/longitude** using the **timestamp** and **polygon** partitions. Other partitions can be used for filtering via the `scalar_filter`.\n", + "\n", + "Any filtering on columns that are **not** partitioned can be significantly slower, as all files may need to be scanned. However, the `GetAodn` class provides a `scalar_filter` method that lets you apply these filters at load time—before the data is fully read—helping reduce the size of the resulting DataFrame.\n", + "\n", + "Once the dataset is loaded, further filtering using Pandas is efficient and flexible.\n", + "\n", + "See further below in the notebook for examples of how to filter the data effectively.\n", + "\n", + "To view the actual partition columns for this dataset, run:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "eec82f5a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 38 ms, sys: 6.43 ms, total: 44.4 ms\n", + "Wall time: 8.07 s\n" + ] + } + ], + "source": [ + "aodn = GetAodn(\n", + " bucket_name=\"aodn-cloud-optimised\",\n", + " prefix=\"\",\n", + " s3_fs_opts={\n", + " \"key\": \"minioadmin\",\n", + " \"secret\": \"minioadmin\",\n", + " \"client_kwargs\": {\n", + " \"endpoint_url\": \"http://127.0.0.1:9000\"\n", + " }\n", + " }\n", + ")\n", + "dname = f'{dataset_name}.parquet'\n", + "%time aodn_dataset = aodn.get_dataset(dname)" + ] + }, + { + "cell_type": "markdown", + "id": "cfbd0127-ce9b-456c-b4ac-d3690ef60ee9", + "metadata": {}, + "source": [ + "### aodn_dataset.dataset.partitioning.schema" + ] + }, + { + "cell_type": "markdown", + "id": "cb453660", + "metadata": {}, + "source": [ + "## List unique partition values" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "8fef38d5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['in2019_v02', 'in2022_v03']\n", + "CPU times: user 1.11 ms, sys: 0 ns, total: 1.11 ms\n", + "Wall time: 937 µs\n" + ] + } + ], + "source": [ + "%%time\n", + "unique_partition_value = aodn_dataset.get_unique_partition_values('voyage')\n", + "print(list(unique_partition_value)[0:2]) # showing a subset only" + ] + }, + { + "cell_type": "markdown", + "id": "db0b5300", + "metadata": {}, + "source": [ + "## Visualise Spatial Extent of the dataset\n", + "This section plots the polygons representing the areas where data is available. It helps to identify and create a bounding box around the regions containing data." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "fa1d18c5", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/lbesnard/miniforge3/envs/AodnCloudOptimised/lib/python3.12/site-packages/cartopy/mpl/feature_artist.py:144: UserWarning: facecolor will have no effect as it has been defined as \"never\".\n", + " warnings.warn('facecolor will have no effect as it has been '\n" + ] + }, + { + "data": { + "image/png": "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ueBxFqc05IWMv/GnyE9p4negAioTKT+FNRERERGpNpr4HeCgpwlOz/m/zU0pCOSOpFdoG7CTJ6InVWB1IuWjsCYiIiIi1UYTv/048WNnVuR5j/HF4Y6kGPV4t97fsZtdFVidSPkorImIiIhItdHEbz8AW7LqnPcYR4pqEW7OoI49pYKqEjk/CmsiIiIiUm3EWo8TbM7hh6xW5z3GMWctom0nKrAqkfOjsCYiIiIi1YbJBLeFz+TD3BEcygs5rzFSnLWJtqZVcGUi5aewJiIiIiLVyoO1P8BqNvjbztvLfJ2vD7Wh7g9fMfNwc457oomyKayJ9ymsiYiIiEi1Em7N5qGoD/iq4HY2pkefc/nd2eHce/BlcojktgNvk+RuTrRVu0GK9ymsiYiIiEi1MyLiS2JtKYzfc98fLlfoMnPLtomEWgtZljCYS4O2k4dDW9bEJyisiYiIiEi142d28nj0OyxxXs2co83OutyoLSPZ5WnLe/WfINZ2nA/ixzMy8jN6Bq+qxGpFzkxhTURERESqpesdC2nnv42/HRiL23P6/Cl7O/Nx/p94OvZ12gfuACDQXMizsa/RyO9QJVcrcjqrtwsQEREREbkYTCZ4KvZNBu17l2ZrPiLcdAKHOYswcyYdgn7m5fRHucExn+ERX3u7VJEzUlgTERERkWorMWgjb9R9mk0FLch0h5DtDmGfM54Z6YNpZD/Iy3EvYjJ5u0qRM1NYExEREZFqbVDYXAaFzS01LcUZiZ+5mGBLvpeqEjk3hTURERERqXGidbRHqQJ0gBEREREREREfpLAmIiIiIiLigxTWREREREREfJDCmoiIiIiIiA9SWBMREREREfFBCmsiIiIiIiI+SGFNRERERETEBymsiYiIiIiI+CCFNRERERERER+ksCYiIiIiIuKDFNZERERERER8kMKaiIiIiIiID1JYExERERER8UEKayIiIiIiIj5IYU1ERERERMQHKayJiIiIiIj4IIU1ERERERERH6SwJiIiIiIi4oMU1kRERERERHyQwpqIiIiIiIgPUlgTERERERHxQQprIiIiIiIiPkhhTURERERExAcprImIiIiIiPgghTUREREREREfpLAmIiIiIiLigxTWREREREREfJDCmoiIiIiIiA9SWBMREREREfFBCmsiIiIiIiI+SGFNRERERETEBymsiYiIiIiI+CCF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NRERERERER+ksCYiIiIiIuKDFNZERERERER8kMKaiIiIiIiID1JYExERERER8UEKayIiIiIiIj5IYU1ERERERMQHKayJiIiIiIj4IIU1ERERERERH6SwJiIiIiIi4oMU1kRERERERHyQwpqIiIiIiIgPUlgTERERERHxQQprIiIiIiIiPkhhTURERERExAcprImIiIiIiPgghTUREREREREfpLAmIiIiIiLigxTWREREREREfJDCmoiIiIiIiA9SWBMREREREfFBCmsiIiIiIiI+SGFNRERERETEBymsiYiIiIiI+CCFNRERERERER+ksCYiIiIiIuKDFNZERERERER8kMKaiIiIiIiID1JYExERERER8UEKayIiIiIiIj5IYU1ERERERMQHKayJiIiIiIj4IIU1ERERERERH6SwJiIiIiIi4oMU1kRERERERHyQwpqIiIiIiIgPUlgTERERERHxQQprIiIiIiIiPkhhTURERERExAcprImIiIiIiPgghTUREREREREfpLAmIiIiIiLigxTWREREREREfJDCmoiIiIiIiA9SWBMREREREfFBCmsiIiIiIiI+SGFNRERERETEBymsiYiIiIiI+CCFNRERERERER+ksCYiIiIiIuKDFNZERERERER8kMKaiIiIiIiID1JYExERERER8UEKayIiIiIiIj5IYU1ERERERMQHKayJiIiIiIj4IIU1ERERERERH6SwJiIiIiIi4oMU1kRERERERHyQwpqIiIiIiIgPUlgTERERERHxQQprIiIiIiIiPkhhTURERERExAcprImIiIiIiPgghTUREREREREfpLAmIiIiIiLig8od1o4cOcLtt99OZGQkAQEBtGnThh9//LFkvmEYPPXUU8TGxhIQEECfPn3YvXt3qTFWrVpF+/btadCgAVOmTCk1b+nSpfTq1YuIiAgCAwNp2rQpw4cPp7i4+DxbFBERERERKa0q5JpyhbWMjAy6deuGzWbju+++Y/v27fzrX/8iPDy8ZJmXX36ZN954g3fffZc1a9YQFBTEVVddRWFhYckyI0eO5Mknn2TatGm88MILHDp0CIDt27fTv39/OnbsyLJly9iyZQtvvvkmdrsdt9tdnlJFRERERETOqKrkGmt5mnrppZeoV68eU6dOLZnWsGHDkt8Nw+C1117j73//OzfccAMAH374IdHR0UyfPp0hQ4YAkJeXxyWXXEJUVBTh4eHk5OQAMH/+fGJiYnj55ZdLxmzcuDH9+/cvT5kiIiIiIiJnVVVyTbm2rM2YMYOOHTtyyy23EBUVRYcOHXj//fdL5u/bt4/k5GT69OlTMs3hcNC5c2dWrVpVMu2pp56iRYsWOBwOEhMTadmyJQAxMTEcO3aMZcuWlasJERERERGRsqoquaZcYW3v3r288847NG3alHnz5jFq1CgefPBB/vvf/wKQnJwMQHR0dKnrRUdHl8yDk5sL09LSOH78OG+++WbJ9FtuuYWhQ4fSo0cPYmNjuemmm3jrrbfIzs4+7wZFRERERER+q6rkmnLtBunxeOjYsSPPP/88AB06dGDr1q28++67DB8+vFw3HBQURFBQUKlpFouFqVOnMnHiRL7//nvWrFnD888/z0svvcTatWuJjY39wzFNhhuT4f3vtp2qwWO1eLkS7zjVt9tu93Il3nGqb5e/n5cr8Y5Tfdf0/mv687+mr/984bXIG/T6d7Lvmr7+q+n91/Tnvy+s/8pSg6/nml97MQyjrIXEx8fTt29f/v3vf5dMe+edd5g4cSJHjhxh7969NG7cmA0bNtC+ffuSZXr06EH79u15/fXXy3pTJTIyMkhISOD+++/nmWeeOeMy2dnZOBwOpk2bRmBgYLlvQ0REREREqof8/Hxuu+02srKyCA0NPeMyvpprfq9cW9a6devGzp07S03btWsX8fHxwMkv5cXExLBo0aKSprKzs1mzZg2jRo0qz02VCA8PJzY2lry8vHMum2JrRYAt5LxupyKZDDfRrm1Ez/gBs8v7ny5UNo/VQsr1XWn30ptYauApF9x2O5seG1Pj+6/pz/8UaysMU837dPXU+k/91+z+a/r/f01f/9f0/mv6898X1n8FtpxzLuPrueaUcoW1cePG0bVrV55//nluvfVW1q5dy+TJk5k8eTIAJpOJsWPHMnHiRJo2bUrDhg158skniYuL48Ybbzzn+O+99x4bN27kpptuonHjxhQWFvLhhx+ybdu2UvuAno1hsnj9yfFbZpe7Rv6znmIpLsZSVPNW1qfU9P5r+vPf19ZHlU391+z+a/r/f01f/9f0/mv6898X1n9luX1fzzWnlCusXXbZZXz77bf87W9/49lnn6Vhw4a89tprDBs2rGSZv/zlL+Tl5XHvvfeSmZlJ9+7dmTt3Lv7+/uccv1OnTqxYsYL77ruPo0ePEhwcTKtWrZg+fTo9evQoT6kiIiIiIiJnVFVyTbnCGsC1117Ltddee9b5JpOJZ599lmeffba8Q9OhQwc++uijcl9PRERERESkPKpCrinXoftFRERERESkciisiYiIiIiI+CCFNRERERERER+ksCYiIiIiIuKDFNZERERERER8kMKaiIiIiIiID1JYExERERER8UEKayIiIiIiIj5IYU1ERERERMQHKayJiIiIiIj4IIU1ERERERERH6SwJiIiIiIi4oMU1kRERERERHyQwpqIiIiIiIgPUlgTERERERHxQQprIiIiIiIiPkhhTURERERExAcprImIiIiIiPgghTUREREREREfpLAmIiIiIiLigxTWREREREREfJDCmoiIiIiIiA9SWBMREREREfFBCmsiIiIiIiI+SGFNRERERETEBymsiYiIiIiI+CCFNRERERERER+ksCYiIiIiIuKDFNZERERERER8kMKaiIiIiIiID1JYExERERER8UEKayIiIiIiIj5IYU1ERERERMQHKayJiIiIiIj4IIU1ERERERERH6SwJiIiIiIi4oMU1kRERERERHyQwpqIiIiIiIgPUlgTERERERHxQQprIiIiItXA3qJ69Nj1Ke+fGEyxx+rtckSkAiisiYiIiFQD2wqbsqe4Ic8kP0TvPR+zMKcrhuHtqkTkQiisiYiITynMN/HJG+G880wkS2cFc/yYthCIlEWmOxQzbpYm3EItz36GH/g/7jzwL4o8Nm+XJiLnSa+AIiLiM44dtPLOsxGkJbsJDtnD5rWtwIggIqqQSy8vptcNOYTVcnu7TBGflOFyEGrKoEvtwyyP/AtT9ydy37E3WJbbib6hK71dnoicB4W1KsbptpBa4CAlP4zU/LCSn2kFIQTZConwzyHcP5cI/1zC/XOpHZBFXFA6/lant0sXEflD65YG8tGrYVgsB/j882P06RPDkSPbmDLlGHPmWFk0vTOLvo0hsU8BfW/OJqauy9slV6qcLDNms0FQiPZrkzNbnd+eePMeAMxmEyMarOa55CQW5HRXWBOpohTWfJjLYyYpM5Zt6fXZkVaPbWl12JsVh9v49WELMGURYT1GmOU4BZ5gst1xZHtqUWwElhor0i+duiG/XIJPkBB+lK5xO7CaPZXdlohIKS4nfDMlnMUzQqhf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psKHr0bidqcREZFEYqcsunWzcOut0cTHx3upExERERGpShTWRMrI39/Ku+82++WvdLKzk9m6NYutW/PYtauYAwcMkpNtxMaePFn2okUbadEiHIj+5SIiIiIiUnYKayLnKTTUTteutenatXap6S6Xm5Urf6Zp01AvVSYiIiIi1YEOMCIiIiIiIuKDFNZERERERER8kMKaiIiIiIiID6pW31nLycn1dgkAuN0e8vPzycnJxWKpeXlY/at/9a/+1b/6V//qv6ZR/77Tv69kgopQLcKa3W4nJiaG1q2v8HYpIiIiIiLiZTExMdjtdm+XccFMhnHqFL5VW2FhIcXFxd4uQ0REREREvMxut+Pv7+/tMi5YtQlrIiIiIiIi1UnN26FWRERERESkClBYExERERER8UEKayIiIiIiIj5IYU1ERERERMQHKayJiIiIiIj4IIW1s3j66acxmUylLs2bNy+ZX1hYyOjRo4mMjCQ4OJhBgwaRkpJSaowZM2aQkJBAs2bNmDVrVsn0/fv3nzb2qcvq1asrrcdzOXLkCLfffjuRkZEEBATQpk0bfvzxx5L5hmHw1FNPERsbS0BAAH369GH37t2lxli1ahXt27enQYMGTJkypdS8s90Hn332WaX090caNGhwxtpGjx4NVP/H3+128+STT9KwYUMCAgJo3Lgx//jHP/jtwWOr8+MPkJOTw9ixY4mPjycgIICuXbuybt26kvnVqf9ly5Zx3XXXERcXh8lkYvr06aXml6XX9PR0hg0bRmhoKGFhYYwcOZLc3NInJX3//feJj4+nQ4cOrFmzpmT6kiVLznp/JCcnX7S+TzlX/9988w39+vUjMjISk8nExo0bTxujKq8T/qh/p9PJY489Rps2bQgKCiIuLo4777yTo0ePlhqjOj/+Tz/9NM2bNycoKIjw8HD69OlTqn6o3v3/1n333YfJZOK1114rNb0q9w/nvg/uuuuu02rr379/qWWq8n1QlufAjh07uP7663E4HAQFBXHZZZdx8ODBkvlVeR3o8ww5owkTJhitWrUyjh07VnI5fvx4yfz77rvPqFevnrFo0SLjxx9/NBITE42uXbuWzC8sLDTq1q1rLFiwwJg/f75Rt25do6ioyDAMw9i3b58BGAsXLiw1/rFjx4zi4uJK7/VM0tPTjfj4eOOuu+4y1qxZY+zdu9eYN2+esWfPnpJl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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "aodn_dataset.plot_spatial_extent()" + ] + }, + { + "cell_type": "markdown", + "id": "2c862924", + "metadata": {}, + "source": [ + "## Get Temporal Extent of the dataset" + ] + }, + { + "cell_type": "markdown", + "id": "392c2fb9", + "metadata": {}, + "source": [ + "Similary to the spatial extent, we're retrieving the minimum and maximum timestamp partition values of the dataset. This is not necessarely accurately representative of the TIME values, as the timestamp partition can be yearly/monthly... but is here to give an idea" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "c8c6e7b4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 107 ms, sys: 36.4 ms, total: 144 ms\n", + "Wall time: 64.2 ms\n" + ] + }, + { + "data": { + "text/plain": [ + "(Timestamp('2017-03-16 21:11:45'), Timestamp('2023-07-29 21:41:20'))" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%%time\n", + "aodn_dataset.get_temporal_extent()" + ] + }, + { + "cell_type": "markdown", + "id": "b21491c2", + "metadata": {}, + "source": [ + "## Read Metadata\n", + "\n", + "For all Parquet datasets, we create a sidecar file named **_common_metadata** in the root of the dataset. This file contains both the dataset-level and variable-level attributes. \n", + "The metadata can be retrieved below as a dictionary, and it will also be included in the pandas DataFrame when using the `get_data` method from the `GetAodn` class." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5811e040", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-08-20 11:19:33,782 - aodn.GetAodn - INFO - Retrieving metadata for aodn-cloud-optimised/vessel_underway_csiro.parquet\n" + ] + }, + { + "data": { + "text/plain": [ + "{'rawLatitude': {'type': 'double',\n", + " 'long_name': 'Raw Latitude',\n", + " 'units': 'degree_north'},\n", + " 'latitude': {'type': 'double',\n", + " 'long_name': 'Latitude',\n", + " 'units': 'degree_north'},\n", + " 'latitudeQC': {'type': 'float'},\n", + " 'rawLongitude': {'type': 'double',\n", + " 'long_name': 'Raw Longitude',\n", + " 'units': 'degree_east'},\n", + " 'longitude': {'type': 'double',\n", + " 'long_name': 'Longitude',\n", + " 'units': 'degree_east'},\n", + " 'longitudeQC': {'type': 'float'},\n", + " 'rawAlt': {'type': 'double', 'long_name': 'Raw Altitude', 'units': 'm'},\n", + " 'alt': {'type': 'double', 'long_name': 'Altitude', 'units': 'm'},\n", + " 'altQC': {'type': 'float'},\n", + " 'rawSpeedOG': {'type': 'double',\n", + " 'long_name': 'Raw Speed Over Ground',\n", + " 'units': 'knot'},\n", + " 'speedOG': {'type': 'double',\n", + " 'long_name': 'Speed Over Ground',\n", + " 'units': 'knot'},\n", + " 'speedOGQC': {'type': 'float'},\n", + " 'rawCourseOG': {'type': 'double',\n", + " 'long_name': 'Raw Course Over Ground',\n", + " 'units': 'degree'},\n", + " 'courseOG': {'type': 'double',\n", + " 'long_name': 'Course Over Ground',\n", + " 'units': 'degree'},\n", + " 'courseOGQC': {'type': 'float'},\n", + " 'rawShipHeading': {'type': 'double',\n", + " 'long_name': 'Raw Ship Heading',\n", + " 'units': 'degree'},\n", + " 'shipHeading': {'type': 'double',\n", + " 'long_name': 'Ship Heading',\n", + " 'units': 'degree'},\n", + " 'shipHeadingQC': {'type': 'float'},\n", + " 'rawDepth': {'type': 'double', 'long_name': 'Raw Depth', 'units': 'm'},\n", + " 'depth': {'type': 'double', 'long_name': 'Depth', 'units': 'm'},\n", + " 'depthQC': {'type': 'float'},\n", + " 'longitudinalWaterSpeed': {'type': 'double',\n", + " 'long_name': 'Longitudinal Water Speed',\n", + " 'units': 'knot'},\n", + " 'longitudinalWaterSpeedQC': {'type': 'float'},\n", + " 'transverseWaterSpeed': {'type': 'double',\n", + " 'long_name': 'Transverse Water Speed',\n", + " 'units': 'knot'},\n", + " 'transverseWaterSpeedQC': {'type': 'float'},\n", + " 'longitudinalGroundSpeed': {'type': 'double',\n", + " 'long_name': 'Longitudinal Ground Speed',\n", + " 'units': 'knot'},\n", + " 'longitudinalGroundSpeedQC': {'type': 'float'},\n", + " 'transverseGroundSpeed': {'type': 'double',\n", + " 'long_name': 'Transverse Ground Speed',\n", + " 'units': 'knot'},\n", + " 'transverseGroundSpeedQC': {'type': 'float'},\n", + " 'lockOnWater': {'type': 'float'},\n", + " 'lockonGround': {'type': 'float'},\n", + " 'rawPortAirTemp': {'type': 'double',\n", + " 'long_name': 'Raw Port Air Temperature',\n", + " 'units': 'degC'},\n", + " 'portAirTemp': {'type': 'double',\n", + " 'long_name': 'Port Air Temperature',\n", + " 'units': 'degC'},\n", + " 'portAirTempQC': {'type': 'float'},\n", + " 'rawPortHumidity': {'type': 'double',\n", + " 'long_name': 'Raw Port Humidity',\n", + " 'units': '%'},\n", + " 'portHumidity': {'type': 'double',\n", + " 'long_name': 'Port Humidity',\n", + " 'units': '%'},\n", + " 'portHumidityQC': {'type': 'float'},\n", + " 'rawStbdAirTemp': {'type': 'double',\n", + " 'long_name': 'Raw Starboard Air Temperature',\n", + " 'units': 'degC'},\n", + " 'stbdAirTemp': {'type': 'double',\n", + " 'long_name': 'Starboard Air Temperature',\n", + " 'units': 'degC'},\n", + " 'stbdAirTempQC': {'type': 'float'},\n", + " 'rawStbdHumidity': {'type': 'double',\n", + " 'long_name': 'Raw Starboard Humidity',\n", + " 'units': '%'},\n", + " 'stbdHumidity': {'type': 'double',\n", + " 'long_name': 'Starboard Humidity',\n", + " 'units': '%'},\n", + " 'stbdHumidityQC': {'type': 'float'},\n", + " 'rawMaxWindGust': {'type': 'double',\n", + " 'long_name': 'Raw Maximum Wind Gust',\n", + " 'units': 'knot'},\n", + " 'maxWindGust': {'type': 'double',\n", + " 'long_name': 'Maximum Wind Gust',\n", + " 'units': 'knot'},\n", + " 'maxWindGustQC': {'type': 'float'},\n", + " 'rawPortRelWindDir': {'type': 'double',\n", + " 'long_name': 'Raw Port Relative Wind Direction',\n", + " 'units': 'degree'},\n", + " 'portRelWindDir': {'type': 'double',\n", + " 'long_name': 'Port Relative Wind Direction',\n", + " 'units': 'degree'},\n", + " 'portRelWindDirQC': {'type': 'float'},\n", + " 'rawPortRelWindSpeed': {'type': 'double',\n", + " 'long_name': 'Raw Port Relative Wind Speed',\n", + " 'units': 'knot'},\n", + " 'portRelWindSpeed': {'type': 'double',\n", + " 'long_name': 'Port Relative Wind Speed',\n", + " 'units': 'knot'},\n", + " 'portRelWindSpeedQC': {'type': 'float'},\n", + " 'rawPortTrueWindDir': {'type': 'double',\n", + " 'long_name': 'Raw Port True Wind Direction',\n", + " 'units': 'degree'},\n", + " 'portTrueWindDir': {'type': 'double',\n", + " 'long_name': 'Port True Wind Direction',\n", + " 'units': 'degree'},\n", + " 'portTrueWindDirQC': {'type': 'float'},\n", + " 'rawPortTrueWindSpeed': {'type': 'double',\n", + " 'long_name': 'Raw Port True Wind Speed',\n", + " 'units': 'knot'},\n", + " 'portTrueWindSpeed': {'type': 'double',\n", + " 'long_name': 'Port True Wind Speed',\n", + " 'units': 'knot'},\n", + " 'portTrueWindSpeedQC': {'type': 'float'},\n", + " 'rawStbdRelWindDir': {'type': 'double',\n", + " 'long_name': 'Raw Starboard Relative Wind Direction',\n", + " 'units': 'degree'},\n", + " 'stbdRelWindDir': {'type': 'double',\n", + " 'long_name': 'Starboard Relative Wind Direction',\n", + " 'units': 'degree'},\n", + " 'stbdRelWindDirQC': {'type': 'float'},\n", + " 'rawStbdRelWindSpeed': {'type': 'double',\n", + " 'long_name': 'Raw Starboard Relative Wind Speed',\n", + " 'units': 'knot'},\n", + " 'stbdRelWindSpeed': {'type': 'double',\n", + " 'long_name': 'Starboard Relative Wind Speed',\n", + " 'units': 'knot'},\n", + " 'stbdRelWindSpeedQC': {'type': 'float'},\n", + " 'rawStbdTrueWindDir': {'type': 'double',\n", + " 'long_name': 'Raw Starboard True Wind Direction',\n", + " 'units': 'degree'},\n", + " 'stbdTrueWindDir': {'type': 'double',\n", + " 'long_name': 'Starboard True Wind Direction',\n", + " 'units': 'degree'},\n", + " 'stbdTrueWindDirQC': {'type': 'float'},\n", + " 'rawStbdTrueWindSpeed': {'type': 'double',\n", + " 'long_name': 'Raw Starboard True Wind Speed',\n", + " 'units': 'knot'},\n", + " 'stbdTrueWindSpeed': {'type': 'double',\n", + " 'long_name': 'Starboard True Wind Speed',\n", + " 'units': 'knot'},\n", + " 'stbdTrueWindSpeedQC': {'type': 'float'},\n", + " 'rawAtmPressure': {'type': 'double',\n", + " 'long_name': 'Raw Atmospheric Pressure',\n", + " 'units': 'mbar'},\n", + " 'atmPressure': {'type': 'double',\n", + " 'long_name': 'Atmospheric Pressure',\n", + " 'units': 'mbar'},\n", + " 'atmPressureQC': {'type': 'float'},\n", + " 'rawUltrasonicRelWindSpeed': {'type': 'double',\n", + " 'long_name': 'Raw Ultrasonic Relative Wind Speed',\n", + " 'units': 'knot'},\n", + " 'ultrasonicRelWindSpeed': {'type': 'double',\n", + " 'long_name': 'Ultrasonic Relative Wind Speed',\n", + " 'units': 'knot'},\n", + " 'ultrasonicRelWindSpeedQC': {'type': 'float'},\n", + " 'rawUltrasonicRelWindDir': {'type': 'double',\n", + " 'long_name': 'Raw Ultrasonic Relative Wind Direction',\n", + " 'units': 'degree'},\n", + " 'ultrasonicRelWindDir': {'type': 'double',\n", + " 'long_name': 'Ultrasonic Relative Wind Direction',\n", + " 'units': 'degree'},\n", + " 'ultrasonicRelWindDirQC': {'type': 'float'},\n", + " 'rawUltrasonicTrueWindSpeed': {'type': 'double',\n", + " 'long_name': 'Raw Ultrasonic True Wind Speed',\n", + " 'units': 'knot'},\n", + " 'ultrasonicTrueWindSpeed': {'type': 'double',\n", + " 'long_name': 'Ultrasonic True Wind Speed',\n", + " 'units': 'knot'},\n", + " 'ultrasonicTrueWindSpeedQC': {'type': 'float'},\n", + " 'rawUltrasonicTrueWindDir': {'type': 'double',\n", + " 'long_name': 'Raw Ultrasonic True Wind Direction',\n", + " 'units': 'degree'},\n", + " 'ultrasonicTrueWindDir': {'type': 'double',\n", + " 'long_name': 'Ultrasonic True Wind Direction',\n", + " 'units': 'degree'},\n", + " 'ultrasonicTrueWindDirQC': {'type': 'float'},\n", + " 'rawRain': {'type': 'double',\n", + " 'long_name': 'Raw Accumulated Hourly Rain',\n", + " 'units': 'mm'},\n", + " 'rain': {'type': 'double',\n", + " 'long_name': 'Accumulated Hourly Rain',\n", + " 'units': 'mm'},\n", + " 'rainQC': {'type': 'float'},\n", + " 'rawPortRadiometer': {'type': 'double',\n", + " 'long_name': 'Raw Port Radiometer',\n", + " 'units': 'W/m^2'},\n", + " 'portRadiometer': {'type': 'double',\n", + " 'long_name': 'Port Radiometer',\n", + " 'units': 'W/m^2'},\n", + " 'portRadiometerQC': {'type': 'float'},\n", + " 'rawStbdRadiometer': {'type': 'double',\n", + " 'long_name': 'Raw Starboard Radiometer',\n", + " 'units': 'W/m^2'},\n", + " 'stbdRadiometer': {'type': 'double',\n", + " 'long_name': 'Starboard Radiometer',\n", + " 'units': 'W/m^2'},\n", + " 'stbdRadiometerQC': {'type': 'float'},\n", + " 'rawPortPyranometer': {'type': 'double',\n", + " 'long_name': 'Raw Port Pyranometer',\n", + " 'units': 'W/m^2'},\n", + " 'portPyranometer': {'type': 'double',\n", + " 'long_name': 'Port Pyranometer',\n", + " 'units': 'W/m^2'},\n", + " 'portPyranometerQC': {'type': 'float'},\n", + " 'rawStbdPyranometer': {'type': 'double',\n", + " 'long_name': 'Raw Starboard Pyranometer',\n", + " 'units': 'W/m^2'},\n", + " 'stbdPyranometer': {'type': 'double',\n", + " 'long_name': 'Starboard Pyranometer',\n", + " 'units': 'W/m^2'},\n", + " 'stbdPyranometerQC': {'type': 'float'},\n", + " 'rawPortPAR': {'type': 'double',\n", + " 'long_name': 'Raw Port PAR',\n", + " 'units': 'uE/m^2/s'},\n", + " 'portPAR': {'type': 'double', 'long_name': 'Port PAR', 'units': 'uE/m^2/s'},\n", + " 'portPARQC': {'type': 'float'},\n", + " 'rawStbdPAR': {'type': 'double',\n", + " 'long_name': 'Raw Starboard PAR',\n", + " 'units': 'uE/m^2/s'},\n", + " 'stbdPAR': {'type': 'double',\n", + " 'long_name': 'Starboard PAR',\n", + " 'units': 'uE/m^2/s'},\n", + " 'stbdPARQC': {'type': 'float'},\n", + " 'rawGyroHeading': {'type': 'double',\n", + " 'long_name': 'Raw Gyro Heading',\n", + " 'units': 'degree'},\n", + " 'gyroHeading': {'type': 'double',\n", + " 'long_name': 'Gyro Heading',\n", + " 'units': 'degree'},\n", + " 'gyroHeadingQC': {'type': 'float'},\n", + " 'equTemp': {'type': 'double',\n", + " 'long_name': 'Equilibrator Water Temperature',\n", + " 'units': 'degC'},\n", + " 'equTempQC': {'type': 'float'},\n", + " 'XCO2': {'type': 'double', 'long_name': 'XCO2', 'units': 'ppm'},\n", + " 'XCO2QC': {'type': 'float'},\n", + " 'waterVapour': {'type': 'double',\n", + " 'long_name': 'Water Vapour',\n", + " 'units': 'mmol/mole'},\n", + " 'waterVapourQC': {'type': 'float'},\n", + " 'licorPressure': {'type': 'double',\n", + " 'long_name': 'Licor Pressure',\n", + " 'units': 'hPa'},\n", + " 'licorPressureQC': {'type': 'float'},\n", + " 'equPressure': {'type': 'double',\n", + " 'long_name': 'Equilibrator Pressure',\n", + " 'units': 'hPa'},\n", + " 'equPressureQC': {'type': 'float'},\n", + " 'waterFlow': {'type': 'double', 'long_name': 'Water Flow', 'units': 'l/min'},\n", + " 'waterFlowQC': {'type': 'float'},\n", + " 'licorFlow': {'type': 'double', 'long_name': 'Licor flow', 'units': 'ml/min'},\n", + " 'licorFlowQC': {'type': 'float'},\n", + " 'ventFlow': {'type': 'double', 'long_name': 'Vent Flow', 'units': 'ml/min'},\n", + " 'ventFlowQC': {'type': 'float'},\n", + " 'condTemp': {'type': 'double',\n", + " 'long_name': 'Condenser Temperature',\n", + " 'units': 'degC'},\n", + " 'condTempQC': {'type': 'float'},\n", + " 'pumpSpeed': {'type': 'double',\n", + " 'long_name': 'CO2 Pump Speed',\n", + " 'units': 'l/min'},\n", + " 'pumpSpeedQC': {'type': 'float'},\n", + " 'rawIsarWaterTemp': {'type': 'double',\n", + " 'long_name': 'Raw ISAR Water Temperature',\n", + " 'units': 'degC'},\n", + " 'isarWaterTemp': {'type': 'double',\n", + " 'long_name': 'ISAR Water Temperature',\n", + " 'units': 'degC'},\n", + " 'isarWaterTempQC': {'type': 'float'},\n", + " 'portKeelExtension': {'type': 'double',\n", + " 'long_name': 'Port Drop Keel Extension',\n", + " 'units': 'm'},\n", + " 'portKeelExtensionQC': {'type': 'float'},\n", + " 'starboardKeelExtension': {'type': 'double',\n", + " 'long_name': 'Starboard Drop Keel Extension',\n", + " 'units': 'm'},\n", + " 'starboardKeelExtensionQC': {'type': 'float'},\n", + " 'blackCarbonConc': {'type': 'double',\n", + " 'long_name': 'Concentration of Black Carbon',\n", + " 'units': 'ug/m^3'},\n", + " 'blackCarbonConcQC': {'type': 'float'},\n", + " 'airFlow': {'type': 'double', 'long_name': 'Air Flow Rate', 'units': 'L/h'},\n", + " 'airFlowQC': {'type': 'float'},\n", + " 'absorptionPhotometerStatus': {'type': 'float'},\n", + " 'o3Ozone1': {'type': 'double', 'long_name': 'Ozone1', 'units': 'ppb'},\n", + " 'o3Ozone1QC': {'type': 'float'},\n", + " 'ozone1Meterflags': {'type': 'float'},\n", + " 'o3Ozone2': {'type': 'double', 'long_name': 'Ozone2', 'units': 'ppb'},\n", + " 'o3Ozone2QC': {'type': 'float'},\n", + " 'ozone2Meterflags': {'type': 'float'},\n", + " 'co2Dry': {'type': 'double',\n", + " 'long_name': 'CO2 Dry Concentration',\n", + " 'units': 'ppm'},\n", + " 'co2DryQC': {'type': 'float'},\n", + " 'ch4Dry': {'type': 'double',\n", + " 'long_name': 'CH4 Dry Concentration',\n", + " 'units': 'ppm'},\n", + " 'ch4DryQC': {'type': 'float'},\n", + " 'h2O': {'type': 'double',\n", + " 'long_name': 'Water Concentration Percentage',\n", + " 'units': 'dimensionless'},\n", + " 'h2OQC': {'type': 'float'},\n", + " 'inletBearing': {'type': 'double',\n", + " 'long_name': 'Air Sampling Inlet Bearing',\n", + " 'units': 'degree'},\n", + " 'inletBearingQC': {'type': 'float'},\n", + " 'trackingBearing': {'type': 'double',\n", + " 'long_name': 'Tracking Target Bearing',\n", + " 'units': 'degree'},\n", + " 'trackingBearingQC': {'type': 'float'},\n", + " 'trackingMode': {'type': 'float'},\n", + " 'rawWaterTemp': {'type': 'double',\n", + " 'long_name': 'Raw Water Temperature',\n", + " 'units': 'degC'},\n", + " 'waterTemp': {'type': 'double',\n", + " 'long_name': 'Water Temperature',\n", + " 'units': 'degC'},\n", + " 'waterTempQC': {'type': 'float'},\n", + " 'rawTsgSensorTemp': {'type': 'double',\n", + " 'long_name': 'Raw TSG Sensor Temperature',\n", + " 'units': 'degC'},\n", + " 'tsgSensorTemp': {'type': 'double',\n", + " 'long_name': 'TSG Sensor Temperature',\n", + " 'units': 'degC'},\n", + " 'tsgSensorTempQC': {'type': 'float'},\n", + " 'rawSalinity': {'type': 'double',\n", + " 'long_name': 'Raw Salinity',\n", + " 'units': 'PSU'},\n", + " 'salinity': {'type': 'double', 'long_name': 'Salinity', 'units': 'PSU'},\n", + " 'salinityQC': {'type': 'float'},\n", + " 'rawTsgFlow': {'type': 'double',\n", + " 'long_name': 'Raw TSG Flow Rate',\n", + " 'units': 'l/min'},\n", + " 'tsgFlow': {'type': 'double', 'long_name': 'TSG Flow Rate', 'units': 'l/min'},\n", + " 'tsgFlowQC': {'type': 'float'},\n", + " 'rawFluorescence': {'type': 'double',\n", + " 'long_name': 'Raw Fluorescence',\n", + " 'units': 'dimensionless'},\n", + " 'fluorescence': {'type': 'double',\n", + " 'long_name': 'Fluorescence',\n", + " 'units': 'dimensionless'},\n", + " 'fluorescenceQC': {'type': 'float'},\n", + " 'rawLabMainFlow': {'type': 'double',\n", + " 'long_name': 'Raw UWY Lab Main Flow',\n", + " 'units': 'l/min'},\n", + " 'labMainFlow': {'type': 'double',\n", + " 'long_name': 'UWY Lab Main Flow',\n", + " 'units': 'l/min'},\n", + " 'labMainFlowQC': {'type': 'float'},\n", + " 'rawLabBranchFlow': {'type': 'double',\n", + " 'long_name': 'Raw UWY Lab Branch Flow',\n", + " 'units': 'l/min'},\n", + " 'labBranchFlow': {'type': 'double',\n", + " 'long_name': 'UWY Lab Branch Flow',\n", + " 'units': 'l/min'},\n", + " 'labBranchFlowQC': {'type': 'float'},\n", + " 'rawDo': {'type': 'double',\n", + " 'long_name': 'Raw Oxygen at the Optode',\n", + " 'units': 'uM/L'},\n", + " 'do': {'type': 'double',\n", + " 'long_name': 'Oxygen at the Optode',\n", + " 'units': 'uM/L'},\n", + " 'doQC': {'type': 'float'},\n", + " 'rawDoSaturation': {'type': 'double',\n", + " 'long_name': 'Raw Oxygen Saturation at the Optode',\n", + " 'units': '%'},\n", + " 'doSaturation': {'type': 'double',\n", + " 'long_name': 'Oxygen Saturation at the Optode',\n", + " 'units': '%'},\n", + " 'doSaturationQC': {'type': 'float'},\n", + " 'rawOptodeWaterTemp': {'type': 'double',\n", + " 'long_name': 'Raw Water Temperature at the Optode',\n", + " 'units': 'degC'},\n", + " 'optodeWaterTemp': {'type': 'double',\n", + " 'long_name': 'Water Temperature at the Optode',\n", + " 'units': 'degC'},\n", + " 'optodeWaterTempQC': {'type': 'float'},\n", + " 'TIME': {'type': 'timestamp[ns]'},\n", + " 'filename': {'type': 'string',\n", + " 'units': '1',\n", + " 'long_name': 'Filename of the source file'},\n", + " 'voyage': {'type': 'string', 'units': '1', 'long_name': 'Name of the voyage'},\n", + " 'ship_name': {'type': 'string',\n", + " 'units': '1',\n", + " 'long_name': 'Name of the vessel'},\n", + " 'timestamp': {'type': 'int64',\n", + " 'units': '1',\n", + " 'long_name': 'Partition timestamp'},\n", + " 'polygon': {'type': 'string',\n", + " 'units': '1',\n", + " 'long_name': 'Spatial partition polygon'},\n", + " 'global_attributes': {'dataset_name': 'vessel_underway_csiro',\n", + " 'title': 'CSIRO Underway'}}" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "metadata = aodn_dataset.get_metadata()\n", + "metadata" + ] + }, + { + "cell_type": "markdown", + "id": "76e3b43b", + "metadata": {}, + "source": [ + "# Data Query and Plot" + ] + }, + { + "cell_type": "markdown", + "id": "b2432e46", + "metadata": {}, + "source": [ + "## Create a TIME and BoundingBox filter\n", + "\n", + "This cell loads a subset of the dataset based on a time range and a spatial bounding box. The result is returned as a pandas DataFrame, and basic information about its structure is displayed." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "8794e0bc", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-08-20 11:19:34,569 - aodn.GetAodn - INFO - Retrieving metadata for aodn-cloud-optimised/vessel_underway_csiro.parquet\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 19300 entries, 0 to 19299\n", + "Columns: 194 entries, rawLatitude to polygon\n", + "dtypes: datetime64[ns](1), float32(75), float64(113), int32(1), object(4)\n", + "memory usage: 23.0+ MB\n", + "CPU times: user 123 ms, sys: 44.3 ms, total: 167 ms\n", + "Wall time: 87.2 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "df = aodn_dataset.get_data(date_start='2017-03-16 21:11:45', \n", + " date_end='2017-03-18',\n", + " #lat_min=-34, \n", + " #lat_max=-28, \n", + " #lon_min=151, \n", + " #lon_max=160, \n", + " )\n", + "\n", + "df.info()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "ecfad1d7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "aodn_metadata-uuid_unknown_vessel_underway_csiro_data-hash_a55e502d.csv.zip
" + ], + "text/plain": [ + "/home/lbesnard/github_repo/aodn_cloud_optimised/notebooks/aodn_metadata-uuid_unknown_vessel_underway_csiro_data-hash_a55e502d.csv.zip" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "## Download Subsetted Data as CSV\n", + "\n", + "# This cell downloads the filtered dataset as a ZIP-compressed CSV file. \n", + "# The CSV includes metadata at the top as commented lines, and a `FileLink` object is returned to allow downloading directly from the notebook.\n", + "\n", + "\n", + "df.aodn.download_as_csv()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a3abac4d-a474-4550-bca4-77db4ba11991", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['rawLatitude', 'latitude', 'latitudeQC', 'rawLongitude', 'longitude',\n", + " 'longitudeQC', 'rawAlt', 'alt', 'altQC', 'rawSpeedOG',\n", + " ...\n", + " 'doSaturationQC', 'rawOptodeWaterTemp', 'optodeWaterTemp',\n", + " 'optodeWaterTempQC', 'TIME', 'filename', 'ship_name', 'voyage',\n", + " 'timestamp', 'polygon'],\n", + " dtype='object', length=194)" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.columns" + ] + }, + { + "cell_type": "markdown", + "id": "db959d48", + "metadata": {}, + "source": [ + "## Create a TIME and scalar/number filter\n", + "\n", + "This cell filters the dataset by time range and a scalar value (from a Parquet partition) using the `scalar_filter` argument. \n", + "This leverages Parquet partitioning to apply efficient, server-side filtering, which significantly speeds up data loading." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "ff46edb3", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-08-20 11:19:37,838 - aodn.GetAodn - INFO - Retrieving metadata for aodn-cloud-optimised/vessel_underway_csiro.parquet\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "RangeIndex: 19300 entries, 0 to 19299\n", + "Columns: 194 entries, rawLatitude to polygon\n", + "dtypes: datetime64[ns](1), float32(75), float64(113), int32(1), object(4)\n", + "memory usage: 23.0+ MB\n", + "CPU times: user 113 ms, sys: 63.7 ms, total: 177 ms\n", + "Wall time: 84.9 ms\n" + ] + } + ], + "source": [ + "%%time\n", + "df = aodn_dataset.get_data(date_start='2017-03-16 21:11:45', \n", + " date_end='2017-03-18',\n", + " scalar_filter={'voyage': 'in2017_v02'})\n", + "df.info()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9c71e515-c916-4490-b3d3-2d0f81636e1a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.12.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pyproject.toml b/pyproject.toml index 49bbc43c..61c90e95 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -146,6 +146,7 @@ cloud_optimised_satellite_net_primary_productivity_oc3_1day_aqua = "aodn_cloud_o cloud_optimised_satellite_optical_water_type_1day_aqua = "aodn_cloud_optimised.bin.satellite_optical_water_type_1day_aqua:main" cloud_optimised_satellite_picoplankton_fraction_oc3_1day_aqua = "aodn_cloud_optimised.bin.satellite_picoplankton_fraction_oc3_1day_aqua:main" cloud_optimised_slocum_glider_delayed_qc = "aodn_cloud_optimised.bin.slocum_glider_delayed_qc:main" +cloud_optimised_update_all_metadata = "aodn_cloud_optimised.bin.update_metadata:main" cloud_optimised_vessel_air_sea_flux_product_delayed = "aodn_cloud_optimised.bin.vessel_air_sea_flux_product_delayed:main" cloud_optimised_vessel_air_sea_flux_sst_meteo_realtime = "aodn_cloud_optimised.bin.vessel_air_sea_flux_sst_meteo_realtime:main" cloud_optimised_vessel_co2_delayed_qc = "aodn_cloud_optimised.bin.vessel_co2_delayed_qc:main" @@ -154,12 +155,12 @@ cloud_optimised_vessel_satellite_radiance_delayed_qc = "aodn_cloud_optimised.bin cloud_optimised_vessel_satellite_radiance_derived_product = "aodn_cloud_optimised.bin.vessel_satellite_radiance_derived_product:main" cloud_optimised_vessel_sst_delayed_qc = "aodn_cloud_optimised.bin.vessel_sst_delayed_qc:main" cloud_optimised_vessel_trv_realtime_qc = "aodn_cloud_optimised.bin.vessel_trv_realtime_qc:main" +cloud_optimised_vessel_underway_csiro = "aodn_cloud_optimised.bin.vessel_underway_csiro:main" cloud_optimised_vessel_xbt_delayed_qc = "aodn_cloud_optimised.bin.vessel_xbt_delayed_qc:main" cloud_optimised_vessel_xbt_realtime_nonqc = "aodn_cloud_optimised.bin.vessel_xbt_realtime_nonqc:main" cloud_optimised_wave_buoy_realtime_nonqc = "aodn_cloud_optimised.bin.wave_buoy_realtime_nonqc:main" generic_cloud_optimised_creation = "aodn_cloud_optimised.bin.generic_cloud_optimised_creation:main" pydantic_precommit_hook = "aodn_cloud_optimised.bin.pydantic_precommit_hook:main" -cloud_optimised_update_all_metadata = "aodn_cloud_optimised.bin.update_metadata:main" #[tool.poetry.include] #data = ["aodn_cloud_optimised/config/*.json", "aodn_cloud_optimised/config/dataset/*.json"]