我有一个用 xarray 读取的“netCDF”文件,我想用它来为文件中的每个像素生成预测。
import xarray as xr
from fbprophet import Prophet
import time
with xr.open_dataset('avi.nc',
chunks={'y': 2, 'x':2}) as avi:
print(avi)
<xarray.Dataset>
Dimensions: (ds: 104, lat: 213, lon: 177)
Coordinates:
* lat (lat) float64 -2.711e+06 -2.711e+06 -2.711e+06 -2.711e+06 ...
* lon (lon) float64 1.923e+06 1.924e+06 1.924e+06 1.924e+06 1.924e+06 ...
* ds (ds) object '1999-07-16T23:46:04.500000000' ...
Data variables:
y (ds, lat, lon) float64 dask.array<shape=(104, 213, 177),
chunksize=(104, 2, 2)>
我为每个像素创建模型的方式是: * 循环遍历数组中的每个像素 ( for i in range(dataset.sizes['lat']):
), * 创建模型 ( m1
), * 将模型输出发送到 pandas DataFrame ( output
)
我已经尝试对 netCDF 文件进行“分块”,但我认为效率没有差异。下面是我目前使用的代码。
columns = ('Year','lat', 'lon')
dates = list(range(1996, 1999))
output = pd.DataFrame(columns=columns)
forecast2 = pd.DataFrame()
def GAM2 (dataset):
for i in range(dataset.sizes['lat']):
for k in range(dataset.sizes['lon']):
count +=1
df1 = dataset.y.isel(lat=slice(px_lat, (px_lat+1)), lon=slice(px_lon, (px_lon+1))).to_dataframe()
df1['ds'] = pd.to_datetime(df1.index.get_level_values(0), dayfirst=True)
df1['doy'] = df1['ds'].dt.dayofyear
m1 = Prophet(weekly_seasonality=False).fit(df1)
future1 = m1.make_future_dataframe()
output _data = {
'Year': year,
'lat': dataset.lat[px_lat].values,
'lon': dataset.lon[px_lon].values}
output = output .append(output , ignore_index=True)
if px_lon < (dataset.sizes['lon'] - 1):
px_lon += 1
else:
px_lon = 0
if px_lat < dataset.sizes['lat']:
px_lat += 1
else:
px_lat = 0
return output
问题:
- 我手动循环遍历数组(即
for i in range(dataset.sizes['lat']): ...
. - 输出当前将发送到 pandas 数据框,我需要将其发送到
DataArray
具有相同坐标 (lat
,lon
) 的 ,DataSet
以便进一步分析和可视化。
问题:
- 可以
dataset.apply()
使用这些功能吗?例如:
def GAM2 (dataset, index_name, site_name):
m1 = Prophet(weekly_seasonality=False).fit(df1)
future1 = m1.make_future_dataframe()
output _data = {
'Year': year,
'lat': dataset.lat[px_lat].values,
'lon': dataset.lon[px_lon].values}
return output
ds.apply(GAM2)
- 我可以将输出直接存储到
DataArray
变量中吗?还是我必须继续使用熊猫DatraFrame
然后尝试将其转换为DataArray
?