1- import duckdb
21import numpy as np
32import xarray as xr
3+ from sqlalchemy import CheckConstraint , ForeignKey
4+ from sqlalchemy .orm import DeclarativeBase , Mapped , mapped_column
5+
6+
7+ class TableBase (DeclarativeBase ):
8+ pass
9+
10+
11+ class Regions (TableBase ):
12+ __tablename__ = "regions"
13+
14+ name : Mapped [str ] = mapped_column (primary_key = True )
15+
16+
17+ class Commodities (TableBase ):
18+ __tablename__ = "commodities"
19+
20+ name : Mapped [str ] = mapped_column (primary_key = True )
21+ type : Mapped [str ] = mapped_column (
22+ CheckConstraint ("type IN ('energy', 'service', 'material', 'environmental')" )
23+ )
24+ unit : Mapped [str ]
25+
26+
27+ class Demand (TableBase ):
28+ __tablename__ = "demand"
29+
30+ year : Mapped [int ] = mapped_column (primary_key = True , autoincrement = False )
31+ commodity : Mapped [Commodities ] = mapped_column (
32+ ForeignKey ("commodities.name" ), primary_key = True
33+ )
34+ region : Mapped [Regions ] = mapped_column (
35+ ForeignKey ("regions.name" ), primary_key = True
36+ )
37+ demand : Mapped [float ]
438
539
640def read_inputs (data_dir ):
7- data = {}
8- con = duckdb .connect (":memory:" )
41+ from sqlalchemy import create_engine
42+
43+ engine = create_engine ("duckdb:///:memory:" )
44+ TableBase .metadata .create_all (engine )
45+ con = engine .raw_connection ().driver_connection
946
1047 with open (data_dir / "regions.csv" ) as f :
1148 regions = read_regions_csv (f , con ) # noqa: F841
@@ -16,32 +53,20 @@ def read_inputs(data_dir):
1653 with open (data_dir / "demand.csv" ) as f :
1754 demand = read_demand_csv (f , con ) # noqa: F841
1855
56+ data = {}
1957 data ["global_commodities" ] = calculate_global_commodities (commodities )
2058 return data
2159
2260
2361def read_regions_csv (buffer_ , con ):
24- sql = """CREATE TABLE regions (
25- name VARCHAR PRIMARY KEY,
26- );
27- """
28- con .sql (sql )
2962 rel = con .read_csv (buffer_ , header = True , delimiter = "," ) # noqa: F841
30- con .sql ("INSERT INTO regions SELECT name FROM rel;" )
63+ con .execute ("INSERT INTO regions SELECT name FROM rel;" )
3164 return con .sql ("SELECT name from regions" ).fetchnumpy ()
3265
3366
3467def read_commodities_csv (buffer_ , con ):
35- sql = """CREATE TABLE commodities (
36- name VARCHAR PRIMARY KEY,
37- type VARCHAR CHECK (type IN ('energy', 'service', 'material', 'environmental')),
38- unit VARCHAR,
39- );
40- """
41- con .sql (sql )
4268 rel = con .read_csv (buffer_ , header = True , delimiter = "," ) # noqa: F841
4369 con .sql ("INSERT INTO commodities SELECT name, type, unit FROM rel;" )
44-
4570 return con .sql ("select name, type, unit from commodities" ).fetchnumpy ()
4671
4772
@@ -63,14 +88,6 @@ def calculate_global_commodities(commodities):
6388
6489
6590def read_demand_csv (buffer_ , con ):
66- sql = """CREATE TABLE demand (
67- year BIGINT,
68- commodity VARCHAR REFERENCES commodities(name),
69- region VARCHAR REFERENCES regions(name),
70- demand DOUBLE,
71- );
72- """
73- con .sql (sql )
7491 rel = con .read_csv (buffer_ , header = True , delimiter = "," ) # noqa: F841
7592 con .sql ("INSERT INTO demand SELECT year, commodity_name, region, demand FROM rel;" )
7693 return con .sql ("SELECT * from demand" ).fetchnumpy ()
0 commit comments