Skip to content

Commit

Permalink
prediction -> forecast
Browse files Browse the repository at this point in the history
  • Loading branch information
maxhollmann committed Dec 29, 2021
1 parent 4c8d99d commit 5693aaa
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 81 deletions.
26 changes: 13 additions & 13 deletions src/blueskyapi/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

def _create_dataframe(response: bytes) -> pd.DataFrame:
df = pd.read_json(response)
df.prediction_moment = pd.to_datetime(df.prediction_moment)
df.forecast_moment = pd.to_datetime(df.forecast_moment)
return df


Expand Down Expand Up @@ -57,16 +57,16 @@ def latest_forecast(
self,
lat: float,
lon: float,
prediction_distances: Iterable[int] = None,
forecast_distances: Iterable[int] = None,
columns: Iterable[str] = None,
) -> pd.DataFrame:
response = self._get(
"/forecasts/gfs_0p25/latest",
params=dict(
lat=lat,
lon=lon,
prediction_distances=_prepare_comma_separated_list(
prediction_distances, "prediction_distances"
forecast_distances=_prepare_comma_separated_list(
forecast_distances, "forecast_distances"
),
columns=_prepare_comma_separated_list(columns, "columns"),
),
Expand All @@ -77,24 +77,24 @@ def forecast_history(
self,
lat: float,
lon: float,
min_prediction_moment: Union[datetime, str],
max_prediction_moment: Optional[Union[datetime, str]] = None,
prediction_distances: Optional[Iterable[int]] = None,
min_forecast_moment: Union[datetime, str],
max_forecast_moment: Optional[Union[datetime, str]] = None,
forecast_distances: Optional[Iterable[int]] = None,
columns: Optional[Iterable[str]] = None,
) -> pd.DataFrame:
response = self._get(
"/forecasts/gfs_0p25/history",
params=dict(
lat=lat,
lon=lon,
min_prediction_moment=_prepare_datetime(
min_prediction_moment, "min_prediction_moment"
min_forecast_moment=_prepare_datetime(
min_forecast_moment, "min_forecast_moment"
),
max_prediction_moment=_prepare_datetime(
max_prediction_moment, "max_prediction_moment"
max_forecast_moment=_prepare_datetime(
max_forecast_moment, "max_forecast_moment"
),
prediction_distances=_prepare_comma_separated_list(
prediction_distances, "prediction_distances"
forecast_distances=_prepare_comma_separated_list(
forecast_distances, "forecast_distances"
),
columns=_prepare_comma_separated_list(columns, "columns"),
),
Expand Down
6 changes: 3 additions & 3 deletions test.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
53,
10,
columns=["wind_u_at_100m"],
prediction_distances=[0, 24],
forecast_distances=[0, 24],
)
print(d)

Expand All @@ -16,7 +16,7 @@
53,
10,
columns=["wind_u_at_100m"],
prediction_distances=[0, 24],
min_prediction_moment="2021-06-01 00:00",
forecast_distances=[0, 24],
min_forecast_moment="2021-06-01 00:00",
)
print(d)
55 changes: 28 additions & 27 deletions tests/blueskyapi/client_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ def client():
return blueskyapi.Client()


default_result = [{"prediction_moment": "2021-12-27T18:00:00Z"}]
default_result = [{"forecast_moment": "2021-12-27T18:00:00Z"}]


def add_api_response(path, *, result=default_result, status=200, api_key=None):
Expand Down Expand Up @@ -78,25 +78,25 @@ def test_defaults(client):
add_api_response("/forecasts/gfs_0p25/latest?lat=53.5&lon=13.5")
client.latest_forecast(53.5, 13.5)

def describe_prediction_distances():
def describe_forecast_distances():
@responses.activate
def with_array(client):
add_api_response(
"/forecasts/gfs_0p25/latest?lat=53.5&lon=13.5&prediction_distances=0,24"
"/forecasts/gfs_0p25/latest?lat=53.5&lon=13.5&forecast_distances=0,24"
)
client.latest_forecast(53.5, 13.5, prediction_distances=[0, 24])
client.latest_forecast(53.5, 13.5, forecast_distances=[0, 24])

@responses.activate
def with_string(client):
add_api_response(
"/forecasts/gfs_0p25/latest?lat=53.5&lon=13.5&prediction_distances=0,24"
"/forecasts/gfs_0p25/latest?lat=53.5&lon=13.5&forecast_distances=0,24"
)
client.latest_forecast(53.5, 13.5, prediction_distances="0,24")
client.latest_forecast(53.5, 13.5, forecast_distances="0,24")

@responses.activate
def with_invalid_value(client):
with pytest.raises(TypeError, match="prediction_distances should be"):
client.latest_forecast(53.5, 13.5, prediction_distances=1.5)
with pytest.raises(TypeError, match="forecast_distances should be"):
client.latest_forecast(53.5, 13.5, forecast_distances=1.5)

def describe_columns():
@responses.activate
Expand Down Expand Up @@ -132,11 +132,11 @@ def test_over_rate_limit(client):
def test_result(client):
add_api_response(
"/forecasts/gfs_0p25/latest?lat=53.5&lon=13.5",
result=[{"prediction_moment": "2021-12-27T18:00:00Z", "some_column": 5}],
result=[{"forecast_moment": "2021-12-27T18:00:00Z", "some_column": 5}],
)
result = client.latest_forecast(53.5, 13.5)
assert np.all(
result.prediction_moment == [pd.to_datetime("2021-12-27T18:00:00Z")]
result.forecast_moment == [pd.to_datetime("2021-12-27T18:00:00Z")]
)
assert np.all(result.some_column == [5])

Expand All @@ -147,68 +147,69 @@ def test_integration(client):
assert len(result.columns) == 35
assert len(result) == 15

assert str(result.prediction_moment.dtype) == "datetime64[ns, UTC]"
assert str(result.forecast_moment.dtype) == "datetime64[ns, UTC]"
assert np.all(
result.prediction_moment == pd.to_datetime("2021-12-27T06:00:00Z")
result.forecast_moment == pd.to_datetime("2021-12-29T00:00:00Z")
)

assert np.all(
result.forecast_distance
== [0, 3, 6, 9, 12, 15, 18, 21, 24, 48, 72, 96, 120, 144, 168]
)

print(result)
assert np.all(result.apparent_temperature_at_2m > 250)
assert np.all(result.apparent_temperature_at_2m < 290)


def describe_forecast_history():
def describe_min_prediction_moments():
def describe_min_forecast_moments():
@responses.activate
def with_datetime(client):
add_api_response(
"/forecasts/gfs_0p25/history"
"?lat=53.5&lon=13.5"
"&min_prediction_moment=2021-12-27T18:00:00"
"&max_prediction_moment=2021-12-28T00:00:00"
"&min_forecast_moment=2021-12-27T18:00:00"
"&max_forecast_moment=2021-12-28T00:00:00"
)
client.forecast_history(
53.5,
13.5,
min_prediction_moment=datetime(2021, 12, 27, 18, 0),
max_prediction_moment=datetime(2021, 12, 28, 0, 0),
min_forecast_moment=datetime(2021, 12, 27, 18, 0),
max_forecast_moment=datetime(2021, 12, 28, 0, 0),
)

@responses.activate
def with_string(client):
add_api_response(
"/forecasts/gfs_0p25/history"
"?lat=53.5&lon=13.5"
"&min_prediction_moment=2021-12-27T18:00:00"
"&max_prediction_moment=2021-12-28T00:00:00"
"&min_forecast_moment=2021-12-27T18:00:00"
"&max_forecast_moment=2021-12-28T00:00:00"
)
client.forecast_history(
53.5,
13.5,
min_prediction_moment="2021-12-27T18:00:00",
max_prediction_moment="2021-12-28T00:00:00",
min_forecast_moment="2021-12-27T18:00:00",
max_forecast_moment="2021-12-28T00:00:00",
)

@responses.activate
def with_invalid_value(client):
with pytest.raises(TypeError, match="min_prediction_moment should be"):
client.forecast_history(53.5, 13.5, min_prediction_moment=1)
with pytest.raises(TypeError, match="min_forecast_moment should be"):
client.forecast_history(53.5, 13.5, min_forecast_moment=1)

def describe_max_prediction_moments():
def describe_max_forecast_moments():
@responses.activate
def with_none(client):
add_api_response(
"/forecasts/gfs_0p25/history"
"?lat=53.5&lon=13.5"
"&min_prediction_moment=2021-12-27T18:00:00"
"&min_forecast_moment=2021-12-27T18:00:00"
)
client.forecast_history(
53.5,
13.5,
min_prediction_moment=datetime(2021, 12, 27, 18, 0),
max_prediction_moment=None,
min_forecast_moment=datetime(2021, 12, 27, 18, 0),
max_forecast_moment=None,
)
77 changes: 39 additions & 38 deletions tests/cassettes/describe_latest_forecast/test_integration.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,58 +15,59 @@ interactions:
response:
body:
string: !!binary |
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
headers:
CF-Cache-Status:
- DYNAMIC
CF-RAY:
- 6c4610995b65d46f-HAM
- 6c5266befeec4168-HAM
Connection:
- keep-alive
Content-Type:
- application/json
Date:
- Mon, 27 Dec 2021 22:42:55 GMT
- Wed, 29 Dec 2021 10:38:53 GMT
Expect-CT:
- max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
NEL:
- '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
Report-To:
- '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=RQUq0%2Bpsvm%2FiC6u0UBEz7LFHhMX6l%2FC0CX3Y%2BF4tOsF7V2Mar1FU7KPVJKaKBW%2F82fGgNpT0wACkAwtytwguNDhIoVqhjFkkgsJOm8EtP1JBvHAb%2Bqve0jzFSbqu9Zgm9poBiA%3D%3D"}],"group":"cf-nel","max_age":604800}'
- '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=%2FEc3FfgHgCvCRGVDDY%2BiG4poVUD55wuKiaudPqpk3a5GYnRy5pPfvmyZ0TSwayQJaIOVUm5%2F248y2AEzXghAjtAnc0x97%2BS92nEQlqAqdvR2m%2FUDHQyQo6RMZhU81xKSSqF7TL5RSP8Q63YFDLY5JA%3D%3D"}],"group":"cf-nel","max_age":604800}'
Server:
- cloudflare
Transfer-Encoding:
Expand Down

0 comments on commit 5693aaa

Please sign in to comment.