machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Обработка файлов NetCDF с использованием XArray для абсолютных новичков

Дата публикации Dec 26, 2018

фотоАльберто РестифонаUnsplash

NetCDF - это машинно-независимый, ориентированный на массив, многомерный, самоописываемый и переносимый формат данных, используемый различными научными сообществами. У него есть расширение файла.NCили.cdf(хотя считается, что между ними есть тонкие различия). В отличие от файлов в.csvили.xlsx, Формат NetCDF не может быть доступен и просмотрен напрямую с помощью программного обеспечения для работы с электронными таблицами.

Даже если бы вы могли, вы бы не сделали этого с 4-мерными данными с кучей метаданных.

Я возьму климатические данные изСредство для измерения радиационной обстановки в климате(ARM) в Соединенных Штатах иЕвропейский центр среднесрочных прогнозов погоды(ECMWF) в Европе в качестве примера.

Оглавление

Первоначально опубликовано в моем блогеedenau.github.io,


Предпосылки

Мы будем использоватьxarrayбиблиотека на Python для обработки данных. Короче говоря, он опирается наnumpy(а такжеdask) библиотеки и использует силуpandas, но вам, вероятно, не нужно знать об этом. Как вы, возможно, знаете, зависимость от пакетов - это боль в Python. Вот почему наиболее удобный способ установить все это - использовать следующую команду:

$ conda install xarray dask netCDF4 bottleneck

Опытным программистам Python рекомендуется проверить соответствующиедокументацияБольше подробностей. Если вы новичок, не беспокойтесь. Я составил список зависимостей, которые нужно проверить:

  • питон2.7 / 3.5 +обязательный
  • NumPy1.12+обязательный
  • панд0.19.2+обязательный
  • SciPyдля интерполяции
  • узкое местодля ускорения пропуска NaN
  • netCDF4-питондля основных операций с netCDF, таких как чтение / запись
  • Даск-массив0.16+для параллельных вычислений сДаск

Если вы хотите визуализировать свой набор данных, вам, вероятно, понадобятся следующие:

  • Matplotlib1,5+ для построения
  • cartopyдля карт
  • рожденное моредля лучшей цветовой палитры

Для начинающих вы можете проверить версию Python по умолчанию

$ python --version
Python 2.7.5

Вы также можете проверить, установлен ли Python3

$ python3 --version
Python 3.4.9

Чтобы проверить версию пакетов, используйтеpip freezeилиconda list, Вещи должны проверить, если вы установитеxarrayчерезconda,


альтернативы

irisявляется альтернативойxarray, но некоторые работы должны быть выполнены, чтобы заставить его работать на Windows, и это не работает на Mac OS. Радужная оболочка также является английским словом, поэтому поиск в «ирисе» дает вам много неуместных результатов. Мне было больно пользоватьсяiris,


Предварительный просмотр данных

Всегда полезно «просмотреть» и «познакомиться» с вашими данными, их метаданными и структурами данных. Предположим, вы установилиnetCDF4-pythonи вам нужны только две командыncdumpа такжеncview, Первая дает текстовое представление вашего набора данных netCDF (в основном метаданных и самих данных), а вторая представляет собой очень мощный графический интерфейс для мгновенной визуализации данных.

ncdump

Перейдите в каталог вашего набора данных и попробуйте

$ ncdump -h twparmbeatmC1.c1.20050101.000000.cdf

Поскольку нам не нужно видеть значения каждой записи данных в данный момент,-hобеспечивает отображение только заголовка (метаданных) Ты получишь

netcdf twparmbeatmC1.c1.20050101.000000 {
dimensions:
time = UNLIMITED ; // (8760 currently)
range = 2 ;
p = 37 ;
z = 512 ;
variables:
double base_time ;
base_time:long_name = "Base time in Epoch" ;
base_time:units = "seconds since 1970-1-1 0:00:00 0:00" ;
base_time:string = "2005-01-01 00.00, GMT" ;
base_time:ancillary_variables = "time_offset" ;
float prec_sfc(time) ;
prec_sfc:long_name = "Precipitation Rate" ;
prec_sfc:standard_name = "lwe_precipitation_rate" ;
prec_sfc:units = "mm/hour" ;
prec_sfc:missing_value = -9999.f ;
prec_sfc:_FillValue = -9999.f ;
prec_sfc:source = "twpsmet60sC1.b1" ;
float T_p(time, p) ;
T_p:long_name = "Dry Bulb Temperature, from sounding in p coordinate" ;
T_p:standard_name = "air_temperature" ;
T_p:units = "K" ;
T_p:missing_value = -9999.f ;
T_p:_FillValue = -9999.f ;
T_p:source = "twpsondewnpnC1.b1:tdry" ;// global attributes:
< OTHER METADATA >
}

Вы можете видеть измерения, переменные и другие метаданные, которые говорят сами за себя. Глобальные атрибуты (не напечатанные выше) говорят нам, как данные собираются и предварительно обрабатываются. В этом примере это данные измерений, полученные ARM в 147.4E 2.1S, Манус, Папуа-Новая Гвинея.

Когда мы смотрим в список переменных: 1-димprec_sfcи 2-тусклыйT_pМы понимаем, что они имеют разные размеры (!). Коэффициент осадков - это скалярное измерение в каждый момент времени, тогда как температура - это столбец (измерения на разных уровнях давления вместо уровней высоты в этот раз) в каждый момент времени. В науке о климате довольно часто встречаются четырехмерные данные - широта, долгота, высота / уровень давления, время.

ncview

Попробуйте следующую команду, и она даст вам графический интерфейс, который перечисляет все переменные в вашем наборе данных, и это довольно просто.

$ ncview twparmbeatmC1.c1.20050101.000000.cdf
Графический интерфейс в Linux с использованиемncview

терминология

Структуры данныхxarray

DataArray

xarray.DataArrayявляется реализацией помеченного многомерного массивадля одной переменной, таких как осадки, температура и т. д. Он имеет следующие ключевые свойства:

  • values:numpy.ndarrayудерживая значения массива
  • dims: имена измерений для каждой оси (например,('lat', 'lon', 'z', 'time'))
  • coords: подобный диктату контейнер массивов (координат), которые обозначают каждую точку (например, 1-мерные массивы чисел,DateTimeобъекты или строки)
  • attrs:OrderedDictхранить произвольные метаданные (атрибуты)

DataSet

xarray.DataSetэто коллекция DataArrays. Каждый файл NetCDF содержит набор данных.


Кодирование с использованием XArray

Импорт данных

Вы не можете играть с данными, пока не прочитаете их использованиеopen_datasetилиopen_mfdatasetпрочитать один или несколько файлов NetCDF и сохранить их в наборе данных под названиемDS,

import xarray as xr# single file
dataDIR = '../data/ARM/twparmbeatmC1.c1.20050101.000000.cdf'
DS = xr.open_dataset(dataDIR)# OR multiple files
mfdataDIR = '../data/ARM/twparmbeatmC1.c1.*.000000.cdf'
DS = xr.open_mfdataset(mfdataDIR)

Проверка данных

Помните 4 ключевых свойства DataArrays? Вы можете использоватьDS.values,DS.var,DS.dims,DS.coords, а такжеDS.attrsдля проверки данных. Это станет очень удобно в интерактивном Python. Их функциональные возможности довольно очевидны и оставлены читателю в качестве упражнения (!).

DataArray Extraction

Извлечение DataArrays из DataSetDSочень просто, какDS.<var_name>будет достаточно. Вы можете рассмотреть возможность удаления записей NaNdropna()и выбрав данные сsel(),methodпараметр вsel()позволяет нам включить поиск ближайшего соседа (неточные) с помощью методов'pad','backfill', или'nearest', Чтобы указать диапазон, используйтеslice(),

Вы можете преобразоватьxr.DataArrayвnumpy.ndarrayпоda.values,

# Extract Dry Bulb Temperature in z-coordinate (T_z)
# Select the altitude nearest to 500m above surface
# Drop NaN, convert to Celcius
da = DS.T_z.sel(z=500,method='nearest').dropna(dim='time') - 273.15 # or .ffill(dim='time')# Select data in 2000s
da = da.sel(time=slice('2000-01-01', '2009-12-31'))
da_numpy = da.values

Это соглашение называть DataSet какDSв верхнем регистре и DataArray какdaв нижнем регистре.

Операция DateTime

Предположим, DataArraydaимеет размерностьtimeвDateTimeформат, мы можем извлечьгод/месяц/день/DayOfYear/день неделипоda.time.dt.<year/month/day/...>, Обратите внимание, что вывод все еще находится в DataArray.

Следующий пример делает еще один шаг и пытается вычислить среднее / сумму любой переменной для каждого месяца. Сначала мы определим новую систему координат сassign_coords(), Зачем? Попробуйте посмотреть, какгода такжемесяцвыступает вDateTime, Если нам нужно, чтобы система знала о различиях между январем 2000 года и январем 2001 года, нам нужны обагода такжемесяцопределить новую координату, которую мы называем этоyear_month,

Затем мы можем сгруппировать данные поgroupby('year_month')на основе нашей новой определенной системы координат, а затемmean()илиsum()операции.

# Contract the DataArray by taking mean for each Year-Month
def mean_in_year_month(da):
# Index of Year-Month starts at Jan 1991
month_cnt_1991 = (da.time.dt.year.to_index() - 1991) * 12 + da.time.dt.month.to_index()
# Assign newly defined Year-Month to coordinates, then group by it, then take the mean
return da.assign_coords(year_month = month_cnt_1991).groupby('year_month').mean()da_1 = mean_in_year_month(da1)

DataArray Merging

Мы можем объединить несколько массивов данных, используяxr.merge(), Если вы попытаетесь объединить две переменные с одним и тем же именем, но с разными значениями,xr.MergeErrorбудет поднят. Это обеспечиваетxr.merge()неразрушающий.

DS_new = xr.merge([da_1,da_2,da_3]).dropna(dim='year_month')

Черчение

Вы можете просто принять DataArrays в качестве аргументовmatplotlib.pyplotметоды. Для начинающих, попробуйтеplt.plot(), илиplt.scatter()для линейных или точечных участков. Не забудьте показать цифры поplt.show()или сохранить цифры поplt.savefig(),

Если вам нужны карты,cartopyбиблиотека может генерировать один легко.

import cartopy.crs as ccrs
import matplotlib.pyplot as pltda = DS.t_sfc# Draw coastlines of the Earth
ax = plt.axes(projection=ccrs.PlateCarree())
ax.coastlines()
da.plot()
plt.show()

С помощью нескольких дополнительных строк кода вы можете сгенерировать что-то вроде этого:

Сюжеты, созданныеcartopy

Экспорт данных

Вы можете конвертировать DataArray вnumpy.ndarrayкак объяснено ранее, или преобразуйте DataSet или DataArray вpandas.DataFrameкак показано ниже.

df = DS.to_dataframe()

Вы также можете экспортировать DataArray или DataSet в файл NetCDF с помощью

dataDIR = '../data/new.nc'
DS.to_netcdf(dataDIR)

замечания

Если вы интересуетесь Python или программированием в целом, вам могут помочь следующие статьи:

Вы выжили бы на Титанике?

Путешествие по непотопляемому - чему ИИ может научиться после катастрофы

hackernoon.com

Краткое руководство по запуску ваших скриптов Python в Google Colab Laboratory

Начните тренировать свои нейронные сети с помощью бесплатных графических процессоров уже сегодня

towardsdatascience.com

Визуализация мобильности велосипедов в Лондоне с использованием интерактивных карт и анимации

Изучение инструментов визуализации данных в Python

towardsdatascience.com

Этот учебник был написан для целей обучения и включал только самые основыxarray, Надеюсь это поможет!

Первоначально опубликовано в моем блогеedenau.github.io,

Ссылки

Оригинальная статья

Footer decor

© machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map