使用空间插值python填充shapefile中的缺失数据
Posted
技术标签:
【中文标题】使用空间插值python填充shapefile中的缺失数据【英文标题】:Filling Missing data in shapefile using spatial interpolation python 【发布时间】:2022-01-11 20:14:24 【问题描述】:这是我的第一个问题。我是python新手,所以请多多包涵。 我有一个包含如下数据的 shapefile。
ID Data geometry
111 0.1 POINT(X,Y)
112 0.2 POINT(X,Y)
113 0.5 POINT(X,Y)
114 NaN POINT(X,Y)
115 0.3 POINT(X,Y)
116 NaN POINT(X,Y)
117 NaN POINT(X,Y)
我想使用空间插值填充“数据”列中的缺失值。 我已经尝试过本教程https://www.youtube.com/watch?v=OfC3KpL4PRw,但它为我的数据添加了很多额外的坐标。有没有更简单的方法来使用空间插值来填补那些缺失的点?
【问题讨论】:
Scipy 有一个 2D 插值模块。但是堆栈溢出不适用于库推荐。您需要(几乎)工作代码和特定问题。您可能会在 gis.stackexchange.com 上得到更好的回复 【参考方案1】: 您可以计算出完整的距离矩阵并使用它来查找最近点的值 我不希望这会扩展到大量点 已模拟一些数据,因为问题是抽象的import geopandas as gpd
import pandas as pd
from scipy.spatial import distance
import numpy as np
import shapely.geometry
gdf = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres")).set_crs("EPSG:4326")
# get some points - UK boundary
gdf = gdf.loc[gdf["iso_a3"].eq("GBR"), "geometry"].apply(lambda g: g.geoms).explode().apply(
lambda g: g.exterior.coords
).explode().apply(shapely.geometry.Point).reset_index(drop=True).to_frame().assign(
data=lambda d: np.arange(0, len(d))
)
gdf = gpd.GeoDataFrame(gdf)
# randomly set 10 values to NaN
gdf.loc[gdf.sample(20).index, "data"] = np.nan
# build matrix of distances...
d = pd.DataFrame(distance.cdist(*[np.stack(gdf.geometry.apply(lambda x: [x.x, x.y]))] * 2))
# take mean of nearest 3 co-ordinates
gdf["data_i"] = gdf.apply(
lambda r: gdf.loc[d[r.name].sort_values().index, "data"].dropna().head(3).mean()
if np.isnan(r["data"])
else r["data"],
axis=1,
)
gdf.plot(column="data")
gdf.plot(column="data_i")
【讨论】:
以上是关于使用空间插值python填充shapefile中的缺失数据的主要内容,如果未能解决你的问题,请参考以下文章
如何用python读取arcgis中shapefile文件的属性表
数据分析缺失值处理(Missing Values)——删除法填充法插值法
Python / Pandas:按顺序填充 NaN - 线性插值 --> ffill --> bfill