Skip to content
Snippets Groups Projects
Verified Commit e3c95f9b authored by Owen Graham's avatar Owen Graham
Browse files

Make `Measurement` class more useful

parent ff023208
Branches
No related tags found
No related merge requests found
from flask import abort, Flask, g, jsonify, redirect, render_template from flask import abort, Flask, g, jsonify, redirect, render_template
from .data import measurements
from .parameters import get_param, year_type from .parameters import get_param, year_type
from .plotting import plotters from .plotting import plotters
from .records import get_link, get_station, read_stations from .records import get_link, get_station, read_stations
...@@ -30,6 +31,7 @@ def render_plotter(name, embedded): ...@@ -30,6 +31,7 @@ def render_plotter(name, embedded):
if plotter is None: if plotter is None:
abort(404) abort(404)
g.embedded = embedded g.embedded = embedded
g.measurements = measurements
g.plotters = plotters g.plotters = plotters
g.plotter = plotter g.plotter = plotter
stations = read_stations() stations = read_stations()
......
...@@ -11,11 +11,12 @@ from pyld import jsonld ...@@ -11,11 +11,12 @@ from pyld import jsonld
from . import data_spec from . import data_spec
from .records import get_link from .records import get_link
Measurement = make_dataclass('Measurement', ['url_name', 'field', 'title']) Measurement = make_dataclass('Measurement',
measurements = {m.url_name: m for m in ( ['slug', 'field', 'title', 'units'])
Measurement('temperature', 1, 'Temperature (C)'), measurements = {m.slug: m for m in (
Measurement('pressure', 2, 'Pressure (hPa)'), Measurement('temperature', 1, 'Temperature', 'C'),
Measurement('wind-speed', 3, 'Wind Speed (m/s)'), Measurement('pressure', 2, 'Pressure', 'hPa'),
Measurement('wind-speed', 3, 'Wind Speed', 'm/s'),
)} )}
# Special JSON property names/values # Special JSON property names/values
ACCESS_URL = 'http://www.w3.org/ns/dcat#accessURL' ACCESS_URL = 'http://www.w3.org/ns/dcat#accessURL'
......
...@@ -44,21 +44,22 @@ class TimeSeries(Plotter): ...@@ -44,21 +44,22 @@ class TimeSeries(Plotter):
xmax=data[:, 0][-1], xmax=data[:, 0][-1],
linestyle='-', linestyle='-',
alpha=0.7) alpha=0.7)
axes.set_ylabel(meas.title) axes.set_ylabel(f'{meas.title} ({meas.units})')
axes.grid(True) axes.grid(True)
maximum = max(data, key=lambda row: row[meas.field]) maximum = max(data, key=lambda row: row[meas.field])
minimum = min(data, key=lambda row: row[meas.field]) minimum = min(data, key=lambda row: row[meas.field])
axes.set_title( axes.set_title(
(f'Max {meas.title}: {maximum[meas.field]}, Date: ({maximum[0]}). ' (f'Max {meas.title} ({meas.units}): {maximum[meas.field]}, '
f'Min {meas.title}: {minimum[meas.field]}, ' f'Date: ({maximum[0]}). '
f'Min {meas.title} ({meas.units}): {minimum[meas.field]}, '
f'Date: ({minimum[0]}).'), f'Date: ({minimum[0]}).'),
fontsize='small', fontsize='small',
) )
name = station['name'] name = station['name']
plt.suptitle(f'{meas.title} measurements, {name} Station, ' plt.suptitle(f'{meas.title} ({meas.units}) measurements, '
f'{data[0][0].year}') f'{name} Station, {data[0][0].year}')
return savefig_response(fig, filename=( return savefig_response(fig, filename=(
f'{cls.name}.{station_id}.{year}.{meas.url_name}.png' f'{cls.name}.{station_id}.{year}.{meas.slug}.png'
)) ))
...@@ -104,7 +105,7 @@ class Overlay(Plotter): ...@@ -104,7 +105,7 @@ class Overlay(Plotter):
xmax=datasets[0].data[:, 0][-1], xmax=datasets[0].data[:, 0][-1],
alpha=0.7, alpha=0.7,
label=f'Avg {dset.name} {dset.data[0][0].year}') label=f'Avg {dset.name} {dset.data[0][0].year}')
axes.set_ylabel(meas.title) axes.set_ylabel(f'{meas.title} ({meas.units})')
for dset in datasets: for dset in datasets:
dset.max = max(dset.data, key=lambda row: row[meas.field]) dset.max = max(dset.data, key=lambda row: row[meas.field])
...@@ -114,20 +115,21 @@ class Overlay(Plotter): ...@@ -114,20 +115,21 @@ class Overlay(Plotter):
axes.grid(True) axes.grid(True)
axes.set_title( axes.set_title(
(f'Max {meas.title}: {max_dset.max[meas.field]}, ' (f'Max {meas.title} ({meas.units}): {max_dset.max[meas.field]}, '
f'{max_dset.name} Station, Date: ({max_dset.max[0]}). ' f'{max_dset.name} Station, Date: ({max_dset.max[0]}). '
f'Min {meas.title}: {min_dset.min[meas.field]}, ' f'Min {meas.title} ({meas.units}): {min_dset.min[meas.field]}, '
f'{min_dset.name} Station, Date: ({min_dset.min[0]}).'), f'{min_dset.name} Station, Date: ({min_dset.min[0]}).'),
fontsize='small') fontsize='small')
axes.legend() axes.legend()
axes.tick_params(labelbottom=False) axes.tick_params(labelbottom=False)
title_dsets = ' / '.join(f'{dset.name} Station, {dset.data[0][0].year}' title_dsets = ' / '.join(f'{dset.name} Station, {dset.data[0][0].year}'
for dset in datasets) for dset in datasets)
plt.suptitle(f'{meas.title} measurements, {title_dsets}') plt.suptitle(f'{meas.title} ({meas.units}) measurements, '
f'{title_dsets}')
filename_dsets = '.'.join(f'{dset.station_id}.{dset.year}' filename_dsets = '.'.join(f'{dset.station_id}.{dset.year}'
for dset in datasets) for dset in datasets)
return savefig_response(fig, filename=( return savefig_response(fig, filename=(
f'{cls.name}.{filename_dsets}.{meas.url_name}.png' f'{cls.name}.{filename_dsets}.{meas.slug}.png'
)) ))
...@@ -172,19 +174,20 @@ class Boxplot(Plotter): ...@@ -172,19 +174,20 @@ class Boxplot(Plotter):
fig.set_figheight(6) fig.set_figheight(6)
fig.set_figwidth(12) fig.set_figwidth(12)
axes.boxplot(plot_data, positions=years) axes.boxplot(plot_data, positions=years)
axes.set_ylabel(meas.title) axes.set_ylabel(f'{meas.title} ({meas.units})')
axes.grid(True) axes.grid(True)
axes.set_title( axes.set_title(
(f'Max {meas.title}: {maximum[meas.field]}, Date: ({maximum[0]}). ' (f'Max {meas.title} ({meas.units}): {maximum[meas.field]}, '
f'Min {meas.title}: {minimum[meas.field]}, ' f'Date: ({maximum[0]}). '
f'Min {meas.title} ({meas.units}): {minimum[meas.field]}, '
f'Date: ({minimum[0]}).'), f'Date: ({minimum[0]}).'),
fontsize='small', fontsize='small',
) )
name = station['name'] name = station['name']
plt.suptitle(f'{meas.title} measurements, {name} Station, ' plt.suptitle(f'{meas.title} ({meas.units}) measurements, '
f'{start_year} - {end_year}.') f'{name} Station, {start_year} - {end_year}.')
return savefig_response(fig, filename=( return savefig_response(fig, filename=(
f'{cls.name}.{station_id}.{year1}.{year2}.{meas.url_name}.png' f'{cls.name}.{station_id}.{year1}.{year2}.{meas.slug}.png'
)) ))
......
<option value="temperature">Temperature</option> {% for meas in g.measurements.values() %}
<option value="pressure">Pressure</option> <option value="{{ meas.slug }}">
<option value="wind-speed">Wind Speed</option> {{- meas.title -}}
</option>
{% endfor %}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment