Úvod
Spatial data science nabízí vhled do různých oblastí, ale také využívá výpočetní zdroje a emituje skleníkové plyny.
Upřímně věříme, že pokud se zaměříme na uhlíkově efektivní spatial data science, staneme se součástí řešení klimatické změny. Zaměřujeme se na snižování negativních dopadů výpočtů spatial data science na naše klima snížením emisí uhlíku.
Představujeme některé běžné postupy provádění spatial data science uhlíkově efektivním způsobem.
Pokud máte zájem o běžný přístup green software engineering, měli byste se podívat na Green Software Foundation | GSF.
Nastavte si své prostředí pro spatial data science
Naše prostředí pro spatial data science je založeno na Pythonu a pip/conda. Proto používáme lehký Python modul odhadující množství oxidu uhličitého produkovaného výpočetním workflow spatial data science.
Pokud používáte conda, můžete nainstalovat CodeCarbon pomocí kanálu condaforge.
Instalace CodeCarbon do conda prostředí
# author: Jan Tschada
# SPDX-License-Identifer: Apache-2.0
conda install -c codecarbon -c conda-forge codecarbon=2.2
Motivace CodeCarbon
Metodologie CodeCarbon
Instalace CodeCarbon
Metody
Workflow spatial data science představují nejběžnější případy použití, které jsme zažili během naší každodenní práce.
ArcGIS Notebooks poskytují cloud-native Software-as-a-Service řešení optimalizované pro spatial data science. Každý notebook spouští dedikovanou instanci běžící v cloudu. Díky tomu můžeme snadno rozšířit toto Python prostředí pomocí modulu CodeCarbon.
Live Traffic
Město Bonn poskytuje informace o aktuálním provozu v reálném čase na třech mostech přes Rýn a na nejdůležitějších hlavních městských silnicích v Bonnu. Informace o provozu jsou aktualizovány každých 5 minut.
Chceme sbírat informace o aktuálním provozu pomocí dedikované feature služby běžící v našem ArcGIS Online instance. Odhadované emise uhlíku je třeba předzpracovat a serializovat do feature služby. Emisní tracker používá location API k detekci, ve které cloudové oblasti Python proces běží.
Užitečné funkce ArcGIS pro sběr a odhadování
# 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
Emisní tracker odhaduje emise uhlíku. Následující úryvek představuje implementaci live traffic. Validuje, zda již byla publikována dedikovaná feature vrstva. Pokud ne, vytvoří se nová feature služba hostující emise uhlíku a informace o provozu.
Úryvek pro sběr a odhadování
# 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)
elles:
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)
elles:
add_result = add_emissions(emissions_featurelayer, tracker)
ologging.info(add_result)
emissions
Výsledky
Nástěnný panel Green Spatial Engineering zobrazuje odhadované ekvivalenty uhlíku v kilogramech pro naše workflow spatial data science. První případ použití představuje uhlíkovou stopu za dotazování a sběr informací o aktuálním provozu z města Bonn každých 15 minut.

Odkazy:
Green Spatial Engineering Repository