sdata 0.23.3__tar.gz → 0.24.0__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 (95) hide show
  1. {sdata-0.23.3/sdata.egg-info → sdata-0.24.0}/PKG-INFO +1 -1
  2. {sdata-0.23.3 → sdata-0.24.0}/sdata/__init__.py +1 -1
  3. {sdata-0.23.3 → sdata-0.24.0}/sdata/data.py +77 -2
  4. {sdata-0.23.3 → sdata-0.24.0}/sdata/image.py +4 -0
  5. {sdata-0.23.3 → sdata-0.24.0}/sdata/metadata.py +16 -0
  6. {sdata-0.23.3 → sdata-0.24.0/sdata.egg-info}/PKG-INFO +1 -1
  7. {sdata-0.23.3 → sdata-0.24.0}/tests/test_data.py +22 -0
  8. {sdata-0.23.3 → sdata-0.24.0}/LICENSE-MIT +0 -0
  9. {sdata-0.23.3 → sdata-0.24.0}/MANIFEST.in +0 -0
  10. {sdata-0.23.3 → sdata-0.24.0}/README.md +0 -0
  11. {sdata-0.23.3 → sdata-0.24.0}/sdata/blob.py +0 -0
  12. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/__init__.py +0 -0
  13. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/attrdict/__init__.py +0 -0
  14. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/attrdict/default.py +0 -0
  15. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/attrdict/dictionary.py +0 -0
  16. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/attrdict/mapping.py +0 -0
  17. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/attrdict/merge.py +0 -0
  18. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/attrdict/mixins.py +0 -0
  19. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/piexif/__init__.py +0 -0
  20. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/piexif/_common.py +0 -0
  21. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/piexif/_dump.py +0 -0
  22. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/piexif/_exceptions.py +0 -0
  23. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/piexif/_exif.py +0 -0
  24. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/piexif/_insert.py +0 -0
  25. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/piexif/_load.py +0 -0
  26. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/piexif/_remove.py +0 -0
  27. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/piexif/_transplant.py +0 -0
  28. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/piexif/_webp.py +0 -0
  29. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/piexif/helper.py +0 -0
  30. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/ranger/__init__.py +0 -0
  31. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/ranger/collections/__init__.py +0 -0
  32. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/ranger/collections/rangebucketmap.py +0 -0
  33. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/ranger/collections/rangemap.py +0 -0
  34. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/ranger/collections/rangeset.py +0 -0
  35. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/ranger/range/__init__.py +0 -0
  36. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/ranger/range/cut.py +0 -0
  37. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/ranger/range/range.py +0 -0
  38. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/semver.py +0 -0
  39. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/simple_graph_db/LICENSE +0 -0
  40. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/simple_graph_db/__init__.py +0 -0
  41. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/simple_graph_db/database.py +0 -0
  42. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/simple_graph_db/schema.sql +0 -0
  43. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/sobol_seq.py +0 -0
  44. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/sortedcontainers/LICENSE +0 -0
  45. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/sortedcontainers/__init__.py +0 -0
  46. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/sortedcontainers/sorteddict.py +0 -0
  47. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/sortedcontainers/sortedlist.py +0 -0
  48. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/sortedcontainers/sortedset.py +0 -0
  49. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/sqlitedict.py +0 -0
  50. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/timeflake/__init__.py +0 -0
  51. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/timeflake/flake.py +0 -0
  52. {sdata-0.23.3 → sdata-0.24.0}/sdata/contrib/timeflake/utils.py +0 -0
  53. {sdata-0.23.3 → sdata-0.24.0}/sdata/doe.py +0 -0
  54. {sdata-0.23.3 → sdata-0.24.0}/sdata/experiments/__init__.py +0 -0
  55. {sdata-0.23.3 → sdata-0.24.0}/sdata/experiments/ks2.py +0 -0
  56. {sdata-0.23.3 → sdata-0.24.0}/sdata/experiments/lapshear.py +0 -0
  57. {sdata-0.23.3 → sdata-0.24.0}/sdata/experiments/material.py +0 -0
  58. {sdata-0.23.3 → sdata-0.24.0}/sdata/iolib/__init__.py +0 -0
  59. {sdata-0.23.3 → sdata-0.24.0}/sdata/iolib/db.py +0 -0
  60. {sdata-0.23.3 → sdata-0.24.0}/sdata/iolib/hdf.py +0 -0
  61. {sdata-0.23.3 → sdata-0.24.0}/sdata/iolib/isomme.py +0 -0
  62. {sdata-0.23.3 → sdata-0.24.0}/sdata/iolib/pgp.py +0 -0
  63. {sdata-0.23.3 → sdata-0.24.0}/sdata/iolib/pud.py +0 -0
  64. {sdata-0.23.3 → sdata-0.24.0}/sdata/iolib/simple_signature.py +0 -0
  65. {sdata-0.23.3 → sdata-0.24.0}/sdata/iolib/vault.py +0 -0
  66. {sdata-0.23.3 → sdata-0.24.0}/sdata/suuid.py +0 -0
  67. {sdata-0.23.3 → sdata-0.24.0}/sdata/timestamp.py +0 -0
  68. {sdata-0.23.3 → sdata-0.24.0}/sdata/tools.py +0 -0
  69. {sdata-0.23.3 → sdata-0.24.0}/sdata/workbook.py +0 -0
  70. {sdata-0.23.3 → sdata-0.24.0}/sdata.egg-info/SOURCES.txt +0 -0
  71. {sdata-0.23.3 → sdata-0.24.0}/sdata.egg-info/dependency_links.txt +0 -0
  72. {sdata-0.23.3 → sdata-0.24.0}/sdata.egg-info/requires.txt +0 -0
  73. {sdata-0.23.3 → sdata-0.24.0}/sdata.egg-info/top_level.txt +0 -0
  74. {sdata-0.23.3 → sdata-0.24.0}/setup.cfg +0 -0
  75. {sdata-0.23.3 → sdata-0.24.0}/setup.py +0 -0
  76. {sdata-0.23.3 → sdata-0.24.0}/tests/__init__.py +0 -0
  77. {sdata-0.23.3 → sdata-0.24.0}/tests/iolib/__init__.py +0 -0
  78. {sdata-0.23.3 → sdata-0.24.0}/tests/iolib/pud/__init__.py +0 -0
  79. {sdata-0.23.3 → sdata-0.24.0}/tests/iolib/pud/test_pud.py +0 -0
  80. {sdata-0.23.3 → sdata-0.24.0}/tests/iolib/test_hdf.py +0 -0
  81. {sdata-0.23.3 → sdata-0.24.0}/tests/test_attribute.py +0 -0
  82. {sdata-0.23.3 → sdata-0.24.0}/tests/test_blob.py +0 -0
  83. {sdata-0.23.3 → sdata-0.24.0}/tests/test_image.py +0 -0
  84. {sdata-0.23.3 → sdata-0.24.0}/tests/test_io.py +0 -0
  85. {sdata-0.23.3 → sdata-0.24.0}/tests/test_ks2.py +0 -0
  86. {sdata-0.23.3 → sdata-0.24.0}/tests/test_metadata.py +0 -0
  87. {sdata-0.23.3 → sdata-0.24.0}/tests/test_sqlite.py +0 -0
  88. {sdata-0.23.3 → sdata-0.24.0}/tests/test_suuid.py +0 -0
  89. {sdata-0.23.3 → sdata-0.24.0}/tests/test_table.py +0 -0
  90. {sdata-0.23.3 → sdata-0.24.0}/tests/test_testprogram.py +0 -0
  91. {sdata-0.23.3 → sdata-0.24.0}/tests/test_timeflake.py +0 -0
  92. {sdata-0.23.3 → sdata-0.24.0}/tests/test_timestamp.py +0 -0
  93. {sdata-0.23.3 → sdata-0.24.0}/tests/test_tools.py +0 -0
  94. {sdata-0.23.3 → sdata-0.24.0}/tests/test_vault.py +0 -0
  95. {sdata-0.23.3 → sdata-0.24.0}/tests/test_workbook.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sdata
3
- Version: 0.23.3
3
+ Version: 0.24.0
4
4
  Summary: a structured data format
5
5
  Home-page: https://github.com/lepy/sdata
6
6
  Author: Lepy
@@ -1,7 +1,7 @@
1
1
  # -*-coding: utf-8-*-
2
2
  from __future__ import division
3
3
 
4
- __version__ = '0.23.3'
4
+ __version__ = '0.24.0'
5
5
  __revision__ = None
6
6
  __version_info__ = tuple([int(num) for num in __version__.split('.')])
7
7
 
@@ -24,6 +24,7 @@ import json
24
24
  import hashlib
25
25
  import base64
26
26
  import requests
27
+ import re
27
28
  from tabulate import tabulate
28
29
  from sdata.contrib.sqlitedict import SqliteDict
29
30
 
@@ -46,6 +47,24 @@ except:
46
47
  def uuid_from_str(name):
47
48
  return uuid.uuid3(uuid.NAMESPACE_DNS, name)
48
49
 
50
+ def nameunit_from_colname(column_name):
51
+ """
52
+
53
+ """
54
+ #pattern = r"^(.*?)\s*\[(.+)\]$"
55
+ pattern = r"^(.*?)\s*\[([^\]]+)\]$"
56
+
57
+ # Anwenden des Regex
58
+ match = re.match(pattern, column_name)
59
+
60
+ if match:
61
+ name = match.group(1) # Der Name der Spalte
62
+ unit = match.group(2) # Die Einheit
63
+ else:
64
+ name = column_name
65
+ unit = "-"
66
+ return name.strip(), unit.strip()
67
+
49
68
  class Data(object):
50
69
  """Base sdata object"""
51
70
  ATTR_NAMES = []
@@ -61,6 +80,7 @@ class Data(object):
61
80
  SDATA_CLASS = "!sdata_class"
62
81
  SDATA_PROJECT = "!sdata_project"
63
82
  SDATA_URL = "!sdata_url"
83
+ SDATA_COLUMN = "!sdata_column"
64
84
 
65
85
  SDATA_ATTRIBUTES = [SDATA_VERSION, SDATA_NAME, SDATA_UUID, SDATA_SUUID, SDATA_CLASS, SDATA_PARENT, SDATA_PROJECT,
66
86
  SDATA_CTIME, SDATA_MTIME, SDATA_URL]
@@ -166,6 +186,10 @@ class Data(object):
166
186
  if "sname" in kwargs:
167
187
  self.sname = kwargs.get("sname")
168
188
 
189
+
190
+ if "parent" in kwargs:
191
+ self.metadata.add(self.SDATA_PARENT, kwargs.get("parent"))
192
+
169
193
  def gen_suuid(self):
170
194
  self.suuid = sdata.SUUID(self.__class__.__name__, self.name, huuid=self.uuid).idstr
171
195
  self.sname = sdata.SUUID(self.__class__.__name__, self.name, huuid=self.uuid).sname
@@ -212,6 +236,10 @@ class Data(object):
212
236
  self._set_uuid(suuid.huuid)
213
237
  return self
214
238
 
239
+ @property
240
+ def m(self):
241
+ return self.metadata
242
+
215
243
  def update_mtime(self):
216
244
  """update modification time
217
245
 
@@ -520,6 +548,49 @@ class Data(object):
520
548
  data.to_folder(exportpath, dtype=dtype)
521
549
  return path
522
550
 
551
+ def set_column_metadata(self):
552
+ """convert 'Force [N]' -> 'Force', 'N'
553
+
554
+ add Attribute for each column
555
+
556
+ sdata_column_0: value="Force", unit="N"
557
+ sdata_column_1
558
+ ...
559
+ sdata_column_n
560
+
561
+
562
+ """
563
+ if self.df is None:
564
+ return
565
+ for i, col in enumerate(self.df.columns):
566
+ name, unit = nameunit_from_colname(col)
567
+ scolname = f"{self.SDATA_COLUMN}_{i}"
568
+ self.metadata.add(scolname, value=name, unit=unit, label=col)
569
+
570
+ def set_columnnames_from_metadata(self):
571
+ """Use '!sdata_column_*' to reformat columns names
572
+
573
+ '!sdata_column_0', value='Force', unit='N' -> 'Force [N]'
574
+
575
+ > f'{name} [{unit}]'
576
+
577
+ """
578
+ if self.df is None:
579
+ return
580
+
581
+ cols = []
582
+ for i, col in enumerate(self.df.columns):
583
+ scolname = f"{self.SDATA_COLUMN}_{i}"
584
+ attr = self.metadata.get(scolname)
585
+ if attr is None:
586
+ name, unit = nameunit_from_colname(col)
587
+ else:
588
+ name = attr.value
589
+ unit = attr.unit
590
+ new_colname = f'{name} [{unit}]'
591
+ cols.append(new_colname)
592
+ self.df.columns = cols
593
+
523
594
  @classmethod
524
595
  def from_folder(cls, path):
525
596
  """sdata object instance
@@ -1018,15 +1089,19 @@ class Data(object):
1018
1089
  :param sep: separator (default=";")
1019
1090
  :return: sdata.Data
1020
1091
  """
1092
+ if s is None and filepath is None:
1093
+ logging.error("specify string if filepath")
1094
+ return
1021
1095
  data = cls()
1022
1096
  df = None
1023
1097
  try:
1024
1098
  if filepath:
1025
1099
  df = pd.read_csv(filepath, sep=";", comment="#", index_col=0)
1026
1100
  sio = open(filepath, "r")
1101
+ sio.seek(0)
1027
1102
  elif s is not None:
1028
1103
  sio = StringIO(s)
1029
- pd.read_csv(sio, sep=";", comment="#")
1104
+ df = pd.read_csv(sio, sep=";", comment="#")
1030
1105
  sio.seek(0)
1031
1106
  else:
1032
1107
  logger.error("data.from_csv: no csv data available")
@@ -1274,7 +1349,7 @@ class Data(object):
1274
1349
  :return: Data
1275
1350
  """
1276
1351
  data = copy.deepcopy(self)
1277
- data.metadata.add(self.SDATA_PARENT, self.uuid)
1352
+ data.metadata.add(self.SDATA_PARENT, self.suuid)
1278
1353
  data.metadata.add(self.SDATA_UUID, self.gen_uuid())
1279
1354
  data.metadata.add(self.SDATA_MTIME, now_utc_str(), dtype="str")
1280
1355
  if "uuid" in kwargs:
@@ -236,6 +236,10 @@ class Image(Data):
236
236
  d = json.loads(json_string)
237
237
  return d
238
238
 
239
+ @property
240
+ def basename(self):
241
+ return os.path.basename(self.url)
242
+
239
243
  def saveas(self, filepath, rename=True, random=True, **kwargs):
240
244
  """save image
241
245
 
@@ -455,6 +455,22 @@ class Metadata(object):
455
455
  """create dataframe for user attributes"""
456
456
  return self._to_dataframe(self.user_attributes)
457
457
 
458
+ @property
459
+ def dft(self):
460
+ """create transposed dataframe for sdata attributes"""
461
+ mt = self.df[["value"]].transpose(copy=True)
462
+ mt.index = [self.get("!sdata_sname").value]
463
+ return mt
464
+
465
+ def get_dft(self, index_name=None):
466
+ """create transposed dataframe for sdata attributes"""
467
+ if index_name is None:
468
+ index_name = "!sdata_sname"
469
+ mt = self.df[["value"]].transpose(copy=True)
470
+ mt.index = [self.get(index_name).value]
471
+ return mt
472
+
473
+
458
474
  @property
459
475
  def sdf(self):
460
476
  """create dataframe for sdata attributes"""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sdata
3
- Version: 0.23.3
3
+ Version: 0.24.0
4
4
  Summary: a structured data format
5
5
  Home-page: https://github.com/lepy/sdata
6
6
  Author: Lepy
@@ -25,6 +25,28 @@ def test_data():
25
25
 
26
26
  assert data2.uuid == uuidobj.hex
27
27
 
28
+ def test_column_units():
29
+ columns = ["Länge [mm]", "Breite [cm]", "wtf", "Spannung[MPa]"]
30
+ df = pd.DataFrame(columns=columns)
31
+ d = sdata.Data(table=df)
32
+ d.set_column_metadata()
33
+ print(d.sdf)
34
+ c0 = d.m.get("!sdata_column_0")
35
+
36
+ assert "!sdata_column_3" in d.m.keys()
37
+ assert c0
38
+ print(c0.value, c0.unit)
39
+ assert c0.value == "Länge"
40
+ assert c0.unit == "mm"
41
+
42
+ c3 = d.m.get("!sdata_column_3")
43
+ print(c3.value, c3.unit)
44
+ assert c3.value == "Spannung"
45
+ assert c3.unit == "MPa"
46
+ c4 = d.m.get("!sdata_column_4")
47
+ assert c4 is None
48
+
49
+
28
50
  def test_group():
29
51
 
30
52
  data1 = sdata.Data(name="data1", uuid="38b26864e7794f5182d38459bab8584f")
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
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes