Skip to content

Commit 77af906

Browse files
authored
Merge pull request #164 from statisticsnorway/valuta_timeperiod_formats
Valuta timeperiod formats
2 parents 2a18cb9 + f3911a7 commit 77af906

File tree

4 files changed

+26
-47
lines changed

4 files changed

+26
-47
lines changed

demos/valuta_check.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
# extension: .py
66
# format_name: percent
77
# format_version: '1.3'
8-
# jupytext_version: 1.15.2
8+
# jupytext_version: 1.17.2
99
# kernelspec:
1010
# display_name: ssb-fagfunksjoner
1111
# language: python
@@ -19,12 +19,11 @@
1919
print(fagfunksjoner.__version__)
2020

2121
# %%
22-
from IPython.display import display
2322

2423
from fagfunksjoner.api.valuta import download_exchange_rates
2524

2625

2726
exchange_rates = download_exchange_rates()
28-
display(exchange_rates.df)
27+
exchange_rates.df # noqa: B018
2928

3029
# %%

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "ssb-fagfunksjoner"
3-
version = "1.1.1"
3+
version = "1.1.2"
44
description = "Fellesfunksjoner for ssb i Python"
55
authors = ["SSB-pythonistas <ssb-pythonistas@ssb.no>"]
66
license = "MIT"

src/fagfunksjoner/api/valuta.py

Lines changed: 17 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1+
import datetime
12
from dataclasses import dataclass
2-
from datetime import date
33
from typing import Any
44

55
import pandas as pd
66
import requests
7+
from dateutil import parser
78

89

910
@dataclass
@@ -287,10 +288,6 @@ def create_dataframe(data_obj: Data, structure_obj: Structure) -> pd.DataFrame:
287288
Returns:
288289
pd.DataFrame: A pandas DataFrame created from the data and structure objects.
289290
"""
290-
dimension_keys = [dim.id for dim in structure_obj.dimensions.get("series", [])]
291-
observation_keys = [
292-
dim.id for dim in structure_obj.dimensions.get("observation", [])
293-
]
294291
records = []
295292

296293
for dataset_obj in data_obj.dataSets:
@@ -301,25 +298,7 @@ def create_dataframe(data_obj: Data, structure_obj: Structure) -> pd.DataFrame:
301298
series_key, series_val, obs_key, obs_value, structure_obj
302299
)
303300
)
304-
305-
return pd.DataFrame(
306-
records,
307-
columns=dimension_keys
308-
+ [dim.id + "_id" for dim in structure_obj.dimensions.get("series", [])]
309-
+ observation_keys
310-
+ [dim.id + "_id" for dim in structure_obj.dimensions.get("observation", [])]
311-
+ ["Observation"]
312-
+ [
313-
attr.id
314-
for attr_list in structure_obj.attributes.values()
315-
for attr in attr_list
316-
]
317-
+ [
318-
attr.id + "_id"
319-
for attr_list in structure_obj.attributes.values()
320-
for attr in attr_list
321-
],
322-
)
301+
return pd.DataFrame(records)
323302

324303

325304
def make_single_dataframe_record(
@@ -328,7 +307,7 @@ def make_single_dataframe_record(
328307
obs_key: str,
329308
obs_value: list[str],
330309
structure_obj: Structure,
331-
) -> dict[str, str | float]:
310+
) -> dict[str, str | float | datetime.datetime]:
332311
"""Create a single record for a pandas DataFrame from a series and observation.
333312
334313
This function generates a dictionary representing a single row in a pandas
@@ -345,7 +324,16 @@ def make_single_dataframe_record(
345324
Returns:
346325
dict[str, str | float]: A dictionary representing a single record in the DataFrame.
347326
"""
348-
record: dict[str, str | float] = {
327+
observation_fields: dict[str, str | datetime.datetime] = {}
328+
for dim in structure_obj.dimensions.get("observation", []):
329+
observation: dict[str, str] = next(
330+
(val for i, val in enumerate(dim.values) if i == int(obs_key))
331+
)
332+
observation_fields |= {
333+
f"{dim.id}_{field}": parser.parse(val) for field, val in observation.items()
334+
}
335+
336+
record: dict[str, str | float | datetime.datetime] = {
349337
**{
350338
dim.id: dim.values[int(series_key.split(":")[dim.keyPosition])]["name"]
351339
for dim in structure_obj.dimensions.get("series", [])
@@ -355,17 +343,7 @@ def make_single_dataframe_record(
355343
+ "_id": dim.values[int(series_key.split(":")[dim.keyPosition])]["id"]
356344
for dim in structure_obj.dimensions.get("series", [])
357345
},
358-
**{
359-
dim.id: next(
360-
(val["name"] for val in dim.values if val["id"] == obs_key),
361-
obs_key,
362-
)
363-
for dim in structure_obj.dimensions.get("observation", [])
364-
},
365-
**{
366-
dim.id + "_id": obs_key
367-
for dim in structure_obj.dimensions.get("observation", [])
368-
},
346+
**observation_fields,
369347
"Observation": obs_value[0],
370348
}
371349
for _attr_key, attr_list in structure_obj.attributes.items():
@@ -423,6 +401,7 @@ def parse_response(json_data: dict[str, Any]) -> ValutaData:
423401

424402
# Create DataFrame
425403
df = create_dataframe(data_obj, structure_obj)
404+
426405
valuta_data = ValutaData(meta=valuta_meta, data=data_obj, df=df)
427406

428407
return valuta_data
@@ -458,7 +437,7 @@ def download_exchange_rates(
458437
ValutaData: The data retrieved from the API, parsed into a ValutaData object.
459438
"""
460439
if date_to is None:
461-
date_to = date.today().strftime("%Y-%m-%d")
440+
date_to = datetime.date.today().strftime("%Y-%m-%d")
462441

463442
url = URL_NORGES_BANK.format(
464443
frequency=frequency,
@@ -472,5 +451,4 @@ def download_exchange_rates(
472451
response = requests.get(url)
473452
response.raise_for_status()
474453
json_data = response.json()
475-
476454
return parse_response(json_data)

tests/api/test_valuta.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -209,20 +209,22 @@ def test_parse_response():
209209
"BASE_CUR",
210210
"QUOTE_CUR",
211211
"TENOR",
212-
"TIME_PERIOD",
213212
"FREQ_id",
214213
"BASE_CUR_id",
215214
"QUOTE_CUR_id",
216215
"TENOR_id",
216+
"TIME_PERIOD_start",
217+
"TIME_PERIOD_end",
217218
"TIME_PERIOD_id",
219+
"TIME_PERIOD_name",
218220
"Observation",
219221
"DECIMALS",
220-
"CALCULATED",
221-
"UNIT_MULT",
222-
"COLLECTION",
223222
"DECIMALS_id",
223+
"CALCULATED",
224224
"CALCULATED_id",
225+
"UNIT_MULT",
225226
"UNIT_MULT_id",
227+
"COLLECTION",
226228
"COLLECTION_id",
227229
}
228230
)

0 commit comments

Comments
 (0)