использование Prophet в файле netCDF с использованием xarray - PullRequest
1 голос
/ 17 июня 2019

У меня есть файл 'netCDF', который я прочитал с помощью xarray, и я хочу использовать его для создания прогноза для каждого пикселя в файле.

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), * отправить вывод модели на пандас 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']): ....
  • В данный момент выходные данные отправляются на информационный фрейм панд, и мне нужно, чтобы он перешел на 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?
...