Introducción
La ciencia de datos espaciales ofrece perspectivas en varios dominios, pero también utiliza recursos informáticos y emite gases de efecto invernadero.
Creemos sinceramente que si nos enfocamos en la ciencia de datos espaciales con eficiencia de carbono, nos convertimos en parte de la solución climática. Nos centramos en reducir los impactos negativos de los cálculos de la ciencia de datos espaciales en nuestro clima mediante la reducción de las emisiones de carbono.
Presentamos algunas prácticas comunes para realizar ciencia de datos espaciales de manera eficiente en carbono.
Si estás interesado en el enfoque común de ingeniería de software verde, deberías echar un vistazo a la Green Software Foundation | GSF.
Configura tu entorno de ciencia de datos espaciales
Nuestro entorno de ciencia de datos espaciales se basa en Python y pip/conda. Por lo tanto, usamos un módulo ligero de Python que estima la cantidad de dióxido de carbono producido por el flujo de trabajo computacional de la ciencia de datos espaciales.
Si usas conda, puedes instalar CodeCarbon usando el canal condaforge.
Instalando CodeCarbon en un entorno conda
# author: Jan Tschada
# SPDX-License-Identifer: Apache-2.0
conda install -c codecarbon -c conda-forge codecarbon=2.2
Motivación de CodeCarbon
Metodología de CodeCarbon
Instalación de CodeCarbon
Métodos
Los flujos de trabajo de ciencia de datos espaciales representan los casos de uso más comunes que hemos experimentado durante nuestro trabajo diario.
ArcGIS Notebooks proporciona una solución Software como Servicio nativa en la nube optimizados para la ciencia de datos espaciales. Cada notebook inicia una instancia dedicada que se ejecuta en la nube. Por lo tanto, podemos extender fácilmente este entorno Python usando el módulo CodeCarbon.
Tráfico en Vivo
La ciudad de Bonn proporciona información del tráfico en tiempo real sobre los tres puentes del Rin y las principales vías urbanas importantes de Bonn. La información del tráfico se actualiza cada 5 minutos.
Queremos recopilar la información del tráfico en tiempo real usando un servicio dedicado de entidades que se ejecuta en nuestra instancia ArcGIS Online. Las emisiones estimadas deben ser preprocesadas y serializadas en un servicio de entidades. El rastreador de emisiones usa una API de ubicación que detecta en qué región cloud se está ejecutando el proceso Python.
Funciones utilitarias ArcGIS para recopilar y estimar
# author: Jan Tschada
# SPDX-License-Identifer: Apache-2.0
from arcgis.gis import GIS
from arcgis.features import FeatureSet, GeoAccessor
from codecarbon import EmissionsTracker
import logging
import pandas as pd
import requests
import sys
def query_traffic():
url = 'http://stadtplan.bonn.de/geojson?Thema=19584'
response = requests.get(url)
response.raise_for_status()
return response.json()
def prepare_emissions(tracker):
emissions_data = tracker.final_emissions_data
emissions_df = pd.DataFrame.from_records([dict(emissions_data.values)])
emissions_df['timestamp'] = pd.to_datetime(emissions_df['timestamp'])
emissions_sdf = GeoAccessor.from_xy(emissions_df, 'longitude', 'latitude')
emissions_sdf.rename(columns={
'project_name': 'project',
'emissions_rate': 'rate',
'energy_consumed': 'consumed',
'country_name': 'country',
'country_iso_code': 'iso_code',
'cloud_provider': 'provider',
'cloud_region': 'cloud',
'codecarbon_version': 'codecarbon',
'python_version': 'python',
'ram_total_size': 'ram_total',
'tracking_mode': 'tracking'
}, inplace=True)
return emissions_sdf
def prepare_traffic(traffic_featureset):
traffic_sdf = traffic_featureset.sdf[['strecke_id', 'auswertezeit', 'geschwindigkeit', 'verkehrsstatus', 'SHAPE']]
traffic_sdf['auswertezeit'] = pd.to_datetime(traffic_sdf['auswertezeit'])
traffic_sdf['geschwindigkeit'] = pd.to_numeric(traffic_sdf['geschwindigkeit'])
traffic_sdf.rename(columns={
'strecke_id': 'seg_id',
'auswertezeit': 'time',
'geschwindigkeit': 'speed',
'verkehrsstatus': 'traffic'
}, inplace=True)
return traffic_sdf
def publish_emissions(tracker):
emissions_sdf = prepare_emissions(tracker)
return emissions_sdf.spatial.to_featurelayer(title='Carbon Emissions', folder='Stadt Bonn', tags=['Open Data', 'Carbon', 'Digital Twin'])
def publish_traffic(traffic_featureset):
traffic_sdf = prepare_traffic(traffic_featureset)
return traffic_sdf.spatial.to_featurelayer(title='Stadt Bonn - Aktuelle Straßenverkehrslage', folder='Stadt Bonn', tags=['Open Data', 'Traffic', 'Digital Twin'])
def add_emissions(emissions_featurelayer, tracker):
emissions_sdf = prepare_emissions(tracker)
new_features = emissions_sdf.spatial.to_featureset().features
edit_result = emissions_featurelayer.edit_features(adds=new_features)
return edit_result
def add_traffic(traffic_featurelayer, traffic_featureset):
traffic_sdf = prepare_traffic(traffic_featureset)
new_features = traffic_sdf.spatial.to_featureset().features
edit_result = traffic_featurelayer.edit_features(adds=new_features)
return edit_result
def find_emissions(gis):
portal_items = gis.content.search(query='title:Carbon Emissions AND tags:"Open Data"', item_type='Feature Layer')
if 0 < len(portal_items):
first_portal_item = portal_items[0]
if 0 < len(first_portal_item.layers):
return first_portal_item.layers[0]
return None
def find_traffic(gis):
portal_items = gis.content.search(query='title:Stadt Bonn - Aktuelle Straßenverkehrslage AND tags:"Open Data"', item_type='Feature Layer')
if 0 < len(portal_items):
first_portal_item = portal_items[0]
if 0 < len(first_portal_item.layers):
return first_portal_item.layers[0]
return None
El rastreador de emisiones estima las emisiones de carbono. El siguiente fragmento representa la implementación del tráfico en vivo. Valida si ya se publicó o no una capa dedicada. Si no, se crea un nuevo servicio de entidades que aloja las emisiones de carbono y la información del tráfico.
Fragmento para recopilar y estimar
# author: Jan Tschada
# SPDX-License-Identifer: Apache-2.0
gis = GIS("home")
root = logging.getLogger()
root.setLevel(logging.INFO)
handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.INFO)
root.addHandler(handler)
tracker = EmissionsTracker(project_name='Open Data Bonn', output_dir='/arcgis/home/')
tracker.start()
traffic_geojson = query_traffic()
traffic_featureset = FeatureSet.from_geojson(traffic_geojson)
traffic_featurelayer = find_traffic(gis)
printf None is traffic_featurelayer:
publish_result = publish_traffic(traffic_featureset)
ologging.info(publish_result)
printf else:
delete_result = traffic_featurelayer.delete_features(where='1=1')
ologging.info(delete_result)
add_result = add_traffic(traffic_featurelayer, traffic_featureset)
ologging.info(add_result)
emissions = tracker.stop()
emissions_featurelayer = find_emissions(gis)
printf None is emissions_featurelayer:
publish_result = publish_emissions(tracker)
ologging.info(publish_result)
printf else:
add_result = add_emissions(emissions_featurelayer, tracker)
ologging.info(add_result)
emissions
Resultados
El Green Spatial Engineering Dashboard muestra los equivalentes estimados de carbono en kilogramos para nuestros flujos de trabajo de ciencia de datos espaciales. El primer caso representa la huella de carbono por consultar y recopilar la información del tráfico en tiempo real desde la ciudad de Bonn cada 15 minutos.

Enlaces:
Repositorio Green Spatial Engineering