deepfos 1.1.60__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.
- deepfos/__init__.py +6 -0
- deepfos/_version.py +21 -0
- deepfos/algo/__init__.py +0 -0
- deepfos/algo/graph.py +171 -0
- deepfos/algo/segtree.py +31 -0
- deepfos/api/V1_1/__init__.py +0 -0
- deepfos/api/V1_1/business_model.py +119 -0
- deepfos/api/V1_1/dimension.py +599 -0
- deepfos/api/V1_1/models/__init__.py +0 -0
- deepfos/api/V1_1/models/business_model.py +1033 -0
- deepfos/api/V1_1/models/dimension.py +2768 -0
- deepfos/api/V1_2/__init__.py +0 -0
- deepfos/api/V1_2/dimension.py +285 -0
- deepfos/api/V1_2/models/__init__.py +0 -0
- deepfos/api/V1_2/models/dimension.py +2923 -0
- deepfos/api/__init__.py +0 -0
- deepfos/api/account.py +167 -0
- deepfos/api/accounting_engines.py +147 -0
- deepfos/api/app.py +626 -0
- deepfos/api/approval_process.py +198 -0
- deepfos/api/base.py +983 -0
- deepfos/api/business_model.py +160 -0
- deepfos/api/consolidation.py +129 -0
- deepfos/api/consolidation_process.py +106 -0
- deepfos/api/datatable.py +341 -0
- deepfos/api/deep_pipeline.py +61 -0
- deepfos/api/deepconnector.py +36 -0
- deepfos/api/deepfos_task.py +92 -0
- deepfos/api/deepmodel.py +188 -0
- deepfos/api/dimension.py +486 -0
- deepfos/api/financial_model.py +319 -0
- deepfos/api/journal_model.py +119 -0
- deepfos/api/journal_template.py +132 -0
- deepfos/api/memory_financial_model.py +98 -0
- deepfos/api/models/__init__.py +3 -0
- deepfos/api/models/account.py +483 -0
- deepfos/api/models/accounting_engines.py +756 -0
- deepfos/api/models/app.py +1338 -0
- deepfos/api/models/approval_process.py +1043 -0
- deepfos/api/models/base.py +234 -0
- deepfos/api/models/business_model.py +805 -0
- deepfos/api/models/consolidation.py +711 -0
- deepfos/api/models/consolidation_process.py +248 -0
- deepfos/api/models/datatable_mysql.py +427 -0
- deepfos/api/models/deep_pipeline.py +55 -0
- deepfos/api/models/deepconnector.py +28 -0
- deepfos/api/models/deepfos_task.py +386 -0
- deepfos/api/models/deepmodel.py +308 -0
- deepfos/api/models/dimension.py +1576 -0
- deepfos/api/models/financial_model.py +1796 -0
- deepfos/api/models/journal_model.py +341 -0
- deepfos/api/models/journal_template.py +854 -0
- deepfos/api/models/memory_financial_model.py +478 -0
- deepfos/api/models/platform.py +178 -0
- deepfos/api/models/python.py +221 -0
- deepfos/api/models/reconciliation_engine.py +411 -0
- deepfos/api/models/reconciliation_report.py +161 -0
- deepfos/api/models/role_strategy.py +884 -0
- deepfos/api/models/smartlist.py +237 -0
- deepfos/api/models/space.py +1137 -0
- deepfos/api/models/system.py +1065 -0
- deepfos/api/models/variable.py +463 -0
- deepfos/api/models/workflow.py +946 -0
- deepfos/api/platform.py +199 -0
- deepfos/api/python.py +90 -0
- deepfos/api/reconciliation_engine.py +181 -0
- deepfos/api/reconciliation_report.py +64 -0
- deepfos/api/role_strategy.py +234 -0
- deepfos/api/smartlist.py +69 -0
- deepfos/api/space.py +582 -0
- deepfos/api/system.py +372 -0
- deepfos/api/variable.py +154 -0
- deepfos/api/workflow.py +264 -0
- deepfos/boost/__init__.py +6 -0
- deepfos/boost/py_jstream.py +89 -0
- deepfos/boost/py_pandas.py +20 -0
- deepfos/cache.py +121 -0
- deepfos/config.py +6 -0
- deepfos/core/__init__.py +27 -0
- deepfos/core/cube/__init__.py +10 -0
- deepfos/core/cube/_base.py +462 -0
- deepfos/core/cube/constants.py +21 -0
- deepfos/core/cube/cube.py +408 -0
- deepfos/core/cube/formula.py +707 -0
- deepfos/core/cube/syscube.py +532 -0
- deepfos/core/cube/typing.py +7 -0
- deepfos/core/cube/utils.py +238 -0
- deepfos/core/dimension/__init__.py +11 -0
- deepfos/core/dimension/_base.py +506 -0
- deepfos/core/dimension/dimcreator.py +184 -0
- deepfos/core/dimension/dimension.py +472 -0
- deepfos/core/dimension/dimexpr.py +271 -0
- deepfos/core/dimension/dimmember.py +155 -0
- deepfos/core/dimension/eledimension.py +22 -0
- deepfos/core/dimension/filters.py +99 -0
- deepfos/core/dimension/sysdimension.py +168 -0
- deepfos/core/logictable/__init__.py +5 -0
- deepfos/core/logictable/_cache.py +141 -0
- deepfos/core/logictable/_operator.py +663 -0
- deepfos/core/logictable/nodemixin.py +673 -0
- deepfos/core/logictable/sqlcondition.py +609 -0
- deepfos/core/logictable/tablemodel.py +497 -0
- deepfos/db/__init__.py +36 -0
- deepfos/db/cipher.py +660 -0
- deepfos/db/clickhouse.py +191 -0
- deepfos/db/connector.py +195 -0
- deepfos/db/daclickhouse.py +171 -0
- deepfos/db/dameng.py +101 -0
- deepfos/db/damysql.py +189 -0
- deepfos/db/dbkits.py +358 -0
- deepfos/db/deepengine.py +99 -0
- deepfos/db/deepmodel.py +82 -0
- deepfos/db/deepmodel_kingbase.py +83 -0
- deepfos/db/edb.py +214 -0
- deepfos/db/gauss.py +83 -0
- deepfos/db/kingbase.py +83 -0
- deepfos/db/mysql.py +184 -0
- deepfos/db/oracle.py +131 -0
- deepfos/db/postgresql.py +192 -0
- deepfos/db/sqlserver.py +99 -0
- deepfos/db/utils.py +135 -0
- deepfos/element/__init__.py +89 -0
- deepfos/element/accounting.py +348 -0
- deepfos/element/apvlprocess.py +215 -0
- deepfos/element/base.py +398 -0
- deepfos/element/bizmodel.py +1269 -0
- deepfos/element/datatable.py +2467 -0
- deepfos/element/deep_pipeline.py +186 -0
- deepfos/element/deepconnector.py +59 -0
- deepfos/element/deepmodel.py +1806 -0
- deepfos/element/dimension.py +1254 -0
- deepfos/element/fact_table.py +427 -0
- deepfos/element/finmodel.py +1485 -0
- deepfos/element/journal.py +840 -0
- deepfos/element/journal_template.py +943 -0
- deepfos/element/pyscript.py +412 -0
- deepfos/element/reconciliation.py +553 -0
- deepfos/element/rolestrategy.py +243 -0
- deepfos/element/smartlist.py +457 -0
- deepfos/element/variable.py +756 -0
- deepfos/element/workflow.py +560 -0
- deepfos/exceptions/__init__.py +239 -0
- deepfos/exceptions/hook.py +86 -0
- deepfos/lazy.py +104 -0
- deepfos/lazy_import.py +84 -0
- deepfos/lib/__init__.py +0 -0
- deepfos/lib/_javaobj.py +366 -0
- deepfos/lib/asynchronous.py +879 -0
- deepfos/lib/concurrency.py +107 -0
- deepfos/lib/constant.py +39 -0
- deepfos/lib/decorator.py +310 -0
- deepfos/lib/deepchart.py +778 -0
- deepfos/lib/deepux.py +477 -0
- deepfos/lib/discovery.py +273 -0
- deepfos/lib/edb_lexer.py +789 -0
- deepfos/lib/eureka.py +156 -0
- deepfos/lib/filterparser.py +751 -0
- deepfos/lib/httpcli.py +106 -0
- deepfos/lib/jsonstreamer.py +80 -0
- deepfos/lib/msg.py +394 -0
- deepfos/lib/nacos.py +225 -0
- deepfos/lib/patch.py +92 -0
- deepfos/lib/redis.py +241 -0
- deepfos/lib/serutils.py +181 -0
- deepfos/lib/stopwatch.py +99 -0
- deepfos/lib/subtask.py +572 -0
- deepfos/lib/sysutils.py +703 -0
- deepfos/lib/utils.py +1003 -0
- deepfos/local.py +160 -0
- deepfos/options.py +670 -0
- deepfos/translation.py +237 -0
- deepfos-1.1.60.dist-info/METADATA +33 -0
- deepfos-1.1.60.dist-info/RECORD +175 -0
- deepfos-1.1.60.dist-info/WHEEL +5 -0
- deepfos-1.1.60.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import functools
|
|
2
|
+
from collections import defaultdict
|
|
3
|
+
from typing import Dict, Iterable, Union, NamedTuple
|
|
4
|
+
import itertools
|
|
5
|
+
|
|
6
|
+
from deepfos.core.cube.constants import DATACOL_DFLT
|
|
7
|
+
|
|
8
|
+
from pandas import Series
|
|
9
|
+
import pandas as pd
|
|
10
|
+
import numpy as np
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def merge_dict(*dicts):
|
|
14
|
+
rtn = defaultdict(set)
|
|
15
|
+
for dct in dicts:
|
|
16
|
+
for k, v in dct.items():
|
|
17
|
+
rtn[k].update(v)
|
|
18
|
+
|
|
19
|
+
return rtn
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def dict_to_sql(
|
|
23
|
+
dict_: Dict[str, Iterable[str]],
|
|
24
|
+
eq: str,
|
|
25
|
+
concat: str = 'and',
|
|
26
|
+
bracket: bool = True,
|
|
27
|
+
):
|
|
28
|
+
sql_list = []
|
|
29
|
+
|
|
30
|
+
for k, v in dict_.items():
|
|
31
|
+
v = tuple(set(v))
|
|
32
|
+
|
|
33
|
+
if len(v) == 1:
|
|
34
|
+
sql = f"{k}{eq}{v[0]!r}"
|
|
35
|
+
else:
|
|
36
|
+
sql = f"{k} in {v!r}"
|
|
37
|
+
|
|
38
|
+
sql_list.append(sql)
|
|
39
|
+
|
|
40
|
+
sql = f" {concat} ".join(sql_list)
|
|
41
|
+
if bracket:
|
|
42
|
+
return '(' + sql + ')'
|
|
43
|
+
return sql
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def dicts_to_sql(dicts, sql_type='pandas'):
|
|
47
|
+
eq = '==' if sql_type == 'pandas' else '='
|
|
48
|
+
|
|
49
|
+
sql_list = []
|
|
50
|
+
|
|
51
|
+
for dc in dicts:
|
|
52
|
+
sql_list.append(dict_to_sql(dc, eq))
|
|
53
|
+
|
|
54
|
+
return ' or '.join(sql_list)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def pipe(functions, init_arg):
|
|
58
|
+
for func in functions:
|
|
59
|
+
init_arg = func(init_arg)
|
|
60
|
+
|
|
61
|
+
return init_arg
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def multi_product(*dataframes: pd.DataFrame, data_col=DATACOL_DFLT, dropna=False):
|
|
65
|
+
counter = itertools.count().__next__
|
|
66
|
+
all_data_cols = [data_col]
|
|
67
|
+
|
|
68
|
+
if len(dataframes) == 1:
|
|
69
|
+
return dataframes[0], all_data_cols
|
|
70
|
+
|
|
71
|
+
left = dataframes[0]
|
|
72
|
+
|
|
73
|
+
for right in dataframes[1:]:
|
|
74
|
+
|
|
75
|
+
common_cols = left.columns.intersection(right.columns)
|
|
76
|
+
on = [col for col in common_cols if col != data_col]
|
|
77
|
+
r_suffix = f'_{counter()}'
|
|
78
|
+
|
|
79
|
+
if not on:
|
|
80
|
+
# 对于没有公共列的数据,补充一个临时列用于join
|
|
81
|
+
tmp_key = 't3mp#_j01ne6#_key#'
|
|
82
|
+
left[tmp_key] = 1
|
|
83
|
+
right[tmp_key] = 1
|
|
84
|
+
left = left.merge(right, on=tmp_key, how='outer', suffixes=('', r_suffix)).\
|
|
85
|
+
drop(tmp_key, axis=1)
|
|
86
|
+
else:
|
|
87
|
+
left = left.merge(right, on=on, how='outer', suffixes=('', r_suffix))
|
|
88
|
+
|
|
89
|
+
if dropna:
|
|
90
|
+
left = left.dropna()
|
|
91
|
+
|
|
92
|
+
all_data_cols.extend(f"{data_col}_{i}" for i in range(counter()))
|
|
93
|
+
return left, all_data_cols
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def guard_method(*candidates, attr):
|
|
97
|
+
|
|
98
|
+
def guard(func):
|
|
99
|
+
@functools.wraps(func)
|
|
100
|
+
def wrapper(self, *args, **kwargs):
|
|
101
|
+
target = getattr(self, attr)
|
|
102
|
+
|
|
103
|
+
if target not in candidates:
|
|
104
|
+
raise RuntimeError(
|
|
105
|
+
f"Cannot call {func.__qualname__} while '{attr} = {target}'. "
|
|
106
|
+
f"Allowed states are: {candidates}")
|
|
107
|
+
|
|
108
|
+
return func(self, *args, **kwargs)
|
|
109
|
+
|
|
110
|
+
return wrapper
|
|
111
|
+
|
|
112
|
+
return guard
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class Options(NamedTuple):
|
|
116
|
+
missing_value_add: Union[int, float] = 0
|
|
117
|
+
missing_value_radd: Union[int, float] = 0
|
|
118
|
+
missing_value_sub: Union[int, float] = 0
|
|
119
|
+
missing_value_rsub: Union[int, float] = 0
|
|
120
|
+
missing_value_mul: Union[int, float] = 1
|
|
121
|
+
missing_value_rmul: Union[int, float] = 1
|
|
122
|
+
# missing_value_div: Union[int, float] = np.NaN
|
|
123
|
+
# missing_value_rdiv: Union[int, float] = np.NAN
|
|
124
|
+
fill_missing_against_constant: bool = True
|
|
125
|
+
|
|
126
|
+
def replace(self, /, **options):
|
|
127
|
+
result = self._make(map(options.pop, self._fields, self))
|
|
128
|
+
if options:
|
|
129
|
+
raise ValueError(f'Got unexpected options: {list(options)!r}')
|
|
130
|
+
return result
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def _auto_fill(func, key):
|
|
134
|
+
@functools.wraps(func)
|
|
135
|
+
def wrapper(self, other):
|
|
136
|
+
value = getattr(self.custom_options, key)
|
|
137
|
+
|
|
138
|
+
if not isinstance(other, self.__class__):
|
|
139
|
+
if self.custom_options.fill_missing_against_constant:
|
|
140
|
+
me = self.fillna(value, downcast='infer')
|
|
141
|
+
else:
|
|
142
|
+
me = self
|
|
143
|
+
return func(me, other)
|
|
144
|
+
|
|
145
|
+
both_nan = self.isna() & other.isna()
|
|
146
|
+
me = self.fillna(value, downcast='infer')
|
|
147
|
+
other = other.fillna(value, downcast='infer')
|
|
148
|
+
|
|
149
|
+
rslt = func(me, other)
|
|
150
|
+
rslt.loc[both_nan] = np.NAN
|
|
151
|
+
return rslt
|
|
152
|
+
|
|
153
|
+
return wrapper
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
class AutoFillSeries(Series):
|
|
157
|
+
_metadata = ['custom_options']
|
|
158
|
+
|
|
159
|
+
@property
|
|
160
|
+
def _constructor(self):
|
|
161
|
+
return AutoFillSeries
|
|
162
|
+
|
|
163
|
+
@property
|
|
164
|
+
def _constructor_expanddim(self):
|
|
165
|
+
return AutoFillSeries
|
|
166
|
+
|
|
167
|
+
__add__ = _auto_fill(Series.__add__, 'missing_value_add')
|
|
168
|
+
__sub__ = _auto_fill(Series.__sub__, 'missing_value_sub')
|
|
169
|
+
__mul__ = _auto_fill(Series.__mul__, 'missing_value_mul')
|
|
170
|
+
__radd__ = _auto_fill(Series.__radd__, 'missing_value_radd')
|
|
171
|
+
__rsub__ = _auto_fill(Series.__rsub__, 'missing_value_rsub')
|
|
172
|
+
__rmul__ = _auto_fill(Series.__rmul__, 'missing_value_rmul')
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def create_df_by_cproduct(col_map: Dict) -> pd.DataFrame:
|
|
176
|
+
data = list(itertools.product(*col_map.values()))
|
|
177
|
+
columns = list(col_map.keys())
|
|
178
|
+
|
|
179
|
+
return pd.DataFrame(data, columns=columns)
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def iter_rename_map(node, start=0, offset=None):
|
|
183
|
+
class Level:
|
|
184
|
+
level = 0
|
|
185
|
+
|
|
186
|
+
end = start + (offset or np.PINF)
|
|
187
|
+
|
|
188
|
+
level_end = Level()
|
|
189
|
+
rename_map = {}
|
|
190
|
+
|
|
191
|
+
node_to_visit = node.children[:]
|
|
192
|
+
node_to_visit.append(level_end)
|
|
193
|
+
|
|
194
|
+
while node_to_visit:
|
|
195
|
+
child = node_to_visit.pop(0)
|
|
196
|
+
|
|
197
|
+
if child is level_end:
|
|
198
|
+
if not rename_map:
|
|
199
|
+
break
|
|
200
|
+
|
|
201
|
+
if start <= level_end.level < end:
|
|
202
|
+
yield rename_map
|
|
203
|
+
|
|
204
|
+
level_end.level += 1
|
|
205
|
+
node_to_visit.append(level_end)
|
|
206
|
+
rename_map = {}
|
|
207
|
+
else:
|
|
208
|
+
rename_map[child.name] = child.parent.name
|
|
209
|
+
for grandchild in child.children:
|
|
210
|
+
node_to_visit.append(grandchild)
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
class _Zero:
|
|
214
|
+
def __bool__(self):
|
|
215
|
+
return False
|
|
216
|
+
|
|
217
|
+
def __add__(self, other):
|
|
218
|
+
if not isinstance(other, self.__class__):
|
|
219
|
+
return other
|
|
220
|
+
return self
|
|
221
|
+
|
|
222
|
+
def __radd__(self, other):
|
|
223
|
+
return self + other
|
|
224
|
+
|
|
225
|
+
def __mul__(self, other):
|
|
226
|
+
return self
|
|
227
|
+
|
|
228
|
+
def __rmul__(self, other):
|
|
229
|
+
return self
|
|
230
|
+
|
|
231
|
+
def __str__(self):
|
|
232
|
+
return 'ZERO'
|
|
233
|
+
|
|
234
|
+
def __eq__(self, other):
|
|
235
|
+
return self is other
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
Zero = _Zero()
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from .dimmember import DimMember
|
|
2
|
+
from .sysdimension import SysDimension, read_expr
|
|
3
|
+
from .eledimension import ElementDimension
|
|
4
|
+
from .dimension import Dimension, SortedDimension
|
|
5
|
+
from .dimexpr import DimExprAnalysor
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
__all__ = [
|
|
9
|
+
'Dimension', 'SortedDimension', 'DimExprAnalysor', 'DimMember',
|
|
10
|
+
'SysDimension', 'read_expr', 'ElementDimension'
|
|
11
|
+
]
|