fmu-sumo 2.4.0__py3-none-any.whl → 2.4.2__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.
- fmu/sumo/explorer/_version.py +2 -2
- fmu/sumo/explorer/objects/_metrics.py +139 -0
- fmu/sumo/explorer/objects/_search_context.py +40 -4
- {fmu_sumo-2.4.0.dist-info → fmu_sumo-2.4.2.dist-info}/METADATA +1 -1
- {fmu_sumo-2.4.0.dist-info → fmu_sumo-2.4.2.dist-info}/RECORD +8 -8
- {fmu_sumo-2.4.0.dist-info → fmu_sumo-2.4.2.dist-info}/WHEEL +1 -1
- {fmu_sumo-2.4.0.dist-info → fmu_sumo-2.4.2.dist-info}/licenses/LICENSE +0 -0
- {fmu_sumo-2.4.0.dist-info → fmu_sumo-2.4.2.dist-info}/top_level.txt +0 -0
fmu/sumo/explorer/_version.py
CHANGED
|
@@ -11,6 +11,16 @@ class Metrics:
|
|
|
11
11
|
res = self._search_context._sumo.post("/search", json=qdoc).json()
|
|
12
12
|
return res["aggregations"]["agg"]
|
|
13
13
|
|
|
14
|
+
async def _aggregate_async(self, op, **kwargs):
|
|
15
|
+
aggs = {
|
|
16
|
+
"agg": {op: {k: v for k, v in kwargs.items() if v is not None}}
|
|
17
|
+
}
|
|
18
|
+
qdoc = {"query": self._search_context._query, "aggs": aggs, "size": 0}
|
|
19
|
+
res = (
|
|
20
|
+
await self._search_context._sumo.post_async("/search", json=qdoc)
|
|
21
|
+
).json()
|
|
22
|
+
return res["aggregations"]["agg"]
|
|
23
|
+
|
|
14
24
|
def min(self, field):
|
|
15
25
|
"""Find the minimum value for the specified property across the
|
|
16
26
|
current set of objects.
|
|
@@ -24,6 +34,19 @@ class Metrics:
|
|
|
24
34
|
"""
|
|
25
35
|
return self._aggregate("min", field=field)["value"]
|
|
26
36
|
|
|
37
|
+
async def min_async(self, field):
|
|
38
|
+
"""Find the minimum value for the specified property across the
|
|
39
|
+
current set of objects.
|
|
40
|
+
|
|
41
|
+
Arguments:
|
|
42
|
+
- field (str): the name of a property in the metadata.
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
The minimum value.
|
|
46
|
+
|
|
47
|
+
"""
|
|
48
|
+
return (await self._aggregate_async("min", field=field))["value"]
|
|
49
|
+
|
|
27
50
|
def max(self, field):
|
|
28
51
|
"""Find the maximum value for the specified property across the
|
|
29
52
|
current set of objects.
|
|
@@ -37,6 +60,19 @@ class Metrics:
|
|
|
37
60
|
"""
|
|
38
61
|
return self._aggregate("max", field=field)["value"]
|
|
39
62
|
|
|
63
|
+
async def max_async(self, field):
|
|
64
|
+
"""Find the maximum value for the specified property across the
|
|
65
|
+
current set of objects.
|
|
66
|
+
|
|
67
|
+
Arguments:
|
|
68
|
+
- field (str): the name of a property in the metadata.
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
The maximum value.
|
|
72
|
+
|
|
73
|
+
"""
|
|
74
|
+
return (await self._aggregate_async("max", field=field))["value"]
|
|
75
|
+
|
|
40
76
|
def avg(self, field):
|
|
41
77
|
"""Find the average value for the specified property across the
|
|
42
78
|
current set of objects.
|
|
@@ -50,6 +86,19 @@ class Metrics:
|
|
|
50
86
|
"""
|
|
51
87
|
return self._aggregate("avg", field=field)["value"]
|
|
52
88
|
|
|
89
|
+
async def avg_async(self, field):
|
|
90
|
+
"""Find the average value for the specified property across the
|
|
91
|
+
current set of objects.
|
|
92
|
+
|
|
93
|
+
Arguments:
|
|
94
|
+
- field (str): the name of a property in the metadata.
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
The average value.
|
|
98
|
+
|
|
99
|
+
"""
|
|
100
|
+
return (await self._aggregate_async("avg", field=field))["value"]
|
|
101
|
+
|
|
53
102
|
def sum(self, field):
|
|
54
103
|
"""Find the sumo of all values for the specified property across
|
|
55
104
|
the current set of objects.
|
|
@@ -63,6 +112,19 @@ class Metrics:
|
|
|
63
112
|
"""
|
|
64
113
|
return self._aggregate("sum", field=field)["value"]
|
|
65
114
|
|
|
115
|
+
async def sum_async(self, field):
|
|
116
|
+
"""Find the sumo of all values for the specified property across
|
|
117
|
+
the current set of objects.
|
|
118
|
+
|
|
119
|
+
Arguments:
|
|
120
|
+
- field (str): the name of a property in the metadata.
|
|
121
|
+
|
|
122
|
+
Returns:
|
|
123
|
+
The sum of all values.
|
|
124
|
+
|
|
125
|
+
"""
|
|
126
|
+
return (await self._aggregate_async("sum", field=field))["value"]
|
|
127
|
+
|
|
66
128
|
def value_count(self, field):
|
|
67
129
|
"""Find the count of values for the specified property across the
|
|
68
130
|
current set of objects.
|
|
@@ -76,6 +138,21 @@ class Metrics:
|
|
|
76
138
|
"""
|
|
77
139
|
return self._aggregate("value_count", field=field)["value"]
|
|
78
140
|
|
|
141
|
+
async def value_count_async(self, field):
|
|
142
|
+
"""Find the count of values for the specified property across the
|
|
143
|
+
current set of objects.
|
|
144
|
+
|
|
145
|
+
Arguments:
|
|
146
|
+
- field (str): the name of a property in the metadata.
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
The total number of values.
|
|
150
|
+
|
|
151
|
+
"""
|
|
152
|
+
return (await self._aggregate_async("value_count", field=field))[
|
|
153
|
+
"value"
|
|
154
|
+
]
|
|
155
|
+
|
|
79
156
|
def cardinality(self, field):
|
|
80
157
|
"""Find the count of distinct values for the specified property
|
|
81
158
|
across the current set of objects.
|
|
@@ -91,6 +168,23 @@ class Metrics:
|
|
|
91
168
|
"""
|
|
92
169
|
return self._aggregate("cardinality", field=field)["value"]
|
|
93
170
|
|
|
171
|
+
async def cardinality_async(self, field):
|
|
172
|
+
"""Find the count of distinct values for the specified property
|
|
173
|
+
across the current set of objects.
|
|
174
|
+
|
|
175
|
+
Arguments:
|
|
176
|
+
- field (str): the name of a property in the metadata.
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
The number of distinct values.
|
|
180
|
+
|
|
181
|
+
Note: The value returned is approximate.
|
|
182
|
+
|
|
183
|
+
"""
|
|
184
|
+
return (await self._aggregate_async("cardinality", field=field))[
|
|
185
|
+
"value"
|
|
186
|
+
]
|
|
187
|
+
|
|
94
188
|
def stats(self, field):
|
|
95
189
|
"""Compute a basic set of statistics of the values for the specified
|
|
96
190
|
property across the current set of objects.
|
|
@@ -104,6 +198,19 @@ class Metrics:
|
|
|
104
198
|
"""
|
|
105
199
|
return self._aggregate("stats", field=field)
|
|
106
200
|
|
|
201
|
+
async def stats_async(self, field):
|
|
202
|
+
"""Compute a basic set of statistics of the values for the specified
|
|
203
|
+
property across the current set of objects.
|
|
204
|
+
|
|
205
|
+
Arguments:
|
|
206
|
+
- field (str): the name of a property in the metadata.
|
|
207
|
+
|
|
208
|
+
Returns:
|
|
209
|
+
A dictionary of statistical metrics.
|
|
210
|
+
|
|
211
|
+
"""
|
|
212
|
+
return await self._aggregate_async("stats", field=field)
|
|
213
|
+
|
|
107
214
|
def extended_stats(self, field):
|
|
108
215
|
"""Compute an extended set of statistics of the values for the
|
|
109
216
|
specified property across the current set of objects.
|
|
@@ -117,6 +224,19 @@ class Metrics:
|
|
|
117
224
|
"""
|
|
118
225
|
return self._aggregate("extended_stats", field=field)
|
|
119
226
|
|
|
227
|
+
async def extended_stats_async(self, field):
|
|
228
|
+
"""Compute an extended set of statistics of the values for the
|
|
229
|
+
specified property across the current set of objects.
|
|
230
|
+
|
|
231
|
+
Arguments:
|
|
232
|
+
- field (str): the name of a property in the metadata.
|
|
233
|
+
|
|
234
|
+
Returns:
|
|
235
|
+
A dictionary of statistical metrics.
|
|
236
|
+
|
|
237
|
+
"""
|
|
238
|
+
return await self._aggregate_async("extended_stats", field=field)
|
|
239
|
+
|
|
120
240
|
def percentiles(self, field, percents=None):
|
|
121
241
|
"""Find the values at specific percentiles for the specified
|
|
122
242
|
property across the current set of objects.
|
|
@@ -133,3 +253,22 @@ class Metrics:
|
|
|
133
253
|
return self._aggregate("percentiles", field=field, percents=percents)[
|
|
134
254
|
"values"
|
|
135
255
|
]
|
|
256
|
+
|
|
257
|
+
async def percentiles_async(self, field, percents=None):
|
|
258
|
+
"""Find the values at specific percentiles for the specified
|
|
259
|
+
property across the current set of objects.
|
|
260
|
+
|
|
261
|
+
Arguments:
|
|
262
|
+
- field (str): the name of a property in the metadata.
|
|
263
|
+
- percents ([number]): list of percent values. If omitted, uses
|
|
264
|
+
a default set of values.
|
|
265
|
+
|
|
266
|
+
Returns:
|
|
267
|
+
A dictionary of percentiles.
|
|
268
|
+
|
|
269
|
+
"""
|
|
270
|
+
return (
|
|
271
|
+
await self._aggregate_async(
|
|
272
|
+
"percentiles", field=field, percents=percents
|
|
273
|
+
)
|
|
274
|
+
)["values"]
|
|
@@ -64,6 +64,28 @@ def _gen_filter_gen(attr):
|
|
|
64
64
|
return _fn
|
|
65
65
|
|
|
66
66
|
|
|
67
|
+
def _gen_filter_stage(attr):
|
|
68
|
+
"""Match property against either single value or list of values.
|
|
69
|
+
If the value given is a boolean, tests for existence or not of the property.
|
|
70
|
+
In addition, if the value is or includes either "iteration" or "ensemble",
|
|
71
|
+
expand to include both values.
|
|
72
|
+
"""
|
|
73
|
+
|
|
74
|
+
_inner = _gen_filter_gen(attr)
|
|
75
|
+
|
|
76
|
+
def _fn(value):
|
|
77
|
+
if value == "iteration" or value == "ensemble":
|
|
78
|
+
return _inner(["iteration", "ensemble"])
|
|
79
|
+
elif isinstance(value, list) and set(value).intersection(
|
|
80
|
+
{"iteration", "ensemble"}
|
|
81
|
+
):
|
|
82
|
+
return _inner(list(set(value).union({"iteration", "ensemble"})))
|
|
83
|
+
else:
|
|
84
|
+
return _inner(value)
|
|
85
|
+
|
|
86
|
+
return _fn
|
|
87
|
+
|
|
88
|
+
|
|
67
89
|
def _gen_filter_name():
|
|
68
90
|
"""Match against \"data.name\", or \"case.name\" for case objects."""
|
|
69
91
|
|
|
@@ -144,7 +166,7 @@ _filterspec = {
|
|
|
144
166
|
"ensemble": [_gen_filter_gen, "fmu.ensemble.name.keyword"],
|
|
145
167
|
"realization": [_gen_filter_gen, "fmu.realization.id"],
|
|
146
168
|
"aggregation": [_gen_filter_gen, "fmu.aggregation.operation.keyword"],
|
|
147
|
-
"stage": [
|
|
169
|
+
"stage": [_gen_filter_stage, "fmu.context.stage.keyword"],
|
|
148
170
|
"column": [_gen_filter_gen, "data.spec.columns.keyword"],
|
|
149
171
|
"vertical_domain": [_gen_filter_gen, "data.vertical_domain.keyword"],
|
|
150
172
|
"content": [_gen_filter_gen, "data.content.keyword"],
|
|
@@ -156,6 +178,7 @@ _filterspec = {
|
|
|
156
178
|
"is_observation": [_gen_filter_bool, "data.is_observation"],
|
|
157
179
|
"is_prediction": [_gen_filter_bool, "data.is_prediction"],
|
|
158
180
|
"standard_result": [_gen_filter_gen, "data.standard_result.name.keyword"],
|
|
181
|
+
"entity": [_gen_filter_gen, "fmu.entity.uuid.keyword"],
|
|
159
182
|
"complex": [_gen_filter_complex, None],
|
|
160
183
|
"has": [_gen_filter_none, None],
|
|
161
184
|
}
|
|
@@ -1690,7 +1713,7 @@ class SearchContext:
|
|
|
1690
1713
|
).realizationids
|
|
1691
1714
|
if set(reals) == set(
|
|
1692
1715
|
agg.metadata["fmu"]["aggregation"]["realization_ids"]
|
|
1693
|
-
):
|
|
1716
|
+
) and len(reals) == len(self.filter(realization=True)):
|
|
1694
1717
|
return agg
|
|
1695
1718
|
# ELSE
|
|
1696
1719
|
return self.filter(realization=True).aggregate(
|
|
@@ -1714,8 +1737,11 @@ class SearchContext:
|
|
|
1714
1737
|
realization=True,
|
|
1715
1738
|
complex={"range": {"_sumo.timestamp": {"lt": ts}}},
|
|
1716
1739
|
).realizationids_async
|
|
1717
|
-
if
|
|
1718
|
-
|
|
1740
|
+
if (
|
|
1741
|
+
set(reals)
|
|
1742
|
+
== set(agg.metadata["fmu"]["aggregation"]["realization_ids"])
|
|
1743
|
+
and len(reals)
|
|
1744
|
+
== await self.filter(realization=True).length_async()
|
|
1719
1745
|
):
|
|
1720
1746
|
return agg
|
|
1721
1747
|
# ELSE
|
|
@@ -1928,6 +1954,16 @@ class SearchContext:
|
|
|
1928
1954
|
"data.standard_result.name.keyword"
|
|
1929
1955
|
)
|
|
1930
1956
|
|
|
1957
|
+
@property
|
|
1958
|
+
def entities(self) -> List[str]:
|
|
1959
|
+
"""List of entity uuids."""
|
|
1960
|
+
return self.get_field_values("fmu.entity.uuid.keyword")
|
|
1961
|
+
|
|
1962
|
+
@property
|
|
1963
|
+
async def entities_async(self) -> List[str]:
|
|
1964
|
+
"""List of entity uuids."""
|
|
1965
|
+
return await self.get_field_values_async("fmu.entity.uuid.keyword")
|
|
1966
|
+
|
|
1931
1967
|
|
|
1932
1968
|
def _gen_filter_doc(spec):
|
|
1933
1969
|
fmap = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
fmu/__init__.py,sha256=ftS-xRPSH-vU7fIHlnZQaCTWbNvs4owJivNW65kzsIM,85
|
|
2
2
|
fmu/sumo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
3
|
fmu/sumo/explorer/__init__.py,sha256=Bc1wd1lQO3HP3tsVyPbqaesf2boZwGdtookWp8lmG-k,317
|
|
4
|
-
fmu/sumo/explorer/_version.py,sha256=
|
|
4
|
+
fmu/sumo/explorer/_version.py,sha256=RUYmq8GFeP2I_XyABp0HnMjSBqGntVVhgCtP72xF2Nk,511
|
|
5
5
|
fmu/sumo/explorer/cache.py,sha256=uvz8TciwBnDEwJIHa9wneC0WVWuzhUqyF3dzk4kvGNk,1037
|
|
6
6
|
fmu/sumo/explorer/explorer.py,sha256=_3nUTO1E_nf6jqpivjgjKcX6rX1fx_mIG76YOM8xb-8,2931
|
|
7
7
|
fmu/sumo/explorer/filters.py,sha256=_t2PmHeTY9XiBvQeEGM-BpudWUaxIfyUSdNyG70xfRU,875
|
|
@@ -9,8 +9,8 @@ fmu/sumo/explorer/timefilter.py,sha256=AQHa18vkCz2BzH7X9GR1ypmNxfvI4gExh_jxAVYrD
|
|
|
9
9
|
fmu/sumo/explorer/objects/__init__.py,sha256=72G0yfWWMTXA-oZw5GMRkrWvQqAYfadjerEwsyndCzc,637
|
|
10
10
|
fmu/sumo/explorer/objects/_child.py,sha256=Cq2jmjRjJDjh0hwy_lKWhPdvkuoMqx6UoHFIcmAJ7OA,5905
|
|
11
11
|
fmu/sumo/explorer/objects/_document.py,sha256=uPAkNzcOk8U4LCtXthWkm7kfU9W4HYHrrqV9HERDhe8,1835
|
|
12
|
-
fmu/sumo/explorer/objects/_metrics.py,sha256=
|
|
13
|
-
fmu/sumo/explorer/objects/_search_context.py,sha256=
|
|
12
|
+
fmu/sumo/explorer/objects/_metrics.py,sha256=WITAFAV-3VRd-AqTg0tUwWpOChW4YFfF8ffT2fvOrAo,8144
|
|
13
|
+
fmu/sumo/explorer/objects/_search_context.py,sha256=a8RTE9mlNvHVdXbMMCsv6RF9PzYn4d4JnJZQONkuFKE,63840
|
|
14
14
|
fmu/sumo/explorer/objects/case.py,sha256=fKp7X43ETLE1RaH3rMYxZiIuduRmf0JSnJ5gRoUgNPE,3813
|
|
15
15
|
fmu/sumo/explorer/objects/cases.py,sha256=i2bnvk7NWIkzbdWMs3BXU7TCqD5tH2r7pg1m1QXUj3o,561
|
|
16
16
|
fmu/sumo/explorer/objects/cpgrid.py,sha256=nuRgZ6FVEOPZT1ibd-rJhlbYYZ6BuUxXZPzovcH0kVc,2548
|
|
@@ -26,8 +26,8 @@ fmu/sumo/explorer/objects/realization.py,sha256=Th3zr_nT2I1HYHkBojOAKnf_RSIPc-Ti
|
|
|
26
26
|
fmu/sumo/explorer/objects/realizations.py,sha256=4agtQFJ5pxLyWMeIzdJbkBMc8__Md-tZOj8Un4ol22c,1562
|
|
27
27
|
fmu/sumo/explorer/objects/surface.py,sha256=zHBtjLCIfkRHBv39OeJjA9lq3puLTfTII6TndZTtxVI,1627
|
|
28
28
|
fmu/sumo/explorer/objects/table.py,sha256=vLor3YTddHkDWZSMyWPQsddFNQ2_VXE_O-stmPIWIaQ,4900
|
|
29
|
-
fmu_sumo-2.4.
|
|
30
|
-
fmu_sumo-2.4.
|
|
31
|
-
fmu_sumo-2.4.
|
|
32
|
-
fmu_sumo-2.4.
|
|
33
|
-
fmu_sumo-2.4.
|
|
29
|
+
fmu_sumo-2.4.2.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
30
|
+
fmu_sumo-2.4.2.dist-info/METADATA,sha256=z6Zm-yb_u2nBsS8WxunvbyaNEglVsNhKU155I2VHGIc,14780
|
|
31
|
+
fmu_sumo-2.4.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
32
|
+
fmu_sumo-2.4.2.dist-info/top_level.txt,sha256=Z-FIY3pxn0UK2Wxi9IJ7fKoLSraaxuNGi1eokiE0ShM,4
|
|
33
|
+
fmu_sumo-2.4.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|