eegdash 0.3.4.dev69__py3-none-any.whl → 0.3.5.dev77__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 CHANGED
@@ -7,4 +7,4 @@ __init__mongo_client()
7
7
 
8
8
  __all__ = ["EEGDash", "EEGDashDataset", "EEGChallengeDataset"]
9
9
 
10
- __version__ = "0.3.4.dev69"
10
+ __version__ = "0.3.5.dev77"
eegdash/api.py CHANGED
@@ -9,6 +9,7 @@ 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 mne_bids import get_bids_path_from_fname, read_raw_bids
12
13
  from pymongo import InsertOne, UpdateOne
13
14
  from s3fs import S3FileSystem
14
15
 
@@ -34,6 +35,19 @@ class EEGDash:
34
35
 
35
36
  """
36
37
 
38
+ _ALLOWED_QUERY_FIELDS = {
39
+ "data_name",
40
+ "dataset",
41
+ "subject",
42
+ "task",
43
+ "session",
44
+ "run",
45
+ "modality",
46
+ "sampling_frequency",
47
+ "nchans",
48
+ "ntimes",
49
+ }
50
+
37
51
  def __init__(self, *, is_public: bool = True, is_staging: bool = False) -> None:
38
52
  """Create new instance of the EEGDash Database client.
39
53
 
@@ -71,34 +85,59 @@ class EEGDash:
71
85
  anon=True, client_kwargs={"region_name": "us-east-2"}
72
86
  )
73
87
 
74
- def find(self, query: dict[str, Any], *args, **kwargs) -> list[Mapping[str, Any]]:
75
- """Find records in the MongoDB collection that satisfy the given query.
88
+ def find(
89
+ self, query: dict[str, Any] = None, /, **kwargs
90
+ ) -> list[Mapping[str, Any]]:
91
+ """Find records in the MongoDB collection.
92
+
93
+ This method can be called in two ways:
94
+ 1. With a pre-built MongoDB query dictionary (positional argument):
95
+ >>> eegdash.find({"dataset": "ds002718", "subject": {"$in": ["012", "013"]}})
96
+ 2. With user-friendly keyword arguments for simple and multi-value queries:
97
+ >>> eegdash.find(dataset="ds002718", subject="012")
98
+ >>> eegdash.find(dataset="ds002718", subject=["012", "013"])
76
99
 
77
100
  Parameters
78
101
  ----------
79
- query: dict
80
- A dictionary that specifies the query to be executed; this is a reference
81
- document that is used to match records in the MongoDB collection.
82
- args:
83
- Additional positional arguments for the MongoDB find() method; see
84
- https://pymongo.readthedocs.io/en/stable/api/pymongo/collection.html#pymongo.collection.Collection.find
85
- kwargs:
86
- Additional keyword arguments for the MongoDB find() method.
102
+ query: dict, optional
103
+ A complete MongoDB query dictionary. This is a positional-only argument.
104
+ **kwargs:
105
+ Keyword arguments representing field-value pairs for the query.
106
+ Values can be single items (str, int) or lists of items for multi-search.
87
107
 
88
108
  Returns
89
109
  -------
90
110
  list:
91
111
  A list of DB records (string-keyed dictionaries) that match the query.
92
112
 
93
- Example
94
- -------
95
- >>> eegdash = EEGDash()
96
- >>> eegdash.find({"dataset": "ds002718", "subject": "012"})
113
+ Raises
114
+ ------
115
+ ValueError
116
+ If both a `query` dictionary and keyword arguments are provided.
97
117
 
98
118
  """
99
- results = self.__collection.find(query, *args, **kwargs)
119
+ if query is not None and kwargs:
120
+ raise ValueError(
121
+ "Provide either a positional 'query' dictionary or keyword arguments, not both."
122
+ )
100
123
 
101
- return [result for result in results]
124
+ final_query = {}
125
+ if query is not None:
126
+ final_query = query
127
+ elif kwargs:
128
+ final_query = self._build_query_from_kwargs(**kwargs)
129
+ else:
130
+ # By default, an empty query {} returns all documents.
131
+ # This can be dangerous, so we can either allow it or raise an error.
132
+ # Let's require an explicit query for safety.
133
+ raise ValueError(
134
+ "find() requires a query dictionary or at least one keyword argument. "
135
+ "To find all documents, use find({})."
136
+ )
137
+
138
+ results = self.__collection.find(final_query)
139
+
140
+ return list(results)
102
141
 
103
142
  def exist(self, query: dict[str, Any]) -> bool:
104
143
  """Return True if at least one record matches the query, else False.
@@ -184,6 +223,35 @@ class EEGDash:
184
223
 
185
224
  return record
186
225
 
226
+ def _build_query_from_kwargs(self, **kwargs) -> dict[str, Any]:
227
+ """Builds and validates a MongoDB query from user-friendly keyword arguments.
228
+
229
+ Translates list values into MongoDB's `$in` operator.
230
+ """
231
+ # 1. Validate that all provided keys are allowed for querying
232
+ unknown_fields = set(kwargs.keys()) - self._ALLOWED_QUERY_FIELDS
233
+ if unknown_fields:
234
+ raise ValueError(
235
+ f"Unsupported query field(s): {', '.join(sorted(unknown_fields))}. "
236
+ f"Allowed fields are: {', '.join(sorted(self._ALLOWED_QUERY_FIELDS))}"
237
+ )
238
+
239
+ # 2. Construct the query dictionary
240
+ query = {}
241
+ for key, value in kwargs.items():
242
+ if isinstance(value, (list, tuple)):
243
+ if not value:
244
+ raise ValueError(
245
+ f"Received an empty list for query parameter '{key}'. This is not supported."
246
+ )
247
+ # If the value is a list, use the `$in` operator for multi-search
248
+ query[key] = {"$in": value}
249
+ else:
250
+ # Otherwise, it's a direct match
251
+ query[key] = value
252
+
253
+ return query
254
+
187
255
  def load_eeg_data_from_s3(self, s3path: str) -> xr.DataArray:
188
256
  """Load an EEGLAB .set file from an AWS S3 URI and return it as an xarray DataArray.
189
257
 
@@ -218,14 +286,15 @@ class EEGDash:
218
286
  Parameters
219
287
  ----------
220
288
  bids_file : str
221
- Path to the file on the local filesystem.
289
+ Path to the BIDS-compliant file on the local filesystem.
222
290
 
223
291
  Notes
224
292
  -----
225
293
  Currently, only non-epoched .set files are supported.
226
294
 
227
295
  """
228
- raw_object = mne.io.read_raw(bids_file)
296
+ bids_path = get_bids_path_from_fname(bids_file, verbose=False)
297
+ raw_object = read_raw_bids(bids_path=bids_path, verbose=False)
229
298
  eeg_data = raw_object.get_data()
230
299
 
231
300
  fs = raw_object.info["sfreq"]
@@ -521,8 +590,8 @@ class EEGDashDataset(BaseConcatDataset):
521
590
  def __init__(
522
591
  self,
523
592
  query: dict | None = None,
524
- data_dir: str | list | None = None,
525
- dataset: str | list | None = None,
593
+ cache_dir: str = "~/eegdash_cache",
594
+ dataset: str | None = None,
526
595
  description_fields: list[str] = [
527
596
  "subject",
528
597
  "session",
@@ -532,36 +601,55 @@ class EEGDashDataset(BaseConcatDataset):
532
601
  "gender",
533
602
  "sex",
534
603
  ],
535
- cache_dir: str = "~/eegdash_cache",
536
604
  s3_bucket: str | None = None,
605
+ data_dir: str | None = None,
537
606
  eeg_dash_instance=None,
607
+ records: list[dict] | None = None,
538
608
  **kwargs,
539
609
  ):
540
610
  """Create a new EEGDashDataset from a given query or local BIDS dataset directory
541
611
  and dataset name. An EEGDashDataset is pooled collection of EEGDashBaseDataset
542
612
  instances (individual recordings) and is a subclass of braindecode's BaseConcatDataset.
543
613
 
614
+
615
+ Querying Examples:
616
+ ------------------
617
+ # Find by single subject
618
+ >>> ds = EEGDashDataset(dataset="ds005505", subject="NDARCA153NKE")
619
+
620
+ # Find by a list of subjects and a specific task
621
+ >>> subjects = ["NDARCA153NKE", "NDARXT792GY8"]
622
+ >>> ds = EEGDashDataset(dataset="ds005505", subject=subjects, task="RestingState")
623
+
624
+ # Use a raw MongoDB query for advanced filtering
625
+ >>> raw_query = {"dataset": "ds005505", "subject": {"$in": subjects}}
626
+ >>> ds = EEGDashDataset(query=raw_query)
627
+
544
628
  Parameters
545
629
  ----------
546
630
  query : dict | None
547
- Optionally a dictionary that specifies the query to be executed; see
548
- EEGDash.find() for details on the query format.
549
- data_dir : str | list[str] | None
550
- Optionally a string or a list of strings specifying one or more local
551
- BIDS dataset directories from which to load the EEG data files. Exactly one
631
+ A raw MongoDB query dictionary. If provided, keyword arguments for filtering are ignored.
632
+ **kwargs : dict
633
+ Keyword arguments for filtering (e.g., `subject="X"`, `task=["T1", "T2"]`) and/or
634
+ arguments to be passed to the EEGDashBaseDataset constructor (e.g., `subject=...`).
635
+ cache_dir : str
636
+ A directory where the dataset will be cached locally.
637
+ data_dir : str | None
638
+ Optionally a string specifying a local BIDS dataset directory from which to load the EEG data files. Exactly one
552
639
  of query or data_dir must be provided.
553
- dataset : str | list[str] | None
554
- If data_dir is given, a name or list of names for for the dataset(s) to be loaded.
640
+ dataset : str | None
641
+ If data_dir is given, a name for the dataset to be loaded.
555
642
  description_fields : list[str]
556
643
  A list of fields to be extracted from the dataset records
557
644
  and included in the returned data description(s). Examples are typical
558
645
  subject metadata fields such as "subject", "session", "run", "task", etc.;
559
646
  see also data_config.description_fields for the default set of fields.
560
- cache_dir : str
561
- A directory where the dataset will be cached locally.
562
647
  s3_bucket : str | None
563
648
  An optional S3 bucket URI (e.g., "s3://mybucket") to use instead of the
564
649
  default OpenNeuro bucket for loading data files
650
+ records : list[dict] | None
651
+ Optional list of pre-fetched metadata records. If provided, the dataset is
652
+ constructed directly from these records without querying MongoDB.
565
653
  kwargs : dict
566
654
  Additional keyword arguments to be passed to the EEGDashBaseDataset
567
655
  constructor.
@@ -569,20 +657,47 @@ class EEGDashDataset(BaseConcatDataset):
569
657
  """
570
658
  self.cache_dir = cache_dir
571
659
  self.s3_bucket = s3_bucket
572
- self.eeg_dash = eeg_dash_instance or EEGDash()
573
- _owns_client = eeg_dash_instance is None
660
+ self.eeg_dash = eeg_dash_instance
661
+ _owns_client = False
662
+ if self.eeg_dash is None and records is None:
663
+ self.eeg_dash = EEGDash()
664
+ _owns_client = True
665
+
666
+ # Separate query kwargs from other kwargs passed to the BaseDataset constructor
667
+ query_kwargs = {
668
+ k: v for k, v in kwargs.items() if k in EEGDash._ALLOWED_QUERY_FIELDS
669
+ }
670
+ base_dataset_kwargs = {k: v for k, v in kwargs.items() if k not in query_kwargs}
671
+
672
+ if query and query_kwargs:
673
+ raise ValueError(
674
+ "Provide either a 'query' dictionary or keyword arguments for filtering, not both."
675
+ )
574
676
 
575
677
  try:
576
- if query:
577
- datasets = self.find_datasets(query, description_fields, **kwargs)
678
+ if records is not None:
679
+ datasets = [
680
+ EEGDashBaseDataset(
681
+ record,
682
+ self.cache_dir,
683
+ self.s3_bucket,
684
+ **base_dataset_kwargs,
685
+ )
686
+ for record in records
687
+ ]
578
688
  elif data_dir:
689
+ # This path loads from a local directory and is not affected by DB query logic
579
690
  if isinstance(data_dir, str):
580
691
  datasets = self.load_bids_dataset(
581
- dataset, data_dir, description_fields, s3_bucket, **kwargs
692
+ dataset,
693
+ data_dir,
694
+ description_fields,
695
+ s3_bucket,
696
+ **base_dataset_kwargs,
582
697
  )
583
698
  else:
584
699
  assert len(data_dir) == len(dataset), (
585
- "Number of datasets and their directories must match"
700
+ "Number of datasets and directories must match"
586
701
  )
587
702
  datasets = []
588
703
  for i, _ in enumerate(data_dir):
@@ -592,27 +707,28 @@ class EEGDashDataset(BaseConcatDataset):
592
707
  data_dir[i],
593
708
  description_fields,
594
709
  s3_bucket,
595
- **kwargs,
710
+ **base_dataset_kwargs,
596
711
  )
597
712
  )
713
+ elif query or query_kwargs:
714
+ # This is the DB query path that we are improving
715
+ datasets = self.find_datasets(
716
+ query=query,
717
+ description_fields=description_fields,
718
+ query_kwargs=query_kwargs,
719
+ base_dataset_kwargs=base_dataset_kwargs,
720
+ )
721
+ # We only need filesystem if we need to access S3
722
+ self.filesystem = S3FileSystem(
723
+ anon=True, client_kwargs={"region_name": "us-east-2"}
724
+ )
598
725
  else:
599
726
  raise ValueError(
600
- "Exactly one of 'query' or 'data_dir' must be provided."
727
+ "You must provide either 'records', a 'data_dir', or a query/keyword arguments for filtering."
601
728
  )
602
729
  finally:
603
- # If we created the client, close it now that construction is done.
604
- if _owns_client:
605
- try:
606
- self.eeg_dash.close()
607
- except Exception:
608
- # Don't let close errors break construction
609
- pass
610
-
611
- self.filesystem = S3FileSystem(
612
- anon=True, client_kwargs={"region_name": "us-east-2"}
613
- )
614
-
615
- self.eeg_dash.close()
730
+ if _owns_client and self.eeg_dash is not None:
731
+ self.eeg_dash.close()
616
732
 
617
733
  super().__init__(datasets)
618
734
 
@@ -630,7 +746,11 @@ class EEGDashDataset(BaseConcatDataset):
630
746
  return None
631
747
 
632
748
  def find_datasets(
633
- self, query: dict[str, Any], description_fields: list[str], **kwargs
749
+ self,
750
+ query: dict[str, Any],
751
+ description_fields: list[str],
752
+ query_kwargs: dict,
753
+ base_dataset_kwargs: dict,
634
754
  ) -> list[EEGDashBaseDataset]:
635
755
  """Helper method to find datasets in the MongoDB collection that satisfy the
636
756
  given query and return them as a list of EEGDashBaseDataset objects.
@@ -652,7 +772,10 @@ class EEGDashDataset(BaseConcatDataset):
652
772
 
653
773
  """
654
774
  datasets: list[EEGDashBaseDataset] = []
655
- for record in self.eeg_dash.find(query):
775
+
776
+ records = self.eeg_dash.find(query, **query_kwargs)
777
+
778
+ for record in records:
656
779
  description = {}
657
780
  for field in description_fields:
658
781
  value = self.find_key_in_nested_dict(record, field)
@@ -664,7 +787,7 @@ class EEGDashDataset(BaseConcatDataset):
664
787
  self.cache_dir,
665
788
  self.s3_bucket,
666
789
  description=description,
667
- **kwargs,
790
+ **base_dataset_kwargs,
668
791
  )
669
792
  )
670
793
  return datasets
eegdash/registry.py CHANGED
@@ -1,52 +1,39 @@
1
1
  from __future__ import annotations
2
2
 
3
- import csv
4
3
  from pathlib import Path
5
4
  from typing import Any, Dict
6
5
 
6
+ import pandas as pd
7
+ from tabulate import tabulate
8
+
7
9
 
8
10
  def register_openneuro_datasets(
9
11
  summary_file: str | Path,
10
12
  *,
11
13
  base_class=None,
12
14
  namespace: Dict[str, Any] | None = None,
15
+ add_to_all: bool = True,
13
16
  ) -> Dict[str, type]:
14
- """Dynamically create dataset classes from a summary file.
15
-
16
- Parameters
17
- ----------
18
- summary_file : str | Path
19
- Path to a CSV file where each line starts with the dataset identifier.
20
- base_class : type | None
21
- Base class for the generated datasets. If ``None``, defaults to
22
- :class:`eegdash.api.EEGDashDataset`.
23
- namespace : dict | None
24
- Mapping where the new classes will be registered. Defaults to the
25
- module's global namespace.
26
-
27
- Returns
28
- -------
29
- dict
30
- Mapping from class names to the generated classes.
31
-
32
- """
17
+ """Dynamically create dataset classes from a summary file."""
33
18
  if base_class is None:
34
19
  from .api import EEGDashDataset as base_class # lazy import
35
20
 
36
21
  summary_path = Path(summary_file)
37
22
  namespace = namespace if namespace is not None else globals()
23
+ module_name = namespace.get("__name__", __name__)
38
24
  registered: Dict[str, type] = {}
39
25
 
40
- with summary_path.open() as f:
41
- reader = csv.reader(f)
42
- for row in reader:
43
- if not row:
44
- continue
45
- dataset_id = row[0].strip()
46
- if not dataset_id or dataset_id.startswith("#"):
47
- continue
48
- class_name = dataset_id.upper()
26
+ df = pd.read_csv(summary_path, comment="#", skip_blank_lines=True)
27
+ for _, row_series in df.iterrows():
28
+ row = row_series.tolist()
29
+ dataset_id = str(row[0]).strip()
30
+ if not dataset_id:
31
+ continue
32
+
33
+ class_name = dataset_id.upper()
49
34
 
35
+ # avoid zero-arg super() here
36
+ def make_init(_dataset: str):
50
37
  def __init__(
51
38
  self,
52
39
  cache_dir: str,
@@ -54,19 +41,96 @@ def register_openneuro_datasets(
54
41
  s3_bucket: str | None = None,
55
42
  **kwargs,
56
43
  ):
57
- q = {"dataset": self._dataset}
44
+ q = {"dataset": _dataset}
58
45
  if query:
59
46
  q.update(query)
60
- super().__init__(
61
- query=q, cache_dir=cache_dir, s3_bucket=s3_bucket, **kwargs
47
+ # call base_class.__init__ directly
48
+ base_class.__init__(
49
+ self,
50
+ query=q,
51
+ cache_dir=cache_dir,
52
+ s3_bucket=s3_bucket,
53
+ **kwargs,
62
54
  )
63
55
 
64
- cls = type(
65
- class_name,
66
- (base_class,),
67
- {"_dataset": dataset_id, "__init__": __init__},
68
- )
69
- namespace[class_name] = cls
70
- registered[class_name] = cls
56
+ return __init__
57
+
58
+ init = make_init(dataset_id)
59
+
60
+ doc = f"""Create an instance for OpenNeuro dataset ``{dataset_id}``.
61
+
62
+ {markdown_table(row_series)}
63
+
64
+ Parameters
65
+ ----------
66
+ cache_dir : str
67
+ Local cache directory.
68
+ query : dict | None
69
+ Extra Mongo query merged with ``{{'dataset': '{dataset_id}'}}``.
70
+ s3_bucket : str | None
71
+ Optional S3 bucket name.
72
+ **kwargs
73
+ Passed through to {base_class.__name__}.
74
+ """
75
+
76
+ init.__doc__ = doc
77
+
78
+ cls = type(
79
+ class_name,
80
+ (base_class,),
81
+ {
82
+ "_dataset": dataset_id,
83
+ "__init__": init,
84
+ "__doc__": doc,
85
+ "__module__": module_name, #
86
+ },
87
+ )
88
+
89
+ namespace[class_name] = cls
90
+ registered[class_name] = cls
91
+
92
+ if add_to_all:
93
+ ns_all = namespace.setdefault("__all__", [])
94
+ if isinstance(ns_all, list) and class_name not in ns_all:
95
+ ns_all.append(class_name)
71
96
 
72
97
  return registered
98
+
99
+
100
+ def markdown_table(row_series: pd.Series) -> str:
101
+ """Create a reStructuredText grid table from a pandas Series."""
102
+ if row_series.empty:
103
+ return ""
104
+
105
+ # Prepare the dataframe with user's suggested logic
106
+ df = (
107
+ row_series.to_frame()
108
+ .T.rename(
109
+ columns={
110
+ "n_subjects": "#Subj",
111
+ "nchans_set": "#Chan",
112
+ "n_tasks": "#Classes",
113
+ "sampling_freqs": "Freq(Hz)",
114
+ "duration_hours_total": "Duration(H)",
115
+ }
116
+ )
117
+ .reindex(
118
+ columns=[
119
+ "dataset",
120
+ "#Subj",
121
+ "#Chan",
122
+ "#Classes",
123
+ "Freq(Hz)",
124
+ "Duration(H)",
125
+ ]
126
+ )
127
+ .infer_objects(copy=False)
128
+ .fillna("")
129
+ )
130
+
131
+ # Use tabulate for the final rst formatting
132
+ table = tabulate(df, headers="keys", tablefmt="rst", showindex=False)
133
+
134
+ # Indent the table to fit within the admonition block
135
+ indented_table = "\n".join(" " + line for line in table.split("\n"))
136
+ return f"\n\n{indented_table}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: eegdash
3
- Version: 0.3.4.dev69
3
+ Version: 0.3.5.dev77
4
4
  Summary: EEG data for machine learning
5
5
  Author-email: Young Truong <dt.young112@gmail.com>, Arnaud Delorme <adelorme@gmail.com>, Aviv Dotan <avivd220@gmail.com>, Oren Shriki <oren70@gmail.com>, Bruno Aristimunha <b.aristimunha@gmail.com>
6
6
  License-Expression: GPL-3.0-only
@@ -38,6 +38,8 @@ Requires-Dist: tqdm
38
38
  Requires-Dist: xarray
39
39
  Requires-Dist: h5io>=0.2.4
40
40
  Requires-Dist: pymatreader
41
+ Requires-Dist: eeglabio
42
+ Requires-Dist: tabulate
41
43
  Provides-Extra: tests
42
44
  Requires-Dist: pytest; extra == "tests"
43
45
  Requires-Dist: pytest-cov; extra == "tests"
@@ -1,12 +1,12 @@
1
- eegdash/__init__.py,sha256=jE7WgvWD5alhbtOwzVZ0NCFWRdTx2_xEOrf40uPu8QY,240
2
- eegdash/api.py,sha256=OqOZ27GYURSAZwTQHSs0QcW_6Mq1i_5XHP6KMcihb8A,27295
1
+ eegdash/__init__.py,sha256=kEfROPte5G7SgYy3bdM6r3KrWm_XuXcvS-tNPMVBIr4,240
2
+ eegdash/api.py,sha256=M4QX93iqOneqO9zz6ruwGKpmU9h40K8lqYnICqAaj5o,32158
3
3
  eegdash/data_config.py,sha256=OS6ERO-jHrnEOfMJUehY7ieABdsRw_qWzOKJ4pzSfqw,1323
4
4
  eegdash/data_utils.py,sha256=_dycnPmGfTbYs7bc6edHxUn_m01dLYtp92_k44ffEoY,26475
5
5
  eegdash/dataset.py,sha256=ooLoxMFy2I8BY9gJl6ncTp_Gz-Rq0Z-o4NJyyomxLcU,2670
6
6
  eegdash/dataset_summary.csv,sha256=EfnPciglkf4Vgc8dDq_1x7Woeeze1II8vOhx60g4yhc,8670
7
7
  eegdash/mongodb.py,sha256=GD3WgA253oFgpzOHrYaj4P1mRjNtDMT5Oj4kVvHswjI,2006
8
8
  eegdash/preprocessing.py,sha256=7S_TTRKPKEk47tTnh2D6WExBt4cctAMxUxGDjJqq5lU,2221
9
- eegdash/registry.py,sha256=u2TqnMZPhnhItFupPbV50QGemeImnuc18wnEkKzLtL8,2118
9
+ eegdash/registry.py,sha256=cxqX53GYyDvg5DkiqJkvjqHDPI72JTPlI4qVh2sILu8,3873
10
10
  eegdash/utils.py,sha256=wU9CBQZLW_LIQIBwhgQm5bU4X-rSsVNPdeF2iE4QGJ4,410
11
11
  eegdash/features/__init__.py,sha256=BXNhjvL4_SSFAY1lcP9nyGpkbJNtoOMH4AHlF6OyABo,4078
12
12
  eegdash/features/datasets.py,sha256=kU1DO70ArSIy-LF1hHD2NN4iT-kJrI0mVpSkyV_OSeI,18301
@@ -23,8 +23,8 @@ eegdash/features/feature_bank/dimensionality.py,sha256=j_Ds71Y1AbV2uLFQj8EuXQ4kz
23
23
  eegdash/features/feature_bank/signal.py,sha256=3Tb8z9gX7iZipxQJ9DSyy30JfdmW58kgvimSyZX74p8,3404
24
24
  eegdash/features/feature_bank/spectral.py,sha256=bNB7skusePs1gX7NOU6yRlw_Gr4UOCkO_ylkCgybzug,3319
25
25
  eegdash/features/feature_bank/utils.py,sha256=DGh-Q7-XFIittP7iBBxvsJaZrlVvuY5mw-G7q6C-PCI,1237
26
- eegdash-0.3.4.dev69.dist-info/licenses/LICENSE,sha256=asisR-xupy_NrQBFXnx6yqXeZcYWLvbAaiETl25iXT0,931
27
- eegdash-0.3.4.dev69.dist-info/METADATA,sha256=ez_LqhgS-Lhf-GYlNnhi0ffE50YT3bvzlqNv8UUce5A,10340
28
- eegdash-0.3.4.dev69.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
29
- eegdash-0.3.4.dev69.dist-info/top_level.txt,sha256=zavO69HQ6MyZM0aQMR2zUS6TAFc7bnN5GEpDpOpFZzU,8
30
- eegdash-0.3.4.dev69.dist-info/RECORD,,
26
+ eegdash-0.3.5.dev77.dist-info/licenses/LICENSE,sha256=asisR-xupy_NrQBFXnx6yqXeZcYWLvbAaiETl25iXT0,931
27
+ eegdash-0.3.5.dev77.dist-info/METADATA,sha256=1-0zRsLKzuM36yIDIlpbxTSCbCSp75XQoi2MC0C2pdA,10388
28
+ eegdash-0.3.5.dev77.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
29
+ eegdash-0.3.5.dev77.dist-info/top_level.txt,sha256=zavO69HQ6MyZM0aQMR2zUS6TAFc7bnN5GEpDpOpFZzU,8
30
+ eegdash-0.3.5.dev77.dist-info/RECORD,,