eegdash 0.2.0__py3-none-any.whl → 0.2.1.dev178237806__py3-none-any.whl
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.
Potentially problematic release.
This version of eegdash might be problematic. Click here for more details.
- eegdash/__init__.py +1 -1
- eegdash/api.py +86 -59
- eegdash/dataset.py +26 -17
- eegdash/mongodb.py +66 -0
- eegdash/utils.py +9 -9
- {eegdash-0.2.0.dist-info → eegdash-0.2.1.dev178237806.dist-info}/METADATA +3 -6
- {eegdash-0.2.0.dist-info → eegdash-0.2.1.dev178237806.dist-info}/RECORD +10 -9
- {eegdash-0.2.0.dist-info → eegdash-0.2.1.dev178237806.dist-info}/WHEEL +0 -0
- {eegdash-0.2.0.dist-info → eegdash-0.2.1.dev178237806.dist-info}/licenses/LICENSE +0 -0
- {eegdash-0.2.0.dist-info → eegdash-0.2.1.dev178237806.dist-info}/top_level.txt +0 -0
eegdash/__init__.py
CHANGED
eegdash/api.py
CHANGED
|
@@ -9,13 +9,14 @@ import numpy as np
|
|
|
9
9
|
import xarray as xr
|
|
10
10
|
from dotenv import load_dotenv
|
|
11
11
|
from joblib import Parallel, delayed
|
|
12
|
-
from pymongo import InsertOne,
|
|
12
|
+
from pymongo import InsertOne, UpdateOne
|
|
13
13
|
from s3fs import S3FileSystem
|
|
14
14
|
|
|
15
15
|
from braindecode.datasets import BaseConcatDataset
|
|
16
16
|
|
|
17
17
|
from .data_config import config as data_config
|
|
18
18
|
from .data_utils import EEGBIDSDataset, EEGDashBaseDataset
|
|
19
|
+
from .mongodb import MongoConnectionManager
|
|
19
20
|
|
|
20
21
|
logger = logging.getLogger("eegdash")
|
|
21
22
|
|
|
@@ -55,6 +56,7 @@ class EEGDash:
|
|
|
55
56
|
"""
|
|
56
57
|
self.config = data_config
|
|
57
58
|
self.is_public = is_public
|
|
59
|
+
self.is_staging = is_staging
|
|
58
60
|
|
|
59
61
|
if self.is_public:
|
|
60
62
|
DB_CONNECTION_STRING = mne.utils.get_config("EEGDASH_DB_URI")
|
|
@@ -62,31 +64,15 @@ class EEGDash:
|
|
|
62
64
|
load_dotenv()
|
|
63
65
|
DB_CONNECTION_STRING = os.getenv("DB_CONNECTION_STRING")
|
|
64
66
|
|
|
65
|
-
|
|
66
|
-
self.__db = (
|
|
67
|
-
|
|
68
|
-
if not is_staging
|
|
69
|
-
else self.__client["eegdashstaging"]
|
|
67
|
+
# Use singleton to get MongoDB client, database, and collection
|
|
68
|
+
self.__client, self.__db, self.__collection = MongoConnectionManager.get_client(
|
|
69
|
+
DB_CONNECTION_STRING, is_staging
|
|
70
70
|
)
|
|
71
|
-
self.__collection = self.__db["records"]
|
|
72
71
|
|
|
73
72
|
self.filesystem = S3FileSystem(
|
|
74
73
|
anon=True, client_kwargs={"region_name": "us-east-2"}
|
|
75
74
|
)
|
|
76
75
|
|
|
77
|
-
# MongoDB Operations
|
|
78
|
-
# These methods provide a high-level interface to interact with the MongoDB
|
|
79
|
-
# collection, allowing users to find, add, and update EEG data records.
|
|
80
|
-
# - find:
|
|
81
|
-
# - exist:
|
|
82
|
-
# - add_request:
|
|
83
|
-
# - add:
|
|
84
|
-
# - update_request:
|
|
85
|
-
# - remove_field:
|
|
86
|
-
# - remove_field_from_db:
|
|
87
|
-
# - close: Close the MongoDB connection.
|
|
88
|
-
# - __del__: Destructor to close the MongoDB connection.
|
|
89
|
-
|
|
90
76
|
def find(self, query: dict[str, Any], *args, **kwargs) -> list[Mapping[str, Any]]:
|
|
91
77
|
"""Find records in the MongoDB collection that satisfy the given query.
|
|
92
78
|
|
|
@@ -117,26 +103,48 @@ class EEGDash:
|
|
|
117
103
|
return [result for result in results]
|
|
118
104
|
|
|
119
105
|
def exist(self, query: dict[str, Any]) -> bool:
|
|
120
|
-
"""
|
|
106
|
+
"""Return True if at least one record matches the query, else False.
|
|
121
107
|
|
|
122
|
-
|
|
108
|
+
This is a lightweight existence check that uses MongoDB's ``find_one``
|
|
109
|
+
instead of fetching all matching documents (which would be wasteful in
|
|
110
|
+
both time and memory for broad queries). Only a restricted set of
|
|
111
|
+
fields is accepted to avoid accidental full scans caused by malformed
|
|
112
|
+
or unsupported keys.
|
|
123
113
|
|
|
124
114
|
Parameters
|
|
125
115
|
----------
|
|
126
|
-
query: dict
|
|
127
|
-
|
|
128
|
-
|
|
116
|
+
query : dict
|
|
117
|
+
Mapping of allowed field(s) to value(s). Allowed keys: ``data_name``
|
|
118
|
+
and ``dataset``. The query must not be empty.
|
|
129
119
|
|
|
130
120
|
Returns
|
|
131
121
|
-------
|
|
132
|
-
bool
|
|
133
|
-
True if at least one record
|
|
122
|
+
bool
|
|
123
|
+
True if at least one matching record exists; False otherwise.
|
|
124
|
+
|
|
125
|
+
Raises
|
|
126
|
+
------
|
|
127
|
+
TypeError
|
|
128
|
+
If ``query`` is not a dict.
|
|
129
|
+
ValueError
|
|
130
|
+
If ``query`` is empty or contains unsupported field names.
|
|
134
131
|
|
|
135
132
|
"""
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
133
|
+
if not isinstance(query, dict):
|
|
134
|
+
raise TypeError("query must be a dict")
|
|
135
|
+
if not query:
|
|
136
|
+
raise ValueError("query cannot be empty")
|
|
137
|
+
|
|
138
|
+
accepted_query_fields = {"data_name", "dataset"}
|
|
139
|
+
unknown = set(query.keys()) - accepted_query_fields
|
|
140
|
+
if unknown:
|
|
141
|
+
raise ValueError(
|
|
142
|
+
f"Unsupported query field(s): {', '.join(sorted(unknown))}. "
|
|
143
|
+
f"Allowed: {sorted(accepted_query_fields)}"
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
doc = self.__collection.find_one(query, projection={"_id": 1})
|
|
147
|
+
return doc is not None
|
|
140
148
|
|
|
141
149
|
def _validate_input(self, record: dict[str, Any]) -> dict[str, Any]:
|
|
142
150
|
"""Internal method to validate the input record against the expected schema.
|
|
@@ -491,13 +499,24 @@ class EEGDash:
|
|
|
491
499
|
return self.__collection
|
|
492
500
|
|
|
493
501
|
def close(self):
|
|
494
|
-
"""Close the MongoDB client connection.
|
|
495
|
-
|
|
496
|
-
|
|
502
|
+
"""Close the MongoDB client connection.
|
|
503
|
+
|
|
504
|
+
Note: Since MongoDB clients are now managed by a singleton,
|
|
505
|
+
this method no longer closes connections. Use close_all_connections()
|
|
506
|
+
class method to close all connections if needed.
|
|
507
|
+
"""
|
|
508
|
+
# Individual instances no longer close the shared client
|
|
509
|
+
pass
|
|
510
|
+
|
|
511
|
+
@classmethod
|
|
512
|
+
def close_all_connections(cls):
|
|
513
|
+
"""Close all MongoDB client connections managed by the singleton."""
|
|
514
|
+
MongoConnectionManager.close_all()
|
|
497
515
|
|
|
498
516
|
def __del__(self):
|
|
499
517
|
"""Ensure connection is closed when object is deleted."""
|
|
500
|
-
|
|
518
|
+
# No longer needed since we're using singleton pattern
|
|
519
|
+
pass
|
|
501
520
|
|
|
502
521
|
|
|
503
522
|
class EEGDashDataset(BaseConcatDataset):
|
|
@@ -651,28 +670,6 @@ class EEGDashDataset(BaseConcatDataset):
|
|
|
651
670
|
and included in the returned dataset description(s).
|
|
652
671
|
|
|
653
672
|
"""
|
|
654
|
-
|
|
655
|
-
def get_base_dataset_from_bids_file(
|
|
656
|
-
bids_dataset: EEGBIDSDataset,
|
|
657
|
-
bids_file: str,
|
|
658
|
-
eeg_dash_instance: EEGDash,
|
|
659
|
-
s3_bucket: str | None,
|
|
660
|
-
) -> EEGDashBaseDataset:
|
|
661
|
-
"""Instantiate a single EEGDashBaseDataset given a local BIDS file. Note
|
|
662
|
-
this does not actually load the data from disk, but will access the metadata.
|
|
663
|
-
"""
|
|
664
|
-
record = eeg_dash_instance.load_eeg_attrs_from_bids_file(
|
|
665
|
-
bids_dataset, bids_file
|
|
666
|
-
)
|
|
667
|
-
description = {}
|
|
668
|
-
for field in description_fields:
|
|
669
|
-
value = self.find_key_in_nested_dict(record, field)
|
|
670
|
-
if value is not None:
|
|
671
|
-
description[field] = value
|
|
672
|
-
return EEGDashBaseDataset(
|
|
673
|
-
record, self.cache_dir, s3_bucket, description=description, **kwargs
|
|
674
|
-
)
|
|
675
|
-
|
|
676
673
|
bids_dataset = EEGBIDSDataset(
|
|
677
674
|
data_dir=data_dir,
|
|
678
675
|
dataset=dataset,
|
|
@@ -680,11 +677,41 @@ class EEGDashDataset(BaseConcatDataset):
|
|
|
680
677
|
eeg_dash_instance = EEGDash()
|
|
681
678
|
try:
|
|
682
679
|
datasets = Parallel(n_jobs=-1, prefer="threads", verbose=1)(
|
|
683
|
-
delayed(get_base_dataset_from_bids_file)(
|
|
684
|
-
bids_dataset,
|
|
680
|
+
delayed(self.get_base_dataset_from_bids_file)(
|
|
681
|
+
bids_dataset=bids_dataset,
|
|
682
|
+
bids_file=bids_file,
|
|
683
|
+
eeg_dash_instance=eeg_dash_instance,
|
|
684
|
+
s3_bucket=s3_bucket,
|
|
685
|
+
description_fields=description_fields,
|
|
685
686
|
)
|
|
686
687
|
for bids_file in bids_dataset.get_files()
|
|
687
688
|
)
|
|
688
689
|
return datasets
|
|
689
690
|
finally:
|
|
690
691
|
eeg_dash_instance.close()
|
|
692
|
+
|
|
693
|
+
def get_base_dataset_from_bids_file(
|
|
694
|
+
self,
|
|
695
|
+
bids_dataset: EEGBIDSDataset,
|
|
696
|
+
bids_file: str,
|
|
697
|
+
eeg_dash_instance: EEGDash,
|
|
698
|
+
s3_bucket: str | None,
|
|
699
|
+
description_fields: list[str],
|
|
700
|
+
) -> EEGDashBaseDataset:
|
|
701
|
+
"""Instantiate a single EEGDashBaseDataset given a local BIDS file. Note
|
|
702
|
+
this does not actually load the data from disk, but will access the metadata.
|
|
703
|
+
"""
|
|
704
|
+
record = eeg_dash_instance.load_eeg_attrs_from_bids_file(
|
|
705
|
+
bids_dataset, bids_file
|
|
706
|
+
)
|
|
707
|
+
description = {}
|
|
708
|
+
for field in description_fields:
|
|
709
|
+
value = self.find_key_in_nested_dict(record, field)
|
|
710
|
+
if value is not None:
|
|
711
|
+
description[field] = value
|
|
712
|
+
return EEGDashBaseDataset(
|
|
713
|
+
record,
|
|
714
|
+
self.cache_dir,
|
|
715
|
+
s3_bucket,
|
|
716
|
+
description=description,
|
|
717
|
+
)
|
eegdash/dataset.py
CHANGED
|
@@ -5,8 +5,9 @@ class EEGChallengeDataset(EEGDashDataset):
|
|
|
5
5
|
def __init__(
|
|
6
6
|
self,
|
|
7
7
|
release: str = "R5",
|
|
8
|
+
query: dict | None = None,
|
|
8
9
|
cache_dir: str = ".eegdash_cache",
|
|
9
|
-
s3_bucket: str | None = "s3://nmdatasets/NeurIPS25/
|
|
10
|
+
s3_bucket: str | None = "s3://nmdatasets/NeurIPS25/",
|
|
10
11
|
**kwargs,
|
|
11
12
|
):
|
|
12
13
|
"""Create a new EEGDashDataset from a given query or local BIDS dataset directory
|
|
@@ -15,27 +16,19 @@ class EEGChallengeDataset(EEGDashDataset):
|
|
|
15
16
|
|
|
16
17
|
Parameters
|
|
17
18
|
----------
|
|
19
|
+
release: str
|
|
20
|
+
Release name. Can be one of ["R1", ..., "R11"]
|
|
18
21
|
query : dict | None
|
|
19
|
-
Optionally a dictionary that specifies
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
Optionally a string or a list of strings specifying one or more local
|
|
23
|
-
BIDS dataset directories from which to load the EEG data files. Exactly one
|
|
24
|
-
of query or data_dir must be provided.
|
|
25
|
-
dataset : str | list[str] | None
|
|
26
|
-
If data_dir is given, a name or list of names for for the dataset(s) to be loaded.
|
|
27
|
-
description_fields : list[str]
|
|
28
|
-
A list of fields to be extracted from the dataset records
|
|
29
|
-
and included in the returned data description(s). Examples are typical
|
|
30
|
-
subject metadata fields such as "subject", "session", "run", "task", etc.;
|
|
31
|
-
see also data_config.description_fields for the default set of fields.
|
|
22
|
+
Optionally a dictionary that specifies a query to be executed,
|
|
23
|
+
in addition to the dataset (automatically inferred from the release argument).
|
|
24
|
+
See EEGDash.find() for details on the query format.
|
|
32
25
|
cache_dir : str
|
|
33
26
|
A directory where the dataset will be cached locally.
|
|
34
27
|
s3_bucket : str | None
|
|
35
28
|
An optional S3 bucket URI to use instead of the
|
|
36
29
|
default OpenNeuro bucket for loading data files.
|
|
37
30
|
kwargs : dict
|
|
38
|
-
Additional keyword arguments to be passed to the
|
|
31
|
+
Additional keyword arguments to be passed to the EEGDashDataset
|
|
39
32
|
constructor.
|
|
40
33
|
|
|
41
34
|
"""
|
|
@@ -52,9 +45,25 @@ class EEGChallengeDataset(EEGDashDataset):
|
|
|
52
45
|
"R2": "ds005506",
|
|
53
46
|
"R1": "ds005505",
|
|
54
47
|
}
|
|
48
|
+
|
|
49
|
+
self.release = release
|
|
50
|
+
if release not in dsnumber_release_map:
|
|
51
|
+
raise ValueError(f"Unknown release: {release}")
|
|
52
|
+
|
|
53
|
+
dataset = dsnumber_release_map[release]
|
|
54
|
+
if query is None:
|
|
55
|
+
query = {"dataset": dataset}
|
|
56
|
+
elif "dataset" not in query:
|
|
57
|
+
query["dataset"] = dataset
|
|
58
|
+
elif query["dataset"] != dataset:
|
|
59
|
+
raise ValueError(
|
|
60
|
+
f"Query dataset {query['dataset']} does not match the release {release} "
|
|
61
|
+
f"which corresponds to dataset {dataset}."
|
|
62
|
+
)
|
|
63
|
+
|
|
55
64
|
super().__init__(
|
|
56
|
-
query=
|
|
65
|
+
query=query,
|
|
57
66
|
cache_dir=cache_dir,
|
|
58
|
-
s3_bucket=s3_bucket,
|
|
67
|
+
s3_bucket=f"{s3_bucket}/{release}_L100",
|
|
59
68
|
**kwargs,
|
|
60
69
|
)
|
eegdash/mongodb.py
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import threading
|
|
2
|
+
|
|
3
|
+
from pymongo import MongoClient
|
|
4
|
+
|
|
5
|
+
# MongoDB Operations
|
|
6
|
+
# These methods provide a high-level interface to interact with the MongoDB
|
|
7
|
+
# collection, allowing users to find, add, and update EEG data records.
|
|
8
|
+
# - find:
|
|
9
|
+
# - exist:
|
|
10
|
+
# - add_request:
|
|
11
|
+
# - add:
|
|
12
|
+
# - update_request:
|
|
13
|
+
# - remove_field:
|
|
14
|
+
# - remove_field_from_db:
|
|
15
|
+
# - close: Close the MongoDB connection.
|
|
16
|
+
# - __del__: Destructor to close the MongoDB connection.
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class MongoConnectionManager:
|
|
20
|
+
"""Singleton class to manage MongoDB client connections."""
|
|
21
|
+
|
|
22
|
+
_instances = {}
|
|
23
|
+
_lock = threading.Lock()
|
|
24
|
+
|
|
25
|
+
@classmethod
|
|
26
|
+
def get_client(cls, connection_string: str, is_staging: bool = False):
|
|
27
|
+
"""Get or create a MongoDB client for the given connection string and staging flag.
|
|
28
|
+
|
|
29
|
+
Parameters
|
|
30
|
+
----------
|
|
31
|
+
connection_string : str
|
|
32
|
+
The MongoDB connection string
|
|
33
|
+
is_staging : bool
|
|
34
|
+
Whether to use staging database
|
|
35
|
+
|
|
36
|
+
Returns
|
|
37
|
+
-------
|
|
38
|
+
tuple
|
|
39
|
+
A tuple of (client, database, collection)
|
|
40
|
+
|
|
41
|
+
"""
|
|
42
|
+
# Create a unique key based on connection string and staging flag
|
|
43
|
+
key = (connection_string, is_staging)
|
|
44
|
+
|
|
45
|
+
if key not in cls._instances:
|
|
46
|
+
with cls._lock:
|
|
47
|
+
# Double-check pattern to avoid race conditions
|
|
48
|
+
if key not in cls._instances:
|
|
49
|
+
client = MongoClient(connection_string)
|
|
50
|
+
db_name = "eegdashstaging" if is_staging else "eegdash"
|
|
51
|
+
db = client[db_name]
|
|
52
|
+
collection = db["records"]
|
|
53
|
+
cls._instances[key] = (client, db, collection)
|
|
54
|
+
|
|
55
|
+
return cls._instances[key]
|
|
56
|
+
|
|
57
|
+
@classmethod
|
|
58
|
+
def close_all(cls):
|
|
59
|
+
"""Close all MongoDB client connections."""
|
|
60
|
+
with cls._lock:
|
|
61
|
+
for client, _, _ in cls._instances.values():
|
|
62
|
+
try:
|
|
63
|
+
client.close()
|
|
64
|
+
except Exception:
|
|
65
|
+
pass
|
|
66
|
+
cls._instances.clear()
|
eegdash/utils.py
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
from mne.utils import get_config, set_config
|
|
1
|
+
from mne.utils import get_config, set_config, use_log_level
|
|
3
2
|
|
|
4
|
-
if get_config("EEGDASH_DB_URI") is None:
|
|
5
|
-
# Set the default MongoDB URI for EEGDash
|
|
6
|
-
# This is a placeholder and should be replaced with your actual MongoDB URI
|
|
7
3
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
4
|
+
def __init__mongo_client():
|
|
5
|
+
with use_log_level("ERROR"):
|
|
6
|
+
if get_config("EEGDASH_DB_URI") is None:
|
|
7
|
+
set_config(
|
|
8
|
+
"EEGDASH_DB_URI",
|
|
9
|
+
"mongodb+srv://eegdash-user:mdzoMjQcHWTVnKDq@cluster0.vz35p.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0",
|
|
10
|
+
set_env=True,
|
|
11
|
+
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: eegdash
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.1.dev178237806
|
|
4
4
|
Summary: EEG data for machine learning
|
|
5
5
|
Author-email: Young Truong <dt.young112@gmail.com>, Arnaud Delorme <adelorme@gmail.com>, Bruno Aristimunha <b.aristimunha@gmail.com>
|
|
6
6
|
License: GNU General Public License
|
|
@@ -43,7 +43,7 @@ Classifier: Programming Language :: Python :: 3
|
|
|
43
43
|
Classifier: Programming Language :: Python :: 3.10
|
|
44
44
|
Classifier: Programming Language :: Python :: 3.11
|
|
45
45
|
Classifier: Programming Language :: Python :: 3.12
|
|
46
|
-
Requires-Python:
|
|
46
|
+
Requires-Python: >=3.10
|
|
47
47
|
Description-Content-Type: text/markdown
|
|
48
48
|
License-File: LICENSE
|
|
49
49
|
Requires-Dist: braindecode>=1.0
|
|
@@ -63,6 +63,7 @@ Requires-Dist: pytest; extra == "tests"
|
|
|
63
63
|
Requires-Dist: pytest-cov; extra == "tests"
|
|
64
64
|
Requires-Dist: codecov; extra == "tests"
|
|
65
65
|
Requires-Dist: pytest_cases; extra == "tests"
|
|
66
|
+
Requires-Dist: pytest-benchmark; extra == "tests"
|
|
66
67
|
Provides-Extra: dev
|
|
67
68
|
Requires-Dist: pre-commit; extra == "dev"
|
|
68
69
|
Provides-Extra: docs
|
|
@@ -164,7 +165,3 @@ EEG-DaSh is a collaborative initiative between the United States and Israel, sup
|
|
|
164
165
|
|
|
165
166
|
|
|
166
167
|
|
|
167
|
-
python3 -m pip install --upgrade build
|
|
168
|
-
python3 -m build
|
|
169
|
-
python3 -m pip install --upgrade twine
|
|
170
|
-
python3 -m twine upload --repository eegdash dist/*
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
eegdash/__init__.py,sha256=
|
|
2
|
-
eegdash/api.py,sha256=
|
|
1
|
+
eegdash/__init__.py,sha256=5WP-O-5EjRXkQ2BZAn_KKMPeMyWezCmWf5sYLb-dihE,245
|
|
2
|
+
eegdash/api.py,sha256=IQ0c26g7TnqzXv6lqlvMB9EHlobiTrK0YpiDa7ShcrE,26786
|
|
3
3
|
eegdash/data_config.py,sha256=OS6ERO-jHrnEOfMJUehY7ieABdsRw_qWzOKJ4pzSfqw,1323
|
|
4
4
|
eegdash/data_utils.py,sha256=mR0TtERYIefakGQ98jwAeeRVKSNDU9eBlUoH1AY9tnc,23663
|
|
5
|
-
eegdash/dataset.py,sha256=
|
|
5
|
+
eegdash/dataset.py,sha256=NK5CVGtHvGNlhdbZPaRUWtyLBDxUlyiSz-ot3BrxHQE,2443
|
|
6
|
+
eegdash/mongodb.py,sha256=GD3WgA253oFgpzOHrYaj4P1mRjNtDMT5Oj4kVvHswjI,2006
|
|
6
7
|
eegdash/preprocessing.py,sha256=wvqAO8UgDoQQz7xjVykrl4V8AawS4tpKR4Vrr_9BovY,2230
|
|
7
|
-
eegdash/utils.py,sha256=
|
|
8
|
+
eegdash/utils.py,sha256=wU9CBQZLW_LIQIBwhgQm5bU4X-rSsVNPdeF2iE4QGJ4,410
|
|
8
9
|
eegdash/features/__init__.py,sha256=484CLxpPifc8ZQfeM8jWZLvtVKljCxn3qqlUCaq-Yxk,1284
|
|
9
10
|
eegdash/features/datasets.py,sha256=kU1DO70ArSIy-LF1hHD2NN4iT-kJrI0mVpSkyV_OSeI,18301
|
|
10
11
|
eegdash/features/decorators.py,sha256=v0qaJz_dcX703p1fvFYbAIXmwK3d8naYGlq7fRVKn_w,1313
|
|
@@ -20,8 +21,8 @@ eegdash/features/feature_bank/dimensionality.py,sha256=j_Ds71Y1AbV2uLFQj8EuXQ4kz
|
|
|
20
21
|
eegdash/features/feature_bank/signal.py,sha256=3Tb8z9gX7iZipxQJ9DSyy30JfdmW58kgvimSyZX74p8,3404
|
|
21
22
|
eegdash/features/feature_bank/spectral.py,sha256=bNB7skusePs1gX7NOU6yRlw_Gr4UOCkO_ylkCgybzug,3319
|
|
22
23
|
eegdash/features/feature_bank/utils.py,sha256=DGh-Q7-XFIittP7iBBxvsJaZrlVvuY5mw-G7q6C-PCI,1237
|
|
23
|
-
eegdash-0.2.
|
|
24
|
-
eegdash-0.2.
|
|
25
|
-
eegdash-0.2.
|
|
26
|
-
eegdash-0.2.
|
|
27
|
-
eegdash-0.2.
|
|
24
|
+
eegdash-0.2.1.dev178237806.dist-info/licenses/LICENSE,sha256=KykUD4H3kw3HLz5bZ0kxMWwZotnk8rhkfCCerGyX2sk,855
|
|
25
|
+
eegdash-0.2.1.dev178237806.dist-info/METADATA,sha256=dn351VNZC1rthL5pYZejIE9ouYek-mp6ZbatrBlKm1k,10137
|
|
26
|
+
eegdash-0.2.1.dev178237806.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
27
|
+
eegdash-0.2.1.dev178237806.dist-info/top_level.txt,sha256=zavO69HQ6MyZM0aQMR2zUS6TAFc7bnN5GEpDpOpFZzU,8
|
|
28
|
+
eegdash-0.2.1.dev178237806.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|