Loading data into Pyleoclim objects

Loading data into Pyleoclim objects#

To simplify the remainder of the examples in this notebook, we’ll load the LiPD data into pickle objects which can be stored and easily loaded later. These are python native data objects, so we’re essentially trading the flexibility of the LiPD files for the convenience of pickle files.

import pickle
import os

from tqdm import tqdm

import pyleoclim as pyleo

from pylipd.lipd import LiPD

Make a directory for the pickle files if it doesn’t yet exist:

pickle_dir = '../../data/pickle'
if not os.path.exists(pickle_dir):
    os.makedirs(pickle_dir)

Loading and processing the data:

data_path = '../../data/LiPD/full'
D = LiPD()
D.load_from_dir(data_path)
lipd_records = D.get_all_dataset_names()

series_dict = {}
processed_series_dict = {}

ens_dict = {}
processed_ens_dict = {}

holocene_bounds = (0,10000)

for record in tqdm(lipd_records):
    D = LiPD()
    D.load(os.path.join(data_path,f'{record}.lpd'))
    df = D.get_timeseries_essentials().iloc[0]
    series = pyleo.GeoSeries(
        time = df['time_values'],
        value=df['paleoData_values'],
        time_name = 'Age',
        time_unit = 'yrs BP',
        value_name = r'$\delta^{18} O$',
        value_unit = u'‰',
        label=record,
        lat = df['geo_meanLat'],
        lon=df['geo_meanLon'],
        archiveType='speleothem',
        dropna=False,
        verbose = False   
    )

    if record == 'Qunf.Oman.2023': # Removing a large hiatus from the Qunf record
        series = series.slice((2500,10000))

    processed_series = series.slice(holocene_bounds).interp().standardize().detrend(method='savitzky-golay')

    series_dict[record] = series
    processed_series_dict[record] = processed_series

    ens_df = D.get_ensemble_tables().iloc[0]
    ens_series_list = []
    processed_ens_series_list = []
    for i in range(1000): #We know there are 1000 ensemble members
        ens_series = pyleo.GeoSeries(
            time = ens_df['ensembleVariableValues'].T[i],
            value= df['paleoData_values'],
            time_name = 'Age',
            time_unit = 'yrs BP',
            value_name = r'$\delta^{18} O$',
            value_unit = u'‰',
            label=record,
            lat = df['geo_meanLat'],
            lon=df['geo_meanLon'],
            archiveType='speleothem',
            dropna=False,
            verbose=False
        )

        if record == 'Qunf.Oman.2023': # Removing a large hiatus from the Qunf record
            ens_series = ens_series.slice((2500,10000))
        
        processed_ens_series = ens_series.slice(holocene_bounds).interp().standardize().detrend(method='savitzky-golay')

        ens_series_list.append(ens_series)
        processed_ens_series_list.append(processed_ens_series)
    
    ens_dict[record] = pyleo.EnsembleGeoSeries(ens_series_list)
    processed_ens_dict[record] = pyleo.EnsembleGeoSeries(processed_ens_series_list)
Loading 14 LiPD files
  0%|                                                                                            | 0/14 [00:00<?, ?it/s]
 14%|████████████                                                                        | 2/14 [00:00<00:02,  4.18it/s]
 29%|████████████████████████                                                            | 4/14 [00:00<00:01,  6.79it/s]
 36%|██████████████████████████████                                                      | 5/14 [00:00<00:01,  5.76it/s]
 43%|████████████████████████████████████                                                | 6/14 [00:01<00:01,  5.87it/s]
 50%|██████████████████████████████████████████                                          | 7/14 [00:01<00:01,  6.43it/s]
 57%|████████████████████████████████████████████████                                    | 8/14 [00:01<00:01,  4.79it/s]
 64%|██████████████████████████████████████████████████████                              | 9/14 [00:01<00:01,  4.88it/s]
 71%|███████████████████████████████████████████████████████████▎                       | 10/14 [00:01<00:00,  5.33it/s]
 79%|█████████████████████████████████████████████████████████████████▏                 | 11/14 [00:01<00:00,  5.90it/s]
 86%|███████████████████████████████████████████████████████████████████████▏           | 12/14 [00:02<00:00,  5.73it/s]
 93%|█████████████████████████████████████████████████████████████████████████████      | 13/14 [00:02<00:00,  5.29it/s]
100%|███████████████████████████████████████████████████████████████████████████████████| 14/14 [00:02<00:00,  5.74it/s]

Loaded..
  0%|                                                                                            | 0/14 [00:00<?, ?it/s]
Loading 1 LiPD files

  0%|                                                                                             | 0/1 [00:00<?, ?it/s]

100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 12.38it/s]

Loaded..
  7%|██████                                                                              | 1/14 [00:01<00:22,  1.71s/it]
Loading 1 LiPD files

  0%|                                                                                             | 0/1 [00:00<?, ?it/s]


100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  3.06it/s]

100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  3.06it/s]

Loaded..
 14%|████████████                                                                        | 2/14 [00:09<01:00,  5.08s/it]
Loading 1 LiPD files

  0%|                                                                                             | 0/1 [00:00<?, ?it/s]

100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 12.05it/s]

Loaded..
 21%|██████████████████                                                                  | 3/14 [00:10<00:38,  3.46s/it]
Loading 1 LiPD files

  0%|                                                                                             | 0/1 [00:00<?, ?it/s]

100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 11.76it/s]

Loaded..
 29%|████████████████████████                                                            | 4/14 [00:12<00:27,  2.73s/it]
Loading 1 LiPD files

  0%|                                                                                             | 0/1 [00:00<?, ?it/s]


100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  4.23it/s]

100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  4.21it/s]

Loaded..
 36%|██████████████████████████████                                                      | 5/14 [00:16<00:27,  3.11s/it]
Loading 1 LiPD files

  0%|                                                                                             | 0/1 [00:00<?, ?it/s]


100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  6.20it/s]

100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  6.17it/s]

Loaded..
 43%|████████████████████████████████████                                                | 6/14 [00:18<00:23,  2.94s/it]
Loading 1 LiPD files

  0%|                                                                                             | 0/1 [00:00<?, ?it/s]


100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  7.94it/s]

100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  7.89it/s]

Loaded..
 50%|██████████████████████████████████████████                                          | 7/14 [00:20<00:18,  2.70s/it]
Loading 1 LiPD files

  0%|                                                                                             | 0/1 [00:00<?, ?it/s]


100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  2.91it/s]

100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  2.90it/s]

Loaded..
 57%|████████████████████████████████████████████████                                    | 8/14 [00:27<00:22,  3.79s/it]
Loading 1 LiPD files

  0%|                                                                                             | 0/1 [00:00<?, ?it/s]


100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  4.75it/s]

100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  4.74it/s]

Loaded..
 64%|██████████████████████████████████████████████████████                              | 9/14 [00:30<00:18,  3.78s/it]
Loading 1 LiPD files

  0%|                                                                                             | 0/1 [00:00<?, ?it/s]


100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  6.35it/s]

100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  6.31it/s]

Loaded..
 71%|███████████████████████████████████████████████████████████▎                       | 10/14 [00:33<00:13,  3.50s/it]
Loading 1 LiPD files

  0%|                                                                                             | 0/1 [00:00<?, ?it/s]


100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  7.44it/s]

100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  7.39it/s]

Loaded..
 79%|█████████████████████████████████████████████████████████████████▏                 | 11/14 [00:36<00:09,  3.20s/it]
Loading 1 LiPD files

  0%|                                                                                             | 0/1 [00:00<?, ?it/s]


100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  4.85it/s]

100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  4.83it/s]

Loaded..
 86%|███████████████████████████████████████████████████████████████████████▏           | 12/14 [00:40<00:06,  3.43s/it]
Loading 1 LiPD files

  0%|                                                                                             | 0/1 [00:00<?, ?it/s]


100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  4.50it/s]

100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00,  4.49it/s]

Loaded..
 93%|█████████████████████████████████████████████████████████████████████████████      | 13/14 [00:44<00:03,  3.66s/it]
Loading 1 LiPD files

  0%|                                                                                             | 0/1 [00:00<?, ?it/s]

100%|█████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 14.57it/s]

Loaded..
100%|███████████████████████████████████████████████████████████████████████████████████| 14/14 [00:45<00:00,  2.94s/it]
100%|███████████████████████████████████████████████████████████████████████████████████| 14/14 [00:45<00:00,  3.26s/it]

Plotting each record and its ensemble for QA/QC:

for label,series in series_dict.items():
    ens = ens_dict[label]
    fig,ax = ens.common_time().plot_envelope()
    series.plot(ax=ax)
../../_images/d093b04ac34ce63950f47385b79a2529bd49f71e491ebf95d61960898d4c0dba.png ../../_images/bbf4f839fea2fc62a7845e0f71aecee4d31eca31e1d974f45af88b7806f06661.png ../../_images/ecde472d601f7197b97f96e51d3080c33ed9913577e701d6667b4f028937fc2b.png ../../_images/a9871d7d005fc7a99fac619375b0e05e75a3add776264ee97aefceb3d9f11246.png ../../_images/55b8df490e9e95dd997d3d8f5238b332ab39c766f22891007e7d8d8d47a5a283.png ../../_images/60336da638a628fb6579acafe2ed9bea3d98cf79c8d48fc610a4327958013b0c.png ../../_images/29a1be20bde23ceb548ee2c212fd71d9feb04ca7c85004cd6a9c164b8c6647da.png ../../_images/2aef33432cc7bb8cdb6e5f365bf764ddf316f39905a2bd96b6956f58eba453ed.png ../../_images/78816d608c3134f9d4e206606aff874c07b49d055b939f23388bb96be07f48b7.png ../../_images/49f1506d4642d19f6cb35b0b46cf8b655029751b3ebc06bffad1bd200e74b266.png ../../_images/66c0ca3d31747fc5c60c26636059f3b08ff3ce10387b98343b433a961d0c8f5c.png ../../_images/aee29c22ca820c0ac2101f2b7781f9599c924fb66c99c877fb6b7f420ffc0510.png ../../_images/ddcf7d869d7732c4b218aebb5505b834b084b68c6ade7fdb5aa67ec6d9ee4a85.png ../../_images/bc8230f2b81aa96ea0763939f81a3f83c4afb27694067e5c05b1f07c28f08dae.png

Saving the data:

with open('../../data/pickle/series_dict.pkl','wb') as handle:
    pickle.dump(series_dict,handle)

with open('../../data/pickle/ens_dict.pkl','wb') as handle:
    pickle.dump(ens_dict,handle)

Plotting each processed record and its ensemble for QA/QC:

for label,series in processed_series_dict.items():
    ens = processed_ens_dict[label]
    fig,ax = ens.common_time().plot_envelope()
    series.plot(ax=ax)
../../_images/6bd373d34bc235631b82888d7ffe44296b3abd0fe69537474f5dfaa539b38040.png ../../_images/85f22246d0108b6c373f76ea650e8627a1fc72f41bd28e06870ea33dc324d00d.png ../../_images/372f17de3a021cd2fa4cd2f9e45167a6745de63c595a79b4d6d0febba26d77f5.png ../../_images/1c739265542b22d8dfaca140bc12f8452e85a58a6e1168975858574c8d2ce6f8.png ../../_images/96e3e595e57fe3c841a490e32d69fc159a072dcce74697082fce8dc87bbe31f6.png ../../_images/4596d9f55cccd990221a08ee0682ba83de7e36209549e3af5601e25ecfeb5519.png ../../_images/92311d5029912b43c47fb3f90d2725f1269424138ddbf27c2c2ef545cd7337ca.png ../../_images/f837b84cb26653d76a610581fc306f6daa28cbb55434336b45cbb356cc871f3c.png ../../_images/49f31cd4abd7862bae689f81465b16720e2ccd2c44c5308266c2a73ce67a34c0.png ../../_images/d5cd0379deff2f675a9e1aaf569cdbb2eed187128e374e781d0caf875e255af5.png ../../_images/c15664c401445ce632c597375cb73e50154cf9ab20550b6a567159df6ca10fbb.png ../../_images/5e4ba8cc4c1d234bfa1633a5e7ca1421c2b51d8a725468d74cd39b730a642daf.png ../../_images/736485733618ca000061078105c9be21b7288d76dfa1b69164757bd871578d48.png ../../_images/ce2520a0f5b7a218a5337264e66e5087136f65ddcb6b40b7f703833a50c5e4e2.png

Saving the processed records and their ensembles:

with open('../../data/pickle/preprocessed_series_dict.pkl','wb') as handle:
    pickle.dump(processed_series_dict,handle)

with open('../../data/pickle/preprocessed_ens_dict.pkl','wb') as handle:
    pickle.dump(processed_ens_dict,handle)