Introduction
La science des données spatiales offre des perspectives dans divers domaines, mais utilise également des ressources informatiques et émet des gaz à effet de serre.
Nous croyons sincèrement que si nous nous concentrons sur une science des données spatiales efficace en carbone, nous faisons partie de la solution climatique. Nous nous concentrons sur la réduction des impacts négatifs des calculs de la science des données spatiales sur notre climat en réduisant les émissions de carbone.
Nous présentons quelques pratiques courantes pour réaliser la science des données spatiales de manière efficace en carbone.
Si vous êtes intéressé par l'approche commune du green software engineering, vous devriez jeter un œil à la Green Software Foundation | GSF.
Configurez votre environnement de science des données spatiales
Notre environnement de science des données spatiales est basé sur Python et pip/conda. Ainsi, nous utilisons un module Python léger estimant la quantité de dioxyde de carbone produite par le workflow informatique de la science des données spatiales.
Si vous utilisez conda, vous pouvez installer CodeCarbon en utilisant le canal condaforge.
Installation de CodeCarbon dans un environnement conda
# author: Jan Tschada
# SPDX-License-Identifer: Apache-2.0
conda install -c codecarbon -c conda-forge codecarbon=2.2
Motivation de CodeCarbon
Méthodologie de CodeCarbon
Installation de CodeCarbon
Méthodes
Les workflows de science des données spatiales représentent les cas d'utilisation les plus courants que nous avons rencontrés lors de notre travail quotidien.
ArcGIS Notebooks fournit une solution Software-as-a-Service native cloud optimisée pour la science des données spatiales. Chaque notebook démarre une instance dédiée fonctionnant dans le cloud. Ainsi, nous pouvons facilement étendre cet environnement Python en utilisant le module CodeCarbon.
Trafic en direct
La ville de Bonn fournit des informations sur le trafic en temps réel sur les trois ponts du Rhin et les routes principales les plus importantes du centre-ville de Bonn. Les informations sur le trafic sont mises à jour toutes les 5 minutes.
Nous souhaitons collecter les informations sur le trafic en temps réel en utilisant un service de fonctionnalités dédié fonctionnant dans notre instance ArcGIS Online. Les émissions de carbone estimées doivent être prétraitées et sérialisées dans un service de fonctionnalités. Le suivi des émissions utilise une API de localisation détectant dans quelle région cloud le processus Python s'exécute.
Fonctions utilitaires ArcGIS pour la collecte et l'estimation
# 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
Le suivi des émissions estime les émissions de carbone. L'extrait suivant représente l'implémentation du trafic en direct. Il valide si une couche de fonctionnalités dédiée a déjà été publiée ou non. Sinon, un nouveau service de fonctionnalités hébergeant les émissions de carbone et les informations sur le trafic est créé.
Extrait pour la collecte et l'estimation
# 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)
ellse:
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)
ellse:
add_result = add_emissions(emissions_featurelayer, tracker)
ologging.info(add_result)
emissions
Résultats
Le tableau de bord Green Spatial Engineering montre les équivalents carbone estimés en kilogrammes pour nos workflows de science des données spatiales. Le premier cas d'utilisation représente l'empreinte carbone pour interroger et collecter les informations sur le trafic en temps réel de la ville de Bonn toutes les 15 minutes.

Liens :
Dépôt Green Spatial Engineering