scipy 如何在CSV文件中保存插值数据?

nzrxty8p  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(173)

我想将新插入的网格保存在CSV文件中,其结构如下:纬度、经度、值。
到目前为止,我编写的代码如下所示:

import numpy as np
from pykrige.ok import OrdinaryKriging
from pykrige.kriging_tools import write_asc_grid
import pykrige.kriging_tools as kt

def get_data(df):
    return {
        "lons": np.array([6.47, 4.8, 1.94]),
        "lats": np.array([46.37, 43.9, 47.83]),
        "values": np.array([-29.5, -27.6, -32.5]),
    }

def extend_data(data):
    return {
        "lons": np.concatenate([np.array([lon-360 for lon in data["lons"]]), data["lons"], np.array([lon+360 for lon in data["lons"]])]),
        "lats":  np.concatenate([data["lats"], data["lats"], data["lats"]]),
        "values":  np.concatenate([data["values"], data["values"], data["values"]]),
    }

def generate_grid(data, basemap, delta=1):
    grid = {
        'lon': np.arange(-180, 180, delta),
        'lat': np.arange(np.amin(data["lats"]), np.amax(data["lats"]), delta) # dont extrapolate towards the poles
    }
    grid["x"], grid["y"] = np.meshgrid(grid["lon"], grid["lat"])
    grid["x"], grid["y"] = basemap(grid["x"], grid["y"])
    return grid

def interpolate(data, grid):
    Ok = OrdinaryKriging(
        data["lons"],
        data["lats"],
        data["values"],
        variogram_model='exponential',
    )
    return Ok.execute("grid", grid["lon"], grid["lat"])

def inter_todf(interpolation, grid):
    dfl = pd.DataFrame({
         'latitude': grid['x'].reshape(-1),
         'longitude': grid['y'].reshape(-1),
         'value': interpolation.reshape(-1)
    });
    return(dfl)

base_data = get_data()
grid = generate_grid(base_data, basemap, 1)
extended_data = extend_data(base_data)
interpolation, interpolation_error = interpolate(extended_data, grid)
dfl = inter_todf(interpolation, grid)
dfl.to_csv('foo')

使用这段代码,我可以得到以下输出(print(dfl)):

latitude     longitude     value
0      5.650097e+06  8.681598e+05 -7.094071
1      5.713078e+06  8.681598e+05 -7.099389
2      5.776060e+06  8.681598e+05 -7.104715
3      5.839042e+06  8.681598e+05 -7.110051
4      5.902023e+06  8.681598e+05 -7.115394
...             ...           ...       ...
57235  2.684171e+07  1.687378e+07 -8.435601
57236  2.689803e+07  1.687378e+07 -8.449231
57237  2.695434e+07  1.687378e+07 -8.462931
57238  2.701066e+07  1.687378e+07 -8.476702
57239  2.706697e+07  1.687378e+07 -8.490544

但是,值得注意的是,纬度或经度值太高了。例如,纬度值应该只在+90度和-90度之间,经度值应该在+180度和-180度之间。我做错了什么?
示例我的“解决方案”基于:Is there a way to save interpolated values to a python dataframe?

3phpmpom

3phpmpom1#

全局变量grid对于grid["x"]grid["y"]具有不同的大小。这是因为genareate_grid中的data["lats"]不一定跨越最小值和最大值之间相差360的值。
我怀疑你的inter_todf并没有做它应该做的事情。你最想要的是每一条“线”都包含一个在x-y中的位置和相应的值。这需要像这样的东西:

x = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]
y = [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]

您尝试打印的内容是:

x = [0, 1, 2, 3]
y = [0, 1, 2]

相关问题