Как объединить Pandas DataFrame и Xarray DataArray в Python - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь объединить фрейм данных pandas и набор данных Xarray на основе трех атрибутов координат: ['долгота', 'широта', 'время']. ​​

В соответствии с Pydata Org., объединение двух массивов данных xarray довольно просто, поскольку они имеют одинаковые координаты.Сообщество предоставляет несколько вариантов объединения:

  1. Объединение вложенных
  2. Слияние
  3. Объединение

Чтобы объединить обе данные (по оси = 1), мне пришли в голову два решения:

  1. Преобразовать все данные в кадр данных pandas изатем объедините оба файла через панд.Это простое программное решение, но оно неэффективно с точки зрения использования памяти процессора (в случае, если Netcdf слишком велик для размещения в памяти).

  2. Преобразование всех данных в Netcdf DataArrays / DataFrames, а затем выполните объединение с помощью методов Xarray.

Мой вопрос касается второго варианта: объединение 2 файлов Netcdf.

Первый файл, который я хочу объединить, - это DailyНабор данных осадков от CHIRPS.

Второй файл представляет собой pandas dataframe, содержащий данные о суточных осадках с метеорологической станции.


Когда я читаю данные CHIRPS, я получаю следующее описание:

In []:print(CHIRPS)

Out[]: 

<xarray.Dataset>
Dimensions:        (time: 5794)
Coordinates:
    latitude       float32 -1.375
    longitude      float32 -48.425003
  * time           (time) datetime64[ns] 2003-01-20 2003-01-21 ... 2018-11-30
Data variables:
    precipitation  (time) float32 dask.array<shape=(5794,), chunksize=(346,)>
Attributes:
    Conventions:       CF-1.6
    title:             CHIRP  Version 1.0
    history:           created by Climate Hazards Group
    version:           Version 1.0
    date_created:      2017-10-24
    creator_name:      Pete Peterson
    creator_email:     pete@geog.ucsb.edu
    institution:       Climate Hazards Group.  University of California at Sa...
    documentation:     http://pubs.usgs.gov/ds/832/
    reference:         Funk, C.C., Peterson, P.J., Landsfeld, M.F., Pedreros,...
    comments:           
    acknowledgements:  The Climate Hazards Group InfraRed Precipitation with ...
    website:           http://chg.geog.ucsb.edu/data/chirps/index.html

Когда я читаю данные главы Метеорологической станции (все еще в кадре данных панд), я получаю следующее описание:

In []: print(Meteorological_station.head())

Out[]: 

   latitude  longitude       time  precipitation  altitude
0      -1.4 -48.433333 2003-01-20            4.8       576
1      -1.4 -48.433333 2003-01-21            5.4       576
2      -1.4 -48.433333 2003-01-22            0.6       576
3      -1.4 -48.433333 2003-01-23            0.0       576
4      -1.4 -48.433333 2003-01-24            0.0       576

И когда япреобразуйте кадр данных pandas в данные Xarray:

In [1]: Xarray_Meteorological_station = Meteorological_station.set_index(['latitude', 'longitude', 'time']).to_xarray()

In [2]: Xarray_Meteorological_station # checking xarray converted data

Out[3]: 

<xarray.Dataset>
Dimensions:        (latitude: 1, longitude: 1, time: 5794)
Coordinates:
  * time           (time) datetime64[ns] 2003-01-20 2003-01-21 ... 2018-11-30
  * latitude       (latitude) float64 -1.4
  * longitude      (longitude) float64 -48.43
Data variables:
    precipitation  (latitude, longitude, time) float64 4.8 5.4 0.6 ... 27.4 43.8
    altitude       (latitude, longitude, time) int64 576 576 576 ... 1152 1152

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

ЗдесьВот несколько примеров, основанных на различных попытках объединения:

# Attempt 1: 

  input[] : final = xr.concat([CHIRPS, Xarray_Meteorological_station])


  output[]: AttributeError: 'DataArray' object has no attribute 'variables'


# Attempt 2: 

  input[] : final = CHIRPS.merge(Xarray_Meteorological_station)

  output[]: MergeError: conflicting values for variable 'precipitation' on objects to be combined:


# Attemp 3:

  input[]: final = xr.combine_nested([ncin_rec, INMET_xarray])  

  output[]:  AttributeError: module 'xarray' has no attribute 'combine_nested'


# Attempt 4:  In here, I rename my original var according to the MergeError message from Attemp 2.

  input[1]: Xarray_Meteorological_station.rename({'precipitation':'Precip_Station'})

  input[2] : final = CHIRPS.merge(Xarray_Meteorological_station)

  output[]: # this option worked just fine. Though I can't assign a new dimension to the concatenation, and requires from the user to pre-rename concurrent variables in common.


# Attemp 5:

  input[]: final = xr.combine_by_coords([ncin_rec, INMET_xarray])   

  output[]: AttributeError: module 'xarray' has no attribute 'combine_by_coords'


# Attemp 6:
  input[]: final = xr.auto_combine([ncin_rec, INMET_xarray], concat_dim=None)

  output[]: MergeError: conflicting values for variable 'precipitation' on objects to be combined


# Attemp 7:
  input[]: final = xr.auto_combine([ncin_rec, INMET_xarray], concat_dim='platform')

  output[]: MergeError: conflicting values for variable 'precipitation' on objects to be combined

Несмотря на все мои усилия и все доступные варианты (кроме попытки 4), я не смог объединить два моих файла ('pandas dataframe)',' xarray DataArray ') с помощью методов xarray.

Если это возможно, может кто-нибудь объяснить различия между методами конкатенации в библиотеке Xarray и как я должен выполнять такой тип конкатенации по оси = 1?

В пандах все, что мне нужно было бы сделать, это что-то вроде:

final = df1.merge(df2, suffixes=('_CHIRPS', '_METEO_STATION') 

Я благодарю вас за ваше время и надеюсь услышать от вас скоро.

С уважением,

Филипп Рискалла Лил

...