1+ import datetime
12from dataclasses import dataclass
2- from datetime import date
33from typing import Any
44
55import pandas as pd
66import 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
325304def 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 )
0 commit comments