pylegend 0.12.0__py3-none-any.whl → 0.13.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.
- pylegend/core/database/sql_to_string/db_extension.py +177 -1
- pylegend/core/language/shared/expression.py +5 -0
- pylegend/core/language/shared/literal_expressions.py +22 -1
- pylegend/core/language/shared/operations/boolean_operation_expressions.py +144 -0
- pylegend/core/language/shared/operations/date_operation_expressions.py +91 -0
- pylegend/core/language/shared/operations/integer_operation_expressions.py +183 -1
- pylegend/core/language/shared/operations/string_operation_expressions.py +31 -1
- pylegend/core/language/shared/primitives/boolean.py +40 -0
- pylegend/core/language/shared/primitives/date.py +39 -0
- pylegend/core/language/shared/primitives/datetime.py +18 -0
- pylegend/core/language/shared/primitives/integer.py +54 -1
- pylegend/core/language/shared/primitives/strictdate.py +25 -1
- pylegend/core/language/shared/primitives/string.py +16 -2
- pylegend/core/sql/metamodel.py +50 -1
- pylegend/core/sql/metamodel_extension.py +77 -1
- pylegend/core/tds/pandas_api/frames/functions/iloc.py +99 -0
- pylegend/core/tds/pandas_api/frames/functions/loc.py +136 -0
- pylegend/core/tds/pandas_api/frames/pandas_api_base_tds_frame.py +40 -0
- pylegend/core/tds/pandas_api/frames/pandas_api_tds_frame.py +12 -0
- {pylegend-0.12.0.dist-info → pylegend-0.13.0.dist-info}/METADATA +1 -1
- {pylegend-0.12.0.dist-info → pylegend-0.13.0.dist-info}/RECORD +25 -23
- {pylegend-0.12.0.dist-info → pylegend-0.13.0.dist-info}/WHEEL +1 -1
- {pylegend-0.12.0.dist-info → pylegend-0.13.0.dist-info}/licenses/LICENSE +0 -0
- {pylegend-0.12.0.dist-info → pylegend-0.13.0.dist-info}/licenses/LICENSE.spdx +0 -0
- {pylegend-0.12.0.dist-info → pylegend-0.13.0.dist-info}/licenses/NOTICE +0 -0
|
@@ -20,6 +20,7 @@ from pylegend._typing import (
|
|
|
20
20
|
from pylegend.core.sql.metamodel import (
|
|
21
21
|
Expression,
|
|
22
22
|
Window,
|
|
23
|
+
StringLiteral,
|
|
23
24
|
)
|
|
24
25
|
|
|
25
26
|
__all__: PyLegendSequence[str] = [
|
|
@@ -81,7 +82,12 @@ __all__: PyLegendSequence[str] = [
|
|
|
81
82
|
"EpochExpression",
|
|
82
83
|
"WindowExpression",
|
|
83
84
|
"ConstantExpression",
|
|
84
|
-
"StringSubStringExpression"
|
|
85
|
+
"StringSubStringExpression",
|
|
86
|
+
"DateAdjustExpression",
|
|
87
|
+
"BitwiseNotExpression",
|
|
88
|
+
"DateDiffExpression",
|
|
89
|
+
"DateTimeBucketExpression",
|
|
90
|
+
"DateType"
|
|
85
91
|
]
|
|
86
92
|
|
|
87
93
|
|
|
@@ -763,3 +769,73 @@ class StringSubStringExpression(Expression):
|
|
|
763
769
|
self.value = value
|
|
764
770
|
self.start = start
|
|
765
771
|
self.end = end
|
|
772
|
+
|
|
773
|
+
|
|
774
|
+
class DateAdjustExpression(Expression):
|
|
775
|
+
date: "Expression"
|
|
776
|
+
number: "Expression"
|
|
777
|
+
duration_unit: "StringLiteral"
|
|
778
|
+
|
|
779
|
+
def __init__(
|
|
780
|
+
self,
|
|
781
|
+
date: "Expression",
|
|
782
|
+
number: "Expression",
|
|
783
|
+
duration_unit: "StringLiteral",
|
|
784
|
+
) -> None:
|
|
785
|
+
super().__init__(_type="dateAdjustExpression")
|
|
786
|
+
self.date = date
|
|
787
|
+
self.number = number
|
|
788
|
+
self.duration_unit = duration_unit
|
|
789
|
+
|
|
790
|
+
|
|
791
|
+
class DateDiffExpression(Expression):
|
|
792
|
+
start_date: "Expression"
|
|
793
|
+
end_date: "Expression"
|
|
794
|
+
duration_unit: "StringLiteral"
|
|
795
|
+
|
|
796
|
+
def __init__(
|
|
797
|
+
self,
|
|
798
|
+
start_date: "Expression",
|
|
799
|
+
end_date: "Expression",
|
|
800
|
+
duration_unit: "StringLiteral",
|
|
801
|
+
) -> None:
|
|
802
|
+
super().__init__(_type="dateDiffExpression")
|
|
803
|
+
self.start_date = start_date
|
|
804
|
+
self.end_date = end_date
|
|
805
|
+
self.duration_unit = duration_unit
|
|
806
|
+
|
|
807
|
+
|
|
808
|
+
class DateType(Enum):
|
|
809
|
+
DateTime = 1
|
|
810
|
+
StrictDate = 2
|
|
811
|
+
|
|
812
|
+
|
|
813
|
+
class DateTimeBucketExpression(Expression):
|
|
814
|
+
date: "Expression"
|
|
815
|
+
quantity: "Expression"
|
|
816
|
+
duration_unit: "StringLiteral"
|
|
817
|
+
date_type: DateType
|
|
818
|
+
|
|
819
|
+
def __init__(
|
|
820
|
+
self,
|
|
821
|
+
date: "Expression",
|
|
822
|
+
quantity: "Expression",
|
|
823
|
+
duration_unit: "StringLiteral",
|
|
824
|
+
date_type: DateType = DateType.DateTime,
|
|
825
|
+
) -> None:
|
|
826
|
+
super().__init__(_type="dateTimeBucketExpression")
|
|
827
|
+
self.date = date
|
|
828
|
+
self.quantity = quantity
|
|
829
|
+
self.duration_unit = duration_unit
|
|
830
|
+
self.date_type = date_type
|
|
831
|
+
|
|
832
|
+
|
|
833
|
+
class BitwiseNotExpression(Expression):
|
|
834
|
+
value: "Expression"
|
|
835
|
+
|
|
836
|
+
def __init__(
|
|
837
|
+
self,
|
|
838
|
+
value: "Expression",
|
|
839
|
+
) -> None:
|
|
840
|
+
super().__init__(_type="bitwiseNotExpression")
|
|
841
|
+
self.value = value
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Copyright 2026 Goldman Sachs
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from typing import TYPE_CHECKING
|
|
16
|
+
from pylegend._typing import (
|
|
17
|
+
PyLegendUnion,
|
|
18
|
+
PyLegendTuple,
|
|
19
|
+
PyLegendSequence,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from pylegend.core.tds.pandas_api.frames.pandas_api_base_tds_frame import PandasApiBaseTdsFrame
|
|
24
|
+
from pylegend.core.tds.pandas_api.frames.pandas_api_tds_frame import PandasApiTdsFrame
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
__all__: PyLegendSequence[str] = [
|
|
28
|
+
"PandasApiIlocIndexer"
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class PandasApiIlocIndexer:
|
|
33
|
+
_frame: "PandasApiBaseTdsFrame"
|
|
34
|
+
|
|
35
|
+
def __init__(self, frame: "PandasApiBaseTdsFrame") -> None:
|
|
36
|
+
self._frame = frame
|
|
37
|
+
|
|
38
|
+
def __getitem__( # type: ignore
|
|
39
|
+
self,
|
|
40
|
+
key: PyLegendUnion[int, slice, PyLegendTuple[PyLegendUnion[int, slice], ...]]
|
|
41
|
+
) -> "PandasApiTdsFrame":
|
|
42
|
+
if isinstance(key, tuple):
|
|
43
|
+
if len(key) > 2:
|
|
44
|
+
raise IndexError("Too many indexers")
|
|
45
|
+
elif len(key) == 1:
|
|
46
|
+
rows, cols = key[0], slice(None, None, None)
|
|
47
|
+
else:
|
|
48
|
+
rows, cols = key # type: ignore
|
|
49
|
+
else:
|
|
50
|
+
rows, cols = key, slice(None, None, None)
|
|
51
|
+
|
|
52
|
+
# Row selection
|
|
53
|
+
row_frame = self._handle_row_selection(rows)
|
|
54
|
+
|
|
55
|
+
# Column selection
|
|
56
|
+
return self._handle_column_selection(row_frame, cols)
|
|
57
|
+
|
|
58
|
+
def _handle_row_selection(self, rows: PyLegendUnion[int, slice]) -> "PandasApiTdsFrame": # type: ignore
|
|
59
|
+
if isinstance(rows, slice):
|
|
60
|
+
if rows.step is not None and rows.step != 1:
|
|
61
|
+
raise NotImplementedError("iloc with slice step other than 1 is not supported yet in Pandas Api")
|
|
62
|
+
|
|
63
|
+
start = rows.start
|
|
64
|
+
stop = rows.stop
|
|
65
|
+
after = stop - 1 if stop is not None else None
|
|
66
|
+
return self._frame.truncate(before=start, after=after)
|
|
67
|
+
|
|
68
|
+
elif isinstance(rows, int):
|
|
69
|
+
return self._frame.truncate(before=rows, after=rows)
|
|
70
|
+
|
|
71
|
+
else:
|
|
72
|
+
raise NotImplementedError(
|
|
73
|
+
f"iloc supports integer, slice, or tuple of these, but got indexer of type: {type(rows)}"
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
def _handle_column_selection( # type: ignore
|
|
77
|
+
self,
|
|
78
|
+
frame: "PandasApiTdsFrame",
|
|
79
|
+
cols: PyLegendUnion[int, slice]
|
|
80
|
+
) -> "PandasApiTdsFrame":
|
|
81
|
+
if isinstance(cols, slice):
|
|
82
|
+
if cols.step is not None and cols.step != 1:
|
|
83
|
+
raise NotImplementedError("iloc with slice step other than 1 is not supported yet in Pandas Api")
|
|
84
|
+
|
|
85
|
+
all_columns = [c.get_name() for c in frame.columns()]
|
|
86
|
+
selected_columns = all_columns[cols]
|
|
87
|
+
return frame.filter(items=selected_columns)
|
|
88
|
+
|
|
89
|
+
elif isinstance(cols, int):
|
|
90
|
+
all_columns = [c.get_name() for c in frame.columns()]
|
|
91
|
+
if not -len(all_columns) <= cols < len(all_columns):
|
|
92
|
+
raise IndexError("single positional indexer is out-of-bounds")
|
|
93
|
+
selected_column = all_columns[cols]
|
|
94
|
+
return frame.filter(items=[selected_column])
|
|
95
|
+
|
|
96
|
+
else:
|
|
97
|
+
raise NotImplementedError(
|
|
98
|
+
f"iloc supports integer, slice, or tuple of these, but got indexer of type: {type(cols)}"
|
|
99
|
+
)
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# Copyright 2026 Goldman Sachs
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from typing import TYPE_CHECKING
|
|
16
|
+
|
|
17
|
+
import pandas as pd
|
|
18
|
+
|
|
19
|
+
from pylegend._typing import (
|
|
20
|
+
PyLegendUnion,
|
|
21
|
+
PyLegendSequence,
|
|
22
|
+
PyLegendTuple,
|
|
23
|
+
PyLegendCallable
|
|
24
|
+
)
|
|
25
|
+
from pylegend.core.language import PyLegendBoolean
|
|
26
|
+
from pylegend.core.tds.pandas_api.frames.functions.filtering import PandasApiFilteringFunction
|
|
27
|
+
from pylegend.core.tds.pandas_api.frames.pandas_api_applied_function_tds_frame import PandasApiAppliedFunctionTdsFrame
|
|
28
|
+
|
|
29
|
+
if TYPE_CHECKING:
|
|
30
|
+
from pylegend.core.tds.pandas_api.frames.pandas_api_base_tds_frame import PandasApiBaseTdsFrame
|
|
31
|
+
from pylegend.core.tds.pandas_api.frames.pandas_api_tds_frame import PandasApiTdsFrame
|
|
32
|
+
|
|
33
|
+
__all__: PyLegendSequence[str] = [
|
|
34
|
+
"PandasApiLocIndexer"
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class PandasApiLocIndexer:
|
|
39
|
+
_frame: "PandasApiBaseTdsFrame"
|
|
40
|
+
|
|
41
|
+
def __init__(self, frame: "PandasApiBaseTdsFrame") -> None:
|
|
42
|
+
self._frame = frame
|
|
43
|
+
|
|
44
|
+
def __getitem__( # type: ignore
|
|
45
|
+
self,
|
|
46
|
+
key: PyLegendUnion[
|
|
47
|
+
slice,
|
|
48
|
+
PyLegendBoolean,
|
|
49
|
+
PyLegendCallable[["PandasApiBaseTdsFrame"], PyLegendBoolean],
|
|
50
|
+
PyLegendTuple[
|
|
51
|
+
PyLegendUnion[slice, PyLegendBoolean, PyLegendCallable[["PandasApiBaseTdsFrame"], PyLegendBoolean]],
|
|
52
|
+
PyLegendUnion[str, slice, PyLegendSequence[str], PyLegendSequence[bool]]
|
|
53
|
+
]
|
|
54
|
+
]
|
|
55
|
+
) -> "PandasApiTdsFrame":
|
|
56
|
+
rows: PyLegendUnion[ # type: ignore
|
|
57
|
+
slice,
|
|
58
|
+
PyLegendBoolean,
|
|
59
|
+
PyLegendCallable[["PandasApiBaseTdsFrame"], PyLegendBoolean]
|
|
60
|
+
]
|
|
61
|
+
cols: PyLegendUnion[str, slice, PyLegendSequence[str], PyLegendSequence[bool]] # type: ignore
|
|
62
|
+
|
|
63
|
+
if isinstance(key, tuple):
|
|
64
|
+
if len(key) == 1:
|
|
65
|
+
rows, cols = key[0], slice(None, None, None)
|
|
66
|
+
elif len(key) == 2:
|
|
67
|
+
rows, cols = key[0], key[1]
|
|
68
|
+
else:
|
|
69
|
+
raise IndexError("Too many indexers")
|
|
70
|
+
else:
|
|
71
|
+
rows, cols = key, slice(None, None, None)
|
|
72
|
+
|
|
73
|
+
row_frame = self._handle_row_selection(rows)
|
|
74
|
+
return self._handle_column_selection(row_frame, cols)
|
|
75
|
+
|
|
76
|
+
def _handle_row_selection( # type: ignore
|
|
77
|
+
self,
|
|
78
|
+
rows: PyLegendUnion[slice, PyLegendBoolean, PyLegendCallable[["PandasApiBaseTdsFrame"], PyLegendBoolean]]
|
|
79
|
+
) -> "PandasApiTdsFrame":
|
|
80
|
+
if isinstance(rows, slice):
|
|
81
|
+
if rows.start is None and rows.stop is None and rows.step is None:
|
|
82
|
+
return self._frame
|
|
83
|
+
else:
|
|
84
|
+
raise TypeError(
|
|
85
|
+
"loc supports only ':' for row slicing. "
|
|
86
|
+
"Label-based slicing for rows is not supported."
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
if isinstance(rows, PyLegendBoolean):
|
|
90
|
+
return PandasApiAppliedFunctionTdsFrame(
|
|
91
|
+
PandasApiFilteringFunction(self._frame, filter_expr=rows)
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
if callable(rows):
|
|
95
|
+
new_key = rows(self._frame)
|
|
96
|
+
return self._handle_row_selection(new_key)
|
|
97
|
+
|
|
98
|
+
raise TypeError(f"Unsupported key type for .loc row selection: {type(rows)}")
|
|
99
|
+
|
|
100
|
+
def _handle_column_selection( # type: ignore
|
|
101
|
+
self,
|
|
102
|
+
frame: "PandasApiTdsFrame",
|
|
103
|
+
cols: PyLegendUnion[str, slice, PyLegendSequence[str], PyLegendSequence[bool]]
|
|
104
|
+
) -> "PandasApiTdsFrame":
|
|
105
|
+
if isinstance(cols, slice) and cols.start is None and cols.stop is None and cols.step is None:
|
|
106
|
+
return frame
|
|
107
|
+
|
|
108
|
+
if isinstance(cols, str):
|
|
109
|
+
return frame.filter(items=[cols])
|
|
110
|
+
|
|
111
|
+
if isinstance(cols, (list, tuple)):
|
|
112
|
+
all_columns = [c.get_name() for c in frame.columns()]
|
|
113
|
+
is_boolean_list = all(isinstance(k, bool) for k in cols)
|
|
114
|
+
|
|
115
|
+
if is_boolean_list:
|
|
116
|
+
if len(cols) != len(all_columns):
|
|
117
|
+
raise IndexError(f"Boolean index has wrong length: {len(cols)} instead of {len(all_columns)}")
|
|
118
|
+
selected_columns = [col for col, select in zip(all_columns, cols) if select]
|
|
119
|
+
return frame.filter(items=selected_columns)
|
|
120
|
+
else:
|
|
121
|
+
missing_cols = [c for c in cols if c not in all_columns]
|
|
122
|
+
if missing_cols:
|
|
123
|
+
raise KeyError(f"{missing_cols} not in index")
|
|
124
|
+
return frame.filter(items=cols) # type: ignore
|
|
125
|
+
|
|
126
|
+
if isinstance(cols, slice):
|
|
127
|
+
all_columns = [c.get_name() for c in frame.columns()]
|
|
128
|
+
pd_index = pd.Index(all_columns)
|
|
129
|
+
|
|
130
|
+
slicer = pd_index.slice_indexer(start=cols.start, end=cols.stop, step=cols.step)
|
|
131
|
+
selected_columns = pd_index[slicer].tolist()
|
|
132
|
+
if not selected_columns:
|
|
133
|
+
return frame.head(0)
|
|
134
|
+
return frame.filter(items=selected_columns)
|
|
135
|
+
|
|
136
|
+
raise TypeError(f"Unsupported key type for .loc column selection: {type(cols)}")
|
|
@@ -69,6 +69,8 @@ from pylegend.extensions.tds.result_handler import (
|
|
|
69
69
|
if TYPE_CHECKING:
|
|
70
70
|
from pylegend.core.language.pandas_api.pandas_api_series import Series
|
|
71
71
|
from pylegend.core.tds.pandas_api.frames.pandas_api_groupby_tds_frame import PandasApiGroupbyTdsFrame
|
|
72
|
+
from pylegend.core.tds.pandas_api.frames.functions.iloc import PandasApiIlocIndexer
|
|
73
|
+
from pylegend.core.tds.pandas_api.frames.functions.loc import PandasApiLocIndexer
|
|
72
74
|
|
|
73
75
|
__all__: PyLegendSequence[str] = [
|
|
74
76
|
"PandasApiBaseTdsFrame"
|
|
@@ -675,6 +677,44 @@ class PandasApiBaseTdsFrame(PandasApiTdsFrame, BaseTdsFrame, metaclass=ABCMeta):
|
|
|
675
677
|
AssignFunction(self, col_definitions=col_definitions) # type: ignore
|
|
676
678
|
)
|
|
677
679
|
|
|
680
|
+
@property
|
|
681
|
+
def iloc(self) -> "PandasApiIlocIndexer":
|
|
682
|
+
"""
|
|
683
|
+
Purely integer-location based indexing for selection by position.
|
|
684
|
+
.iloc[] is primarily integer position based (from 0 to length-1 of the axis).
|
|
685
|
+
|
|
686
|
+
Allowed inputs are:
|
|
687
|
+
- An integer, e.g. 5.
|
|
688
|
+
- A slice object with ints, e.g. 1:7.
|
|
689
|
+
- A tuple of row and column indexes, e.g., (slice(1, 5), slice(0, 2))
|
|
690
|
+
|
|
691
|
+
Other pandas iloc features such as list of integers, boolean arrays, and callables
|
|
692
|
+
are not supported and will raise a NotImplementedError.
|
|
693
|
+
"""
|
|
694
|
+
from pylegend.core.tds.pandas_api.frames.functions.iloc import PandasApiIlocIndexer
|
|
695
|
+
return PandasApiIlocIndexer(self)
|
|
696
|
+
|
|
697
|
+
@property
|
|
698
|
+
def loc(self) -> "PandasApiLocIndexer":
|
|
699
|
+
"""
|
|
700
|
+
Access a group of rows and columns by label(s) or a boolean array.
|
|
701
|
+
.loc[] is primarily label based, but may also be used with a boolean array.
|
|
702
|
+
|
|
703
|
+
Allowed inputs are:
|
|
704
|
+
- A single label, e.g. 5 or 'a', (note that 5 is interpreted as a
|
|
705
|
+
label of the index, not as an integer position along the index).
|
|
706
|
+
- A list or array of labels, e.g. ['a', 'b', 'c'].
|
|
707
|
+
- A slice object with labels, e.g. 'a':'f'.
|
|
708
|
+
- A boolean array of the same length as the axis being sliced.
|
|
709
|
+
- A callable function with one argument (the calling Series or
|
|
710
|
+
DataFrame) and that returns valid output for indexing (one of the above).
|
|
711
|
+
|
|
712
|
+
Currently, for row selection, only callable function or complete slice are supported.
|
|
713
|
+
For column selection, string labels, lists of string labels, and slices of string labels are supported.
|
|
714
|
+
"""
|
|
715
|
+
from pylegend.core.tds.pandas_api.frames.functions.loc import PandasApiLocIndexer
|
|
716
|
+
return PandasApiLocIndexer(self)
|
|
717
|
+
|
|
678
718
|
def head(self, n: int = 5) -> "PandasApiTdsFrame":
|
|
679
719
|
"""
|
|
680
720
|
Return the first `n` rows by calling truncate on rows.
|
|
@@ -47,6 +47,8 @@ from pylegend.core.tds.tds_frame import PyLegendTdsFrame
|
|
|
47
47
|
if TYPE_CHECKING:
|
|
48
48
|
from pylegend.core.language.pandas_api.pandas_api_series import Series
|
|
49
49
|
from pylegend.core.tds.pandas_api.frames.pandas_api_groupby_tds_frame import PandasApiGroupbyTdsFrame
|
|
50
|
+
from pylegend.core.tds.pandas_api.frames.functions.iloc import PandasApiIlocIndexer
|
|
51
|
+
from pylegend.core.tds.pandas_api.frames.functions.loc import PandasApiLocIndexer
|
|
50
52
|
|
|
51
53
|
__all__: PyLegendSequence[str] = [
|
|
52
54
|
"PandasApiTdsFrame"
|
|
@@ -301,6 +303,16 @@ class PandasApiTdsFrame(PyLegendTdsFrame):
|
|
|
301
303
|
) -> "PandasApiTdsFrame":
|
|
302
304
|
pass # pragma: no cover
|
|
303
305
|
|
|
306
|
+
@property
|
|
307
|
+
@abstractmethod
|
|
308
|
+
def iloc(self) -> "PandasApiIlocIndexer":
|
|
309
|
+
pass # pragma: no cover
|
|
310
|
+
|
|
311
|
+
@property
|
|
312
|
+
@abstractmethod
|
|
313
|
+
def loc(self) -> "PandasApiLocIndexer":
|
|
314
|
+
pass # pragma: no cover
|
|
315
|
+
|
|
304
316
|
@abstractmethod
|
|
305
317
|
def head(self, n: int = 5) -> "PandasApiTdsFrame":
|
|
306
318
|
pass # pragma: no cover
|
|
@@ -4,7 +4,7 @@ pylegend/core/__init__.py,sha256=LXTDJSDmHQXtnMDZouhZp9IZQVpY6ONkINbUYjtnMkE,578
|
|
|
4
4
|
pylegend/core/database/__init__.py,sha256=LXTDJSDmHQXtnMDZouhZp9IZQVpY6ONkINbUYjtnMkE,578
|
|
5
5
|
pylegend/core/database/sql_to_string/__init__.py,sha256=_qWOoReR9ygprnShQRBtp4wFmqtiPEa88jAhOZpYY2c,1028
|
|
6
6
|
pylegend/core/database/sql_to_string/config.py,sha256=xrwPFcuZyzZcKNGeOQTnFW2y7CqhT6laSAazVl93JLU,1384
|
|
7
|
-
pylegend/core/database/sql_to_string/db_extension.py,sha256=
|
|
7
|
+
pylegend/core/database/sql_to_string/db_extension.py,sha256=Mt1uCgub9ChjF2k151Ybthr_KO0VoyrqULYPAlkpZA0,62530
|
|
8
8
|
pylegend/core/database/sql_to_string/generator.py,sha256=xk3siXWyR7_ahn6pwsUMi80V_7NV2tYa7x5dosiNJR4,2607
|
|
9
9
|
pylegend/core/language/__init__.py,sha256=sw70dEA5RT660Qmpjxdi1XKEWDwshuedomqHhyIJpvI,4331
|
|
10
10
|
pylegend/core/language/legacy_api/__init__.py,sha256=g6w4WCuQ2pqQG6yyn-QLLXED3ttOOB8YnXzVt3ijb28,578
|
|
@@ -20,35 +20,35 @@ pylegend/core/language/pandas_api/pandas_api_series.py,sha256=WJ--FaWeODIvS26REr
|
|
|
20
20
|
pylegend/core/language/pandas_api/pandas_api_tds_row.py,sha256=L0O5BLok3KqmzUgXFfM2fQgrpAxCfQ74bOplnetjyvw,2516
|
|
21
21
|
pylegend/core/language/shared/__init__.py,sha256=g6w4WCuQ2pqQG6yyn-QLLXED3ttOOB8YnXzVt3ijb28,578
|
|
22
22
|
pylegend/core/language/shared/column_expressions.py,sha256=qWHVvwPGwKroQX94a_ovUrxCPnosVMX3tBWlTj7uJ6k,4333
|
|
23
|
-
pylegend/core/language/shared/expression.py,sha256
|
|
23
|
+
pylegend/core/language/shared/expression.py,sha256=SvLI6GxzvjSpy21NIB4ZyPLKGIR7y9CN5lV-I5zGklw,2567
|
|
24
24
|
pylegend/core/language/shared/functions.py,sha256=HT1Qp5pLV3a24aItXqBnGfKT54f6Uw_pu5oGSzWTGL4,1749
|
|
25
25
|
pylegend/core/language/shared/helpers.py,sha256=E7IKZwb__qj4_JpoBT2cra_umvfKP58c5U5bygMqh_o,2379
|
|
26
|
-
pylegend/core/language/shared/literal_expressions.py,sha256=
|
|
26
|
+
pylegend/core/language/shared/literal_expressions.py,sha256=DqbHBOTMYD0PDXdZzuAOVXNfeMnqaEWFEHvgeDzZsF8,6877
|
|
27
27
|
pylegend/core/language/shared/operations/__init__.py,sha256=LXTDJSDmHQXtnMDZouhZp9IZQVpY6ONkINbUYjtnMkE,578
|
|
28
28
|
pylegend/core/language/shared/operations/binary_expression.py,sha256=I3CIWwbKlKq1R8ekUXY8QKyHro8b7fIgeM8hTPwN5jA,4006
|
|
29
|
-
pylegend/core/language/shared/operations/boolean_operation_expressions.py,sha256=
|
|
29
|
+
pylegend/core/language/shared/operations/boolean_operation_expressions.py,sha256=jOs_b-Clt4Jij9Z-Xt1YLQ-xaDmZGosfRRzSiRvtgJk,10309
|
|
30
30
|
pylegend/core/language/shared/operations/collection_operation_expressions.py,sha256=PuyICSjPadQNWkp8aZnCZblRnG_uh7lPEXMDN9nwKRI,22412
|
|
31
|
-
pylegend/core/language/shared/operations/date_operation_expressions.py,sha256=
|
|
31
|
+
pylegend/core/language/shared/operations/date_operation_expressions.py,sha256=CiWBJIyyMu-u7c3Ho-wOCjcqzpm5hvyYthS7F8udsg8,31507
|
|
32
32
|
pylegend/core/language/shared/operations/float_operation_expressions.py,sha256=GsKflYlswzfvb2eEqObRgcoO218zdNj3atS-5g8YzJI,6849
|
|
33
|
-
pylegend/core/language/shared/operations/integer_operation_expressions.py,sha256=
|
|
33
|
+
pylegend/core/language/shared/operations/integer_operation_expressions.py,sha256=VsI5pQEya_XWmAvmRvmr97HJB_R2XZSJS6qypE-NBEI,16817
|
|
34
34
|
pylegend/core/language/shared/operations/nary_expression.py,sha256=GXqsmpR_Jb_SothvIXWeQ6lJp03SKwEA2zqL-JomlNc,3663
|
|
35
35
|
pylegend/core/language/shared/operations/nullary_expression.py,sha256=dMq3hi7_t0TFboOoQQHjuNZ7D9hLYfc_NozNaUCJTtI,2242
|
|
36
36
|
pylegend/core/language/shared/operations/number_operation_expressions.py,sha256=EK0_T0_AY2bBK-A4yXoHmDsXTnshVP6lz_JLPl4w7Ds,39376
|
|
37
37
|
pylegend/core/language/shared/operations/primitive_operation_expressions.py,sha256=BdnxYxD0qnBzKppA9GJC1V9FDhGjyh1uuauRX8UObx0,6365
|
|
38
|
-
pylegend/core/language/shared/operations/string_operation_expressions.py,sha256
|
|
38
|
+
pylegend/core/language/shared/operations/string_operation_expressions.py,sha256=-HNYQTdA8L9D3-FXztqGsvK3JQ2konMwkGyvFyRjpcE,45507
|
|
39
39
|
pylegend/core/language/shared/operations/unary_expression.py,sha256=1VWE43rN4x4NLc6aL3xRzleK9c_UfrLawlyYgX3SG48,3132
|
|
40
40
|
pylegend/core/language/shared/pct_helpers.py,sha256=tQo0BkaPro8Tqc3Tt2hmMrQOLsf4Ra0ENgDRQOhZe1I,1998
|
|
41
41
|
pylegend/core/language/shared/primitive_collection.py,sha256=ShUtgdZkZ8cKdQJLP5iU_zYDK7piMzWlimvjhnyfnGk,13098
|
|
42
42
|
pylegend/core/language/shared/primitives/__init__.py,sha256=9p7VVRhzeRQwTkxXQBBZuJY6P9V-yX0Q_elviaYIgPg,1649
|
|
43
|
-
pylegend/core/language/shared/primitives/boolean.py,sha256=
|
|
44
|
-
pylegend/core/language/shared/primitives/date.py,sha256=
|
|
45
|
-
pylegend/core/language/shared/primitives/datetime.py,sha256=
|
|
43
|
+
pylegend/core/language/shared/primitives/boolean.py,sha256=94HG7VxSBOD20xYyLZT314c8s7yuMwmERIf2CxokBr0,6127
|
|
44
|
+
pylegend/core/language/shared/primitives/date.py,sha256=_qYAqIiTGv6Pr-Xcd2JznKUQ0lRGvicAHuylgmhrCck,11249
|
|
45
|
+
pylegend/core/language/shared/primitives/datetime.py,sha256=HnmsRM1kgwVHtiqiPWIV9ecyo_7m7l9Ps8GKvZqBf1A,3464
|
|
46
46
|
pylegend/core/language/shared/primitives/float.py,sha256=LpD3nWogv8aT6RECgI7rVmsRPY4ji96JCXdTEAr2EAg,6146
|
|
47
|
-
pylegend/core/language/shared/primitives/integer.py,sha256=
|
|
47
|
+
pylegend/core/language/shared/primitives/integer.py,sha256=OxLTeJhlkwWY7KQN8ofpkUEP-9XZtKmmAmwIxhz7Mqo,10631
|
|
48
48
|
pylegend/core/language/shared/primitives/number.py,sha256=aktoWf4sgc8evO8f9cUYbPVPjHeppKzJ_Jw_wIUakUE,14816
|
|
49
49
|
pylegend/core/language/shared/primitives/primitive.py,sha256=ARWpw7AXxg55ni7yGRYCO6JKxzgJnME_ZZcKyD-J5qo,4815
|
|
50
|
-
pylegend/core/language/shared/primitives/strictdate.py,sha256=
|
|
51
|
-
pylegend/core/language/shared/primitives/string.py,sha256=
|
|
50
|
+
pylegend/core/language/shared/primitives/strictdate.py,sha256=AXcH9fuWYVe4YO2KCnn2heUTaQ4y6pUM4ulGGLbTpow,3789
|
|
51
|
+
pylegend/core/language/shared/primitives/string.py,sha256=bc0NYsd0oRMfA8w-2PSCO1ATiiIo2yV_hxv7-yOBtGs,16803
|
|
52
52
|
pylegend/core/language/shared/tds_row.py,sha256=23sxVfa74T-TlfAs1CgvwjhV26b-FyZ72yGy9BqP7CE,9027
|
|
53
53
|
pylegend/core/project_cooridnates.py,sha256=t1G6gJzcRQRbCjGpCOk0vBiqd0F8Y_e15Nu4NuzYd6I,3751
|
|
54
54
|
pylegend/core/request/__init__.py,sha256=6jQTL8B8Sd1rsCXHr4dZ398OrvROoGI6Y_aAI_FOfiI,1082
|
|
@@ -57,8 +57,8 @@ pylegend/core/request/legend_client.py,sha256=PLCCiazvFG2ujcHN-vGDQxpEl5QvFHBNNc
|
|
|
57
57
|
pylegend/core/request/response_reader.py,sha256=TNMi2GKk4lkmf7VMeY5n2AwhxxuWbX4M8pgC2_pXFbE,1691
|
|
58
58
|
pylegend/core/request/service_client.py,sha256=oNvMR6qNl5UcxpcAjIb4CCpd0MB3Z-Y5OJSyFPGeerM,3377
|
|
59
59
|
pylegend/core/sql/__init__.py,sha256=LXTDJSDmHQXtnMDZouhZp9IZQVpY6ONkINbUYjtnMkE,578
|
|
60
|
-
pylegend/core/sql/metamodel.py,sha256=
|
|
61
|
-
pylegend/core/sql/metamodel_extension.py,sha256=
|
|
60
|
+
pylegend/core/sql/metamodel.py,sha256=VHJ2C0MVUgWH5k3DF2b2_LJNvK_24MbhefbWHu9v2dQ,21464
|
|
61
|
+
pylegend/core/sql/metamodel_extension.py,sha256=Cwqqzh7do4uPaBb_7xLZFq-3Oh3AtywwHM-OqATYs4Y,18297
|
|
62
62
|
pylegend/core/tds/__init__.py,sha256=LXTDJSDmHQXtnMDZouhZp9IZQVpY6ONkINbUYjtnMkE,578
|
|
63
63
|
pylegend/core/tds/abstract/__init__.py,sha256=g6w4WCuQ2pqQG6yyn-QLLXED3ttOOB8YnXzVt3ijb28,578
|
|
64
64
|
pylegend/core/tds/abstract/frames/__init__.py,sha256=g6w4WCuQ2pqQG6yyn-QLLXED3ttOOB8YnXzVt3ijb28,578
|
|
@@ -119,15 +119,17 @@ pylegend/core/tds/pandas_api/frames/functions/dropna.py,sha256=OVVwUsPSAykm1g-af
|
|
|
119
119
|
pylegend/core/tds/pandas_api/frames/functions/fillna.py,sha256=7XKfIpRlTtoIS1jzfPemOMuytH4njqQ_4GF2UKZliG0,6553
|
|
120
120
|
pylegend/core/tds/pandas_api/frames/functions/filter.py,sha256=TE-OfQqOrBwhS7bKDChsLRTAWOZreZikGQhQPByy8uA,7959
|
|
121
121
|
pylegend/core/tds/pandas_api/frames/functions/filtering.py,sha256=FmzzobMoL-_mt3uFssveGTNCVGo6ZfttXZsj1c56uIo,3181
|
|
122
|
+
pylegend/core/tds/pandas_api/frames/functions/iloc.py,sha256=PEgqcQKyPATh1y1dEIrsVjsc7jUXdZPyE7Z2bAE6bDM,3698
|
|
123
|
+
pylegend/core/tds/pandas_api/frames/functions/loc.py,sha256=ZI0NGcPrDf0XHcf95ow-HHIwZslMAJXk5O7HDssckec,5418
|
|
122
124
|
pylegend/core/tds/pandas_api/frames/functions/merge.py,sha256=bp9a9reNtUAKqaz1Kft3m7wegHKxOmIVoJH135A1iV0,21225
|
|
123
125
|
pylegend/core/tds/pandas_api/frames/functions/rename.py,sha256=afXj8EhsTVUNJAZDFAM_K3VOX5oH3TA2FxSDoZHfT6M,8898
|
|
124
126
|
pylegend/core/tds/pandas_api/frames/functions/sort_values_function.py,sha256=sppDTCW3X0RXLYD2zBvjKEObtc_JfEtoNY7lj-60zqQ,7132
|
|
125
127
|
pylegend/core/tds/pandas_api/frames/functions/truncate_function.py,sha256=VUr9jzVhnU_mJVootUQfcEG8Q66vSJba1QGUGQiYxCk,6214
|
|
126
128
|
pylegend/core/tds/pandas_api/frames/pandas_api_applied_function_tds_frame.py,sha256=u2ONcOw9kP1JJxl2VZH_fKIaqdyY0n9nuIy_p-yQ93g,2967
|
|
127
|
-
pylegend/core/tds/pandas_api/frames/pandas_api_base_tds_frame.py,sha256=
|
|
129
|
+
pylegend/core/tds/pandas_api/frames/pandas_api_base_tds_frame.py,sha256=TnbFtyKwMK261MfWPVC591X4m1xu37xLOd68tvcHnwI,38820
|
|
128
130
|
pylegend/core/tds/pandas_api/frames/pandas_api_groupby_tds_frame.py,sha256=0K4Hb3FPs7ZzlZCWFG-65ZKkqEvHHj_FvE26g9rz7ps,13714
|
|
129
131
|
pylegend/core/tds/pandas_api/frames/pandas_api_input_tds_frame.py,sha256=FgwIJCkawXuIjXYfVVrLa5RHfOO5xnSFI0pXti34L_8,2116
|
|
130
|
-
pylegend/core/tds/pandas_api/frames/pandas_api_tds_frame.py,sha256=
|
|
132
|
+
pylegend/core/tds/pandas_api/frames/pandas_api_tds_frame.py,sha256=vPPtO_zvElaZfa4kgUEOIMnBMe133TNqTGE2DDDyC3M,12233
|
|
131
133
|
pylegend/core/tds/result_handler/__init__.py,sha256=8RE84xfkARwDbaQCvZulXcvDJlI-V5DuJp9RsdaGnqU,1141
|
|
132
134
|
pylegend/core/tds/result_handler/result_handler.py,sha256=7tSzOswFCapAAdACphIR3Q0QISYyjo_On_vtsUIPAbA,1183
|
|
133
135
|
pylegend/core/tds/result_handler/to_csv_file_result_handler.py,sha256=lm0UG87RNUXqQwOtSgxHbLKzAHebNuE3zIXM3ErtOxM,2270
|
|
@@ -169,9 +171,9 @@ pylegend/legacy_api_tds_client.py,sha256=IXfo2pdBFV3M3S4RYKJcvudMc_OGdR0yvJhTV-o
|
|
|
169
171
|
pylegend/legendql_api_tds_client.py,sha256=oS6NET5pAA-hfVhVvwG6sRF7omyBs_gEYSAgA8Tky8U,2357
|
|
170
172
|
pylegend/utils/__init__.py,sha256=LXTDJSDmHQXtnMDZouhZp9IZQVpY6ONkINbUYjtnMkE,578
|
|
171
173
|
pylegend/utils/class_utils.py,sha256=t4PpF3jAXS_D6p9TqlSppryNYNOuy5C-kbKn2Kgb4QU,973
|
|
172
|
-
pylegend-0.
|
|
173
|
-
pylegend-0.
|
|
174
|
-
pylegend-0.
|
|
175
|
-
pylegend-0.
|
|
176
|
-
pylegend-0.
|
|
177
|
-
pylegend-0.
|
|
174
|
+
pylegend-0.13.0.dist-info/METADATA,sha256=AbsE8ssm_7IVkGAoMIkAEv7yHKYsQvNqjnGEy30z7xU,4281
|
|
175
|
+
pylegend-0.13.0.dist-info/WHEEL,sha256=3ny-bZhpXrU6vSQ1UPG34FoxZBp3lVcvK0LkgUz6VLk,88
|
|
176
|
+
pylegend-0.13.0.dist-info/licenses/LICENSE,sha256=AGR96_qQPZO66Gjqq4G6r_g670K35VtW-IobTAkmZJM,11343
|
|
177
|
+
pylegend-0.13.0.dist-info/licenses/LICENSE.spdx,sha256=i7TsBclLotUvMjx9vZ_6S8Pp0r4uknWGw1RwiKBBvQ4,207
|
|
178
|
+
pylegend-0.13.0.dist-info/licenses/NOTICE,sha256=2Lr4FqiscyRI7-vyn7c2z-zqUw2p6x7upJyBvFKkHjk,167
|
|
179
|
+
pylegend-0.13.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|