-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path4.aplicaciones.py
168 lines (132 loc) · 4.62 KB
/
4.aplicaciones.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# ---
# jupyter:
# jupytext:
# formats: ipynb,py:percent
# text_representation:
# extension: .py
# format_name: percent
# format_version: '1.3'
# jupytext_version: 1.16.6
# kernelspec:
# display_name: Python 3 (ipykernel)
# language: python
# name: python3
# ---
# %% [markdown]
# # Introduccion a brightway - pt. 3
#
# En esta seccion hablaremos de los conceptos fundamentales de brigthway. Es importante aclarar que toda esta informacion esta disponible en linea en la pagina de documentacion:
#
# https://docs.brightway.dev/en/latest/index.html
# %% [markdown]
# ## Explorando las matrices
# Ahora que sabemos como crear un actividad y metodos desde cero. Podemos concentrarnos en manipular las actividades que estan presentes en ecoinvent.
# Para esta parte usaremos un proyecto que hemos preparado para ustedes que contiene una biosfera y tecnosfera compatible con ecoinvent v3.9
# %%
import bw2data as bd
import bw2io as bi
import bw2calc as bc
from rich import print
# %%
# Run this if you want a clean start
if 'peru25-ei-3.9.1-cutoff' in bd.projects:
bd.projects.delete_project('peru25-ei-3.9.1-cutoff',delete_dir=True)
# %%
bi.restore_project_directory('/media/ei391/brightway2-project-peru25-ei-3.9.1-cutoff-backup.tar.gz') # Este archivo contiene el proyecto
bd.projects.set_current('peru25-ei-3.9.1-cutoff')
# %%
# Tenemos dos bases de datos
bd.databases
# %%
# seleccionamos la base de datos ecoinvent y una actividad que tomaremos de ejemplo
ei = bd.Database("ecoinvent-3.9.1-cutoff")
harina = ei.search('fishmeal PE 65-67')[0]
harina
# %%
# Elegimos un metodo que ya esta instalado y hace un LCA pero nos detenemos en la etapa de LCI
method=('IPCC 2021', 'climate change', 'global warming potential (GWP100)')
lca = bc.LCA({harina:1},method=method) # Instancia la clase
lca.lci() # calcula el inventario de ciclo de vida
# %%
# Recordemos que ecoinvent tiene 21238 actividades
# Entonces que dimensiones deberia tener la matriz de la tecnosfera?
lca.technosphere_matrix.array()
# %%
# Que dimensiones deberia tener el vector s?
lca.supply_array()
# %%
# Si quisiera saber cuanto de 'anchoveta pescada en embarcaciones de madera'
# se requiere en TOTAL para producir 1 kg de harina de pescado...
anchoveta = ei.search('anchovy PE wooden')[1]
anchoveta
# %%
# el lca.activity_dict me permite ubicar una actividad en la matriz.
lca.supply_array[lca.activity_dict[anchoveta.id]]
# %%
# Ahora continuamos con el LCIA
lca.lcia() # Calcula los impactos
print("El impacto es: ", lca.score)
# %% [markdown]
# ## Analisis de contribuciones
# Para entender las distintas contribuciones, tenemos que seguir utilizando el objeto LCA.
# Este objeto mantiene los resultados del ACV en memoria
# %% [markdown]
# ### Procesos mas importantes
# Para listar los procesos que generan mas impactos utilizaremos el paquete `bw2analyzer` y `pandas`.
# %%
import pandas as pd
import bw2analyzer as ba
# ba.ContributionAnalysis().annotated_top_processes(lca=lca) # dificil de visulizar
# ba.ContributionAnalysis.annotated_top_processes??
# %%
pd.DataFrame(
[(x, y, z["name"]) for x, y, z in ba.ContributionAnalysis().annotated_top_processes(lca=lca)],
columns=["score", "quantity", "name"]
)
# %% [markdown]
# ### Emisiones mas importantes
# De manera similar, podemos obtener el ranking de flujos ambiental que generan mayores impactos
# %%
import pandas as pd
import bw2analyzer as ba
pd.DataFrame(
[(x, y, z["name"]) for x, y, z in ba.ContributionAnalysis().annotated_top_emissions(lca=lca)],
columns=["score", "quantity", "name"]
)
# %% [markdown]
# La importancia de las emisiones en el impacto tiene que ver con la cantidad y con los factores de caracterizacion.
# Podemos listar estos factores para revisarlos
# %%
for key, cf in bd.Method(method).load():
# print(key, cf)
print(bd.get_node(id=key), "CF: ",cf)
# %% [markdown]
# ## Analisis de incertidumbre
# Realizar simulaciones de Monte Carlo es tan facil que requiere modificar una sola linea de la clase LCA.
# %%
lca = bc.LCA(
{harina:1},
method=method,
use_distributions=True # Esto es nuevo
) # Instancia la clase
# El objeto LCA es ahora un 'generator'.
# Es decir que podemos iterarlo las veces que necesitemos
# %%
# Avanzamos un paso
next(lca)
results= []
# iteramos 50 veces, es decir muestreamos 100 veces.
for i in range(50):
lca.lci()
lca.lcia()
results.append(lca.score)
next(lca)
# %%
# Tenemos una lista de resultados
# que, en promedio deberia aproximarse a 0.44
results
# %%
# Podemos utilizar el paquete `seaborn` para visualizar la dispersion de los impactos
import seaborn as sns
sns.histplot(results)
# %%