teradataml 17.20.0.7__py3-none-any.whl → 20.0.0.1__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 (1303) hide show
  1. teradataml/LICENSE-3RD-PARTY.pdf +0 -0
  2. teradataml/LICENSE.pdf +0 -0
  3. teradataml/README.md +1935 -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 +2040 -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 +798 -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 +1683 -0
  29. teradataml/automl/custom_json_utils.py +1270 -0
  30. teradataml/automl/data_preparation.py +1011 -0
  31. teradataml/automl/data_transformation.py +789 -0
  32. teradataml/automl/feature_engineering.py +1580 -0
  33. teradataml/automl/feature_exploration.py +554 -0
  34. teradataml/automl/model_evaluation.py +151 -0
  35. teradataml/automl/model_training.py +1026 -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/auth_client.py +133 -0
  41. teradataml/clients/pkce_client.py +481 -481
  42. teradataml/common/aed_utils.py +7 -2
  43. teradataml/common/bulk_exposed_utils.py +111 -111
  44. teradataml/common/constants.py +1438 -1441
  45. teradataml/common/deprecations.py +160 -0
  46. teradataml/common/exceptions.py +73 -73
  47. teradataml/common/formula.py +742 -742
  48. teradataml/common/garbagecollector.py +597 -635
  49. teradataml/common/messagecodes.py +424 -431
  50. teradataml/common/messages.py +228 -231
  51. teradataml/common/sqlbundle.py +693 -693
  52. teradataml/common/td_coltype_code_to_tdtype.py +48 -48
  53. teradataml/common/utils.py +2424 -2500
  54. teradataml/common/warnings.py +25 -25
  55. teradataml/common/wrapper_utils.py +1 -110
  56. teradataml/config/dummy_file1.cfg +4 -4
  57. teradataml/config/dummy_file2.cfg +2 -2
  58. teradataml/config/sqlengine_alias_definitions_v1.0 +13 -13
  59. teradataml/config/sqlengine_alias_definitions_v1.1 +19 -19
  60. teradataml/config/sqlengine_alias_definitions_v1.3 +18 -18
  61. teradataml/context/aed_context.py +217 -217
  62. teradataml/context/context.py +1091 -999
  63. teradataml/data/A_loan.csv +19 -19
  64. teradataml/data/BINARY_REALS_LEFT.csv +11 -11
  65. teradataml/data/BINARY_REALS_RIGHT.csv +11 -11
  66. teradataml/data/B_loan.csv +49 -49
  67. teradataml/data/BuoyData2.csv +17 -17
  68. teradataml/data/CONVOLVE2_COMPLEX_LEFT.csv +5 -5
  69. teradataml/data/CONVOLVE2_COMPLEX_RIGHT.csv +5 -5
  70. teradataml/data/Convolve2RealsLeft.csv +5 -5
  71. teradataml/data/Convolve2RealsRight.csv +5 -5
  72. teradataml/data/Convolve2ValidLeft.csv +11 -11
  73. teradataml/data/Convolve2ValidRight.csv +11 -11
  74. teradataml/data/DFFTConv_Real_8_8.csv +65 -65
  75. teradataml/data/Orders1_12mf.csv +24 -24
  76. teradataml/data/Pi_loan.csv +7 -7
  77. teradataml/data/SMOOTHED_DATA.csv +7 -7
  78. teradataml/data/TestDFFT8.csv +9 -9
  79. teradataml/data/TestRiver.csv +109 -109
  80. teradataml/data/Traindata.csv +28 -28
  81. teradataml/data/acf.csv +17 -17
  82. teradataml/data/adaboost_example.json +34 -34
  83. teradataml/data/adaboostpredict_example.json +24 -24
  84. teradataml/data/additional_table.csv +10 -10
  85. teradataml/data/admissions_test.csv +21 -21
  86. teradataml/data/admissions_train.csv +41 -41
  87. teradataml/data/admissions_train_nulls.csv +41 -41
  88. teradataml/data/advertising.csv +201 -0
  89. teradataml/data/ageandheight.csv +13 -13
  90. teradataml/data/ageandpressure.csv +31 -31
  91. teradataml/data/antiselect_example.json +36 -36
  92. teradataml/data/antiselect_input.csv +8 -8
  93. teradataml/data/antiselect_input_mixed_case.csv +8 -8
  94. teradataml/data/applicant_external.csv +6 -6
  95. teradataml/data/applicant_reference.csv +6 -6
  96. teradataml/data/arima_example.json +9 -9
  97. teradataml/data/assortedtext_input.csv +8 -8
  98. teradataml/data/attribution_example.json +33 -33
  99. teradataml/data/attribution_sample_table.csv +27 -27
  100. teradataml/data/attribution_sample_table1.csv +6 -6
  101. teradataml/data/attribution_sample_table2.csv +11 -11
  102. teradataml/data/bank_churn.csv +10001 -0
  103. teradataml/data/bank_marketing.csv +11163 -0
  104. teradataml/data/bank_web_clicks1.csv +42 -42
  105. teradataml/data/bank_web_clicks2.csv +91 -91
  106. teradataml/data/bank_web_url.csv +85 -85
  107. teradataml/data/barrier.csv +2 -2
  108. teradataml/data/barrier_new.csv +3 -3
  109. teradataml/data/betweenness_example.json +13 -13
  110. teradataml/data/bike_sharing.csv +732 -0
  111. teradataml/data/bin_breaks.csv +8 -8
  112. teradataml/data/bin_fit_ip.csv +3 -3
  113. teradataml/data/binary_complex_left.csv +11 -11
  114. teradataml/data/binary_complex_right.csv +11 -11
  115. teradataml/data/binary_matrix_complex_left.csv +21 -21
  116. teradataml/data/binary_matrix_complex_right.csv +21 -21
  117. teradataml/data/binary_matrix_real_left.csv +21 -21
  118. teradataml/data/binary_matrix_real_right.csv +21 -21
  119. teradataml/data/blood2ageandweight.csv +26 -26
  120. teradataml/data/bmi.csv +501 -0
  121. teradataml/data/boston.csv +507 -507
  122. teradataml/data/boston2cols.csv +721 -0
  123. teradataml/data/breast_cancer.csv +570 -0
  124. teradataml/data/buoydata_mix.csv +11 -11
  125. teradataml/data/burst_data.csv +5 -5
  126. teradataml/data/burst_example.json +20 -20
  127. teradataml/data/byom_example.json +17 -17
  128. teradataml/data/bytes_table.csv +3 -3
  129. teradataml/data/cal_housing_ex_raw.csv +70 -70
  130. teradataml/data/callers.csv +7 -7
  131. teradataml/data/calls.csv +10 -10
  132. teradataml/data/cars_hist.csv +33 -33
  133. teradataml/data/cat_table.csv +24 -24
  134. teradataml/data/ccm_example.json +31 -31
  135. teradataml/data/ccm_input.csv +91 -91
  136. teradataml/data/ccm_input2.csv +13 -13
  137. teradataml/data/ccmexample.csv +101 -101
  138. teradataml/data/ccmprepare_example.json +8 -8
  139. teradataml/data/ccmprepare_input.csv +91 -91
  140. teradataml/data/cfilter_example.json +12 -12
  141. teradataml/data/changepointdetection_example.json +18 -18
  142. teradataml/data/changepointdetectionrt_example.json +8 -8
  143. teradataml/data/chi_sq.csv +2 -2
  144. teradataml/data/churn_data.csv +14 -14
  145. teradataml/data/churn_emission.csv +35 -35
  146. teradataml/data/churn_initial.csv +3 -3
  147. teradataml/data/churn_state_transition.csv +5 -5
  148. teradataml/data/citedges_2.csv +745 -745
  149. teradataml/data/citvertices_2.csv +1210 -1210
  150. teradataml/data/clicks2.csv +16 -16
  151. teradataml/data/clickstream.csv +12 -12
  152. teradataml/data/clickstream1.csv +11 -11
  153. teradataml/data/closeness_example.json +15 -15
  154. teradataml/data/complaints.csv +21 -21
  155. teradataml/data/complaints_mini.csv +3 -3
  156. teradataml/data/complaints_testtoken.csv +224 -224
  157. teradataml/data/complaints_tokens_test.csv +353 -353
  158. teradataml/data/complaints_traintoken.csv +472 -472
  159. teradataml/data/computers_category.csv +1001 -1001
  160. teradataml/data/computers_test1.csv +1252 -1252
  161. teradataml/data/computers_train1.csv +5009 -5009
  162. teradataml/data/computers_train1_clustered.csv +5009 -5009
  163. teradataml/data/confusionmatrix_example.json +9 -9
  164. teradataml/data/conversion_event_table.csv +3 -3
  165. teradataml/data/corr_input.csv +17 -17
  166. teradataml/data/correlation_example.json +11 -11
  167. teradataml/data/coxhazardratio_example.json +39 -39
  168. teradataml/data/coxph_example.json +15 -15
  169. teradataml/data/coxsurvival_example.json +28 -28
  170. teradataml/data/cpt.csv +41 -41
  171. teradataml/data/credit_ex_merged.csv +45 -45
  172. teradataml/data/customer_loyalty.csv +301 -301
  173. teradataml/data/customer_loyalty_newseq.csv +31 -31
  174. teradataml/data/customer_segmentation_test.csv +2628 -0
  175. teradataml/data/customer_segmentation_train.csv +8069 -0
  176. teradataml/data/dataframe_example.json +146 -146
  177. teradataml/data/decisionforest_example.json +37 -37
  178. teradataml/data/decisionforestpredict_example.json +38 -38
  179. teradataml/data/decisiontree_example.json +21 -21
  180. teradataml/data/decisiontreepredict_example.json +45 -45
  181. teradataml/data/dfft2_size4_real.csv +17 -17
  182. teradataml/data/dfft2_test_matrix16.csv +17 -17
  183. teradataml/data/dfft2conv_real_4_4.csv +65 -65
  184. teradataml/data/diabetes.csv +443 -443
  185. teradataml/data/diabetes_test.csv +89 -89
  186. teradataml/data/dict_table.csv +5 -5
  187. teradataml/data/docperterm_table.csv +4 -4
  188. teradataml/data/docs/__init__.py +1 -1
  189. teradataml/data/docs/byom/docs/DataRobotPredict.py +180 -180
  190. teradataml/data/docs/byom/docs/DataikuPredict.py +177 -177
  191. teradataml/data/docs/byom/docs/H2OPredict.py +324 -324
  192. teradataml/data/docs/byom/docs/ONNXPredict.py +283 -283
  193. teradataml/data/docs/byom/docs/PMMLPredict.py +277 -277
  194. teradataml/data/docs/sqle/docs_17_10/Antiselect.py +82 -82
  195. teradataml/data/docs/sqle/docs_17_10/Attribution.py +199 -199
  196. teradataml/data/docs/sqle/docs_17_10/BincodeFit.py +171 -171
  197. teradataml/data/docs/sqle/docs_17_10/BincodeTransform.py +131 -130
  198. teradataml/data/docs/sqle/docs_17_10/CategoricalSummary.py +86 -86
  199. teradataml/data/docs/sqle/docs_17_10/ChiSq.py +90 -90
  200. teradataml/data/docs/sqle/docs_17_10/ColumnSummary.py +85 -85
  201. teradataml/data/docs/sqle/docs_17_10/ConvertTo.py +95 -95
  202. teradataml/data/docs/sqle/docs_17_10/DecisionForestPredict.py +139 -139
  203. teradataml/data/docs/sqle/docs_17_10/DecisionTreePredict.py +151 -151
  204. teradataml/data/docs/sqle/docs_17_10/FTest.py +160 -160
  205. teradataml/data/docs/sqle/docs_17_10/FillRowId.py +82 -82
  206. teradataml/data/docs/sqle/docs_17_10/Fit.py +87 -87
  207. teradataml/data/docs/sqle/docs_17_10/GLMPredict.py +144 -144
  208. teradataml/data/docs/sqle/docs_17_10/GetRowsWithMissingValues.py +84 -84
  209. teradataml/data/docs/sqle/docs_17_10/GetRowsWithoutMissingValues.py +81 -81
  210. teradataml/data/docs/sqle/docs_17_10/Histogram.py +164 -164
  211. teradataml/data/docs/sqle/docs_17_10/MovingAverage.py +134 -134
  212. teradataml/data/docs/sqle/docs_17_10/NGramSplitter.py +208 -208
  213. teradataml/data/docs/sqle/docs_17_10/NPath.py +265 -265
  214. teradataml/data/docs/sqle/docs_17_10/NaiveBayesPredict.py +116 -116
  215. teradataml/data/docs/sqle/docs_17_10/NaiveBayesTextClassifierPredict.py +176 -176
  216. teradataml/data/docs/sqle/docs_17_10/NumApply.py +147 -147
  217. teradataml/data/docs/sqle/docs_17_10/OneHotEncodingFit.py +134 -132
  218. teradataml/data/docs/sqle/docs_17_10/OneHotEncodingTransform.py +109 -103
  219. teradataml/data/docs/sqle/docs_17_10/OutlierFilterFit.py +165 -165
  220. teradataml/data/docs/sqle/docs_17_10/OutlierFilterTransform.py +105 -101
  221. teradataml/data/docs/sqle/docs_17_10/Pack.py +128 -128
  222. teradataml/data/docs/sqle/docs_17_10/PolynomialFeaturesFit.py +111 -111
  223. teradataml/data/docs/sqle/docs_17_10/PolynomialFeaturesTransform.py +102 -102
  224. teradataml/data/docs/sqle/docs_17_10/QQNorm.py +104 -104
  225. teradataml/data/docs/sqle/docs_17_10/RoundColumns.py +109 -109
  226. teradataml/data/docs/sqle/docs_17_10/RowNormalizeFit.py +117 -117
  227. teradataml/data/docs/sqle/docs_17_10/RowNormalizeTransform.py +99 -98
  228. teradataml/data/docs/sqle/docs_17_10/SVMSparsePredict.py +152 -152
  229. teradataml/data/docs/sqle/docs_17_10/ScaleFit.py +197 -197
  230. teradataml/data/docs/sqle/docs_17_10/ScaleTransform.py +99 -98
  231. teradataml/data/docs/sqle/docs_17_10/Sessionize.py +113 -113
  232. teradataml/data/docs/sqle/docs_17_10/SimpleImputeFit.py +116 -116
  233. teradataml/data/docs/sqle/docs_17_10/SimpleImputeTransform.py +98 -98
  234. teradataml/data/docs/sqle/docs_17_10/StrApply.py +187 -187
  235. teradataml/data/docs/sqle/docs_17_10/StringSimilarity.py +145 -145
  236. teradataml/data/docs/sqle/docs_17_10/Transform.py +105 -104
  237. teradataml/data/docs/sqle/docs_17_10/UnivariateStatistics.py +141 -141
  238. teradataml/data/docs/sqle/docs_17_10/Unpack.py +214 -214
  239. teradataml/data/docs/sqle/docs_17_10/WhichMax.py +83 -83
  240. teradataml/data/docs/sqle/docs_17_10/WhichMin.py +83 -83
  241. teradataml/data/docs/sqle/docs_17_10/ZTest.py +155 -155
  242. teradataml/data/docs/sqle/docs_17_20/ANOVA.py +186 -126
  243. teradataml/data/docs/sqle/docs_17_20/Antiselect.py +82 -82
  244. teradataml/data/docs/sqle/docs_17_20/Attribution.py +200 -200
  245. teradataml/data/docs/sqle/docs_17_20/BincodeFit.py +171 -171
  246. teradataml/data/docs/sqle/docs_17_20/BincodeTransform.py +139 -138
  247. teradataml/data/docs/sqle/docs_17_20/CategoricalSummary.py +86 -86
  248. teradataml/data/docs/sqle/docs_17_20/ChiSq.py +90 -90
  249. teradataml/data/docs/sqle/docs_17_20/ClassificationEvaluator.py +166 -166
  250. teradataml/data/docs/sqle/docs_17_20/ColumnSummary.py +85 -85
  251. teradataml/data/docs/sqle/docs_17_20/ColumnTransformer.py +245 -243
  252. teradataml/data/docs/sqle/docs_17_20/ConvertTo.py +113 -113
  253. teradataml/data/docs/sqle/docs_17_20/DecisionForest.py +279 -279
  254. teradataml/data/docs/sqle/docs_17_20/DecisionForestPredict.py +144 -144
  255. teradataml/data/docs/sqle/docs_17_20/DecisionTreePredict.py +135 -135
  256. teradataml/data/docs/sqle/docs_17_20/FTest.py +239 -160
  257. teradataml/data/docs/sqle/docs_17_20/FillRowId.py +82 -82
  258. teradataml/data/docs/sqle/docs_17_20/Fit.py +87 -87
  259. teradataml/data/docs/sqle/docs_17_20/GLM.py +541 -380
  260. teradataml/data/docs/sqle/docs_17_20/GLMPerSegment.py +414 -414
  261. teradataml/data/docs/sqle/docs_17_20/GLMPredict.py +144 -144
  262. teradataml/data/docs/sqle/docs_17_20/GLMPredictPerSegment.py +233 -234
  263. teradataml/data/docs/sqle/docs_17_20/GetFutileColumns.py +125 -123
  264. teradataml/data/docs/sqle/docs_17_20/GetRowsWithMissingValues.py +108 -108
  265. teradataml/data/docs/sqle/docs_17_20/GetRowsWithoutMissingValues.py +105 -105
  266. teradataml/data/docs/sqle/docs_17_20/Histogram.py +223 -223
  267. teradataml/data/docs/sqle/docs_17_20/KMeans.py +251 -204
  268. teradataml/data/docs/sqle/docs_17_20/KMeansPredict.py +144 -143
  269. teradataml/data/docs/sqle/docs_17_20/KNN.py +214 -214
  270. teradataml/data/docs/sqle/docs_17_20/MovingAverage.py +134 -134
  271. teradataml/data/docs/sqle/docs_17_20/NGramSplitter.py +208 -208
  272. teradataml/data/docs/sqle/docs_17_20/NPath.py +265 -265
  273. teradataml/data/docs/sqle/docs_17_20/NaiveBayesPredict.py +116 -116
  274. teradataml/data/docs/sqle/docs_17_20/NaiveBayesTextClassifierPredict.py +177 -176
  275. teradataml/data/docs/sqle/docs_17_20/NaiveBayesTextClassifierTrainer.py +126 -126
  276. teradataml/data/docs/sqle/docs_17_20/NonLinearCombineFit.py +118 -117
  277. teradataml/data/docs/sqle/docs_17_20/NonLinearCombineTransform.py +112 -112
  278. teradataml/data/docs/sqle/docs_17_20/NumApply.py +147 -147
  279. teradataml/data/docs/sqle/docs_17_20/OneClassSVM.py +307 -307
  280. teradataml/data/docs/sqle/docs_17_20/OneClassSVMPredict.py +185 -184
  281. teradataml/data/docs/sqle/docs_17_20/OneHotEncodingFit.py +230 -225
  282. teradataml/data/docs/sqle/docs_17_20/OneHotEncodingTransform.py +121 -115
  283. teradataml/data/docs/sqle/docs_17_20/OrdinalEncodingFit.py +219 -219
  284. teradataml/data/docs/sqle/docs_17_20/OrdinalEncodingTransform.py +127 -127
  285. teradataml/data/docs/sqle/docs_17_20/OutlierFilterFit.py +189 -189
  286. teradataml/data/docs/sqle/docs_17_20/OutlierFilterTransform.py +117 -112
  287. teradataml/data/docs/sqle/docs_17_20/Pack.py +128 -128
  288. teradataml/data/docs/sqle/docs_17_20/PolynomialFeaturesFit.py +111 -111
  289. teradataml/data/docs/sqle/docs_17_20/PolynomialFeaturesTransform.py +112 -111
  290. teradataml/data/docs/sqle/docs_17_20/QQNorm.py +104 -104
  291. teradataml/data/docs/sqle/docs_17_20/ROC.py +164 -163
  292. teradataml/data/docs/sqle/docs_17_20/RandomProjectionFit.py +154 -154
  293. teradataml/data/docs/sqle/docs_17_20/RandomProjectionMinComponents.py +106 -106
  294. teradataml/data/docs/sqle/docs_17_20/RandomProjectionTransform.py +120 -120
  295. teradataml/data/docs/sqle/docs_17_20/RegressionEvaluator.py +211 -211
  296. teradataml/data/docs/sqle/docs_17_20/RoundColumns.py +108 -108
  297. teradataml/data/docs/sqle/docs_17_20/RowNormalizeFit.py +117 -117
  298. teradataml/data/docs/sqle/docs_17_20/RowNormalizeTransform.py +111 -110
  299. teradataml/data/docs/sqle/docs_17_20/SVM.py +413 -413
  300. teradataml/data/docs/sqle/docs_17_20/SVMPredict.py +213 -202
  301. teradataml/data/docs/sqle/docs_17_20/SVMSparsePredict.py +152 -152
  302. teradataml/data/docs/sqle/docs_17_20/ScaleFit.py +315 -197
  303. teradataml/data/docs/sqle/docs_17_20/ScaleTransform.py +202 -109
  304. teradataml/data/docs/sqle/docs_17_20/SentimentExtractor.py +206 -206
  305. teradataml/data/docs/sqle/docs_17_20/Sessionize.py +113 -113
  306. teradataml/data/docs/sqle/docs_17_20/Silhouette.py +152 -152
  307. teradataml/data/docs/sqle/docs_17_20/SimpleImputeFit.py +116 -116
  308. teradataml/data/docs/sqle/docs_17_20/SimpleImputeTransform.py +109 -108
  309. teradataml/data/docs/sqle/docs_17_20/StrApply.py +187 -187
  310. teradataml/data/docs/sqle/docs_17_20/StringSimilarity.py +145 -145
  311. teradataml/data/docs/sqle/docs_17_20/TDDecisionForestPredict.py +207 -207
  312. teradataml/data/docs/sqle/docs_17_20/TDGLMPredict.py +333 -171
  313. teradataml/data/docs/sqle/docs_17_20/TargetEncodingFit.py +266 -266
  314. teradataml/data/docs/sqle/docs_17_20/TargetEncodingTransform.py +141 -140
  315. teradataml/data/docs/sqle/docs_17_20/TextParser.py +172 -172
  316. teradataml/data/docs/sqle/docs_17_20/TrainTestSplit.py +159 -159
  317. teradataml/data/docs/sqle/docs_17_20/Transform.py +123 -123
  318. teradataml/data/docs/sqle/docs_17_20/UnivariateStatistics.py +141 -141
  319. teradataml/data/docs/sqle/docs_17_20/Unpack.py +214 -214
  320. teradataml/data/docs/sqle/docs_17_20/VectorDistance.py +168 -168
  321. teradataml/data/docs/sqle/docs_17_20/WhichMax.py +83 -83
  322. teradataml/data/docs/sqle/docs_17_20/WhichMin.py +83 -83
  323. teradataml/data/docs/sqle/docs_17_20/WordEmbeddings.py +236 -236
  324. teradataml/data/docs/sqle/docs_17_20/XGBoost.py +361 -353
  325. teradataml/data/docs/sqle/docs_17_20/XGBoostPredict.py +281 -275
  326. teradataml/data/docs/sqle/docs_17_20/ZTest.py +220 -155
  327. teradataml/data/docs/tableoperator/docs_17_00/ReadNOS.py +429 -429
  328. teradataml/data/docs/tableoperator/docs_17_05/ReadNOS.py +429 -429
  329. teradataml/data/docs/tableoperator/docs_17_05/WriteNOS.py +347 -347
  330. teradataml/data/docs/tableoperator/docs_17_10/ReadNOS.py +428 -428
  331. teradataml/data/docs/tableoperator/docs_17_10/WriteNOS.py +347 -347
  332. teradataml/data/docs/tableoperator/docs_17_20/ReadNOS.py +439 -439
  333. teradataml/data/docs/tableoperator/docs_17_20/WriteNOS.py +386 -386
  334. teradataml/data/docs/uaf/docs_17_20/ACF.py +195 -195
  335. teradataml/data/docs/uaf/docs_17_20/ArimaEstimate.py +369 -369
  336. teradataml/data/docs/uaf/docs_17_20/ArimaForecast.py +142 -142
  337. teradataml/data/docs/uaf/docs_17_20/ArimaValidate.py +159 -159
  338. teradataml/data/docs/uaf/docs_17_20/BinaryMatrixOp.py +247 -247
  339. teradataml/data/docs/uaf/docs_17_20/BinarySeriesOp.py +252 -252
  340. teradataml/data/docs/uaf/docs_17_20/BreuschGodfrey.py +177 -177
  341. teradataml/data/docs/uaf/docs_17_20/BreuschPaganGodfrey.py +174 -174
  342. teradataml/data/docs/uaf/docs_17_20/Convolve.py +226 -226
  343. teradataml/data/docs/uaf/docs_17_20/Convolve2.py +214 -214
  344. teradataml/data/docs/uaf/docs_17_20/CumulPeriodogram.py +183 -183
  345. teradataml/data/docs/uaf/docs_17_20/DFFT.py +203 -203
  346. teradataml/data/docs/uaf/docs_17_20/DFFT2.py +216 -216
  347. teradataml/data/docs/uaf/docs_17_20/DFFT2Conv.py +215 -215
  348. teradataml/data/docs/uaf/docs_17_20/DFFTConv.py +191 -191
  349. teradataml/data/docs/uaf/docs_17_20/DTW.py +179 -179
  350. teradataml/data/docs/uaf/docs_17_20/DickeyFuller.py +144 -144
  351. teradataml/data/docs/uaf/docs_17_20/DurbinWatson.py +183 -183
  352. teradataml/data/docs/uaf/docs_17_20/ExtractResults.py +184 -184
  353. teradataml/data/docs/uaf/docs_17_20/FitMetrics.py +172 -172
  354. teradataml/data/docs/uaf/docs_17_20/GenseriesFormula.py +205 -205
  355. teradataml/data/docs/uaf/docs_17_20/GenseriesSinusoids.py +142 -142
  356. teradataml/data/docs/uaf/docs_17_20/HoltWintersForecaster.py +258 -258
  357. teradataml/data/docs/uaf/docs_17_20/IDFFT.py +164 -164
  358. teradataml/data/docs/uaf/docs_17_20/IDFFT2.py +198 -198
  359. teradataml/data/docs/uaf/docs_17_20/InputValidator.py +120 -120
  360. teradataml/data/docs/uaf/docs_17_20/LineSpec.py +155 -155
  361. teradataml/data/docs/uaf/docs_17_20/LinearRegr.py +214 -214
  362. teradataml/data/docs/uaf/docs_17_20/MAMean.py +173 -173
  363. teradataml/data/docs/uaf/docs_17_20/MInfo.py +133 -133
  364. teradataml/data/docs/uaf/docs_17_20/MatrixMultiply.py +135 -135
  365. teradataml/data/docs/uaf/docs_17_20/MultivarRegr.py +190 -190
  366. teradataml/data/docs/uaf/docs_17_20/PACF.py +158 -158
  367. teradataml/data/docs/uaf/docs_17_20/Portman.py +216 -216
  368. teradataml/data/docs/uaf/docs_17_20/PowerTransform.py +154 -154
  369. teradataml/data/docs/uaf/docs_17_20/Resample.py +228 -228
  370. teradataml/data/docs/uaf/docs_17_20/SInfo.py +122 -122
  371. teradataml/data/docs/uaf/docs_17_20/SeasonalNormalize.py +165 -165
  372. teradataml/data/docs/uaf/docs_17_20/SelectionCriteria.py +173 -173
  373. teradataml/data/docs/uaf/docs_17_20/SignifPeriodicities.py +170 -170
  374. teradataml/data/docs/uaf/docs_17_20/SignifResidmean.py +163 -163
  375. teradataml/data/docs/uaf/docs_17_20/SimpleExp.py +179 -179
  376. teradataml/data/docs/uaf/docs_17_20/Smoothma.py +207 -207
  377. teradataml/data/docs/uaf/docs_17_20/TrackingOp.py +150 -150
  378. teradataml/data/docs/uaf/docs_17_20/UNDIFF.py +171 -171
  379. teradataml/data/docs/uaf/docs_17_20/Unnormalize.py +201 -201
  380. teradataml/data/docs/uaf/docs_17_20/WhitesGeneral.py +169 -169
  381. teradataml/data/dtw_example.json +17 -17
  382. teradataml/data/dtw_t1.csv +11 -11
  383. teradataml/data/dtw_t2.csv +4 -4
  384. teradataml/data/dwt2d_example.json +15 -15
  385. teradataml/data/dwt_example.json +14 -14
  386. teradataml/data/dwt_filter_dim.csv +5 -5
  387. teradataml/data/emission.csv +9 -9
  388. teradataml/data/emp_table_by_dept.csv +19 -19
  389. teradataml/data/employee_info.csv +4 -4
  390. teradataml/data/employee_table.csv +6 -6
  391. teradataml/data/excluding_event_table.csv +2 -2
  392. teradataml/data/finance_data.csv +6 -6
  393. teradataml/data/finance_data2.csv +61 -61
  394. teradataml/data/finance_data3.csv +93 -93
  395. teradataml/data/fish.csv +160 -0
  396. teradataml/data/fm_blood2ageandweight.csv +26 -26
  397. teradataml/data/fmeasure_example.json +11 -11
  398. teradataml/data/followers_leaders.csv +10 -10
  399. teradataml/data/fpgrowth_example.json +12 -12
  400. teradataml/data/frequentpaths_example.json +29 -29
  401. teradataml/data/friends.csv +9 -9
  402. teradataml/data/fs_input.csv +33 -33
  403. teradataml/data/fs_input1.csv +33 -33
  404. teradataml/data/genData.csv +513 -513
  405. teradataml/data/geodataframe_example.json +39 -39
  406. teradataml/data/glass_types.csv +215 -0
  407. teradataml/data/glm_admissions_model.csv +12 -12
  408. teradataml/data/glm_example.json +56 -29
  409. teradataml/data/glml1l2_example.json +28 -28
  410. teradataml/data/glml1l2predict_example.json +54 -54
  411. teradataml/data/glmpredict_example.json +54 -54
  412. teradataml/data/gq_t1.csv +21 -21
  413. teradataml/data/hconvolve_complex_right.csv +5 -5
  414. teradataml/data/hconvolve_complex_rightmulti.csv +5 -5
  415. teradataml/data/histogram_example.json +11 -11
  416. teradataml/data/hmmdecoder_example.json +78 -78
  417. teradataml/data/hmmevaluator_example.json +24 -24
  418. teradataml/data/hmmsupervised_example.json +10 -10
  419. teradataml/data/hmmunsupervised_example.json +7 -7
  420. teradataml/data/house_values.csv +12 -12
  421. teradataml/data/house_values2.csv +13 -13
  422. teradataml/data/housing_cat.csv +7 -7
  423. teradataml/data/housing_data.csv +9 -9
  424. teradataml/data/housing_test.csv +47 -47
  425. teradataml/data/housing_test_binary.csv +47 -47
  426. teradataml/data/housing_train.csv +493 -493
  427. teradataml/data/housing_train_attribute.csv +4 -4
  428. teradataml/data/housing_train_binary.csv +437 -437
  429. teradataml/data/housing_train_parameter.csv +2 -2
  430. teradataml/data/housing_train_response.csv +493 -493
  431. teradataml/data/housing_train_segment.csv +201 -0
  432. teradataml/data/ibm_stock.csv +370 -370
  433. teradataml/data/ibm_stock1.csv +370 -370
  434. teradataml/data/identitymatch_example.json +21 -21
  435. teradataml/data/idf_table.csv +4 -4
  436. teradataml/data/impressions.csv +101 -101
  437. teradataml/data/inflation.csv +21 -21
  438. teradataml/data/initial.csv +3 -3
  439. teradataml/data/insect2Cols.csv +61 -0
  440. teradataml/data/insect_sprays.csv +12 -12
  441. teradataml/data/insurance.csv +1339 -1339
  442. teradataml/data/interpolator_example.json +12 -12
  443. teradataml/data/iris_altinput.csv +481 -481
  444. teradataml/data/iris_attribute_output.csv +8 -8
  445. teradataml/data/iris_attribute_test.csv +121 -121
  446. teradataml/data/iris_attribute_train.csv +481 -481
  447. teradataml/data/iris_category_expect_predict.csv +31 -31
  448. teradataml/data/iris_data.csv +151 -0
  449. teradataml/data/iris_input.csv +151 -151
  450. teradataml/data/iris_response_train.csv +121 -121
  451. teradataml/data/iris_test.csv +31 -31
  452. teradataml/data/iris_train.csv +121 -121
  453. teradataml/data/join_table1.csv +4 -4
  454. teradataml/data/join_table2.csv +4 -4
  455. teradataml/data/jsons/anly_function_name.json +6 -6
  456. teradataml/data/jsons/byom/dataikupredict.json +147 -147
  457. teradataml/data/jsons/byom/datarobotpredict.json +146 -146
  458. teradataml/data/jsons/byom/h2opredict.json +194 -194
  459. teradataml/data/jsons/byom/onnxpredict.json +186 -186
  460. teradataml/data/jsons/byom/pmmlpredict.json +146 -146
  461. teradataml/data/jsons/paired_functions.json +435 -435
  462. teradataml/data/jsons/sqle/16.20/Antiselect.json +56 -56
  463. teradataml/data/jsons/sqle/16.20/Attribution.json +249 -249
  464. teradataml/data/jsons/sqle/16.20/DecisionForestPredict.json +156 -156
  465. teradataml/data/jsons/sqle/16.20/DecisionTreePredict.json +170 -170
  466. teradataml/data/jsons/sqle/16.20/GLMPredict.json +122 -122
  467. teradataml/data/jsons/sqle/16.20/MovingAverage.json +367 -367
  468. teradataml/data/jsons/sqle/16.20/NGramSplitter.json +239 -239
  469. teradataml/data/jsons/sqle/16.20/NaiveBayesPredict.json +136 -136
  470. teradataml/data/jsons/sqle/16.20/NaiveBayesTextClassifierPredict.json +235 -235
  471. teradataml/data/jsons/sqle/16.20/Pack.json +98 -98
  472. teradataml/data/jsons/sqle/16.20/SVMSparsePredict.json +162 -162
  473. teradataml/data/jsons/sqle/16.20/Sessionize.json +105 -105
  474. teradataml/data/jsons/sqle/16.20/StringSimilarity.json +86 -86
  475. teradataml/data/jsons/sqle/16.20/Unpack.json +166 -166
  476. teradataml/data/jsons/sqle/16.20/nPath.json +269 -269
  477. teradataml/data/jsons/sqle/17.00/Antiselect.json +56 -56
  478. teradataml/data/jsons/sqle/17.00/Attribution.json +249 -249
  479. teradataml/data/jsons/sqle/17.00/DecisionForestPredict.json +156 -156
  480. teradataml/data/jsons/sqle/17.00/DecisionTreePredict.json +170 -170
  481. teradataml/data/jsons/sqle/17.00/GLMPredict.json +122 -122
  482. teradataml/data/jsons/sqle/17.00/MovingAverage.json +367 -367
  483. teradataml/data/jsons/sqle/17.00/NGramSplitter.json +239 -239
  484. teradataml/data/jsons/sqle/17.00/NaiveBayesPredict.json +136 -136
  485. teradataml/data/jsons/sqle/17.00/NaiveBayesTextClassifierPredict.json +235 -235
  486. teradataml/data/jsons/sqle/17.00/Pack.json +98 -98
  487. teradataml/data/jsons/sqle/17.00/SVMSparsePredict.json +162 -162
  488. teradataml/data/jsons/sqle/17.00/Sessionize.json +105 -105
  489. teradataml/data/jsons/sqle/17.00/StringSimilarity.json +86 -86
  490. teradataml/data/jsons/sqle/17.00/Unpack.json +166 -166
  491. teradataml/data/jsons/sqle/17.00/nPath.json +269 -269
  492. teradataml/data/jsons/sqle/17.05/Antiselect.json +56 -56
  493. teradataml/data/jsons/sqle/17.05/Attribution.json +249 -249
  494. teradataml/data/jsons/sqle/17.05/DecisionForestPredict.json +156 -156
  495. teradataml/data/jsons/sqle/17.05/DecisionTreePredict.json +170 -170
  496. teradataml/data/jsons/sqle/17.05/GLMPredict.json +122 -122
  497. teradataml/data/jsons/sqle/17.05/MovingAverage.json +367 -367
  498. teradataml/data/jsons/sqle/17.05/NGramSplitter.json +239 -239
  499. teradataml/data/jsons/sqle/17.05/NaiveBayesPredict.json +136 -136
  500. teradataml/data/jsons/sqle/17.05/NaiveBayesTextClassifierPredict.json +235 -235
  501. teradataml/data/jsons/sqle/17.05/Pack.json +98 -98
  502. teradataml/data/jsons/sqle/17.05/SVMSparsePredict.json +162 -162
  503. teradataml/data/jsons/sqle/17.05/Sessionize.json +105 -105
  504. teradataml/data/jsons/sqle/17.05/StringSimilarity.json +86 -86
  505. teradataml/data/jsons/sqle/17.05/Unpack.json +166 -166
  506. teradataml/data/jsons/sqle/17.05/nPath.json +269 -269
  507. teradataml/data/jsons/sqle/17.10/Antiselect.json +56 -56
  508. teradataml/data/jsons/sqle/17.10/Attribution.json +249 -249
  509. teradataml/data/jsons/sqle/17.10/DecisionForestPredict.json +185 -185
  510. teradataml/data/jsons/sqle/17.10/DecisionTreePredict.json +171 -171
  511. teradataml/data/jsons/sqle/17.10/GLMPredict.json +151 -151
  512. teradataml/data/jsons/sqle/17.10/MovingAverage.json +368 -368
  513. teradataml/data/jsons/sqle/17.10/NGramSplitter.json +239 -239
  514. teradataml/data/jsons/sqle/17.10/NaiveBayesPredict.json +149 -149
  515. teradataml/data/jsons/sqle/17.10/NaiveBayesTextClassifierPredict.json +288 -288
  516. teradataml/data/jsons/sqle/17.10/Pack.json +133 -133
  517. teradataml/data/jsons/sqle/17.10/SVMSparsePredict.json +193 -193
  518. teradataml/data/jsons/sqle/17.10/Sessionize.json +105 -105
  519. teradataml/data/jsons/sqle/17.10/StringSimilarity.json +86 -86
  520. teradataml/data/jsons/sqle/17.10/TD_BinCodeFit.json +239 -239
  521. teradataml/data/jsons/sqle/17.10/TD_BinCodeTransform.json +70 -70
  522. teradataml/data/jsons/sqle/17.10/TD_CategoricalSummary.json +53 -53
  523. teradataml/data/jsons/sqle/17.10/TD_Chisq.json +67 -67
  524. teradataml/data/jsons/sqle/17.10/TD_ColumnSummary.json +53 -53
  525. teradataml/data/jsons/sqle/17.10/TD_ConvertTo.json +68 -68
  526. teradataml/data/jsons/sqle/17.10/TD_FTest.json +187 -187
  527. teradataml/data/jsons/sqle/17.10/TD_FillRowID.json +51 -51
  528. teradataml/data/jsons/sqle/17.10/TD_FunctionFit.json +46 -46
  529. teradataml/data/jsons/sqle/17.10/TD_FunctionTransform.json +72 -71
  530. teradataml/data/jsons/sqle/17.10/TD_GetRowsWithMissingValues.json +52 -52
  531. teradataml/data/jsons/sqle/17.10/TD_GetRowsWithoutMissingValues.json +52 -52
  532. teradataml/data/jsons/sqle/17.10/TD_Histogram.json +132 -132
  533. teradataml/data/jsons/sqle/17.10/TD_NumApply.json +147 -147
  534. teradataml/data/jsons/sqle/17.10/TD_OneHotEncodingFit.json +182 -182
  535. teradataml/data/jsons/sqle/17.10/TD_OneHotEncodingTransform.json +65 -64
  536. teradataml/data/jsons/sqle/17.10/TD_OutlierFilterFit.json +196 -196
  537. teradataml/data/jsons/sqle/17.10/TD_OutlierFilterTransform.json +48 -47
  538. teradataml/data/jsons/sqle/17.10/TD_PolynomialFeaturesFit.json +114 -114
  539. teradataml/data/jsons/sqle/17.10/TD_PolynomialFeaturesTransform.json +72 -71
  540. teradataml/data/jsons/sqle/17.10/TD_QQNorm.json +111 -111
  541. teradataml/data/jsons/sqle/17.10/TD_RoundColumns.json +93 -93
  542. teradataml/data/jsons/sqle/17.10/TD_RowNormalizeFit.json +127 -127
  543. teradataml/data/jsons/sqle/17.10/TD_RowNormalizeTransform.json +70 -69
  544. teradataml/data/jsons/sqle/17.10/TD_ScaleFit.json +156 -156
  545. teradataml/data/jsons/sqle/17.10/TD_ScaleTransform.json +70 -69
  546. teradataml/data/jsons/sqle/17.10/TD_SimpleImputeFit.json +147 -147
  547. teradataml/data/jsons/sqle/17.10/TD_SimpleImputeTransform.json +48 -47
  548. teradataml/data/jsons/sqle/17.10/TD_StrApply.json +240 -240
  549. teradataml/data/jsons/sqle/17.10/TD_UnivariateStatistics.json +118 -118
  550. teradataml/data/jsons/sqle/17.10/TD_WhichMax.json +52 -52
  551. teradataml/data/jsons/sqle/17.10/TD_WhichMin.json +52 -52
  552. teradataml/data/jsons/sqle/17.10/TD_ZTest.json +171 -171
  553. teradataml/data/jsons/sqle/17.10/Unpack.json +188 -188
  554. teradataml/data/jsons/sqle/17.10/nPath.json +269 -269
  555. teradataml/data/jsons/sqle/17.20/Antiselect.json +56 -56
  556. teradataml/data/jsons/sqle/17.20/Attribution.json +249 -249
  557. teradataml/data/jsons/sqle/17.20/DecisionForestPredict.json +185 -185
  558. teradataml/data/jsons/sqle/17.20/DecisionTreePredict.json +172 -172
  559. teradataml/data/jsons/sqle/17.20/GLMPredict.json +151 -151
  560. teradataml/data/jsons/sqle/17.20/MovingAverage.json +367 -367
  561. teradataml/data/jsons/sqle/17.20/NGramSplitter.json +239 -239
  562. teradataml/data/jsons/sqle/17.20/NaiveBayesPredict.json +149 -149
  563. teradataml/data/jsons/sqle/17.20/NaiveBayesTextClassifierPredict.json +287 -287
  564. teradataml/data/jsons/sqle/17.20/Pack.json +133 -133
  565. teradataml/data/jsons/sqle/17.20/SVMSparsePredict.json +192 -192
  566. teradataml/data/jsons/sqle/17.20/Sessionize.json +105 -105
  567. teradataml/data/jsons/sqle/17.20/StringSimilarity.json +86 -86
  568. teradataml/data/jsons/sqle/17.20/TD_ANOVA.json +148 -76
  569. teradataml/data/jsons/sqle/17.20/TD_BinCodeFit.json +239 -239
  570. teradataml/data/jsons/sqle/17.20/TD_BinCodeTransform.json +71 -71
  571. teradataml/data/jsons/sqle/17.20/TD_CategoricalSummary.json +53 -53
  572. teradataml/data/jsons/sqle/17.20/TD_Chisq.json +67 -67
  573. teradataml/data/jsons/sqle/17.20/TD_ClassificationEvaluator.json +145 -145
  574. teradataml/data/jsons/sqle/17.20/TD_ColumnSummary.json +53 -53
  575. teradataml/data/jsons/sqle/17.20/TD_ColumnTransformer.json +218 -218
  576. teradataml/data/jsons/sqle/17.20/TD_ConvertTo.json +92 -92
  577. teradataml/data/jsons/sqle/17.20/TD_DecisionForest.json +259 -259
  578. teradataml/data/jsons/sqle/17.20/TD_DecisionForestPredict.json +139 -139
  579. teradataml/data/jsons/sqle/17.20/TD_FTest.json +269 -186
  580. teradataml/data/jsons/sqle/17.20/TD_FillRowID.json +52 -52
  581. teradataml/data/jsons/sqle/17.20/TD_FunctionFit.json +46 -46
  582. teradataml/data/jsons/sqle/17.20/TD_FunctionTransform.json +72 -72
  583. teradataml/data/jsons/sqle/17.20/TD_GLM.json +507 -431
  584. teradataml/data/jsons/sqle/17.20/TD_GLMPREDICT.json +168 -125
  585. teradataml/data/jsons/sqle/17.20/TD_GLMPerSegment.json +411 -411
  586. teradataml/data/jsons/sqle/17.20/TD_GLMPredictPerSegment.json +146 -146
  587. teradataml/data/jsons/sqle/17.20/TD_GetFutileColumns.json +93 -91
  588. teradataml/data/jsons/sqle/17.20/TD_GetRowsWithMissingValues.json +76 -76
  589. teradataml/data/jsons/sqle/17.20/TD_GetRowsWithoutMissingValues.json +76 -76
  590. teradataml/data/jsons/sqle/17.20/TD_Histogram.json +152 -152
  591. teradataml/data/jsons/sqle/17.20/TD_KMeans.json +231 -211
  592. teradataml/data/jsons/sqle/17.20/TD_KMeansPredict.json +86 -86
  593. teradataml/data/jsons/sqle/17.20/TD_KNN.json +262 -262
  594. teradataml/data/jsons/sqle/17.20/TD_NaiveBayesTextClassifierTrainer.json +137 -137
  595. teradataml/data/jsons/sqle/17.20/TD_NonLinearCombineFit.json +102 -101
  596. teradataml/data/jsons/sqle/17.20/TD_NonLinearCombineTransform.json +71 -71
  597. teradataml/data/jsons/sqle/17.20/TD_NumApply.json +147 -147
  598. teradataml/data/jsons/sqle/17.20/TD_OneClassSVM.json +315 -315
  599. teradataml/data/jsons/sqle/17.20/TD_OneClassSVMPredict.json +123 -123
  600. teradataml/data/jsons/sqle/17.20/TD_OneHotEncodingFit.json +271 -271
  601. teradataml/data/jsons/sqle/17.20/TD_OneHotEncodingTransform.json +65 -65
  602. teradataml/data/jsons/sqle/17.20/TD_OrdinalEncodingFit.json +229 -229
  603. teradataml/data/jsons/sqle/17.20/TD_OrdinalEncodingTransform.json +75 -75
  604. teradataml/data/jsons/sqle/17.20/TD_OutlierFilterFit.json +217 -217
  605. teradataml/data/jsons/sqle/17.20/TD_OutlierFilterTransform.json +48 -48
  606. teradataml/data/jsons/sqle/17.20/TD_PolynomialFeaturesFit.json +114 -114
  607. teradataml/data/jsons/sqle/17.20/TD_PolynomialFeaturesTransform.json +72 -72
  608. teradataml/data/jsons/sqle/17.20/TD_QQNorm.json +111 -111
  609. teradataml/data/jsons/sqle/17.20/TD_ROC.json +178 -177
  610. teradataml/data/jsons/sqle/17.20/TD_RandomProjectionFit.json +178 -178
  611. teradataml/data/jsons/sqle/17.20/TD_RandomProjectionMinComponents.json +73 -73
  612. teradataml/data/jsons/sqle/17.20/TD_RandomProjectionTransform.json +74 -74
  613. teradataml/data/jsons/sqle/17.20/TD_RegressionEvaluator.json +137 -137
  614. teradataml/data/jsons/sqle/17.20/TD_RoundColumns.json +93 -93
  615. teradataml/data/jsons/sqle/17.20/TD_RowNormalizeFit.json +127 -127
  616. teradataml/data/jsons/sqle/17.20/TD_RowNormalizeTransform.json +70 -70
  617. teradataml/data/jsons/sqle/17.20/TD_SVM.json +389 -389
  618. teradataml/data/jsons/sqle/17.20/TD_SVMPredict.json +142 -124
  619. teradataml/data/jsons/sqle/17.20/TD_ScaleFit.json +309 -156
  620. teradataml/data/jsons/sqle/17.20/TD_ScaleTransform.json +119 -70
  621. teradataml/data/jsons/sqle/17.20/TD_SentimentExtractor.json +193 -193
  622. teradataml/data/jsons/sqle/17.20/TD_Silhouette.json +142 -142
  623. teradataml/data/jsons/sqle/17.20/TD_SimpleImputeFit.json +147 -147
  624. teradataml/data/jsons/sqle/17.20/TD_SimpleImputeTransform.json +48 -48
  625. teradataml/data/jsons/sqle/17.20/TD_StrApply.json +240 -240
  626. teradataml/data/jsons/sqle/17.20/TD_TargetEncodingFit.json +248 -248
  627. teradataml/data/jsons/sqle/17.20/TD_TargetEncodingTransform.json +75 -75
  628. teradataml/data/jsons/sqle/17.20/TD_TextParser.json +192 -192
  629. teradataml/data/jsons/sqle/17.20/TD_TrainTestSplit.json +142 -142
  630. teradataml/data/jsons/sqle/17.20/TD_UnivariateStatistics.json +117 -117
  631. teradataml/data/jsons/sqle/17.20/TD_VectorDistance.json +182 -182
  632. teradataml/data/jsons/sqle/17.20/TD_WhichMax.json +52 -52
  633. teradataml/data/jsons/sqle/17.20/TD_WhichMin.json +52 -52
  634. teradataml/data/jsons/sqle/17.20/TD_WordEmbeddings.json +241 -241
  635. teradataml/data/jsons/sqle/17.20/TD_XGBoost.json +330 -312
  636. teradataml/data/jsons/sqle/17.20/TD_XGBoostPredict.json +195 -182
  637. teradataml/data/jsons/sqle/17.20/TD_ZTest.json +247 -170
  638. teradataml/data/jsons/sqle/17.20/Unpack.json +188 -188
  639. teradataml/data/jsons/sqle/17.20/nPath.json +269 -269
  640. teradataml/data/jsons/tableoperator/17.00/read_nos.json +197 -197
  641. teradataml/data/jsons/tableoperator/17.05/read_nos.json +197 -197
  642. teradataml/data/jsons/tableoperator/17.05/write_nos.json +194 -194
  643. teradataml/data/jsons/tableoperator/17.10/read_nos.json +183 -183
  644. teradataml/data/jsons/tableoperator/17.10/write_nos.json +194 -194
  645. teradataml/data/jsons/tableoperator/17.20/read_nos.json +182 -182
  646. teradataml/data/jsons/tableoperator/17.20/write_nos.json +223 -223
  647. teradataml/data/jsons/uaf/17.20/TD_ACF.json +149 -149
  648. teradataml/data/jsons/uaf/17.20/TD_ARIMAESTIMATE.json +409 -409
  649. teradataml/data/jsons/uaf/17.20/TD_ARIMAFORECAST.json +79 -79
  650. teradataml/data/jsons/uaf/17.20/TD_ARIMAVALIDATE.json +151 -151
  651. teradataml/data/jsons/uaf/17.20/TD_BINARYMATRIXOP.json +109 -109
  652. teradataml/data/jsons/uaf/17.20/TD_BINARYSERIESOP.json +107 -107
  653. teradataml/data/jsons/uaf/17.20/TD_BREUSCH_GODFREY.json +87 -87
  654. teradataml/data/jsons/uaf/17.20/TD_BREUSCH_PAGAN_GODFREY.json +106 -106
  655. teradataml/data/jsons/uaf/17.20/TD_CONVOLVE.json +80 -80
  656. teradataml/data/jsons/uaf/17.20/TD_CONVOLVE2.json +67 -67
  657. teradataml/data/jsons/uaf/17.20/TD_CUMUL_PERIODOGRAM.json +91 -91
  658. teradataml/data/jsons/uaf/17.20/TD_DFFT.json +136 -136
  659. teradataml/data/jsons/uaf/17.20/TD_DFFT2.json +148 -148
  660. teradataml/data/jsons/uaf/17.20/TD_DFFT2CONV.json +108 -108
  661. teradataml/data/jsons/uaf/17.20/TD_DFFTCONV.json +109 -109
  662. teradataml/data/jsons/uaf/17.20/TD_DICKEY_FULLER.json +86 -86
  663. teradataml/data/jsons/uaf/17.20/TD_DIFF.json +91 -91
  664. teradataml/data/jsons/uaf/17.20/TD_DTW.json +116 -116
  665. teradataml/data/jsons/uaf/17.20/TD_DURBIN_WATSON.json +100 -100
  666. teradataml/data/jsons/uaf/17.20/TD_EXTRACT_RESULTS.json +38 -38
  667. teradataml/data/jsons/uaf/17.20/TD_FITMETRICS.json +100 -100
  668. teradataml/data/jsons/uaf/17.20/TD_GENSERIES4FORMULA.json +84 -84
  669. teradataml/data/jsons/uaf/17.20/TD_GENSERIES4SINUSOIDS.json +70 -70
  670. teradataml/data/jsons/uaf/17.20/TD_GOLDFELD_QUANDT.json +152 -152
  671. teradataml/data/jsons/uaf/17.20/TD_HOLT_WINTERS_FORECAST.json +313 -313
  672. teradataml/data/jsons/uaf/17.20/TD_IDFFT.json +57 -57
  673. teradataml/data/jsons/uaf/17.20/TD_IDFFT2.json +94 -94
  674. teradataml/data/jsons/uaf/17.20/TD_INPUTVALIDATOR.json +63 -63
  675. teradataml/data/jsons/uaf/17.20/TD_LINEAR_REGR.json +181 -181
  676. teradataml/data/jsons/uaf/17.20/TD_LINESPEC.json +102 -102
  677. teradataml/data/jsons/uaf/17.20/TD_MAMEAN.json +182 -182
  678. teradataml/data/jsons/uaf/17.20/TD_MATRIXMULTIPLY.json +67 -67
  679. teradataml/data/jsons/uaf/17.20/TD_MINFO.json +66 -66
  680. teradataml/data/jsons/uaf/17.20/TD_MULTIVAR_REGR.json +178 -178
  681. teradataml/data/jsons/uaf/17.20/TD_PACF.json +114 -114
  682. teradataml/data/jsons/uaf/17.20/TD_PORTMAN.json +118 -118
  683. teradataml/data/jsons/uaf/17.20/TD_POWERSPEC.json +175 -175
  684. teradataml/data/jsons/uaf/17.20/TD_POWERTRANSFORM.json +97 -97
  685. teradataml/data/jsons/uaf/17.20/TD_RESAMPLE.json +173 -173
  686. teradataml/data/jsons/uaf/17.20/TD_SEASONALNORMALIZE.json +136 -136
  687. teradataml/data/jsons/uaf/17.20/TD_SELECTION_CRITERIA.json +89 -89
  688. teradataml/data/jsons/uaf/17.20/TD_SIGNIF_PERIODICITIES.json +79 -79
  689. teradataml/data/jsons/uaf/17.20/TD_SIGNIF_RESIDMEAN.json +67 -67
  690. teradataml/data/jsons/uaf/17.20/TD_SIMPLEEXP.json +184 -184
  691. teradataml/data/jsons/uaf/17.20/TD_SINFO.json +57 -57
  692. teradataml/data/jsons/uaf/17.20/TD_SMOOTHMA.json +162 -162
  693. teradataml/data/jsons/uaf/17.20/TD_TRACKINGOP.json +100 -100
  694. teradataml/data/jsons/uaf/17.20/TD_UNDIFF.json +111 -111
  695. teradataml/data/jsons/uaf/17.20/TD_UNNORMALIZE.json +95 -95
  696. teradataml/data/jsons/uaf/17.20/TD_WHITES_GENERAL.json +77 -77
  697. teradataml/data/kmeans_example.json +22 -17
  698. teradataml/data/kmeans_table.csv +10 -0
  699. teradataml/data/kmeans_us_arrests_data.csv +0 -0
  700. teradataml/data/knn_example.json +18 -18
  701. teradataml/data/knnrecommender_example.json +6 -6
  702. teradataml/data/knnrecommenderpredict_example.json +12 -12
  703. teradataml/data/lar_example.json +17 -17
  704. teradataml/data/larpredict_example.json +30 -30
  705. teradataml/data/lc_new_predictors.csv +5 -5
  706. teradataml/data/lc_new_reference.csv +9 -9
  707. teradataml/data/lda_example.json +8 -8
  708. teradataml/data/ldainference_example.json +14 -14
  709. teradataml/data/ldatopicsummary_example.json +8 -8
  710. teradataml/data/levendist_input.csv +13 -13
  711. teradataml/data/levenshteindistance_example.json +10 -10
  712. teradataml/data/linreg_example.json +9 -9
  713. teradataml/data/load_example_data.py +326 -323
  714. teradataml/data/loan_prediction.csv +295 -295
  715. teradataml/data/lungcancer.csv +138 -138
  716. teradataml/data/mappingdata.csv +12 -12
  717. teradataml/data/milk_timeseries.csv +157 -157
  718. teradataml/data/min_max_titanic.csv +4 -4
  719. teradataml/data/minhash_example.json +6 -6
  720. teradataml/data/ml_ratings.csv +7547 -7547
  721. teradataml/data/ml_ratings_10.csv +2445 -2445
  722. teradataml/data/model1_table.csv +5 -5
  723. teradataml/data/model2_table.csv +5 -5
  724. teradataml/data/models/iris_db_glm_model.pmml +56 -56
  725. teradataml/data/models/iris_db_xgb_model.pmml +4471 -4471
  726. teradataml/data/modularity_example.json +12 -12
  727. teradataml/data/movavg_example.json +7 -7
  728. teradataml/data/mtx1.csv +7 -7
  729. teradataml/data/mtx2.csv +13 -13
  730. teradataml/data/multi_model_classification.csv +401 -0
  731. teradataml/data/multi_model_regression.csv +401 -0
  732. teradataml/data/mvdfft8.csv +9 -9
  733. teradataml/data/naivebayes_example.json +9 -9
  734. teradataml/data/naivebayespredict_example.json +19 -19
  735. teradataml/data/naivebayestextclassifier2_example.json +6 -6
  736. teradataml/data/naivebayestextclassifier_example.json +8 -8
  737. teradataml/data/naivebayestextclassifierpredict_example.json +20 -20
  738. teradataml/data/name_Find_configure.csv +10 -10
  739. teradataml/data/namedentityfinder_example.json +14 -14
  740. teradataml/data/namedentityfinderevaluator_example.json +10 -10
  741. teradataml/data/namedentityfindertrainer_example.json +6 -6
  742. teradataml/data/nb_iris_input_test.csv +31 -31
  743. teradataml/data/nb_iris_input_train.csv +121 -121
  744. teradataml/data/nbp_iris_model.csv +13 -13
  745. teradataml/data/ner_extractor_text.csv +2 -2
  746. teradataml/data/ner_sports_test2.csv +29 -29
  747. teradataml/data/ner_sports_train.csv +501 -501
  748. teradataml/data/nerevaluator_example.json +5 -5
  749. teradataml/data/nerextractor_example.json +18 -18
  750. teradataml/data/nermem_sports_test.csv +17 -17
  751. teradataml/data/nermem_sports_train.csv +50 -50
  752. teradataml/data/nertrainer_example.json +6 -6
  753. teradataml/data/ngrams_example.json +6 -6
  754. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Aggregate Functions using SQLAlchemy.ipynb +1455 -1455
  755. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Arithmetic Functions Using SQLAlchemy.ipynb +1993 -1993
  756. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Bit-Byte Manipulation Functions using SQLAlchemy.ipynb +1492 -1492
  757. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Built-in functions using SQLAlchemy.ipynb +536 -536
  758. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Regular Expressions Using SQLAlchemy.ipynb +570 -570
  759. teradataml/data/notebooks/sqlalchemy/Teradata Vantage String Functions Using SQLAlchemy.ipynb +2559 -2559
  760. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Window Aggregate Functions using SQLAlchemy.ipynb +2911 -2911
  761. teradataml/data/notebooks/sqlalchemy/Using Generic SQLAlchemy ClauseElements teradataml DataFrame assign method.ipynb +698 -698
  762. teradataml/data/notebooks/sqlalchemy/teradataml filtering using SQLAlchemy ClauseElements.ipynb +784 -784
  763. teradataml/data/npath_example.json +23 -23
  764. teradataml/data/ntree_example.json +14 -14
  765. teradataml/data/numeric_strings.csv +4 -4
  766. teradataml/data/numerics.csv +4 -4
  767. teradataml/data/ocean_buoy.csv +17 -17
  768. teradataml/data/ocean_buoy2.csv +17 -17
  769. teradataml/data/ocean_buoys.csv +27 -27
  770. teradataml/data/ocean_buoys2.csv +10 -10
  771. teradataml/data/ocean_buoys_nonpti.csv +28 -28
  772. teradataml/data/ocean_buoys_seq.csv +29 -29
  773. teradataml/data/onehot_encoder_train.csv +4 -0
  774. teradataml/data/openml_example.json +92 -0
  775. teradataml/data/optional_event_table.csv +4 -4
  776. teradataml/data/orders1.csv +11 -11
  777. teradataml/data/orders1_12.csv +12 -12
  778. teradataml/data/orders_ex.csv +4 -4
  779. teradataml/data/pack_example.json +8 -8
  780. teradataml/data/package_tracking.csv +19 -19
  781. teradataml/data/package_tracking_pti.csv +18 -18
  782. teradataml/data/pagerank_example.json +13 -13
  783. teradataml/data/paragraphs_input.csv +6 -6
  784. teradataml/data/pathanalyzer_example.json +7 -7
  785. teradataml/data/pathgenerator_example.json +7 -7
  786. teradataml/data/phrases.csv +7 -7
  787. teradataml/data/pivot_example.json +8 -8
  788. teradataml/data/pivot_input.csv +22 -22
  789. teradataml/data/playerRating.csv +31 -31
  790. teradataml/data/postagger_example.json +6 -6
  791. teradataml/data/posttagger_output.csv +44 -44
  792. teradataml/data/production_data.csv +16 -16
  793. teradataml/data/production_data2.csv +7 -7
  794. teradataml/data/randomsample_example.json +31 -31
  795. teradataml/data/randomwalksample_example.json +8 -8
  796. teradataml/data/rank_table.csv +6 -6
  797. teradataml/data/ref_mobile_data.csv +4 -4
  798. teradataml/data/ref_mobile_data_dense.csv +2 -2
  799. teradataml/data/ref_url.csv +17 -17
  800. teradataml/data/restaurant_reviews.csv +7 -7
  801. teradataml/data/river_data.csv +145 -145
  802. teradataml/data/roc_example.json +7 -7
  803. teradataml/data/roc_input.csv +101 -101
  804. teradataml/data/rule_inputs.csv +6 -6
  805. teradataml/data/rule_table.csv +2 -2
  806. teradataml/data/sales.csv +7 -7
  807. teradataml/data/sales_transaction.csv +501 -501
  808. teradataml/data/salesdata.csv +342 -342
  809. teradataml/data/sample_cities.csv +2 -2
  810. teradataml/data/sample_shapes.csv +10 -10
  811. teradataml/data/sample_streets.csv +2 -2
  812. teradataml/data/sampling_example.json +15 -15
  813. teradataml/data/sax_example.json +8 -8
  814. teradataml/data/scale_attributes.csv +3 -0
  815. teradataml/data/scale_example.json +74 -23
  816. teradataml/data/scale_housing.csv +11 -11
  817. teradataml/data/scale_housing_test.csv +6 -6
  818. teradataml/data/scale_input_part_sparse.csv +31 -0
  819. teradataml/data/scale_input_partitioned.csv +16 -0
  820. teradataml/data/scale_input_sparse.csv +11 -0
  821. teradataml/data/scale_parameters.csv +3 -0
  822. teradataml/data/scale_stat.csv +11 -11
  823. teradataml/data/scalebypartition_example.json +13 -13
  824. teradataml/data/scalemap_example.json +13 -13
  825. teradataml/data/scalesummary_example.json +12 -12
  826. teradataml/data/score_category.csv +101 -101
  827. teradataml/data/score_summary.csv +4 -4
  828. teradataml/data/script_example.json +9 -9
  829. teradataml/data/scripts/deploy_script.py +84 -0
  830. teradataml/data/scripts/mapper.R +20 -0
  831. teradataml/data/scripts/mapper.py +15 -15
  832. teradataml/data/scripts/mapper_replace.py +15 -15
  833. teradataml/data/scripts/sklearn/__init__.py +0 -0
  834. teradataml/data/scripts/sklearn/sklearn_fit.py +171 -0
  835. teradataml/data/scripts/sklearn/sklearn_fit_predict.py +127 -0
  836. teradataml/data/scripts/sklearn/sklearn_function.template +108 -0
  837. teradataml/data/scripts/sklearn/sklearn_model_selection_split.py +148 -0
  838. teradataml/data/scripts/sklearn/sklearn_neighbors.py +143 -0
  839. teradataml/data/scripts/sklearn/sklearn_score.py +119 -0
  840. teradataml/data/scripts/sklearn/sklearn_transform.py +171 -0
  841. teradataml/data/seeds.csv +10 -10
  842. teradataml/data/sentenceextractor_example.json +6 -6
  843. teradataml/data/sentiment_extract_input.csv +11 -11
  844. teradataml/data/sentiment_train.csv +16 -16
  845. teradataml/data/sentiment_word.csv +20 -20
  846. teradataml/data/sentiment_word_input.csv +19 -19
  847. teradataml/data/sentimentextractor_example.json +24 -24
  848. teradataml/data/sentimenttrainer_example.json +8 -8
  849. teradataml/data/sequence_table.csv +10 -10
  850. teradataml/data/seriessplitter_example.json +7 -7
  851. teradataml/data/sessionize_example.json +17 -17
  852. teradataml/data/sessionize_table.csv +116 -116
  853. teradataml/data/setop_test1.csv +24 -24
  854. teradataml/data/setop_test2.csv +22 -22
  855. teradataml/data/soc_nw_edges.csv +10 -10
  856. teradataml/data/soc_nw_vertices.csv +7 -7
  857. teradataml/data/souvenir_timeseries.csv +167 -167
  858. teradataml/data/sparse_iris_attribute.csv +5 -5
  859. teradataml/data/sparse_iris_test.csv +121 -121
  860. teradataml/data/sparse_iris_train.csv +601 -601
  861. teradataml/data/star1.csv +6 -6
  862. teradataml/data/state_transition.csv +5 -5
  863. teradataml/data/stock_data.csv +53 -53
  864. teradataml/data/stock_movement.csv +11 -11
  865. teradataml/data/stock_vol.csv +76 -76
  866. teradataml/data/stop_words.csv +8 -8
  867. teradataml/data/store_sales.csv +37 -37
  868. teradataml/data/stringsimilarity_example.json +7 -7
  869. teradataml/data/strsimilarity_input.csv +13 -13
  870. teradataml/data/students.csv +101 -101
  871. teradataml/data/svm_iris_input_test.csv +121 -121
  872. teradataml/data/svm_iris_input_train.csv +481 -481
  873. teradataml/data/svm_iris_model.csv +7 -7
  874. teradataml/data/svmdense_example.json +9 -9
  875. teradataml/data/svmdensepredict_example.json +18 -18
  876. teradataml/data/svmsparse_example.json +7 -7
  877. teradataml/data/svmsparsepredict_example.json +13 -13
  878. teradataml/data/svmsparsesummary_example.json +7 -7
  879. teradataml/data/target_mobile_data.csv +13 -13
  880. teradataml/data/target_mobile_data_dense.csv +5 -5
  881. teradataml/data/templatedata.csv +1201 -1201
  882. teradataml/data/templates/open_source_ml.json +9 -0
  883. teradataml/data/teradataml_example.json +150 -1
  884. teradataml/data/test_classification.csv +101 -0
  885. teradataml/data/test_loan_prediction.csv +53 -53
  886. teradataml/data/test_pacf_12.csv +37 -37
  887. teradataml/data/test_prediction.csv +101 -0
  888. teradataml/data/test_regression.csv +101 -0
  889. teradataml/data/test_river2.csv +109 -109
  890. teradataml/data/text_inputs.csv +6 -6
  891. teradataml/data/textchunker_example.json +7 -7
  892. teradataml/data/textclassifier_example.json +6 -6
  893. teradataml/data/textclassifier_input.csv +7 -7
  894. teradataml/data/textclassifiertrainer_example.json +6 -6
  895. teradataml/data/textmorph_example.json +5 -5
  896. teradataml/data/textparser_example.json +15 -15
  897. teradataml/data/texttagger_example.json +11 -11
  898. teradataml/data/texttokenizer_example.json +6 -6
  899. teradataml/data/texttrainer_input.csv +11 -11
  900. teradataml/data/tf_example.json +6 -6
  901. teradataml/data/tfidf_example.json +13 -13
  902. teradataml/data/tfidf_input1.csv +201 -201
  903. teradataml/data/tfidf_train.csv +6 -6
  904. teradataml/data/time_table1.csv +535 -535
  905. teradataml/data/time_table2.csv +14 -14
  906. teradataml/data/timeseriesdata.csv +1601 -1601
  907. teradataml/data/timeseriesdatasetsd4.csv +105 -105
  908. teradataml/data/titanic.csv +892 -892
  909. teradataml/data/token_table.csv +696 -696
  910. teradataml/data/train_multiclass.csv +101 -0
  911. teradataml/data/train_regression.csv +101 -0
  912. teradataml/data/train_regression_multiple_labels.csv +101 -0
  913. teradataml/data/train_tracking.csv +27 -27
  914. teradataml/data/transformation_table.csv +5 -5
  915. teradataml/data/transformation_table_new.csv +1 -1
  916. teradataml/data/tv_spots.csv +16 -16
  917. teradataml/data/twod_climate_data.csv +117 -117
  918. teradataml/data/uaf_example.json +475 -475
  919. teradataml/data/univariatestatistics_example.json +8 -8
  920. teradataml/data/unpack_example.json +9 -9
  921. teradataml/data/unpivot_example.json +9 -9
  922. teradataml/data/unpivot_input.csv +8 -8
  923. teradataml/data/us_air_pass.csv +36 -36
  924. teradataml/data/us_population.csv +624 -624
  925. teradataml/data/us_states_shapes.csv +52 -52
  926. teradataml/data/varmax_example.json +17 -17
  927. teradataml/data/vectordistance_example.json +25 -25
  928. teradataml/data/ville_climatedata.csv +121 -121
  929. teradataml/data/ville_tempdata.csv +12 -12
  930. teradataml/data/ville_tempdata1.csv +12 -12
  931. teradataml/data/ville_temperature.csv +11 -11
  932. teradataml/data/waveletTable.csv +1605 -1605
  933. teradataml/data/waveletTable2.csv +1605 -1605
  934. teradataml/data/weightedmovavg_example.json +8 -8
  935. teradataml/data/wft_testing.csv +5 -5
  936. teradataml/data/wine_data.csv +1600 -0
  937. teradataml/data/word_embed_input_table1.csv +5 -5
  938. teradataml/data/word_embed_input_table2.csv +4 -4
  939. teradataml/data/word_embed_model.csv +22 -22
  940. teradataml/data/words_input.csv +13 -13
  941. teradataml/data/xconvolve_complex_left.csv +6 -6
  942. teradataml/data/xconvolve_complex_leftmulti.csv +6 -6
  943. teradataml/data/xgboost_example.json +35 -35
  944. teradataml/data/xgboostpredict_example.json +31 -31
  945. teradataml/data/ztest_example.json +16 -0
  946. teradataml/dataframe/copy_to.py +1769 -1698
  947. teradataml/dataframe/data_transfer.py +2812 -2745
  948. teradataml/dataframe/dataframe.py +17630 -16946
  949. teradataml/dataframe/dataframe_utils.py +1875 -1740
  950. teradataml/dataframe/fastload.py +794 -603
  951. teradataml/dataframe/indexer.py +424 -424
  952. teradataml/dataframe/setop.py +1179 -1166
  953. teradataml/dataframe/sql.py +10174 -6432
  954. teradataml/dataframe/sql_function_parameters.py +439 -388
  955. teradataml/dataframe/sql_functions.py +652 -652
  956. teradataml/dataframe/sql_interfaces.py +220 -220
  957. teradataml/dataframe/vantage_function_types.py +674 -630
  958. teradataml/dataframe/window.py +693 -692
  959. teradataml/dbutils/__init__.py +3 -3
  960. teradataml/dbutils/dbutils.py +1167 -1150
  961. teradataml/dbutils/filemgr.py +267 -267
  962. teradataml/gen_ai/__init__.py +2 -2
  963. teradataml/gen_ai/convAI.py +472 -472
  964. teradataml/geospatial/__init__.py +3 -3
  965. teradataml/geospatial/geodataframe.py +1105 -1094
  966. teradataml/geospatial/geodataframecolumn.py +392 -387
  967. teradataml/geospatial/geometry_types.py +925 -925
  968. teradataml/hyperparameter_tuner/__init__.py +1 -1
  969. teradataml/hyperparameter_tuner/optimizer.py +3783 -2993
  970. teradataml/hyperparameter_tuner/utils.py +281 -187
  971. teradataml/lib/aed_0_1.dll +0 -0
  972. teradataml/lib/libaed_0_1.dylib +0 -0
  973. teradataml/lib/libaed_0_1.so +0 -0
  974. teradataml/libaed_0_1.dylib +0 -0
  975. teradataml/libaed_0_1.so +0 -0
  976. teradataml/opensource/__init__.py +1 -0
  977. teradataml/opensource/sklearn/__init__.py +1 -0
  978. teradataml/opensource/sklearn/_class.py +255 -0
  979. teradataml/opensource/sklearn/_sklearn_wrapper.py +1715 -0
  980. teradataml/opensource/sklearn/_wrapper_utils.py +268 -0
  981. teradataml/opensource/sklearn/constants.py +54 -0
  982. teradataml/options/__init__.py +130 -124
  983. teradataml/options/configure.py +358 -336
  984. teradataml/options/display.py +176 -176
  985. teradataml/plot/__init__.py +2 -2
  986. teradataml/plot/axis.py +1388 -1388
  987. teradataml/plot/constants.py +15 -15
  988. teradataml/plot/figure.py +398 -398
  989. teradataml/plot/plot.py +760 -760
  990. teradataml/plot/query_generator.py +83 -83
  991. teradataml/plot/subplot.py +216 -216
  992. teradataml/scriptmgmt/UserEnv.py +3791 -3761
  993. teradataml/scriptmgmt/__init__.py +3 -3
  994. teradataml/scriptmgmt/lls_utils.py +1719 -1604
  995. teradataml/series/series.py +532 -532
  996. teradataml/series/series_utils.py +71 -71
  997. teradataml/table_operators/Apply.py +949 -917
  998. teradataml/table_operators/Script.py +1718 -1982
  999. teradataml/table_operators/TableOperator.py +1255 -1616
  1000. teradataml/table_operators/__init__.py +2 -3
  1001. teradataml/table_operators/apply_query_generator.py +262 -262
  1002. teradataml/table_operators/query_generator.py +507 -507
  1003. teradataml/table_operators/table_operator_query_generator.py +460 -460
  1004. teradataml/table_operators/table_operator_util.py +631 -639
  1005. teradataml/table_operators/templates/dataframe_apply.template +184 -184
  1006. teradataml/table_operators/templates/dataframe_map.template +176 -176
  1007. teradataml/table_operators/templates/script_executor.template +170 -170
  1008. teradataml/utils/dtypes.py +684 -684
  1009. teradataml/utils/internal_buffer.py +84 -84
  1010. teradataml/utils/print_versions.py +205 -205
  1011. teradataml/utils/utils.py +410 -410
  1012. teradataml/utils/validators.py +2277 -2115
  1013. {teradataml-17.20.0.7.dist-info → teradataml-20.0.0.1.dist-info}/METADATA +346 -45
  1014. teradataml-20.0.0.1.dist-info/RECORD +1056 -0
  1015. {teradataml-17.20.0.7.dist-info → teradataml-20.0.0.1.dist-info}/WHEEL +1 -1
  1016. {teradataml-17.20.0.7.dist-info → teradataml-20.0.0.1.dist-info}/zip-safe +1 -1
  1017. teradataml/analytics/mle/AdaBoost.py +0 -651
  1018. teradataml/analytics/mle/AdaBoostPredict.py +0 -564
  1019. teradataml/analytics/mle/Antiselect.py +0 -342
  1020. teradataml/analytics/mle/Arima.py +0 -641
  1021. teradataml/analytics/mle/ArimaPredict.py +0 -477
  1022. teradataml/analytics/mle/Attribution.py +0 -1070
  1023. teradataml/analytics/mle/Betweenness.py +0 -658
  1024. teradataml/analytics/mle/Burst.py +0 -711
  1025. teradataml/analytics/mle/CCM.py +0 -600
  1026. teradataml/analytics/mle/CCMPrepare.py +0 -324
  1027. teradataml/analytics/mle/CFilter.py +0 -460
  1028. teradataml/analytics/mle/ChangePointDetection.py +0 -572
  1029. teradataml/analytics/mle/ChangePointDetectionRT.py +0 -477
  1030. teradataml/analytics/mle/Closeness.py +0 -737
  1031. teradataml/analytics/mle/ConfusionMatrix.py +0 -420
  1032. teradataml/analytics/mle/Correlation.py +0 -477
  1033. teradataml/analytics/mle/Correlation2.py +0 -573
  1034. teradataml/analytics/mle/CoxHazardRatio.py +0 -679
  1035. teradataml/analytics/mle/CoxPH.py +0 -556
  1036. teradataml/analytics/mle/CoxSurvival.py +0 -478
  1037. teradataml/analytics/mle/CumulativeMovAvg.py +0 -363
  1038. teradataml/analytics/mle/DTW.py +0 -623
  1039. teradataml/analytics/mle/DWT.py +0 -564
  1040. teradataml/analytics/mle/DWT2D.py +0 -599
  1041. teradataml/analytics/mle/DecisionForest.py +0 -716
  1042. teradataml/analytics/mle/DecisionForestEvaluator.py +0 -363
  1043. teradataml/analytics/mle/DecisionForestPredict.py +0 -561
  1044. teradataml/analytics/mle/DecisionTree.py +0 -830
  1045. teradataml/analytics/mle/DecisionTreePredict.py +0 -528
  1046. teradataml/analytics/mle/ExponentialMovAvg.py +0 -418
  1047. teradataml/analytics/mle/FMeasure.py +0 -402
  1048. teradataml/analytics/mle/FPGrowth.py +0 -734
  1049. teradataml/analytics/mle/FrequentPaths.py +0 -695
  1050. teradataml/analytics/mle/GLM.py +0 -558
  1051. teradataml/analytics/mle/GLML1L2.py +0 -547
  1052. teradataml/analytics/mle/GLML1L2Predict.py +0 -519
  1053. teradataml/analytics/mle/GLMPredict.py +0 -529
  1054. teradataml/analytics/mle/HMMDecoder.py +0 -945
  1055. teradataml/analytics/mle/HMMEvaluator.py +0 -901
  1056. teradataml/analytics/mle/HMMSupervised.py +0 -521
  1057. teradataml/analytics/mle/HMMUnsupervised.py +0 -572
  1058. teradataml/analytics/mle/Histogram.py +0 -561
  1059. teradataml/analytics/mle/IDWT.py +0 -476
  1060. teradataml/analytics/mle/IDWT2D.py +0 -493
  1061. teradataml/analytics/mle/IdentityMatch.py +0 -763
  1062. teradataml/analytics/mle/Interpolator.py +0 -918
  1063. teradataml/analytics/mle/KMeans.py +0 -485
  1064. teradataml/analytics/mle/KNN.py +0 -627
  1065. teradataml/analytics/mle/KNNRecommender.py +0 -488
  1066. teradataml/analytics/mle/KNNRecommenderPredict.py +0 -581
  1067. teradataml/analytics/mle/LAR.py +0 -439
  1068. teradataml/analytics/mle/LARPredict.py +0 -478
  1069. teradataml/analytics/mle/LDA.py +0 -548
  1070. teradataml/analytics/mle/LDAInference.py +0 -492
  1071. teradataml/analytics/mle/LDATopicSummary.py +0 -464
  1072. teradataml/analytics/mle/LevenshteinDistance.py +0 -450
  1073. teradataml/analytics/mle/LinReg.py +0 -433
  1074. teradataml/analytics/mle/LinRegPredict.py +0 -438
  1075. teradataml/analytics/mle/MinHash.py +0 -544
  1076. teradataml/analytics/mle/Modularity.py +0 -587
  1077. teradataml/analytics/mle/NEREvaluator.py +0 -410
  1078. teradataml/analytics/mle/NERExtractor.py +0 -595
  1079. teradataml/analytics/mle/NERTrainer.py +0 -458
  1080. teradataml/analytics/mle/NGrams.py +0 -570
  1081. teradataml/analytics/mle/NPath.py +0 -634
  1082. teradataml/analytics/mle/NTree.py +0 -549
  1083. teradataml/analytics/mle/NaiveBayes.py +0 -462
  1084. teradataml/analytics/mle/NaiveBayesPredict.py +0 -513
  1085. teradataml/analytics/mle/NaiveBayesTextClassifier.py +0 -607
  1086. teradataml/analytics/mle/NaiveBayesTextClassifier2.py +0 -531
  1087. teradataml/analytics/mle/NaiveBayesTextClassifierPredict.py +0 -799
  1088. teradataml/analytics/mle/NamedEntityFinder.py +0 -529
  1089. teradataml/analytics/mle/NamedEntityFinderEvaluator.py +0 -414
  1090. teradataml/analytics/mle/NamedEntityFinderTrainer.py +0 -396
  1091. teradataml/analytics/mle/POSTagger.py +0 -417
  1092. teradataml/analytics/mle/Pack.py +0 -411
  1093. teradataml/analytics/mle/PageRank.py +0 -535
  1094. teradataml/analytics/mle/PathAnalyzer.py +0 -426
  1095. teradataml/analytics/mle/PathGenerator.py +0 -367
  1096. teradataml/analytics/mle/PathStart.py +0 -464
  1097. teradataml/analytics/mle/PathSummarizer.py +0 -470
  1098. teradataml/analytics/mle/Pivot.py +0 -471
  1099. teradataml/analytics/mle/ROC.py +0 -425
  1100. teradataml/analytics/mle/RandomSample.py +0 -637
  1101. teradataml/analytics/mle/RandomWalkSample.py +0 -490
  1102. teradataml/analytics/mle/SAX.py +0 -779
  1103. teradataml/analytics/mle/SVMDense.py +0 -677
  1104. teradataml/analytics/mle/SVMDensePredict.py +0 -536
  1105. teradataml/analytics/mle/SVMDenseSummary.py +0 -437
  1106. teradataml/analytics/mle/SVMSparse.py +0 -557
  1107. teradataml/analytics/mle/SVMSparsePredict.py +0 -553
  1108. teradataml/analytics/mle/SVMSparseSummary.py +0 -435
  1109. teradataml/analytics/mle/Sampling.py +0 -549
  1110. teradataml/analytics/mle/Scale.py +0 -565
  1111. teradataml/analytics/mle/ScaleByPartition.py +0 -496
  1112. teradataml/analytics/mle/ScaleMap.py +0 -378
  1113. teradataml/analytics/mle/ScaleSummary.py +0 -320
  1114. teradataml/analytics/mle/SentenceExtractor.py +0 -363
  1115. teradataml/analytics/mle/SentimentEvaluator.py +0 -432
  1116. teradataml/analytics/mle/SentimentExtractor.py +0 -578
  1117. teradataml/analytics/mle/SentimentTrainer.py +0 -405
  1118. teradataml/analytics/mle/SeriesSplitter.py +0 -641
  1119. teradataml/analytics/mle/Sessionize.py +0 -475
  1120. teradataml/analytics/mle/SimpleMovAvg.py +0 -397
  1121. teradataml/analytics/mle/StringSimilarity.py +0 -425
  1122. teradataml/analytics/mle/TF.py +0 -389
  1123. teradataml/analytics/mle/TFIDF.py +0 -504
  1124. teradataml/analytics/mle/TextChunker.py +0 -414
  1125. teradataml/analytics/mle/TextClassifier.py +0 -399
  1126. teradataml/analytics/mle/TextClassifierEvaluator.py +0 -413
  1127. teradataml/analytics/mle/TextClassifierTrainer.py +0 -565
  1128. teradataml/analytics/mle/TextMorph.py +0 -494
  1129. teradataml/analytics/mle/TextParser.py +0 -623
  1130. teradataml/analytics/mle/TextTagger.py +0 -530
  1131. teradataml/analytics/mle/TextTokenizer.py +0 -502
  1132. teradataml/analytics/mle/UnivariateStatistics.py +0 -488
  1133. teradataml/analytics/mle/Unpack.py +0 -526
  1134. teradataml/analytics/mle/Unpivot.py +0 -438
  1135. teradataml/analytics/mle/VarMax.py +0 -776
  1136. teradataml/analytics/mle/VectorDistance.py +0 -762
  1137. teradataml/analytics/mle/WeightedMovAvg.py +0 -400
  1138. teradataml/analytics/mle/XGBoost.py +0 -842
  1139. teradataml/analytics/mle/XGBoostPredict.py +0 -627
  1140. teradataml/analytics/mle/__init__.py +0 -123
  1141. teradataml/analytics/mle/json/adaboost_mle.json +0 -135
  1142. teradataml/analytics/mle/json/adaboostpredict_mle.json +0 -85
  1143. teradataml/analytics/mle/json/antiselect_mle.json +0 -34
  1144. teradataml/analytics/mle/json/antiselect_mle_mle.json +0 -34
  1145. teradataml/analytics/mle/json/arima_mle.json +0 -172
  1146. teradataml/analytics/mle/json/arimapredict_mle.json +0 -52
  1147. teradataml/analytics/mle/json/attribution_mle_mle.json +0 -143
  1148. teradataml/analytics/mle/json/betweenness_mle.json +0 -97
  1149. teradataml/analytics/mle/json/burst_mle.json +0 -140
  1150. teradataml/analytics/mle/json/ccm_mle.json +0 -124
  1151. teradataml/analytics/mle/json/ccmprepare_mle.json +0 -14
  1152. teradataml/analytics/mle/json/cfilter_mle.json +0 -93
  1153. teradataml/analytics/mle/json/changepointdetection_mle.json +0 -92
  1154. teradataml/analytics/mle/json/changepointdetectionrt_mle.json +0 -78
  1155. teradataml/analytics/mle/json/closeness_mle.json +0 -104
  1156. teradataml/analytics/mle/json/confusionmatrix_mle.json +0 -79
  1157. teradataml/analytics/mle/json/correlation_mle.json +0 -86
  1158. teradataml/analytics/mle/json/correlationreduce_mle.json +0 -49
  1159. teradataml/analytics/mle/json/coxhazardratio_mle.json +0 -89
  1160. teradataml/analytics/mle/json/coxph_mle.json +0 -98
  1161. teradataml/analytics/mle/json/coxsurvival_mle.json +0 -79
  1162. teradataml/analytics/mle/json/cumulativemovavg_mle.json +0 -34
  1163. teradataml/analytics/mle/json/decisionforest_mle.json +0 -167
  1164. teradataml/analytics/mle/json/decisionforestevaluator_mle.json +0 -33
  1165. teradataml/analytics/mle/json/decisionforestpredict_mle_mle.json +0 -74
  1166. teradataml/analytics/mle/json/decisiontree_mle.json +0 -194
  1167. teradataml/analytics/mle/json/decisiontreepredict_mle_mle.json +0 -86
  1168. teradataml/analytics/mle/json/dtw_mle.json +0 -97
  1169. teradataml/analytics/mle/json/dwt2d_mle.json +0 -116
  1170. teradataml/analytics/mle/json/dwt_mle.json +0 -101
  1171. teradataml/analytics/mle/json/exponentialmovavg_mle.json +0 -55
  1172. teradataml/analytics/mle/json/fmeasure_mle.json +0 -58
  1173. teradataml/analytics/mle/json/fpgrowth_mle.json +0 -159
  1174. teradataml/analytics/mle/json/frequentpaths_mle.json +0 -129
  1175. teradataml/analytics/mle/json/glm_mle.json +0 -111
  1176. teradataml/analytics/mle/json/glml1l2_mle.json +0 -106
  1177. teradataml/analytics/mle/json/glml1l2predict_mle.json +0 -57
  1178. teradataml/analytics/mle/json/glmpredict_mle_mle.json +0 -74
  1179. teradataml/analytics/mle/json/histogram_mle.json +0 -100
  1180. teradataml/analytics/mle/json/hmmdecoder_mle.json +0 -192
  1181. teradataml/analytics/mle/json/hmmevaluator_mle.json +0 -206
  1182. teradataml/analytics/mle/json/hmmsupervised_mle.json +0 -91
  1183. teradataml/analytics/mle/json/hmmunsupervised_mle.json +0 -114
  1184. teradataml/analytics/mle/json/identitymatch_mle.json +0 -88
  1185. teradataml/analytics/mle/json/idwt2d_mle.json +0 -73
  1186. teradataml/analytics/mle/json/idwt_mle.json +0 -66
  1187. teradataml/analytics/mle/json/interpolator_mle.json +0 -151
  1188. teradataml/analytics/mle/json/kmeans_mle.json +0 -97
  1189. teradataml/analytics/mle/json/knn_mle.json +0 -141
  1190. teradataml/analytics/mle/json/knnrecommender_mle.json +0 -111
  1191. teradataml/analytics/mle/json/knnrecommenderpredict_mle.json +0 -75
  1192. teradataml/analytics/mle/json/lar_mle.json +0 -78
  1193. teradataml/analytics/mle/json/larpredict_mle.json +0 -69
  1194. teradataml/analytics/mle/json/lda_mle.json +0 -130
  1195. teradataml/analytics/mle/json/ldainference_mle.json +0 -78
  1196. teradataml/analytics/mle/json/ldatopicsummary_mle.json +0 -64
  1197. teradataml/analytics/mle/json/levenshteindistance_mle.json +0 -92
  1198. teradataml/analytics/mle/json/linreg_mle.json +0 -42
  1199. teradataml/analytics/mle/json/linregpredict_mle.json +0 -56
  1200. teradataml/analytics/mle/json/minhash_mle.json +0 -113
  1201. teradataml/analytics/mle/json/modularity_mle.json +0 -91
  1202. teradataml/analytics/mle/json/naivebayespredict_mle_mle.json +0 -85
  1203. teradataml/analytics/mle/json/naivebayesreduce_mle.json +0 -52
  1204. teradataml/analytics/mle/json/naivebayestextclassifierpredict_mle_mle.json +0 -147
  1205. teradataml/analytics/mle/json/naivebayestextclassifiertrainer2_mle.json +0 -108
  1206. teradataml/analytics/mle/json/naivebayestextclassifiertrainer_mle.json +0 -102
  1207. teradataml/analytics/mle/json/namedentityfinder_mle.json +0 -84
  1208. teradataml/analytics/mle/json/namedentityfinderevaluatorreduce_mle.json +0 -43
  1209. teradataml/analytics/mle/json/namedentityfindertrainer_mle.json +0 -64
  1210. teradataml/analytics/mle/json/nerevaluator_mle.json +0 -54
  1211. teradataml/analytics/mle/json/nerextractor_mle.json +0 -87
  1212. teradataml/analytics/mle/json/nertrainer_mle.json +0 -89
  1213. teradataml/analytics/mle/json/ngrams_mle.json +0 -137
  1214. teradataml/analytics/mle/json/ngramsplitter_mle_mle.json +0 -137
  1215. teradataml/analytics/mle/json/npath@coprocessor_mle.json +0 -73
  1216. teradataml/analytics/mle/json/ntree@coprocessor_mle.json +0 -123
  1217. teradataml/analytics/mle/json/pack_mle.json +0 -58
  1218. teradataml/analytics/mle/json/pack_mle_mle.json +0 -58
  1219. teradataml/analytics/mle/json/pagerank_mle.json +0 -81
  1220. teradataml/analytics/mle/json/pathanalyzer_mle.json +0 -63
  1221. teradataml/analytics/mle/json/pathgenerator_mle.json +0 -40
  1222. teradataml/analytics/mle/json/pathstart_mle.json +0 -62
  1223. teradataml/analytics/mle/json/pathsummarizer_mle.json +0 -72
  1224. teradataml/analytics/mle/json/pivoting_mle.json +0 -71
  1225. teradataml/analytics/mle/json/postagger_mle.json +0 -51
  1226. teradataml/analytics/mle/json/randomsample_mle.json +0 -131
  1227. teradataml/analytics/mle/json/randomwalksample_mle.json +0 -85
  1228. teradataml/analytics/mle/json/roc_mle.json +0 -73
  1229. teradataml/analytics/mle/json/sampling_mle.json +0 -75
  1230. teradataml/analytics/mle/json/sax_mle.json +0 -154
  1231. teradataml/analytics/mle/json/scale_mle.json +0 -93
  1232. teradataml/analytics/mle/json/scalebypartition_mle.json +0 -89
  1233. teradataml/analytics/mle/json/scalemap_mle.json +0 -44
  1234. teradataml/analytics/mle/json/scalesummary_mle.json +0 -14
  1235. teradataml/analytics/mle/json/sentenceextractor_mle.json +0 -41
  1236. teradataml/analytics/mle/json/sentimentevaluator_mle.json +0 -43
  1237. teradataml/analytics/mle/json/sentimentextractor_mle.json +0 -100
  1238. teradataml/analytics/mle/json/sentimenttrainer_mle.json +0 -68
  1239. teradataml/analytics/mle/json/seriessplitter_mle.json +0 -133
  1240. teradataml/analytics/mle/json/sessionize_mle_mle.json +0 -62
  1241. teradataml/analytics/mle/json/simplemovavg_mle.json +0 -48
  1242. teradataml/analytics/mle/json/stringsimilarity_mle.json +0 -50
  1243. teradataml/analytics/mle/json/stringsimilarity_mle_mle.json +0 -50
  1244. teradataml/analytics/mle/json/svmdense_mle.json +0 -165
  1245. teradataml/analytics/mle/json/svmdensepredict_mle.json +0 -95
  1246. teradataml/analytics/mle/json/svmdensesummary_mle.json +0 -58
  1247. teradataml/analytics/mle/json/svmsparse_mle.json +0 -148
  1248. teradataml/analytics/mle/json/svmsparsepredict_mle_mle.json +0 -103
  1249. teradataml/analytics/mle/json/svmsparsesummary_mle.json +0 -57
  1250. teradataml/analytics/mle/json/textchunker_mle.json +0 -40
  1251. teradataml/analytics/mle/json/textclassifier_mle.json +0 -51
  1252. teradataml/analytics/mle/json/textclassifierevaluator_mle.json +0 -43
  1253. teradataml/analytics/mle/json/textclassifiertrainer_mle.json +0 -103
  1254. teradataml/analytics/mle/json/textmorph_mle.json +0 -63
  1255. teradataml/analytics/mle/json/textparser_mle.json +0 -166
  1256. teradataml/analytics/mle/json/texttagger_mle.json +0 -81
  1257. teradataml/analytics/mle/json/texttokenizer_mle.json +0 -91
  1258. teradataml/analytics/mle/json/tf_mle.json +0 -33
  1259. teradataml/analytics/mle/json/tfidf_mle.json +0 -34
  1260. teradataml/analytics/mle/json/univariatestatistics_mle.json +0 -81
  1261. teradataml/analytics/mle/json/unpack_mle.json +0 -91
  1262. teradataml/analytics/mle/json/unpack_mle_mle.json +0 -91
  1263. teradataml/analytics/mle/json/unpivoting_mle.json +0 -63
  1264. teradataml/analytics/mle/json/varmax_mle.json +0 -176
  1265. teradataml/analytics/mle/json/vectordistance_mle.json +0 -179
  1266. teradataml/analytics/mle/json/weightedmovavg_mle.json +0 -48
  1267. teradataml/analytics/mle/json/xgboost_mle.json +0 -178
  1268. teradataml/analytics/mle/json/xgboostpredict_mle.json +0 -104
  1269. teradataml/analytics/sqle/Antiselect.py +0 -321
  1270. teradataml/analytics/sqle/Attribution.py +0 -603
  1271. teradataml/analytics/sqle/DecisionForestPredict.py +0 -408
  1272. teradataml/analytics/sqle/GLMPredict.py +0 -430
  1273. teradataml/analytics/sqle/MovingAverage.py +0 -543
  1274. teradataml/analytics/sqle/NGramSplitter.py +0 -548
  1275. teradataml/analytics/sqle/NPath.py +0 -632
  1276. teradataml/analytics/sqle/NaiveBayesTextClassifierPredict.py +0 -515
  1277. teradataml/analytics/sqle/Pack.py +0 -388
  1278. teradataml/analytics/sqle/SVMSparsePredict.py +0 -464
  1279. teradataml/analytics/sqle/Sessionize.py +0 -390
  1280. teradataml/analytics/sqle/StringSimilarity.py +0 -400
  1281. teradataml/analytics/sqle/Unpack.py +0 -503
  1282. teradataml/analytics/sqle/json/antiselect_sqle.json +0 -21
  1283. teradataml/analytics/sqle/json/attribution_sqle.json +0 -92
  1284. teradataml/analytics/sqle/json/decisionforestpredict_sqle.json +0 -48
  1285. teradataml/analytics/sqle/json/glmpredict_sqle.json +0 -48
  1286. teradataml/analytics/sqle/json/h2opredict_sqle.json +0 -63
  1287. teradataml/analytics/sqle/json/movingaverage_sqle.json +0 -58
  1288. teradataml/analytics/sqle/json/naivebayestextclassifierpredict_sqle.json +0 -76
  1289. teradataml/analytics/sqle/json/ngramsplitter_sqle.json +0 -126
  1290. teradataml/analytics/sqle/json/npath_sqle.json +0 -67
  1291. teradataml/analytics/sqle/json/pack_sqle.json +0 -47
  1292. teradataml/analytics/sqle/json/pmmlpredict_sqle.json +0 -55
  1293. teradataml/analytics/sqle/json/sessionize_sqle.json +0 -43
  1294. teradataml/analytics/sqle/json/stringsimilarity_sqle.json +0 -39
  1295. teradataml/analytics/sqle/json/svmsparsepredict_sqle.json +0 -74
  1296. teradataml/analytics/sqle/json/unpack_sqle.json +0 -80
  1297. teradataml/catalog/model_cataloging.py +0 -980
  1298. teradataml/config/mlengine_alias_definitions_v1.0 +0 -118
  1299. teradataml/config/mlengine_alias_definitions_v1.1 +0 -127
  1300. teradataml/config/mlengine_alias_definitions_v1.3 +0 -129
  1301. teradataml/table_operators/sandbox_container_util.py +0 -643
  1302. teradataml-17.20.0.7.dist-info/RECORD +0 -1280
  1303. {teradataml-17.20.0.7.dist-info → teradataml-20.0.0.1.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