Source code for bw2io.extractors.exiobase
# -*- coding: utf-8 -*-
import csv
import itertools
import os
import xlrd
[docs]
class ExiobaseDataExtractor(object):
@classmethod
[docs]
def _check_dir(cls, path):
# Note: this assumes industry by industry
assert os.path.isdir(
path
), "Must supply path to `mrIOT_IxI_fpa_coefficient_version2.2.2` folder"
assert "mrIot_version2.2.2.txt" in os.listdir(
path
), "Directory path must include Exiobase files"
assert "types_version2.2.2.xls" in os.listdir(
path
), "Directory path must include Exiobase files"
@classmethod
[docs]
def _extract_metadata(cls, path):
wb = xlrd.open_workbook(os.path.join(path, "types_version2.2.2.xls"))
ws = wb.sheet_by_name("compartments")
compartments = [
(int(ws.cell(row, 0).value), ws.cell(row, 2).value,) # ID number # Name
for row in range(1, ws.nrows)
]
ws = wb.sheet_by_name("countries")
countries = [
(
ws.cell(row, 0).value, # Code (2-letter ISO/other)
ws.cell(row, 1).value, # Name
ws.cell(row, 3).value, # Group code
ws.cell(row, 4).value, # Group name
)
for row in range(1, ws.nrows)
]
ws = wb.sheet_by_name("industrytypes")
industries = [
(
ws.cell(row, 0).value, # Code
ws.cell(row, 1).value, # Name
ws.cell(row, 2).value, # Synonym
ws.cell(row, 4).value, # Group code
ws.cell(row, 5).value, # Group name
)
for row in range(1, ws.nrows)
]
ws = wb.sheet_by_name("producttypes")
products = [
(
ws.cell(row, 0).value, # Code
ws.cell(row, 1).value, # Name
ws.cell(row, 3).value, # Synonym
ws.cell(row, 4).value, # Group code
ws.cell(row, 5).value, # Group name
ws.cell(row, 7).value, # Layer
)
for row in range(1, ws.nrows)
]
ws = wb.sheet_by_name("units")
units = [
(ws.cell(row, 0).value, ws.cell(row, 1).value,) # Code # Name
for row in range(1, ws.nrows)
]
ws = wb.sheet_by_name("substances")
substances = [
(
ws.cell(row, 1).value, # Name
ws.cell(row, 2).value, # Code
ws.cell(row, 3).value, # Synonym
ws.cell(row, 4).value, # Description
)
for row in range(1, ws.nrows)
]
ws = wb.sheet_by_name("extractions")
extractions = [
(
ws.cell(row, 0).value, # ID number
ws.cell(row, 2).value, # Name
ws.cell(row, 3).value, # Synonym
)
for row in range(1, ws.nrows)
]
return (
units,
compartments,
countries,
industries,
products,
substances,
extractions,
)
@classmethod
[docs]
def _extract_csv(cls, path, filename, materials=False):
reader = csv.reader(open(os.path.join(path, filename)), delimiter="\t")
data = []
countries = next(reader)[3:]
industries = next(reader)[3:]
for line in reader:
for index, country, industry in zip(
itertools.count(), countries, industries
):
value = float(line[index + 2]) if materials else float(line[index + 3])
if not value:
continue
elif materials:
data.append(
(country, industry, line[0], "materials", line[1], value)
)
else:
data.append((country, industry, line[0], line[1], line[2], value))
return data
@classmethod
[docs]
def _generate_csv(cls, path, filename):
reader = csv.reader(open(os.path.join(path, filename)), delimiter="\t")
countries = next(reader)[3:]
industries = next(reader)[3:]
for line_no, line in enumerate(reader):
for index, country, industry in zip(
itertools.count(), countries, industries
):
value = float(line[index + 3])
if not value:
continue
yield (
country,
industry,
line[0], # country
line[1], # industry
line[2], # unit
value,
)
@classmethod
[docs]
def extract(cls, path):
cls._check_dir(path)
print("Extracting metadata")
(
units,
compartments,
countries,
industries,
products,
substances,
extractions,
) = cls._extract_metadata(path)
print("Extracting emissions")
emissions = cls._extract_csv(path, "mrEmissions_version2.2.2.txt")
# print("Extracting materials")
# materials = cls._extract_csv(path, "mrMaterials_version2.2.2.txt", True)
print("Extracting resources")
resources = cls._extract_csv(path, "mrResources_version2.2.2.txt")
print("Extracting main IO table")
table = cls._generate_csv(path, "mrIot_version2.2.2.txt")
outputs = {
"compartments": compartments,
"countries": countries,
"emissions": emissions,
"extractions": extractions,
"industries": industries,
"products": products,
"resources": resources,
"substances": substances,
"table": table,
"units": units,
}
return outputs