sweatstack 0.22.0__py3-none-any.whl → 0.23.0__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.
sweatstack/client.py CHANGED
@@ -540,11 +540,31 @@ class Client(OAuth2Mixin, DelegationMixin):
540
540
  params["limit"] = min(default_limit, limit - num_returned)
541
541
  params["offset"] += default_limit
542
542
 
543
+ def _prepare_unserialized_data(self, df: pd.DataFrame, column: str) -> pd.DataFrame:
544
+ """
545
+ pd.json_normalize() only likes to play with lists of records (dicts?), not lists of lists.
546
+ So that's what we're feeding it.
547
+ """
548
+ unserialized_data = df[column].tolist()
549
+ if column in ["laps", "traces"]:
550
+ result = []
551
+ for sublist in unserialized_data:
552
+ if sublist:
553
+ dict_from_sublist = {i: value for i, value in enumerate(sublist) if sublist}
554
+ else:
555
+ dict_from_sublist = {}
556
+ result.append(dict_from_sublist)
557
+
558
+ unserialized_data = result
559
+
560
+ return unserialized_data
561
+
543
562
  def _normalize_dataframe_column(self, df: pd.DataFrame, column: str) -> pd.DataFrame:
544
563
  normalized = pd.json_normalize(
545
- df[column],
564
+ self._prepare_unserialized_data(df, column),
546
565
  )
547
566
  normalized = normalized.add_prefix(f"{column}.")
567
+ normalized.index = df.index
548
568
  if column == "activity":
549
569
  normalized = normalized.drop(["activity.traces", "activity.laps"], axis=1, errors="ignore")
550
570
  return pd.concat([df.drop(column, axis=1), normalized], axis=1)
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sweatstack
3
- Version: 0.22.0
3
+ Version: 0.23.0
4
4
  Summary: The official Python client for SweatStack
5
5
  Author-email: Aart Goossens <aart@gssns.io>
6
6
  Requires-Python: >=3.12
7
7
  Requires-Dist: httpx>=0.28.1
8
8
  Requires-Dist: pandas>=2.2.3
9
- Requires-Dist: pyarrow>=19.0.0
9
+ Requires-Dist: pyarrow>=18.0.0
10
10
  Requires-Dist: pydantic>=2.10.5
11
11
  Provides-Extra: jupyter
12
12
  Requires-Dist: ipython>=8.31.0; extra == 'jupyter'
@@ -1,6 +1,6 @@
1
1
  sweatstack/__init__.py,sha256=tiVfgKlswRPaDMEy0gA7u8rveqEYZTA_kyB9lJ3J6Sc,21
2
2
  sweatstack/cli.py,sha256=N1NWOgEZR2yaJvIXxo9qvp_jFlypZYb0nujpbVNYQ6A,720
3
- sweatstack/client.py,sha256=NOLQpOBsSPmYjtZ4GgutMKTcu5efYeD_WVNHThmecIs,22918
3
+ sweatstack/client.py,sha256=09c9f-ij0Pe4MIoCQustskz8YGxpzUxpSeVoCI2deLk,23713
4
4
  sweatstack/constants.py,sha256=fGO6ksOv5HeISv9lHRoYm4besW1GTveXS8YD3K0ljg0,41
5
5
  sweatstack/ipython_init.py,sha256=zBGUlMFkdpLvsNpOpwrNaKRUpUZhzaICvH8ODJgMPcI,229
6
6
  sweatstack/jupyterlab_oauth2_startup.py,sha256=eZ6xi0Sa4hO4vUanimq0SqjduHtiywCURSDNWk_I-7s,1200
@@ -11,7 +11,7 @@ sweatstack/streamlit.py,sha256=F5oQdWkcJ76Um5fRqFT5QrjpEz8v3OaiH9kMQOYktgo,4466
11
11
  sweatstack/sweatshell.py,sha256=MYLNcWbOdceqKJ3S0Pe8dwHXEeYsGJNjQoYUXpMTftA,333
12
12
  sweatstack/utils.py,sha256=HtR1NNCKus59vfgfaCSFS-tHA11mtdcuUx5lS6ZX58g,1773
13
13
  sweatstack/Sweat Stack examples/Getting started.ipynb,sha256=k2hiSffWecoQ0VxjdpDcgFzBXDQiYEebhnAYlu8cgX8,6335204
14
- sweatstack-0.22.0.dist-info/METADATA,sha256=TWb9A7C1_eQdanOf2wgCLNyOe3drm0nbIhYSXdMN93U,776
15
- sweatstack-0.22.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
16
- sweatstack-0.22.0.dist-info/entry_points.txt,sha256=kCzOUQI3dqbTpEYqtgYDeiKFaqaA7BMlV6D24BMzCFU,208
17
- sweatstack-0.22.0.dist-info/RECORD,,
14
+ sweatstack-0.23.0.dist-info/METADATA,sha256=RgZl8LMkUx4RPSXP3huVCRFUaizeYHlsYsMsOTUU2A0,776
15
+ sweatstack-0.23.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
16
+ sweatstack-0.23.0.dist-info/entry_points.txt,sha256=kCzOUQI3dqbTpEYqtgYDeiKFaqaA7BMlV6D24BMzCFU,208
17
+ sweatstack-0.23.0.dist-info/RECORD,,