はじめに
空間データサイエンスはさまざまな分野に洞察を提供しますが、同時に計算資源を使用し温室効果ガスを排出します。
私たちは正直に信じています。カーボン効率の良い空間データサイエンスに注力すれば、気候変動対策の一部になれると。私たちはカーボン排出量を削減することで、空間データサイエンス計算が気候に与える悪影響を減らすことに注力しています。
ここでは、カーボン効率の良い方法で空間データサイエンスを行うための一般的な実践例を紹介します。
一般的なグリーンソフトウェアエンジニアリングのアプローチに興味がある方は、Green Software Foundation | GSFをご覧ください。
空間データサイエンス環境のセットアップ
私たちの空間データサイエンス環境はPythonとpip/condaに基づいています。そのため、空間データサイエンスの計算ワークフローで発生する二酸化炭素の量を推定する軽量なPythonモジュールを使用しています。
condaを使用している場合は、condaforgeチャネルからCodeCarbonをインストールできます。
conda環境へのCodeCarbonのインストール
# author: Jan Tschada
# SPDX-License-Identifer: Apache-2.0
conda install -c codecarbon -c conda-forge codecarbon=2.2
CodeCarbon Motivation
CodeCarbon Methodology
CodeCarbon Installation
方法
空間データサイエンスのワークフローは、私たちの日常業務で経験した最も一般的なユースケースを表しています。
ArcGIS Notebooksは空間データサイエンスに最適化されたクラウドネイティブなSoftware-as-a-Serviceソリューションを提供します。各ノートブックはクラウド上で専用インスタンスを起動します。そのため、このPython環境にCodeCarbonモジュールを簡単に拡張できます。
ライブトラフィック
ボン市はライン川の3つの橋とボン市内の主要幹線道路のリアルタイム交通情報を提供しています。交通情報は5分ごとに更新されます。
専用のフィーチャサービスを使ってArcGIS Onlineインスタンスでリアルタイム交通情報を収集したいと考えています。推定されたカーボン排出量は前処理され、フィーチャサービスにシリアライズされる必要があります。排出トラッカーはPythonプロセスがどのクラウドリージョンで実行されているかを検出するロケーションAPIを使用します。
収集と推定のためのArcGISユーティリティ関数
# 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
排出トラッカーはカーボン排出量を推定します。以下のスニペットはライブトラフィック実装例です。専用フィーチャレイヤーが既に公開されているかどうかを検証し、存在しない場合はカーボン排出量と交通情報をホストする新しいフィーチャサービスが作成されます。
収集と推定のためのスニペット
# 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)
elser:
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)
elser:
add_result = add_emissions(emissions_featurelayer, tracker)
ologging.info(add_result)
emissions
結果
Green Spatial Engineering Dashboardは、私たちの空間データサイエンスワークフローで推定された炭素換算量(キログラム単位)を表示します。最初のユースケースは、ボン市から15分ごとにリアルタイム交通情報をクエリおよび収集する際のカーボンフットプリントを表しています。

リンク:
Green Spatial Engineering リポジトリ