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.
- {deepsensor-0.2.0 → deepsensor-0.2.1}/PKG-INFO +2 -2
- {deepsensor-0.2.0 → deepsensor-0.2.1}/README.md +1 -1
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/data/loader.py +8 -2
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/data/processor.py +4 -1
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/model/convnp.py +3 -3
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor.egg-info/PKG-INFO +2 -2
- {deepsensor-0.2.0 → deepsensor-0.2.1}/setup.cfg +1 -1
- {deepsensor-0.2.0 → deepsensor-0.2.1}/tests/test_model.py +53 -2
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/__init__.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/active_learning/__init__.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/active_learning/acquisition_fns.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/active_learning/algorithms.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/config.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/data/__init__.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/data/task.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/data/utils.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/errors.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/model/__init__.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/model/defaults.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/model/model.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/model/nps.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/plot.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/py.typed +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/tensorflow/__init__.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/torch/__init__.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/train/__init__.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor/train/train.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor.egg-info/SOURCES.txt +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor.egg-info/dependency_links.txt +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor.egg-info/not-zip-safe +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor.egg-info/requires.txt +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/deepsensor.egg-info/top_level.txt +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/pyproject.toml +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/setup.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/tests/__init__.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/tests/test_active_learning.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/tests/test_data_processor.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/tests/test_plotting.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/tests/test_task_loader.py +0 -0
- {deepsensor-0.2.0 → deepsensor-0.2.1}/tests/test_training.py +0 -0
- {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.
|
|
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
|
-
[](https://github.com/tom-andersson/deepsensor/releases)
|
|
45
45
|

|
|
46
46
|
[](https://coveralls.io/github/tom-andersson/deepsensor?branch=main)
|
|
47
47
|
[](https://github.com/psf/black)
|
|
@@ -11,7 +11,7 @@ data with neural processes</p>
|
|
|
11
11
|
|
|
12
12
|
-----------
|
|
13
13
|
|
|
14
|
-
[](https://github.com/tom-andersson/deepsensor/releases)
|
|
15
15
|

|
|
16
16
|
[](https://coveralls.io/github/tom-andersson/deepsensor?branch=main)
|
|
17
17
|
[](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
|
-
|
|
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
|
|
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
|
|
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.
|
|
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
|
-
[](https://github.com/tom-andersson/deepsensor/releases)
|
|
45
45
|

|
|
46
46
|
[](https://coveralls.io/github/tom-andersson/deepsensor?branch=main)
|
|
47
47
|
[](https://github.com/psf/black)
|
|
@@ -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.
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|