deepsensor 0.2.0__tar.gz → 0.2.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. {deepsensor-0.2.0 → deepsensor-0.2.1}/PKG-INFO +2 -2
  2. {deepsensor-0.2.0 → deepsensor-0.2.1}/README.md +1 -1
  3. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/data/loader.py +8 -2
  4. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/data/processor.py +4 -1
  5. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/model/convnp.py +3 -3
  6. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor.egg-info/PKG-INFO +2 -2
  7. {deepsensor-0.2.0 → deepsensor-0.2.1}/setup.cfg +1 -1
  8. {deepsensor-0.2.0 → deepsensor-0.2.1}/tests/test_model.py +53 -2
  9. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/__init__.py +0 -0
  10. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/active_learning/__init__.py +0 -0
  11. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/active_learning/acquisition_fns.py +0 -0
  12. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/active_learning/algorithms.py +0 -0
  13. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/config.py +0 -0
  14. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/data/__init__.py +0 -0
  15. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/data/task.py +0 -0
  16. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/data/utils.py +0 -0
  17. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/errors.py +0 -0
  18. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/model/__init__.py +0 -0
  19. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/model/defaults.py +0 -0
  20. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/model/model.py +0 -0
  21. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/model/nps.py +0 -0
  22. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/plot.py +0 -0
  23. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/py.typed +0 -0
  24. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/tensorflow/__init__.py +0 -0
  25. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/torch/__init__.py +0 -0
  26. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/train/__init__.py +0 -0
  27. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/train/train.py +0 -0
  28. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor.egg-info/SOURCES.txt +0 -0
  29. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor.egg-info/dependency_links.txt +0 -0
  30. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor.egg-info/not-zip-safe +0 -0
  31. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor.egg-info/requires.txt +0 -0
  32. {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor.egg-info/top_level.txt +0 -0
  33. {deepsensor-0.2.0 → deepsensor-0.2.1}/pyproject.toml +0 -0
  34. {deepsensor-0.2.0 → deepsensor-0.2.1}/setup.py +0 -0
  35. {deepsensor-0.2.0 → deepsensor-0.2.1}/tests/__init__.py +0 -0
  36. {deepsensor-0.2.0 → deepsensor-0.2.1}/tests/test_active_learning.py +0 -0
  37. {deepsensor-0.2.0 → deepsensor-0.2.1}/tests/test_data_processor.py +0 -0
  38. {deepsensor-0.2.0 → deepsensor-0.2.1}/tests/test_plotting.py +0 -0
  39. {deepsensor-0.2.0 → deepsensor-0.2.1}/tests/test_task_loader.py +0 -0
  40. {deepsensor-0.2.0 → deepsensor-0.2.1}/tests/test_training.py +0 -0
  41. {deepsensor-0.2.0 → deepsensor-0.2.1}/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: deepsensor
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: A Python package for modelling xarray and pandas data with neural processes.
5
5
  Home-page: https://github.com/tom-andersson/deepsensor
6
6
  Author: Tom R. Andersson
@@ -41,7 +41,7 @@ data with neural processes</p>
41
41
 
42
42
  -----------
43
43
 
44
- [![release](https://img.shields.io/badge/release-v0.2.0-green?logo=github)](https://github.com/tom-andersson/deepsensor/releases)
44
+ [![release](https://img.shields.io/badge/release-v0.2.1-green?logo=github)](https://github.com/tom-andersson/deepsensor/releases)
45
45
  ![Tests](https://github.com/tom-andersson/deepsensor/actions/workflows/tests.yml/badge.svg)
46
46
  [![Coverage Status](https://coveralls.io/repos/github/tom-andersson/deepsensor/badge.svg?branch=main)](https://coveralls.io/github/tom-andersson/deepsensor?branch=main)
47
47
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
@@ -11,7 +11,7 @@ data with neural processes</p>
11
11
 
12
12
  -----------
13
13
 
14
- [![release](https://img.shields.io/badge/release-v0.2.0-green?logo=github)](https://github.com/tom-andersson/deepsensor/releases)
14
+ [![release](https://img.shields.io/badge/release-v0.2.1-green?logo=github)](https://github.com/tom-andersson/deepsensor/releases)
15
15
  ![Tests](https://github.com/tom-andersson/deepsensor/actions/workflows/tests.yml/badge.svg)
16
16
  [![Coverage Status](https://coveralls.io/repos/github/tom-andersson/deepsensor/badge.svg?branch=main)](https://coveralls.io/github/tom-andersson/deepsensor?branch=main)
17
17
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
@@ -227,7 +227,13 @@ class TaskLoader:
227
227
  elif path.endswith(".nc"):
228
228
  return xr.open_dataset(path)
229
229
  elif path.endswith(".csv"):
230
- return pd.read_csv(path).set_index(["time", "x1", "x2"])
230
+ df = pd.read_csv(path)
231
+ if "time" in df.columns:
232
+ df["time"] = pd.to_datetime(df["time"])
233
+ df = df.set_index(["time", "x1", "x2"]).sort_index()
234
+ else:
235
+ df = df.set_index(["x1", "x2"]).sort_index()
236
+ return df
231
237
  else:
232
238
  raise ValueError(f"Unknown file extension for {path}")
233
239
 
@@ -253,7 +259,7 @@ class TaskLoader:
253
259
  os.makedirs(folder, exist_ok=True)
254
260
  fpath = os.path.join(folder, self.config_fname)
255
261
  with open(fpath, "w") as f:
256
- json.dump(self.config, f)
262
+ json.dump(self.config, f, indent=4, sort_keys=False)
257
263
 
258
264
  def _cast_to_dtype(
259
265
  self,
@@ -53,6 +53,9 @@ class DataProcessor:
53
53
  )
54
54
  with open(fpath, "r") as f:
55
55
  self.config = json.load(f)
56
+
57
+ self.x1_none = self.config["coords"]["x1"]["map"] is None
58
+ self.x2_none = self.config["coords"]["x2"]["map"] is None
56
59
  else:
57
60
  self.config = {}
58
61
 
@@ -84,7 +87,7 @@ class DataProcessor:
84
87
  os.makedirs(folder, exist_ok=True)
85
88
  fpath = os.path.join(folder, self.config_fname)
86
89
  with open(fpath, "w") as f:
87
- json.dump(self.config, f)
90
+ json.dump(self.config, f, indent=4, sort_keys=False)
88
91
 
89
92
  def _validate_coord_mappings(self, x1_map, x2_map):
90
93
  """Ensure the maps are valid and of appropriate types."""
@@ -208,13 +208,13 @@ class ConvNP(DeepSensorModel):
208
208
 
209
209
  torch.save(self.model.state_dict(), os.path.join(model_ID, "model.pt"))
210
210
  elif backend.str == "tf":
211
- self.model.save_weights(os.path.join(model_ID, "model.h5"))
211
+ self.model.save_weights(os.path.join(model_ID, "model"))
212
212
  else:
213
213
  raise NotImplementedError(f"Backend {backend.str} not supported.")
214
214
 
215
215
  config_fpath = os.path.join(model_ID, "model_config.json")
216
216
  with open(config_fpath, "w") as f:
217
- json.dump(self.config, f)
217
+ json.dump(self.config, f, indent=4, sort_keys=False)
218
218
 
219
219
  def load(self, model_ID: str):
220
220
  """Load a model from a folder containing model weights and config."""
@@ -229,7 +229,7 @@ class ConvNP(DeepSensorModel):
229
229
 
230
230
  self.model.load_state_dict(torch.load(os.path.join(model_ID, "model.pt")))
231
231
  elif backend.str == "tf":
232
- self.model.load_weights(os.path.join(model_ID, "model.h5"))
232
+ self.model.load_weights(os.path.join(model_ID, "model"))
233
233
  else:
234
234
  raise NotImplementedError(f"Backend {backend.str} not supported.")
235
235
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: deepsensor
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: A Python package for modelling xarray and pandas data with neural processes.
5
5
  Home-page: https://github.com/tom-andersson/deepsensor
6
6
  Author: Tom R. Andersson
@@ -41,7 +41,7 @@ data with neural processes</p>
41
41
 
42
42
  -----------
43
43
 
44
- [![release](https://img.shields.io/badge/release-v0.2.0-green?logo=github)](https://github.com/tom-andersson/deepsensor/releases)
44
+ [![release](https://img.shields.io/badge/release-v0.2.1-green?logo=github)](https://github.com/tom-andersson/deepsensor/releases)
45
45
  ![Tests](https://github.com/tom-andersson/deepsensor/actions/workflows/tests.yml/badge.svg)
46
46
  [![Coverage Status](https://coveralls.io/repos/github/tom-andersson/deepsensor/badge.svg?branch=main)](https://coveralls.io/github/tom-andersson/deepsensor?branch=main)
47
47
  [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = deepsensor
3
- version = 0.2.0
3
+ version = 0.2.1
4
4
  author = Tom R. Andersson
5
5
  author_email = tomand@bas.ac.uk
6
6
  description = A Python package for modelling xarray and pandas data with neural processes.
@@ -3,7 +3,7 @@ import itertools
3
3
 
4
4
  from parameterized import parameterized
5
5
 
6
-
6
+ import os
7
7
  import xarray as xr
8
8
  import numpy as np
9
9
  import pandas as pd
@@ -11,11 +11,12 @@ import unittest
11
11
 
12
12
  import lab as B
13
13
 
14
- import deepsensor.tensorflow as deepsensor
14
+ import deepsensor.torch as deepsensor
15
15
 
16
16
  from deepsensor.data.processor import DataProcessor
17
17
  from deepsensor.data.loader import TaskLoader
18
18
  from deepsensor.model.convnp import ConvNP
19
+ from deepsensor.train.train import Trainer
19
20
 
20
21
  from tests.utils import gen_random_data_xr, gen_random_data_pandas
21
22
 
@@ -390,6 +391,56 @@ class TestModel(unittest.TestCase):
390
391
  mean_df.reset_index()["longitude"], df_raw.reset_index()["longitude"]
391
392
  )
392
393
 
394
+ def test_saving_and_loading(self):
395
+ """Test saving and loading of model"""
396
+ folder = f"tmp_{pd.Timestamp.now().strftime('%Y%m%d_%H%M%S')}"
397
+ os.makedirs(folder, exist_ok=True)
398
+
399
+ ds_raw = xr.tutorial.open_dataset("air_temperature")
400
+
401
+ data_processor = DataProcessor(x1_name="lat", x2_name="lon")
402
+ ds = data_processor(ds_raw)
403
+
404
+ t2m_fpath = f"{folder}/air_temperature_normalised.nc"
405
+ ds.to_netcdf(t2m_fpath)
406
+
407
+ task_loader = TaskLoader(context=t2m_fpath, target=t2m_fpath)
408
+
409
+ model = ConvNP(
410
+ data_processor, task_loader, unet_channels=(32,) * 3, verbose=False
411
+ )
412
+
413
+ # Train the model for a few iterations to test the trained model is restored correctly later.
414
+ task = task_loader("2014-12-31", 40, datewise_deterministic=True)
415
+ trainer = Trainer(model)
416
+ for _ in range(10):
417
+ trainer([task])
418
+ mean_ds_before, std_ds_before = model.predict(task, X_t=ds_raw)
419
+ mean_ds_before["air"].plot()
420
+
421
+ data_processor.save(folder)
422
+ task_loader.save(folder)
423
+ model.save(folder)
424
+
425
+ data_processor_loaded = DataProcessor(folder)
426
+ task_loader_loaded = TaskLoader(folder)
427
+ model_loaded = ConvNP(data_processor_loaded, task_loader_loaded, folder)
428
+
429
+ task = task_loader_loaded("2014-12-31", 40, datewise_deterministic=True)
430
+ mean_ds_loaded, std_ds_loaded = model_loaded.predict(task, X_t=ds_raw)
431
+ mean_ds_loaded["air"].plot()
432
+
433
+ xr.testing.assert_allclose(mean_ds_before, mean_ds_loaded)
434
+ print("Means match")
435
+
436
+ xr.testing.assert_allclose(std_ds_before, std_ds_loaded)
437
+ print("Standard deviations match")
438
+
439
+ # Delete temporary folder
440
+ import shutil
441
+
442
+ shutil.rmtree(folder)
443
+
393
444
 
394
445
  def assert_shape(x, shape: tuple):
395
446
  """ex: assert_shape(conv_input_array, [8, 3, None, None])"""
File without changes
File without changes
File without changes
File without changes