Skip to content

Commit ef5d89c

Browse files
committed
Update RequestParams; add plot images to docs
1 parent 7e45e91 commit ef5d89c

File tree

8 files changed

+69
-43
lines changed

8 files changed

+69
-43
lines changed

Usage.ipynb

Lines changed: 31 additions & 23 deletions
Large diffs are not rendered by default.

albatross/analysis.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ def boxplot(data, fields=None, labels=None, **box_kwargs):
1616
"""
1717
Draws boxplots of wind speeds.
1818
19+
.. image:: ../docs/boxplot.jpg
20+
1921
Args:
2022
data (DataFrame): wind data
2123
fields (:obj:`list` of :obj:`str`, optional): a list of columns to include from the
@@ -67,6 +69,8 @@ def plot_windrose(data, speed=None, direction=None, **wr_kwargs):
6769
"""
6870
Generates a windrose plot from the given data.
6971
72+
.. image:: ../docs/windrose.png
73+
7074
Args:
7175
data (DataFrame): Wind data
7276
speed (str, optional): Wind speed column name. If not provided, it will be inferred
@@ -114,6 +118,8 @@ def pdf(data, speed=None, hist_kwargs=None, plot_kwargs=None):
114118
"""
115119
Generates a Weibull probability density plot from the given data.
116120
121+
.. image:: ../docs/pdf.jpg
122+
117123
Args:
118124
data (DataFrame): Wind data
119125
speed (str, optional): Wind speed column name. If not provided, it will be inferred
@@ -211,6 +217,8 @@ def plot_diurnal_stats(data, speed=None):
211217
"""
212218
Plots basic relevant diurnal wind speed statistics for the given data.
213219
220+
.. image:: ../docs/diurnal.jpg
221+
214222
Args:
215223
data (DataFrame): Wind data
216224
speed (str, optional): Wind speed column name. If not provided, it will be inferred
@@ -231,8 +239,8 @@ def plot_diurnal_stats(data, speed=None):
231239
for i, label in enumerate(stats_df):
232240
ax.plot(stats_df[label], label=label, marker=markers[i])
233241

234-
ax.set_xlabel('Hour')
235-
ax.set_ylabel('Wind Speed (m/s)')
242+
ax.set_xlabel('Hour', fontsize='large')
243+
ax.set_ylabel('Wind Speed (m/s)', fontsize='large')
236244
ax.set_xticks(np.arange(0, 23, 2))
237245
ax.legend()
238246

albatross/classes.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ def __init__(self):
118118
def get_fields(cls):
119119
"""
120120
Returns a list of fields that can be used as parameters.
121-
121+
122122
Returns:
123123
list: A list of valid parameters:
124124
@@ -147,10 +147,10 @@ def get_fields(cls):
147147

148148
return height + other
149149

150-
def register(self, field, height=None):
150+
def register(self, field, heights=None):
151151
"""
152152
Registers a new request field.
153-
153+
154154
Args:
155155
field (str): A field name. Must be a valid field name (see `RequestParams.get_fields`)
156156
height (int): A height (m). Must fall into the following ranges (inclusive):
@@ -168,13 +168,16 @@ def register(self, field, height=None):
168168
assert field in self._HEIGHT_FIELDS or field in self._OTHER_FIELDS, msg
169169

170170
if field in self._HEIGHT_FIELDS:
171-
assert height is not None, '"height" is required for this field.'
172-
assert isinstance(height, int), '"height" must be an integer.'
171+
assert heights is not None, '"heights" required for this field.'
172+
assert isinstance(heights, list), '"heights" must be a list.'
173+
msg = '"heights" elements must be integers.'
174+
assert all([isinstance(h, int) for h in heights]), msg
173175
height_range = self._HEIGHT_FIELDS[field]['height_range']
174-
msg = f'"height" must be in {height_range}.'
175-
assert height in height_range, msg
176176

177-
field_name = self._HEIGHT_FIELDS[field]['field']
178-
self.params.append(f'{field_name}_{height}m')
177+
for height in heights:
178+
msg = f'"height" must be in {height_range}.'
179+
assert height in height_range, msg
180+
field_name = self._HEIGHT_FIELDS[field]['field']
181+
self.params.append(f'{field_name}_{height}m')
179182
else:
180183
self.params.append(self._OTHER_FIELDS[field])

docs/boxplot.jpg

15.1 KB
Loading

docs/diurnal.jpg

28.3 KB
Loading

docs/pdf.jpg

31.1 KB
Loading

docs/windrose.png

76.8 KB
Loading

tests/test_classes.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,19 +58,26 @@ def test_RequestParams_register_invalid_field():
5858
with pytest.raises(AssertionError) as e:
5959
rp.register('wind_speed')
6060

61-
msg = '"height" is required for this field.'
61+
msg = '"heights" required for this field.'
62+
assert str(e.value) == msg
63+
64+
# invalid heights
65+
with pytest.raises(AssertionError) as e:
66+
rp.register('wind_speed', heights='12')
67+
68+
msg = '"heights" must be a list.'
6269
assert str(e.value) == msg
6370

6471
# invalid height
6572
with pytest.raises(AssertionError) as e:
66-
rp.register('wind_speed', height='12')
73+
rp.register('wind_speed', heights=['12'])
6774

68-
msg = '"height" must be an integer.'
75+
msg = '"heights" elements must be integers.'
6976
assert str(e.value) == msg
7077

7178
# height out of range
7279
with pytest.raises(AssertionError) as e:
73-
rp.register('wind_speed', height=0)
80+
rp.register('wind_speed', heights=[0])
7481

7582
msg = '"height" must be in range(10, 201).'
7683
assert str(e.value) == msg
@@ -82,12 +89,12 @@ def test_RequestParams_register():
8289
"""Test `register`."""
8390
rp = RequestParams()
8491

85-
rp.register('wind_speed', height=10)
92+
rp.register('wind_speed', heights=[10, 20, 30])
8693

87-
assert len(rp.params) == 1
88-
assert rp.params[0] == 'windspeed_10m'
94+
assert len(rp.params) == 3
95+
assert rp.params[:3] == ['windspeed_10m', 'windspeed_20m', 'windspeed_30m']
8996

9097
rp.register('inverse_monin_obukhov_length')
9198

92-
assert len(rp.params) == 2
93-
assert rp.params[1] == 'inversemoninobukhovlength_2m'
99+
assert len(rp.params) == 4
100+
assert rp.params[3] == 'inversemoninobukhovlength_2m'

0 commit comments

Comments
 (0)