Я беру данные с широтой, долготой и значением z и интерполирую их, используя кубический метод. Значения, кажется, сохранены в массиве numpy
. Есть ли способ сохранить интерполированные результаты в фрейм данных pandas
? Я пытаюсь сохранить его со столбцом значений долготы, широты и z для интерполированного результата.
Входной файл можно найти здесь и называется Nutrition.csv. Вот что я сделал до сих пор:
#Import modules
import pandas as pd
import numpy as np
import os
import shapely
import geopandas as geo
import glob
import holoviews as hv
hv.extension('bokeh')
from scipy.interpolate import griddata, interp2d
import fiona
import gdal
import ogr
#Read file
nut = pd.read_csv('nutrition.csv') #Data to be interpolated
#Minimum and maximum longtude values
lon_min = nut['longitude'].min()
lon_max = nut['longitude'].max()
#Create range of nitrogen values
lon_vec = np.linspace(lon_min, lon_max, 100) #Set grid size
#Find min and max latitude values
lat_min = nut['latitude'].min()
lat_max = nut['latitude'].max()
# Create a range of N values spanning the range from min to max latitude
# Inverse the order of lat_min and lat_max to get the grid correctly
lat_vec = np.linspace(lat_max,lat_min,100,)
# Generate the grid
lon_grid, lat_grid = np.meshgrid(lon_vec,lat_vec)
#Cubic interpolation
points = (nut['longitude'], nut['latitude'])
targets = (lon_grid, lat_grid)
grid_cubic = griddata(points, nut['n_ppm'], targets, method='cubic', fill_value=np.nan)
#Generate the graph
map_bounds=(lon_min,lat_min,lon_max,lat_max)
map_cubic = hv.Image(grid_cubic, bounds=map_bounds).opts(aspect='equal',
colorbar=True,
title='Cubic',
xlabel='Longitude',
ylabel='Latitude',
cmap='Reds')
map_cubic
Я думаю, что мне действительно просто нужно найти способ объединить targets
сетку с географической привязкой (которая имеет долготу и широту интерполированных точек) и grid_cubic
интерполированные данные z-поля в фрейм данных pandas.
Вы можете самостоятельно построить фрейм данных из полученных данных.
df = pd.DataFrame({
'latitude': lat_grid.reshape(-1),
'longitude': lon_grid.reshape(-1),
'value': grid_cubic.reshape(-1)
});
Давайте проверим данные, преобразованные обратно в numpy и построенные на графике.
import matplotlib.pyplot as plt
plt.pcolor(np.array(df['longitude']).reshape(100, 100),
np.array(df['latitude']).reshape(100, 100),
np.array(df['value']).reshape(100, 100))
Обратите внимание, что matplotlib представляет метки осей по-разному, но это те же координаты, что и для ваших исходных данных.
Если вы хотите удалить строки с неопределенным значением из фрейма данных, вы можете использовать что-то вроде этого
df[df['value'].notna()]
лучше покажите примеры данных, что вы получаете в массиве numpy и какой фрейм данных вы ожидаете. И ставить текстом, а не изображением — чтобы можно было просто скопировать и использовать в решениях