teradataml 17.20.0.7__py3-none-any.whl → 20.0.0.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.

Potentially problematic release.


This version of teradataml might be problematic. Click here for more details.

Files changed (1285) hide show
  1. teradataml/LICENSE-3RD-PARTY.pdf +0 -0
  2. teradataml/LICENSE.pdf +0 -0
  3. teradataml/README.md +1864 -1640
  4. teradataml/__init__.py +70 -60
  5. teradataml/_version.py +11 -11
  6. teradataml/analytics/Transformations.py +2995 -2995
  7. teradataml/analytics/__init__.py +81 -83
  8. teradataml/analytics/analytic_function_executor.py +2013 -2010
  9. teradataml/analytics/analytic_query_generator.py +958 -958
  10. teradataml/analytics/byom/H2OPredict.py +514 -514
  11. teradataml/analytics/byom/PMMLPredict.py +437 -437
  12. teradataml/analytics/byom/__init__.py +14 -14
  13. teradataml/analytics/json_parser/__init__.py +130 -130
  14. teradataml/analytics/json_parser/analytic_functions_argument.py +1707 -1707
  15. teradataml/analytics/json_parser/json_store.py +191 -191
  16. teradataml/analytics/json_parser/metadata.py +1637 -1637
  17. teradataml/analytics/json_parser/utils.py +804 -803
  18. teradataml/analytics/meta_class.py +196 -196
  19. teradataml/analytics/sqle/DecisionTreePredict.py +455 -470
  20. teradataml/analytics/sqle/NaiveBayesPredict.py +419 -428
  21. teradataml/analytics/sqle/__init__.py +97 -110
  22. teradataml/analytics/sqle/json/decisiontreepredict_sqle.json +78 -78
  23. teradataml/analytics/sqle/json/naivebayespredict_sqle.json +62 -62
  24. teradataml/analytics/table_operator/__init__.py +10 -10
  25. teradataml/analytics/uaf/__init__.py +63 -63
  26. teradataml/analytics/utils.py +693 -692
  27. teradataml/analytics/valib.py +1603 -1600
  28. teradataml/automl/__init__.py +1628 -0
  29. teradataml/automl/custom_json_utils.py +1270 -0
  30. teradataml/automl/data_preparation.py +993 -0
  31. teradataml/automl/data_transformation.py +727 -0
  32. teradataml/automl/feature_engineering.py +1648 -0
  33. teradataml/automl/feature_exploration.py +547 -0
  34. teradataml/automl/model_evaluation.py +163 -0
  35. teradataml/automl/model_training.py +887 -0
  36. teradataml/catalog/__init__.py +1 -3
  37. teradataml/catalog/byom.py +1759 -1716
  38. teradataml/catalog/function_argument_mapper.py +859 -861
  39. teradataml/catalog/model_cataloging_utils.py +491 -1510
  40. teradataml/clients/pkce_client.py +481 -481
  41. teradataml/common/aed_utils.py +6 -2
  42. teradataml/common/bulk_exposed_utils.py +111 -111
  43. teradataml/common/constants.py +1433 -1441
  44. teradataml/common/deprecations.py +160 -0
  45. teradataml/common/exceptions.py +73 -73
  46. teradataml/common/formula.py +742 -742
  47. teradataml/common/garbagecollector.py +592 -635
  48. teradataml/common/messagecodes.py +422 -431
  49. teradataml/common/messages.py +227 -231
  50. teradataml/common/sqlbundle.py +693 -693
  51. teradataml/common/td_coltype_code_to_tdtype.py +48 -48
  52. teradataml/common/utils.py +2418 -2500
  53. teradataml/common/warnings.py +25 -25
  54. teradataml/common/wrapper_utils.py +1 -110
  55. teradataml/config/dummy_file1.cfg +4 -4
  56. teradataml/config/dummy_file2.cfg +2 -2
  57. teradataml/config/sqlengine_alias_definitions_v1.0 +13 -13
  58. teradataml/config/sqlengine_alias_definitions_v1.1 +19 -19
  59. teradataml/config/sqlengine_alias_definitions_v1.3 +18 -18
  60. teradataml/context/aed_context.py +217 -217
  61. teradataml/context/context.py +1071 -999
  62. teradataml/data/A_loan.csv +19 -19
  63. teradataml/data/BINARY_REALS_LEFT.csv +11 -11
  64. teradataml/data/BINARY_REALS_RIGHT.csv +11 -11
  65. teradataml/data/B_loan.csv +49 -49
  66. teradataml/data/BuoyData2.csv +17 -17
  67. teradataml/data/CONVOLVE2_COMPLEX_LEFT.csv +5 -5
  68. teradataml/data/CONVOLVE2_COMPLEX_RIGHT.csv +5 -5
  69. teradataml/data/Convolve2RealsLeft.csv +5 -5
  70. teradataml/data/Convolve2RealsRight.csv +5 -5
  71. teradataml/data/Convolve2ValidLeft.csv +11 -11
  72. teradataml/data/Convolve2ValidRight.csv +11 -11
  73. teradataml/data/DFFTConv_Real_8_8.csv +65 -65
  74. teradataml/data/Orders1_12mf.csv +24 -24
  75. teradataml/data/Pi_loan.csv +7 -7
  76. teradataml/data/SMOOTHED_DATA.csv +7 -7
  77. teradataml/data/TestDFFT8.csv +9 -9
  78. teradataml/data/TestRiver.csv +109 -109
  79. teradataml/data/Traindata.csv +28 -28
  80. teradataml/data/acf.csv +17 -17
  81. teradataml/data/adaboost_example.json +34 -34
  82. teradataml/data/adaboostpredict_example.json +24 -24
  83. teradataml/data/additional_table.csv +10 -10
  84. teradataml/data/admissions_test.csv +21 -21
  85. teradataml/data/admissions_train.csv +41 -41
  86. teradataml/data/admissions_train_nulls.csv +41 -41
  87. teradataml/data/ageandheight.csv +13 -13
  88. teradataml/data/ageandpressure.csv +31 -31
  89. teradataml/data/antiselect_example.json +36 -36
  90. teradataml/data/antiselect_input.csv +8 -8
  91. teradataml/data/antiselect_input_mixed_case.csv +8 -8
  92. teradataml/data/applicant_external.csv +6 -6
  93. teradataml/data/applicant_reference.csv +6 -6
  94. teradataml/data/arima_example.json +9 -9
  95. teradataml/data/assortedtext_input.csv +8 -8
  96. teradataml/data/attribution_example.json +33 -33
  97. teradataml/data/attribution_sample_table.csv +27 -27
  98. teradataml/data/attribution_sample_table1.csv +6 -6
  99. teradataml/data/attribution_sample_table2.csv +11 -11
  100. teradataml/data/bank_churn.csv +10001 -0
  101. teradataml/data/bank_web_clicks1.csv +42 -42
  102. teradataml/data/bank_web_clicks2.csv +91 -91
  103. teradataml/data/bank_web_url.csv +85 -85
  104. teradataml/data/barrier.csv +2 -2
  105. teradataml/data/barrier_new.csv +3 -3
  106. teradataml/data/betweenness_example.json +13 -13
  107. teradataml/data/bin_breaks.csv +8 -8
  108. teradataml/data/bin_fit_ip.csv +3 -3
  109. teradataml/data/binary_complex_left.csv +11 -11
  110. teradataml/data/binary_complex_right.csv +11 -11
  111. teradataml/data/binary_matrix_complex_left.csv +21 -21
  112. teradataml/data/binary_matrix_complex_right.csv +21 -21
  113. teradataml/data/binary_matrix_real_left.csv +21 -21
  114. teradataml/data/binary_matrix_real_right.csv +21 -21
  115. teradataml/data/blood2ageandweight.csv +26 -26
  116. teradataml/data/bmi.csv +501 -0
  117. teradataml/data/boston.csv +507 -507
  118. teradataml/data/buoydata_mix.csv +11 -11
  119. teradataml/data/burst_data.csv +5 -5
  120. teradataml/data/burst_example.json +20 -20
  121. teradataml/data/byom_example.json +17 -17
  122. teradataml/data/bytes_table.csv +3 -3
  123. teradataml/data/cal_housing_ex_raw.csv +70 -70
  124. teradataml/data/callers.csv +7 -7
  125. teradataml/data/calls.csv +10 -10
  126. teradataml/data/cars_hist.csv +33 -33
  127. teradataml/data/cat_table.csv +24 -24
  128. teradataml/data/ccm_example.json +31 -31
  129. teradataml/data/ccm_input.csv +91 -91
  130. teradataml/data/ccm_input2.csv +13 -13
  131. teradataml/data/ccmexample.csv +101 -101
  132. teradataml/data/ccmprepare_example.json +8 -8
  133. teradataml/data/ccmprepare_input.csv +91 -91
  134. teradataml/data/cfilter_example.json +12 -12
  135. teradataml/data/changepointdetection_example.json +18 -18
  136. teradataml/data/changepointdetectionrt_example.json +8 -8
  137. teradataml/data/chi_sq.csv +2 -2
  138. teradataml/data/churn_data.csv +14 -14
  139. teradataml/data/churn_emission.csv +35 -35
  140. teradataml/data/churn_initial.csv +3 -3
  141. teradataml/data/churn_state_transition.csv +5 -5
  142. teradataml/data/citedges_2.csv +745 -745
  143. teradataml/data/citvertices_2.csv +1210 -1210
  144. teradataml/data/clicks2.csv +16 -16
  145. teradataml/data/clickstream.csv +12 -12
  146. teradataml/data/clickstream1.csv +11 -11
  147. teradataml/data/closeness_example.json +15 -15
  148. teradataml/data/complaints.csv +21 -21
  149. teradataml/data/complaints_mini.csv +3 -3
  150. teradataml/data/complaints_testtoken.csv +224 -224
  151. teradataml/data/complaints_tokens_test.csv +353 -353
  152. teradataml/data/complaints_traintoken.csv +472 -472
  153. teradataml/data/computers_category.csv +1001 -1001
  154. teradataml/data/computers_test1.csv +1252 -1252
  155. teradataml/data/computers_train1.csv +5009 -5009
  156. teradataml/data/computers_train1_clustered.csv +5009 -5009
  157. teradataml/data/confusionmatrix_example.json +9 -9
  158. teradataml/data/conversion_event_table.csv +3 -3
  159. teradataml/data/corr_input.csv +17 -17
  160. teradataml/data/correlation_example.json +11 -11
  161. teradataml/data/coxhazardratio_example.json +39 -39
  162. teradataml/data/coxph_example.json +15 -15
  163. teradataml/data/coxsurvival_example.json +28 -28
  164. teradataml/data/cpt.csv +41 -41
  165. teradataml/data/credit_ex_merged.csv +45 -45
  166. teradataml/data/customer_loyalty.csv +301 -301
  167. teradataml/data/customer_loyalty_newseq.csv +31 -31
  168. teradataml/data/dataframe_example.json +146 -146
  169. teradataml/data/decisionforest_example.json +37 -37
  170. teradataml/data/decisionforestpredict_example.json +38 -38
  171. teradataml/data/decisiontree_example.json +21 -21
  172. teradataml/data/decisiontreepredict_example.json +45 -45
  173. teradataml/data/dfft2_size4_real.csv +17 -17
  174. teradataml/data/dfft2_test_matrix16.csv +17 -17
  175. teradataml/data/dfft2conv_real_4_4.csv +65 -65
  176. teradataml/data/diabetes.csv +443 -443
  177. teradataml/data/diabetes_test.csv +89 -89
  178. teradataml/data/dict_table.csv +5 -5
  179. teradataml/data/docperterm_table.csv +4 -4
  180. teradataml/data/docs/__init__.py +1 -1
  181. teradataml/data/docs/byom/docs/DataRobotPredict.py +180 -180
  182. teradataml/data/docs/byom/docs/DataikuPredict.py +177 -177
  183. teradataml/data/docs/byom/docs/H2OPredict.py +324 -324
  184. teradataml/data/docs/byom/docs/ONNXPredict.py +283 -283
  185. teradataml/data/docs/byom/docs/PMMLPredict.py +277 -277
  186. teradataml/data/docs/sqle/docs_17_10/Antiselect.py +82 -82
  187. teradataml/data/docs/sqle/docs_17_10/Attribution.py +199 -199
  188. teradataml/data/docs/sqle/docs_17_10/BincodeFit.py +171 -171
  189. teradataml/data/docs/sqle/docs_17_10/BincodeTransform.py +131 -130
  190. teradataml/data/docs/sqle/docs_17_10/CategoricalSummary.py +86 -86
  191. teradataml/data/docs/sqle/docs_17_10/ChiSq.py +90 -90
  192. teradataml/data/docs/sqle/docs_17_10/ColumnSummary.py +85 -85
  193. teradataml/data/docs/sqle/docs_17_10/ConvertTo.py +95 -95
  194. teradataml/data/docs/sqle/docs_17_10/DecisionForestPredict.py +139 -139
  195. teradataml/data/docs/sqle/docs_17_10/DecisionTreePredict.py +151 -151
  196. teradataml/data/docs/sqle/docs_17_10/FTest.py +160 -160
  197. teradataml/data/docs/sqle/docs_17_10/FillRowId.py +82 -82
  198. teradataml/data/docs/sqle/docs_17_10/Fit.py +87 -87
  199. teradataml/data/docs/sqle/docs_17_10/GLMPredict.py +144 -144
  200. teradataml/data/docs/sqle/docs_17_10/GetRowsWithMissingValues.py +84 -84
  201. teradataml/data/docs/sqle/docs_17_10/GetRowsWithoutMissingValues.py +81 -81
  202. teradataml/data/docs/sqle/docs_17_10/Histogram.py +164 -164
  203. teradataml/data/docs/sqle/docs_17_10/MovingAverage.py +134 -134
  204. teradataml/data/docs/sqle/docs_17_10/NGramSplitter.py +208 -208
  205. teradataml/data/docs/sqle/docs_17_10/NPath.py +265 -265
  206. teradataml/data/docs/sqle/docs_17_10/NaiveBayesPredict.py +116 -116
  207. teradataml/data/docs/sqle/docs_17_10/NaiveBayesTextClassifierPredict.py +176 -176
  208. teradataml/data/docs/sqle/docs_17_10/NumApply.py +147 -147
  209. teradataml/data/docs/sqle/docs_17_10/OneHotEncodingFit.py +132 -132
  210. teradataml/data/docs/sqle/docs_17_10/OneHotEncodingTransform.py +103 -103
  211. teradataml/data/docs/sqle/docs_17_10/OutlierFilterFit.py +165 -165
  212. teradataml/data/docs/sqle/docs_17_10/OutlierFilterTransform.py +101 -101
  213. teradataml/data/docs/sqle/docs_17_10/Pack.py +128 -128
  214. teradataml/data/docs/sqle/docs_17_10/PolynomialFeaturesFit.py +111 -111
  215. teradataml/data/docs/sqle/docs_17_10/PolynomialFeaturesTransform.py +102 -102
  216. teradataml/data/docs/sqle/docs_17_10/QQNorm.py +104 -104
  217. teradataml/data/docs/sqle/docs_17_10/RoundColumns.py +109 -109
  218. teradataml/data/docs/sqle/docs_17_10/RowNormalizeFit.py +117 -117
  219. teradataml/data/docs/sqle/docs_17_10/RowNormalizeTransform.py +99 -98
  220. teradataml/data/docs/sqle/docs_17_10/SVMSparsePredict.py +152 -152
  221. teradataml/data/docs/sqle/docs_17_10/ScaleFit.py +197 -197
  222. teradataml/data/docs/sqle/docs_17_10/ScaleTransform.py +99 -98
  223. teradataml/data/docs/sqle/docs_17_10/Sessionize.py +113 -113
  224. teradataml/data/docs/sqle/docs_17_10/SimpleImputeFit.py +116 -116
  225. teradataml/data/docs/sqle/docs_17_10/SimpleImputeTransform.py +98 -98
  226. teradataml/data/docs/sqle/docs_17_10/StrApply.py +187 -187
  227. teradataml/data/docs/sqle/docs_17_10/StringSimilarity.py +145 -145
  228. teradataml/data/docs/sqle/docs_17_10/Transform.py +105 -104
  229. teradataml/data/docs/sqle/docs_17_10/UnivariateStatistics.py +141 -141
  230. teradataml/data/docs/sqle/docs_17_10/Unpack.py +214 -214
  231. teradataml/data/docs/sqle/docs_17_10/WhichMax.py +83 -83
  232. teradataml/data/docs/sqle/docs_17_10/WhichMin.py +83 -83
  233. teradataml/data/docs/sqle/docs_17_10/ZTest.py +155 -155
  234. teradataml/data/docs/sqle/docs_17_20/ANOVA.py +126 -126
  235. teradataml/data/docs/sqle/docs_17_20/Antiselect.py +82 -82
  236. teradataml/data/docs/sqle/docs_17_20/Attribution.py +200 -200
  237. teradataml/data/docs/sqle/docs_17_20/BincodeFit.py +171 -171
  238. teradataml/data/docs/sqle/docs_17_20/BincodeTransform.py +139 -138
  239. teradataml/data/docs/sqle/docs_17_20/CategoricalSummary.py +86 -86
  240. teradataml/data/docs/sqle/docs_17_20/ChiSq.py +90 -90
  241. teradataml/data/docs/sqle/docs_17_20/ClassificationEvaluator.py +166 -166
  242. teradataml/data/docs/sqle/docs_17_20/ColumnSummary.py +85 -85
  243. teradataml/data/docs/sqle/docs_17_20/ColumnTransformer.py +243 -243
  244. teradataml/data/docs/sqle/docs_17_20/ConvertTo.py +113 -113
  245. teradataml/data/docs/sqle/docs_17_20/DecisionForest.py +279 -279
  246. teradataml/data/docs/sqle/docs_17_20/DecisionForestPredict.py +144 -144
  247. teradataml/data/docs/sqle/docs_17_20/DecisionTreePredict.py +135 -135
  248. teradataml/data/docs/sqle/docs_17_20/FTest.py +160 -160
  249. teradataml/data/docs/sqle/docs_17_20/FillRowId.py +82 -82
  250. teradataml/data/docs/sqle/docs_17_20/Fit.py +87 -87
  251. teradataml/data/docs/sqle/docs_17_20/GLM.py +380 -380
  252. teradataml/data/docs/sqle/docs_17_20/GLMPerSegment.py +414 -414
  253. teradataml/data/docs/sqle/docs_17_20/GLMPredict.py +144 -144
  254. teradataml/data/docs/sqle/docs_17_20/GLMPredictPerSegment.py +233 -234
  255. teradataml/data/docs/sqle/docs_17_20/GetFutileColumns.py +123 -123
  256. teradataml/data/docs/sqle/docs_17_20/GetRowsWithMissingValues.py +108 -108
  257. teradataml/data/docs/sqle/docs_17_20/GetRowsWithoutMissingValues.py +105 -105
  258. teradataml/data/docs/sqle/docs_17_20/Histogram.py +223 -223
  259. teradataml/data/docs/sqle/docs_17_20/KMeans.py +204 -204
  260. teradataml/data/docs/sqle/docs_17_20/KMeansPredict.py +144 -143
  261. teradataml/data/docs/sqle/docs_17_20/KNN.py +214 -214
  262. teradataml/data/docs/sqle/docs_17_20/MovingAverage.py +134 -134
  263. teradataml/data/docs/sqle/docs_17_20/NGramSplitter.py +208 -208
  264. teradataml/data/docs/sqle/docs_17_20/NPath.py +265 -265
  265. teradataml/data/docs/sqle/docs_17_20/NaiveBayesPredict.py +116 -116
  266. teradataml/data/docs/sqle/docs_17_20/NaiveBayesTextClassifierPredict.py +177 -176
  267. teradataml/data/docs/sqle/docs_17_20/NaiveBayesTextClassifierTrainer.py +126 -126
  268. teradataml/data/docs/sqle/docs_17_20/NonLinearCombineFit.py +117 -117
  269. teradataml/data/docs/sqle/docs_17_20/NonLinearCombineTransform.py +112 -112
  270. teradataml/data/docs/sqle/docs_17_20/NumApply.py +147 -147
  271. teradataml/data/docs/sqle/docs_17_20/OneClassSVM.py +307 -307
  272. teradataml/data/docs/sqle/docs_17_20/OneClassSVMPredict.py +185 -184
  273. teradataml/data/docs/sqle/docs_17_20/OneHotEncodingFit.py +225 -225
  274. teradataml/data/docs/sqle/docs_17_20/OneHotEncodingTransform.py +115 -115
  275. teradataml/data/docs/sqle/docs_17_20/OrdinalEncodingFit.py +219 -219
  276. teradataml/data/docs/sqle/docs_17_20/OrdinalEncodingTransform.py +127 -127
  277. teradataml/data/docs/sqle/docs_17_20/OutlierFilterFit.py +189 -189
  278. teradataml/data/docs/sqle/docs_17_20/OutlierFilterTransform.py +117 -112
  279. teradataml/data/docs/sqle/docs_17_20/Pack.py +128 -128
  280. teradataml/data/docs/sqle/docs_17_20/PolynomialFeaturesFit.py +111 -111
  281. teradataml/data/docs/sqle/docs_17_20/PolynomialFeaturesTransform.py +112 -111
  282. teradataml/data/docs/sqle/docs_17_20/QQNorm.py +104 -104
  283. teradataml/data/docs/sqle/docs_17_20/ROC.py +163 -163
  284. teradataml/data/docs/sqle/docs_17_20/RandomProjectionFit.py +154 -154
  285. teradataml/data/docs/sqle/docs_17_20/RandomProjectionMinComponents.py +106 -106
  286. teradataml/data/docs/sqle/docs_17_20/RandomProjectionTransform.py +120 -120
  287. teradataml/data/docs/sqle/docs_17_20/RegressionEvaluator.py +211 -211
  288. teradataml/data/docs/sqle/docs_17_20/RoundColumns.py +108 -108
  289. teradataml/data/docs/sqle/docs_17_20/RowNormalizeFit.py +117 -117
  290. teradataml/data/docs/sqle/docs_17_20/RowNormalizeTransform.py +111 -110
  291. teradataml/data/docs/sqle/docs_17_20/SVM.py +413 -413
  292. teradataml/data/docs/sqle/docs_17_20/SVMPredict.py +202 -202
  293. teradataml/data/docs/sqle/docs_17_20/SVMSparsePredict.py +152 -152
  294. teradataml/data/docs/sqle/docs_17_20/ScaleFit.py +197 -197
  295. teradataml/data/docs/sqle/docs_17_20/ScaleTransform.py +110 -109
  296. teradataml/data/docs/sqle/docs_17_20/SentimentExtractor.py +206 -206
  297. teradataml/data/docs/sqle/docs_17_20/Sessionize.py +113 -113
  298. teradataml/data/docs/sqle/docs_17_20/Silhouette.py +152 -152
  299. teradataml/data/docs/sqle/docs_17_20/SimpleImputeFit.py +116 -116
  300. teradataml/data/docs/sqle/docs_17_20/SimpleImputeTransform.py +109 -108
  301. teradataml/data/docs/sqle/docs_17_20/StrApply.py +187 -187
  302. teradataml/data/docs/sqle/docs_17_20/StringSimilarity.py +145 -145
  303. teradataml/data/docs/sqle/docs_17_20/TDDecisionForestPredict.py +207 -207
  304. teradataml/data/docs/sqle/docs_17_20/TDGLMPredict.py +171 -171
  305. teradataml/data/docs/sqle/docs_17_20/TargetEncodingFit.py +266 -266
  306. teradataml/data/docs/sqle/docs_17_20/TargetEncodingTransform.py +141 -140
  307. teradataml/data/docs/sqle/docs_17_20/TextParser.py +172 -172
  308. teradataml/data/docs/sqle/docs_17_20/TrainTestSplit.py +159 -159
  309. teradataml/data/docs/sqle/docs_17_20/Transform.py +123 -123
  310. teradataml/data/docs/sqle/docs_17_20/UnivariateStatistics.py +141 -141
  311. teradataml/data/docs/sqle/docs_17_20/Unpack.py +214 -214
  312. teradataml/data/docs/sqle/docs_17_20/VectorDistance.py +168 -168
  313. teradataml/data/docs/sqle/docs_17_20/WhichMax.py +83 -83
  314. teradataml/data/docs/sqle/docs_17_20/WhichMin.py +83 -83
  315. teradataml/data/docs/sqle/docs_17_20/WordEmbeddings.py +236 -236
  316. teradataml/data/docs/sqle/docs_17_20/XGBoost.py +353 -353
  317. teradataml/data/docs/sqle/docs_17_20/XGBoostPredict.py +275 -275
  318. teradataml/data/docs/sqle/docs_17_20/ZTest.py +155 -155
  319. teradataml/data/docs/tableoperator/docs_17_00/ReadNOS.py +429 -429
  320. teradataml/data/docs/tableoperator/docs_17_05/ReadNOS.py +429 -429
  321. teradataml/data/docs/tableoperator/docs_17_05/WriteNOS.py +347 -347
  322. teradataml/data/docs/tableoperator/docs_17_10/ReadNOS.py +428 -428
  323. teradataml/data/docs/tableoperator/docs_17_10/WriteNOS.py +347 -347
  324. teradataml/data/docs/tableoperator/docs_17_20/ReadNOS.py +439 -439
  325. teradataml/data/docs/tableoperator/docs_17_20/WriteNOS.py +386 -386
  326. teradataml/data/docs/uaf/docs_17_20/ACF.py +195 -195
  327. teradataml/data/docs/uaf/docs_17_20/ArimaEstimate.py +369 -369
  328. teradataml/data/docs/uaf/docs_17_20/ArimaForecast.py +142 -142
  329. teradataml/data/docs/uaf/docs_17_20/ArimaValidate.py +159 -159
  330. teradataml/data/docs/uaf/docs_17_20/BinaryMatrixOp.py +247 -247
  331. teradataml/data/docs/uaf/docs_17_20/BinarySeriesOp.py +252 -252
  332. teradataml/data/docs/uaf/docs_17_20/BreuschGodfrey.py +177 -177
  333. teradataml/data/docs/uaf/docs_17_20/BreuschPaganGodfrey.py +174 -174
  334. teradataml/data/docs/uaf/docs_17_20/Convolve.py +226 -226
  335. teradataml/data/docs/uaf/docs_17_20/Convolve2.py +214 -214
  336. teradataml/data/docs/uaf/docs_17_20/CumulPeriodogram.py +183 -183
  337. teradataml/data/docs/uaf/docs_17_20/DFFT.py +203 -203
  338. teradataml/data/docs/uaf/docs_17_20/DFFT2.py +216 -216
  339. teradataml/data/docs/uaf/docs_17_20/DFFT2Conv.py +215 -215
  340. teradataml/data/docs/uaf/docs_17_20/DFFTConv.py +191 -191
  341. teradataml/data/docs/uaf/docs_17_20/DTW.py +179 -179
  342. teradataml/data/docs/uaf/docs_17_20/DickeyFuller.py +144 -144
  343. teradataml/data/docs/uaf/docs_17_20/DurbinWatson.py +183 -183
  344. teradataml/data/docs/uaf/docs_17_20/ExtractResults.py +184 -184
  345. teradataml/data/docs/uaf/docs_17_20/FitMetrics.py +172 -172
  346. teradataml/data/docs/uaf/docs_17_20/GenseriesFormula.py +205 -205
  347. teradataml/data/docs/uaf/docs_17_20/GenseriesSinusoids.py +142 -142
  348. teradataml/data/docs/uaf/docs_17_20/HoltWintersForecaster.py +258 -258
  349. teradataml/data/docs/uaf/docs_17_20/IDFFT.py +164 -164
  350. teradataml/data/docs/uaf/docs_17_20/IDFFT2.py +198 -198
  351. teradataml/data/docs/uaf/docs_17_20/InputValidator.py +120 -120
  352. teradataml/data/docs/uaf/docs_17_20/LineSpec.py +155 -155
  353. teradataml/data/docs/uaf/docs_17_20/LinearRegr.py +214 -214
  354. teradataml/data/docs/uaf/docs_17_20/MAMean.py +173 -173
  355. teradataml/data/docs/uaf/docs_17_20/MInfo.py +133 -133
  356. teradataml/data/docs/uaf/docs_17_20/MatrixMultiply.py +135 -135
  357. teradataml/data/docs/uaf/docs_17_20/MultivarRegr.py +190 -190
  358. teradataml/data/docs/uaf/docs_17_20/PACF.py +158 -158
  359. teradataml/data/docs/uaf/docs_17_20/Portman.py +216 -216
  360. teradataml/data/docs/uaf/docs_17_20/PowerTransform.py +154 -154
  361. teradataml/data/docs/uaf/docs_17_20/Resample.py +228 -228
  362. teradataml/data/docs/uaf/docs_17_20/SInfo.py +122 -122
  363. teradataml/data/docs/uaf/docs_17_20/SeasonalNormalize.py +165 -165
  364. teradataml/data/docs/uaf/docs_17_20/SelectionCriteria.py +173 -173
  365. teradataml/data/docs/uaf/docs_17_20/SignifPeriodicities.py +170 -170
  366. teradataml/data/docs/uaf/docs_17_20/SignifResidmean.py +163 -163
  367. teradataml/data/docs/uaf/docs_17_20/SimpleExp.py +179 -179
  368. teradataml/data/docs/uaf/docs_17_20/Smoothma.py +207 -207
  369. teradataml/data/docs/uaf/docs_17_20/TrackingOp.py +150 -150
  370. teradataml/data/docs/uaf/docs_17_20/UNDIFF.py +171 -171
  371. teradataml/data/docs/uaf/docs_17_20/Unnormalize.py +201 -201
  372. teradataml/data/docs/uaf/docs_17_20/WhitesGeneral.py +169 -169
  373. teradataml/data/dtw_example.json +17 -17
  374. teradataml/data/dtw_t1.csv +11 -11
  375. teradataml/data/dtw_t2.csv +4 -4
  376. teradataml/data/dwt2d_example.json +15 -15
  377. teradataml/data/dwt_example.json +14 -14
  378. teradataml/data/dwt_filter_dim.csv +5 -5
  379. teradataml/data/emission.csv +9 -9
  380. teradataml/data/emp_table_by_dept.csv +19 -19
  381. teradataml/data/employee_info.csv +4 -4
  382. teradataml/data/employee_table.csv +6 -6
  383. teradataml/data/excluding_event_table.csv +2 -2
  384. teradataml/data/finance_data.csv +6 -6
  385. teradataml/data/finance_data2.csv +61 -61
  386. teradataml/data/finance_data3.csv +93 -93
  387. teradataml/data/fish.csv +160 -0
  388. teradataml/data/fm_blood2ageandweight.csv +26 -26
  389. teradataml/data/fmeasure_example.json +11 -11
  390. teradataml/data/followers_leaders.csv +10 -10
  391. teradataml/data/fpgrowth_example.json +12 -12
  392. teradataml/data/frequentpaths_example.json +29 -29
  393. teradataml/data/friends.csv +9 -9
  394. teradataml/data/fs_input.csv +33 -33
  395. teradataml/data/fs_input1.csv +33 -33
  396. teradataml/data/genData.csv +513 -513
  397. teradataml/data/geodataframe_example.json +39 -39
  398. teradataml/data/glass_types.csv +215 -0
  399. teradataml/data/glm_admissions_model.csv +12 -12
  400. teradataml/data/glm_example.json +29 -29
  401. teradataml/data/glml1l2_example.json +28 -28
  402. teradataml/data/glml1l2predict_example.json +54 -54
  403. teradataml/data/glmpredict_example.json +54 -54
  404. teradataml/data/gq_t1.csv +21 -21
  405. teradataml/data/hconvolve_complex_right.csv +5 -5
  406. teradataml/data/hconvolve_complex_rightmulti.csv +5 -5
  407. teradataml/data/histogram_example.json +11 -11
  408. teradataml/data/hmmdecoder_example.json +78 -78
  409. teradataml/data/hmmevaluator_example.json +24 -24
  410. teradataml/data/hmmsupervised_example.json +10 -10
  411. teradataml/data/hmmunsupervised_example.json +7 -7
  412. teradataml/data/house_values.csv +12 -12
  413. teradataml/data/house_values2.csv +13 -13
  414. teradataml/data/housing_cat.csv +7 -7
  415. teradataml/data/housing_data.csv +9 -9
  416. teradataml/data/housing_test.csv +47 -47
  417. teradataml/data/housing_test_binary.csv +47 -47
  418. teradataml/data/housing_train.csv +493 -493
  419. teradataml/data/housing_train_attribute.csv +4 -4
  420. teradataml/data/housing_train_binary.csv +437 -437
  421. teradataml/data/housing_train_parameter.csv +2 -2
  422. teradataml/data/housing_train_response.csv +493 -493
  423. teradataml/data/ibm_stock.csv +370 -370
  424. teradataml/data/ibm_stock1.csv +370 -370
  425. teradataml/data/identitymatch_example.json +21 -21
  426. teradataml/data/idf_table.csv +4 -4
  427. teradataml/data/impressions.csv +101 -101
  428. teradataml/data/inflation.csv +21 -21
  429. teradataml/data/initial.csv +3 -3
  430. teradataml/data/insect_sprays.csv +12 -12
  431. teradataml/data/insurance.csv +1339 -1339
  432. teradataml/data/interpolator_example.json +12 -12
  433. teradataml/data/iris_altinput.csv +481 -481
  434. teradataml/data/iris_attribute_output.csv +8 -8
  435. teradataml/data/iris_attribute_test.csv +121 -121
  436. teradataml/data/iris_attribute_train.csv +481 -481
  437. teradataml/data/iris_category_expect_predict.csv +31 -31
  438. teradataml/data/iris_data.csv +151 -0
  439. teradataml/data/iris_input.csv +151 -151
  440. teradataml/data/iris_response_train.csv +121 -121
  441. teradataml/data/iris_test.csv +31 -31
  442. teradataml/data/iris_train.csv +121 -121
  443. teradataml/data/join_table1.csv +4 -4
  444. teradataml/data/join_table2.csv +4 -4
  445. teradataml/data/jsons/anly_function_name.json +6 -6
  446. teradataml/data/jsons/byom/dataikupredict.json +147 -147
  447. teradataml/data/jsons/byom/datarobotpredict.json +146 -146
  448. teradataml/data/jsons/byom/h2opredict.json +194 -194
  449. teradataml/data/jsons/byom/onnxpredict.json +186 -186
  450. teradataml/data/jsons/byom/pmmlpredict.json +146 -146
  451. teradataml/data/jsons/paired_functions.json +435 -435
  452. teradataml/data/jsons/sqle/16.20/Antiselect.json +56 -56
  453. teradataml/data/jsons/sqle/16.20/Attribution.json +249 -249
  454. teradataml/data/jsons/sqle/16.20/DecisionForestPredict.json +156 -156
  455. teradataml/data/jsons/sqle/16.20/DecisionTreePredict.json +170 -170
  456. teradataml/data/jsons/sqle/16.20/GLMPredict.json +122 -122
  457. teradataml/data/jsons/sqle/16.20/MovingAverage.json +367 -367
  458. teradataml/data/jsons/sqle/16.20/NGramSplitter.json +239 -239
  459. teradataml/data/jsons/sqle/16.20/NaiveBayesPredict.json +136 -136
  460. teradataml/data/jsons/sqle/16.20/NaiveBayesTextClassifierPredict.json +235 -235
  461. teradataml/data/jsons/sqle/16.20/Pack.json +98 -98
  462. teradataml/data/jsons/sqle/16.20/SVMSparsePredict.json +162 -162
  463. teradataml/data/jsons/sqle/16.20/Sessionize.json +105 -105
  464. teradataml/data/jsons/sqle/16.20/StringSimilarity.json +86 -86
  465. teradataml/data/jsons/sqle/16.20/Unpack.json +166 -166
  466. teradataml/data/jsons/sqle/16.20/nPath.json +269 -269
  467. teradataml/data/jsons/sqle/17.00/Antiselect.json +56 -56
  468. teradataml/data/jsons/sqle/17.00/Attribution.json +249 -249
  469. teradataml/data/jsons/sqle/17.00/DecisionForestPredict.json +156 -156
  470. teradataml/data/jsons/sqle/17.00/DecisionTreePredict.json +170 -170
  471. teradataml/data/jsons/sqle/17.00/GLMPredict.json +122 -122
  472. teradataml/data/jsons/sqle/17.00/MovingAverage.json +367 -367
  473. teradataml/data/jsons/sqle/17.00/NGramSplitter.json +239 -239
  474. teradataml/data/jsons/sqle/17.00/NaiveBayesPredict.json +136 -136
  475. teradataml/data/jsons/sqle/17.00/NaiveBayesTextClassifierPredict.json +235 -235
  476. teradataml/data/jsons/sqle/17.00/Pack.json +98 -98
  477. teradataml/data/jsons/sqle/17.00/SVMSparsePredict.json +162 -162
  478. teradataml/data/jsons/sqle/17.00/Sessionize.json +105 -105
  479. teradataml/data/jsons/sqle/17.00/StringSimilarity.json +86 -86
  480. teradataml/data/jsons/sqle/17.00/Unpack.json +166 -166
  481. teradataml/data/jsons/sqle/17.00/nPath.json +269 -269
  482. teradataml/data/jsons/sqle/17.05/Antiselect.json +56 -56
  483. teradataml/data/jsons/sqle/17.05/Attribution.json +249 -249
  484. teradataml/data/jsons/sqle/17.05/DecisionForestPredict.json +156 -156
  485. teradataml/data/jsons/sqle/17.05/DecisionTreePredict.json +170 -170
  486. teradataml/data/jsons/sqle/17.05/GLMPredict.json +122 -122
  487. teradataml/data/jsons/sqle/17.05/MovingAverage.json +367 -367
  488. teradataml/data/jsons/sqle/17.05/NGramSplitter.json +239 -239
  489. teradataml/data/jsons/sqle/17.05/NaiveBayesPredict.json +136 -136
  490. teradataml/data/jsons/sqle/17.05/NaiveBayesTextClassifierPredict.json +235 -235
  491. teradataml/data/jsons/sqle/17.05/Pack.json +98 -98
  492. teradataml/data/jsons/sqle/17.05/SVMSparsePredict.json +162 -162
  493. teradataml/data/jsons/sqle/17.05/Sessionize.json +105 -105
  494. teradataml/data/jsons/sqle/17.05/StringSimilarity.json +86 -86
  495. teradataml/data/jsons/sqle/17.05/Unpack.json +166 -166
  496. teradataml/data/jsons/sqle/17.05/nPath.json +269 -269
  497. teradataml/data/jsons/sqle/17.10/Antiselect.json +56 -56
  498. teradataml/data/jsons/sqle/17.10/Attribution.json +249 -249
  499. teradataml/data/jsons/sqle/17.10/DecisionForestPredict.json +185 -185
  500. teradataml/data/jsons/sqle/17.10/DecisionTreePredict.json +171 -171
  501. teradataml/data/jsons/sqle/17.10/GLMPredict.json +151 -151
  502. teradataml/data/jsons/sqle/17.10/MovingAverage.json +368 -368
  503. teradataml/data/jsons/sqle/17.10/NGramSplitter.json +239 -239
  504. teradataml/data/jsons/sqle/17.10/NaiveBayesPredict.json +149 -149
  505. teradataml/data/jsons/sqle/17.10/NaiveBayesTextClassifierPredict.json +288 -288
  506. teradataml/data/jsons/sqle/17.10/Pack.json +133 -133
  507. teradataml/data/jsons/sqle/17.10/SVMSparsePredict.json +193 -193
  508. teradataml/data/jsons/sqle/17.10/Sessionize.json +105 -105
  509. teradataml/data/jsons/sqle/17.10/StringSimilarity.json +86 -86
  510. teradataml/data/jsons/sqle/17.10/TD_BinCodeFit.json +239 -239
  511. teradataml/data/jsons/sqle/17.10/TD_BinCodeTransform.json +70 -70
  512. teradataml/data/jsons/sqle/17.10/TD_CategoricalSummary.json +53 -53
  513. teradataml/data/jsons/sqle/17.10/TD_Chisq.json +67 -67
  514. teradataml/data/jsons/sqle/17.10/TD_ColumnSummary.json +53 -53
  515. teradataml/data/jsons/sqle/17.10/TD_ConvertTo.json +68 -68
  516. teradataml/data/jsons/sqle/17.10/TD_FTest.json +187 -187
  517. teradataml/data/jsons/sqle/17.10/TD_FillRowID.json +51 -51
  518. teradataml/data/jsons/sqle/17.10/TD_FunctionFit.json +46 -46
  519. teradataml/data/jsons/sqle/17.10/TD_FunctionTransform.json +72 -71
  520. teradataml/data/jsons/sqle/17.10/TD_GetRowsWithMissingValues.json +52 -52
  521. teradataml/data/jsons/sqle/17.10/TD_GetRowsWithoutMissingValues.json +52 -52
  522. teradataml/data/jsons/sqle/17.10/TD_Histogram.json +132 -132
  523. teradataml/data/jsons/sqle/17.10/TD_NumApply.json +147 -147
  524. teradataml/data/jsons/sqle/17.10/TD_OneHotEncodingFit.json +182 -182
  525. teradataml/data/jsons/sqle/17.10/TD_OneHotEncodingTransform.json +65 -64
  526. teradataml/data/jsons/sqle/17.10/TD_OutlierFilterFit.json +196 -196
  527. teradataml/data/jsons/sqle/17.10/TD_OutlierFilterTransform.json +48 -47
  528. teradataml/data/jsons/sqle/17.10/TD_PolynomialFeaturesFit.json +114 -114
  529. teradataml/data/jsons/sqle/17.10/TD_PolynomialFeaturesTransform.json +72 -71
  530. teradataml/data/jsons/sqle/17.10/TD_QQNorm.json +111 -111
  531. teradataml/data/jsons/sqle/17.10/TD_RoundColumns.json +93 -93
  532. teradataml/data/jsons/sqle/17.10/TD_RowNormalizeFit.json +127 -127
  533. teradataml/data/jsons/sqle/17.10/TD_RowNormalizeTransform.json +70 -69
  534. teradataml/data/jsons/sqle/17.10/TD_ScaleFit.json +156 -156
  535. teradataml/data/jsons/sqle/17.10/TD_ScaleTransform.json +70 -69
  536. teradataml/data/jsons/sqle/17.10/TD_SimpleImputeFit.json +147 -147
  537. teradataml/data/jsons/sqle/17.10/TD_SimpleImputeTransform.json +48 -47
  538. teradataml/data/jsons/sqle/17.10/TD_StrApply.json +240 -240
  539. teradataml/data/jsons/sqle/17.10/TD_UnivariateStatistics.json +118 -118
  540. teradataml/data/jsons/sqle/17.10/TD_WhichMax.json +52 -52
  541. teradataml/data/jsons/sqle/17.10/TD_WhichMin.json +52 -52
  542. teradataml/data/jsons/sqle/17.10/TD_ZTest.json +171 -171
  543. teradataml/data/jsons/sqle/17.10/Unpack.json +188 -188
  544. teradataml/data/jsons/sqle/17.10/nPath.json +269 -269
  545. teradataml/data/jsons/sqle/17.20/Antiselect.json +56 -56
  546. teradataml/data/jsons/sqle/17.20/Attribution.json +249 -249
  547. teradataml/data/jsons/sqle/17.20/DecisionForestPredict.json +185 -185
  548. teradataml/data/jsons/sqle/17.20/DecisionTreePredict.json +172 -172
  549. teradataml/data/jsons/sqle/17.20/GLMPredict.json +151 -151
  550. teradataml/data/jsons/sqle/17.20/MovingAverage.json +367 -367
  551. teradataml/data/jsons/sqle/17.20/NGramSplitter.json +239 -239
  552. teradataml/data/jsons/sqle/17.20/NaiveBayesPredict.json +149 -149
  553. teradataml/data/jsons/sqle/17.20/NaiveBayesTextClassifierPredict.json +287 -287
  554. teradataml/data/jsons/sqle/17.20/Pack.json +133 -133
  555. teradataml/data/jsons/sqle/17.20/SVMSparsePredict.json +192 -192
  556. teradataml/data/jsons/sqle/17.20/Sessionize.json +105 -105
  557. teradataml/data/jsons/sqle/17.20/StringSimilarity.json +86 -86
  558. teradataml/data/jsons/sqle/17.20/TD_ANOVA.json +76 -76
  559. teradataml/data/jsons/sqle/17.20/TD_BinCodeFit.json +239 -239
  560. teradataml/data/jsons/sqle/17.20/TD_BinCodeTransform.json +71 -71
  561. teradataml/data/jsons/sqle/17.20/TD_CategoricalSummary.json +53 -53
  562. teradataml/data/jsons/sqle/17.20/TD_Chisq.json +67 -67
  563. teradataml/data/jsons/sqle/17.20/TD_ClassificationEvaluator.json +145 -145
  564. teradataml/data/jsons/sqle/17.20/TD_ColumnSummary.json +53 -53
  565. teradataml/data/jsons/sqle/17.20/TD_ColumnTransformer.json +218 -218
  566. teradataml/data/jsons/sqle/17.20/TD_ConvertTo.json +92 -92
  567. teradataml/data/jsons/sqle/17.20/TD_DecisionForest.json +259 -259
  568. teradataml/data/jsons/sqle/17.20/TD_DecisionForestPredict.json +139 -139
  569. teradataml/data/jsons/sqle/17.20/TD_FTest.json +186 -186
  570. teradataml/data/jsons/sqle/17.20/TD_FillRowID.json +52 -52
  571. teradataml/data/jsons/sqle/17.20/TD_FunctionFit.json +46 -46
  572. teradataml/data/jsons/sqle/17.20/TD_FunctionTransform.json +72 -72
  573. teradataml/data/jsons/sqle/17.20/TD_GLM.json +431 -431
  574. teradataml/data/jsons/sqle/17.20/TD_GLMPREDICT.json +125 -125
  575. teradataml/data/jsons/sqle/17.20/TD_GLMPerSegment.json +411 -411
  576. teradataml/data/jsons/sqle/17.20/TD_GLMPredictPerSegment.json +146 -146
  577. teradataml/data/jsons/sqle/17.20/TD_GetFutileColumns.json +91 -91
  578. teradataml/data/jsons/sqle/17.20/TD_GetRowsWithMissingValues.json +76 -76
  579. teradataml/data/jsons/sqle/17.20/TD_GetRowsWithoutMissingValues.json +76 -76
  580. teradataml/data/jsons/sqle/17.20/TD_Histogram.json +152 -152
  581. teradataml/data/jsons/sqle/17.20/TD_KMeans.json +211 -211
  582. teradataml/data/jsons/sqle/17.20/TD_KMeansPredict.json +86 -86
  583. teradataml/data/jsons/sqle/17.20/TD_KNN.json +262 -262
  584. teradataml/data/jsons/sqle/17.20/TD_NaiveBayesTextClassifierTrainer.json +137 -137
  585. teradataml/data/jsons/sqle/17.20/TD_NonLinearCombineFit.json +101 -101
  586. teradataml/data/jsons/sqle/17.20/TD_NonLinearCombineTransform.json +71 -71
  587. teradataml/data/jsons/sqle/17.20/TD_NumApply.json +147 -147
  588. teradataml/data/jsons/sqle/17.20/TD_OneClassSVM.json +315 -315
  589. teradataml/data/jsons/sqle/17.20/TD_OneClassSVMPredict.json +123 -123
  590. teradataml/data/jsons/sqle/17.20/TD_OneHotEncodingFit.json +271 -271
  591. teradataml/data/jsons/sqle/17.20/TD_OneHotEncodingTransform.json +65 -65
  592. teradataml/data/jsons/sqle/17.20/TD_OrdinalEncodingFit.json +229 -229
  593. teradataml/data/jsons/sqle/17.20/TD_OrdinalEncodingTransform.json +75 -75
  594. teradataml/data/jsons/sqle/17.20/TD_OutlierFilterFit.json +217 -217
  595. teradataml/data/jsons/sqle/17.20/TD_OutlierFilterTransform.json +48 -48
  596. teradataml/data/jsons/sqle/17.20/TD_PolynomialFeaturesFit.json +114 -114
  597. teradataml/data/jsons/sqle/17.20/TD_PolynomialFeaturesTransform.json +72 -72
  598. teradataml/data/jsons/sqle/17.20/TD_QQNorm.json +111 -111
  599. teradataml/data/jsons/sqle/17.20/TD_ROC.json +177 -177
  600. teradataml/data/jsons/sqle/17.20/TD_RandomProjectionFit.json +178 -178
  601. teradataml/data/jsons/sqle/17.20/TD_RandomProjectionMinComponents.json +73 -73
  602. teradataml/data/jsons/sqle/17.20/TD_RandomProjectionTransform.json +74 -74
  603. teradataml/data/jsons/sqle/17.20/TD_RegressionEvaluator.json +137 -137
  604. teradataml/data/jsons/sqle/17.20/TD_RoundColumns.json +93 -93
  605. teradataml/data/jsons/sqle/17.20/TD_RowNormalizeFit.json +127 -127
  606. teradataml/data/jsons/sqle/17.20/TD_RowNormalizeTransform.json +70 -70
  607. teradataml/data/jsons/sqle/17.20/TD_SVM.json +389 -389
  608. teradataml/data/jsons/sqle/17.20/TD_SVMPredict.json +124 -124
  609. teradataml/data/jsons/sqle/17.20/TD_ScaleFit.json +156 -156
  610. teradataml/data/jsons/sqle/17.20/TD_ScaleTransform.json +70 -70
  611. teradataml/data/jsons/sqle/17.20/TD_SentimentExtractor.json +193 -193
  612. teradataml/data/jsons/sqle/17.20/TD_Silhouette.json +142 -142
  613. teradataml/data/jsons/sqle/17.20/TD_SimpleImputeFit.json +147 -147
  614. teradataml/data/jsons/sqle/17.20/TD_SimpleImputeTransform.json +48 -48
  615. teradataml/data/jsons/sqle/17.20/TD_StrApply.json +240 -240
  616. teradataml/data/jsons/sqle/17.20/TD_TargetEncodingFit.json +248 -248
  617. teradataml/data/jsons/sqle/17.20/TD_TargetEncodingTransform.json +75 -75
  618. teradataml/data/jsons/sqle/17.20/TD_TextParser.json +192 -192
  619. teradataml/data/jsons/sqle/17.20/TD_TrainTestSplit.json +142 -142
  620. teradataml/data/jsons/sqle/17.20/TD_UnivariateStatistics.json +117 -117
  621. teradataml/data/jsons/sqle/17.20/TD_VectorDistance.json +182 -182
  622. teradataml/data/jsons/sqle/17.20/TD_WhichMax.json +52 -52
  623. teradataml/data/jsons/sqle/17.20/TD_WhichMin.json +52 -52
  624. teradataml/data/jsons/sqle/17.20/TD_WordEmbeddings.json +241 -241
  625. teradataml/data/jsons/sqle/17.20/TD_XGBoost.json +312 -312
  626. teradataml/data/jsons/sqle/17.20/TD_XGBoostPredict.json +182 -182
  627. teradataml/data/jsons/sqle/17.20/TD_ZTest.json +170 -170
  628. teradataml/data/jsons/sqle/17.20/Unpack.json +188 -188
  629. teradataml/data/jsons/sqle/17.20/nPath.json +269 -269
  630. teradataml/data/jsons/tableoperator/17.00/read_nos.json +197 -197
  631. teradataml/data/jsons/tableoperator/17.05/read_nos.json +197 -197
  632. teradataml/data/jsons/tableoperator/17.05/write_nos.json +194 -194
  633. teradataml/data/jsons/tableoperator/17.10/read_nos.json +183 -183
  634. teradataml/data/jsons/tableoperator/17.10/write_nos.json +194 -194
  635. teradataml/data/jsons/tableoperator/17.20/read_nos.json +182 -182
  636. teradataml/data/jsons/tableoperator/17.20/write_nos.json +223 -223
  637. teradataml/data/jsons/uaf/17.20/TD_ACF.json +149 -149
  638. teradataml/data/jsons/uaf/17.20/TD_ARIMAESTIMATE.json +409 -409
  639. teradataml/data/jsons/uaf/17.20/TD_ARIMAFORECAST.json +79 -79
  640. teradataml/data/jsons/uaf/17.20/TD_ARIMAVALIDATE.json +151 -151
  641. teradataml/data/jsons/uaf/17.20/TD_BINARYMATRIXOP.json +109 -109
  642. teradataml/data/jsons/uaf/17.20/TD_BINARYSERIESOP.json +107 -107
  643. teradataml/data/jsons/uaf/17.20/TD_BREUSCH_GODFREY.json +87 -87
  644. teradataml/data/jsons/uaf/17.20/TD_BREUSCH_PAGAN_GODFREY.json +106 -106
  645. teradataml/data/jsons/uaf/17.20/TD_CONVOLVE.json +80 -80
  646. teradataml/data/jsons/uaf/17.20/TD_CONVOLVE2.json +67 -67
  647. teradataml/data/jsons/uaf/17.20/TD_CUMUL_PERIODOGRAM.json +91 -91
  648. teradataml/data/jsons/uaf/17.20/TD_DFFT.json +136 -136
  649. teradataml/data/jsons/uaf/17.20/TD_DFFT2.json +148 -148
  650. teradataml/data/jsons/uaf/17.20/TD_DFFT2CONV.json +108 -108
  651. teradataml/data/jsons/uaf/17.20/TD_DFFTCONV.json +109 -109
  652. teradataml/data/jsons/uaf/17.20/TD_DICKEY_FULLER.json +86 -86
  653. teradataml/data/jsons/uaf/17.20/TD_DIFF.json +91 -91
  654. teradataml/data/jsons/uaf/17.20/TD_DTW.json +116 -116
  655. teradataml/data/jsons/uaf/17.20/TD_DURBIN_WATSON.json +100 -100
  656. teradataml/data/jsons/uaf/17.20/TD_EXTRACT_RESULTS.json +38 -38
  657. teradataml/data/jsons/uaf/17.20/TD_FITMETRICS.json +100 -100
  658. teradataml/data/jsons/uaf/17.20/TD_GENSERIES4FORMULA.json +84 -84
  659. teradataml/data/jsons/uaf/17.20/TD_GENSERIES4SINUSOIDS.json +70 -70
  660. teradataml/data/jsons/uaf/17.20/TD_GOLDFELD_QUANDT.json +152 -152
  661. teradataml/data/jsons/uaf/17.20/TD_HOLT_WINTERS_FORECAST.json +313 -313
  662. teradataml/data/jsons/uaf/17.20/TD_IDFFT.json +57 -57
  663. teradataml/data/jsons/uaf/17.20/TD_IDFFT2.json +94 -94
  664. teradataml/data/jsons/uaf/17.20/TD_INPUTVALIDATOR.json +63 -63
  665. teradataml/data/jsons/uaf/17.20/TD_LINEAR_REGR.json +181 -181
  666. teradataml/data/jsons/uaf/17.20/TD_LINESPEC.json +102 -102
  667. teradataml/data/jsons/uaf/17.20/TD_MAMEAN.json +182 -182
  668. teradataml/data/jsons/uaf/17.20/TD_MATRIXMULTIPLY.json +67 -67
  669. teradataml/data/jsons/uaf/17.20/TD_MINFO.json +66 -66
  670. teradataml/data/jsons/uaf/17.20/TD_MULTIVAR_REGR.json +178 -178
  671. teradataml/data/jsons/uaf/17.20/TD_PACF.json +114 -114
  672. teradataml/data/jsons/uaf/17.20/TD_PORTMAN.json +118 -118
  673. teradataml/data/jsons/uaf/17.20/TD_POWERSPEC.json +175 -175
  674. teradataml/data/jsons/uaf/17.20/TD_POWERTRANSFORM.json +97 -97
  675. teradataml/data/jsons/uaf/17.20/TD_RESAMPLE.json +173 -173
  676. teradataml/data/jsons/uaf/17.20/TD_SEASONALNORMALIZE.json +136 -136
  677. teradataml/data/jsons/uaf/17.20/TD_SELECTION_CRITERIA.json +89 -89
  678. teradataml/data/jsons/uaf/17.20/TD_SIGNIF_PERIODICITIES.json +79 -79
  679. teradataml/data/jsons/uaf/17.20/TD_SIGNIF_RESIDMEAN.json +67 -67
  680. teradataml/data/jsons/uaf/17.20/TD_SIMPLEEXP.json +184 -184
  681. teradataml/data/jsons/uaf/17.20/TD_SINFO.json +57 -57
  682. teradataml/data/jsons/uaf/17.20/TD_SMOOTHMA.json +162 -162
  683. teradataml/data/jsons/uaf/17.20/TD_TRACKINGOP.json +100 -100
  684. teradataml/data/jsons/uaf/17.20/TD_UNDIFF.json +111 -111
  685. teradataml/data/jsons/uaf/17.20/TD_UNNORMALIZE.json +95 -95
  686. teradataml/data/jsons/uaf/17.20/TD_WHITES_GENERAL.json +77 -77
  687. teradataml/data/kmeans_example.json +17 -17
  688. teradataml/data/kmeans_us_arrests_data.csv +0 -0
  689. teradataml/data/knn_example.json +18 -18
  690. teradataml/data/knnrecommender_example.json +6 -6
  691. teradataml/data/knnrecommenderpredict_example.json +12 -12
  692. teradataml/data/lar_example.json +17 -17
  693. teradataml/data/larpredict_example.json +30 -30
  694. teradataml/data/lc_new_predictors.csv +5 -5
  695. teradataml/data/lc_new_reference.csv +9 -9
  696. teradataml/data/lda_example.json +8 -8
  697. teradataml/data/ldainference_example.json +14 -14
  698. teradataml/data/ldatopicsummary_example.json +8 -8
  699. teradataml/data/levendist_input.csv +13 -13
  700. teradataml/data/levenshteindistance_example.json +10 -10
  701. teradataml/data/linreg_example.json +9 -9
  702. teradataml/data/load_example_data.py +326 -323
  703. teradataml/data/loan_prediction.csv +295 -295
  704. teradataml/data/lungcancer.csv +138 -138
  705. teradataml/data/mappingdata.csv +12 -12
  706. teradataml/data/milk_timeseries.csv +157 -157
  707. teradataml/data/min_max_titanic.csv +4 -4
  708. teradataml/data/minhash_example.json +6 -6
  709. teradataml/data/ml_ratings.csv +7547 -7547
  710. teradataml/data/ml_ratings_10.csv +2445 -2445
  711. teradataml/data/model1_table.csv +5 -5
  712. teradataml/data/model2_table.csv +5 -5
  713. teradataml/data/models/iris_db_glm_model.pmml +56 -56
  714. teradataml/data/models/iris_db_xgb_model.pmml +4471 -4471
  715. teradataml/data/modularity_example.json +12 -12
  716. teradataml/data/movavg_example.json +7 -7
  717. teradataml/data/mtx1.csv +7 -7
  718. teradataml/data/mtx2.csv +13 -13
  719. teradataml/data/multi_model_classification.csv +401 -0
  720. teradataml/data/multi_model_regression.csv +401 -0
  721. teradataml/data/mvdfft8.csv +9 -9
  722. teradataml/data/naivebayes_example.json +9 -9
  723. teradataml/data/naivebayespredict_example.json +19 -19
  724. teradataml/data/naivebayestextclassifier2_example.json +6 -6
  725. teradataml/data/naivebayestextclassifier_example.json +8 -8
  726. teradataml/data/naivebayestextclassifierpredict_example.json +20 -20
  727. teradataml/data/name_Find_configure.csv +10 -10
  728. teradataml/data/namedentityfinder_example.json +14 -14
  729. teradataml/data/namedentityfinderevaluator_example.json +10 -10
  730. teradataml/data/namedentityfindertrainer_example.json +6 -6
  731. teradataml/data/nb_iris_input_test.csv +31 -31
  732. teradataml/data/nb_iris_input_train.csv +121 -121
  733. teradataml/data/nbp_iris_model.csv +13 -13
  734. teradataml/data/ner_extractor_text.csv +2 -2
  735. teradataml/data/ner_sports_test2.csv +29 -29
  736. teradataml/data/ner_sports_train.csv +501 -501
  737. teradataml/data/nerevaluator_example.json +5 -5
  738. teradataml/data/nerextractor_example.json +18 -18
  739. teradataml/data/nermem_sports_test.csv +17 -17
  740. teradataml/data/nermem_sports_train.csv +50 -50
  741. teradataml/data/nertrainer_example.json +6 -6
  742. teradataml/data/ngrams_example.json +6 -6
  743. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Aggregate Functions using SQLAlchemy.ipynb +1455 -1455
  744. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Arithmetic Functions Using SQLAlchemy.ipynb +1993 -1993
  745. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Bit-Byte Manipulation Functions using SQLAlchemy.ipynb +1492 -1492
  746. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Built-in functions using SQLAlchemy.ipynb +536 -536
  747. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Regular Expressions Using SQLAlchemy.ipynb +570 -570
  748. teradataml/data/notebooks/sqlalchemy/Teradata Vantage String Functions Using SQLAlchemy.ipynb +2559 -2559
  749. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Window Aggregate Functions using SQLAlchemy.ipynb +2911 -2911
  750. teradataml/data/notebooks/sqlalchemy/Using Generic SQLAlchemy ClauseElements teradataml DataFrame assign method.ipynb +698 -698
  751. teradataml/data/notebooks/sqlalchemy/teradataml filtering using SQLAlchemy ClauseElements.ipynb +784 -784
  752. teradataml/data/npath_example.json +23 -23
  753. teradataml/data/ntree_example.json +14 -14
  754. teradataml/data/numeric_strings.csv +4 -4
  755. teradataml/data/numerics.csv +4 -4
  756. teradataml/data/ocean_buoy.csv +17 -17
  757. teradataml/data/ocean_buoy2.csv +17 -17
  758. teradataml/data/ocean_buoys.csv +27 -27
  759. teradataml/data/ocean_buoys2.csv +10 -10
  760. teradataml/data/ocean_buoys_nonpti.csv +28 -28
  761. teradataml/data/ocean_buoys_seq.csv +29 -29
  762. teradataml/data/openml_example.json +63 -0
  763. teradataml/data/optional_event_table.csv +4 -4
  764. teradataml/data/orders1.csv +11 -11
  765. teradataml/data/orders1_12.csv +12 -12
  766. teradataml/data/orders_ex.csv +4 -4
  767. teradataml/data/pack_example.json +8 -8
  768. teradataml/data/package_tracking.csv +19 -19
  769. teradataml/data/package_tracking_pti.csv +18 -18
  770. teradataml/data/pagerank_example.json +13 -13
  771. teradataml/data/paragraphs_input.csv +6 -6
  772. teradataml/data/pathanalyzer_example.json +7 -7
  773. teradataml/data/pathgenerator_example.json +7 -7
  774. teradataml/data/phrases.csv +7 -7
  775. teradataml/data/pivot_example.json +8 -8
  776. teradataml/data/pivot_input.csv +22 -22
  777. teradataml/data/playerRating.csv +31 -31
  778. teradataml/data/postagger_example.json +6 -6
  779. teradataml/data/posttagger_output.csv +44 -44
  780. teradataml/data/production_data.csv +16 -16
  781. teradataml/data/production_data2.csv +7 -7
  782. teradataml/data/randomsample_example.json +31 -31
  783. teradataml/data/randomwalksample_example.json +8 -8
  784. teradataml/data/rank_table.csv +6 -6
  785. teradataml/data/ref_mobile_data.csv +4 -4
  786. teradataml/data/ref_mobile_data_dense.csv +2 -2
  787. teradataml/data/ref_url.csv +17 -17
  788. teradataml/data/restaurant_reviews.csv +7 -7
  789. teradataml/data/river_data.csv +145 -145
  790. teradataml/data/roc_example.json +7 -7
  791. teradataml/data/roc_input.csv +101 -101
  792. teradataml/data/rule_inputs.csv +6 -6
  793. teradataml/data/rule_table.csv +2 -2
  794. teradataml/data/sales.csv +7 -7
  795. teradataml/data/sales_transaction.csv +501 -501
  796. teradataml/data/salesdata.csv +342 -342
  797. teradataml/data/sample_cities.csv +2 -2
  798. teradataml/data/sample_shapes.csv +10 -10
  799. teradataml/data/sample_streets.csv +2 -2
  800. teradataml/data/sampling_example.json +15 -15
  801. teradataml/data/sax_example.json +8 -8
  802. teradataml/data/scale_example.json +23 -23
  803. teradataml/data/scale_housing.csv +11 -11
  804. teradataml/data/scale_housing_test.csv +6 -6
  805. teradataml/data/scale_stat.csv +11 -11
  806. teradataml/data/scalebypartition_example.json +13 -13
  807. teradataml/data/scalemap_example.json +13 -13
  808. teradataml/data/scalesummary_example.json +12 -12
  809. teradataml/data/score_category.csv +101 -101
  810. teradataml/data/score_summary.csv +4 -4
  811. teradataml/data/script_example.json +9 -9
  812. teradataml/data/scripts/deploy_script.py +65 -0
  813. teradataml/data/scripts/mapper.R +20 -0
  814. teradataml/data/scripts/mapper.py +15 -15
  815. teradataml/data/scripts/mapper_replace.py +15 -15
  816. teradataml/data/scripts/sklearn/__init__.py +0 -0
  817. teradataml/data/scripts/sklearn/sklearn_fit.py +175 -0
  818. teradataml/data/scripts/sklearn/sklearn_fit_predict.py +135 -0
  819. teradataml/data/scripts/sklearn/sklearn_function.template +113 -0
  820. teradataml/data/scripts/sklearn/sklearn_model_selection_split.py +158 -0
  821. teradataml/data/scripts/sklearn/sklearn_neighbors.py +152 -0
  822. teradataml/data/scripts/sklearn/sklearn_score.py +128 -0
  823. teradataml/data/scripts/sklearn/sklearn_transform.py +179 -0
  824. teradataml/data/seeds.csv +10 -10
  825. teradataml/data/sentenceextractor_example.json +6 -6
  826. teradataml/data/sentiment_extract_input.csv +11 -11
  827. teradataml/data/sentiment_train.csv +16 -16
  828. teradataml/data/sentiment_word.csv +20 -20
  829. teradataml/data/sentiment_word_input.csv +19 -19
  830. teradataml/data/sentimentextractor_example.json +24 -24
  831. teradataml/data/sentimenttrainer_example.json +8 -8
  832. teradataml/data/sequence_table.csv +10 -10
  833. teradataml/data/seriessplitter_example.json +7 -7
  834. teradataml/data/sessionize_example.json +17 -17
  835. teradataml/data/sessionize_table.csv +116 -116
  836. teradataml/data/setop_test1.csv +24 -24
  837. teradataml/data/setop_test2.csv +22 -22
  838. teradataml/data/soc_nw_edges.csv +10 -10
  839. teradataml/data/soc_nw_vertices.csv +7 -7
  840. teradataml/data/souvenir_timeseries.csv +167 -167
  841. teradataml/data/sparse_iris_attribute.csv +5 -5
  842. teradataml/data/sparse_iris_test.csv +121 -121
  843. teradataml/data/sparse_iris_train.csv +601 -601
  844. teradataml/data/star1.csv +6 -6
  845. teradataml/data/state_transition.csv +5 -5
  846. teradataml/data/stock_data.csv +53 -53
  847. teradataml/data/stock_movement.csv +11 -11
  848. teradataml/data/stock_vol.csv +76 -76
  849. teradataml/data/stop_words.csv +8 -8
  850. teradataml/data/store_sales.csv +37 -37
  851. teradataml/data/stringsimilarity_example.json +7 -7
  852. teradataml/data/strsimilarity_input.csv +13 -13
  853. teradataml/data/students.csv +101 -101
  854. teradataml/data/svm_iris_input_test.csv +121 -121
  855. teradataml/data/svm_iris_input_train.csv +481 -481
  856. teradataml/data/svm_iris_model.csv +7 -7
  857. teradataml/data/svmdense_example.json +9 -9
  858. teradataml/data/svmdensepredict_example.json +18 -18
  859. teradataml/data/svmsparse_example.json +7 -7
  860. teradataml/data/svmsparsepredict_example.json +13 -13
  861. teradataml/data/svmsparsesummary_example.json +7 -7
  862. teradataml/data/target_mobile_data.csv +13 -13
  863. teradataml/data/target_mobile_data_dense.csv +5 -5
  864. teradataml/data/templatedata.csv +1201 -1201
  865. teradataml/data/templates/open_source_ml.json +9 -0
  866. teradataml/data/teradataml_example.json +73 -1
  867. teradataml/data/test_classification.csv +101 -0
  868. teradataml/data/test_loan_prediction.csv +53 -53
  869. teradataml/data/test_pacf_12.csv +37 -37
  870. teradataml/data/test_prediction.csv +101 -0
  871. teradataml/data/test_regression.csv +101 -0
  872. teradataml/data/test_river2.csv +109 -109
  873. teradataml/data/text_inputs.csv +6 -6
  874. teradataml/data/textchunker_example.json +7 -7
  875. teradataml/data/textclassifier_example.json +6 -6
  876. teradataml/data/textclassifier_input.csv +7 -7
  877. teradataml/data/textclassifiertrainer_example.json +6 -6
  878. teradataml/data/textmorph_example.json +5 -5
  879. teradataml/data/textparser_example.json +15 -15
  880. teradataml/data/texttagger_example.json +11 -11
  881. teradataml/data/texttokenizer_example.json +6 -6
  882. teradataml/data/texttrainer_input.csv +11 -11
  883. teradataml/data/tf_example.json +6 -6
  884. teradataml/data/tfidf_example.json +13 -13
  885. teradataml/data/tfidf_input1.csv +201 -201
  886. teradataml/data/tfidf_train.csv +6 -6
  887. teradataml/data/time_table1.csv +535 -535
  888. teradataml/data/time_table2.csv +14 -14
  889. teradataml/data/timeseriesdata.csv +1601 -1601
  890. teradataml/data/timeseriesdatasetsd4.csv +105 -105
  891. teradataml/data/titanic.csv +892 -892
  892. teradataml/data/token_table.csv +696 -696
  893. teradataml/data/train_multiclass.csv +101 -0
  894. teradataml/data/train_regression.csv +101 -0
  895. teradataml/data/train_regression_multiple_labels.csv +101 -0
  896. teradataml/data/train_tracking.csv +27 -27
  897. teradataml/data/transformation_table.csv +5 -5
  898. teradataml/data/transformation_table_new.csv +1 -1
  899. teradataml/data/tv_spots.csv +16 -16
  900. teradataml/data/twod_climate_data.csv +117 -117
  901. teradataml/data/uaf_example.json +475 -475
  902. teradataml/data/univariatestatistics_example.json +8 -8
  903. teradataml/data/unpack_example.json +9 -9
  904. teradataml/data/unpivot_example.json +9 -9
  905. teradataml/data/unpivot_input.csv +8 -8
  906. teradataml/data/us_air_pass.csv +36 -36
  907. teradataml/data/us_population.csv +624 -624
  908. teradataml/data/us_states_shapes.csv +52 -52
  909. teradataml/data/varmax_example.json +17 -17
  910. teradataml/data/vectordistance_example.json +25 -25
  911. teradataml/data/ville_climatedata.csv +121 -121
  912. teradataml/data/ville_tempdata.csv +12 -12
  913. teradataml/data/ville_tempdata1.csv +12 -12
  914. teradataml/data/ville_temperature.csv +11 -11
  915. teradataml/data/waveletTable.csv +1605 -1605
  916. teradataml/data/waveletTable2.csv +1605 -1605
  917. teradataml/data/weightedmovavg_example.json +8 -8
  918. teradataml/data/wft_testing.csv +5 -5
  919. teradataml/data/wine_data.csv +1600 -0
  920. teradataml/data/word_embed_input_table1.csv +5 -5
  921. teradataml/data/word_embed_input_table2.csv +4 -4
  922. teradataml/data/word_embed_model.csv +22 -22
  923. teradataml/data/words_input.csv +13 -13
  924. teradataml/data/xconvolve_complex_left.csv +6 -6
  925. teradataml/data/xconvolve_complex_leftmulti.csv +6 -6
  926. teradataml/data/xgboost_example.json +35 -35
  927. teradataml/data/xgboostpredict_example.json +31 -31
  928. teradataml/dataframe/copy_to.py +1764 -1698
  929. teradataml/dataframe/data_transfer.py +2753 -2745
  930. teradataml/dataframe/dataframe.py +17545 -16946
  931. teradataml/dataframe/dataframe_utils.py +1837 -1740
  932. teradataml/dataframe/fastload.py +611 -603
  933. teradataml/dataframe/indexer.py +424 -424
  934. teradataml/dataframe/setop.py +1179 -1166
  935. teradataml/dataframe/sql.py +10090 -6432
  936. teradataml/dataframe/sql_function_parameters.py +439 -388
  937. teradataml/dataframe/sql_functions.py +652 -652
  938. teradataml/dataframe/sql_interfaces.py +220 -220
  939. teradataml/dataframe/vantage_function_types.py +674 -630
  940. teradataml/dataframe/window.py +693 -692
  941. teradataml/dbutils/__init__.py +3 -3
  942. teradataml/dbutils/dbutils.py +1167 -1150
  943. teradataml/dbutils/filemgr.py +267 -267
  944. teradataml/gen_ai/__init__.py +2 -2
  945. teradataml/gen_ai/convAI.py +472 -472
  946. teradataml/geospatial/__init__.py +3 -3
  947. teradataml/geospatial/geodataframe.py +1105 -1094
  948. teradataml/geospatial/geodataframecolumn.py +392 -387
  949. teradataml/geospatial/geometry_types.py +925 -925
  950. teradataml/hyperparameter_tuner/__init__.py +1 -1
  951. teradataml/hyperparameter_tuner/optimizer.py +3783 -2993
  952. teradataml/hyperparameter_tuner/utils.py +281 -187
  953. teradataml/lib/aed_0_1.dll +0 -0
  954. teradataml/lib/libaed_0_1.dylib +0 -0
  955. teradataml/lib/libaed_0_1.so +0 -0
  956. teradataml/libaed_0_1.dylib +0 -0
  957. teradataml/libaed_0_1.so +0 -0
  958. teradataml/opensource/__init__.py +1 -0
  959. teradataml/opensource/sklearn/__init__.py +1 -0
  960. teradataml/opensource/sklearn/_class.py +255 -0
  961. teradataml/opensource/sklearn/_sklearn_wrapper.py +1668 -0
  962. teradataml/opensource/sklearn/_wrapper_utils.py +268 -0
  963. teradataml/opensource/sklearn/constants.py +54 -0
  964. teradataml/options/__init__.py +121 -124
  965. teradataml/options/configure.py +337 -336
  966. teradataml/options/display.py +176 -176
  967. teradataml/plot/__init__.py +2 -2
  968. teradataml/plot/axis.py +1388 -1388
  969. teradataml/plot/constants.py +15 -15
  970. teradataml/plot/figure.py +398 -398
  971. teradataml/plot/plot.py +760 -760
  972. teradataml/plot/query_generator.py +83 -83
  973. teradataml/plot/subplot.py +216 -216
  974. teradataml/scriptmgmt/UserEnv.py +3788 -3761
  975. teradataml/scriptmgmt/__init__.py +3 -3
  976. teradataml/scriptmgmt/lls_utils.py +1616 -1604
  977. teradataml/series/series.py +532 -532
  978. teradataml/series/series_utils.py +71 -71
  979. teradataml/table_operators/Apply.py +949 -917
  980. teradataml/table_operators/Script.py +1719 -1982
  981. teradataml/table_operators/TableOperator.py +1207 -1616
  982. teradataml/table_operators/__init__.py +2 -3
  983. teradataml/table_operators/apply_query_generator.py +262 -262
  984. teradataml/table_operators/query_generator.py +507 -507
  985. teradataml/table_operators/table_operator_query_generator.py +460 -460
  986. teradataml/table_operators/table_operator_util.py +631 -639
  987. teradataml/table_operators/templates/dataframe_apply.template +184 -184
  988. teradataml/table_operators/templates/dataframe_map.template +176 -176
  989. teradataml/table_operators/templates/script_executor.template +170 -170
  990. teradataml/utils/dtypes.py +684 -684
  991. teradataml/utils/internal_buffer.py +84 -84
  992. teradataml/utils/print_versions.py +205 -205
  993. teradataml/utils/utils.py +410 -410
  994. teradataml/utils/validators.py +2239 -2115
  995. {teradataml-17.20.0.7.dist-info → teradataml-20.0.0.0.dist-info}/METADATA +270 -41
  996. teradataml-20.0.0.0.dist-info/RECORD +1038 -0
  997. {teradataml-17.20.0.7.dist-info → teradataml-20.0.0.0.dist-info}/WHEEL +1 -1
  998. {teradataml-17.20.0.7.dist-info → teradataml-20.0.0.0.dist-info}/zip-safe +1 -1
  999. teradataml/analytics/mle/AdaBoost.py +0 -651
  1000. teradataml/analytics/mle/AdaBoostPredict.py +0 -564
  1001. teradataml/analytics/mle/Antiselect.py +0 -342
  1002. teradataml/analytics/mle/Arima.py +0 -641
  1003. teradataml/analytics/mle/ArimaPredict.py +0 -477
  1004. teradataml/analytics/mle/Attribution.py +0 -1070
  1005. teradataml/analytics/mle/Betweenness.py +0 -658
  1006. teradataml/analytics/mle/Burst.py +0 -711
  1007. teradataml/analytics/mle/CCM.py +0 -600
  1008. teradataml/analytics/mle/CCMPrepare.py +0 -324
  1009. teradataml/analytics/mle/CFilter.py +0 -460
  1010. teradataml/analytics/mle/ChangePointDetection.py +0 -572
  1011. teradataml/analytics/mle/ChangePointDetectionRT.py +0 -477
  1012. teradataml/analytics/mle/Closeness.py +0 -737
  1013. teradataml/analytics/mle/ConfusionMatrix.py +0 -420
  1014. teradataml/analytics/mle/Correlation.py +0 -477
  1015. teradataml/analytics/mle/Correlation2.py +0 -573
  1016. teradataml/analytics/mle/CoxHazardRatio.py +0 -679
  1017. teradataml/analytics/mle/CoxPH.py +0 -556
  1018. teradataml/analytics/mle/CoxSurvival.py +0 -478
  1019. teradataml/analytics/mle/CumulativeMovAvg.py +0 -363
  1020. teradataml/analytics/mle/DTW.py +0 -623
  1021. teradataml/analytics/mle/DWT.py +0 -564
  1022. teradataml/analytics/mle/DWT2D.py +0 -599
  1023. teradataml/analytics/mle/DecisionForest.py +0 -716
  1024. teradataml/analytics/mle/DecisionForestEvaluator.py +0 -363
  1025. teradataml/analytics/mle/DecisionForestPredict.py +0 -561
  1026. teradataml/analytics/mle/DecisionTree.py +0 -830
  1027. teradataml/analytics/mle/DecisionTreePredict.py +0 -528
  1028. teradataml/analytics/mle/ExponentialMovAvg.py +0 -418
  1029. teradataml/analytics/mle/FMeasure.py +0 -402
  1030. teradataml/analytics/mle/FPGrowth.py +0 -734
  1031. teradataml/analytics/mle/FrequentPaths.py +0 -695
  1032. teradataml/analytics/mle/GLM.py +0 -558
  1033. teradataml/analytics/mle/GLML1L2.py +0 -547
  1034. teradataml/analytics/mle/GLML1L2Predict.py +0 -519
  1035. teradataml/analytics/mle/GLMPredict.py +0 -529
  1036. teradataml/analytics/mle/HMMDecoder.py +0 -945
  1037. teradataml/analytics/mle/HMMEvaluator.py +0 -901
  1038. teradataml/analytics/mle/HMMSupervised.py +0 -521
  1039. teradataml/analytics/mle/HMMUnsupervised.py +0 -572
  1040. teradataml/analytics/mle/Histogram.py +0 -561
  1041. teradataml/analytics/mle/IDWT.py +0 -476
  1042. teradataml/analytics/mle/IDWT2D.py +0 -493
  1043. teradataml/analytics/mle/IdentityMatch.py +0 -763
  1044. teradataml/analytics/mle/Interpolator.py +0 -918
  1045. teradataml/analytics/mle/KMeans.py +0 -485
  1046. teradataml/analytics/mle/KNN.py +0 -627
  1047. teradataml/analytics/mle/KNNRecommender.py +0 -488
  1048. teradataml/analytics/mle/KNNRecommenderPredict.py +0 -581
  1049. teradataml/analytics/mle/LAR.py +0 -439
  1050. teradataml/analytics/mle/LARPredict.py +0 -478
  1051. teradataml/analytics/mle/LDA.py +0 -548
  1052. teradataml/analytics/mle/LDAInference.py +0 -492
  1053. teradataml/analytics/mle/LDATopicSummary.py +0 -464
  1054. teradataml/analytics/mle/LevenshteinDistance.py +0 -450
  1055. teradataml/analytics/mle/LinReg.py +0 -433
  1056. teradataml/analytics/mle/LinRegPredict.py +0 -438
  1057. teradataml/analytics/mle/MinHash.py +0 -544
  1058. teradataml/analytics/mle/Modularity.py +0 -587
  1059. teradataml/analytics/mle/NEREvaluator.py +0 -410
  1060. teradataml/analytics/mle/NERExtractor.py +0 -595
  1061. teradataml/analytics/mle/NERTrainer.py +0 -458
  1062. teradataml/analytics/mle/NGrams.py +0 -570
  1063. teradataml/analytics/mle/NPath.py +0 -634
  1064. teradataml/analytics/mle/NTree.py +0 -549
  1065. teradataml/analytics/mle/NaiveBayes.py +0 -462
  1066. teradataml/analytics/mle/NaiveBayesPredict.py +0 -513
  1067. teradataml/analytics/mle/NaiveBayesTextClassifier.py +0 -607
  1068. teradataml/analytics/mle/NaiveBayesTextClassifier2.py +0 -531
  1069. teradataml/analytics/mle/NaiveBayesTextClassifierPredict.py +0 -799
  1070. teradataml/analytics/mle/NamedEntityFinder.py +0 -529
  1071. teradataml/analytics/mle/NamedEntityFinderEvaluator.py +0 -414
  1072. teradataml/analytics/mle/NamedEntityFinderTrainer.py +0 -396
  1073. teradataml/analytics/mle/POSTagger.py +0 -417
  1074. teradataml/analytics/mle/Pack.py +0 -411
  1075. teradataml/analytics/mle/PageRank.py +0 -535
  1076. teradataml/analytics/mle/PathAnalyzer.py +0 -426
  1077. teradataml/analytics/mle/PathGenerator.py +0 -367
  1078. teradataml/analytics/mle/PathStart.py +0 -464
  1079. teradataml/analytics/mle/PathSummarizer.py +0 -470
  1080. teradataml/analytics/mle/Pivot.py +0 -471
  1081. teradataml/analytics/mle/ROC.py +0 -425
  1082. teradataml/analytics/mle/RandomSample.py +0 -637
  1083. teradataml/analytics/mle/RandomWalkSample.py +0 -490
  1084. teradataml/analytics/mle/SAX.py +0 -779
  1085. teradataml/analytics/mle/SVMDense.py +0 -677
  1086. teradataml/analytics/mle/SVMDensePredict.py +0 -536
  1087. teradataml/analytics/mle/SVMDenseSummary.py +0 -437
  1088. teradataml/analytics/mle/SVMSparse.py +0 -557
  1089. teradataml/analytics/mle/SVMSparsePredict.py +0 -553
  1090. teradataml/analytics/mle/SVMSparseSummary.py +0 -435
  1091. teradataml/analytics/mle/Sampling.py +0 -549
  1092. teradataml/analytics/mle/Scale.py +0 -565
  1093. teradataml/analytics/mle/ScaleByPartition.py +0 -496
  1094. teradataml/analytics/mle/ScaleMap.py +0 -378
  1095. teradataml/analytics/mle/ScaleSummary.py +0 -320
  1096. teradataml/analytics/mle/SentenceExtractor.py +0 -363
  1097. teradataml/analytics/mle/SentimentEvaluator.py +0 -432
  1098. teradataml/analytics/mle/SentimentExtractor.py +0 -578
  1099. teradataml/analytics/mle/SentimentTrainer.py +0 -405
  1100. teradataml/analytics/mle/SeriesSplitter.py +0 -641
  1101. teradataml/analytics/mle/Sessionize.py +0 -475
  1102. teradataml/analytics/mle/SimpleMovAvg.py +0 -397
  1103. teradataml/analytics/mle/StringSimilarity.py +0 -425
  1104. teradataml/analytics/mle/TF.py +0 -389
  1105. teradataml/analytics/mle/TFIDF.py +0 -504
  1106. teradataml/analytics/mle/TextChunker.py +0 -414
  1107. teradataml/analytics/mle/TextClassifier.py +0 -399
  1108. teradataml/analytics/mle/TextClassifierEvaluator.py +0 -413
  1109. teradataml/analytics/mle/TextClassifierTrainer.py +0 -565
  1110. teradataml/analytics/mle/TextMorph.py +0 -494
  1111. teradataml/analytics/mle/TextParser.py +0 -623
  1112. teradataml/analytics/mle/TextTagger.py +0 -530
  1113. teradataml/analytics/mle/TextTokenizer.py +0 -502
  1114. teradataml/analytics/mle/UnivariateStatistics.py +0 -488
  1115. teradataml/analytics/mle/Unpack.py +0 -526
  1116. teradataml/analytics/mle/Unpivot.py +0 -438
  1117. teradataml/analytics/mle/VarMax.py +0 -776
  1118. teradataml/analytics/mle/VectorDistance.py +0 -762
  1119. teradataml/analytics/mle/WeightedMovAvg.py +0 -400
  1120. teradataml/analytics/mle/XGBoost.py +0 -842
  1121. teradataml/analytics/mle/XGBoostPredict.py +0 -627
  1122. teradataml/analytics/mle/__init__.py +0 -123
  1123. teradataml/analytics/mle/json/adaboost_mle.json +0 -135
  1124. teradataml/analytics/mle/json/adaboostpredict_mle.json +0 -85
  1125. teradataml/analytics/mle/json/antiselect_mle.json +0 -34
  1126. teradataml/analytics/mle/json/antiselect_mle_mle.json +0 -34
  1127. teradataml/analytics/mle/json/arima_mle.json +0 -172
  1128. teradataml/analytics/mle/json/arimapredict_mle.json +0 -52
  1129. teradataml/analytics/mle/json/attribution_mle_mle.json +0 -143
  1130. teradataml/analytics/mle/json/betweenness_mle.json +0 -97
  1131. teradataml/analytics/mle/json/burst_mle.json +0 -140
  1132. teradataml/analytics/mle/json/ccm_mle.json +0 -124
  1133. teradataml/analytics/mle/json/ccmprepare_mle.json +0 -14
  1134. teradataml/analytics/mle/json/cfilter_mle.json +0 -93
  1135. teradataml/analytics/mle/json/changepointdetection_mle.json +0 -92
  1136. teradataml/analytics/mle/json/changepointdetectionrt_mle.json +0 -78
  1137. teradataml/analytics/mle/json/closeness_mle.json +0 -104
  1138. teradataml/analytics/mle/json/confusionmatrix_mle.json +0 -79
  1139. teradataml/analytics/mle/json/correlation_mle.json +0 -86
  1140. teradataml/analytics/mle/json/correlationreduce_mle.json +0 -49
  1141. teradataml/analytics/mle/json/coxhazardratio_mle.json +0 -89
  1142. teradataml/analytics/mle/json/coxph_mle.json +0 -98
  1143. teradataml/analytics/mle/json/coxsurvival_mle.json +0 -79
  1144. teradataml/analytics/mle/json/cumulativemovavg_mle.json +0 -34
  1145. teradataml/analytics/mle/json/decisionforest_mle.json +0 -167
  1146. teradataml/analytics/mle/json/decisionforestevaluator_mle.json +0 -33
  1147. teradataml/analytics/mle/json/decisionforestpredict_mle_mle.json +0 -74
  1148. teradataml/analytics/mle/json/decisiontree_mle.json +0 -194
  1149. teradataml/analytics/mle/json/decisiontreepredict_mle_mle.json +0 -86
  1150. teradataml/analytics/mle/json/dtw_mle.json +0 -97
  1151. teradataml/analytics/mle/json/dwt2d_mle.json +0 -116
  1152. teradataml/analytics/mle/json/dwt_mle.json +0 -101
  1153. teradataml/analytics/mle/json/exponentialmovavg_mle.json +0 -55
  1154. teradataml/analytics/mle/json/fmeasure_mle.json +0 -58
  1155. teradataml/analytics/mle/json/fpgrowth_mle.json +0 -159
  1156. teradataml/analytics/mle/json/frequentpaths_mle.json +0 -129
  1157. teradataml/analytics/mle/json/glm_mle.json +0 -111
  1158. teradataml/analytics/mle/json/glml1l2_mle.json +0 -106
  1159. teradataml/analytics/mle/json/glml1l2predict_mle.json +0 -57
  1160. teradataml/analytics/mle/json/glmpredict_mle_mle.json +0 -74
  1161. teradataml/analytics/mle/json/histogram_mle.json +0 -100
  1162. teradataml/analytics/mle/json/hmmdecoder_mle.json +0 -192
  1163. teradataml/analytics/mle/json/hmmevaluator_mle.json +0 -206
  1164. teradataml/analytics/mle/json/hmmsupervised_mle.json +0 -91
  1165. teradataml/analytics/mle/json/hmmunsupervised_mle.json +0 -114
  1166. teradataml/analytics/mle/json/identitymatch_mle.json +0 -88
  1167. teradataml/analytics/mle/json/idwt2d_mle.json +0 -73
  1168. teradataml/analytics/mle/json/idwt_mle.json +0 -66
  1169. teradataml/analytics/mle/json/interpolator_mle.json +0 -151
  1170. teradataml/analytics/mle/json/kmeans_mle.json +0 -97
  1171. teradataml/analytics/mle/json/knn_mle.json +0 -141
  1172. teradataml/analytics/mle/json/knnrecommender_mle.json +0 -111
  1173. teradataml/analytics/mle/json/knnrecommenderpredict_mle.json +0 -75
  1174. teradataml/analytics/mle/json/lar_mle.json +0 -78
  1175. teradataml/analytics/mle/json/larpredict_mle.json +0 -69
  1176. teradataml/analytics/mle/json/lda_mle.json +0 -130
  1177. teradataml/analytics/mle/json/ldainference_mle.json +0 -78
  1178. teradataml/analytics/mle/json/ldatopicsummary_mle.json +0 -64
  1179. teradataml/analytics/mle/json/levenshteindistance_mle.json +0 -92
  1180. teradataml/analytics/mle/json/linreg_mle.json +0 -42
  1181. teradataml/analytics/mle/json/linregpredict_mle.json +0 -56
  1182. teradataml/analytics/mle/json/minhash_mle.json +0 -113
  1183. teradataml/analytics/mle/json/modularity_mle.json +0 -91
  1184. teradataml/analytics/mle/json/naivebayespredict_mle_mle.json +0 -85
  1185. teradataml/analytics/mle/json/naivebayesreduce_mle.json +0 -52
  1186. teradataml/analytics/mle/json/naivebayestextclassifierpredict_mle_mle.json +0 -147
  1187. teradataml/analytics/mle/json/naivebayestextclassifiertrainer2_mle.json +0 -108
  1188. teradataml/analytics/mle/json/naivebayestextclassifiertrainer_mle.json +0 -102
  1189. teradataml/analytics/mle/json/namedentityfinder_mle.json +0 -84
  1190. teradataml/analytics/mle/json/namedentityfinderevaluatorreduce_mle.json +0 -43
  1191. teradataml/analytics/mle/json/namedentityfindertrainer_mle.json +0 -64
  1192. teradataml/analytics/mle/json/nerevaluator_mle.json +0 -54
  1193. teradataml/analytics/mle/json/nerextractor_mle.json +0 -87
  1194. teradataml/analytics/mle/json/nertrainer_mle.json +0 -89
  1195. teradataml/analytics/mle/json/ngrams_mle.json +0 -137
  1196. teradataml/analytics/mle/json/ngramsplitter_mle_mle.json +0 -137
  1197. teradataml/analytics/mle/json/npath@coprocessor_mle.json +0 -73
  1198. teradataml/analytics/mle/json/ntree@coprocessor_mle.json +0 -123
  1199. teradataml/analytics/mle/json/pack_mle.json +0 -58
  1200. teradataml/analytics/mle/json/pack_mle_mle.json +0 -58
  1201. teradataml/analytics/mle/json/pagerank_mle.json +0 -81
  1202. teradataml/analytics/mle/json/pathanalyzer_mle.json +0 -63
  1203. teradataml/analytics/mle/json/pathgenerator_mle.json +0 -40
  1204. teradataml/analytics/mle/json/pathstart_mle.json +0 -62
  1205. teradataml/analytics/mle/json/pathsummarizer_mle.json +0 -72
  1206. teradataml/analytics/mle/json/pivoting_mle.json +0 -71
  1207. teradataml/analytics/mle/json/postagger_mle.json +0 -51
  1208. teradataml/analytics/mle/json/randomsample_mle.json +0 -131
  1209. teradataml/analytics/mle/json/randomwalksample_mle.json +0 -85
  1210. teradataml/analytics/mle/json/roc_mle.json +0 -73
  1211. teradataml/analytics/mle/json/sampling_mle.json +0 -75
  1212. teradataml/analytics/mle/json/sax_mle.json +0 -154
  1213. teradataml/analytics/mle/json/scale_mle.json +0 -93
  1214. teradataml/analytics/mle/json/scalebypartition_mle.json +0 -89
  1215. teradataml/analytics/mle/json/scalemap_mle.json +0 -44
  1216. teradataml/analytics/mle/json/scalesummary_mle.json +0 -14
  1217. teradataml/analytics/mle/json/sentenceextractor_mle.json +0 -41
  1218. teradataml/analytics/mle/json/sentimentevaluator_mle.json +0 -43
  1219. teradataml/analytics/mle/json/sentimentextractor_mle.json +0 -100
  1220. teradataml/analytics/mle/json/sentimenttrainer_mle.json +0 -68
  1221. teradataml/analytics/mle/json/seriessplitter_mle.json +0 -133
  1222. teradataml/analytics/mle/json/sessionize_mle_mle.json +0 -62
  1223. teradataml/analytics/mle/json/simplemovavg_mle.json +0 -48
  1224. teradataml/analytics/mle/json/stringsimilarity_mle.json +0 -50
  1225. teradataml/analytics/mle/json/stringsimilarity_mle_mle.json +0 -50
  1226. teradataml/analytics/mle/json/svmdense_mle.json +0 -165
  1227. teradataml/analytics/mle/json/svmdensepredict_mle.json +0 -95
  1228. teradataml/analytics/mle/json/svmdensesummary_mle.json +0 -58
  1229. teradataml/analytics/mle/json/svmsparse_mle.json +0 -148
  1230. teradataml/analytics/mle/json/svmsparsepredict_mle_mle.json +0 -103
  1231. teradataml/analytics/mle/json/svmsparsesummary_mle.json +0 -57
  1232. teradataml/analytics/mle/json/textchunker_mle.json +0 -40
  1233. teradataml/analytics/mle/json/textclassifier_mle.json +0 -51
  1234. teradataml/analytics/mle/json/textclassifierevaluator_mle.json +0 -43
  1235. teradataml/analytics/mle/json/textclassifiertrainer_mle.json +0 -103
  1236. teradataml/analytics/mle/json/textmorph_mle.json +0 -63
  1237. teradataml/analytics/mle/json/textparser_mle.json +0 -166
  1238. teradataml/analytics/mle/json/texttagger_mle.json +0 -81
  1239. teradataml/analytics/mle/json/texttokenizer_mle.json +0 -91
  1240. teradataml/analytics/mle/json/tf_mle.json +0 -33
  1241. teradataml/analytics/mle/json/tfidf_mle.json +0 -34
  1242. teradataml/analytics/mle/json/univariatestatistics_mle.json +0 -81
  1243. teradataml/analytics/mle/json/unpack_mle.json +0 -91
  1244. teradataml/analytics/mle/json/unpack_mle_mle.json +0 -91
  1245. teradataml/analytics/mle/json/unpivoting_mle.json +0 -63
  1246. teradataml/analytics/mle/json/varmax_mle.json +0 -176
  1247. teradataml/analytics/mle/json/vectordistance_mle.json +0 -179
  1248. teradataml/analytics/mle/json/weightedmovavg_mle.json +0 -48
  1249. teradataml/analytics/mle/json/xgboost_mle.json +0 -178
  1250. teradataml/analytics/mle/json/xgboostpredict_mle.json +0 -104
  1251. teradataml/analytics/sqle/Antiselect.py +0 -321
  1252. teradataml/analytics/sqle/Attribution.py +0 -603
  1253. teradataml/analytics/sqle/DecisionForestPredict.py +0 -408
  1254. teradataml/analytics/sqle/GLMPredict.py +0 -430
  1255. teradataml/analytics/sqle/MovingAverage.py +0 -543
  1256. teradataml/analytics/sqle/NGramSplitter.py +0 -548
  1257. teradataml/analytics/sqle/NPath.py +0 -632
  1258. teradataml/analytics/sqle/NaiveBayesTextClassifierPredict.py +0 -515
  1259. teradataml/analytics/sqle/Pack.py +0 -388
  1260. teradataml/analytics/sqle/SVMSparsePredict.py +0 -464
  1261. teradataml/analytics/sqle/Sessionize.py +0 -390
  1262. teradataml/analytics/sqle/StringSimilarity.py +0 -400
  1263. teradataml/analytics/sqle/Unpack.py +0 -503
  1264. teradataml/analytics/sqle/json/antiselect_sqle.json +0 -21
  1265. teradataml/analytics/sqle/json/attribution_sqle.json +0 -92
  1266. teradataml/analytics/sqle/json/decisionforestpredict_sqle.json +0 -48
  1267. teradataml/analytics/sqle/json/glmpredict_sqle.json +0 -48
  1268. teradataml/analytics/sqle/json/h2opredict_sqle.json +0 -63
  1269. teradataml/analytics/sqle/json/movingaverage_sqle.json +0 -58
  1270. teradataml/analytics/sqle/json/naivebayestextclassifierpredict_sqle.json +0 -76
  1271. teradataml/analytics/sqle/json/ngramsplitter_sqle.json +0 -126
  1272. teradataml/analytics/sqle/json/npath_sqle.json +0 -67
  1273. teradataml/analytics/sqle/json/pack_sqle.json +0 -47
  1274. teradataml/analytics/sqle/json/pmmlpredict_sqle.json +0 -55
  1275. teradataml/analytics/sqle/json/sessionize_sqle.json +0 -43
  1276. teradataml/analytics/sqle/json/stringsimilarity_sqle.json +0 -39
  1277. teradataml/analytics/sqle/json/svmsparsepredict_sqle.json +0 -74
  1278. teradataml/analytics/sqle/json/unpack_sqle.json +0 -80
  1279. teradataml/catalog/model_cataloging.py +0 -980
  1280. teradataml/config/mlengine_alias_definitions_v1.0 +0 -118
  1281. teradataml/config/mlengine_alias_definitions_v1.1 +0 -127
  1282. teradataml/config/mlengine_alias_definitions_v1.3 +0 -129
  1283. teradataml/table_operators/sandbox_container_util.py +0 -643
  1284. teradataml-17.20.0.7.dist-info/RECORD +0 -1280
  1285. {teradataml-17.20.0.7.dist-info → teradataml-20.0.0.0.dist-info}/top_level.txt +0 -0
@@ -1,1638 +1,1638 @@
1
- """
2
- Unpublished work.
3
- Copyright (c) 2021 by Teradata Corporation. All rights reserved.
4
- TERADATA CORPORATION CONFIDENTIAL AND TRADE SECRET
5
-
6
- Primary Owner: pradeep.garre@teradata.com
7
- Secondary Owner: PankajVinod.Purandare@teradata.com
8
-
9
- This file implements _AnlyFuncMetadata for representing the metadata (json data)
10
- of analytic function. All the functions/API's looking to extract the json data
11
- should look at corresponding API's in _AnlyFuncMetadata.
12
- """
13
- from collections import OrderedDict
14
- import json, os, sys
15
- from pathlib import Path
16
- from re import sub
17
- from teradataml.analytics.json_parser import PartitionKind, SqleJsonFields, UAFJsonFields, utils
18
- from teradataml.analytics.json_parser.analytic_functions_argument import _AnlyFuncArgument,\
19
- _AnlyFuncInput, _AnlyFuncOutput, _DependentArgument, _AnlyFuncArgumentUAF, _AnlyFuncOutputUAF, \
20
- _AnlyFuncInputUAF
21
- from teradataml.common.messages import Messages
22
- from teradataml.common.messagecodes import MessageCodes
23
- from teradataml.common.constants import TeradataAnalyticFunctionTypes, TeradataUAFSpecificArgs,\
24
- TeradataAnalyticFunctionInfo
25
- from teradataml.common.exceptions import TeradataMlException
26
- from teradataml.common.utils import UtilFuncs
27
- from teradataml.utils.validators import _Validators
28
- from teradataml.utils.dtypes import _ListOf
29
-
30
- class _PairedFunction:
31
- """
32
- Class to hold the paired function information for analytic functions.
33
- It holds the information about the relation between the analytic
34
- functions.
35
- """
36
- def __init__(self, function_relation, params):
37
- """
38
- DESCRIPTION:
39
- Constructor of the class.
40
-
41
- PARAMETERS:
42
- function_relation:
43
- Required Argument.
44
- Specifies the relation of the paired function.
45
- Type: str
46
-
47
- params:
48
- Required Argument.
49
- Specifies the reference_function, input_arguments,
50
- and model_output_argument wrt the paired function.
51
- Type: dict
52
- """
53
- self.function_relation = function_relation
54
- self.reference_function = params.get("reference_function", [])
55
- self.input_arguments = params.get("input_arguments", [])
56
- self.model_output_arguments = params.get("model_output_arguments", [])
57
-
58
- @property
59
- def arguments(self):
60
- """
61
- DESCRIPTION:
62
- Function to get the input argument of paired function and output argument of referenced function.
63
- """
64
- for inp_arg, out_arg in zip(self.input_arguments, self.model_output_arguments):
65
- yield inp_arg, out_arg
66
-
67
-
68
- class _AnlyFuncMetadata:
69
- """ Class to hold the json data. """
70
-
71
- # A class variable to store the r function names and their function names.
72
- # Note that this is a class variable so it is accessable from all the objects
73
- # of _AnlyFuncMetadata.
74
- _reference_function_names = {
75
- "aa.glm": "GLM",
76
- "aa.forest": "DecisionForest",
77
- "aa.naivebayes.textclassifier.train": "NaiveBayesTextClassifier",
78
- "aa.svm.sparse.train": "SVMSparse"
79
- }
80
- # A class variable to store the SQLE JSON Fields.
81
- json_fields = SqleJsonFields()
82
-
83
- def __init__(self, json_data, json_file, func_type=None):
84
- """
85
- DESCRIPTION:
86
- Constructor for the class.
87
-
88
- PARAMETERS:
89
- json_data:
90
- Required Argument.
91
- Specifies the json content of analytic function.
92
- Types: dict
93
-
94
- json_file:
95
- Required Argument.
96
- Specifies the absolute path of the json file.
97
- Types: str
98
-
99
- func_type:
100
- Optional Argument.
101
- Specifies the type of analytic function.
102
- Permitted Values: ['FASTPATH', 'TABLE_OPERATOR', 'UAF']
103
- Types: str
104
- """
105
-
106
- # Validate func_type.
107
- arg_info_matrix = []
108
- arg_info_matrix.append(
109
- ["func_type", func_type, False,
110
- (str, type(None)), True, [TeradataAnalyticFunctionTypes.SQLE.value,
111
- TeradataAnalyticFunctionTypes.TABLEOPERATOR.value,
112
- TeradataAnalyticFunctionTypes.UAF.value,
113
- TeradataAnalyticFunctionTypes.BYOM.value,
114
- None]])
115
- arg_info_matrix.append(["json_file", json_file, False, str, True])
116
- _Validators._validate_function_arguments(arg_info_matrix)
117
-
118
- # Get the appropriate JSON Fields based on the class of the object i.e UAF or SQLE/TABLE_OPERATOR.
119
- self.short_description = json_data[self.json_fields.SHORT_DESCRIPTION]
120
- self.long_description = json_data[self.json_fields.LONG_DESCRIPTION]
121
- # Store Input Table data objects.
122
- self.__input_tables = []
123
- # Store Output Table data objects.
124
- self.__output_tables = []
125
- # To store mapping between sql name and lang names of Input Tables.
126
- self.__input_table_lang_names = {}
127
- # Store rest of function argument objects.
128
- self.__arguments = []
129
-
130
- # JSON Object
131
- self.json_object = json_data
132
- self._json_file = json_file
133
-
134
- # Store formula args if applicable.
135
- self.__formula_args = []
136
-
137
- # Variable to hold the name of the argument as key and the corresponding section as
138
- # value. This is used for checking duplicate arguments.
139
- self.__arguments_and_sections = {}
140
- self.func_type = json_data[self.json_fields.FUNCTION_TYPE].lower() if func_type is None else func_type.lower()
141
- self.sql_function_name = json_data[self.json_fields.FUNC_NAME]
142
- self.func_category = self.json_object.get(self.json_fields.FUNCTION_CATEGORY, None)
143
-
144
- # Validating func_type and sql_function_name
145
- self.__arg_info_matrix = []
146
- self.__arg_info_matrix.append(["func_type", self.func_type, True, str])
147
- self.__arg_info_matrix.append(["sql_function_name", self.sql_function_name, False, str])
148
- _Validators._validate_function_arguments(self.__arg_info_matrix)
149
-
150
- # Generating func_name from the sql_function_name
151
- self.func_name = self._get_function_name()
152
- self.__database_version = Path(self._json_file).parts[-2]
153
- self._func_type_specific_setup()
154
-
155
- # Call a function read JSON and collect arguments, input
156
- # and output table arguments.
157
- self.__parse_json()
158
- self.__function_params = OrderedDict()
159
- # Lets store the r function name and the function names in a mapper.
160
-
161
- # Storing the paired function information
162
- self.__paired_functions = []
163
-
164
- def set_paired_functions(self, params):
165
- """
166
- DESCRIPTION:
167
- Function to set the 'paired_function' attribute of _AnlyFuncMetadata.
168
-
169
- PARAMETERS:
170
- params:
171
- Required Argument
172
- Specifies the paired function information like the reference_function,
173
- input_arguments and model_output_arguments.
174
- Type: dict
175
-
176
- RETURNS:
177
- None.
178
-
179
- RAISES:
180
- None.
181
- """
182
-
183
- # params as
184
- # {
185
- # "predict": {
186
- # "reference_function": "DecisionForestPredict",
187
- # "input_arguments": ["object"],
188
- # "model_output_arguments": ["result"]
189
- # }
190
- for paired_function_name, paired_function_params in params.items():
191
- self.__paired_functions.append(
192
- _PairedFunction(paired_function_name, paired_function_params))
193
-
194
- def get_paired_functions(self):
195
- """
196
- DESCRIPTION:
197
- Function to get the '__paired_functions' attribute of _AnlyFuncMetadata class.
198
-
199
- RETURNS:
200
- list of instances
201
- """
202
- return self.__paired_functions
203
-
204
- def _func_type_specific_setup(self):
205
- """
206
- DESCRIPTION:
207
- Additional setup required for SQLE and Table Operator functions.
208
-
209
- RETURNS:
210
- class OR None
211
-
212
- RAISES:
213
- None
214
- """
215
- # TODO: Output schema is not required so not storing it for now. If we need it in
216
- # future, then it can be enabled.
217
- # Store output schema of the function
218
- # self.standard_output_schema = self.json_object.get(self.json_fields.OUTPUT_SCHEMA)
219
- self._is_view_supported = self.json_object.get("supports_view", True)
220
- self.__is_driver_function = self.json_object.get("function_type", "").lower() == "driver"
221
- self.__refernce_function_name = self.json_object.get("ref_function_r_name")
222
- self.__r_function_name = self.json_object.get("function_r_name")
223
- _AnlyFuncMetadata._reference_function_names[self.__r_function_name] = self.func_name
224
-
225
- def get_reference_function_class(self):
226
- """
227
- DESCRIPTION:
228
- Function to get the reference function class. This function checks if the function
229
- accepts any other function as input. If it accepts, it then returns the class of
230
- the referenced function.
231
-
232
- RETURNS:
233
- class OR None
234
-
235
- RAISES:
236
- None
237
-
238
- EXAMPLES:
239
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").get_reference_function_class()
240
- """
241
- reference_function = _AnlyFuncMetadata._reference_function_names.get(self.__refernce_function_name)
242
- if reference_function:
243
- return UtilFuncs._get_class(reference_function, supress_isinstance_check=True)
244
-
245
- def _get_argument_value(self, argument_properties, property, section, mandatory=True, default_value=None):
246
- """
247
- DESCRIPTION:
248
- Function to get the argument value from the json data. This function, checks
249
- the argument is a mandatory argument or not. If mandatory and not found in json
250
- data, raises an error otherwise either returns value or default value.
251
-
252
- PARAMETERS:
253
- argument_properties:
254
- Required Argument.
255
- Specifies json content of one of the below mentioned:
256
- * Input argument.
257
- * Output table.
258
- * Input table.
259
- Types: dict
260
-
261
- property:
262
- Required Argument.
263
- Specifies the argument name to look in "argument_properties"
264
- Types: str
265
-
266
- section:
267
- Required Argument.
268
- Specifies the section of the json to which "property" belongs to.
269
- Types: str
270
-
271
- mandatory:
272
- Required Argument.
273
- Specifies whether "property" is a mandatory field in "argument_properties" or not.
274
- Default Value: True
275
- Types: bool
276
-
277
- default_value:
278
- Required Argument.
279
- Specifies the default value of "property".
280
- Types: str OR int OR float OR bool
281
-
282
- RETURNS:
283
- str OR bool OR int OR float OR list
284
-
285
- RAISES:
286
- TeradataMlException.
287
-
288
- EXAMPLES:
289
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json")._get_argument_value(
290
- json_data, "defaultValue", "input_tables", False)
291
- """
292
- if property not in argument_properties and mandatory:
293
- error_message = Messages.get_message(MessageCodes.MISSING_JSON_FIELD,
294
- property,
295
- section)
296
-
297
- raise TeradataMlException(error_message, MessageCodes.MISSING_JSON_FIELD)
298
-
299
- return argument_properties.get(property, default_value)
300
-
301
- def _parse_arguments(self):
302
- """
303
- DESCRIPTION:
304
- Function to parse and store the argument in json file. This function first validates
305
- whether argument is required for analytic function or not. If required, then arguments
306
- section in json data is parsed and object of _AnlyFuncArgument is created and stored.
307
- RETURNS:
308
- None
309
- RAISES:
310
- TeradataMlException.
311
- EXAMPLES:
312
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").__parse_arguments()
313
- """
314
- section = self.json_fields.ARGUMENT_CLAUSES
315
- for argument in self.json_object.get(self.json_fields.ARGUMENT_CLAUSES, []):
316
- is_argument_required = argument.get(self.json_fields.USEINR, False)
317
-
318
- # Append argument to list if useInR is True.
319
- if is_argument_required:
320
- use_inR = is_argument_required
321
-
322
- sql_name = self._get_argument_value(argument, self.json_fields.NAME, section)
323
-
324
- lang_name = self._get_argument_value(argument, self.json_fields.LANG_NAME, section, False)
325
- lang_name = lang_name if lang_name is not None else self._get_pythonic_name_arg_name(
326
- self._get_argument_value(argument, self.json_fields.R_NAME, section))
327
-
328
- is_required = self._get_argument_value(argument, self.json_fields.IS_REQUIRED, section)
329
-
330
- sql_description = self._get_argument_value(argument, self.json_fields.DESCRIPTION, section)
331
-
332
- r_description = self._get_argument_value(argument, self.json_fields.R_DESCRIPTION, section)
333
-
334
- datatype = self._get_argument_value(argument, self.json_fields.DATATYPE, section)
335
-
336
- r_order_num = self._get_argument_value(argument, self.json_fields.R_ORDER_NUM, section)
337
-
338
- # Look for default value. If default value is not available, the look for default values.
339
- # If default values found, the consider the first element as default value.
340
- default_value = self._get_argument_value(argument, self.json_fields.DEFAULT_VALUE, section, False)
341
- if isinstance(default_value, list):
342
- default_value = default_value[0]
343
-
344
- # Json files can specify INFINITY as lower bound. So, convert it to appropriate
345
- # type in python.
346
- lower_bound = self._get_argument_value(argument, self.json_fields.LOWER_BOUND, section, False)
347
- lower_bound = UtilFuncs._get_negative_infinity() if lower_bound == self.json_fields.INFINITY\
348
- else lower_bound
349
-
350
- # Json files can specify INFINITY as upper bound. So, convert it to appropriate
351
- # type in python.
352
- upper_bound = self._get_argument_value(argument, self.json_fields.UPPER_BOUND, section, False)
353
- upper_bound = UtilFuncs._get_positive_infinity() if upper_bound == self.json_fields.INFINITY\
354
- else upper_bound
355
-
356
- r_default_value = self._get_argument_value(argument, self.json_fields.R_DEFAULT_VALUE, section,
357
- False)
358
-
359
- allows_lists = self._get_argument_value(argument, self.json_fields.ALLOWS_LISTS, section, False,
360
- False)
361
-
362
- allow_padding = self._get_argument_value(argument, self.json_fields.ALLOW_PADDING, section, False,
363
- False)
364
-
365
- r_formula_usage = self._get_argument_value(argument, self.json_fields.R_FORMULA_USAGE, section, False,
366
- False)
367
-
368
- allow_nan = self._get_argument_value(argument, self.json_fields.ALLOW_NAN, section, False, False)
369
-
370
- check_duplicate = self._get_argument_value(argument, self.json_fields.CHECK_DUPLICATE, section, False,
371
- False)
372
-
373
- is_output_column = self._get_argument_value(argument, self.json_fields.IS_OUTPUT_COLUMN, section, False,
374
- False)
375
-
376
- lower_bound_type = self._get_argument_value(argument, self.json_fields.LOWER_BOUND_TYPE, section, False)
377
-
378
- upper_bound_type = self._get_argument_value(argument, self.json_fields.UPPER_BOUND_TYPE, section, False)
379
-
380
- required_length = self._get_argument_value(argument, self.json_fields.REQUIRED_LENGTH, section, False, 0)
381
-
382
- match_length_of_argument = self._get_argument_value(
383
- argument, self.json_fields.MATCH_LENGTH_OF_ARGUMENT, section, False, False)
384
-
385
- permitted_values = self._get_argument_value(argument, self.json_fields.PERMITTED_VALUES, section, False)
386
-
387
- target_table = self._get_argument_value(argument, self.json_fields.TARGET_TABLE, section, False)
388
-
389
- allowed_types = self._get_argument_value(argument, self.json_fields.ALLOWED_TYPES, section, False)
390
-
391
- allowed_type_groups = self._get_argument_value(argument, self.json_fields.ALLOWED_TYPE_GROUPS, section,
392
- False)
393
-
394
- alternate_sql_name = self._get_argument_value(argument, self.json_fields.ALTERNATE_NAMES, section, False)
395
-
396
- # Check for duplicate arguments.
397
- self._validate_duplicate_argument(lang_name, self.json_fields.ARGUMENT_CLAUSES)
398
-
399
- # Get the lang name of target table if target table exists for given argument.
400
- target_table_lang_name = None
401
- if target_table and len(target_table) > 0:
402
- target_table_lang_name = self.__get_input_table_lang_name(sql_name=target_table[0])
403
-
404
- if sql_name.lower() == self.json_fields.SEQUENCE_INPUT_BY or\
405
- sql_name.lower() == self.json_fields.UNIQUE_ID:
406
- for j in range(len(self.input_tables)):
407
- r_order_num = (r_order_num * 10) + j
408
-
409
- sql_name = self.input_tables[j].get_sql_name()
410
- datatype = "COLUMN_NAMES"
411
-
412
- self.arguments.append(_AnlyFuncArgument(default_value=default_value,
413
- permitted_values=permitted_values,
414
- lower_bound=lower_bound,
415
- lower_bound_type=lower_bound_type,
416
- upper_bound=upper_bound,
417
- upper_bound_type=upper_bound_type,
418
- allow_nan=allow_nan,
419
- required_length=required_length,
420
- match_length_of_argument=match_length_of_argument,
421
- sql_name=sql_name,
422
- is_required=is_required,
423
- sql_description=sql_description,
424
- lang_description=r_description,
425
- datatype=datatype,
426
- allows_lists=allows_lists,
427
- allow_padding=allow_padding,
428
- use_in_r=use_inR,
429
- r_formula_usage=r_formula_usage,
430
- r_default_value=r_default_value,
431
- target_table=target_table,
432
- target_table_lang_name=target_table_lang_name,
433
- check_duplicate=check_duplicate,
434
- allowed_types=allowed_types,
435
- allowed_type_groups=allowed_type_groups,
436
- r_order_num=r_order_num,
437
- is_output_column=is_output_column,
438
- alternate_sql_name=alternate_sql_name,
439
- lang_name=lang_name))
440
- else:
441
- self.arguments.append(_AnlyFuncArgument(default_value=default_value,
442
- permitted_values=permitted_values,
443
- lower_bound=lower_bound,
444
- lower_bound_type=lower_bound_type,
445
- upper_bound=upper_bound,
446
- upper_bound_type=upper_bound_type,
447
- allow_nan=allow_nan,
448
- required_length=required_length,
449
- match_length_of_argument=match_length_of_argument,
450
- sql_name=sql_name,
451
- is_required=is_required,
452
- sql_description=sql_description,
453
- lang_description=r_description,
454
- datatype=datatype,
455
- allows_lists=allows_lists,
456
- allow_padding=allow_padding,
457
- lang_name=lang_name,
458
- use_in_r=use_inR,
459
- r_formula_usage=r_formula_usage,
460
- r_default_value=r_default_value,
461
- target_table=target_table,
462
- target_table_lang_name=target_table_lang_name,
463
- check_duplicate=check_duplicate,
464
- allowed_types=allowed_types,
465
- allowed_type_groups=allowed_type_groups,
466
- r_order_num=r_order_num,
467
- is_output_column=is_output_column,
468
- alternate_sql_name=alternate_sql_name))
469
-
470
- def _parse_input_tables(self):
471
- """
472
- DESCRIPTION:
473
- Function to parse and store the input tables in json file. This function first validates
474
- whether input table is required for analytic function or not. If required, then input tables
475
- section in json data is parsed and object of _AnlyFuncInput is created and stored.
476
-
477
- RETURNS:
478
- None
479
-
480
- RAISES:
481
- TeradataMlException.
482
-
483
- EXAMPLES:
484
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").__parse_input_tables()
485
- """
486
- section = self.json_fields.INPUT_TABLES
487
- for input_table_param in self.json_object.get(self.json_fields.INPUT_TABLES, []):
488
- is_input_table_required = input_table_param.get(self.json_fields.USEINR, False)
489
-
490
- # Append argument/input table to list if useInR is True.
491
- if is_input_table_required:
492
- use_InR = is_input_table_required
493
-
494
- r_order_num = self._get_argument_value(input_table_param, self.json_fields.R_ORDER_NUM, section)
495
-
496
- sql_name = self._get_argument_value(input_table_param, self.json_fields.NAME, section)
497
-
498
- is_required = self._get_argument_value(input_table_param, self.json_fields.IS_REQUIRED, section,
499
- mandatory=False, default_value=True)
500
-
501
-
502
- sql_description = self._get_argument_value(input_table_param, self.json_fields.DESCRIPTION, section)
503
-
504
- r_description = self._get_argument_value(input_table_param, self.json_fields.R_DESCRIPTION, section)
505
-
506
- datatype = self._get_argument_value(input_table_param, self.json_fields.DATATYPE, section)
507
-
508
- required_input_kind = self._get_argument_value(
509
- input_table_param, self.json_fields.REQUIRED_INPUT_KIND, section, False, None)
510
-
511
- partition_by_one = self._get_argument_value(
512
- input_table_param, self.json_fields.PARTITION_BY_ONE, section, False, False)
513
-
514
- partition_by_one_inclusive = self._get_argument_value(
515
- input_table_param, self.json_fields.PARTITION_BY_ONE_INCLUSIVE, section, False, False)
516
-
517
- is_ordered = self._get_argument_value(input_table_param, self.json_fields.IS_ORDERED, section, False,
518
- False)
519
-
520
- is_local_ordered = self._get_argument_value(input_table_param, self.json_fields.IS_LOCAL_ORDERED,
521
- section, False, False)
522
-
523
- hash_by_key = self._get_argument_value(input_table_param, self.json_fields.HASH_BY_KEY, section, False,
524
- False)
525
-
526
- allows_lists = self._get_argument_value(input_table_param, self.json_fields.ALLOWS_LISTS, section, False,
527
- False)
528
-
529
- lang_name = self._get_pythonic_name_arg_name(
530
- self._get_argument_value(input_table_param, self.json_fields.R_NAME, section))
531
-
532
- r_formula_usage = self._get_argument_value(input_table_param, self.json_fields.R_FORMULA_USAGE, section,
533
- False, False)
534
-
535
- alternate_sql_name = self._get_argument_value(input_table_param, self.json_fields.ALTERNATE_NAMES,
536
- section, False)
537
-
538
- # Check for duplicate arguments.
539
- self._validate_duplicate_argument(lang_name, self.json_fields.INPUT_TABLES)
540
-
541
- self.input_tables.append(_AnlyFuncInput(required_input_kind=required_input_kind,
542
- partition_by_one=partition_by_one,
543
- partition_by_one_inclusive=partition_by_one_inclusive,
544
- is_ordered=is_ordered,
545
- hash_by_key=hash_by_key,
546
- is_local_ordered=is_local_ordered,
547
- sql_name=sql_name,
548
- is_required=is_required,
549
- sql_description=sql_description,
550
- lang_description=r_description,
551
- datatype=datatype,
552
- allows_lists=allows_lists,
553
- lang_name=lang_name,
554
- use_in_r=use_InR,
555
- r_formula_usage=r_formula_usage,
556
- r_order_num=r_order_num,
557
- alternate_sql_name=alternate_sql_name))
558
- # Add entry in map for sql and lang name of input table.
559
- self.__input_table_lang_names[sql_name.lower()] = lang_name.lower()
560
- if alternate_sql_name:
561
- for alter_sql_name in alternate_sql_name:
562
- self.__input_table_lang_names[alter_sql_name.lower()] = lang_name.lower()
563
-
564
-
565
- def _parse_output_tables(self):
566
- """
567
- DESCRIPTION:
568
- Function to parse and store the output tables in json file. This function first validates
569
- whether output table is required for analytic function or not. If required, then output tables
570
- section in json data is parsed and object of _AnlyFuncOutput is created and stored.
571
-
572
- RETURNS:
573
- None
574
-
575
- RAISES:
576
- TeradataMlException.
577
-
578
- EXAMPLES:
579
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").__parse_output_tables()
580
- """
581
- section = self.json_fields.OUTPUT_TABLES
582
- for output_table_param in self.json_object.get(self.json_fields.OUTPUT_TABLES, []):
583
- is_output_table_required = output_table_param.get(self.json_fields.USEINR, False)
584
-
585
- # Append argument/output table to list if useInR is true.
586
- if is_output_table_required:
587
- useInR = is_output_table_required
588
-
589
- sql_name = self._get_argument_value(output_table_param, self.json_fields.NAME, section)
590
-
591
- is_required = self._get_argument_value(output_table_param, self.json_fields.IS_REQUIRED, section)
592
-
593
- sql_description = self._get_argument_value(output_table_param, self.json_fields.DESCRIPTION, section)
594
-
595
- r_description = self._get_argument_value(output_table_param, self.json_fields.R_DESCRIPTION, section)
596
-
597
- datatype = self._get_argument_value(output_table_param, self.json_fields.DATATYPE, section)
598
-
599
- lang_name = self._get_pythonic_name_arg_name(self._get_argument_value(output_table_param,
600
- self.json_fields.R_NAME, section))
601
-
602
- r_order_num = self._get_argument_value(output_table_param, self.json_fields.R_ORDER_NUM, section)
603
-
604
- is_output_table = self._get_argument_value(output_table_param, self.json_fields.IS_OUTPUT_TABLE,
605
- section, False, False)
606
-
607
- allows_lists = self._get_argument_value(output_table_param, self.json_fields.ALLOWS_LISTS, section,
608
- False, False)
609
-
610
- alternate_sql_name = self._get_argument_value(output_table_param, self.json_fields.ALTERNATE_NAMES,
611
- section, False)
612
-
613
- # TODO: Additional dependencies needs to be implemented with ELE-4511.
614
- is_required_dependent_argument = self._get_argument_value(
615
- output_table_param, self.json_fields.IS_REQUIRED_DEPENDENT, section, False)
616
- dependent_argument = None
617
- if is_required_dependent_argument:
618
-
619
- argument_type = "input_tables"
620
- if is_required_dependent_argument.get(self.json_fields.DEPENDENT_ARGUMENT_TYPE) == "argument":
621
- argument_type = "arguments"
622
- elif is_required_dependent_argument.get(self.json_fields.DEPENDENT_ARGUMENT_TYPE) == "input_table":
623
- argument_type = "input_tables"
624
-
625
- argument_name = is_required_dependent_argument.get(self.json_fields.DEPENDENT_ARGUMENT_NAME)
626
- operator = is_required_dependent_argument.get(self.json_fields.OPERATOR)
627
- right_operand = is_required_dependent_argument.get(self.json_fields.DEPENDENT_ARGUMENT_VALUE)
628
- dependent_argument = _DependentArgument(sql_name=argument_name,
629
- operator=operator,
630
- right_operand=right_operand,
631
- type=argument_type)
632
-
633
- # TODO: Output schema is not being used any where in processing. So, skipping it for now.
634
- # output_schema = self._get_argument_value(output_table_param, self.json_fields.OUTPUT_SCHEMA, False)
635
-
636
- self.output_tables.append(_AnlyFuncOutput(sql_name=sql_name,
637
- is_required=is_required,
638
- sql_description=sql_description,
639
- lang_description=r_description,
640
- lang_name=lang_name,
641
- use_in_r=useInR,
642
- r_order_num=r_order_num,
643
- is_output_table=is_output_table,
644
- datatype=datatype,
645
- allows_lists=allows_lists,
646
- output_schema=None,
647
- alternate_sql_name=alternate_sql_name,
648
- is_required_dependent_argument=dependent_argument))
649
-
650
- def __parse_json(self):
651
- try:
652
- # Parse all input tables.
653
- self._parse_input_tables()
654
-
655
- # Parse all output tables.
656
- self._parse_output_tables()
657
-
658
- # Parse all arguments.
659
- self._parse_arguments()
660
-
661
- except Exception as err:
662
- teradataml_file_path = os.path.join(*Path(self._json_file).parts[-6:])
663
- raise TeradataMlException(Messages.get_message(MessageCodes.INVALID_JSON,
664
- teradataml_file_path,
665
- str(err)),
666
- MessageCodes.INVALID_JSON)
667
-
668
- def __get_analytic_function_args(self):
669
- """
670
- DESCRIPTION:
671
- Internal function to get the arguments of analytic function, which are required
672
- to generate function signature. This function iterates through every input
673
- table and argument, and does the below.
674
- * Check if argument formulates to an argument "formula" when exposed or not. If yes,
675
- then the argument should be the first argument and is extracted to a different variable.
676
- * Function arguments with rOrderNum <= 0 are not supposed to be exposed
677
- to end user. Ignore these arguments.
678
-
679
- RAISES:
680
- None
681
-
682
- RETURNS:
683
- tuple, first element specifies formula argument and second element specifies
684
- list of required arguments for analytic function.
685
-
686
- EXAMPLES:
687
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").__get_analytic_function_args()
688
- """
689
- new_args = []
690
- args = self.input_tables + self.arguments
691
-
692
- for arg in args:
693
- r_order_num = arg.get_r_order_number()
694
- is_argument_formula = isinstance(arg, _AnlyFuncArgument) and arg.is_argument_a_formula() \
695
- and arg.get_r_order_number() <= 0
696
- if is_argument_formula:
697
- if arg.get_r_order_number() == 0:
698
- self.__dependent_formula_arg = arg
699
- self.__formula_args.append(arg)
700
- continue
701
-
702
- if r_order_num <= 0:
703
- continue
704
-
705
- new_args.append(arg)
706
- return self.__formula_args, new_args
707
-
708
- def _generate_function_parameters(self):
709
- """
710
- DESCRIPTION:
711
- Function to generate the analytic function argument names and their corresponding default values.
712
- Function arguments are generated by adhering to following:
713
- * Signature includes only input as well as other arguments (SQL: Using clause
714
- arguments). So, process only those.
715
- * Output arguments are ignored in the function signature. So, do not process Output arguments.
716
- * Also, arguments pertaining to partition and order column are also generated for
717
- input tables.
718
-
719
- RAISES:
720
- None
721
-
722
- RETURNS:
723
- None
724
-
725
- EXAMPLES:
726
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json")._generate_function_parameters()
727
- """
728
-
729
- formula_args, args = self.__get_analytic_function_args()
730
-
731
- # Formula should always appear as first argument. So, start with formula argument.
732
- if formula_args:
733
- self.function_params["formula"] = None
734
-
735
- for arg in args:
736
-
737
- arg_name = arg.get_lang_name()
738
- default_value = arg.get_default_value()
739
-
740
- # Add argument and default value in the same order.
741
- self.function_params[arg_name] = default_value
742
-
743
- def __process_partition_order_columns(self, arg):
744
- """
745
- DESCRIPTION:
746
- Function to generate the arguments which are related to partition columns
747
- and order columns arguments.
748
-
749
- PARAMETERS:
750
- arg:
751
- Required Argument.
752
- Specifies the object of analytic input argument.
753
- Types: _AnlyFuncInput
754
-
755
- RAISES:
756
- None
757
-
758
- RETURNS:
759
- None
760
-
761
- EXAMPLES:
762
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").__process_partition_order_columns(arg)
763
- """
764
- partition_column_kind = arg._get_partition_column_required_kind()
765
- partition_value = arg._get_default_partition_by_value(partition_column_kind)
766
-
767
- # If Function supports only PartitionByOne or PartitionByAny, don't expose
768
- # partition column to user.
769
- if arg._only_partition_by_one() or\
770
- arg._only_partition_by_any():
771
- pass
772
- elif partition_column_kind == PartitionKind.KEY or \
773
- partition_column_kind == PartitionKind.DIMENSIONKEY:
774
- self.function_params["{}_partition_column".format(arg.get_lang_name())] = None
775
- elif partition_column_kind in [PartitionKind.ANY,
776
- PartitionKind.DIMENSIONKEYANY,
777
- PartitionKind.ONE]:
778
- self.function_params['{}_partition_column'.format(arg.get_lang_name())] = partition_value
779
-
780
- # If function type is not a driver or argument is ordered, then add order
781
- # column also to arguments.
782
- if not self.__is_driver_function or arg.is_ordered():
783
- self.function_params["{}_order_column".format(arg.get_lang_name())] = None
784
-
785
- def __process_hash_local_order_columns(self, arg):
786
- """
787
- DESCRIPTION:
788
- Generate the arguments related to LOCAL ORDER BY and HASH BY KEY.
789
-
790
- PARAMETERS:
791
- arg:
792
- Required Argument.
793
- Specifies the object of analytic input argument.
794
- Types: _AnlyFuncInput
795
-
796
- RAISES:
797
- None
798
-
799
- RETURNS:
800
- None
801
-
802
- EXAMPLES:
803
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").__process_hash_local_order_columns(arg)
804
- """
805
- # If the argument is local ordered, then add "is_local_ordered"
806
- # as argument.
807
- if arg.is_local_ordered():
808
- self.function_params["{}_is_local_ordered".format(arg.get_lang_name())] = False
809
- # Let's check if function has HASH BY clause.
810
- if arg.hash_by_key():
811
- self.function_params['{}_hash_column'.format(arg.get_lang_name())] = None
812
-
813
- def get_function_parameters_string(self, exclude_args=[]):
814
- """
815
- DESCRIPTION:
816
- Function to generate the function parameters in string format.
817
-
818
- RAISES:
819
- None
820
-
821
- RETURNS:
822
- str
823
-
824
- EXAMPLES:
825
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").get_function_parameters_string()
826
- """
827
- if not self.function_params:
828
- self._generate_function_parameters()
829
- # Along with function parameters, kwargs should be added to accept other parameters.
830
- return ", ".join(["{} = {}".format(param, '"{}"'.format(value) if isinstance(value, str) else value)
831
- for param, value in self.function_params.items() if param not in exclude_args] + ["**generic_arguments"])
832
-
833
- @property
834
- def input_tables(self):
835
- """
836
- DESCRIPTION:
837
- Function to return input tables.
838
-
839
- RETURNS:
840
- list
841
-
842
- RAISES:
843
- None
844
-
845
- EXAMPLES:
846
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").input_tables
847
- """
848
- return self.__input_tables
849
-
850
- @input_tables.setter
851
- def input_tables(self, input):
852
- """
853
- DESCRIPTION:
854
- Function to append variable to the input tables list.
855
-
856
- PARAMETERS:
857
- input:
858
- Required Argument.
859
- Specifies the variable to be appended.
860
-
861
- RETURNS:
862
- None
863
-
864
- RAISES:
865
- None
866
- """
867
- self.__input_tables.append(input)
868
-
869
- @property
870
- def output_tables(self):
871
- """
872
- DESCRIPTION:
873
- Function to return output tables.
874
-
875
- RETURNS:
876
- list
877
-
878
- RAISES:
879
- None
880
-
881
- EXAMPLES:
882
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").output_tables
883
- """
884
- return self.__output_tables
885
-
886
- @output_tables.setter
887
- def output_tables(self, output):
888
- """
889
- DESCRIPTION:
890
- Function to append variable to the output tables list.
891
-
892
- PARAMETERS:
893
- input:
894
- Required Argument.
895
- Specifies the variable to be appended.
896
-
897
- RETURNS:
898
- None
899
-
900
- RAISES:
901
- None
902
- """
903
- self.__output_tables.append(output)
904
-
905
- @property
906
- def input_table_lang_names(self):
907
- """
908
- DESCRIPTION:
909
- Function to return map between sql name and lang name of input tables.
910
-
911
- RETURNS:
912
- dict
913
-
914
- RAISES:
915
- None
916
-
917
- EXAMPLES:
918
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").input_table_lang_names
919
- """
920
- return self.__input_table_lang_names
921
-
922
- @property
923
- def arguments(self):
924
- """
925
- DESCRIPTION:
926
- Function to return arguments.
927
-
928
- RETURNS:
929
- list
930
-
931
- RAISES:
932
- None
933
-
934
- EXAMPLES:
935
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").arguments
936
- """
937
- return self.__arguments
938
-
939
-
940
- @arguments.setter
941
- def arguments(self, argument):
942
- """
943
- DESCRIPTION:
944
- Function to append the variable to the arguments list.
945
-
946
- PARAMETERS:
947
- argument:
948
- Required Argument.
949
- Specifies the variable to be appended.
950
-
951
- RETURNS:
952
- None
953
-
954
- RAISES:
955
- None
956
- """
957
- self.__arguments.append(argument)
958
-
959
- @property
960
- def arguments_and_sections(self):
961
- """
962
- DESCRIPTION:
963
- Function to return arguments_and_sections.
964
-
965
- RETURNS:
966
- list
967
-
968
- RAISES:
969
- None
970
-
971
- EXAMPLES:
972
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").arguments_and_sections
973
- """
974
- return self.__arguments_and_sections
975
-
976
- @arguments_and_sections.setter
977
- def arguments_and_sections(self, argument):
978
- """
979
- DESCRIPTION:
980
- Function to update the arguments_and_sections dictonary.
981
-
982
- PARAMETERS:
983
- argument:
984
- Required Argument.
985
- Specifies the variable to be added to the dictonary.
986
-
987
- RETURNS:
988
- None
989
-
990
- RAISES:
991
- None
992
- """
993
- self.__arguments_and_sections.update(argument)
994
-
995
- @property
996
- def function_params(self):
997
- """
998
- DESCRIPTION:
999
- Function to get the function_params.
1000
-
1001
- RETURNS:
1002
- list
1003
-
1004
- RAISES:
1005
- None
1006
-
1007
- EXAMPLES:
1008
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").function_params
1009
- """
1010
- return self.__function_params
1011
-
1012
- @function_params.setter
1013
- def function_params(self, argument):
1014
- """
1015
- DESCRIPTION:
1016
- Function to set the function_params.
1017
-
1018
- PARAMETERS:
1019
- argument:
1020
- Required Argument.
1021
- Specifies the variable to be added to the dictonary.
1022
-
1023
- RETURNS:
1024
- list
1025
-
1026
- RAISES:
1027
- None
1028
-
1029
- """
1030
- self.__function_params.update(argument)
1031
-
1032
- @property
1033
- def formula_args(self):
1034
- """
1035
- DESCRIPTION:
1036
- Function to return formula arguments.
1037
- _AnlyFuncMetadata(json_data, "/abc/TD_GLM.json").formula_args
1038
- """
1039
- return self.__formula_args
1040
-
1041
- @staticmethod
1042
- def __get_anly_function_name_mapper():
1043
- """
1044
- DESCRIPTION:
1045
- Function to read mapper file teradataml/analytics/jsons/anly_function_name.json,
1046
- which has a mapping between function name specified in json file and function to
1047
- appear in user's context.
1048
-
1049
- RETURNS:
1050
- list
1051
-
1052
- RAISES:
1053
- None
1054
- """
1055
- return json.loads(
1056
- UtilFuncs._get_file_contents(os.path.join(UtilFuncs._get_data_directory(dir_name="jsons"),
1057
- "anly_function_name.json")))
1058
-
1059
- def _validate_duplicate_argument(self, lang_name, section):
1060
- """
1061
- DESCRIPTION:
1062
- Internal function to check the duplicates of arguments. No python function
1063
- accepts duplicate parameters and since analytic functions are being formed at
1064
- run time from json, there are chances that function may be constructed with
1065
- duplicate arguments. This function validates whether arguments are duplicated or not.
1066
-
1067
- PARAMETERS:
1068
- lang_name:
1069
- Required Argument.
1070
- Specifies the name of the argument which is mentioned in json file.
1071
- Types: str
1072
-
1073
- section:
1074
- Required Argument.
1075
- Specifies the section of json file, to which argument belongs to.
1076
- Types: str
1077
-
1078
- RETURNS:
1079
- None
1080
-
1081
- RAISES:
1082
- TeradataMlException
1083
-
1084
- EXAMPLES:
1085
- _AnlyFuncMetadata(data, "abc.json")._validate_duplicate_argument("abc", "input_tables")
1086
- """
1087
- if lang_name not in self.arguments_and_sections:
1088
- self.arguments_and_sections[lang_name] = section
1089
- else:
1090
- raise TeradataMlException(Messages.get_message(MessageCodes.DUPLICATE_PARAMETER,
1091
- lang_name,
1092
- section),
1093
- MessageCodes.DUPLICATE_PARAMETER)
1094
-
1095
- @staticmethod
1096
- def _get_pythonic_name_arg_name(r_name):
1097
- """
1098
- DESCRIPTION:
1099
- Function to get the pythonic name for argument from the name specified
1100
- in json. Conversion of a string to pythonic name does as below:
1101
- * Strips out the trailing and leading spaces.
1102
- * Converts the string to lower case.
1103
- * Replaces the dot(.) with underscore.
1104
- * Replaces the '_table' with '_data'.
1105
- * Replaces the 'table_' with 'data_'.
1106
-
1107
- PARAMETERS:
1108
- r_name:
1109
- Required Argument.
1110
- Specifies the name of the argument which is mentioned in json file.
1111
- Types: str
1112
-
1113
- RETURNS:
1114
- str
1115
-
1116
- RAISES:
1117
- None
1118
-
1119
- EXAMPLES:
1120
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json")._get_pythonic_name_arg_name("abc")
1121
- """
1122
- return r_name.strip().lower().replace(".", "_").replace("_table", "_data").replace("table_", "data_")
1123
-
1124
- def _get_function_name(self):
1125
- """
1126
- DESCRIPTION:
1127
- Function to get the name of the function which is exposed to user.
1128
-
1129
- RETURNS:
1130
- str
1131
-
1132
- RAISES:
1133
- None
1134
-
1135
- EXAMPLES:
1136
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json")._get_function_name()
1137
- """
1138
- # If teradataml/data/jsons/anly_function_name.json contains a mapping name, function name
1139
- # should be corresponding mapping name. Else, same as function name.
1140
-
1141
- func_name = self.__get_anly_function_name_mapper().get(self.json_object[self.json_fields.FUNCTION_ALIAS_NAME],
1142
- self.json_object[self.json_fields.FUNCTION_ALIAS_NAME])
1143
- # Few functions are expected to have a name starting with TD_,i.e., json file may
1144
- # contain function name as TD_Xyz. Since we don't want the prefixed characters,
1145
- # removing those.
1146
- return func_name[3:] if func_name.startswith("TD_") else func_name
1147
-
1148
- def get_doc_string(self):
1149
- """
1150
- DESCRIPTION:
1151
- Function to get the docstring for the function from corresponding docs file.
1152
- If docs file is not found, return a message asking the user to refer to reference guide.
1153
-
1154
- PARAMETERS:
1155
- None.
1156
-
1157
- RETURNS:
1158
- str
1159
-
1160
- RAISES:
1161
- None
1162
-
1163
- EXAMPLES:
1164
- _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").get_doc_string()
1165
- """
1166
- func_info = getattr(TeradataAnalyticFunctionInfo, self.func_type.upper())
1167
- function_type = func_info.value["func_type"]
1168
- # For version dependent IN-DB functions, get version info as per vantage version
1169
- # and then get exact doc dir.
1170
- # For version independent IN-DB functions, get the docs directory under given
1171
- # function type.
1172
- if function_type in utils.func_type_json_version.keys():
1173
- version_dir = utils.func_type_json_version[function_type]
1174
- doc_dir = "docs_{}".format(version_dir.replace('.', '_'))
1175
- else:
1176
- doc_dir = "docs"
1177
- try:
1178
- # from teradataml.data.docs.<function_type>.<doc_dir_with_version_info>.<func_name>
1179
- # import <func_name>
1180
- func_module = __import__(("teradataml.data.docs.{}.{}.{}".
1181
- format(function_type, doc_dir, self.func_name)),
1182
- fromlist=[self.func_name])
1183
- return getattr(func_module, self.func_name).__doc__
1184
- except:
1185
- return ("Refer to Teradata Package for Python Function Reference guide for "
1186
- "Documentation. Reference guide can be found at: https://docs.teradata.com ."
1187
- "Refer to the section with Database version: {}".format(self.__database_version))
1188
-
1189
- def __get_input_table_lang_name(self, sql_name):
1190
- """ Internal function to get lang name of input table when sql name is provided. """
1191
- if sql_name.lower() in self.__input_table_lang_names.keys():
1192
- return self.__input_table_lang_names.get(sql_name.lower()).lower()
1193
-
1194
-
1195
- class _AnlyFuncMetadataUAF(_AnlyFuncMetadata):
1196
- """ Class to hold the UAF json data. """
1197
-
1198
- # Class variable to hold the UAF json fields.
1199
- json_fields = UAFJsonFields()
1200
-
1201
- def __init__(self, json_data, json_file, func_type):
1202
- self.__input_fmt_arguments = []
1203
- self.__output_fmt_arguments = []
1204
- super().__init__(json_data, json_file, func_type)
1205
-
1206
- @property
1207
- def input_fmt_arguments(self):
1208
- """
1209
- DESCRIPTION:
1210
- Property to get the arguments involved in INPUT_FMT section.
1211
-
1212
- RETURNS:
1213
- list
1214
-
1215
- RAISES:
1216
- None
1217
-
1218
- EXAMPLES:
1219
- _AnlyFuncMetadataUAF(json_data, "/abc/ArimaEstimate.json").function_params
1220
- """
1221
- return self.__input_fmt_arguments
1222
-
1223
- @input_fmt_arguments.setter
1224
- def input_fmt_arguments(self, argument):
1225
- """
1226
- DESCRIPTION:
1227
- Property setter for the arguments involved in INPUT_FMT section.
1228
-
1229
- PARAMETERS:
1230
- argument:
1231
- Required Argument.
1232
- Specifies the variable to be added to the list.
1233
- Type : _AnlyFuncArgumentUAF
1234
-
1235
- RETURNS:
1236
- list
1237
-
1238
- RAISES:
1239
- None
1240
-
1241
- """
1242
- self.__input_fmt_arguments.append(argument)
1243
-
1244
- @property
1245
- def output_fmt_arguments(self):
1246
- """
1247
- DESCRIPTION:
1248
- Property to get the arguments involved in OUTPUT_FMT section.
1249
-
1250
- RETURNS:
1251
- list
1252
-
1253
- RAISES:
1254
- None
1255
-
1256
- EXAMPLES:
1257
- _AnlyFuncMetadataUAF(json_data, "/abc/ArimaEstimate.json").function_params
1258
- """
1259
- return self.__output_fmt_arguments
1260
-
1261
- @output_fmt_arguments.setter
1262
- def output_fmt_arguments(self, argument):
1263
- """
1264
- DESCRIPTION:
1265
- Property setter for the arguments involved in OUTPUT_FMT section.
1266
-
1267
- PARAMETERS:
1268
- argument:
1269
- Required Argument.
1270
- Specifies the variable to be added to the list.
1271
- Type : _AnlyFuncArgumentUAF
1272
-
1273
- RETURNS:
1274
- list
1275
-
1276
- RAISES:
1277
- None
1278
-
1279
- """
1280
- self.__output_fmt_arguments.append(argument)
1281
-
1282
- def _func_type_specific_setup(self):
1283
- """
1284
- DESCRIPTION:
1285
- Additional setup required for UAF functions.
1286
-
1287
- RETURNS:
1288
- None
1289
-
1290
- RAISES:
1291
- None
1292
- """
1293
- # Generic Json Parameters
1294
- self.__function_version = self.json_object[self.json_fields.FUNCTION_VERSION]
1295
- self.__json_version = self.json_object[self.json_fields.JSON_VERSION]
1296
- self.__r_function_name = self.json_object[self.json_fields.R_NAME]
1297
- self.__max_input_files = self.json_object[self.json_fields.MAX_INPUT_FILES]
1298
- self.__is_plottable = self.json_object[self.json_fields.IS_PLOTTABLE]
1299
- self.__input_fmt = self.json_object[self.json_fields.INPUT_FMT]
1300
- self.__output_fmt = self.json_object[self.json_fields.OUTPUT_FMT]
1301
-
1302
- # Getters
1303
- self.get_function_version = lambda: self.__function_version
1304
- self.get_json_version = lambda: self.__json_version
1305
- self.get_func_r_name = lambda: self.__r_function_name
1306
- self.get_max_input_files = lambda: self.__max_input_files
1307
- self.get_is_plottable = lambda: self.__is_plottable
1308
- self.has_input_fmt = lambda: self.__input_fmt
1309
- self.has_output_fmt = lambda: self.__output_fmt
1310
- self._is_view_supported = False
1311
-
1312
- # Validation
1313
- self.__arg_info_matrix = []
1314
- self.__arg_info_matrix.append(["func_description_short", self.short_description, True, str])
1315
- self.__arg_info_matrix.append(["func_description_long", self.long_description, False, (list, str)])
1316
- self.__arg_info_matrix.append(["function_version", self.__function_version, True, str])
1317
- self.__arg_info_matrix.append(["json_version", self.__json_version, True, str])
1318
- self.__arg_info_matrix.append(["func_r_name", self.__r_function_name, True, str])
1319
- self.__arg_info_matrix.append(["max_input_files", self.__max_input_files, False, int])
1320
- self.__arg_info_matrix.append(["is_plottable", self.__is_plottable, False, bool])
1321
-
1322
- # TODO : uncomment the lines when ELE-5078 is done.
1323
- # self.__arg_info_matrix.append(["input_fmt", self.__input_fmt, False, (bool, _ListOf(dict)), False, [False]])
1324
- # self.__arg_info_matrix.append(["output_fmt", self.__output_fmt, False, (bool, _ListOf(dict)), False, [False]])
1325
-
1326
- self.__arg_info_matrix.append(["input_fmt", self.__input_fmt, False, (bool, _ListOf(dict))])
1327
- self.__arg_info_matrix.append(["output_fmt", self.__output_fmt, False, (bool, _ListOf(dict))])
1328
-
1329
- _Validators._validate_function_arguments(self.__arg_info_matrix)
1330
-
1331
- def __input_params_generation(self, input_table_param, lang_name="data"):
1332
- """
1333
- DESCRIPTION:
1334
- Function to generate the input parameters and form an object of class _AnlyFuncInputUAF.
1335
-
1336
- RETURNS:
1337
- None
1338
-
1339
- RAISES:
1340
- None
1341
- """
1342
- section = self.json_fields.INPUT_TABLES
1343
- data_type = self._get_argument_value(input_table_param, self.json_fields.DATATYPE, section)
1344
- description = self._get_argument_value(input_table_param, self.json_fields.DESCRIPTION, section)
1345
- is_required = not self._get_argument_value(input_table_param, self.json_fields.OPTIONAL, section,
1346
- mandatory=False, default_value=True)
1347
- # Check for duplicate arguments.
1348
- self._validate_duplicate_argument(lang_name, self.json_fields.INPUT_TABLES)
1349
- # Create an object of class _AnlyFuncInputUAF and append to the list.
1350
- self.input_tables.append(_AnlyFuncInputUAF(data_type=data_type,
1351
- description=description,
1352
- lang_name=lang_name,
1353
- is_required=is_required))
1354
-
1355
- def _parse_input_tables(self):
1356
- """
1357
- DESCRIPTION:
1358
- Function to parse and store the input tables in json file. This function first validates
1359
- whether input table is required for analytic function or not. If required, then input tables
1360
- section in json data is parsed and object of _AnlyFuncInputUAF is created and stored.
1361
-
1362
- RETURNS:
1363
- None
1364
-
1365
- RAISES:
1366
- None
1367
- """
1368
-
1369
-
1370
- if len(self.json_object[self.json_fields.INPUT_TABLES]) == 1:
1371
- input_table_param = self.json_object[self.json_fields.INPUT_TABLES][0]
1372
- self.__input_params_generation(input_table_param)
1373
- else:
1374
- for counter, input_table_param in enumerate(self.json_object[self.json_fields.INPUT_TABLES], 1):
1375
- lang_name = "data{}".format(counter)
1376
- self.__input_params_generation(input_table_param, lang_name)
1377
-
1378
- def _parse_output_tables(self):
1379
- """
1380
- DESCRIPTION:
1381
- Function to parse and store the output tables in json file. This function first validates
1382
- whether output table is required for analytic function or not. If required, then output tables
1383
- section in json data is parsed and object of _AnlyFuncOutputUAF is created and stored.
1384
-
1385
- RETURNS:
1386
- None
1387
-
1388
- RAISES:
1389
- None
1390
- """
1391
- section = self.json_fields.OUTPUT_TABLES
1392
-
1393
- for output_table_param in self.json_object[self.json_fields.OUTPUT_TABLES]:
1394
- # Specifies the output type.
1395
- data_type = self._get_argument_value(output_table_param, self.json_fields.DATATYPE, section)
1396
-
1397
- # Specifies the column types for the result table.
1398
- result_table_column_types = self._get_argument_value(output_table_param,
1399
- self.json_fields.RESULT_TABLE_COLUMN_TYPES, section, False)
1400
- # Specifies the output description.
1401
- description = self._get_argument_value(output_table_param, self.json_fields.DESCRIPTION, section)
1402
-
1403
- # Specifies whether the argument is required or not.
1404
- is_required = not self._get_argument_value(output_table_param, self.json_fields.OPTIONAL, section, False)
1405
-
1406
- # Specifies whether the layer is primary or not.
1407
- primary_layer = self._get_argument_value(output_table_param, self.json_fields.PRIMARY_LAYER, section)
1408
-
1409
- # Specifies the name of the output layer.
1410
- layer_name = self._get_argument_value(output_table_param, self.json_fields.LAYER_NAME, section)
1411
-
1412
- # Use the layer name as lang_name.
1413
- # Remove 'art' if present in the first three characters from the layer_name.
1414
- lang_name = layer_name.lower()[3:] if layer_name.lower()[:3] in "art" else layer_name.lower()
1415
-
1416
- self.output_tables.append(_AnlyFuncOutputUAF(data_type=data_type,
1417
- description=description,
1418
- lang_name=lang_name,
1419
- layer_name=layer_name,
1420
- primary_layer=primary_layer,
1421
- result_table_column_types=result_table_column_types,
1422
- is_required=is_required))
1423
-
1424
- def __argument_parser(self, argument, section, parent = None, is_nested=False, prev_lang_name=None):
1425
- """
1426
- DESCRIPTION:
1427
- Internal function to parse the individual argument in json file.
1428
- Nested arguments if present in json data, are parsed and object of _AnlyFuncArgumentUAF
1429
- are appended to the nested_parameter_list.
1430
- Used for parsing UAF function arguments under section 'func_params' in JSON file.
1431
-
1432
- RETURNS:
1433
- object of _AnlyFuncArgumentUAF
1434
-
1435
- RAISES:
1436
- TeradataMlException.
1437
- """
1438
- sql_name = UtilFuncs._as_list(self._get_argument_value(argument, self.json_fields.NAME, section))
1439
-
1440
- for name in sql_name:
1441
- sql_name = name
1442
- is_required = not self._get_argument_value(argument, self.json_fields.OPTIONAL, section, mandatory=False,
1443
- default_value=True)
1444
- sql_description = self._get_argument_value(argument, self.json_fields.DESCRIPTION, section)
1445
-
1446
- datatype = self._get_argument_value(argument, self.json_fields.DATATYPE, section)
1447
- nested_params_json = self._get_argument_value(argument, self.json_fields.NESTED_PARAMS_JSON, section,
1448
- mandatory=False, default_value=None)
1449
- # Validate whether nested params exist only if data type is a record.
1450
- if datatype == "record":
1451
- if nested_params_json is None:
1452
- raise TeradataMlException("For json: {} and parameter with name : {} nested_parameters should"
1453
- " be present as type is 'record'.".format(self.sql_function_name,
1454
- sql_name))
1455
- else:
1456
- if nested_params_json is not None:
1457
- raise TeradataMlException("For json: {} and parameter with name : {} type should be"
1458
- " 'record' as nested_parameters exist.".format(self.sql_function_name,
1459
- sql_name))
1460
-
1461
- # Look for default value. If list of default values are found,
1462
- # the consider the first element as default value.
1463
- default_value = self._get_argument_value(argument, self.json_fields.DEFAULT_VALUE, section, mandatory=False)
1464
-
1465
- # Json files can specify INFINITY as lower bound. So, convert it to appropriate
1466
- # type in python.
1467
- lower_bound = self._get_argument_value(argument, self.json_fields.LOWER_BOUND, section, mandatory=False)
1468
- lower_bound = UtilFuncs._get_negative_infinity() if lower_bound == self.json_fields.INFINITY else lower_bound
1469
-
1470
- # Json files can specify INFINITY as upper bound. So, convert it to appropriate
1471
- # type in python.
1472
- upper_bound = self._get_argument_value(argument, self.json_fields.UPPER_BOUND, section, mandatory=False)
1473
- upper_bound = UtilFuncs._get_positive_infinity() if upper_bound == self.json_fields.INFINITY else upper_bound
1474
-
1475
- allow_nan = self._get_argument_value(argument, self.json_fields.ALLOW_NAN, section, mandatory=False,
1476
- default_value=False)
1477
- check_duplicates = self._get_argument_value(argument, self.json_fields.CHECK_DUPLICATE, section, mandatory=False,
1478
- default_value=False)
1479
- lower_bound_type = self._get_argument_value(argument, self.json_fields.LOWER_BOUND_TYPE, section, mandatory=False)
1480
- upper_bound_type = self._get_argument_value(argument, self.json_fields.UPPER_BOUND_TYPE, section, mandatory=False)
1481
- required_length = self._get_argument_value(argument, self.json_fields.REQUIRED_LENGTH, section, mandatory=False,
1482
- default_value=0)
1483
- permitted_values = self._get_argument_value(argument, self.json_fields.PERMITTED_VALUES, section, mandatory=False)
1484
-
1485
- list_type = self._get_argument_value(argument, self.json_fields.LIST_TYPE, section, mandatory=False)
1486
-
1487
- # If lang_name is present in the JSON and is not equal to '...' use the lang_name from the JSON
1488
- # else lang name is equal to Pythonic sql_name.
1489
- lang_name = self._get_argument_value(argument, self.json_fields.LANG_NAME, section, mandatory=False)
1490
- lang_name = lang_name if lang_name is not None and lang_name != "..."\
1491
- else "_".join(filter(None, [prev_lang_name, self._get_pythonic_name_arg_name(sql_name)]))
1492
-
1493
- has_nested = False
1494
- nested_param_list = []
1495
- # Loop over the nested params if present and call the function in recursive manner.
1496
- if nested_params_json is not None:
1497
- has_nested = True
1498
- for nested_arg in nested_params_json:
1499
- for nested_list in self.__argument_parser(argument=nested_arg,
1500
- section=section,
1501
- parent=sql_name,
1502
- is_nested=True,
1503
- prev_lang_name=lang_name):
1504
- nested_param_list.append(nested_list)
1505
- yield _AnlyFuncArgumentUAF(data_type=datatype,
1506
- description=sql_description,
1507
- name=sql_name,
1508
- is_required=is_required,
1509
- permitted_values=permitted_values,
1510
- lower_bound=lower_bound,
1511
- upper_bound=upper_bound,
1512
- lower_bound_type=lower_bound_type,
1513
- upper_bound_type=upper_bound_type,
1514
- check_duplicates=check_duplicates,
1515
- list_type=list_type,
1516
- allow_nan=allow_nan,
1517
- lang_name=lang_name,
1518
- default_value=default_value,
1519
- required_length=required_length,
1520
- parent = parent,
1521
- is_nested = is_nested,
1522
- has_nested = has_nested,
1523
- nested_param_list=nested_param_list)
1524
-
1525
- def _process_arg_sections(self, section=None, arg_list_name=None):
1526
- """
1527
- DESCRIPTION:
1528
- Function to loop over the ARGUMENT_CLAUSES, INPUT_FMT and OUTPUT_FMT sections,
1529
- call the __argument_parser and populate the corresponding lists
1530
- with the objects of _AnlyFuncArgumentUAF .
1531
-
1532
- RETURNS:
1533
- None
1534
-
1535
- RAISES:
1536
- None
1537
- """
1538
- for argument in self.json_object.get(section, []):
1539
- for arg_list in self.__argument_parser(argument, section):
1540
- getattr(self, arg_list_name).append(arg_list)
1541
-
1542
- def _parse_arguments(self):
1543
- """
1544
- DESCRIPTION:
1545
- Function to process argument section and input_fmt and output_fmt sections, if present.
1546
-
1547
- RETURNS:
1548
- None
1549
-
1550
- RAISES:
1551
- None
1552
- """
1553
- # Parse all arguments.
1554
- self._process_arg_sections(section=self.json_fields.ARGUMENT_CLAUSES, arg_list_name="arguments")
1555
-
1556
- # Parse input_fmt section.
1557
- if self.has_input_fmt():
1558
- self._process_arg_sections(section=self.json_fields.INPUT_FMT, arg_list_name="input_fmt_arguments")
1559
-
1560
- # Parse output_fmt section.
1561
- if self.has_output_fmt():
1562
- self._process_arg_sections(section=self.json_fields.OUTPUT_FMT, arg_list_name="output_fmt_arguments")
1563
-
1564
- def __update_function_params_uaf_argument(self, argument):
1565
- """
1566
- DESCRIPTION:
1567
- Function to update the function_params list with argument's lang_name and default value.
1568
- If arguments have nested parameters, the lang_name and default value of the nested_parameters
1569
- are appended to the function_params list and not the parent element.
1570
-
1571
- RETURNS:
1572
- None
1573
-
1574
- RAISES:
1575
- None
1576
- """
1577
- if argument.get_has_nested():
1578
- for nested_arg in argument.get_nested_param_list():
1579
- self.__update_function_params_uaf_argument(nested_arg)
1580
- else:
1581
- r_default_value = argument.get_r_default_value()
1582
- default_value = r_default_value if r_default_value is not None else \
1583
- argument.get_default_value()
1584
- self.function_params[argument.get_lang_name()] = default_value
1585
-
1586
- def _generate_function_parameters(self):
1587
- """
1588
- DESCRIPTION:
1589
- Function to generate the UAF function argument names and their corresponding default values.
1590
- Function arguments are generated by adhering to following:
1591
- * Signature includes only input as well as other arguments (SQL: Using clause
1592
- arguments). So, process only those.
1593
- * Output arguments are ignored in the function signature. So, do not process Output arguments.
1594
- * Also, arguments pertaining to input_format and output_format are added.
1595
-
1596
- RETURNS:
1597
- None
1598
-
1599
- RAISES:
1600
- None
1601
- """
1602
- # Process input arguments
1603
- for input_args in self.input_tables:
1604
- lang_name = input_args.get_lang_name()
1605
- filter_exp = "{}_filter_expr".format(lang_name)
1606
- self.function_params.update({lang_name: input_args.get_default_value(),
1607
- filter_exp: input_args.get_default_value()})
1608
-
1609
- # Process arguments section.
1610
- parameters = []
1611
- for argument in self.arguments:
1612
- self.__update_function_params_uaf_argument(argument)
1613
-
1614
- # If has_input_fmt is True, add arguments related to input_fmt.
1615
- if self.has_input_fmt():
1616
- for argument in self.input_fmt_arguments:
1617
- self.__update_function_params_uaf_argument(argument)
1618
-
1619
- # If has_output_fmt() is True, then parameters related to output_fmt are added.
1620
- if self.has_output_fmt():
1621
- for argument in self.output_fmt_arguments:
1622
- self.__update_function_params_uaf_argument(argument)
1623
-
1624
- def _get_function_name(self):
1625
- """
1626
- DESCRIPTION:
1627
- Function to get the pythonic name of the function from the R_NAME
1628
- which is to be exposed to user.
1629
-
1630
- RETURNS:
1631
- str
1632
-
1633
- RAISES:
1634
- None
1635
- """
1636
- func_name = self.json_object[self.json_fields.R_NAME]
1637
- func_name = sub(r"(_|-)+", "", func_name[3:])
1
+ """
2
+ Unpublished work.
3
+ Copyright (c) 2021 by Teradata Corporation. All rights reserved.
4
+ TERADATA CORPORATION CONFIDENTIAL AND TRADE SECRET
5
+
6
+ Primary Owner: pradeep.garre@teradata.com
7
+ Secondary Owner: PankajVinod.Purandare@teradata.com
8
+
9
+ This file implements _AnlyFuncMetadata for representing the metadata (json data)
10
+ of analytic function. All the functions/API's looking to extract the json data
11
+ should look at corresponding API's in _AnlyFuncMetadata.
12
+ """
13
+ from collections import OrderedDict
14
+ import json, os, sys
15
+ from pathlib import Path
16
+ from re import sub
17
+ from teradataml.analytics.json_parser import PartitionKind, SqleJsonFields, UAFJsonFields, utils
18
+ from teradataml.analytics.json_parser.analytic_functions_argument import _AnlyFuncArgument,\
19
+ _AnlyFuncInput, _AnlyFuncOutput, _DependentArgument, _AnlyFuncArgumentUAF, _AnlyFuncOutputUAF, \
20
+ _AnlyFuncInputUAF
21
+ from teradataml.common.messages import Messages
22
+ from teradataml.common.messagecodes import MessageCodes
23
+ from teradataml.common.constants import TeradataAnalyticFunctionTypes, TeradataUAFSpecificArgs,\
24
+ TeradataAnalyticFunctionInfo
25
+ from teradataml.common.exceptions import TeradataMlException
26
+ from teradataml.common.utils import UtilFuncs
27
+ from teradataml.utils.validators import _Validators
28
+ from teradataml.utils.dtypes import _ListOf
29
+
30
+ class _PairedFunction:
31
+ """
32
+ Class to hold the paired function information for analytic functions.
33
+ It holds the information about the relation between the analytic
34
+ functions.
35
+ """
36
+ def __init__(self, function_relation, params):
37
+ """
38
+ DESCRIPTION:
39
+ Constructor of the class.
40
+
41
+ PARAMETERS:
42
+ function_relation:
43
+ Required Argument.
44
+ Specifies the relation of the paired function.
45
+ Type: str
46
+
47
+ params:
48
+ Required Argument.
49
+ Specifies the reference_function, input_arguments,
50
+ and model_output_argument wrt the paired function.
51
+ Type: dict
52
+ """
53
+ self.function_relation = function_relation
54
+ self.reference_function = params.get("reference_function", [])
55
+ self.input_arguments = params.get("input_arguments", [])
56
+ self.model_output_arguments = params.get("model_output_arguments", [])
57
+
58
+ @property
59
+ def arguments(self):
60
+ """
61
+ DESCRIPTION:
62
+ Function to get the input argument of paired function and output argument of referenced function.
63
+ """
64
+ for inp_arg, out_arg in zip(self.input_arguments, self.model_output_arguments):
65
+ yield inp_arg, out_arg
66
+
67
+
68
+ class _AnlyFuncMetadata:
69
+ """ Class to hold the json data. """
70
+
71
+ # A class variable to store the r function names and their function names.
72
+ # Note that this is a class variable so it is accessable from all the objects
73
+ # of _AnlyFuncMetadata.
74
+ _reference_function_names = {
75
+ "aa.glm": "GLM",
76
+ "aa.forest": "DecisionForest",
77
+ "aa.naivebayes.textclassifier.train": "NaiveBayesTextClassifier",
78
+ "aa.svm.sparse.train": "SVMSparse"
79
+ }
80
+ # A class variable to store the SQLE JSON Fields.
81
+ json_fields = SqleJsonFields()
82
+
83
+ def __init__(self, json_data, json_file, func_type=None):
84
+ """
85
+ DESCRIPTION:
86
+ Constructor for the class.
87
+
88
+ PARAMETERS:
89
+ json_data:
90
+ Required Argument.
91
+ Specifies the json content of analytic function.
92
+ Types: dict
93
+
94
+ json_file:
95
+ Required Argument.
96
+ Specifies the absolute path of the json file.
97
+ Types: str
98
+
99
+ func_type:
100
+ Optional Argument.
101
+ Specifies the type of analytic function.
102
+ Permitted Values: ['FASTPATH', 'TABLE_OPERATOR', 'UAF']
103
+ Types: str
104
+ """
105
+
106
+ # Validate func_type.
107
+ arg_info_matrix = []
108
+ arg_info_matrix.append(
109
+ ["func_type", func_type, False,
110
+ (str, type(None)), True, [TeradataAnalyticFunctionTypes.SQLE.value,
111
+ TeradataAnalyticFunctionTypes.TABLEOPERATOR.value,
112
+ TeradataAnalyticFunctionTypes.UAF.value,
113
+ TeradataAnalyticFunctionTypes.BYOM.value,
114
+ None]])
115
+ arg_info_matrix.append(["json_file", json_file, False, str, True])
116
+ _Validators._validate_function_arguments(arg_info_matrix)
117
+
118
+ # Get the appropriate JSON Fields based on the class of the object i.e UAF or SQLE/TABLE_OPERATOR.
119
+ self.short_description = json_data[self.json_fields.SHORT_DESCRIPTION]
120
+ self.long_description = json_data[self.json_fields.LONG_DESCRIPTION]
121
+ # Store Input Table data objects.
122
+ self.__input_tables = []
123
+ # Store Output Table data objects.
124
+ self.__output_tables = []
125
+ # To store mapping between sql name and lang names of Input Tables.
126
+ self.__input_table_lang_names = {}
127
+ # Store rest of function argument objects.
128
+ self.__arguments = []
129
+
130
+ # JSON Object
131
+ self.json_object = json_data
132
+ self._json_file = json_file
133
+
134
+ # Store formula args if applicable.
135
+ self.__formula_args = []
136
+
137
+ # Variable to hold the name of the argument as key and the corresponding section as
138
+ # value. This is used for checking duplicate arguments.
139
+ self.__arguments_and_sections = {}
140
+ self.func_type = json_data[self.json_fields.FUNCTION_TYPE].lower() if func_type is None else func_type.lower()
141
+ self.sql_function_name = json_data[self.json_fields.FUNC_NAME]
142
+ self.func_category = self.json_object.get(self.json_fields.FUNCTION_CATEGORY, None)
143
+
144
+ # Validating func_type and sql_function_name
145
+ self.__arg_info_matrix = []
146
+ self.__arg_info_matrix.append(["func_type", self.func_type, True, str])
147
+ self.__arg_info_matrix.append(["sql_function_name", self.sql_function_name, False, str])
148
+ _Validators._validate_function_arguments(self.__arg_info_matrix)
149
+
150
+ # Generating func_name from the sql_function_name
151
+ self.func_name = self._get_function_name()
152
+ self.__database_version = Path(self._json_file).parts[-2]
153
+ self._func_type_specific_setup()
154
+
155
+ # Call a function read JSON and collect arguments, input
156
+ # and output table arguments.
157
+ self.__parse_json()
158
+ self.__function_params = OrderedDict()
159
+ # Lets store the r function name and the function names in a mapper.
160
+
161
+ # Storing the paired function information
162
+ self.__paired_functions = []
163
+
164
+ def set_paired_functions(self, params):
165
+ """
166
+ DESCRIPTION:
167
+ Function to set the 'paired_function' attribute of _AnlyFuncMetadata.
168
+
169
+ PARAMETERS:
170
+ params:
171
+ Required Argument
172
+ Specifies the paired function information like the reference_function,
173
+ input_arguments and model_output_arguments.
174
+ Type: dict
175
+
176
+ RETURNS:
177
+ None.
178
+
179
+ RAISES:
180
+ None.
181
+ """
182
+
183
+ # params as
184
+ # {
185
+ # "predict": {
186
+ # "reference_function": "DecisionForestPredict",
187
+ # "input_arguments": ["object"],
188
+ # "model_output_arguments": ["result"]
189
+ # }
190
+ for paired_function_name, paired_function_params in params.items():
191
+ self.__paired_functions.append(
192
+ _PairedFunction(paired_function_name, paired_function_params))
193
+
194
+ def get_paired_functions(self):
195
+ """
196
+ DESCRIPTION:
197
+ Function to get the '__paired_functions' attribute of _AnlyFuncMetadata class.
198
+
199
+ RETURNS:
200
+ list of instances
201
+ """
202
+ return self.__paired_functions
203
+
204
+ def _func_type_specific_setup(self):
205
+ """
206
+ DESCRIPTION:
207
+ Additional setup required for SQLE and Table Operator functions.
208
+
209
+ RETURNS:
210
+ class OR None
211
+
212
+ RAISES:
213
+ None
214
+ """
215
+ # TODO: Output schema is not required so not storing it for now. If we need it in
216
+ # future, then it can be enabled.
217
+ # Store output schema of the function
218
+ # self.standard_output_schema = self.json_object.get(self.json_fields.OUTPUT_SCHEMA)
219
+ self._is_view_supported = self.json_object.get("supports_view", True)
220
+ self.__is_driver_function = self.json_object.get("function_type", "").lower() == "driver"
221
+ self.__refernce_function_name = self.json_object.get("ref_function_r_name")
222
+ self.__r_function_name = self.json_object.get("function_r_name")
223
+ _AnlyFuncMetadata._reference_function_names[self.__r_function_name] = self.func_name
224
+
225
+ def get_reference_function_class(self):
226
+ """
227
+ DESCRIPTION:
228
+ Function to get the reference function class. This function checks if the function
229
+ accepts any other function as input. If it accepts, it then returns the class of
230
+ the referenced function.
231
+
232
+ RETURNS:
233
+ class OR None
234
+
235
+ RAISES:
236
+ None
237
+
238
+ EXAMPLES:
239
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").get_reference_function_class()
240
+ """
241
+ reference_function = _AnlyFuncMetadata._reference_function_names.get(self.__refernce_function_name)
242
+ if reference_function:
243
+ return UtilFuncs._get_class(reference_function, supress_isinstance_check=True)
244
+
245
+ def _get_argument_value(self, argument_properties, property, section, mandatory=True, default_value=None):
246
+ """
247
+ DESCRIPTION:
248
+ Function to get the argument value from the json data. This function, checks
249
+ the argument is a mandatory argument or not. If mandatory and not found in json
250
+ data, raises an error otherwise either returns value or default value.
251
+
252
+ PARAMETERS:
253
+ argument_properties:
254
+ Required Argument.
255
+ Specifies json content of one of the below mentioned:
256
+ * Input argument.
257
+ * Output table.
258
+ * Input table.
259
+ Types: dict
260
+
261
+ property:
262
+ Required Argument.
263
+ Specifies the argument name to look in "argument_properties"
264
+ Types: str
265
+
266
+ section:
267
+ Required Argument.
268
+ Specifies the section of the json to which "property" belongs to.
269
+ Types: str
270
+
271
+ mandatory:
272
+ Required Argument.
273
+ Specifies whether "property" is a mandatory field in "argument_properties" or not.
274
+ Default Value: True
275
+ Types: bool
276
+
277
+ default_value:
278
+ Required Argument.
279
+ Specifies the default value of "property".
280
+ Types: str OR int OR float OR bool
281
+
282
+ RETURNS:
283
+ str OR bool OR int OR float OR list
284
+
285
+ RAISES:
286
+ TeradataMlException.
287
+
288
+ EXAMPLES:
289
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json")._get_argument_value(
290
+ json_data, "defaultValue", "input_tables", False)
291
+ """
292
+ if property not in argument_properties and mandatory:
293
+ error_message = Messages.get_message(MessageCodes.MISSING_JSON_FIELD,
294
+ property,
295
+ section)
296
+
297
+ raise TeradataMlException(error_message, MessageCodes.MISSING_JSON_FIELD)
298
+
299
+ return argument_properties.get(property, default_value)
300
+
301
+ def _parse_arguments(self):
302
+ """
303
+ DESCRIPTION:
304
+ Function to parse and store the argument in json file. This function first validates
305
+ whether argument is required for analytic function or not. If required, then arguments
306
+ section in json data is parsed and object of _AnlyFuncArgument is created and stored.
307
+ RETURNS:
308
+ None
309
+ RAISES:
310
+ TeradataMlException.
311
+ EXAMPLES:
312
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").__parse_arguments()
313
+ """
314
+ section = self.json_fields.ARGUMENT_CLAUSES
315
+ for argument in self.json_object.get(self.json_fields.ARGUMENT_CLAUSES, []):
316
+ is_argument_required = argument.get(self.json_fields.USEINR, False)
317
+
318
+ # Append argument to list if useInR is True.
319
+ if is_argument_required:
320
+ use_inR = is_argument_required
321
+
322
+ sql_name = self._get_argument_value(argument, self.json_fields.NAME, section)
323
+
324
+ lang_name = self._get_argument_value(argument, self.json_fields.LANG_NAME, section, False)
325
+ lang_name = lang_name if lang_name is not None else self._get_pythonic_name_arg_name(
326
+ self._get_argument_value(argument, self.json_fields.R_NAME, section))
327
+
328
+ is_required = self._get_argument_value(argument, self.json_fields.IS_REQUIRED, section)
329
+
330
+ sql_description = self._get_argument_value(argument, self.json_fields.DESCRIPTION, section)
331
+
332
+ r_description = self._get_argument_value(argument, self.json_fields.R_DESCRIPTION, section)
333
+
334
+ datatype = self._get_argument_value(argument, self.json_fields.DATATYPE, section)
335
+
336
+ r_order_num = self._get_argument_value(argument, self.json_fields.R_ORDER_NUM, section)
337
+
338
+ # Look for default value. If default value is not available, the look for default values.
339
+ # If default values found, the consider the first element as default value.
340
+ default_value = self._get_argument_value(argument, self.json_fields.DEFAULT_VALUE, section, False)
341
+ if isinstance(default_value, list):
342
+ default_value = default_value[0]
343
+
344
+ # Json files can specify INFINITY as lower bound. So, convert it to appropriate
345
+ # type in python.
346
+ lower_bound = self._get_argument_value(argument, self.json_fields.LOWER_BOUND, section, False)
347
+ lower_bound = UtilFuncs._get_negative_infinity() if lower_bound == self.json_fields.INFINITY\
348
+ else lower_bound
349
+
350
+ # Json files can specify INFINITY as upper bound. So, convert it to appropriate
351
+ # type in python.
352
+ upper_bound = self._get_argument_value(argument, self.json_fields.UPPER_BOUND, section, False)
353
+ upper_bound = UtilFuncs._get_positive_infinity() if upper_bound == self.json_fields.INFINITY\
354
+ else upper_bound
355
+
356
+ r_default_value = self._get_argument_value(argument, self.json_fields.R_DEFAULT_VALUE, section,
357
+ False)
358
+
359
+ allows_lists = self._get_argument_value(argument, self.json_fields.ALLOWS_LISTS, section, False,
360
+ False)
361
+
362
+ allow_padding = self._get_argument_value(argument, self.json_fields.ALLOW_PADDING, section, False,
363
+ False)
364
+
365
+ r_formula_usage = self._get_argument_value(argument, self.json_fields.R_FORMULA_USAGE, section, False,
366
+ False)
367
+
368
+ allow_nan = self._get_argument_value(argument, self.json_fields.ALLOW_NAN, section, False, False)
369
+
370
+ check_duplicate = self._get_argument_value(argument, self.json_fields.CHECK_DUPLICATE, section, False,
371
+ False)
372
+
373
+ is_output_column = self._get_argument_value(argument, self.json_fields.IS_OUTPUT_COLUMN, section, False,
374
+ False)
375
+
376
+ lower_bound_type = self._get_argument_value(argument, self.json_fields.LOWER_BOUND_TYPE, section, False)
377
+
378
+ upper_bound_type = self._get_argument_value(argument, self.json_fields.UPPER_BOUND_TYPE, section, False)
379
+
380
+ required_length = self._get_argument_value(argument, self.json_fields.REQUIRED_LENGTH, section, False, 0)
381
+
382
+ match_length_of_argument = self._get_argument_value(
383
+ argument, self.json_fields.MATCH_LENGTH_OF_ARGUMENT, section, False, False)
384
+
385
+ permitted_values = self._get_argument_value(argument, self.json_fields.PERMITTED_VALUES, section, False)
386
+
387
+ target_table = self._get_argument_value(argument, self.json_fields.TARGET_TABLE, section, False)
388
+
389
+ allowed_types = self._get_argument_value(argument, self.json_fields.ALLOWED_TYPES, section, False)
390
+
391
+ allowed_type_groups = self._get_argument_value(argument, self.json_fields.ALLOWED_TYPE_GROUPS, section,
392
+ False)
393
+
394
+ alternate_sql_name = self._get_argument_value(argument, self.json_fields.ALTERNATE_NAMES, section, False)
395
+
396
+ # Check for duplicate arguments.
397
+ self._validate_duplicate_argument(lang_name, self.json_fields.ARGUMENT_CLAUSES)
398
+
399
+ # Get the lang name of target table if target table exists for given argument.
400
+ target_table_lang_name = None
401
+ if target_table and len(target_table) > 0:
402
+ target_table_lang_name = self.__get_input_table_lang_name(sql_name=target_table[0])
403
+
404
+ if sql_name.lower() == self.json_fields.SEQUENCE_INPUT_BY or\
405
+ sql_name.lower() == self.json_fields.UNIQUE_ID:
406
+ for j in range(len(self.input_tables)):
407
+ r_order_num = (r_order_num * 10) + j
408
+
409
+ sql_name = self.input_tables[j].get_sql_name()
410
+ datatype = "COLUMN_NAMES"
411
+
412
+ self.arguments.append(_AnlyFuncArgument(default_value=default_value,
413
+ permitted_values=permitted_values,
414
+ lower_bound=lower_bound,
415
+ lower_bound_type=lower_bound_type,
416
+ upper_bound=upper_bound,
417
+ upper_bound_type=upper_bound_type,
418
+ allow_nan=allow_nan,
419
+ required_length=required_length,
420
+ match_length_of_argument=match_length_of_argument,
421
+ sql_name=sql_name,
422
+ is_required=is_required,
423
+ sql_description=sql_description,
424
+ lang_description=r_description,
425
+ datatype=datatype,
426
+ allows_lists=allows_lists,
427
+ allow_padding=allow_padding,
428
+ use_in_r=use_inR,
429
+ r_formula_usage=r_formula_usage,
430
+ r_default_value=r_default_value,
431
+ target_table=target_table,
432
+ target_table_lang_name=target_table_lang_name,
433
+ check_duplicate=check_duplicate,
434
+ allowed_types=allowed_types,
435
+ allowed_type_groups=allowed_type_groups,
436
+ r_order_num=r_order_num,
437
+ is_output_column=is_output_column,
438
+ alternate_sql_name=alternate_sql_name,
439
+ lang_name=lang_name))
440
+ else:
441
+ self.arguments.append(_AnlyFuncArgument(default_value=default_value,
442
+ permitted_values=permitted_values,
443
+ lower_bound=lower_bound,
444
+ lower_bound_type=lower_bound_type,
445
+ upper_bound=upper_bound,
446
+ upper_bound_type=upper_bound_type,
447
+ allow_nan=allow_nan,
448
+ required_length=required_length,
449
+ match_length_of_argument=match_length_of_argument,
450
+ sql_name=sql_name,
451
+ is_required=is_required,
452
+ sql_description=sql_description,
453
+ lang_description=r_description,
454
+ datatype=datatype,
455
+ allows_lists=allows_lists,
456
+ allow_padding=allow_padding,
457
+ lang_name=lang_name,
458
+ use_in_r=use_inR,
459
+ r_formula_usage=r_formula_usage,
460
+ r_default_value=r_default_value,
461
+ target_table=target_table,
462
+ target_table_lang_name=target_table_lang_name,
463
+ check_duplicate=check_duplicate,
464
+ allowed_types=allowed_types,
465
+ allowed_type_groups=allowed_type_groups,
466
+ r_order_num=r_order_num,
467
+ is_output_column=is_output_column,
468
+ alternate_sql_name=alternate_sql_name))
469
+
470
+ def _parse_input_tables(self):
471
+ """
472
+ DESCRIPTION:
473
+ Function to parse and store the input tables in json file. This function first validates
474
+ whether input table is required for analytic function or not. If required, then input tables
475
+ section in json data is parsed and object of _AnlyFuncInput is created and stored.
476
+
477
+ RETURNS:
478
+ None
479
+
480
+ RAISES:
481
+ TeradataMlException.
482
+
483
+ EXAMPLES:
484
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").__parse_input_tables()
485
+ """
486
+ section = self.json_fields.INPUT_TABLES
487
+ for input_table_param in self.json_object.get(self.json_fields.INPUT_TABLES, []):
488
+ is_input_table_required = input_table_param.get(self.json_fields.USEINR, False)
489
+
490
+ # Append argument/input table to list if useInR is True.
491
+ if is_input_table_required:
492
+ use_InR = is_input_table_required
493
+
494
+ r_order_num = self._get_argument_value(input_table_param, self.json_fields.R_ORDER_NUM, section)
495
+
496
+ sql_name = self._get_argument_value(input_table_param, self.json_fields.NAME, section)
497
+
498
+ is_required = self._get_argument_value(input_table_param, self.json_fields.IS_REQUIRED, section,
499
+ mandatory=False, default_value=True)
500
+
501
+
502
+ sql_description = self._get_argument_value(input_table_param, self.json_fields.DESCRIPTION, section)
503
+
504
+ r_description = self._get_argument_value(input_table_param, self.json_fields.R_DESCRIPTION, section)
505
+
506
+ datatype = self._get_argument_value(input_table_param, self.json_fields.DATATYPE, section)
507
+
508
+ required_input_kind = self._get_argument_value(
509
+ input_table_param, self.json_fields.REQUIRED_INPUT_KIND, section, False, None)
510
+
511
+ partition_by_one = self._get_argument_value(
512
+ input_table_param, self.json_fields.PARTITION_BY_ONE, section, False, False)
513
+
514
+ partition_by_one_inclusive = self._get_argument_value(
515
+ input_table_param, self.json_fields.PARTITION_BY_ONE_INCLUSIVE, section, False, False)
516
+
517
+ is_ordered = self._get_argument_value(input_table_param, self.json_fields.IS_ORDERED, section, False,
518
+ False)
519
+
520
+ is_local_ordered = self._get_argument_value(input_table_param, self.json_fields.IS_LOCAL_ORDERED,
521
+ section, False, False)
522
+
523
+ hash_by_key = self._get_argument_value(input_table_param, self.json_fields.HASH_BY_KEY, section, False,
524
+ False)
525
+
526
+ allows_lists = self._get_argument_value(input_table_param, self.json_fields.ALLOWS_LISTS, section, False,
527
+ False)
528
+
529
+ lang_name = self._get_pythonic_name_arg_name(
530
+ self._get_argument_value(input_table_param, self.json_fields.R_NAME, section))
531
+
532
+ r_formula_usage = self._get_argument_value(input_table_param, self.json_fields.R_FORMULA_USAGE, section,
533
+ False, False)
534
+
535
+ alternate_sql_name = self._get_argument_value(input_table_param, self.json_fields.ALTERNATE_NAMES,
536
+ section, False)
537
+
538
+ # Check for duplicate arguments.
539
+ self._validate_duplicate_argument(lang_name, self.json_fields.INPUT_TABLES)
540
+
541
+ self.input_tables.append(_AnlyFuncInput(required_input_kind=required_input_kind,
542
+ partition_by_one=partition_by_one,
543
+ partition_by_one_inclusive=partition_by_one_inclusive,
544
+ is_ordered=is_ordered,
545
+ hash_by_key=hash_by_key,
546
+ is_local_ordered=is_local_ordered,
547
+ sql_name=sql_name,
548
+ is_required=is_required,
549
+ sql_description=sql_description,
550
+ lang_description=r_description,
551
+ datatype=datatype,
552
+ allows_lists=allows_lists,
553
+ lang_name=lang_name,
554
+ use_in_r=use_InR,
555
+ r_formula_usage=r_formula_usage,
556
+ r_order_num=r_order_num,
557
+ alternate_sql_name=alternate_sql_name))
558
+ # Add entry in map for sql and lang name of input table.
559
+ self.__input_table_lang_names[sql_name.lower()] = lang_name.lower()
560
+ if alternate_sql_name:
561
+ for alter_sql_name in alternate_sql_name:
562
+ self.__input_table_lang_names[alter_sql_name.lower()] = lang_name.lower()
563
+
564
+
565
+ def _parse_output_tables(self):
566
+ """
567
+ DESCRIPTION:
568
+ Function to parse and store the output tables in json file. This function first validates
569
+ whether output table is required for analytic function or not. If required, then output tables
570
+ section in json data is parsed and object of _AnlyFuncOutput is created and stored.
571
+
572
+ RETURNS:
573
+ None
574
+
575
+ RAISES:
576
+ TeradataMlException.
577
+
578
+ EXAMPLES:
579
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").__parse_output_tables()
580
+ """
581
+ section = self.json_fields.OUTPUT_TABLES
582
+ for output_table_param in self.json_object.get(self.json_fields.OUTPUT_TABLES, []):
583
+ is_output_table_required = output_table_param.get(self.json_fields.USEINR, False)
584
+
585
+ # Append argument/output table to list if useInR is true.
586
+ if is_output_table_required:
587
+ useInR = is_output_table_required
588
+
589
+ sql_name = self._get_argument_value(output_table_param, self.json_fields.NAME, section)
590
+
591
+ is_required = self._get_argument_value(output_table_param, self.json_fields.IS_REQUIRED, section)
592
+
593
+ sql_description = self._get_argument_value(output_table_param, self.json_fields.DESCRIPTION, section)
594
+
595
+ r_description = self._get_argument_value(output_table_param, self.json_fields.R_DESCRIPTION, section)
596
+
597
+ datatype = self._get_argument_value(output_table_param, self.json_fields.DATATYPE, section)
598
+
599
+ lang_name = self._get_pythonic_name_arg_name(self._get_argument_value(output_table_param,
600
+ self.json_fields.R_NAME, section))
601
+
602
+ r_order_num = self._get_argument_value(output_table_param, self.json_fields.R_ORDER_NUM, section)
603
+
604
+ is_output_table = self._get_argument_value(output_table_param, self.json_fields.IS_OUTPUT_TABLE,
605
+ section, False, False)
606
+
607
+ allows_lists = self._get_argument_value(output_table_param, self.json_fields.ALLOWS_LISTS, section,
608
+ False, False)
609
+
610
+ alternate_sql_name = self._get_argument_value(output_table_param, self.json_fields.ALTERNATE_NAMES,
611
+ section, False)
612
+
613
+ # TODO: Additional dependencies needs to be implemented with ELE-4511.
614
+ is_required_dependent_argument = self._get_argument_value(
615
+ output_table_param, self.json_fields.IS_REQUIRED_DEPENDENT, section, False)
616
+ dependent_argument = None
617
+ if is_required_dependent_argument:
618
+
619
+ argument_type = "input_tables"
620
+ if is_required_dependent_argument.get(self.json_fields.DEPENDENT_ARGUMENT_TYPE) == "argument":
621
+ argument_type = "arguments"
622
+ elif is_required_dependent_argument.get(self.json_fields.DEPENDENT_ARGUMENT_TYPE) == "input_table":
623
+ argument_type = "input_tables"
624
+
625
+ argument_name = is_required_dependent_argument.get(self.json_fields.DEPENDENT_ARGUMENT_NAME)
626
+ operator = is_required_dependent_argument.get(self.json_fields.OPERATOR)
627
+ right_operand = is_required_dependent_argument.get(self.json_fields.DEPENDENT_ARGUMENT_VALUE)
628
+ dependent_argument = _DependentArgument(sql_name=argument_name,
629
+ operator=operator,
630
+ right_operand=right_operand,
631
+ type=argument_type)
632
+
633
+ # TODO: Output schema is not being used any where in processing. So, skipping it for now.
634
+ # output_schema = self._get_argument_value(output_table_param, self.json_fields.OUTPUT_SCHEMA, False)
635
+
636
+ self.output_tables.append(_AnlyFuncOutput(sql_name=sql_name,
637
+ is_required=is_required,
638
+ sql_description=sql_description,
639
+ lang_description=r_description,
640
+ lang_name=lang_name,
641
+ use_in_r=useInR,
642
+ r_order_num=r_order_num,
643
+ is_output_table=is_output_table,
644
+ datatype=datatype,
645
+ allows_lists=allows_lists,
646
+ output_schema=None,
647
+ alternate_sql_name=alternate_sql_name,
648
+ is_required_dependent_argument=dependent_argument))
649
+
650
+ def __parse_json(self):
651
+ try:
652
+ # Parse all input tables.
653
+ self._parse_input_tables()
654
+
655
+ # Parse all output tables.
656
+ self._parse_output_tables()
657
+
658
+ # Parse all arguments.
659
+ self._parse_arguments()
660
+
661
+ except Exception as err:
662
+ teradataml_file_path = os.path.join(*Path(self._json_file).parts[-6:])
663
+ raise TeradataMlException(Messages.get_message(MessageCodes.INVALID_JSON,
664
+ teradataml_file_path,
665
+ str(err)),
666
+ MessageCodes.INVALID_JSON)
667
+
668
+ def __get_analytic_function_args(self):
669
+ """
670
+ DESCRIPTION:
671
+ Internal function to get the arguments of analytic function, which are required
672
+ to generate function signature. This function iterates through every input
673
+ table and argument, and does the below.
674
+ * Check if argument formulates to an argument "formula" when exposed or not. If yes,
675
+ then the argument should be the first argument and is extracted to a different variable.
676
+ * Function arguments with rOrderNum <= 0 are not supposed to be exposed
677
+ to end user. Ignore these arguments.
678
+
679
+ RAISES:
680
+ None
681
+
682
+ RETURNS:
683
+ tuple, first element specifies formula argument and second element specifies
684
+ list of required arguments for analytic function.
685
+
686
+ EXAMPLES:
687
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").__get_analytic_function_args()
688
+ """
689
+ new_args = []
690
+ args = self.input_tables + self.arguments
691
+
692
+ for arg in args:
693
+ r_order_num = arg.get_r_order_number()
694
+ is_argument_formula = isinstance(arg, _AnlyFuncArgument) and arg.is_argument_a_formula() \
695
+ and arg.get_r_order_number() <= 0
696
+ if is_argument_formula:
697
+ if arg.get_r_order_number() == 0:
698
+ self.__dependent_formula_arg = arg
699
+ self.__formula_args.append(arg)
700
+ continue
701
+
702
+ if r_order_num <= 0:
703
+ continue
704
+
705
+ new_args.append(arg)
706
+ return self.__formula_args, new_args
707
+
708
+ def _generate_function_parameters(self):
709
+ """
710
+ DESCRIPTION:
711
+ Function to generate the analytic function argument names and their corresponding default values.
712
+ Function arguments are generated by adhering to following:
713
+ * Signature includes only input as well as other arguments (SQL: Using clause
714
+ arguments). So, process only those.
715
+ * Output arguments are ignored in the function signature. So, do not process Output arguments.
716
+ * Also, arguments pertaining to partition and order column are also generated for
717
+ input tables.
718
+
719
+ RAISES:
720
+ None
721
+
722
+ RETURNS:
723
+ None
724
+
725
+ EXAMPLES:
726
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json")._generate_function_parameters()
727
+ """
728
+
729
+ formula_args, args = self.__get_analytic_function_args()
730
+
731
+ # Formula should always appear as first argument. So, start with formula argument.
732
+ if formula_args:
733
+ self.function_params["formula"] = None
734
+
735
+ for arg in args:
736
+
737
+ arg_name = arg.get_lang_name()
738
+ default_value = arg.get_default_value()
739
+
740
+ # Add argument and default value in the same order.
741
+ self.function_params[arg_name] = default_value
742
+
743
+ def __process_partition_order_columns(self, arg):
744
+ """
745
+ DESCRIPTION:
746
+ Function to generate the arguments which are related to partition columns
747
+ and order columns arguments.
748
+
749
+ PARAMETERS:
750
+ arg:
751
+ Required Argument.
752
+ Specifies the object of analytic input argument.
753
+ Types: _AnlyFuncInput
754
+
755
+ RAISES:
756
+ None
757
+
758
+ RETURNS:
759
+ None
760
+
761
+ EXAMPLES:
762
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").__process_partition_order_columns(arg)
763
+ """
764
+ partition_column_kind = arg._get_partition_column_required_kind()
765
+ partition_value = arg._get_default_partition_by_value(partition_column_kind)
766
+
767
+ # If Function supports only PartitionByOne or PartitionByAny, don't expose
768
+ # partition column to user.
769
+ if arg._only_partition_by_one() or\
770
+ arg._only_partition_by_any():
771
+ pass
772
+ elif partition_column_kind == PartitionKind.KEY or \
773
+ partition_column_kind == PartitionKind.DIMENSIONKEY:
774
+ self.function_params["{}_partition_column".format(arg.get_lang_name())] = None
775
+ elif partition_column_kind in [PartitionKind.ANY,
776
+ PartitionKind.DIMENSIONKEYANY,
777
+ PartitionKind.ONE]:
778
+ self.function_params['{}_partition_column'.format(arg.get_lang_name())] = partition_value
779
+
780
+ # If function type is not a driver or argument is ordered, then add order
781
+ # column also to arguments.
782
+ if not self.__is_driver_function or arg.is_ordered():
783
+ self.function_params["{}_order_column".format(arg.get_lang_name())] = None
784
+
785
+ def __process_hash_local_order_columns(self, arg):
786
+ """
787
+ DESCRIPTION:
788
+ Generate the arguments related to LOCAL ORDER BY and HASH BY KEY.
789
+
790
+ PARAMETERS:
791
+ arg:
792
+ Required Argument.
793
+ Specifies the object of analytic input argument.
794
+ Types: _AnlyFuncInput
795
+
796
+ RAISES:
797
+ None
798
+
799
+ RETURNS:
800
+ None
801
+
802
+ EXAMPLES:
803
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").__process_hash_local_order_columns(arg)
804
+ """
805
+ # If the argument is local ordered, then add "is_local_ordered"
806
+ # as argument.
807
+ if arg.is_local_ordered():
808
+ self.function_params["{}_is_local_ordered".format(arg.get_lang_name())] = False
809
+ # Let's check if function has HASH BY clause.
810
+ if arg.hash_by_key():
811
+ self.function_params['{}_hash_column'.format(arg.get_lang_name())] = None
812
+
813
+ def get_function_parameters_string(self, exclude_args=[]):
814
+ """
815
+ DESCRIPTION:
816
+ Function to generate the function parameters in string format.
817
+
818
+ RAISES:
819
+ None
820
+
821
+ RETURNS:
822
+ str
823
+
824
+ EXAMPLES:
825
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").get_function_parameters_string()
826
+ """
827
+ if not self.function_params:
828
+ self._generate_function_parameters()
829
+ # Along with function parameters, kwargs should be added to accept other parameters.
830
+ return ", ".join(["{} = {}".format(param, '"{}"'.format(value) if isinstance(value, str) else value)
831
+ for param, value in self.function_params.items() if param not in exclude_args] + ["**generic_arguments"])
832
+
833
+ @property
834
+ def input_tables(self):
835
+ """
836
+ DESCRIPTION:
837
+ Function to return input tables.
838
+
839
+ RETURNS:
840
+ list
841
+
842
+ RAISES:
843
+ None
844
+
845
+ EXAMPLES:
846
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").input_tables
847
+ """
848
+ return self.__input_tables
849
+
850
+ @input_tables.setter
851
+ def input_tables(self, input):
852
+ """
853
+ DESCRIPTION:
854
+ Function to append variable to the input tables list.
855
+
856
+ PARAMETERS:
857
+ input:
858
+ Required Argument.
859
+ Specifies the variable to be appended.
860
+
861
+ RETURNS:
862
+ None
863
+
864
+ RAISES:
865
+ None
866
+ """
867
+ self.__input_tables.append(input)
868
+
869
+ @property
870
+ def output_tables(self):
871
+ """
872
+ DESCRIPTION:
873
+ Function to return output tables.
874
+
875
+ RETURNS:
876
+ list
877
+
878
+ RAISES:
879
+ None
880
+
881
+ EXAMPLES:
882
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").output_tables
883
+ """
884
+ return self.__output_tables
885
+
886
+ @output_tables.setter
887
+ def output_tables(self, output):
888
+ """
889
+ DESCRIPTION:
890
+ Function to append variable to the output tables list.
891
+
892
+ PARAMETERS:
893
+ input:
894
+ Required Argument.
895
+ Specifies the variable to be appended.
896
+
897
+ RETURNS:
898
+ None
899
+
900
+ RAISES:
901
+ None
902
+ """
903
+ self.__output_tables.append(output)
904
+
905
+ @property
906
+ def input_table_lang_names(self):
907
+ """
908
+ DESCRIPTION:
909
+ Function to return map between sql name and lang name of input tables.
910
+
911
+ RETURNS:
912
+ dict
913
+
914
+ RAISES:
915
+ None
916
+
917
+ EXAMPLES:
918
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").input_table_lang_names
919
+ """
920
+ return self.__input_table_lang_names
921
+
922
+ @property
923
+ def arguments(self):
924
+ """
925
+ DESCRIPTION:
926
+ Function to return arguments.
927
+
928
+ RETURNS:
929
+ list
930
+
931
+ RAISES:
932
+ None
933
+
934
+ EXAMPLES:
935
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").arguments
936
+ """
937
+ return self.__arguments
938
+
939
+
940
+ @arguments.setter
941
+ def arguments(self, argument):
942
+ """
943
+ DESCRIPTION:
944
+ Function to append the variable to the arguments list.
945
+
946
+ PARAMETERS:
947
+ argument:
948
+ Required Argument.
949
+ Specifies the variable to be appended.
950
+
951
+ RETURNS:
952
+ None
953
+
954
+ RAISES:
955
+ None
956
+ """
957
+ self.__arguments.append(argument)
958
+
959
+ @property
960
+ def arguments_and_sections(self):
961
+ """
962
+ DESCRIPTION:
963
+ Function to return arguments_and_sections.
964
+
965
+ RETURNS:
966
+ list
967
+
968
+ RAISES:
969
+ None
970
+
971
+ EXAMPLES:
972
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").arguments_and_sections
973
+ """
974
+ return self.__arguments_and_sections
975
+
976
+ @arguments_and_sections.setter
977
+ def arguments_and_sections(self, argument):
978
+ """
979
+ DESCRIPTION:
980
+ Function to update the arguments_and_sections dictonary.
981
+
982
+ PARAMETERS:
983
+ argument:
984
+ Required Argument.
985
+ Specifies the variable to be added to the dictonary.
986
+
987
+ RETURNS:
988
+ None
989
+
990
+ RAISES:
991
+ None
992
+ """
993
+ self.__arguments_and_sections.update(argument)
994
+
995
+ @property
996
+ def function_params(self):
997
+ """
998
+ DESCRIPTION:
999
+ Function to get the function_params.
1000
+
1001
+ RETURNS:
1002
+ list
1003
+
1004
+ RAISES:
1005
+ None
1006
+
1007
+ EXAMPLES:
1008
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").function_params
1009
+ """
1010
+ return self.__function_params
1011
+
1012
+ @function_params.setter
1013
+ def function_params(self, argument):
1014
+ """
1015
+ DESCRIPTION:
1016
+ Function to set the function_params.
1017
+
1018
+ PARAMETERS:
1019
+ argument:
1020
+ Required Argument.
1021
+ Specifies the variable to be added to the dictonary.
1022
+
1023
+ RETURNS:
1024
+ list
1025
+
1026
+ RAISES:
1027
+ None
1028
+
1029
+ """
1030
+ self.__function_params.update(argument)
1031
+
1032
+ @property
1033
+ def formula_args(self):
1034
+ """
1035
+ DESCRIPTION:
1036
+ Function to return formula arguments.
1037
+ _AnlyFuncMetadata(json_data, "/abc/TD_GLM.json").formula_args
1038
+ """
1039
+ return self.__formula_args
1040
+
1041
+ @staticmethod
1042
+ def __get_anly_function_name_mapper():
1043
+ """
1044
+ DESCRIPTION:
1045
+ Function to read mapper file teradataml/analytics/jsons/anly_function_name.json,
1046
+ which has a mapping between function name specified in json file and function to
1047
+ appear in user's context.
1048
+
1049
+ RETURNS:
1050
+ list
1051
+
1052
+ RAISES:
1053
+ None
1054
+ """
1055
+ return json.loads(
1056
+ UtilFuncs._get_file_contents(os.path.join(UtilFuncs._get_data_directory(dir_name="jsons"),
1057
+ "anly_function_name.json")))
1058
+
1059
+ def _validate_duplicate_argument(self, lang_name, section):
1060
+ """
1061
+ DESCRIPTION:
1062
+ Internal function to check the duplicates of arguments. No python function
1063
+ accepts duplicate parameters and since analytic functions are being formed at
1064
+ run time from json, there are chances that function may be constructed with
1065
+ duplicate arguments. This function validates whether arguments are duplicated or not.
1066
+
1067
+ PARAMETERS:
1068
+ lang_name:
1069
+ Required Argument.
1070
+ Specifies the name of the argument which is mentioned in json file.
1071
+ Types: str
1072
+
1073
+ section:
1074
+ Required Argument.
1075
+ Specifies the section of json file, to which argument belongs to.
1076
+ Types: str
1077
+
1078
+ RETURNS:
1079
+ None
1080
+
1081
+ RAISES:
1082
+ TeradataMlException
1083
+
1084
+ EXAMPLES:
1085
+ _AnlyFuncMetadata(data, "abc.json")._validate_duplicate_argument("abc", "input_tables")
1086
+ """
1087
+ if lang_name not in self.arguments_and_sections:
1088
+ self.arguments_and_sections[lang_name] = section
1089
+ else:
1090
+ raise TeradataMlException(Messages.get_message(MessageCodes.DUPLICATE_PARAMETER,
1091
+ lang_name,
1092
+ section),
1093
+ MessageCodes.DUPLICATE_PARAMETER)
1094
+
1095
+ @staticmethod
1096
+ def _get_pythonic_name_arg_name(r_name):
1097
+ """
1098
+ DESCRIPTION:
1099
+ Function to get the pythonic name for argument from the name specified
1100
+ in json. Conversion of a string to pythonic name does as below:
1101
+ * Strips out the trailing and leading spaces.
1102
+ * Converts the string to lower case.
1103
+ * Replaces the dot(.) with underscore.
1104
+ * Replaces the '_table' with '_data'.
1105
+ * Replaces the 'table_' with 'data_'.
1106
+
1107
+ PARAMETERS:
1108
+ r_name:
1109
+ Required Argument.
1110
+ Specifies the name of the argument which is mentioned in json file.
1111
+ Types: str
1112
+
1113
+ RETURNS:
1114
+ str
1115
+
1116
+ RAISES:
1117
+ None
1118
+
1119
+ EXAMPLES:
1120
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json")._get_pythonic_name_arg_name("abc")
1121
+ """
1122
+ return r_name.strip().lower().replace(".", "_").replace("_table", "_data").replace("table_", "data_")
1123
+
1124
+ def _get_function_name(self):
1125
+ """
1126
+ DESCRIPTION:
1127
+ Function to get the name of the function which is exposed to user.
1128
+
1129
+ RETURNS:
1130
+ str
1131
+
1132
+ RAISES:
1133
+ None
1134
+
1135
+ EXAMPLES:
1136
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json")._get_function_name()
1137
+ """
1138
+ # If teradataml/data/jsons/anly_function_name.json contains a mapping name, function name
1139
+ # should be corresponding mapping name. Else, same as function name.
1140
+
1141
+ func_name = self.__get_anly_function_name_mapper().get(self.json_object[self.json_fields.FUNCTION_ALIAS_NAME],
1142
+ self.json_object[self.json_fields.FUNCTION_ALIAS_NAME])
1143
+ # Few functions are expected to have a name starting with TD_,i.e., json file may
1144
+ # contain function name as TD_Xyz. Since we don't want the prefixed characters,
1145
+ # removing those.
1146
+ return func_name[3:] if func_name.startswith("TD_") else func_name
1147
+
1148
+ def get_doc_string(self):
1149
+ """
1150
+ DESCRIPTION:
1151
+ Function to get the docstring for the function from corresponding docs file.
1152
+ If docs file is not found, return a message asking the user to refer to reference guide.
1153
+
1154
+ PARAMETERS:
1155
+ None.
1156
+
1157
+ RETURNS:
1158
+ str
1159
+
1160
+ RAISES:
1161
+ None
1162
+
1163
+ EXAMPLES:
1164
+ _AnlyFuncMetadata(json_data, "/abc/Antiselect.json").get_doc_string()
1165
+ """
1166
+ func_info = getattr(TeradataAnalyticFunctionInfo, self.func_type.upper())
1167
+ function_type = func_info.value["func_type"]
1168
+ # For version dependent IN-DB functions, get version info as per vantage version
1169
+ # and then get exact doc dir.
1170
+ # For version independent IN-DB functions, get the docs directory under given
1171
+ # function type.
1172
+ if function_type in utils.func_type_json_version.keys():
1173
+ version_dir = utils.func_type_json_version[function_type]
1174
+ doc_dir = "docs_{}".format(version_dir.replace('.', '_'))
1175
+ else:
1176
+ doc_dir = "docs"
1177
+ try:
1178
+ # from teradataml.data.docs.<function_type>.<doc_dir_with_version_info>.<func_name>
1179
+ # import <func_name>
1180
+ func_module = __import__(("teradataml.data.docs.{}.{}.{}".
1181
+ format(function_type, doc_dir, self.func_name)),
1182
+ fromlist=[self.func_name])
1183
+ return getattr(func_module, self.func_name).__doc__
1184
+ except:
1185
+ return ("Refer to Teradata Package for Python Function Reference guide for "
1186
+ "Documentation. Reference guide can be found at: https://docs.teradata.com ."
1187
+ "Refer to the section with Database version: {}".format(self.__database_version))
1188
+
1189
+ def __get_input_table_lang_name(self, sql_name):
1190
+ """ Internal function to get lang name of input table when sql name is provided. """
1191
+ if sql_name.lower() in self.__input_table_lang_names.keys():
1192
+ return self.__input_table_lang_names.get(sql_name.lower()).lower()
1193
+
1194
+
1195
+ class _AnlyFuncMetadataUAF(_AnlyFuncMetadata):
1196
+ """ Class to hold the UAF json data. """
1197
+
1198
+ # Class variable to hold the UAF json fields.
1199
+ json_fields = UAFJsonFields()
1200
+
1201
+ def __init__(self, json_data, json_file, func_type):
1202
+ self.__input_fmt_arguments = []
1203
+ self.__output_fmt_arguments = []
1204
+ super().__init__(json_data, json_file, func_type)
1205
+
1206
+ @property
1207
+ def input_fmt_arguments(self):
1208
+ """
1209
+ DESCRIPTION:
1210
+ Property to get the arguments involved in INPUT_FMT section.
1211
+
1212
+ RETURNS:
1213
+ list
1214
+
1215
+ RAISES:
1216
+ None
1217
+
1218
+ EXAMPLES:
1219
+ _AnlyFuncMetadataUAF(json_data, "/abc/ArimaEstimate.json").function_params
1220
+ """
1221
+ return self.__input_fmt_arguments
1222
+
1223
+ @input_fmt_arguments.setter
1224
+ def input_fmt_arguments(self, argument):
1225
+ """
1226
+ DESCRIPTION:
1227
+ Property setter for the arguments involved in INPUT_FMT section.
1228
+
1229
+ PARAMETERS:
1230
+ argument:
1231
+ Required Argument.
1232
+ Specifies the variable to be added to the list.
1233
+ Type : _AnlyFuncArgumentUAF
1234
+
1235
+ RETURNS:
1236
+ list
1237
+
1238
+ RAISES:
1239
+ None
1240
+
1241
+ """
1242
+ self.__input_fmt_arguments.append(argument)
1243
+
1244
+ @property
1245
+ def output_fmt_arguments(self):
1246
+ """
1247
+ DESCRIPTION:
1248
+ Property to get the arguments involved in OUTPUT_FMT section.
1249
+
1250
+ RETURNS:
1251
+ list
1252
+
1253
+ RAISES:
1254
+ None
1255
+
1256
+ EXAMPLES:
1257
+ _AnlyFuncMetadataUAF(json_data, "/abc/ArimaEstimate.json").function_params
1258
+ """
1259
+ return self.__output_fmt_arguments
1260
+
1261
+ @output_fmt_arguments.setter
1262
+ def output_fmt_arguments(self, argument):
1263
+ """
1264
+ DESCRIPTION:
1265
+ Property setter for the arguments involved in OUTPUT_FMT section.
1266
+
1267
+ PARAMETERS:
1268
+ argument:
1269
+ Required Argument.
1270
+ Specifies the variable to be added to the list.
1271
+ Type : _AnlyFuncArgumentUAF
1272
+
1273
+ RETURNS:
1274
+ list
1275
+
1276
+ RAISES:
1277
+ None
1278
+
1279
+ """
1280
+ self.__output_fmt_arguments.append(argument)
1281
+
1282
+ def _func_type_specific_setup(self):
1283
+ """
1284
+ DESCRIPTION:
1285
+ Additional setup required for UAF functions.
1286
+
1287
+ RETURNS:
1288
+ None
1289
+
1290
+ RAISES:
1291
+ None
1292
+ """
1293
+ # Generic Json Parameters
1294
+ self.__function_version = self.json_object[self.json_fields.FUNCTION_VERSION]
1295
+ self.__json_version = self.json_object[self.json_fields.JSON_VERSION]
1296
+ self.__r_function_name = self.json_object[self.json_fields.R_NAME]
1297
+ self.__max_input_files = self.json_object[self.json_fields.MAX_INPUT_FILES]
1298
+ self.__is_plottable = self.json_object[self.json_fields.IS_PLOTTABLE]
1299
+ self.__input_fmt = self.json_object[self.json_fields.INPUT_FMT]
1300
+ self.__output_fmt = self.json_object[self.json_fields.OUTPUT_FMT]
1301
+
1302
+ # Getters
1303
+ self.get_function_version = lambda: self.__function_version
1304
+ self.get_json_version = lambda: self.__json_version
1305
+ self.get_func_r_name = lambda: self.__r_function_name
1306
+ self.get_max_input_files = lambda: self.__max_input_files
1307
+ self.get_is_plottable = lambda: self.__is_plottable
1308
+ self.has_input_fmt = lambda: self.__input_fmt
1309
+ self.has_output_fmt = lambda: self.__output_fmt
1310
+ self._is_view_supported = False
1311
+
1312
+ # Validation
1313
+ self.__arg_info_matrix = []
1314
+ self.__arg_info_matrix.append(["func_description_short", self.short_description, True, str])
1315
+ self.__arg_info_matrix.append(["func_description_long", self.long_description, False, (list, str)])
1316
+ self.__arg_info_matrix.append(["function_version", self.__function_version, True, str])
1317
+ self.__arg_info_matrix.append(["json_version", self.__json_version, True, str])
1318
+ self.__arg_info_matrix.append(["func_r_name", self.__r_function_name, True, str])
1319
+ self.__arg_info_matrix.append(["max_input_files", self.__max_input_files, False, int])
1320
+ self.__arg_info_matrix.append(["is_plottable", self.__is_plottable, False, bool])
1321
+
1322
+ # TODO : uncomment the lines when ELE-5078 is done.
1323
+ # self.__arg_info_matrix.append(["input_fmt", self.__input_fmt, False, (bool, _ListOf(dict)), False, [False]])
1324
+ # self.__arg_info_matrix.append(["output_fmt", self.__output_fmt, False, (bool, _ListOf(dict)), False, [False]])
1325
+
1326
+ self.__arg_info_matrix.append(["input_fmt", self.__input_fmt, False, (bool, _ListOf(dict))])
1327
+ self.__arg_info_matrix.append(["output_fmt", self.__output_fmt, False, (bool, _ListOf(dict))])
1328
+
1329
+ _Validators._validate_function_arguments(self.__arg_info_matrix)
1330
+
1331
+ def __input_params_generation(self, input_table_param, lang_name="data"):
1332
+ """
1333
+ DESCRIPTION:
1334
+ Function to generate the input parameters and form an object of class _AnlyFuncInputUAF.
1335
+
1336
+ RETURNS:
1337
+ None
1338
+
1339
+ RAISES:
1340
+ None
1341
+ """
1342
+ section = self.json_fields.INPUT_TABLES
1343
+ data_type = self._get_argument_value(input_table_param, self.json_fields.DATATYPE, section)
1344
+ description = self._get_argument_value(input_table_param, self.json_fields.DESCRIPTION, section)
1345
+ is_required = not self._get_argument_value(input_table_param, self.json_fields.OPTIONAL, section,
1346
+ mandatory=False, default_value=True)
1347
+ # Check for duplicate arguments.
1348
+ self._validate_duplicate_argument(lang_name, self.json_fields.INPUT_TABLES)
1349
+ # Create an object of class _AnlyFuncInputUAF and append to the list.
1350
+ self.input_tables.append(_AnlyFuncInputUAF(data_type=data_type,
1351
+ description=description,
1352
+ lang_name=lang_name,
1353
+ is_required=is_required))
1354
+
1355
+ def _parse_input_tables(self):
1356
+ """
1357
+ DESCRIPTION:
1358
+ Function to parse and store the input tables in json file. This function first validates
1359
+ whether input table is required for analytic function or not. If required, then input tables
1360
+ section in json data is parsed and object of _AnlyFuncInputUAF is created and stored.
1361
+
1362
+ RETURNS:
1363
+ None
1364
+
1365
+ RAISES:
1366
+ None
1367
+ """
1368
+
1369
+
1370
+ if len(self.json_object[self.json_fields.INPUT_TABLES]) == 1:
1371
+ input_table_param = self.json_object[self.json_fields.INPUT_TABLES][0]
1372
+ self.__input_params_generation(input_table_param)
1373
+ else:
1374
+ for counter, input_table_param in enumerate(self.json_object[self.json_fields.INPUT_TABLES], 1):
1375
+ lang_name = "data{}".format(counter)
1376
+ self.__input_params_generation(input_table_param, lang_name)
1377
+
1378
+ def _parse_output_tables(self):
1379
+ """
1380
+ DESCRIPTION:
1381
+ Function to parse and store the output tables in json file. This function first validates
1382
+ whether output table is required for analytic function or not. If required, then output tables
1383
+ section in json data is parsed and object of _AnlyFuncOutputUAF is created and stored.
1384
+
1385
+ RETURNS:
1386
+ None
1387
+
1388
+ RAISES:
1389
+ None
1390
+ """
1391
+ section = self.json_fields.OUTPUT_TABLES
1392
+
1393
+ for output_table_param in self.json_object[self.json_fields.OUTPUT_TABLES]:
1394
+ # Specifies the output type.
1395
+ data_type = self._get_argument_value(output_table_param, self.json_fields.DATATYPE, section)
1396
+
1397
+ # Specifies the column types for the result table.
1398
+ result_table_column_types = self._get_argument_value(output_table_param,
1399
+ self.json_fields.RESULT_TABLE_COLUMN_TYPES, section, False)
1400
+ # Specifies the output description.
1401
+ description = self._get_argument_value(output_table_param, self.json_fields.DESCRIPTION, section)
1402
+
1403
+ # Specifies whether the argument is required or not.
1404
+ is_required = not self._get_argument_value(output_table_param, self.json_fields.OPTIONAL, section, False)
1405
+
1406
+ # Specifies whether the layer is primary or not.
1407
+ primary_layer = self._get_argument_value(output_table_param, self.json_fields.PRIMARY_LAYER, section)
1408
+
1409
+ # Specifies the name of the output layer.
1410
+ layer_name = self._get_argument_value(output_table_param, self.json_fields.LAYER_NAME, section)
1411
+
1412
+ # Use the layer name as lang_name.
1413
+ # Remove 'art' if present in the first three characters from the layer_name.
1414
+ lang_name = layer_name.lower()[3:] if layer_name.lower()[:3] in "art" else layer_name.lower()
1415
+
1416
+ self.output_tables.append(_AnlyFuncOutputUAF(data_type=data_type,
1417
+ description=description,
1418
+ lang_name=lang_name,
1419
+ layer_name=layer_name,
1420
+ primary_layer=primary_layer,
1421
+ result_table_column_types=result_table_column_types,
1422
+ is_required=is_required))
1423
+
1424
+ def __argument_parser(self, argument, section, parent = None, is_nested=False, prev_lang_name=None):
1425
+ """
1426
+ DESCRIPTION:
1427
+ Internal function to parse the individual argument in json file.
1428
+ Nested arguments if present in json data, are parsed and object of _AnlyFuncArgumentUAF
1429
+ are appended to the nested_parameter_list.
1430
+ Used for parsing UAF function arguments under section 'func_params' in JSON file.
1431
+
1432
+ RETURNS:
1433
+ object of _AnlyFuncArgumentUAF
1434
+
1435
+ RAISES:
1436
+ TeradataMlException.
1437
+ """
1438
+ sql_name = UtilFuncs._as_list(self._get_argument_value(argument, self.json_fields.NAME, section))
1439
+
1440
+ for name in sql_name:
1441
+ sql_name = name
1442
+ is_required = not self._get_argument_value(argument, self.json_fields.OPTIONAL, section, mandatory=False,
1443
+ default_value=True)
1444
+ sql_description = self._get_argument_value(argument, self.json_fields.DESCRIPTION, section)
1445
+
1446
+ datatype = self._get_argument_value(argument, self.json_fields.DATATYPE, section)
1447
+ nested_params_json = self._get_argument_value(argument, self.json_fields.NESTED_PARAMS_JSON, section,
1448
+ mandatory=False, default_value=None)
1449
+ # Validate whether nested params exist only if data type is a record.
1450
+ if datatype == "record":
1451
+ if nested_params_json is None:
1452
+ raise TeradataMlException("For json: {} and parameter with name : {} nested_parameters should"
1453
+ " be present as type is 'record'.".format(self.sql_function_name,
1454
+ sql_name))
1455
+ else:
1456
+ if nested_params_json is not None:
1457
+ raise TeradataMlException("For json: {} and parameter with name : {} type should be"
1458
+ " 'record' as nested_parameters exist.".format(self.sql_function_name,
1459
+ sql_name))
1460
+
1461
+ # Look for default value. If list of default values are found,
1462
+ # the consider the first element as default value.
1463
+ default_value = self._get_argument_value(argument, self.json_fields.DEFAULT_VALUE, section, mandatory=False)
1464
+
1465
+ # Json files can specify INFINITY as lower bound. So, convert it to appropriate
1466
+ # type in python.
1467
+ lower_bound = self._get_argument_value(argument, self.json_fields.LOWER_BOUND, section, mandatory=False)
1468
+ lower_bound = UtilFuncs._get_negative_infinity() if lower_bound == self.json_fields.INFINITY else lower_bound
1469
+
1470
+ # Json files can specify INFINITY as upper bound. So, convert it to appropriate
1471
+ # type in python.
1472
+ upper_bound = self._get_argument_value(argument, self.json_fields.UPPER_BOUND, section, mandatory=False)
1473
+ upper_bound = UtilFuncs._get_positive_infinity() if upper_bound == self.json_fields.INFINITY else upper_bound
1474
+
1475
+ allow_nan = self._get_argument_value(argument, self.json_fields.ALLOW_NAN, section, mandatory=False,
1476
+ default_value=False)
1477
+ check_duplicates = self._get_argument_value(argument, self.json_fields.CHECK_DUPLICATE, section, mandatory=False,
1478
+ default_value=False)
1479
+ lower_bound_type = self._get_argument_value(argument, self.json_fields.LOWER_BOUND_TYPE, section, mandatory=False)
1480
+ upper_bound_type = self._get_argument_value(argument, self.json_fields.UPPER_BOUND_TYPE, section, mandatory=False)
1481
+ required_length = self._get_argument_value(argument, self.json_fields.REQUIRED_LENGTH, section, mandatory=False,
1482
+ default_value=0)
1483
+ permitted_values = self._get_argument_value(argument, self.json_fields.PERMITTED_VALUES, section, mandatory=False)
1484
+
1485
+ list_type = self._get_argument_value(argument, self.json_fields.LIST_TYPE, section, mandatory=False)
1486
+
1487
+ # If lang_name is present in the JSON and is not equal to '...' use the lang_name from the JSON
1488
+ # else lang name is equal to Pythonic sql_name.
1489
+ lang_name = self._get_argument_value(argument, self.json_fields.LANG_NAME, section, mandatory=False)
1490
+ lang_name = lang_name if lang_name is not None and lang_name != "..."\
1491
+ else "_".join(filter(None, [prev_lang_name, self._get_pythonic_name_arg_name(sql_name)]))
1492
+
1493
+ has_nested = False
1494
+ nested_param_list = []
1495
+ # Loop over the nested params if present and call the function in recursive manner.
1496
+ if nested_params_json is not None:
1497
+ has_nested = True
1498
+ for nested_arg in nested_params_json:
1499
+ for nested_list in self.__argument_parser(argument=nested_arg,
1500
+ section=section,
1501
+ parent=sql_name,
1502
+ is_nested=True,
1503
+ prev_lang_name=lang_name):
1504
+ nested_param_list.append(nested_list)
1505
+ yield _AnlyFuncArgumentUAF(data_type=datatype,
1506
+ description=sql_description,
1507
+ name=sql_name,
1508
+ is_required=is_required,
1509
+ permitted_values=permitted_values,
1510
+ lower_bound=lower_bound,
1511
+ upper_bound=upper_bound,
1512
+ lower_bound_type=lower_bound_type,
1513
+ upper_bound_type=upper_bound_type,
1514
+ check_duplicates=check_duplicates,
1515
+ list_type=list_type,
1516
+ allow_nan=allow_nan,
1517
+ lang_name=lang_name,
1518
+ default_value=default_value,
1519
+ required_length=required_length,
1520
+ parent = parent,
1521
+ is_nested = is_nested,
1522
+ has_nested = has_nested,
1523
+ nested_param_list=nested_param_list)
1524
+
1525
+ def _process_arg_sections(self, section=None, arg_list_name=None):
1526
+ """
1527
+ DESCRIPTION:
1528
+ Function to loop over the ARGUMENT_CLAUSES, INPUT_FMT and OUTPUT_FMT sections,
1529
+ call the __argument_parser and populate the corresponding lists
1530
+ with the objects of _AnlyFuncArgumentUAF .
1531
+
1532
+ RETURNS:
1533
+ None
1534
+
1535
+ RAISES:
1536
+ None
1537
+ """
1538
+ for argument in self.json_object.get(section, []):
1539
+ for arg_list in self.__argument_parser(argument, section):
1540
+ getattr(self, arg_list_name).append(arg_list)
1541
+
1542
+ def _parse_arguments(self):
1543
+ """
1544
+ DESCRIPTION:
1545
+ Function to process argument section and input_fmt and output_fmt sections, if present.
1546
+
1547
+ RETURNS:
1548
+ None
1549
+
1550
+ RAISES:
1551
+ None
1552
+ """
1553
+ # Parse all arguments.
1554
+ self._process_arg_sections(section=self.json_fields.ARGUMENT_CLAUSES, arg_list_name="arguments")
1555
+
1556
+ # Parse input_fmt section.
1557
+ if self.has_input_fmt():
1558
+ self._process_arg_sections(section=self.json_fields.INPUT_FMT, arg_list_name="input_fmt_arguments")
1559
+
1560
+ # Parse output_fmt section.
1561
+ if self.has_output_fmt():
1562
+ self._process_arg_sections(section=self.json_fields.OUTPUT_FMT, arg_list_name="output_fmt_arguments")
1563
+
1564
+ def __update_function_params_uaf_argument(self, argument):
1565
+ """
1566
+ DESCRIPTION:
1567
+ Function to update the function_params list with argument's lang_name and default value.
1568
+ If arguments have nested parameters, the lang_name and default value of the nested_parameters
1569
+ are appended to the function_params list and not the parent element.
1570
+
1571
+ RETURNS:
1572
+ None
1573
+
1574
+ RAISES:
1575
+ None
1576
+ """
1577
+ if argument.get_has_nested():
1578
+ for nested_arg in argument.get_nested_param_list():
1579
+ self.__update_function_params_uaf_argument(nested_arg)
1580
+ else:
1581
+ r_default_value = argument.get_r_default_value()
1582
+ default_value = r_default_value if r_default_value is not None else \
1583
+ argument.get_default_value()
1584
+ self.function_params[argument.get_lang_name()] = default_value
1585
+
1586
+ def _generate_function_parameters(self):
1587
+ """
1588
+ DESCRIPTION:
1589
+ Function to generate the UAF function argument names and their corresponding default values.
1590
+ Function arguments are generated by adhering to following:
1591
+ * Signature includes only input as well as other arguments (SQL: Using clause
1592
+ arguments). So, process only those.
1593
+ * Output arguments are ignored in the function signature. So, do not process Output arguments.
1594
+ * Also, arguments pertaining to input_format and output_format are added.
1595
+
1596
+ RETURNS:
1597
+ None
1598
+
1599
+ RAISES:
1600
+ None
1601
+ """
1602
+ # Process input arguments
1603
+ for input_args in self.input_tables:
1604
+ lang_name = input_args.get_lang_name()
1605
+ filter_exp = "{}_filter_expr".format(lang_name)
1606
+ self.function_params.update({lang_name: input_args.get_default_value(),
1607
+ filter_exp: input_args.get_default_value()})
1608
+
1609
+ # Process arguments section.
1610
+ parameters = []
1611
+ for argument in self.arguments:
1612
+ self.__update_function_params_uaf_argument(argument)
1613
+
1614
+ # If has_input_fmt is True, add arguments related to input_fmt.
1615
+ if self.has_input_fmt():
1616
+ for argument in self.input_fmt_arguments:
1617
+ self.__update_function_params_uaf_argument(argument)
1618
+
1619
+ # If has_output_fmt() is True, then parameters related to output_fmt are added.
1620
+ if self.has_output_fmt():
1621
+ for argument in self.output_fmt_arguments:
1622
+ self.__update_function_params_uaf_argument(argument)
1623
+
1624
+ def _get_function_name(self):
1625
+ """
1626
+ DESCRIPTION:
1627
+ Function to get the pythonic name of the function from the R_NAME
1628
+ which is to be exposed to user.
1629
+
1630
+ RETURNS:
1631
+ str
1632
+
1633
+ RAISES:
1634
+ None
1635
+ """
1636
+ func_name = self.json_object[self.json_fields.R_NAME]
1637
+ func_name = sub(r"(_|-)+", "", func_name[3:])
1638
1638
  return func_name