verde について
Verdeは、散在する空間データのグリッド化に使うPythonスキルで、地球科学者やデータ分析者を対象とします。複数のグリッダーに、データ削減、トレンド処理、パイプライン、交差検証を組み合わせられます。
主な機能
- 01スプライン・線形・三次グリッド化
- 02密集データのブロック削減
- 03多項式トレンドの推定と除去
- 04組み合わせ可能な処理パイプライン
- 05グリッダー選択の交差検証
- 06距離に基づくマスキング
活用シーン
- 01散在する標高測定値の補間
- 02投影座標のグリッド化
- 03グリッド化前の集中サンプル削減
- 04補間方法の検証
- 05観測点から遠いグリッドセルのマスキング
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ steadfastasart/ geoscience-skills --skill verdeインストール後、Claude Code で/verdeを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/cross_validation.mdgridders.mdscripts/grid_data.py詳細
Verde - 空間データのグリッディング
クイックリファレンス
import verde as vd
# Basic gridding
spline = vd.Spline()
spline.fit(coordinates, values) # coordinates = (lon, lat) tuple
grid = spline.grid(spacing=0.1) # Returns xarray Dataset
# Access result
elevation = grid.elevation.values
# Save output
grid.to_netcdf('output.nc')
主なクラス
| クラス | 目的 |
|---|---|
Spline | 双調和スプライン補間(滑らかで、外挿に適しています) |
Linear | Delaunay 三角形分割(高速で、外挿はできません) |
Cubic | 3 次補間(中程度の滑らかさ) |
Chain | 処理ステップのパイプライン |
BlockReduce | データをブロック平均値/中央値に間引きます |
Trend | 多項式トレンドのフィッティングと除去 |
Vector | 2 成分ベクトルデータのグリッド化 |
基本操作
散布データをグリッド化する
coordinates = (longitude, latitude) # Tuple of 1D arrays
values = elevation # 1D array
spline = vd.Spline()
spline.fit(coordinates, values)
grid = spline.grid(spacing=0.1, data_names=['elevation'])
デカルト座標に投影する
import pyproj
projection = pyproj.Proj(proj='merc', lat_ts=data_lat.mean())
proj_coords = projection(longitude, latitude)
spline = vd.Spline()
spline.fit(proj_coords, values)
grid = spline.grid(spacing=1000) # 1000m spacing
大規模データセットをブロック単位で間引く
import numpy as np
reducer = vd.BlockReduce(reduction=np.median, spacing=0.1)
coords_reduced, values_reduced = reducer.filter(coordinates, values)
グリッド化の前にトレンドを除去する
trend = vd.Trend(degree=2) # Quadratic
trend.fit(coordinates, values)
residuals = values - trend.predict(coordinates)
# Grid residuals, then add trend back
処理パイプライン
chain = vd.Chain([
('trend', vd.Trend(degree=1)),
('reduce', vd.BlockReduce(np.median, spacing=0.05)),
('spline', vd.Spline())
])
chain.fit(coordinates, values)
grid = chain.grid(spacing=0.01)
クロスバリデーション
spline = vd.Spline()
scores = vd.cross_val_score(spline, coordinates, values, cv=5)
print(f"Mean R2: {scores.mean():.3f}")
データから離れた領域をマスクする
grid = spline.grid(spacing=0.1)
mask = vd.distance_mask(coordinates, maxdist=0.2, grid=grid)
grid_masked = grid.where(mask)
グリッドのパラメーター
| パラメーター | 説明 |
|---|---|
spacing | グリッドセルのサイズ(座標と同じ単位) |
region | 境界(西、東、南、北) |
shape | グリッドの寸法(n_north、n_east) |
adjust | 'spacing' または 'region' - ぴったり収まるように調整する対象 |
グリッダーの比較
| グリッダー | 速度 | 滑らかさ | 外挿 |
|---|---|---|---|
Spline | 中 | 高 | 良好 |
Linear | 高速 | 低 | なし |
Cubic | 高速 | 中 | なし |
代替手段との使い分け
| 用途 | ツール | 理由 |
|---|---|---|
| 一般的な空間グリッド化 | Verde | ML スタイルの API、パイプライン、クロスバリデーション |
| 基本的な 1D/2D 補間 | scipy.interpolate | よりシンプルな API で、空間データに特化していません |
| ポテンシャル場のグリッド化 | Harmonica | 重力/磁気データ向けに設計された等価ソース |
| コマンドラインでのバッチグリッド化 | GMT | 強力な CLI で、自動化スクリプトに適しています |
| 地球統計学的補間 | scikit-gstat / pykrige | バリオグラムに基づき、不確実性を扱えます |
| 非常に大規模なデータセット(1,000 万点以上) | GMT / GDAL | 大規模データでのメモリ処理に優れています |
| ベクトルデータ(GPS 速度) | Verde(Vector) | 2 成分ベクトルのグリッド化機能を内蔵 |
| トレンド除去とグリッド化 | Verde(Chain) | パイプラインで各ステップをすっきり統合できます |
Verde を選ぶ場合:散布空間データのグリッド化に、クロスバリデーション、トレンド除去、パイプラインを組み込み、Python らしい scikit-learn スタイルの API を利用したい場合です。 探索的分析や再現可能なワークフローに最適です。
scipy.interpolate を選ぶ場合:空間座標や投影、検証を必要としない単純な補間タスクの場合です。
GMT を選ぶ場合:大規模データセットのコマンドラインによるバッチ処理が必要な場合、またはシェルベースのワークフローと統合し、surface や nearneighbor を使いたい場合です。
よくあるワークフロー
検証付きで散布空間データをグリッド化する
- 散布点データ(座標+値)を読み込む
- 必要に応じて地理座標をデカルト座標に投影する
- データ分布を調べ、クラスターや欠損領域を特定する
-
BlockReduceを適用して、密集したクラスターを間引く -
Trend(degree=1)またはTrend(degree=2)で広域トレンドを除去する -
cross_val_score()でグリッダーのパラメーターをクロスバリデーションする - CV スコアに基づいて
Spline(damping=...)またはSpline(mindist=...)を調整する - 選択したグリッダー(Spline、Linear、または Cubic)を残差にフィッティングする
-
.grid()で規則的な間隔のグリッドに変換する - グリッド化した残差にトレンドを戻す
-
distance_mask()を適用して、外挿によるアーティファクトを除去する - xarray のプロット機能でグリッドを可視化する:
grid.elevation.plot() -
grid.to_netcdf()で結果を NetCDF に保存する
よくある問題
| 問題 | 解決方法 |
|---|---|
| 外挿の品質が低い | distance_mask() を使って、データから離れた領域をマスクします |
| 大規模データで遅い | まず BlockReduce を使います |
| 広域トレンド | グリッド化の前に Trend で除去します |
| 間隔が不正 | 座標の単位(度またはメートル)を確認します |
参考資料
- グリッダー - 利用可能なグリッダーとパラメーター
- クロスバリデーション - パラメーター調整の方法
スクリプト
- scripts/grid_data.py - グリッド化された散在データをNetCDFに変換
コメント
Markdown 対応