teradataml 17.20.0.7__py3-none-any.whl → 20.0.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (1285) hide show
  1. teradataml/LICENSE-3RD-PARTY.pdf +0 -0
  2. teradataml/LICENSE.pdf +0 -0
  3. teradataml/README.md +1864 -1640
  4. teradataml/__init__.py +70 -60
  5. teradataml/_version.py +11 -11
  6. teradataml/analytics/Transformations.py +2995 -2995
  7. teradataml/analytics/__init__.py +81 -83
  8. teradataml/analytics/analytic_function_executor.py +2013 -2010
  9. teradataml/analytics/analytic_query_generator.py +958 -958
  10. teradataml/analytics/byom/H2OPredict.py +514 -514
  11. teradataml/analytics/byom/PMMLPredict.py +437 -437
  12. teradataml/analytics/byom/__init__.py +14 -14
  13. teradataml/analytics/json_parser/__init__.py +130 -130
  14. teradataml/analytics/json_parser/analytic_functions_argument.py +1707 -1707
  15. teradataml/analytics/json_parser/json_store.py +191 -191
  16. teradataml/analytics/json_parser/metadata.py +1637 -1637
  17. teradataml/analytics/json_parser/utils.py +804 -803
  18. teradataml/analytics/meta_class.py +196 -196
  19. teradataml/analytics/sqle/DecisionTreePredict.py +455 -470
  20. teradataml/analytics/sqle/NaiveBayesPredict.py +419 -428
  21. teradataml/analytics/sqle/__init__.py +97 -110
  22. teradataml/analytics/sqle/json/decisiontreepredict_sqle.json +78 -78
  23. teradataml/analytics/sqle/json/naivebayespredict_sqle.json +62 -62
  24. teradataml/analytics/table_operator/__init__.py +10 -10
  25. teradataml/analytics/uaf/__init__.py +63 -63
  26. teradataml/analytics/utils.py +693 -692
  27. teradataml/analytics/valib.py +1603 -1600
  28. teradataml/automl/__init__.py +1628 -0
  29. teradataml/automl/custom_json_utils.py +1270 -0
  30. teradataml/automl/data_preparation.py +993 -0
  31. teradataml/automl/data_transformation.py +727 -0
  32. teradataml/automl/feature_engineering.py +1648 -0
  33. teradataml/automl/feature_exploration.py +547 -0
  34. teradataml/automl/model_evaluation.py +163 -0
  35. teradataml/automl/model_training.py +887 -0
  36. teradataml/catalog/__init__.py +1 -3
  37. teradataml/catalog/byom.py +1759 -1716
  38. teradataml/catalog/function_argument_mapper.py +859 -861
  39. teradataml/catalog/model_cataloging_utils.py +491 -1510
  40. teradataml/clients/pkce_client.py +481 -481
  41. teradataml/common/aed_utils.py +6 -2
  42. teradataml/common/bulk_exposed_utils.py +111 -111
  43. teradataml/common/constants.py +1433 -1441
  44. teradataml/common/deprecations.py +160 -0
  45. teradataml/common/exceptions.py +73 -73
  46. teradataml/common/formula.py +742 -742
  47. teradataml/common/garbagecollector.py +592 -635
  48. teradataml/common/messagecodes.py +422 -431
  49. teradataml/common/messages.py +227 -231
  50. teradataml/common/sqlbundle.py +693 -693
  51. teradataml/common/td_coltype_code_to_tdtype.py +48 -48
  52. teradataml/common/utils.py +2418 -2500
  53. teradataml/common/warnings.py +25 -25
  54. teradataml/common/wrapper_utils.py +1 -110
  55. teradataml/config/dummy_file1.cfg +4 -4
  56. teradataml/config/dummy_file2.cfg +2 -2
  57. teradataml/config/sqlengine_alias_definitions_v1.0 +13 -13
  58. teradataml/config/sqlengine_alias_definitions_v1.1 +19 -19
  59. teradataml/config/sqlengine_alias_definitions_v1.3 +18 -18
  60. teradataml/context/aed_context.py +217 -217
  61. teradataml/context/context.py +1071 -999
  62. teradataml/data/A_loan.csv +19 -19
  63. teradataml/data/BINARY_REALS_LEFT.csv +11 -11
  64. teradataml/data/BINARY_REALS_RIGHT.csv +11 -11
  65. teradataml/data/B_loan.csv +49 -49
  66. teradataml/data/BuoyData2.csv +17 -17
  67. teradataml/data/CONVOLVE2_COMPLEX_LEFT.csv +5 -5
  68. teradataml/data/CONVOLVE2_COMPLEX_RIGHT.csv +5 -5
  69. teradataml/data/Convolve2RealsLeft.csv +5 -5
  70. teradataml/data/Convolve2RealsRight.csv +5 -5
  71. teradataml/data/Convolve2ValidLeft.csv +11 -11
  72. teradataml/data/Convolve2ValidRight.csv +11 -11
  73. teradataml/data/DFFTConv_Real_8_8.csv +65 -65
  74. teradataml/data/Orders1_12mf.csv +24 -24
  75. teradataml/data/Pi_loan.csv +7 -7
  76. teradataml/data/SMOOTHED_DATA.csv +7 -7
  77. teradataml/data/TestDFFT8.csv +9 -9
  78. teradataml/data/TestRiver.csv +109 -109
  79. teradataml/data/Traindata.csv +28 -28
  80. teradataml/data/acf.csv +17 -17
  81. teradataml/data/adaboost_example.json +34 -34
  82. teradataml/data/adaboostpredict_example.json +24 -24
  83. teradataml/data/additional_table.csv +10 -10
  84. teradataml/data/admissions_test.csv +21 -21
  85. teradataml/data/admissions_train.csv +41 -41
  86. teradataml/data/admissions_train_nulls.csv +41 -41
  87. teradataml/data/ageandheight.csv +13 -13
  88. teradataml/data/ageandpressure.csv +31 -31
  89. teradataml/data/antiselect_example.json +36 -36
  90. teradataml/data/antiselect_input.csv +8 -8
  91. teradataml/data/antiselect_input_mixed_case.csv +8 -8
  92. teradataml/data/applicant_external.csv +6 -6
  93. teradataml/data/applicant_reference.csv +6 -6
  94. teradataml/data/arima_example.json +9 -9
  95. teradataml/data/assortedtext_input.csv +8 -8
  96. teradataml/data/attribution_example.json +33 -33
  97. teradataml/data/attribution_sample_table.csv +27 -27
  98. teradataml/data/attribution_sample_table1.csv +6 -6
  99. teradataml/data/attribution_sample_table2.csv +11 -11
  100. teradataml/data/bank_churn.csv +10001 -0
  101. teradataml/data/bank_web_clicks1.csv +42 -42
  102. teradataml/data/bank_web_clicks2.csv +91 -91
  103. teradataml/data/bank_web_url.csv +85 -85
  104. teradataml/data/barrier.csv +2 -2
  105. teradataml/data/barrier_new.csv +3 -3
  106. teradataml/data/betweenness_example.json +13 -13
  107. teradataml/data/bin_breaks.csv +8 -8
  108. teradataml/data/bin_fit_ip.csv +3 -3
  109. teradataml/data/binary_complex_left.csv +11 -11
  110. teradataml/data/binary_complex_right.csv +11 -11
  111. teradataml/data/binary_matrix_complex_left.csv +21 -21
  112. teradataml/data/binary_matrix_complex_right.csv +21 -21
  113. teradataml/data/binary_matrix_real_left.csv +21 -21
  114. teradataml/data/binary_matrix_real_right.csv +21 -21
  115. teradataml/data/blood2ageandweight.csv +26 -26
  116. teradataml/data/bmi.csv +501 -0
  117. teradataml/data/boston.csv +507 -507
  118. teradataml/data/buoydata_mix.csv +11 -11
  119. teradataml/data/burst_data.csv +5 -5
  120. teradataml/data/burst_example.json +20 -20
  121. teradataml/data/byom_example.json +17 -17
  122. teradataml/data/bytes_table.csv +3 -3
  123. teradataml/data/cal_housing_ex_raw.csv +70 -70
  124. teradataml/data/callers.csv +7 -7
  125. teradataml/data/calls.csv +10 -10
  126. teradataml/data/cars_hist.csv +33 -33
  127. teradataml/data/cat_table.csv +24 -24
  128. teradataml/data/ccm_example.json +31 -31
  129. teradataml/data/ccm_input.csv +91 -91
  130. teradataml/data/ccm_input2.csv +13 -13
  131. teradataml/data/ccmexample.csv +101 -101
  132. teradataml/data/ccmprepare_example.json +8 -8
  133. teradataml/data/ccmprepare_input.csv +91 -91
  134. teradataml/data/cfilter_example.json +12 -12
  135. teradataml/data/changepointdetection_example.json +18 -18
  136. teradataml/data/changepointdetectionrt_example.json +8 -8
  137. teradataml/data/chi_sq.csv +2 -2
  138. teradataml/data/churn_data.csv +14 -14
  139. teradataml/data/churn_emission.csv +35 -35
  140. teradataml/data/churn_initial.csv +3 -3
  141. teradataml/data/churn_state_transition.csv +5 -5
  142. teradataml/data/citedges_2.csv +745 -745
  143. teradataml/data/citvertices_2.csv +1210 -1210
  144. teradataml/data/clicks2.csv +16 -16
  145. teradataml/data/clickstream.csv +12 -12
  146. teradataml/data/clickstream1.csv +11 -11
  147. teradataml/data/closeness_example.json +15 -15
  148. teradataml/data/complaints.csv +21 -21
  149. teradataml/data/complaints_mini.csv +3 -3
  150. teradataml/data/complaints_testtoken.csv +224 -224
  151. teradataml/data/complaints_tokens_test.csv +353 -353
  152. teradataml/data/complaints_traintoken.csv +472 -472
  153. teradataml/data/computers_category.csv +1001 -1001
  154. teradataml/data/computers_test1.csv +1252 -1252
  155. teradataml/data/computers_train1.csv +5009 -5009
  156. teradataml/data/computers_train1_clustered.csv +5009 -5009
  157. teradataml/data/confusionmatrix_example.json +9 -9
  158. teradataml/data/conversion_event_table.csv +3 -3
  159. teradataml/data/corr_input.csv +17 -17
  160. teradataml/data/correlation_example.json +11 -11
  161. teradataml/data/coxhazardratio_example.json +39 -39
  162. teradataml/data/coxph_example.json +15 -15
  163. teradataml/data/coxsurvival_example.json +28 -28
  164. teradataml/data/cpt.csv +41 -41
  165. teradataml/data/credit_ex_merged.csv +45 -45
  166. teradataml/data/customer_loyalty.csv +301 -301
  167. teradataml/data/customer_loyalty_newseq.csv +31 -31
  168. teradataml/data/dataframe_example.json +146 -146
  169. teradataml/data/decisionforest_example.json +37 -37
  170. teradataml/data/decisionforestpredict_example.json +38 -38
  171. teradataml/data/decisiontree_example.json +21 -21
  172. teradataml/data/decisiontreepredict_example.json +45 -45
  173. teradataml/data/dfft2_size4_real.csv +17 -17
  174. teradataml/data/dfft2_test_matrix16.csv +17 -17
  175. teradataml/data/dfft2conv_real_4_4.csv +65 -65
  176. teradataml/data/diabetes.csv +443 -443
  177. teradataml/data/diabetes_test.csv +89 -89
  178. teradataml/data/dict_table.csv +5 -5
  179. teradataml/data/docperterm_table.csv +4 -4
  180. teradataml/data/docs/__init__.py +1 -1
  181. teradataml/data/docs/byom/docs/DataRobotPredict.py +180 -180
  182. teradataml/data/docs/byom/docs/DataikuPredict.py +177 -177
  183. teradataml/data/docs/byom/docs/H2OPredict.py +324 -324
  184. teradataml/data/docs/byom/docs/ONNXPredict.py +283 -283
  185. teradataml/data/docs/byom/docs/PMMLPredict.py +277 -277
  186. teradataml/data/docs/sqle/docs_17_10/Antiselect.py +82 -82
  187. teradataml/data/docs/sqle/docs_17_10/Attribution.py +199 -199
  188. teradataml/data/docs/sqle/docs_17_10/BincodeFit.py +171 -171
  189. teradataml/data/docs/sqle/docs_17_10/BincodeTransform.py +131 -130
  190. teradataml/data/docs/sqle/docs_17_10/CategoricalSummary.py +86 -86
  191. teradataml/data/docs/sqle/docs_17_10/ChiSq.py +90 -90
  192. teradataml/data/docs/sqle/docs_17_10/ColumnSummary.py +85 -85
  193. teradataml/data/docs/sqle/docs_17_10/ConvertTo.py +95 -95
  194. teradataml/data/docs/sqle/docs_17_10/DecisionForestPredict.py +139 -139
  195. teradataml/data/docs/sqle/docs_17_10/DecisionTreePredict.py +151 -151
  196. teradataml/data/docs/sqle/docs_17_10/FTest.py +160 -160
  197. teradataml/data/docs/sqle/docs_17_10/FillRowId.py +82 -82
  198. teradataml/data/docs/sqle/docs_17_10/Fit.py +87 -87
  199. teradataml/data/docs/sqle/docs_17_10/GLMPredict.py +144 -144
  200. teradataml/data/docs/sqle/docs_17_10/GetRowsWithMissingValues.py +84 -84
  201. teradataml/data/docs/sqle/docs_17_10/GetRowsWithoutMissingValues.py +81 -81
  202. teradataml/data/docs/sqle/docs_17_10/Histogram.py +164 -164
  203. teradataml/data/docs/sqle/docs_17_10/MovingAverage.py +134 -134
  204. teradataml/data/docs/sqle/docs_17_10/NGramSplitter.py +208 -208
  205. teradataml/data/docs/sqle/docs_17_10/NPath.py +265 -265
  206. teradataml/data/docs/sqle/docs_17_10/NaiveBayesPredict.py +116 -116
  207. teradataml/data/docs/sqle/docs_17_10/NaiveBayesTextClassifierPredict.py +176 -176
  208. teradataml/data/docs/sqle/docs_17_10/NumApply.py +147 -147
  209. teradataml/data/docs/sqle/docs_17_10/OneHotEncodingFit.py +132 -132
  210. teradataml/data/docs/sqle/docs_17_10/OneHotEncodingTransform.py +103 -103
  211. teradataml/data/docs/sqle/docs_17_10/OutlierFilterFit.py +165 -165
  212. teradataml/data/docs/sqle/docs_17_10/OutlierFilterTransform.py +101 -101
  213. teradataml/data/docs/sqle/docs_17_10/Pack.py +128 -128
  214. teradataml/data/docs/sqle/docs_17_10/PolynomialFeaturesFit.py +111 -111
  215. teradataml/data/docs/sqle/docs_17_10/PolynomialFeaturesTransform.py +102 -102
  216. teradataml/data/docs/sqle/docs_17_10/QQNorm.py +104 -104
  217. teradataml/data/docs/sqle/docs_17_10/RoundColumns.py +109 -109
  218. teradataml/data/docs/sqle/docs_17_10/RowNormalizeFit.py +117 -117
  219. teradataml/data/docs/sqle/docs_17_10/RowNormalizeTransform.py +99 -98
  220. teradataml/data/docs/sqle/docs_17_10/SVMSparsePredict.py +152 -152
  221. teradataml/data/docs/sqle/docs_17_10/ScaleFit.py +197 -197
  222. teradataml/data/docs/sqle/docs_17_10/ScaleTransform.py +99 -98
  223. teradataml/data/docs/sqle/docs_17_10/Sessionize.py +113 -113
  224. teradataml/data/docs/sqle/docs_17_10/SimpleImputeFit.py +116 -116
  225. teradataml/data/docs/sqle/docs_17_10/SimpleImputeTransform.py +98 -98
  226. teradataml/data/docs/sqle/docs_17_10/StrApply.py +187 -187
  227. teradataml/data/docs/sqle/docs_17_10/StringSimilarity.py +145 -145
  228. teradataml/data/docs/sqle/docs_17_10/Transform.py +105 -104
  229. teradataml/data/docs/sqle/docs_17_10/UnivariateStatistics.py +141 -141
  230. teradataml/data/docs/sqle/docs_17_10/Unpack.py +214 -214
  231. teradataml/data/docs/sqle/docs_17_10/WhichMax.py +83 -83
  232. teradataml/data/docs/sqle/docs_17_10/WhichMin.py +83 -83
  233. teradataml/data/docs/sqle/docs_17_10/ZTest.py +155 -155
  234. teradataml/data/docs/sqle/docs_17_20/ANOVA.py +126 -126
  235. teradataml/data/docs/sqle/docs_17_20/Antiselect.py +82 -82
  236. teradataml/data/docs/sqle/docs_17_20/Attribution.py +200 -200
  237. teradataml/data/docs/sqle/docs_17_20/BincodeFit.py +171 -171
  238. teradataml/data/docs/sqle/docs_17_20/BincodeTransform.py +139 -138
  239. teradataml/data/docs/sqle/docs_17_20/CategoricalSummary.py +86 -86
  240. teradataml/data/docs/sqle/docs_17_20/ChiSq.py +90 -90
  241. teradataml/data/docs/sqle/docs_17_20/ClassificationEvaluator.py +166 -166
  242. teradataml/data/docs/sqle/docs_17_20/ColumnSummary.py +85 -85
  243. teradataml/data/docs/sqle/docs_17_20/ColumnTransformer.py +243 -243
  244. teradataml/data/docs/sqle/docs_17_20/ConvertTo.py +113 -113
  245. teradataml/data/docs/sqle/docs_17_20/DecisionForest.py +279 -279
  246. teradataml/data/docs/sqle/docs_17_20/DecisionForestPredict.py +144 -144
  247. teradataml/data/docs/sqle/docs_17_20/DecisionTreePredict.py +135 -135
  248. teradataml/data/docs/sqle/docs_17_20/FTest.py +160 -160
  249. teradataml/data/docs/sqle/docs_17_20/FillRowId.py +82 -82
  250. teradataml/data/docs/sqle/docs_17_20/Fit.py +87 -87
  251. teradataml/data/docs/sqle/docs_17_20/GLM.py +380 -380
  252. teradataml/data/docs/sqle/docs_17_20/GLMPerSegment.py +414 -414
  253. teradataml/data/docs/sqle/docs_17_20/GLMPredict.py +144 -144
  254. teradataml/data/docs/sqle/docs_17_20/GLMPredictPerSegment.py +233 -234
  255. teradataml/data/docs/sqle/docs_17_20/GetFutileColumns.py +123 -123
  256. teradataml/data/docs/sqle/docs_17_20/GetRowsWithMissingValues.py +108 -108
  257. teradataml/data/docs/sqle/docs_17_20/GetRowsWithoutMissingValues.py +105 -105
  258. teradataml/data/docs/sqle/docs_17_20/Histogram.py +223 -223
  259. teradataml/data/docs/sqle/docs_17_20/KMeans.py +204 -204
  260. teradataml/data/docs/sqle/docs_17_20/KMeansPredict.py +144 -143
  261. teradataml/data/docs/sqle/docs_17_20/KNN.py +214 -214
  262. teradataml/data/docs/sqle/docs_17_20/MovingAverage.py +134 -134
  263. teradataml/data/docs/sqle/docs_17_20/NGramSplitter.py +208 -208
  264. teradataml/data/docs/sqle/docs_17_20/NPath.py +265 -265
  265. teradataml/data/docs/sqle/docs_17_20/NaiveBayesPredict.py +116 -116
  266. teradataml/data/docs/sqle/docs_17_20/NaiveBayesTextClassifierPredict.py +177 -176
  267. teradataml/data/docs/sqle/docs_17_20/NaiveBayesTextClassifierTrainer.py +126 -126
  268. teradataml/data/docs/sqle/docs_17_20/NonLinearCombineFit.py +117 -117
  269. teradataml/data/docs/sqle/docs_17_20/NonLinearCombineTransform.py +112 -112
  270. teradataml/data/docs/sqle/docs_17_20/NumApply.py +147 -147
  271. teradataml/data/docs/sqle/docs_17_20/OneClassSVM.py +307 -307
  272. teradataml/data/docs/sqle/docs_17_20/OneClassSVMPredict.py +185 -184
  273. teradataml/data/docs/sqle/docs_17_20/OneHotEncodingFit.py +225 -225
  274. teradataml/data/docs/sqle/docs_17_20/OneHotEncodingTransform.py +115 -115
  275. teradataml/data/docs/sqle/docs_17_20/OrdinalEncodingFit.py +219 -219
  276. teradataml/data/docs/sqle/docs_17_20/OrdinalEncodingTransform.py +127 -127
  277. teradataml/data/docs/sqle/docs_17_20/OutlierFilterFit.py +189 -189
  278. teradataml/data/docs/sqle/docs_17_20/OutlierFilterTransform.py +117 -112
  279. teradataml/data/docs/sqle/docs_17_20/Pack.py +128 -128
  280. teradataml/data/docs/sqle/docs_17_20/PolynomialFeaturesFit.py +111 -111
  281. teradataml/data/docs/sqle/docs_17_20/PolynomialFeaturesTransform.py +112 -111
  282. teradataml/data/docs/sqle/docs_17_20/QQNorm.py +104 -104
  283. teradataml/data/docs/sqle/docs_17_20/ROC.py +163 -163
  284. teradataml/data/docs/sqle/docs_17_20/RandomProjectionFit.py +154 -154
  285. teradataml/data/docs/sqle/docs_17_20/RandomProjectionMinComponents.py +106 -106
  286. teradataml/data/docs/sqle/docs_17_20/RandomProjectionTransform.py +120 -120
  287. teradataml/data/docs/sqle/docs_17_20/RegressionEvaluator.py +211 -211
  288. teradataml/data/docs/sqle/docs_17_20/RoundColumns.py +108 -108
  289. teradataml/data/docs/sqle/docs_17_20/RowNormalizeFit.py +117 -117
  290. teradataml/data/docs/sqle/docs_17_20/RowNormalizeTransform.py +111 -110
  291. teradataml/data/docs/sqle/docs_17_20/SVM.py +413 -413
  292. teradataml/data/docs/sqle/docs_17_20/SVMPredict.py +202 -202
  293. teradataml/data/docs/sqle/docs_17_20/SVMSparsePredict.py +152 -152
  294. teradataml/data/docs/sqle/docs_17_20/ScaleFit.py +197 -197
  295. teradataml/data/docs/sqle/docs_17_20/ScaleTransform.py +110 -109
  296. teradataml/data/docs/sqle/docs_17_20/SentimentExtractor.py +206 -206
  297. teradataml/data/docs/sqle/docs_17_20/Sessionize.py +113 -113
  298. teradataml/data/docs/sqle/docs_17_20/Silhouette.py +152 -152
  299. teradataml/data/docs/sqle/docs_17_20/SimpleImputeFit.py +116 -116
  300. teradataml/data/docs/sqle/docs_17_20/SimpleImputeTransform.py +109 -108
  301. teradataml/data/docs/sqle/docs_17_20/StrApply.py +187 -187
  302. teradataml/data/docs/sqle/docs_17_20/StringSimilarity.py +145 -145
  303. teradataml/data/docs/sqle/docs_17_20/TDDecisionForestPredict.py +207 -207
  304. teradataml/data/docs/sqle/docs_17_20/TDGLMPredict.py +171 -171
  305. teradataml/data/docs/sqle/docs_17_20/TargetEncodingFit.py +266 -266
  306. teradataml/data/docs/sqle/docs_17_20/TargetEncodingTransform.py +141 -140
  307. teradataml/data/docs/sqle/docs_17_20/TextParser.py +172 -172
  308. teradataml/data/docs/sqle/docs_17_20/TrainTestSplit.py +159 -159
  309. teradataml/data/docs/sqle/docs_17_20/Transform.py +123 -123
  310. teradataml/data/docs/sqle/docs_17_20/UnivariateStatistics.py +141 -141
  311. teradataml/data/docs/sqle/docs_17_20/Unpack.py +214 -214
  312. teradataml/data/docs/sqle/docs_17_20/VectorDistance.py +168 -168
  313. teradataml/data/docs/sqle/docs_17_20/WhichMax.py +83 -83
  314. teradataml/data/docs/sqle/docs_17_20/WhichMin.py +83 -83
  315. teradataml/data/docs/sqle/docs_17_20/WordEmbeddings.py +236 -236
  316. teradataml/data/docs/sqle/docs_17_20/XGBoost.py +353 -353
  317. teradataml/data/docs/sqle/docs_17_20/XGBoostPredict.py +275 -275
  318. teradataml/data/docs/sqle/docs_17_20/ZTest.py +155 -155
  319. teradataml/data/docs/tableoperator/docs_17_00/ReadNOS.py +429 -429
  320. teradataml/data/docs/tableoperator/docs_17_05/ReadNOS.py +429 -429
  321. teradataml/data/docs/tableoperator/docs_17_05/WriteNOS.py +347 -347
  322. teradataml/data/docs/tableoperator/docs_17_10/ReadNOS.py +428 -428
  323. teradataml/data/docs/tableoperator/docs_17_10/WriteNOS.py +347 -347
  324. teradataml/data/docs/tableoperator/docs_17_20/ReadNOS.py +439 -439
  325. teradataml/data/docs/tableoperator/docs_17_20/WriteNOS.py +386 -386
  326. teradataml/data/docs/uaf/docs_17_20/ACF.py +195 -195
  327. teradataml/data/docs/uaf/docs_17_20/ArimaEstimate.py +369 -369
  328. teradataml/data/docs/uaf/docs_17_20/ArimaForecast.py +142 -142
  329. teradataml/data/docs/uaf/docs_17_20/ArimaValidate.py +159 -159
  330. teradataml/data/docs/uaf/docs_17_20/BinaryMatrixOp.py +247 -247
  331. teradataml/data/docs/uaf/docs_17_20/BinarySeriesOp.py +252 -252
  332. teradataml/data/docs/uaf/docs_17_20/BreuschGodfrey.py +177 -177
  333. teradataml/data/docs/uaf/docs_17_20/BreuschPaganGodfrey.py +174 -174
  334. teradataml/data/docs/uaf/docs_17_20/Convolve.py +226 -226
  335. teradataml/data/docs/uaf/docs_17_20/Convolve2.py +214 -214
  336. teradataml/data/docs/uaf/docs_17_20/CumulPeriodogram.py +183 -183
  337. teradataml/data/docs/uaf/docs_17_20/DFFT.py +203 -203
  338. teradataml/data/docs/uaf/docs_17_20/DFFT2.py +216 -216
  339. teradataml/data/docs/uaf/docs_17_20/DFFT2Conv.py +215 -215
  340. teradataml/data/docs/uaf/docs_17_20/DFFTConv.py +191 -191
  341. teradataml/data/docs/uaf/docs_17_20/DTW.py +179 -179
  342. teradataml/data/docs/uaf/docs_17_20/DickeyFuller.py +144 -144
  343. teradataml/data/docs/uaf/docs_17_20/DurbinWatson.py +183 -183
  344. teradataml/data/docs/uaf/docs_17_20/ExtractResults.py +184 -184
  345. teradataml/data/docs/uaf/docs_17_20/FitMetrics.py +172 -172
  346. teradataml/data/docs/uaf/docs_17_20/GenseriesFormula.py +205 -205
  347. teradataml/data/docs/uaf/docs_17_20/GenseriesSinusoids.py +142 -142
  348. teradataml/data/docs/uaf/docs_17_20/HoltWintersForecaster.py +258 -258
  349. teradataml/data/docs/uaf/docs_17_20/IDFFT.py +164 -164
  350. teradataml/data/docs/uaf/docs_17_20/IDFFT2.py +198 -198
  351. teradataml/data/docs/uaf/docs_17_20/InputValidator.py +120 -120
  352. teradataml/data/docs/uaf/docs_17_20/LineSpec.py +155 -155
  353. teradataml/data/docs/uaf/docs_17_20/LinearRegr.py +214 -214
  354. teradataml/data/docs/uaf/docs_17_20/MAMean.py +173 -173
  355. teradataml/data/docs/uaf/docs_17_20/MInfo.py +133 -133
  356. teradataml/data/docs/uaf/docs_17_20/MatrixMultiply.py +135 -135
  357. teradataml/data/docs/uaf/docs_17_20/MultivarRegr.py +190 -190
  358. teradataml/data/docs/uaf/docs_17_20/PACF.py +158 -158
  359. teradataml/data/docs/uaf/docs_17_20/Portman.py +216 -216
  360. teradataml/data/docs/uaf/docs_17_20/PowerTransform.py +154 -154
  361. teradataml/data/docs/uaf/docs_17_20/Resample.py +228 -228
  362. teradataml/data/docs/uaf/docs_17_20/SInfo.py +122 -122
  363. teradataml/data/docs/uaf/docs_17_20/SeasonalNormalize.py +165 -165
  364. teradataml/data/docs/uaf/docs_17_20/SelectionCriteria.py +173 -173
  365. teradataml/data/docs/uaf/docs_17_20/SignifPeriodicities.py +170 -170
  366. teradataml/data/docs/uaf/docs_17_20/SignifResidmean.py +163 -163
  367. teradataml/data/docs/uaf/docs_17_20/SimpleExp.py +179 -179
  368. teradataml/data/docs/uaf/docs_17_20/Smoothma.py +207 -207
  369. teradataml/data/docs/uaf/docs_17_20/TrackingOp.py +150 -150
  370. teradataml/data/docs/uaf/docs_17_20/UNDIFF.py +171 -171
  371. teradataml/data/docs/uaf/docs_17_20/Unnormalize.py +201 -201
  372. teradataml/data/docs/uaf/docs_17_20/WhitesGeneral.py +169 -169
  373. teradataml/data/dtw_example.json +17 -17
  374. teradataml/data/dtw_t1.csv +11 -11
  375. teradataml/data/dtw_t2.csv +4 -4
  376. teradataml/data/dwt2d_example.json +15 -15
  377. teradataml/data/dwt_example.json +14 -14
  378. teradataml/data/dwt_filter_dim.csv +5 -5
  379. teradataml/data/emission.csv +9 -9
  380. teradataml/data/emp_table_by_dept.csv +19 -19
  381. teradataml/data/employee_info.csv +4 -4
  382. teradataml/data/employee_table.csv +6 -6
  383. teradataml/data/excluding_event_table.csv +2 -2
  384. teradataml/data/finance_data.csv +6 -6
  385. teradataml/data/finance_data2.csv +61 -61
  386. teradataml/data/finance_data3.csv +93 -93
  387. teradataml/data/fish.csv +160 -0
  388. teradataml/data/fm_blood2ageandweight.csv +26 -26
  389. teradataml/data/fmeasure_example.json +11 -11
  390. teradataml/data/followers_leaders.csv +10 -10
  391. teradataml/data/fpgrowth_example.json +12 -12
  392. teradataml/data/frequentpaths_example.json +29 -29
  393. teradataml/data/friends.csv +9 -9
  394. teradataml/data/fs_input.csv +33 -33
  395. teradataml/data/fs_input1.csv +33 -33
  396. teradataml/data/genData.csv +513 -513
  397. teradataml/data/geodataframe_example.json +39 -39
  398. teradataml/data/glass_types.csv +215 -0
  399. teradataml/data/glm_admissions_model.csv +12 -12
  400. teradataml/data/glm_example.json +29 -29
  401. teradataml/data/glml1l2_example.json +28 -28
  402. teradataml/data/glml1l2predict_example.json +54 -54
  403. teradataml/data/glmpredict_example.json +54 -54
  404. teradataml/data/gq_t1.csv +21 -21
  405. teradataml/data/hconvolve_complex_right.csv +5 -5
  406. teradataml/data/hconvolve_complex_rightmulti.csv +5 -5
  407. teradataml/data/histogram_example.json +11 -11
  408. teradataml/data/hmmdecoder_example.json +78 -78
  409. teradataml/data/hmmevaluator_example.json +24 -24
  410. teradataml/data/hmmsupervised_example.json +10 -10
  411. teradataml/data/hmmunsupervised_example.json +7 -7
  412. teradataml/data/house_values.csv +12 -12
  413. teradataml/data/house_values2.csv +13 -13
  414. teradataml/data/housing_cat.csv +7 -7
  415. teradataml/data/housing_data.csv +9 -9
  416. teradataml/data/housing_test.csv +47 -47
  417. teradataml/data/housing_test_binary.csv +47 -47
  418. teradataml/data/housing_train.csv +493 -493
  419. teradataml/data/housing_train_attribute.csv +4 -4
  420. teradataml/data/housing_train_binary.csv +437 -437
  421. teradataml/data/housing_train_parameter.csv +2 -2
  422. teradataml/data/housing_train_response.csv +493 -493
  423. teradataml/data/ibm_stock.csv +370 -370
  424. teradataml/data/ibm_stock1.csv +370 -370
  425. teradataml/data/identitymatch_example.json +21 -21
  426. teradataml/data/idf_table.csv +4 -4
  427. teradataml/data/impressions.csv +101 -101
  428. teradataml/data/inflation.csv +21 -21
  429. teradataml/data/initial.csv +3 -3
  430. teradataml/data/insect_sprays.csv +12 -12
  431. teradataml/data/insurance.csv +1339 -1339
  432. teradataml/data/interpolator_example.json +12 -12
  433. teradataml/data/iris_altinput.csv +481 -481
  434. teradataml/data/iris_attribute_output.csv +8 -8
  435. teradataml/data/iris_attribute_test.csv +121 -121
  436. teradataml/data/iris_attribute_train.csv +481 -481
  437. teradataml/data/iris_category_expect_predict.csv +31 -31
  438. teradataml/data/iris_data.csv +151 -0
  439. teradataml/data/iris_input.csv +151 -151
  440. teradataml/data/iris_response_train.csv +121 -121
  441. teradataml/data/iris_test.csv +31 -31
  442. teradataml/data/iris_train.csv +121 -121
  443. teradataml/data/join_table1.csv +4 -4
  444. teradataml/data/join_table2.csv +4 -4
  445. teradataml/data/jsons/anly_function_name.json +6 -6
  446. teradataml/data/jsons/byom/dataikupredict.json +147 -147
  447. teradataml/data/jsons/byom/datarobotpredict.json +146 -146
  448. teradataml/data/jsons/byom/h2opredict.json +194 -194
  449. teradataml/data/jsons/byom/onnxpredict.json +186 -186
  450. teradataml/data/jsons/byom/pmmlpredict.json +146 -146
  451. teradataml/data/jsons/paired_functions.json +435 -435
  452. teradataml/data/jsons/sqle/16.20/Antiselect.json +56 -56
  453. teradataml/data/jsons/sqle/16.20/Attribution.json +249 -249
  454. teradataml/data/jsons/sqle/16.20/DecisionForestPredict.json +156 -156
  455. teradataml/data/jsons/sqle/16.20/DecisionTreePredict.json +170 -170
  456. teradataml/data/jsons/sqle/16.20/GLMPredict.json +122 -122
  457. teradataml/data/jsons/sqle/16.20/MovingAverage.json +367 -367
  458. teradataml/data/jsons/sqle/16.20/NGramSplitter.json +239 -239
  459. teradataml/data/jsons/sqle/16.20/NaiveBayesPredict.json +136 -136
  460. teradataml/data/jsons/sqle/16.20/NaiveBayesTextClassifierPredict.json +235 -235
  461. teradataml/data/jsons/sqle/16.20/Pack.json +98 -98
  462. teradataml/data/jsons/sqle/16.20/SVMSparsePredict.json +162 -162
  463. teradataml/data/jsons/sqle/16.20/Sessionize.json +105 -105
  464. teradataml/data/jsons/sqle/16.20/StringSimilarity.json +86 -86
  465. teradataml/data/jsons/sqle/16.20/Unpack.json +166 -166
  466. teradataml/data/jsons/sqle/16.20/nPath.json +269 -269
  467. teradataml/data/jsons/sqle/17.00/Antiselect.json +56 -56
  468. teradataml/data/jsons/sqle/17.00/Attribution.json +249 -249
  469. teradataml/data/jsons/sqle/17.00/DecisionForestPredict.json +156 -156
  470. teradataml/data/jsons/sqle/17.00/DecisionTreePredict.json +170 -170
  471. teradataml/data/jsons/sqle/17.00/GLMPredict.json +122 -122
  472. teradataml/data/jsons/sqle/17.00/MovingAverage.json +367 -367
  473. teradataml/data/jsons/sqle/17.00/NGramSplitter.json +239 -239
  474. teradataml/data/jsons/sqle/17.00/NaiveBayesPredict.json +136 -136
  475. teradataml/data/jsons/sqle/17.00/NaiveBayesTextClassifierPredict.json +235 -235
  476. teradataml/data/jsons/sqle/17.00/Pack.json +98 -98
  477. teradataml/data/jsons/sqle/17.00/SVMSparsePredict.json +162 -162
  478. teradataml/data/jsons/sqle/17.00/Sessionize.json +105 -105
  479. teradataml/data/jsons/sqle/17.00/StringSimilarity.json +86 -86
  480. teradataml/data/jsons/sqle/17.00/Unpack.json +166 -166
  481. teradataml/data/jsons/sqle/17.00/nPath.json +269 -269
  482. teradataml/data/jsons/sqle/17.05/Antiselect.json +56 -56
  483. teradataml/data/jsons/sqle/17.05/Attribution.json +249 -249
  484. teradataml/data/jsons/sqle/17.05/DecisionForestPredict.json +156 -156
  485. teradataml/data/jsons/sqle/17.05/DecisionTreePredict.json +170 -170
  486. teradataml/data/jsons/sqle/17.05/GLMPredict.json +122 -122
  487. teradataml/data/jsons/sqle/17.05/MovingAverage.json +367 -367
  488. teradataml/data/jsons/sqle/17.05/NGramSplitter.json +239 -239
  489. teradataml/data/jsons/sqle/17.05/NaiveBayesPredict.json +136 -136
  490. teradataml/data/jsons/sqle/17.05/NaiveBayesTextClassifierPredict.json +235 -235
  491. teradataml/data/jsons/sqle/17.05/Pack.json +98 -98
  492. teradataml/data/jsons/sqle/17.05/SVMSparsePredict.json +162 -162
  493. teradataml/data/jsons/sqle/17.05/Sessionize.json +105 -105
  494. teradataml/data/jsons/sqle/17.05/StringSimilarity.json +86 -86
  495. teradataml/data/jsons/sqle/17.05/Unpack.json +166 -166
  496. teradataml/data/jsons/sqle/17.05/nPath.json +269 -269
  497. teradataml/data/jsons/sqle/17.10/Antiselect.json +56 -56
  498. teradataml/data/jsons/sqle/17.10/Attribution.json +249 -249
  499. teradataml/data/jsons/sqle/17.10/DecisionForestPredict.json +185 -185
  500. teradataml/data/jsons/sqle/17.10/DecisionTreePredict.json +171 -171
  501. teradataml/data/jsons/sqle/17.10/GLMPredict.json +151 -151
  502. teradataml/data/jsons/sqle/17.10/MovingAverage.json +368 -368
  503. teradataml/data/jsons/sqle/17.10/NGramSplitter.json +239 -239
  504. teradataml/data/jsons/sqle/17.10/NaiveBayesPredict.json +149 -149
  505. teradataml/data/jsons/sqle/17.10/NaiveBayesTextClassifierPredict.json +288 -288
  506. teradataml/data/jsons/sqle/17.10/Pack.json +133 -133
  507. teradataml/data/jsons/sqle/17.10/SVMSparsePredict.json +193 -193
  508. teradataml/data/jsons/sqle/17.10/Sessionize.json +105 -105
  509. teradataml/data/jsons/sqle/17.10/StringSimilarity.json +86 -86
  510. teradataml/data/jsons/sqle/17.10/TD_BinCodeFit.json +239 -239
  511. teradataml/data/jsons/sqle/17.10/TD_BinCodeTransform.json +70 -70
  512. teradataml/data/jsons/sqle/17.10/TD_CategoricalSummary.json +53 -53
  513. teradataml/data/jsons/sqle/17.10/TD_Chisq.json +67 -67
  514. teradataml/data/jsons/sqle/17.10/TD_ColumnSummary.json +53 -53
  515. teradataml/data/jsons/sqle/17.10/TD_ConvertTo.json +68 -68
  516. teradataml/data/jsons/sqle/17.10/TD_FTest.json +187 -187
  517. teradataml/data/jsons/sqle/17.10/TD_FillRowID.json +51 -51
  518. teradataml/data/jsons/sqle/17.10/TD_FunctionFit.json +46 -46
  519. teradataml/data/jsons/sqle/17.10/TD_FunctionTransform.json +72 -71
  520. teradataml/data/jsons/sqle/17.10/TD_GetRowsWithMissingValues.json +52 -52
  521. teradataml/data/jsons/sqle/17.10/TD_GetRowsWithoutMissingValues.json +52 -52
  522. teradataml/data/jsons/sqle/17.10/TD_Histogram.json +132 -132
  523. teradataml/data/jsons/sqle/17.10/TD_NumApply.json +147 -147
  524. teradataml/data/jsons/sqle/17.10/TD_OneHotEncodingFit.json +182 -182
  525. teradataml/data/jsons/sqle/17.10/TD_OneHotEncodingTransform.json +65 -64
  526. teradataml/data/jsons/sqle/17.10/TD_OutlierFilterFit.json +196 -196
  527. teradataml/data/jsons/sqle/17.10/TD_OutlierFilterTransform.json +48 -47
  528. teradataml/data/jsons/sqle/17.10/TD_PolynomialFeaturesFit.json +114 -114
  529. teradataml/data/jsons/sqle/17.10/TD_PolynomialFeaturesTransform.json +72 -71
  530. teradataml/data/jsons/sqle/17.10/TD_QQNorm.json +111 -111
  531. teradataml/data/jsons/sqle/17.10/TD_RoundColumns.json +93 -93
  532. teradataml/data/jsons/sqle/17.10/TD_RowNormalizeFit.json +127 -127
  533. teradataml/data/jsons/sqle/17.10/TD_RowNormalizeTransform.json +70 -69
  534. teradataml/data/jsons/sqle/17.10/TD_ScaleFit.json +156 -156
  535. teradataml/data/jsons/sqle/17.10/TD_ScaleTransform.json +70 -69
  536. teradataml/data/jsons/sqle/17.10/TD_SimpleImputeFit.json +147 -147
  537. teradataml/data/jsons/sqle/17.10/TD_SimpleImputeTransform.json +48 -47
  538. teradataml/data/jsons/sqle/17.10/TD_StrApply.json +240 -240
  539. teradataml/data/jsons/sqle/17.10/TD_UnivariateStatistics.json +118 -118
  540. teradataml/data/jsons/sqle/17.10/TD_WhichMax.json +52 -52
  541. teradataml/data/jsons/sqle/17.10/TD_WhichMin.json +52 -52
  542. teradataml/data/jsons/sqle/17.10/TD_ZTest.json +171 -171
  543. teradataml/data/jsons/sqle/17.10/Unpack.json +188 -188
  544. teradataml/data/jsons/sqle/17.10/nPath.json +269 -269
  545. teradataml/data/jsons/sqle/17.20/Antiselect.json +56 -56
  546. teradataml/data/jsons/sqle/17.20/Attribution.json +249 -249
  547. teradataml/data/jsons/sqle/17.20/DecisionForestPredict.json +185 -185
  548. teradataml/data/jsons/sqle/17.20/DecisionTreePredict.json +172 -172
  549. teradataml/data/jsons/sqle/17.20/GLMPredict.json +151 -151
  550. teradataml/data/jsons/sqle/17.20/MovingAverage.json +367 -367
  551. teradataml/data/jsons/sqle/17.20/NGramSplitter.json +239 -239
  552. teradataml/data/jsons/sqle/17.20/NaiveBayesPredict.json +149 -149
  553. teradataml/data/jsons/sqle/17.20/NaiveBayesTextClassifierPredict.json +287 -287
  554. teradataml/data/jsons/sqle/17.20/Pack.json +133 -133
  555. teradataml/data/jsons/sqle/17.20/SVMSparsePredict.json +192 -192
  556. teradataml/data/jsons/sqle/17.20/Sessionize.json +105 -105
  557. teradataml/data/jsons/sqle/17.20/StringSimilarity.json +86 -86
  558. teradataml/data/jsons/sqle/17.20/TD_ANOVA.json +76 -76
  559. teradataml/data/jsons/sqle/17.20/TD_BinCodeFit.json +239 -239
  560. teradataml/data/jsons/sqle/17.20/TD_BinCodeTransform.json +71 -71
  561. teradataml/data/jsons/sqle/17.20/TD_CategoricalSummary.json +53 -53
  562. teradataml/data/jsons/sqle/17.20/TD_Chisq.json +67 -67
  563. teradataml/data/jsons/sqle/17.20/TD_ClassificationEvaluator.json +145 -145
  564. teradataml/data/jsons/sqle/17.20/TD_ColumnSummary.json +53 -53
  565. teradataml/data/jsons/sqle/17.20/TD_ColumnTransformer.json +218 -218
  566. teradataml/data/jsons/sqle/17.20/TD_ConvertTo.json +92 -92
  567. teradataml/data/jsons/sqle/17.20/TD_DecisionForest.json +259 -259
  568. teradataml/data/jsons/sqle/17.20/TD_DecisionForestPredict.json +139 -139
  569. teradataml/data/jsons/sqle/17.20/TD_FTest.json +186 -186
  570. teradataml/data/jsons/sqle/17.20/TD_FillRowID.json +52 -52
  571. teradataml/data/jsons/sqle/17.20/TD_FunctionFit.json +46 -46
  572. teradataml/data/jsons/sqle/17.20/TD_FunctionTransform.json +72 -72
  573. teradataml/data/jsons/sqle/17.20/TD_GLM.json +431 -431
  574. teradataml/data/jsons/sqle/17.20/TD_GLMPREDICT.json +125 -125
  575. teradataml/data/jsons/sqle/17.20/TD_GLMPerSegment.json +411 -411
  576. teradataml/data/jsons/sqle/17.20/TD_GLMPredictPerSegment.json +146 -146
  577. teradataml/data/jsons/sqle/17.20/TD_GetFutileColumns.json +91 -91
  578. teradataml/data/jsons/sqle/17.20/TD_GetRowsWithMissingValues.json +76 -76
  579. teradataml/data/jsons/sqle/17.20/TD_GetRowsWithoutMissingValues.json +76 -76
  580. teradataml/data/jsons/sqle/17.20/TD_Histogram.json +152 -152
  581. teradataml/data/jsons/sqle/17.20/TD_KMeans.json +211 -211
  582. teradataml/data/jsons/sqle/17.20/TD_KMeansPredict.json +86 -86
  583. teradataml/data/jsons/sqle/17.20/TD_KNN.json +262 -262
  584. teradataml/data/jsons/sqle/17.20/TD_NaiveBayesTextClassifierTrainer.json +137 -137
  585. teradataml/data/jsons/sqle/17.20/TD_NonLinearCombineFit.json +101 -101
  586. teradataml/data/jsons/sqle/17.20/TD_NonLinearCombineTransform.json +71 -71
  587. teradataml/data/jsons/sqle/17.20/TD_NumApply.json +147 -147
  588. teradataml/data/jsons/sqle/17.20/TD_OneClassSVM.json +315 -315
  589. teradataml/data/jsons/sqle/17.20/TD_OneClassSVMPredict.json +123 -123
  590. teradataml/data/jsons/sqle/17.20/TD_OneHotEncodingFit.json +271 -271
  591. teradataml/data/jsons/sqle/17.20/TD_OneHotEncodingTransform.json +65 -65
  592. teradataml/data/jsons/sqle/17.20/TD_OrdinalEncodingFit.json +229 -229
  593. teradataml/data/jsons/sqle/17.20/TD_OrdinalEncodingTransform.json +75 -75
  594. teradataml/data/jsons/sqle/17.20/TD_OutlierFilterFit.json +217 -217
  595. teradataml/data/jsons/sqle/17.20/TD_OutlierFilterTransform.json +48 -48
  596. teradataml/data/jsons/sqle/17.20/TD_PolynomialFeaturesFit.json +114 -114
  597. teradataml/data/jsons/sqle/17.20/TD_PolynomialFeaturesTransform.json +72 -72
  598. teradataml/data/jsons/sqle/17.20/TD_QQNorm.json +111 -111
  599. teradataml/data/jsons/sqle/17.20/TD_ROC.json +177 -177
  600. teradataml/data/jsons/sqle/17.20/TD_RandomProjectionFit.json +178 -178
  601. teradataml/data/jsons/sqle/17.20/TD_RandomProjectionMinComponents.json +73 -73
  602. teradataml/data/jsons/sqle/17.20/TD_RandomProjectionTransform.json +74 -74
  603. teradataml/data/jsons/sqle/17.20/TD_RegressionEvaluator.json +137 -137
  604. teradataml/data/jsons/sqle/17.20/TD_RoundColumns.json +93 -93
  605. teradataml/data/jsons/sqle/17.20/TD_RowNormalizeFit.json +127 -127
  606. teradataml/data/jsons/sqle/17.20/TD_RowNormalizeTransform.json +70 -70
  607. teradataml/data/jsons/sqle/17.20/TD_SVM.json +389 -389
  608. teradataml/data/jsons/sqle/17.20/TD_SVMPredict.json +124 -124
  609. teradataml/data/jsons/sqle/17.20/TD_ScaleFit.json +156 -156
  610. teradataml/data/jsons/sqle/17.20/TD_ScaleTransform.json +70 -70
  611. teradataml/data/jsons/sqle/17.20/TD_SentimentExtractor.json +193 -193
  612. teradataml/data/jsons/sqle/17.20/TD_Silhouette.json +142 -142
  613. teradataml/data/jsons/sqle/17.20/TD_SimpleImputeFit.json +147 -147
  614. teradataml/data/jsons/sqle/17.20/TD_SimpleImputeTransform.json +48 -48
  615. teradataml/data/jsons/sqle/17.20/TD_StrApply.json +240 -240
  616. teradataml/data/jsons/sqle/17.20/TD_TargetEncodingFit.json +248 -248
  617. teradataml/data/jsons/sqle/17.20/TD_TargetEncodingTransform.json +75 -75
  618. teradataml/data/jsons/sqle/17.20/TD_TextParser.json +192 -192
  619. teradataml/data/jsons/sqle/17.20/TD_TrainTestSplit.json +142 -142
  620. teradataml/data/jsons/sqle/17.20/TD_UnivariateStatistics.json +117 -117
  621. teradataml/data/jsons/sqle/17.20/TD_VectorDistance.json +182 -182
  622. teradataml/data/jsons/sqle/17.20/TD_WhichMax.json +52 -52
  623. teradataml/data/jsons/sqle/17.20/TD_WhichMin.json +52 -52
  624. teradataml/data/jsons/sqle/17.20/TD_WordEmbeddings.json +241 -241
  625. teradataml/data/jsons/sqle/17.20/TD_XGBoost.json +312 -312
  626. teradataml/data/jsons/sqle/17.20/TD_XGBoostPredict.json +182 -182
  627. teradataml/data/jsons/sqle/17.20/TD_ZTest.json +170 -170
  628. teradataml/data/jsons/sqle/17.20/Unpack.json +188 -188
  629. teradataml/data/jsons/sqle/17.20/nPath.json +269 -269
  630. teradataml/data/jsons/tableoperator/17.00/read_nos.json +197 -197
  631. teradataml/data/jsons/tableoperator/17.05/read_nos.json +197 -197
  632. teradataml/data/jsons/tableoperator/17.05/write_nos.json +194 -194
  633. teradataml/data/jsons/tableoperator/17.10/read_nos.json +183 -183
  634. teradataml/data/jsons/tableoperator/17.10/write_nos.json +194 -194
  635. teradataml/data/jsons/tableoperator/17.20/read_nos.json +182 -182
  636. teradataml/data/jsons/tableoperator/17.20/write_nos.json +223 -223
  637. teradataml/data/jsons/uaf/17.20/TD_ACF.json +149 -149
  638. teradataml/data/jsons/uaf/17.20/TD_ARIMAESTIMATE.json +409 -409
  639. teradataml/data/jsons/uaf/17.20/TD_ARIMAFORECAST.json +79 -79
  640. teradataml/data/jsons/uaf/17.20/TD_ARIMAVALIDATE.json +151 -151
  641. teradataml/data/jsons/uaf/17.20/TD_BINARYMATRIXOP.json +109 -109
  642. teradataml/data/jsons/uaf/17.20/TD_BINARYSERIESOP.json +107 -107
  643. teradataml/data/jsons/uaf/17.20/TD_BREUSCH_GODFREY.json +87 -87
  644. teradataml/data/jsons/uaf/17.20/TD_BREUSCH_PAGAN_GODFREY.json +106 -106
  645. teradataml/data/jsons/uaf/17.20/TD_CONVOLVE.json +80 -80
  646. teradataml/data/jsons/uaf/17.20/TD_CONVOLVE2.json +67 -67
  647. teradataml/data/jsons/uaf/17.20/TD_CUMUL_PERIODOGRAM.json +91 -91
  648. teradataml/data/jsons/uaf/17.20/TD_DFFT.json +136 -136
  649. teradataml/data/jsons/uaf/17.20/TD_DFFT2.json +148 -148
  650. teradataml/data/jsons/uaf/17.20/TD_DFFT2CONV.json +108 -108
  651. teradataml/data/jsons/uaf/17.20/TD_DFFTCONV.json +109 -109
  652. teradataml/data/jsons/uaf/17.20/TD_DICKEY_FULLER.json +86 -86
  653. teradataml/data/jsons/uaf/17.20/TD_DIFF.json +91 -91
  654. teradataml/data/jsons/uaf/17.20/TD_DTW.json +116 -116
  655. teradataml/data/jsons/uaf/17.20/TD_DURBIN_WATSON.json +100 -100
  656. teradataml/data/jsons/uaf/17.20/TD_EXTRACT_RESULTS.json +38 -38
  657. teradataml/data/jsons/uaf/17.20/TD_FITMETRICS.json +100 -100
  658. teradataml/data/jsons/uaf/17.20/TD_GENSERIES4FORMULA.json +84 -84
  659. teradataml/data/jsons/uaf/17.20/TD_GENSERIES4SINUSOIDS.json +70 -70
  660. teradataml/data/jsons/uaf/17.20/TD_GOLDFELD_QUANDT.json +152 -152
  661. teradataml/data/jsons/uaf/17.20/TD_HOLT_WINTERS_FORECAST.json +313 -313
  662. teradataml/data/jsons/uaf/17.20/TD_IDFFT.json +57 -57
  663. teradataml/data/jsons/uaf/17.20/TD_IDFFT2.json +94 -94
  664. teradataml/data/jsons/uaf/17.20/TD_INPUTVALIDATOR.json +63 -63
  665. teradataml/data/jsons/uaf/17.20/TD_LINEAR_REGR.json +181 -181
  666. teradataml/data/jsons/uaf/17.20/TD_LINESPEC.json +102 -102
  667. teradataml/data/jsons/uaf/17.20/TD_MAMEAN.json +182 -182
  668. teradataml/data/jsons/uaf/17.20/TD_MATRIXMULTIPLY.json +67 -67
  669. teradataml/data/jsons/uaf/17.20/TD_MINFO.json +66 -66
  670. teradataml/data/jsons/uaf/17.20/TD_MULTIVAR_REGR.json +178 -178
  671. teradataml/data/jsons/uaf/17.20/TD_PACF.json +114 -114
  672. teradataml/data/jsons/uaf/17.20/TD_PORTMAN.json +118 -118
  673. teradataml/data/jsons/uaf/17.20/TD_POWERSPEC.json +175 -175
  674. teradataml/data/jsons/uaf/17.20/TD_POWERTRANSFORM.json +97 -97
  675. teradataml/data/jsons/uaf/17.20/TD_RESAMPLE.json +173 -173
  676. teradataml/data/jsons/uaf/17.20/TD_SEASONALNORMALIZE.json +136 -136
  677. teradataml/data/jsons/uaf/17.20/TD_SELECTION_CRITERIA.json +89 -89
  678. teradataml/data/jsons/uaf/17.20/TD_SIGNIF_PERIODICITIES.json +79 -79
  679. teradataml/data/jsons/uaf/17.20/TD_SIGNIF_RESIDMEAN.json +67 -67
  680. teradataml/data/jsons/uaf/17.20/TD_SIMPLEEXP.json +184 -184
  681. teradataml/data/jsons/uaf/17.20/TD_SINFO.json +57 -57
  682. teradataml/data/jsons/uaf/17.20/TD_SMOOTHMA.json +162 -162
  683. teradataml/data/jsons/uaf/17.20/TD_TRACKINGOP.json +100 -100
  684. teradataml/data/jsons/uaf/17.20/TD_UNDIFF.json +111 -111
  685. teradataml/data/jsons/uaf/17.20/TD_UNNORMALIZE.json +95 -95
  686. teradataml/data/jsons/uaf/17.20/TD_WHITES_GENERAL.json +77 -77
  687. teradataml/data/kmeans_example.json +17 -17
  688. teradataml/data/kmeans_us_arrests_data.csv +0 -0
  689. teradataml/data/knn_example.json +18 -18
  690. teradataml/data/knnrecommender_example.json +6 -6
  691. teradataml/data/knnrecommenderpredict_example.json +12 -12
  692. teradataml/data/lar_example.json +17 -17
  693. teradataml/data/larpredict_example.json +30 -30
  694. teradataml/data/lc_new_predictors.csv +5 -5
  695. teradataml/data/lc_new_reference.csv +9 -9
  696. teradataml/data/lda_example.json +8 -8
  697. teradataml/data/ldainference_example.json +14 -14
  698. teradataml/data/ldatopicsummary_example.json +8 -8
  699. teradataml/data/levendist_input.csv +13 -13
  700. teradataml/data/levenshteindistance_example.json +10 -10
  701. teradataml/data/linreg_example.json +9 -9
  702. teradataml/data/load_example_data.py +326 -323
  703. teradataml/data/loan_prediction.csv +295 -295
  704. teradataml/data/lungcancer.csv +138 -138
  705. teradataml/data/mappingdata.csv +12 -12
  706. teradataml/data/milk_timeseries.csv +157 -157
  707. teradataml/data/min_max_titanic.csv +4 -4
  708. teradataml/data/minhash_example.json +6 -6
  709. teradataml/data/ml_ratings.csv +7547 -7547
  710. teradataml/data/ml_ratings_10.csv +2445 -2445
  711. teradataml/data/model1_table.csv +5 -5
  712. teradataml/data/model2_table.csv +5 -5
  713. teradataml/data/models/iris_db_glm_model.pmml +56 -56
  714. teradataml/data/models/iris_db_xgb_model.pmml +4471 -4471
  715. teradataml/data/modularity_example.json +12 -12
  716. teradataml/data/movavg_example.json +7 -7
  717. teradataml/data/mtx1.csv +7 -7
  718. teradataml/data/mtx2.csv +13 -13
  719. teradataml/data/multi_model_classification.csv +401 -0
  720. teradataml/data/multi_model_regression.csv +401 -0
  721. teradataml/data/mvdfft8.csv +9 -9
  722. teradataml/data/naivebayes_example.json +9 -9
  723. teradataml/data/naivebayespredict_example.json +19 -19
  724. teradataml/data/naivebayestextclassifier2_example.json +6 -6
  725. teradataml/data/naivebayestextclassifier_example.json +8 -8
  726. teradataml/data/naivebayestextclassifierpredict_example.json +20 -20
  727. teradataml/data/name_Find_configure.csv +10 -10
  728. teradataml/data/namedentityfinder_example.json +14 -14
  729. teradataml/data/namedentityfinderevaluator_example.json +10 -10
  730. teradataml/data/namedentityfindertrainer_example.json +6 -6
  731. teradataml/data/nb_iris_input_test.csv +31 -31
  732. teradataml/data/nb_iris_input_train.csv +121 -121
  733. teradataml/data/nbp_iris_model.csv +13 -13
  734. teradataml/data/ner_extractor_text.csv +2 -2
  735. teradataml/data/ner_sports_test2.csv +29 -29
  736. teradataml/data/ner_sports_train.csv +501 -501
  737. teradataml/data/nerevaluator_example.json +5 -5
  738. teradataml/data/nerextractor_example.json +18 -18
  739. teradataml/data/nermem_sports_test.csv +17 -17
  740. teradataml/data/nermem_sports_train.csv +50 -50
  741. teradataml/data/nertrainer_example.json +6 -6
  742. teradataml/data/ngrams_example.json +6 -6
  743. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Aggregate Functions using SQLAlchemy.ipynb +1455 -1455
  744. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Arithmetic Functions Using SQLAlchemy.ipynb +1993 -1993
  745. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Bit-Byte Manipulation Functions using SQLAlchemy.ipynb +1492 -1492
  746. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Built-in functions using SQLAlchemy.ipynb +536 -536
  747. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Regular Expressions Using SQLAlchemy.ipynb +570 -570
  748. teradataml/data/notebooks/sqlalchemy/Teradata Vantage String Functions Using SQLAlchemy.ipynb +2559 -2559
  749. teradataml/data/notebooks/sqlalchemy/Teradata Vantage Window Aggregate Functions using SQLAlchemy.ipynb +2911 -2911
  750. teradataml/data/notebooks/sqlalchemy/Using Generic SQLAlchemy ClauseElements teradataml DataFrame assign method.ipynb +698 -698
  751. teradataml/data/notebooks/sqlalchemy/teradataml filtering using SQLAlchemy ClauseElements.ipynb +784 -784
  752. teradataml/data/npath_example.json +23 -23
  753. teradataml/data/ntree_example.json +14 -14
  754. teradataml/data/numeric_strings.csv +4 -4
  755. teradataml/data/numerics.csv +4 -4
  756. teradataml/data/ocean_buoy.csv +17 -17
  757. teradataml/data/ocean_buoy2.csv +17 -17
  758. teradataml/data/ocean_buoys.csv +27 -27
  759. teradataml/data/ocean_buoys2.csv +10 -10
  760. teradataml/data/ocean_buoys_nonpti.csv +28 -28
  761. teradataml/data/ocean_buoys_seq.csv +29 -29
  762. teradataml/data/openml_example.json +63 -0
  763. teradataml/data/optional_event_table.csv +4 -4
  764. teradataml/data/orders1.csv +11 -11
  765. teradataml/data/orders1_12.csv +12 -12
  766. teradataml/data/orders_ex.csv +4 -4
  767. teradataml/data/pack_example.json +8 -8
  768. teradataml/data/package_tracking.csv +19 -19
  769. teradataml/data/package_tracking_pti.csv +18 -18
  770. teradataml/data/pagerank_example.json +13 -13
  771. teradataml/data/paragraphs_input.csv +6 -6
  772. teradataml/data/pathanalyzer_example.json +7 -7
  773. teradataml/data/pathgenerator_example.json +7 -7
  774. teradataml/data/phrases.csv +7 -7
  775. teradataml/data/pivot_example.json +8 -8
  776. teradataml/data/pivot_input.csv +22 -22
  777. teradataml/data/playerRating.csv +31 -31
  778. teradataml/data/postagger_example.json +6 -6
  779. teradataml/data/posttagger_output.csv +44 -44
  780. teradataml/data/production_data.csv +16 -16
  781. teradataml/data/production_data2.csv +7 -7
  782. teradataml/data/randomsample_example.json +31 -31
  783. teradataml/data/randomwalksample_example.json +8 -8
  784. teradataml/data/rank_table.csv +6 -6
  785. teradataml/data/ref_mobile_data.csv +4 -4
  786. teradataml/data/ref_mobile_data_dense.csv +2 -2
  787. teradataml/data/ref_url.csv +17 -17
  788. teradataml/data/restaurant_reviews.csv +7 -7
  789. teradataml/data/river_data.csv +145 -145
  790. teradataml/data/roc_example.json +7 -7
  791. teradataml/data/roc_input.csv +101 -101
  792. teradataml/data/rule_inputs.csv +6 -6
  793. teradataml/data/rule_table.csv +2 -2
  794. teradataml/data/sales.csv +7 -7
  795. teradataml/data/sales_transaction.csv +501 -501
  796. teradataml/data/salesdata.csv +342 -342
  797. teradataml/data/sample_cities.csv +2 -2
  798. teradataml/data/sample_shapes.csv +10 -10
  799. teradataml/data/sample_streets.csv +2 -2
  800. teradataml/data/sampling_example.json +15 -15
  801. teradataml/data/sax_example.json +8 -8
  802. teradataml/data/scale_example.json +23 -23
  803. teradataml/data/scale_housing.csv +11 -11
  804. teradataml/data/scale_housing_test.csv +6 -6
  805. teradataml/data/scale_stat.csv +11 -11
  806. teradataml/data/scalebypartition_example.json +13 -13
  807. teradataml/data/scalemap_example.json +13 -13
  808. teradataml/data/scalesummary_example.json +12 -12
  809. teradataml/data/score_category.csv +101 -101
  810. teradataml/data/score_summary.csv +4 -4
  811. teradataml/data/script_example.json +9 -9
  812. teradataml/data/scripts/deploy_script.py +65 -0
  813. teradataml/data/scripts/mapper.R +20 -0
  814. teradataml/data/scripts/mapper.py +15 -15
  815. teradataml/data/scripts/mapper_replace.py +15 -15
  816. teradataml/data/scripts/sklearn/__init__.py +0 -0
  817. teradataml/data/scripts/sklearn/sklearn_fit.py +175 -0
  818. teradataml/data/scripts/sklearn/sklearn_fit_predict.py +135 -0
  819. teradataml/data/scripts/sklearn/sklearn_function.template +113 -0
  820. teradataml/data/scripts/sklearn/sklearn_model_selection_split.py +158 -0
  821. teradataml/data/scripts/sklearn/sklearn_neighbors.py +152 -0
  822. teradataml/data/scripts/sklearn/sklearn_score.py +128 -0
  823. teradataml/data/scripts/sklearn/sklearn_transform.py +179 -0
  824. teradataml/data/seeds.csv +10 -10
  825. teradataml/data/sentenceextractor_example.json +6 -6
  826. teradataml/data/sentiment_extract_input.csv +11 -11
  827. teradataml/data/sentiment_train.csv +16 -16
  828. teradataml/data/sentiment_word.csv +20 -20
  829. teradataml/data/sentiment_word_input.csv +19 -19
  830. teradataml/data/sentimentextractor_example.json +24 -24
  831. teradataml/data/sentimenttrainer_example.json +8 -8
  832. teradataml/data/sequence_table.csv +10 -10
  833. teradataml/data/seriessplitter_example.json +7 -7
  834. teradataml/data/sessionize_example.json +17 -17
  835. teradataml/data/sessionize_table.csv +116 -116
  836. teradataml/data/setop_test1.csv +24 -24
  837. teradataml/data/setop_test2.csv +22 -22
  838. teradataml/data/soc_nw_edges.csv +10 -10
  839. teradataml/data/soc_nw_vertices.csv +7 -7
  840. teradataml/data/souvenir_timeseries.csv +167 -167
  841. teradataml/data/sparse_iris_attribute.csv +5 -5
  842. teradataml/data/sparse_iris_test.csv +121 -121
  843. teradataml/data/sparse_iris_train.csv +601 -601
  844. teradataml/data/star1.csv +6 -6
  845. teradataml/data/state_transition.csv +5 -5
  846. teradataml/data/stock_data.csv +53 -53
  847. teradataml/data/stock_movement.csv +11 -11
  848. teradataml/data/stock_vol.csv +76 -76
  849. teradataml/data/stop_words.csv +8 -8
  850. teradataml/data/store_sales.csv +37 -37
  851. teradataml/data/stringsimilarity_example.json +7 -7
  852. teradataml/data/strsimilarity_input.csv +13 -13
  853. teradataml/data/students.csv +101 -101
  854. teradataml/data/svm_iris_input_test.csv +121 -121
  855. teradataml/data/svm_iris_input_train.csv +481 -481
  856. teradataml/data/svm_iris_model.csv +7 -7
  857. teradataml/data/svmdense_example.json +9 -9
  858. teradataml/data/svmdensepredict_example.json +18 -18
  859. teradataml/data/svmsparse_example.json +7 -7
  860. teradataml/data/svmsparsepredict_example.json +13 -13
  861. teradataml/data/svmsparsesummary_example.json +7 -7
  862. teradataml/data/target_mobile_data.csv +13 -13
  863. teradataml/data/target_mobile_data_dense.csv +5 -5
  864. teradataml/data/templatedata.csv +1201 -1201
  865. teradataml/data/templates/open_source_ml.json +9 -0
  866. teradataml/data/teradataml_example.json +73 -1
  867. teradataml/data/test_classification.csv +101 -0
  868. teradataml/data/test_loan_prediction.csv +53 -53
  869. teradataml/data/test_pacf_12.csv +37 -37
  870. teradataml/data/test_prediction.csv +101 -0
  871. teradataml/data/test_regression.csv +101 -0
  872. teradataml/data/test_river2.csv +109 -109
  873. teradataml/data/text_inputs.csv +6 -6
  874. teradataml/data/textchunker_example.json +7 -7
  875. teradataml/data/textclassifier_example.json +6 -6
  876. teradataml/data/textclassifier_input.csv +7 -7
  877. teradataml/data/textclassifiertrainer_example.json +6 -6
  878. teradataml/data/textmorph_example.json +5 -5
  879. teradataml/data/textparser_example.json +15 -15
  880. teradataml/data/texttagger_example.json +11 -11
  881. teradataml/data/texttokenizer_example.json +6 -6
  882. teradataml/data/texttrainer_input.csv +11 -11
  883. teradataml/data/tf_example.json +6 -6
  884. teradataml/data/tfidf_example.json +13 -13
  885. teradataml/data/tfidf_input1.csv +201 -201
  886. teradataml/data/tfidf_train.csv +6 -6
  887. teradataml/data/time_table1.csv +535 -535
  888. teradataml/data/time_table2.csv +14 -14
  889. teradataml/data/timeseriesdata.csv +1601 -1601
  890. teradataml/data/timeseriesdatasetsd4.csv +105 -105
  891. teradataml/data/titanic.csv +892 -892
  892. teradataml/data/token_table.csv +696 -696
  893. teradataml/data/train_multiclass.csv +101 -0
  894. teradataml/data/train_regression.csv +101 -0
  895. teradataml/data/train_regression_multiple_labels.csv +101 -0
  896. teradataml/data/train_tracking.csv +27 -27
  897. teradataml/data/transformation_table.csv +5 -5
  898. teradataml/data/transformation_table_new.csv +1 -1
  899. teradataml/data/tv_spots.csv +16 -16
  900. teradataml/data/twod_climate_data.csv +117 -117
  901. teradataml/data/uaf_example.json +475 -475
  902. teradataml/data/univariatestatistics_example.json +8 -8
  903. teradataml/data/unpack_example.json +9 -9
  904. teradataml/data/unpivot_example.json +9 -9
  905. teradataml/data/unpivot_input.csv +8 -8
  906. teradataml/data/us_air_pass.csv +36 -36
  907. teradataml/data/us_population.csv +624 -624
  908. teradataml/data/us_states_shapes.csv +52 -52
  909. teradataml/data/varmax_example.json +17 -17
  910. teradataml/data/vectordistance_example.json +25 -25
  911. teradataml/data/ville_climatedata.csv +121 -121
  912. teradataml/data/ville_tempdata.csv +12 -12
  913. teradataml/data/ville_tempdata1.csv +12 -12
  914. teradataml/data/ville_temperature.csv +11 -11
  915. teradataml/data/waveletTable.csv +1605 -1605
  916. teradataml/data/waveletTable2.csv +1605 -1605
  917. teradataml/data/weightedmovavg_example.json +8 -8
  918. teradataml/data/wft_testing.csv +5 -5
  919. teradataml/data/wine_data.csv +1600 -0
  920. teradataml/data/word_embed_input_table1.csv +5 -5
  921. teradataml/data/word_embed_input_table2.csv +4 -4
  922. teradataml/data/word_embed_model.csv +22 -22
  923. teradataml/data/words_input.csv +13 -13
  924. teradataml/data/xconvolve_complex_left.csv +6 -6
  925. teradataml/data/xconvolve_complex_leftmulti.csv +6 -6
  926. teradataml/data/xgboost_example.json +35 -35
  927. teradataml/data/xgboostpredict_example.json +31 -31
  928. teradataml/dataframe/copy_to.py +1764 -1698
  929. teradataml/dataframe/data_transfer.py +2753 -2745
  930. teradataml/dataframe/dataframe.py +17545 -16946
  931. teradataml/dataframe/dataframe_utils.py +1837 -1740
  932. teradataml/dataframe/fastload.py +611 -603
  933. teradataml/dataframe/indexer.py +424 -424
  934. teradataml/dataframe/setop.py +1179 -1166
  935. teradataml/dataframe/sql.py +10090 -6432
  936. teradataml/dataframe/sql_function_parameters.py +439 -388
  937. teradataml/dataframe/sql_functions.py +652 -652
  938. teradataml/dataframe/sql_interfaces.py +220 -220
  939. teradataml/dataframe/vantage_function_types.py +674 -630
  940. teradataml/dataframe/window.py +693 -692
  941. teradataml/dbutils/__init__.py +3 -3
  942. teradataml/dbutils/dbutils.py +1167 -1150
  943. teradataml/dbutils/filemgr.py +267 -267
  944. teradataml/gen_ai/__init__.py +2 -2
  945. teradataml/gen_ai/convAI.py +472 -472
  946. teradataml/geospatial/__init__.py +3 -3
  947. teradataml/geospatial/geodataframe.py +1105 -1094
  948. teradataml/geospatial/geodataframecolumn.py +392 -387
  949. teradataml/geospatial/geometry_types.py +925 -925
  950. teradataml/hyperparameter_tuner/__init__.py +1 -1
  951. teradataml/hyperparameter_tuner/optimizer.py +3783 -2993
  952. teradataml/hyperparameter_tuner/utils.py +281 -187
  953. teradataml/lib/aed_0_1.dll +0 -0
  954. teradataml/lib/libaed_0_1.dylib +0 -0
  955. teradataml/lib/libaed_0_1.so +0 -0
  956. teradataml/libaed_0_1.dylib +0 -0
  957. teradataml/libaed_0_1.so +0 -0
  958. teradataml/opensource/__init__.py +1 -0
  959. teradataml/opensource/sklearn/__init__.py +1 -0
  960. teradataml/opensource/sklearn/_class.py +255 -0
  961. teradataml/opensource/sklearn/_sklearn_wrapper.py +1668 -0
  962. teradataml/opensource/sklearn/_wrapper_utils.py +268 -0
  963. teradataml/opensource/sklearn/constants.py +54 -0
  964. teradataml/options/__init__.py +121 -124
  965. teradataml/options/configure.py +337 -336
  966. teradataml/options/display.py +176 -176
  967. teradataml/plot/__init__.py +2 -2
  968. teradataml/plot/axis.py +1388 -1388
  969. teradataml/plot/constants.py +15 -15
  970. teradataml/plot/figure.py +398 -398
  971. teradataml/plot/plot.py +760 -760
  972. teradataml/plot/query_generator.py +83 -83
  973. teradataml/plot/subplot.py +216 -216
  974. teradataml/scriptmgmt/UserEnv.py +3788 -3761
  975. teradataml/scriptmgmt/__init__.py +3 -3
  976. teradataml/scriptmgmt/lls_utils.py +1616 -1604
  977. teradataml/series/series.py +532 -532
  978. teradataml/series/series_utils.py +71 -71
  979. teradataml/table_operators/Apply.py +949 -917
  980. teradataml/table_operators/Script.py +1719 -1982
  981. teradataml/table_operators/TableOperator.py +1207 -1616
  982. teradataml/table_operators/__init__.py +2 -3
  983. teradataml/table_operators/apply_query_generator.py +262 -262
  984. teradataml/table_operators/query_generator.py +507 -507
  985. teradataml/table_operators/table_operator_query_generator.py +460 -460
  986. teradataml/table_operators/table_operator_util.py +631 -639
  987. teradataml/table_operators/templates/dataframe_apply.template +184 -184
  988. teradataml/table_operators/templates/dataframe_map.template +176 -176
  989. teradataml/table_operators/templates/script_executor.template +170 -170
  990. teradataml/utils/dtypes.py +684 -684
  991. teradataml/utils/internal_buffer.py +84 -84
  992. teradataml/utils/print_versions.py +205 -205
  993. teradataml/utils/utils.py +410 -410
  994. teradataml/utils/validators.py +2239 -2115
  995. {teradataml-17.20.0.7.dist-info → teradataml-20.0.0.0.dist-info}/METADATA +270 -41
  996. teradataml-20.0.0.0.dist-info/RECORD +1038 -0
  997. {teradataml-17.20.0.7.dist-info → teradataml-20.0.0.0.dist-info}/WHEEL +1 -1
  998. {teradataml-17.20.0.7.dist-info → teradataml-20.0.0.0.dist-info}/zip-safe +1 -1
  999. teradataml/analytics/mle/AdaBoost.py +0 -651
  1000. teradataml/analytics/mle/AdaBoostPredict.py +0 -564
  1001. teradataml/analytics/mle/Antiselect.py +0 -342
  1002. teradataml/analytics/mle/Arima.py +0 -641
  1003. teradataml/analytics/mle/ArimaPredict.py +0 -477
  1004. teradataml/analytics/mle/Attribution.py +0 -1070
  1005. teradataml/analytics/mle/Betweenness.py +0 -658
  1006. teradataml/analytics/mle/Burst.py +0 -711
  1007. teradataml/analytics/mle/CCM.py +0 -600
  1008. teradataml/analytics/mle/CCMPrepare.py +0 -324
  1009. teradataml/analytics/mle/CFilter.py +0 -460
  1010. teradataml/analytics/mle/ChangePointDetection.py +0 -572
  1011. teradataml/analytics/mle/ChangePointDetectionRT.py +0 -477
  1012. teradataml/analytics/mle/Closeness.py +0 -737
  1013. teradataml/analytics/mle/ConfusionMatrix.py +0 -420
  1014. teradataml/analytics/mle/Correlation.py +0 -477
  1015. teradataml/analytics/mle/Correlation2.py +0 -573
  1016. teradataml/analytics/mle/CoxHazardRatio.py +0 -679
  1017. teradataml/analytics/mle/CoxPH.py +0 -556
  1018. teradataml/analytics/mle/CoxSurvival.py +0 -478
  1019. teradataml/analytics/mle/CumulativeMovAvg.py +0 -363
  1020. teradataml/analytics/mle/DTW.py +0 -623
  1021. teradataml/analytics/mle/DWT.py +0 -564
  1022. teradataml/analytics/mle/DWT2D.py +0 -599
  1023. teradataml/analytics/mle/DecisionForest.py +0 -716
  1024. teradataml/analytics/mle/DecisionForestEvaluator.py +0 -363
  1025. teradataml/analytics/mle/DecisionForestPredict.py +0 -561
  1026. teradataml/analytics/mle/DecisionTree.py +0 -830
  1027. teradataml/analytics/mle/DecisionTreePredict.py +0 -528
  1028. teradataml/analytics/mle/ExponentialMovAvg.py +0 -418
  1029. teradataml/analytics/mle/FMeasure.py +0 -402
  1030. teradataml/analytics/mle/FPGrowth.py +0 -734
  1031. teradataml/analytics/mle/FrequentPaths.py +0 -695
  1032. teradataml/analytics/mle/GLM.py +0 -558
  1033. teradataml/analytics/mle/GLML1L2.py +0 -547
  1034. teradataml/analytics/mle/GLML1L2Predict.py +0 -519
  1035. teradataml/analytics/mle/GLMPredict.py +0 -529
  1036. teradataml/analytics/mle/HMMDecoder.py +0 -945
  1037. teradataml/analytics/mle/HMMEvaluator.py +0 -901
  1038. teradataml/analytics/mle/HMMSupervised.py +0 -521
  1039. teradataml/analytics/mle/HMMUnsupervised.py +0 -572
  1040. teradataml/analytics/mle/Histogram.py +0 -561
  1041. teradataml/analytics/mle/IDWT.py +0 -476
  1042. teradataml/analytics/mle/IDWT2D.py +0 -493
  1043. teradataml/analytics/mle/IdentityMatch.py +0 -763
  1044. teradataml/analytics/mle/Interpolator.py +0 -918
  1045. teradataml/analytics/mle/KMeans.py +0 -485
  1046. teradataml/analytics/mle/KNN.py +0 -627
  1047. teradataml/analytics/mle/KNNRecommender.py +0 -488
  1048. teradataml/analytics/mle/KNNRecommenderPredict.py +0 -581
  1049. teradataml/analytics/mle/LAR.py +0 -439
  1050. teradataml/analytics/mle/LARPredict.py +0 -478
  1051. teradataml/analytics/mle/LDA.py +0 -548
  1052. teradataml/analytics/mle/LDAInference.py +0 -492
  1053. teradataml/analytics/mle/LDATopicSummary.py +0 -464
  1054. teradataml/analytics/mle/LevenshteinDistance.py +0 -450
  1055. teradataml/analytics/mle/LinReg.py +0 -433
  1056. teradataml/analytics/mle/LinRegPredict.py +0 -438
  1057. teradataml/analytics/mle/MinHash.py +0 -544
  1058. teradataml/analytics/mle/Modularity.py +0 -587
  1059. teradataml/analytics/mle/NEREvaluator.py +0 -410
  1060. teradataml/analytics/mle/NERExtractor.py +0 -595
  1061. teradataml/analytics/mle/NERTrainer.py +0 -458
  1062. teradataml/analytics/mle/NGrams.py +0 -570
  1063. teradataml/analytics/mle/NPath.py +0 -634
  1064. teradataml/analytics/mle/NTree.py +0 -549
  1065. teradataml/analytics/mle/NaiveBayes.py +0 -462
  1066. teradataml/analytics/mle/NaiveBayesPredict.py +0 -513
  1067. teradataml/analytics/mle/NaiveBayesTextClassifier.py +0 -607
  1068. teradataml/analytics/mle/NaiveBayesTextClassifier2.py +0 -531
  1069. teradataml/analytics/mle/NaiveBayesTextClassifierPredict.py +0 -799
  1070. teradataml/analytics/mle/NamedEntityFinder.py +0 -529
  1071. teradataml/analytics/mle/NamedEntityFinderEvaluator.py +0 -414
  1072. teradataml/analytics/mle/NamedEntityFinderTrainer.py +0 -396
  1073. teradataml/analytics/mle/POSTagger.py +0 -417
  1074. teradataml/analytics/mle/Pack.py +0 -411
  1075. teradataml/analytics/mle/PageRank.py +0 -535
  1076. teradataml/analytics/mle/PathAnalyzer.py +0 -426
  1077. teradataml/analytics/mle/PathGenerator.py +0 -367
  1078. teradataml/analytics/mle/PathStart.py +0 -464
  1079. teradataml/analytics/mle/PathSummarizer.py +0 -470
  1080. teradataml/analytics/mle/Pivot.py +0 -471
  1081. teradataml/analytics/mle/ROC.py +0 -425
  1082. teradataml/analytics/mle/RandomSample.py +0 -637
  1083. teradataml/analytics/mle/RandomWalkSample.py +0 -490
  1084. teradataml/analytics/mle/SAX.py +0 -779
  1085. teradataml/analytics/mle/SVMDense.py +0 -677
  1086. teradataml/analytics/mle/SVMDensePredict.py +0 -536
  1087. teradataml/analytics/mle/SVMDenseSummary.py +0 -437
  1088. teradataml/analytics/mle/SVMSparse.py +0 -557
  1089. teradataml/analytics/mle/SVMSparsePredict.py +0 -553
  1090. teradataml/analytics/mle/SVMSparseSummary.py +0 -435
  1091. teradataml/analytics/mle/Sampling.py +0 -549
  1092. teradataml/analytics/mle/Scale.py +0 -565
  1093. teradataml/analytics/mle/ScaleByPartition.py +0 -496
  1094. teradataml/analytics/mle/ScaleMap.py +0 -378
  1095. teradataml/analytics/mle/ScaleSummary.py +0 -320
  1096. teradataml/analytics/mle/SentenceExtractor.py +0 -363
  1097. teradataml/analytics/mle/SentimentEvaluator.py +0 -432
  1098. teradataml/analytics/mle/SentimentExtractor.py +0 -578
  1099. teradataml/analytics/mle/SentimentTrainer.py +0 -405
  1100. teradataml/analytics/mle/SeriesSplitter.py +0 -641
  1101. teradataml/analytics/mle/Sessionize.py +0 -475
  1102. teradataml/analytics/mle/SimpleMovAvg.py +0 -397
  1103. teradataml/analytics/mle/StringSimilarity.py +0 -425
  1104. teradataml/analytics/mle/TF.py +0 -389
  1105. teradataml/analytics/mle/TFIDF.py +0 -504
  1106. teradataml/analytics/mle/TextChunker.py +0 -414
  1107. teradataml/analytics/mle/TextClassifier.py +0 -399
  1108. teradataml/analytics/mle/TextClassifierEvaluator.py +0 -413
  1109. teradataml/analytics/mle/TextClassifierTrainer.py +0 -565
  1110. teradataml/analytics/mle/TextMorph.py +0 -494
  1111. teradataml/analytics/mle/TextParser.py +0 -623
  1112. teradataml/analytics/mle/TextTagger.py +0 -530
  1113. teradataml/analytics/mle/TextTokenizer.py +0 -502
  1114. teradataml/analytics/mle/UnivariateStatistics.py +0 -488
  1115. teradataml/analytics/mle/Unpack.py +0 -526
  1116. teradataml/analytics/mle/Unpivot.py +0 -438
  1117. teradataml/analytics/mle/VarMax.py +0 -776
  1118. teradataml/analytics/mle/VectorDistance.py +0 -762
  1119. teradataml/analytics/mle/WeightedMovAvg.py +0 -400
  1120. teradataml/analytics/mle/XGBoost.py +0 -842
  1121. teradataml/analytics/mle/XGBoostPredict.py +0 -627
  1122. teradataml/analytics/mle/__init__.py +0 -123
  1123. teradataml/analytics/mle/json/adaboost_mle.json +0 -135
  1124. teradataml/analytics/mle/json/adaboostpredict_mle.json +0 -85
  1125. teradataml/analytics/mle/json/antiselect_mle.json +0 -34
  1126. teradataml/analytics/mle/json/antiselect_mle_mle.json +0 -34
  1127. teradataml/analytics/mle/json/arima_mle.json +0 -172
  1128. teradataml/analytics/mle/json/arimapredict_mle.json +0 -52
  1129. teradataml/analytics/mle/json/attribution_mle_mle.json +0 -143
  1130. teradataml/analytics/mle/json/betweenness_mle.json +0 -97
  1131. teradataml/analytics/mle/json/burst_mle.json +0 -140
  1132. teradataml/analytics/mle/json/ccm_mle.json +0 -124
  1133. teradataml/analytics/mle/json/ccmprepare_mle.json +0 -14
  1134. teradataml/analytics/mle/json/cfilter_mle.json +0 -93
  1135. teradataml/analytics/mle/json/changepointdetection_mle.json +0 -92
  1136. teradataml/analytics/mle/json/changepointdetectionrt_mle.json +0 -78
  1137. teradataml/analytics/mle/json/closeness_mle.json +0 -104
  1138. teradataml/analytics/mle/json/confusionmatrix_mle.json +0 -79
  1139. teradataml/analytics/mle/json/correlation_mle.json +0 -86
  1140. teradataml/analytics/mle/json/correlationreduce_mle.json +0 -49
  1141. teradataml/analytics/mle/json/coxhazardratio_mle.json +0 -89
  1142. teradataml/analytics/mle/json/coxph_mle.json +0 -98
  1143. teradataml/analytics/mle/json/coxsurvival_mle.json +0 -79
  1144. teradataml/analytics/mle/json/cumulativemovavg_mle.json +0 -34
  1145. teradataml/analytics/mle/json/decisionforest_mle.json +0 -167
  1146. teradataml/analytics/mle/json/decisionforestevaluator_mle.json +0 -33
  1147. teradataml/analytics/mle/json/decisionforestpredict_mle_mle.json +0 -74
  1148. teradataml/analytics/mle/json/decisiontree_mle.json +0 -194
  1149. teradataml/analytics/mle/json/decisiontreepredict_mle_mle.json +0 -86
  1150. teradataml/analytics/mle/json/dtw_mle.json +0 -97
  1151. teradataml/analytics/mle/json/dwt2d_mle.json +0 -116
  1152. teradataml/analytics/mle/json/dwt_mle.json +0 -101
  1153. teradataml/analytics/mle/json/exponentialmovavg_mle.json +0 -55
  1154. teradataml/analytics/mle/json/fmeasure_mle.json +0 -58
  1155. teradataml/analytics/mle/json/fpgrowth_mle.json +0 -159
  1156. teradataml/analytics/mle/json/frequentpaths_mle.json +0 -129
  1157. teradataml/analytics/mle/json/glm_mle.json +0 -111
  1158. teradataml/analytics/mle/json/glml1l2_mle.json +0 -106
  1159. teradataml/analytics/mle/json/glml1l2predict_mle.json +0 -57
  1160. teradataml/analytics/mle/json/glmpredict_mle_mle.json +0 -74
  1161. teradataml/analytics/mle/json/histogram_mle.json +0 -100
  1162. teradataml/analytics/mle/json/hmmdecoder_mle.json +0 -192
  1163. teradataml/analytics/mle/json/hmmevaluator_mle.json +0 -206
  1164. teradataml/analytics/mle/json/hmmsupervised_mle.json +0 -91
  1165. teradataml/analytics/mle/json/hmmunsupervised_mle.json +0 -114
  1166. teradataml/analytics/mle/json/identitymatch_mle.json +0 -88
  1167. teradataml/analytics/mle/json/idwt2d_mle.json +0 -73
  1168. teradataml/analytics/mle/json/idwt_mle.json +0 -66
  1169. teradataml/analytics/mle/json/interpolator_mle.json +0 -151
  1170. teradataml/analytics/mle/json/kmeans_mle.json +0 -97
  1171. teradataml/analytics/mle/json/knn_mle.json +0 -141
  1172. teradataml/analytics/mle/json/knnrecommender_mle.json +0 -111
  1173. teradataml/analytics/mle/json/knnrecommenderpredict_mle.json +0 -75
  1174. teradataml/analytics/mle/json/lar_mle.json +0 -78
  1175. teradataml/analytics/mle/json/larpredict_mle.json +0 -69
  1176. teradataml/analytics/mle/json/lda_mle.json +0 -130
  1177. teradataml/analytics/mle/json/ldainference_mle.json +0 -78
  1178. teradataml/analytics/mle/json/ldatopicsummary_mle.json +0 -64
  1179. teradataml/analytics/mle/json/levenshteindistance_mle.json +0 -92
  1180. teradataml/analytics/mle/json/linreg_mle.json +0 -42
  1181. teradataml/analytics/mle/json/linregpredict_mle.json +0 -56
  1182. teradataml/analytics/mle/json/minhash_mle.json +0 -113
  1183. teradataml/analytics/mle/json/modularity_mle.json +0 -91
  1184. teradataml/analytics/mle/json/naivebayespredict_mle_mle.json +0 -85
  1185. teradataml/analytics/mle/json/naivebayesreduce_mle.json +0 -52
  1186. teradataml/analytics/mle/json/naivebayestextclassifierpredict_mle_mle.json +0 -147
  1187. teradataml/analytics/mle/json/naivebayestextclassifiertrainer2_mle.json +0 -108
  1188. teradataml/analytics/mle/json/naivebayestextclassifiertrainer_mle.json +0 -102
  1189. teradataml/analytics/mle/json/namedentityfinder_mle.json +0 -84
  1190. teradataml/analytics/mle/json/namedentityfinderevaluatorreduce_mle.json +0 -43
  1191. teradataml/analytics/mle/json/namedentityfindertrainer_mle.json +0 -64
  1192. teradataml/analytics/mle/json/nerevaluator_mle.json +0 -54
  1193. teradataml/analytics/mle/json/nerextractor_mle.json +0 -87
  1194. teradataml/analytics/mle/json/nertrainer_mle.json +0 -89
  1195. teradataml/analytics/mle/json/ngrams_mle.json +0 -137
  1196. teradataml/analytics/mle/json/ngramsplitter_mle_mle.json +0 -137
  1197. teradataml/analytics/mle/json/npath@coprocessor_mle.json +0 -73
  1198. teradataml/analytics/mle/json/ntree@coprocessor_mle.json +0 -123
  1199. teradataml/analytics/mle/json/pack_mle.json +0 -58
  1200. teradataml/analytics/mle/json/pack_mle_mle.json +0 -58
  1201. teradataml/analytics/mle/json/pagerank_mle.json +0 -81
  1202. teradataml/analytics/mle/json/pathanalyzer_mle.json +0 -63
  1203. teradataml/analytics/mle/json/pathgenerator_mle.json +0 -40
  1204. teradataml/analytics/mle/json/pathstart_mle.json +0 -62
  1205. teradataml/analytics/mle/json/pathsummarizer_mle.json +0 -72
  1206. teradataml/analytics/mle/json/pivoting_mle.json +0 -71
  1207. teradataml/analytics/mle/json/postagger_mle.json +0 -51
  1208. teradataml/analytics/mle/json/randomsample_mle.json +0 -131
  1209. teradataml/analytics/mle/json/randomwalksample_mle.json +0 -85
  1210. teradataml/analytics/mle/json/roc_mle.json +0 -73
  1211. teradataml/analytics/mle/json/sampling_mle.json +0 -75
  1212. teradataml/analytics/mle/json/sax_mle.json +0 -154
  1213. teradataml/analytics/mle/json/scale_mle.json +0 -93
  1214. teradataml/analytics/mle/json/scalebypartition_mle.json +0 -89
  1215. teradataml/analytics/mle/json/scalemap_mle.json +0 -44
  1216. teradataml/analytics/mle/json/scalesummary_mle.json +0 -14
  1217. teradataml/analytics/mle/json/sentenceextractor_mle.json +0 -41
  1218. teradataml/analytics/mle/json/sentimentevaluator_mle.json +0 -43
  1219. teradataml/analytics/mle/json/sentimentextractor_mle.json +0 -100
  1220. teradataml/analytics/mle/json/sentimenttrainer_mle.json +0 -68
  1221. teradataml/analytics/mle/json/seriessplitter_mle.json +0 -133
  1222. teradataml/analytics/mle/json/sessionize_mle_mle.json +0 -62
  1223. teradataml/analytics/mle/json/simplemovavg_mle.json +0 -48
  1224. teradataml/analytics/mle/json/stringsimilarity_mle.json +0 -50
  1225. teradataml/analytics/mle/json/stringsimilarity_mle_mle.json +0 -50
  1226. teradataml/analytics/mle/json/svmdense_mle.json +0 -165
  1227. teradataml/analytics/mle/json/svmdensepredict_mle.json +0 -95
  1228. teradataml/analytics/mle/json/svmdensesummary_mle.json +0 -58
  1229. teradataml/analytics/mle/json/svmsparse_mle.json +0 -148
  1230. teradataml/analytics/mle/json/svmsparsepredict_mle_mle.json +0 -103
  1231. teradataml/analytics/mle/json/svmsparsesummary_mle.json +0 -57
  1232. teradataml/analytics/mle/json/textchunker_mle.json +0 -40
  1233. teradataml/analytics/mle/json/textclassifier_mle.json +0 -51
  1234. teradataml/analytics/mle/json/textclassifierevaluator_mle.json +0 -43
  1235. teradataml/analytics/mle/json/textclassifiertrainer_mle.json +0 -103
  1236. teradataml/analytics/mle/json/textmorph_mle.json +0 -63
  1237. teradataml/analytics/mle/json/textparser_mle.json +0 -166
  1238. teradataml/analytics/mle/json/texttagger_mle.json +0 -81
  1239. teradataml/analytics/mle/json/texttokenizer_mle.json +0 -91
  1240. teradataml/analytics/mle/json/tf_mle.json +0 -33
  1241. teradataml/analytics/mle/json/tfidf_mle.json +0 -34
  1242. teradataml/analytics/mle/json/univariatestatistics_mle.json +0 -81
  1243. teradataml/analytics/mle/json/unpack_mle.json +0 -91
  1244. teradataml/analytics/mle/json/unpack_mle_mle.json +0 -91
  1245. teradataml/analytics/mle/json/unpivoting_mle.json +0 -63
  1246. teradataml/analytics/mle/json/varmax_mle.json +0 -176
  1247. teradataml/analytics/mle/json/vectordistance_mle.json +0 -179
  1248. teradataml/analytics/mle/json/weightedmovavg_mle.json +0 -48
  1249. teradataml/analytics/mle/json/xgboost_mle.json +0 -178
  1250. teradataml/analytics/mle/json/xgboostpredict_mle.json +0 -104
  1251. teradataml/analytics/sqle/Antiselect.py +0 -321
  1252. teradataml/analytics/sqle/Attribution.py +0 -603
  1253. teradataml/analytics/sqle/DecisionForestPredict.py +0 -408
  1254. teradataml/analytics/sqle/GLMPredict.py +0 -430
  1255. teradataml/analytics/sqle/MovingAverage.py +0 -543
  1256. teradataml/analytics/sqle/NGramSplitter.py +0 -548
  1257. teradataml/analytics/sqle/NPath.py +0 -632
  1258. teradataml/analytics/sqle/NaiveBayesTextClassifierPredict.py +0 -515
  1259. teradataml/analytics/sqle/Pack.py +0 -388
  1260. teradataml/analytics/sqle/SVMSparsePredict.py +0 -464
  1261. teradataml/analytics/sqle/Sessionize.py +0 -390
  1262. teradataml/analytics/sqle/StringSimilarity.py +0 -400
  1263. teradataml/analytics/sqle/Unpack.py +0 -503
  1264. teradataml/analytics/sqle/json/antiselect_sqle.json +0 -21
  1265. teradataml/analytics/sqle/json/attribution_sqle.json +0 -92
  1266. teradataml/analytics/sqle/json/decisionforestpredict_sqle.json +0 -48
  1267. teradataml/analytics/sqle/json/glmpredict_sqle.json +0 -48
  1268. teradataml/analytics/sqle/json/h2opredict_sqle.json +0 -63
  1269. teradataml/analytics/sqle/json/movingaverage_sqle.json +0 -58
  1270. teradataml/analytics/sqle/json/naivebayestextclassifierpredict_sqle.json +0 -76
  1271. teradataml/analytics/sqle/json/ngramsplitter_sqle.json +0 -126
  1272. teradataml/analytics/sqle/json/npath_sqle.json +0 -67
  1273. teradataml/analytics/sqle/json/pack_sqle.json +0 -47
  1274. teradataml/analytics/sqle/json/pmmlpredict_sqle.json +0 -55
  1275. teradataml/analytics/sqle/json/sessionize_sqle.json +0 -43
  1276. teradataml/analytics/sqle/json/stringsimilarity_sqle.json +0 -39
  1277. teradataml/analytics/sqle/json/svmsparsepredict_sqle.json +0 -74
  1278. teradataml/analytics/sqle/json/unpack_sqle.json +0 -80
  1279. teradataml/catalog/model_cataloging.py +0 -980
  1280. teradataml/config/mlengine_alias_definitions_v1.0 +0 -118
  1281. teradataml/config/mlengine_alias_definitions_v1.1 +0 -127
  1282. teradataml/config/mlengine_alias_definitions_v1.3 +0 -129
  1283. teradataml/table_operators/sandbox_container_util.py +0 -643
  1284. teradataml-17.20.0.7.dist-info/RECORD +0 -1280
  1285. {teradataml-17.20.0.7.dist-info → teradataml-20.0.0.0.dist-info}/top_level.txt +0 -0
@@ -1,1716 +1,1759 @@
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 the core framework that allows user to load BYOM to Vantage.
10
- """
11
-
12
- from teradataml.dataframe.dataframe import DataFrame, in_schema
13
- from teradataml.utils.validators import _Validators
14
- from teradataml.context.context import _get_current_databasename, get_connection, get_context
15
- from teradataml.common.messagecodes import MessageCodes
16
- from teradataml.common.messages import Messages
17
- from teradataml.common.exceptions import TeradataMlException
18
- from teradatasql import OperationalError as SqlOperationalError
19
- from teradatasqlalchemy.types import *
20
- from teradatasqlalchemy.types import _TDType
21
- from teradataml.dbutils.dbutils import _get_quoted_object_name, _create_table
22
- from teradataml.common.utils import UtilFuncs
23
- from teradataml.utils.dtypes import _Dtypes
24
- from teradataml.catalog.model_cataloging_utils import __get_like_filter_expression_on_col
25
- from teradataml.options.display import display
26
- from teradataml.common.constants import ModelCatalogingConstants as mac
27
- from teradataml.options.configure import configure
28
- from teradataml.utils.utils import execute_sql
29
-
30
- validator = _Validators()
31
-
32
- def __check_if_model_exists(model_id,
33
- table_name,
34
- schema_name=None,
35
- raise_error_if_model_found=False,
36
- raise_error_if_model_not_found=False):
37
- """
38
- DESCRIPTION:
39
- Internal function to check if byom model with given "model_id", exists or not.
40
-
41
- PARAMETERS:
42
- model_id:
43
- Required Argument.
44
- Specifies the name of the model identifier to check whether it exists or not.
45
- Types: str
46
-
47
- table_name:
48
- Required Argument.
49
- Specifies the table name that may or may not contain entry for the model.
50
- Types: str
51
-
52
- schema_name:
53
- Optional Argument.
54
- Specifies the name of the schema, to look out for table specified in
55
- "table_name". If not specified, then "table_name" is looked over in
56
- the current database.
57
- Types: str
58
-
59
- raise_error_if_model_found:
60
- Optional Argument.
61
- Specifies the flag to decide whether to raise error when model exists or not.
62
- Default Value: False (Do not raise exception)
63
- Types: bool
64
-
65
- raise_error_if_model_not_found:
66
- Optional Argument.
67
- Specifies the flag to decide whether to raise error when model is found or not.
68
- Default Value: False (Do not raise exception)
69
- Types: bool
70
-
71
- RETURNS:
72
- bool.
73
-
74
- RAISES:
75
- TeradataMlException - MODEL_ALREADY_EXISTS, MODEL_NOT_FOUND
76
-
77
- EXAMPLES:
78
- >>> meta_df = __check_if_model_exists("glm_out")
79
- """
80
- # If external model, create DataFrame on table specified in parameters within
81
- # current schema. Else, create DataFrame on table & schema specified in parameters.
82
- schema_name = schema_name if schema_name is not None else _get_current_databasename()
83
- models_meta_df = DataFrame(in_schema(schema_name, table_name))
84
- models_meta_df = models_meta_df[models_meta_df.model_id == model_id]
85
-
86
- num_rows = models_meta_df.shape[0]
87
-
88
- if raise_error_if_model_found:
89
- if num_rows == 1:
90
- # If model with name 'name' already exists.
91
- raise TeradataMlException(Messages.get_message(MessageCodes.MODEL_ALREADY_EXISTS,
92
- model_id),
93
- MessageCodes.MODEL_ALREADY_EXISTS)
94
-
95
- if raise_error_if_model_not_found:
96
- if num_rows == 0:
97
- # 'name' MODEL_NOT_FOUND
98
- raise TeradataMlException(Messages.get_message(MessageCodes.MODEL_NOT_FOUND,
99
- model_id, ''),
100
- MessageCodes.MODEL_NOT_FOUND)
101
-
102
- return True if num_rows == 1 else False
103
-
104
- def __set_validate_catalog_parameters(table_name=None, schema_name=None):
105
- """
106
- DESCRIPTION:
107
- Internal function to set the table and schema name
108
- for byom catalog API's according to the model cataloging
109
- parameters and the user inputs.
110
-
111
- PARAMETERS:
112
- table_name:
113
- Optional Argument.
114
- Specifies the name of the byom catalog table.
115
- Notes:
116
- * One must either specify this argument or set the byom model catalog table
117
- name using set_byom_catalog().
118
- * If none of these arguments are set, exception is raised; If both arguments
119
- are set, the settings in function call take precedence and is used for
120
- function execution when saving an model.
121
- Types: str
122
-
123
- schema_name:
124
- Optional Argument.
125
- Specifies the name of the schema/database in which the table specified in
126
- "table_name" is looked up.
127
- Notes:
128
- * One must either specify this argument or set the byom model catalog schema
129
- name using set_byom_catalog().
130
- * If none of these arguments are set, exception is raised; If both arguments
131
- are set, the settings in function call take precedence and is used for
132
- function execution when saving an model.
133
- Types: str
134
-
135
- RETURNS:
136
- bool.
137
-
138
- RAISES:
139
- ValueError
140
-
141
- EXAMPLES:
142
- >>> __set_validate_catalog_parameters(table_name = "model_catalog_table",
143
- schema_name="model_catalog_schema")
144
- """
145
- # Raise an error if schema_name is provided and table_name is not provided
146
- _Validators._validate_dependent_argument("schema_name", schema_name, "table_name", table_name)
147
-
148
- # Set the schema_name to default schema_name if only table_name is provided.
149
- # Set the table_name and schema_name to model catalog session level variables if not provided.
150
- schema_name = schema_name if schema_name is not None else\
151
- _get_current_databasename() if table_name is not None else configure._byom_model_catalog_database
152
- table_name = table_name if table_name is not None else configure._byom_model_catalog_table
153
-
154
- # Check whether table information is present and not None.
155
- additional_error = Messages.get_message(MessageCodes.EITHER_FUNCTION_OR_ARGS, "catalog", "set_byom_catalog",
156
- "catalog", "")
157
- validator._validate_argument_is_not_None(table_name, "table_name", additional_error)
158
-
159
- return [table_name, schema_name]
160
-
161
-
162
- def set_byom_catalog(table_name,
163
- schema_name=None):
164
- """
165
- DESCRIPTION:
166
- Function to set the BYOM model catalog information to be used by
167
- BYOM model cataloging APIs such as:
168
- * delete_byom
169
- * list_byom
170
- * retrieve_byom
171
- * save_byom
172
- * set_license
173
-
174
- PARAMETERS:
175
- table_name:
176
- Required Argument.
177
- Specifies the name of the table to be used for BYOM model cataloging.
178
- This table will be used for saving, retrieving BYOM model information
179
- by BYOM model cataloging APIs.
180
- Types: str.
181
-
182
- schema_name:
183
- Optional Argument.
184
- Specifies the name of the schema/database in which the table specified in
185
- "table_name" is looked up. If not specified, then table is looked
186
- up in current schema/database.
187
- Types: str
188
-
189
- RETURNS:
190
- None
191
-
192
- RAISES:
193
- TeradataMlException
194
-
195
- EXAMPLES:
196
- >>> from teradataml import set_byom_catalog
197
-
198
- # Example 1 - Set global parameters table_name = 'model_table_name' and schema_name = 'model_schema_name';
199
- >>> set_byom_catalog(table_name='model_table_name', schema_name='model_schema_name')
200
- The model cataloging parameters are set to table_name='model_table_name' and schema_name='model_schema_name'
201
-
202
- """
203
-
204
- # Let's perform argument validations.
205
- # Create argument information matrix to do parameter checking.
206
- __arg_info_matrix = []
207
- __arg_info_matrix.append(["table_name", table_name, False, str, True])
208
- __arg_info_matrix.append(["schema_name", schema_name, True, str, True])
209
-
210
- # Make sure that a correct type of values has been supplied to the arguments.
211
- validator._validate_function_arguments(__arg_info_matrix)
212
-
213
- schema_name = schema_name if schema_name is not None else _get_current_databasename()
214
-
215
- # Perform required validations for the API.
216
- # Check whether the table given exist or not.
217
- conn = get_connection()
218
- validator._check_table_exists(conn, table_name, schema_name)
219
-
220
- configure._byom_model_catalog_table = table_name
221
- configure._byom_model_catalog_database = schema_name
222
- print("The model cataloging parameters are set to table_name='{}' and "
223
- "schema_name='{}'".format(table_name, schema_name))
224
-
225
- def save_byom(model_id,
226
- model_file,
227
- table_name=None,
228
- schema_name=None,
229
- additional_columns=None,
230
- additional_columns_types=None):
231
- """
232
- DESCRIPTION:
233
- Function to save externally trained models in Teradata Vantage in the
234
- specified table. Function allows user to save various models stored in
235
- different formats such as PMML, MOJO etc. If the specified model table
236
- exists in Vantage, model data is saved in the same, otherwise model table
237
- is created first based on the user parameters and then model data is
238
- saved. See below 'Note' section for more details.
239
-
240
- Notes:
241
- If user specified table exists, then
242
- a. Table must have at least two columns with names and types as
243
- specified below:
244
- * 'model_id' of type VARCHAR of any length and
245
- * 'model' column of type BLOB.
246
- b. User can choose to have the additional columns as well to store
247
- additional information of the model. This information can be passed
248
- using "additional_columns" parameter. See "additional_columns"
249
- argument description for more details.
250
- If user specified table does not exist, then
251
- a. Function creates the table with the name specified in "table_name".
252
- b. Table is created in the schema specified in "schema_name". If
253
- "schema_name" is not specified, then current schema is considered
254
- for "schema_name".
255
- c. Table is created with columns:
256
- * 'model_id' with type specified in "additional_columns_types". If
257
- not specified, table is created with 'model_id' column as VARCHAR(128).
258
- * 'model' with type specified in "additional_columns_types". If
259
- not specified, table is created with 'model' column as BLOB.
260
- * Columns specified in "additional_columns" parameter. See "additional_columns"
261
- argument description for more details.
262
- * Datatypes of these additional columns are either taken from
263
- the values passed to "additional_columns_types" or inferred
264
- from the values passed to the "additional_columns". See
265
- "additional_columns_types" argument description for more details.
266
-
267
- PARAMETERS:
268
- model_id:
269
- Required Argument.
270
- Specifies the unique model identifier for model.
271
- Types: str.
272
-
273
- model_file:
274
- Required Argument.
275
- Specifies the absolute path of the file which has model information.
276
- Types: str
277
-
278
- table_name:
279
- Optional Argument.
280
- Specifies the name of the table where model is saved. If "table_name"
281
- does not exist, this function creates table according to "additional_columns"
282
- and "additional_columns_types".
283
- Notes:
284
- * One must either specify this argument or set the byom model catalog table
285
- name using set_byom_catalog().
286
- * If none of these arguments are set, exception is raised; If both arguments
287
- are set, the settings in save_byom() take precedence and is used for
288
- function execution when saving an model.
289
- Types: str
290
-
291
- schema_name:
292
- Optional Argument.
293
- Specifies the name of the schema/database in which the table specified in
294
- "table_name" is looked up.
295
- Notes:
296
- * One must either specify this argument and table_name argument
297
- or set the byom model catalog schema and table name using set_byom_catalog().
298
- * If none of these arguments are set, exception is raised; If both arguments
299
- are set, the settings in save_byom() take precedence and is used for
300
- function execution when saving an model.
301
- * If user specifies schema_name argument table_name argument has to be specified,
302
- else exception is raised.
303
- Types: str
304
-
305
- additional_columns:
306
- Optional Argument.
307
- Specifies the additional information about the model to be saved in the
308
- model table. Additional information about the model is passed as key value
309
- pair, where key is the name of the column and value is data to be stored
310
- in that column for the model being saved.
311
- Notes:
312
- 1. Following are the allowed types for the values passed in dictionary:
313
- * int
314
- * float
315
- * str
316
- * bool
317
- * datetime.datetime
318
- * datetime.date
319
- * datetime.time
320
- 2. "additional_columns" does not accept keys model_id and model.
321
- Types: str
322
-
323
- additional_columns_types:
324
- Optional Argument.
325
- Specifies the column type of additional columns. These column types are used
326
- while creating the table using the columns specified in "additional_columns"
327
- argument. Additional column datatype information is passed as key value pair
328
- with key being the column name and value as teradatasqlalchemy.types.
329
- Notes:
330
- 1. If, any of the column type for additional columns are not specified in
331
- "additional_columns_types", it then derives the column type according
332
- the below table:
333
- +---------------------------+-----------------------------------------+
334
- | Python Type | teradatasqlalchemy Type |
335
- +---------------------------+-----------------------------------------+
336
- | str | VARCHAR(1024) |
337
- +---------------------------+-----------------------------------------+
338
- | int | INTEGER |
339
- +---------------------------+-----------------------------------------+
340
- | bool | BYTEINT |
341
- +---------------------------+-----------------------------------------+
342
- | float | FLOAT |
343
- +---------------------------+-----------------------------------------+
344
- | datetime | TIMESTAMP |
345
- +---------------------------+-----------------------------------------+
346
- | date | DATE |
347
- +---------------------------+-----------------------------------------+
348
- | time | TIME |
349
- +---------------------------+-----------------------------------------+
350
- 2. Columns model_id, with column type as VARCHAR and model, with column type
351
- as BLOB are mandatory for table. So, for the columns model_id and model,
352
- acceptable values for "additional_columns_types" are VARCHAR and BLOB
353
- respectively.
354
- 3. This argument is ignored if table exists.
355
- Types: dict
356
-
357
- Note:
358
- The following table describes the system behaviour in different scenarios:
359
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
360
- | In save_byom() | In set_byom_catalog() | System Behavior |
361
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
362
- | table_name | schema_name | table_name | schema_name | |
363
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
364
- | Set | Set | Set | Set | schema_name and table_name in |
365
- | | | | | save_byom() are used for |
366
- | | | | | function execution. |
367
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
368
- | Set | Set | Not set | Not set | schema_name and table_name in |
369
- | | | | | save_byom() is used for |
370
- | | | | | function execution. |
371
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
372
- | Set | Not set | Set | Set | table_name from save_byom() |
373
- | | | | | is used and schema name |
374
- | | | | | associated with the current |
375
- | | | | | context is used. |
376
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
377
- | Not set | Set | Set | Set | Exception is raised. |
378
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
379
- | Not set | Not set | Set | Set | table_name and schema_name |
380
- | | | | | from set_byom_catalog() |
381
- | | | | | are used for function execution. |
382
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
383
- | Not set | Not set | Set | Not set | table_name from set_byom_catalog() |
384
- | | | | | is used and schema name |
385
- | | | | | associated with the current |
386
- | | | | | context is used. |
387
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
388
- | Not set | Not set | Not set | Not set | Exception is raised |
389
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
390
-
391
- RETURNS:
392
- None.
393
-
394
- RAISES:
395
- TeradataMlException, TypeError, ValueError
396
-
397
- EXAMPLES:
398
-
399
- >>> import teradataml, os, datetime
400
- >>> model_file = os.path.join(os.path.dirname(teradataml.__file__), 'data', 'models', 'iris_kmeans_model')
401
- >>> from teradataml import save_byom
402
-
403
- # Example 1 - Create table "byom_model" with additional columns by specifying the type
404
- # of the columns as below and save the model in it.
405
- # +---------------------------+-----------------------------------------+
406
- # | Column name | Column Type |
407
- # +---------------------------+-----------------------------------------+
408
- # | model_id | VARCHAR(128) |
409
- # +---------------------------+-----------------------------------------+
410
- # | model | BLOB |
411
- # +---------------------------+-----------------------------------------+
412
- # | Description | VARCHAR(2000) |
413
- # +---------------------------+-----------------------------------------+
414
- # | UserId | NUMBER(5) |
415
- # +---------------------------+-----------------------------------------+
416
- # | ProductionReady | BYTEINT |
417
- # +---------------------------+-----------------------------------------+
418
- # | ModelEfficiency | NUMBER(11,10) |
419
- # +---------------------------+-----------------------------------------+
420
- # | ModelSavedTime | TIMESTAMP |
421
- # +---------------------------+-----------------------------------------+
422
- # | ModelGeneratedDate | DATE |
423
- # +---------------------------+-----------------------------------------+
424
- # | ModelGeneratedTime | TIME |
425
- # +---------------------------+-----------------------------------------+
426
- #
427
- >>> save_byom('model1',
428
- ... model_file,
429
- ... 'byom_models',
430
- ... additional_columns={"Description": "KMeans model",
431
- ... "UserId": "12345",
432
- ... "ProductionReady": False,
433
- ... "ModelEfficiency": 0.67412,
434
- ... "ModelSavedTime": datetime.datetime.now(),
435
- ... "ModelGeneratedDate":datetime.date.today(),
436
- ... "ModelGeneratedTime": datetime.time(hour=0,minute=5,second=45,microsecond=110)
437
- ... },
438
- ... additional_columns_types={"Description": VARCHAR(2000),
439
- ... "UserId": NUMBER(5),
440
- ... "ProductionReady": BYTEINT,
441
- ... "ModelEfficiency": NUMBER(11,10),
442
- ... "ModelSavedTime": TIMESTAMP,
443
- ... "ModelGeneratedDate": DATE,
444
- ... "ModelGeneratedTime": TIME}
445
- ... )
446
- Created the table 'byom_models' as it does not exist.
447
- Model is saved.
448
- >>>
449
-
450
- # Example 2 - Create table "byom_model1" in "test" DataBase, with additional columns
451
- # by not specifying the type of the columns and once table is created,
452
- # save the model in it.
453
- >>> save_byom('model1',
454
- ... model_file,
455
- ... 'byom_models1',
456
- ... additional_columns={"Description": "KMeans model",
457
- ... "UserId": "12346",
458
- ... "ProductionReady": False,
459
- ... "ModelEfficiency": 0.67412,
460
- ... "ModelSavedTime": datetime.datetime.now(),
461
- ... "ModelGeneratedDate":datetime.date.today(),
462
- ... "ModelGeneratedTime": datetime.time(hour=0,minute=5,second=45,microsecond=110)
463
- ... },
464
- ... schema_name='test'
465
- ... )
466
- Created the table 'byom_models1' as it does not exist.
467
- Model is saved.
468
- >>>
469
-
470
- # Example 3 - Save the model in the existing table "byom_models".
471
- >>> save_byom('model2',
472
- ... model_file,
473
- ... 'byom_models',
474
- ... additional_columns={"Description": "KMeans model duplicated"}
475
- ... )
476
- Model is saved.
477
- >>>
478
-
479
- # Example 4 - Set the cataloging parameters and save the model
480
- # in the existing table "byom_models".
481
- >>> set_byom_catalog(table_name='byom_models', schema_name='alice')
482
- The model cataloging parameters are set to table_name='byom_models' and schema_name='alice'
483
- >>> save_byom('model3', model_file=model_file)
484
- Model is saved.
485
-
486
- # Example 4 - Set the cataloging table_name to 'byom_models'
487
- # and save the model in table 'byom_licensed_models' other than model catalog table.
488
- >>> set_byom_catalog(table_name='byom_models', schema_name='alice')
489
- The model cataloging parameters are set to table_name='byom_models' and schema_name='alice'
490
- >>> save_byom('licensed_model2', model_file=model_file, table_name='byom_licensed_models',
491
- ... additional_columns={"license_data": "A5sUL9KU_kP35Vq"})
492
- Created the model table 'byom_licensed_models' as it does not exist.
493
- Model is saved.
494
- >>>
495
- """
496
- try:
497
- # Let's perform argument validations.
498
- # Create argument information matrix to do parameter checking.
499
- __arg_info_matrix = []
500
- __arg_info_matrix.append(["model_id", model_id, False, str, True])
501
- __arg_info_matrix.append(["model_file", model_file, False, str, True])
502
- __arg_info_matrix.append(["table_name", table_name, True, str, True])
503
- __arg_info_matrix.append(["schema_name", schema_name, True, str, True])
504
- __arg_info_matrix.append(["additional_columns", additional_columns, True, dict])
505
- __arg_info_matrix.append(["additional_columns_types", additional_columns_types, True, dict])
506
-
507
- # Make sure that a correct type of values has been supplied to the arguments.
508
- validator._validate_function_arguments(__arg_info_matrix)
509
-
510
- # Set the table and schema name according to the model cataloging parameters and the user inputs.
511
- table_name, schema_name = __set_validate_catalog_parameters(table_name, schema_name)
512
-
513
- # Change the additional_columns_types and additional_columns to dictionary if
514
- # it is None so that retrieval would be easy.
515
- if additional_columns_types is None:
516
- additional_columns_types = {}
517
-
518
- if additional_columns is None:
519
- additional_columns = {}
520
-
521
- # Check if model_id or model in additional columns.
522
- for column in ["model_id", "model"]:
523
- if column in additional_columns:
524
- error_code = MessageCodes.NOT_ALLOWED_VALUES
525
- error_msg = Messages.get_message(error_code, column, "additional_columns")
526
- raise TeradataMlException(error_msg, error_code)
527
-
528
- # Add model_id and model columns information to lists
529
- # which will be used in creating insert query.
530
- column_names = ["model_id", "model"]
531
- insert_parameters = [model_id, UtilFuncs._get_file_contents(model_file, True)]
532
-
533
- connection = get_connection()
534
- # Check if table already exists.
535
- # If exists, extract required information about table columns types
536
- # else extract from additional_columns_types.
537
- # Also validate model_id against allowed length.
538
- table_exists = connection.dialect.has_table(connection, table_name=table_name, schema=schema_name)
539
- if table_exists:
540
- # Check if model exists or not. If exists, raise error.
541
- __check_if_model_exists(
542
- model_id, table_name, schema_name, raise_error_if_model_found=True)
543
- if len(additional_columns_types) != 0:
544
- warnings.warn("Argument additional_columns_types is ignored since table already exists.")
545
-
546
- # Gather column name and type information from existing table
547
- existing_table_df = DataFrame(in_schema(schema_name, table_name))
548
- existing_columns_name_sql_type_dict = existing_table_df._td_column_names_and_sqlalchemy_types
549
-
550
- existing_table_model_id_type = existing_columns_name_sql_type_dict["model_id"]
551
- # Validate length of model_id argument
552
- _Validators._validate_column_value_length("model_id", model_id, existing_table_model_id_type.length,
553
- "save the model")
554
- else:
555
- # Validate length of model_id argument
556
- _Validators._validate_column_value_length("model_id", model_id, 128, "save the model")
557
-
558
- columns_name_type_dict = {"model_id": additional_columns_types.get("model_id", VARCHAR(128)),
559
- "model": additional_columns_types.get("model", BLOB)}
560
-
561
- # List of columns whose type is not provided in additional_columns_types.
562
- undefined_column_types = []
563
-
564
- # If user passes any additional columns data, extract that also to insert it
565
- # in table.
566
- # If table exists, use the information about column types from existing table,
567
- # ignore additional_columns_types argument.
568
- if additional_columns:
569
- for col_name, col_value in additional_columns.items():
570
- # Before proceeding further, validate the additional column data.
571
- # One should not pass custom types such as list, dict, user defined
572
- # objects etc.
573
- _Validators._validate_py_type_for_td_type_conversion(type(col_value), "additional_columns")
574
-
575
- # If table exists, use same column data type.
576
- # If table does not exist and column type is not specified
577
- # in additional column types, derive the appropriate one.
578
- if table_exists:
579
- col_name_lower = col_name.lower()
580
- if col_name_lower in existing_columns_name_sql_type_dict:
581
- col_type = existing_columns_name_sql_type_dict[col_name_lower]
582
- else:
583
- raise TeradataMlException(Messages.get_message(MessageCodes.INSERTION_INCOMPATIBLE),
584
- MessageCodes.INSERTION_INCOMPATIBLE)
585
- else:
586
- col_type = additional_columns_types.get(
587
- col_name, _Dtypes._python_type_to_teradata_type(type(col_value)))
588
- # Update columns_name_type_dict
589
- columns_name_type_dict[col_name] = col_type
590
-
591
- # Collect undefined column types to show warning.
592
- if additional_columns_types.get(col_name) is None:
593
- undefined_column_types.append(col_name)
594
-
595
- # Validate the length of input varchar columns against allowed column lengths.
596
- if isinstance(col_type, VARCHAR):
597
- _Validators._validate_column_value_length(col_name, col_value, col_type.length,
598
- "save the model")
599
-
600
- # Add current column name and corresponding value in respective lists.
601
- column_names.append(col_name)
602
- insert_parameters.append(col_value)
603
-
604
- # If table doesn't exist, create one using additional_columns_types
605
- if not table_exists:
606
- __mandatory_columns_types = {"model_id": VARCHAR, "model": BLOB}
607
- is_mandatory_col_type_expected = lambda c_name, c_type: \
608
- c_type == __mandatory_columns_types[c_name] or type(c_type) == __mandatory_columns_types[c_name]
609
-
610
- # Validate additional_columns_types.
611
- for c_name, c_type in additional_columns_types.items():
612
- # Check if model_id & model columns have appropriate types.
613
- if c_name in __mandatory_columns_types and not is_mandatory_col_type_expected(c_name, c_type):
614
- error_code = MessageCodes.INVALID_COLUMN_DATATYPE
615
- err_msg = Messages.get_message(error_code,
616
- c_name,
617
- "additional_columns_types",
618
- "Valid",
619
- "[{}]".format(__mandatory_columns_types[c_name].__name__)
620
- )
621
- raise TeradataMlException(err_msg, error_code)
622
-
623
- # Check if value passed to additional_columns_types is a valid type or not.
624
- # User can pass a class or an object of a class from teradatasqlalchemy.types .
625
- # So, Check if c_type is either a subclass of TDType or a TDType.
626
- # isinstance(c_type, _TDType), checks if c_type is an object of teradatasqlalchemy.types
627
- # issubclass(c_type, _TDType), checks if c_type is a proper Teradata type or not.
628
- # However, issubclass accepts only class in its 1st parameter so check if c_type is
629
- # a class or not, before passing it to issubclass.
630
- elif not (isinstance(c_type, _TDType) or (isinstance(c_type, type) and issubclass(c_type, _TDType))):
631
- error_code = MessageCodes.INVALID_COLUMN_DATATYPE
632
- err_msg = Messages.get_message(
633
- error_code, c_name, "additional_columns_types", "Valid", "teradatasqlalchemy.types")
634
- raise TeradataMlException(err_msg, error_code)
635
-
636
- if len(undefined_column_types) > 0:
637
- warnings.warn("Specified table does not exist and data types of {0} "\
638
- "columns are not provided. Taking default datatypes."\
639
- .format(", ".join(undefined_column_types)))
640
-
641
- # Create empty vantage table using sqlalchemy object.
642
- _create_table(
643
- table_name, columns_name_type_dict, primary_index="model_id", schema_name=schema_name)
644
- print("Created the model table '{}' as it does not exist.".format(table_name))
645
-
646
- # If schema is specified, then concatenate schema name with table name.
647
- if schema_name:
648
- table_name = in_schema(schema_name, table_name)
649
-
650
- # Generate insert query.
651
- columns_clause = ", ".join(column_names)
652
- values_clause = ", ".join(("?" for _ in range(len(column_names))))
653
- insert_model = f"insert into {table_name} ({columns_clause}) values ({values_clause});"
654
- execute_sql(insert_model, tuple([insert_parameters]))
655
- print("Model is saved.")
656
-
657
- except (SqlOperationalError, TeradataMlException, TypeError, ValueError):
658
- raise
659
- except Exception as err:
660
- error_code = MessageCodes.MODEL_CATALOGING_OPERATION_FAILED
661
- raise TeradataMlException(Messages.get_message(error_code, "save", str(err)), error_code)
662
-
663
- def delete_byom(model_id, table_name=None, schema_name=None):
664
- """
665
- DESCRIPTION:
666
- Delete a model from the user specified table in Teradata Vantage.
667
-
668
- PARAMETERS:
669
- model_id:
670
- Required Argument.
671
- Specifies the unique model identifier of the model to be deleted.
672
- Types: str
673
-
674
- table_name:
675
- Optional Argument.
676
- Specifies the name of the table to delete the model from.
677
- Notes:
678
- * One must either specify this argument or set the byom model catalog table
679
- name using set_byom_catalog().
680
- * If none of these arguments are set, exception is raised; If both arguments
681
- are set, the settings in delete_byom() take precedence and is used for
682
- function execution.
683
- Types: str
684
-
685
- schema_name:
686
- Optional Argument.
687
- Specifies the name of the schema/database in which the table specified in
688
- "table_name" is looked up.
689
- Notes:
690
- * One must either specify this argument and table_name argument
691
- or set the byom model catalog schema and table name using set_byom_catalog().
692
- * If none of these arguments are set, exception is raised; If both arguments
693
- are set, the settings in delete_byom() take precedence and is used for
694
- function execution.
695
- * If user specifies schema_name argument table_name argument has to be specified,
696
- else exception is raised.
697
- Types: str
698
-
699
- Note:
700
- The following table describes the system behaviour in different scenarios:
701
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
702
- | In delete_byom() | In set_byom_catalog() | System Behavior |
703
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
704
- | table_name | schema_name | table_name | schema_name | |
705
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
706
- | Set | Set | Set | Set | schema_name and table_name in |
707
- | | | | | delete_byom() are used for |
708
- | | | | | function execution. |
709
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
710
- | Set | Set | Not set | Not set | schema_name and table_name in |
711
- | | | | | delete_byom() is used for |
712
- | | | | | function execution. |
713
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
714
- | Not set | Not set | Set | Set | table_name from delete_byom() |
715
- | | | | | is used and schema name |
716
- | | | | | associated with the current |
717
- | | | | | context is used. |
718
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
719
- | Not set | Set | Set | Set | Exception is raised. |
720
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
721
- | Not set | Not set | Set | Set | table_name and schema_name |
722
- | | | | | from set_byom_catalog() |
723
- | | | | | are used for function execution. |
724
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
725
- | Not set | Not set | Set | Not set | table_name from set_byom_catalog() |
726
- | | | | | is used and schema name |
727
- | | | | | associated with the current |
728
- | | | | | context is used. |
729
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
730
- | Not set | Not set | Not set | Not set | Exception is raised |
731
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
732
-
733
- RETURNS:
734
- None.
735
-
736
- RAISES:
737
- TeradataMlException
738
-
739
- EXAMPLES:
740
-
741
- >>> import teradataml, os, datetime
742
- >>> model_file = os.path.join(os.path.dirname(teradataml.__file__), 'data', 'models', 'iris_kmeans_model')
743
- >>> from teradataml import save_byom, delete_byom
744
- >>> save_byom('model3', model_file, 'byom_models')
745
- Model is saved.
746
- >>> save_byom('model4', model_file, 'byom_models', schema_name='test')
747
- Model is saved.
748
- >>> save_byom('model5', model_file, 'byom_models', schema_name='test')
749
- Model is saved.
750
- >>> save_byom('model4', model_file, 'byom_models')
751
- Model is saved.
752
- >>> save_byom('model5', model_file, 'byom_models')
753
- Model is saved.
754
-
755
- # Example 1 - Delete a model with id 'model3' from the table byom_models.
756
- >>> delete_byom(model_id='model3', table_name='byom_models')
757
- Model is deleted.
758
- >>>
759
-
760
- # Example 2 - Delete a model with id 'model4' from the table byom_models
761
- # and the table is in "test" DataBase.
762
- >>> delete_byom(model_id='model4', table_name='byom_models', schema_name='test')
763
- Model is deleted.
764
- >>>
765
-
766
- # Example 3 - Delete a model with id 'model4' from the model cataloging table 'byom_models'
767
- # set by set_byom_catalog().
768
- >>> set_byom_catalog(table_name='byom_models', schema_name='alice')
769
- The model cataloging parameters are set to table_name='byom_models' and schema_name='alice'
770
- >>> delete_byom(model_id='model4')
771
- Model is deleted.
772
-
773
- # Example 4 - Set the cataloging table_name to 'byom_models'
774
- # and delete the model in table other than model catalog table 'byom_licensed_models'.
775
- >>> set_byom_catalog(table_name='byom_models', schema_name= 'alice')
776
- The model cataloging parameters are set to table_name='byom_models' and schema_name='alice'
777
- >>> save_byom('licensed_model2', model_file=model_file, table_name='byom_licensed_models')
778
- Created the model table 'byom_licensed_models' as it does not exist.
779
- Model is saved.
780
- >>> delete_byom(model_id='licensed_model2', table_name='byom_licensed_models')
781
- Model is deleted.
782
-
783
- """
784
-
785
- # Let's perform argument validations.
786
- # Create argument information matrix to do parameter checking
787
- __arg_info_matrix = []
788
- __arg_info_matrix.append(["model_id", model_id, False, str, True])
789
- __arg_info_matrix.append(["table_name", table_name, True, str, True])
790
- __arg_info_matrix.append(["schema_name", schema_name, True, str, True])
791
-
792
- # Make sure that a correct type of values has been supplied to the arguments.
793
- validator._validate_function_arguments(__arg_info_matrix)
794
-
795
- # Set the table and schema name according to the model cataloging parameters and the user inputs.
796
- table_name, schema_name = __set_validate_catalog_parameters(table_name, schema_name)
797
-
798
- # Before proceed further, check whether table exists or not.
799
- conn = get_connection()
800
- if not conn.dialect.has_table(conn, table_name=table_name, schema=schema_name):
801
- error_code = MessageCodes.MODEL_CATALOGING_OPERATION_FAILED
802
- error_msg = Messages.get_message(
803
- error_code, "delete", 'Table "{}.{}" does not exist.'.format(schema_name, table_name))
804
- raise TeradataMlException(error_msg, error_code)
805
-
806
- # Let's check if the user created the model since only the creator can delete it
807
- __check_if_model_exists(model_id, table_name, schema_name, raise_error_if_model_not_found=True)
808
-
809
- # Get the FQTN before deleting the model.
810
- table_name = _get_quoted_object_name(schema_name, table_name)
811
-
812
- try:
813
- delete_model = f"delete from {table_name} where model_id = (?)"
814
- execute_sql(delete_model, tuple([model_id]))
815
- print("Model is deleted.")
816
-
817
- except (SqlOperationalError, TeradataMlException):
818
- raise
819
- except Exception as err:
820
- error_code = MessageCodes.MODEL_CATALOGING_OPERATION_FAILED
821
- error_msg = Messages.get_message(error_code, "delete", str(err))
822
- raise TeradataMlException(error_msg, error_code)
823
-
824
- def set_license(license,
825
- table_name=None,
826
- schema_name=None,
827
- source='string'):
828
- """
829
- DESCRIPTION:
830
- The set_license() function allows a user to set the license information
831
- associated with the externally generated model in a session level variable
832
- which is required by H2O DAI models. It is used by the retrieve_byom()
833
- function to retrieve the license information while retrieving the specific model.
834
- If specified table name does not exist and is not the same as BYOM catalog tables,
835
- then this function creates the table and stores the license information;
836
- otherwise, this function just validates and sets the license information.
837
-
838
- The license can be set by passing the license in the following ways:
839
- * Passing the license as a variable;
840
- * Passing the column name in the model table itself;
841
- * Passing the table and the column name containing the license;
842
- * Passing the license in a file.
843
-
844
- PARAMETERS:
845
- license:
846
- Required Argument.
847
- Specifies the license key information that can be passed as:
848
- * a variable.
849
- * in a file.
850
- * name of the column containing license information in a table
851
- specified by "table_name" argument.
852
- Note:
853
- Argument "source" must be set accordingly.
854
- Types: str
855
-
856
- table_name:
857
- Optional Argument.
858
- Specifies the table name containing the license information if "source" is 'column',
859
- otherwise specifies the table to store the license into.
860
- Note:
861
- Argument "table_name" and "schema_name"
862
- both should be specified or both should be None.
863
- Types: str
864
-
865
- schema_name:
866
- Optional Argument.
867
- Specifies the name of the schema in which the table specified in
868
- "table_name" is looked up.
869
- Note:
870
- Argument "table_name" and "schema_name"
871
- both should be specified or both should be None.
872
- Types: str
873
-
874
- source:
875
- Required Argument.
876
- Specifies whether license key specified in "license" is a string, file
877
- or column name.
878
- Default value: string
879
- Permitted values: string, file, column
880
-
881
- RETURNS:
882
- None.
883
-
884
- RAISES:
885
- TeradataMlException
886
-
887
- EXAMPLES:
888
- >>> import os
889
- >>> from teradataml import save_byom, retrieve_byom, get_context, set_license, set_byom_catalog
890
-
891
- # Example 1: When license is passed as a string.
892
- >>> set_license(license='eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI',
893
- ... table_name=None, schema_name=None, source='string')
894
- The license parameters are set.
895
- The license is : eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI
896
-
897
- # Example 2: When license is stored in a file and file is passed as input to "license".
898
- # "source" must be set to "file".
899
- >>> license_file = os.path.join(os.path.dirname(teradataml.__file__),
900
- ... 'data', 'models', 'License_file.txt')
901
- >>> set_license(license=license_file, source='file')
902
- The license parameters are set.
903
- The license is: license_string
904
-
905
- # Example 3: When license is present in the byom model catalog table itself.
906
- # Store a model with license information in the model table.
907
- >>> model_file = os.path.join(os.path.dirname(teradataml.__file__),
908
- ... 'data', 'models', 'iris_kmeans_model')
909
- >>> save_byom('licensed_model1', model_file, 'byom_licensed_models',
910
- ... additional_columns={"license_data": "A5sUL9KU_kP35Vq"})
911
- Created the model table 'byom_licensed_models' as it does not exist.
912
- Model is saved.
913
- >>> set_byom_catalog(table_name='byom_licensed_models', schema_name='alice')
914
- The model cataloging parameters are set to table_name='byom_licensed_models'
915
- and schema_name='alice'
916
- >>> set_license(license='license_data', source='column')
917
- The license parameters are set.
918
- The license is present in the table='byom_licensed_models',schema='alice' and
919
- column='license_data'.
920
-
921
- # Example 4: Set the license information using the license stored in a column
922
- # 'license_key' of a table 'license_table'.
923
- # Create a table and insert the license information in the table.
924
- >>> license = 'eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI'
925
- >>> lic_table = 'create table license (id integer between 1 and 1,
926
- license_key varchar(2500)) unique primary index(id);'
927
- >>> execute_sql(lic_table)
928
- <sqlalchemy.engine.cursor.LegacyCursorResult object at 0x000001DC4F2EE9A0>
929
- >>> execute_sql("insert into license values (1, 'peBVRtjA-ib')")
930
- <sqlalchemy.engine.cursor.LegacyCursorResult object at 0x000001DC4F2EEF10>
931
- >>> set_license(license='license_key', table_name='license', schema_name='alice',
932
- ... source='column')
933
- The license parameters are set.
934
- The license is present in the table='license', schema='alice' and column='license_key'.
935
-
936
- # Example 5: Set License when license is passed as a string, table
937
- # and schema name are passed. Since table does not exist, table is
938
- # created and license is stored in the table.
939
- >>> set_license(license="eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI",
940
- ... table_name='license_table', schema_name='alice', source='string')
941
- The license parameters are set.
942
- The license is present in the table='license_table', schema='alice' and column='license'.
943
-
944
- # Example 6: Set License when license is passed as a file
945
- # and table and schema name are passed. Since table does not exist,
946
- # table is created and license is stored in the table.
947
- >>> set_license(license=license_file, table_name='license_t1', schema_name= 'alice', source='file')
948
- The license parameters are set.
949
- The license is present in the table='license_t1', schema='alice' and column='license'.
950
- """
951
- # Create argument information matrix for validations.
952
- __arg_info_matrix = []
953
- __arg_info_matrix.append(["license", license, False, str, True])
954
- __arg_info_matrix.append(["source", source, True, str, True, mac.LICENSE_SOURCE.value])
955
- __arg_info_matrix.append(["table_name", table_name, True, str, True])
956
- __arg_info_matrix.append(["schema_name", schema_name, True, str, True])
957
-
958
- # Make sure that a correct type of values has been supplied to the arguments.
959
- validator._validate_function_arguments(__arg_info_matrix)
960
-
961
- # Make sure if table_name is provided, schema_name is also provided and vice_versa.
962
- validator._validate_mutually_inclusive_arguments(table_name, "table_name", schema_name,
963
- "schema_name")
964
-
965
- source = source.lower()
966
- if source == 'column':
967
- conn = get_connection()
968
- additional_error = ""
969
- if table_name is None:
970
- # Assign the table and schema name to model cataloging table and schema as
971
- # table_name is not provided.
972
- table_name = configure._byom_model_catalog_table
973
- schema_name = configure._byom_model_catalog_database
974
-
975
- # Raise an error if the catalog information is not set or table name is not passed
976
- additional_error = Messages.get_message(MessageCodes.EITHER_FUNCTION_OR_ARGS, "catalog",
977
- "set_byom_catalog", "catalog", "")
978
- validator._validate_argument_is_not_None(table_name, "table_name", additional_error)
979
-
980
- if validator._check_table_exists(conn, table_name, schema_name,
981
- raise_error_if_does_not_exists=True,
982
- additional_error=additional_error):
983
-
984
- # Validate the column name provided in the license argument
985
- # to check if column exists or not.
986
- license_table = DataFrame(in_schema(schema_name=schema_name,
987
- table_name=table_name))
988
-
989
- _Validators._validate_column_exists_in_dataframe(license,
990
- license_table._metaexpr,
991
- for_table=True)
992
-
993
- # Set the configuration option _byom_model_catalog_license,
994
- # _byom_model_catalog_license_source, _byom_model_catalog_license_table,
995
- # _byom_model_catalog_license_database.
996
-
997
- configure._byom_model_catalog_license = license
998
- configure._byom_model_catalog_license_source = 'column'
999
- configure._byom_model_catalog_license_table = table_name
1000
- configure._byom_model_catalog_license_database = schema_name
1001
-
1002
- print("The license parameters are set.")
1003
- print("The license is present in the table='{}', schema='{}' and column='{}'"
1004
- ".".format(configure._byom_model_catalog_license_table,
1005
- configure._byom_model_catalog_license_database,
1006
- configure._byom_model_catalog_license))
1007
- else:
1008
- # Set the configuration option _byom_model_catalog_license.
1009
- # If license is passed in a file, extract the same from the file and then set the option.
1010
- configure._byom_model_catalog_license = license if source == 'string' else \
1011
- UtilFuncs._get_file_contents(license)
1012
-
1013
- if table_name is None:
1014
- # Set the configuration option _byom_model_catalog_license_source.
1015
- # If table_name is not provided set the value to 'string' and print the information.
1016
- configure._byom_model_catalog_license_source = 'string'
1017
- print("The license parameters are set.")
1018
- print("The license is: {}".format(configure._byom_model_catalog_license))
1019
-
1020
- else:
1021
- conn = get_connection()
1022
- if not validator._check_table_exists(conn, table_name, schema_name, False):
1023
- # Create the license table with constraints
1024
- license_table = table_name
1025
- columns_to_create = {"id": NUMBER,
1026
- "license": VARCHAR}
1027
-
1028
- try:
1029
- _create_table(license_table, columns_to_create, primary_index="id",
1030
- schema_name=schema_name, check_constraint='id between 1 and 1')
1031
- query = "insert into {}.{} values (1, '{}')".format(
1032
- schema_name, license_table, configure._byom_model_catalog_license)
1033
- execute_sql(query)
1034
- except:
1035
- raise
1036
-
1037
- configure._byom_model_catalog_license = 'license'
1038
- configure._byom_model_catalog_license_source = 'column'
1039
- configure._byom_model_catalog_license_table = license_table
1040
- configure._byom_model_catalog_license_database = schema_name
1041
-
1042
- print("The license parameters are set.")
1043
- print("The license is present in the table='{}', schema='{}' and column='{}'"
1044
- ".".format(configure._byom_model_catalog_license_table,
1045
- configure._byom_model_catalog_license_database,
1046
- configure._byom_model_catalog_license))
1047
- else:
1048
- raise TeradataMlException(Messages.get_message(MessageCodes.TABLE_ALREADY_EXISTS, table_name),
1049
- MessageCodes.TABLE_ALREADY_EXISTS)
1050
-
1051
-
1052
- def get_license():
1053
- """
1054
- DESCRIPTION:
1055
- Get the license information set by set_license() function at the session level.
1056
-
1057
- PARAMETERS:
1058
- None.
1059
-
1060
- RETURNS:
1061
- None.
1062
-
1063
- RAISES:
1064
- None.
1065
-
1066
- EXAMPLES:
1067
- >>> import os, teradataml
1068
- >>> from teradataml import save_byom, get_license, set_license
1069
-
1070
- # Example 1: When license is passed as a string.
1071
- >>> set_license(license='eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI',
1072
- source='string')
1073
- The license parameters are set.
1074
- The license is: eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI
1075
- >>> get_license()
1076
- The license is: eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI
1077
-
1078
- # Example 2: When license is present in the column='license_data' and table='byom_licensed_models'.
1079
- >>> set_license(license='license_data', table_name='byom_licensed_models', schema_name='alice',
1080
- source='column')
1081
- The license parameters are set.
1082
- The license is present in the table='byom_licensed_models', schema='alice' and
1083
- column='license_data'.
1084
- >>> get_license()
1085
- The license is stored in:
1086
- table = 'byom_licensed_models'
1087
- schema = 'alice'
1088
- column = 'license_data'
1089
- >>>
1090
-
1091
- """
1092
- license = configure._byom_model_catalog_license
1093
- source = configure._byom_model_catalog_license_source
1094
- table_name = configure._byom_model_catalog_license_table
1095
- schema_name = configure._byom_model_catalog_license_database
1096
-
1097
- # Check whether license information is present or not.
1098
- if license is not None:
1099
- if source in 'string':
1100
- print("The license is: {}".format(license))
1101
- else:
1102
- print("The license is stored in:\ntable = '{}'\nschema = '{}'\ncolumn = '{}'"
1103
- .format(table_name, schema_name, license))
1104
- else:
1105
- print('Set the license information using set_license() function.')
1106
-
1107
-
1108
- def retrieve_byom(model_id,
1109
- table_name=None,
1110
- schema_name=None,
1111
- license=None,
1112
- is_license_column=False,
1113
- license_table_name=None,
1114
- license_schema_name=None,
1115
- require_license=False):
1116
- """
1117
- DESCRIPTION:
1118
- Function to retrieve a saved model. Output of this function can be
1119
- directly passed as input to the PMMLPredict and H2OPredict functions.
1120
- Some models generated, such as H2O-DAI has license associated with it.
1121
- When such models are to be used for scoring, one must retrieve the model
1122
- by passing relevant license information. Please refer to "license_key"
1123
- for more details.
1124
-
1125
- PARAMETERS:
1126
- model_id:
1127
- Required Argument.
1128
- Specifies the unique model identifier of the model to be retrieved.
1129
- Types: str
1130
-
1131
- table_name:
1132
- Optional Argument.
1133
- Specifies the name of the table to retrieve external model from.
1134
- Notes:
1135
- * One must either specify this argument or set the byom model catalog table
1136
- name using set_byom_catalog().
1137
- * If none of these arguments are set, exception is raised; If both arguments
1138
- are set, the settings in retrieve_byom() take precedence and is used for
1139
- function execution.
1140
- Types: str
1141
-
1142
- schema_name:
1143
- Optional Argument.
1144
- Specifies the name of the schema/database in which the table specified in
1145
- "table_name" is looked up.
1146
- Notes:
1147
- * One must either specify this argument and table_name argument
1148
- or set the byom model catalog schema and table name using set_byom_catalog().
1149
- * If none of these arguments are set, exception is raised; If both arguments
1150
- are set, the settings in retrieve_byom() take precedence and is used for
1151
- function execution.
1152
- * If user specifies schema_name argument table_name argument has to be specified,
1153
- else exception is raised.
1154
- Types: str
1155
-
1156
- license:
1157
- Optional Argument.
1158
- Specifies the license key information in different ways specified as below:
1159
- * If the license key is stored in a variable, user can pass it as string.
1160
- * If the license key is stored in table, then pass a column name containing
1161
- the license. Based on the table which has license information stored,
1162
- * If the information is stored in the same model table as that of the
1163
- model, one must set "is_license_column" to True.
1164
- * If the information is stored in the different table from that of the
1165
- "table_name", one can specify the table name and schema name using
1166
- "license_table_name" and "license_schema_name" respectively.
1167
- Types: str
1168
-
1169
- is_license_column:
1170
- Optional Argument.
1171
- Specifies whether license key specified in "license" is a license key
1172
- or column name. When set to True, "license" contains the column name
1173
- containing license data, otherwise contains the actual license key.
1174
- Default Value: False
1175
- Types: str
1176
-
1177
- license_table_name:
1178
- Optional Argument.
1179
- Specifies the name of the table which holds license key. One can specify this
1180
- argument if license is stored in a table other than "table_name".
1181
- Types: str
1182
-
1183
- license_schema_name:
1184
- Optional Argument.
1185
- Specifies the name of the Database associated with the "license_table_name".
1186
- If not specified, current Database would be considered for "license_table_name".
1187
- Types: str
1188
-
1189
- require_license:
1190
- Optional Argument.
1191
- Specifies whether the model to be retrieved is associated with a license.
1192
- If True, license information set by the set_license() is retrieved.
1193
- Note:
1194
- If license parameters are passed, then this argument is ignored.
1195
- Default value: False
1196
- Types: bool
1197
-
1198
- Note:
1199
- The following table describes the system behaviour in different scenarios:
1200
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1201
- | In retrieve_byom() | In set_byom_catalog() | System Behavior |
1202
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1203
- | table_name | schema_name | table_name | schema_name | |
1204
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1205
- | Set | Set | Set | Set | schema_name and table_name in |
1206
- | | | | | retrieve_byom() are used for |
1207
- | | | | | function execution. |
1208
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1209
- | Set | Set | Not set | Not set | schema_name and table_name in |
1210
- | | | | | retrieve_byom() is used for |
1211
- | | | | | function execution. |
1212
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1213
- | Not set | Not set | Set | Set | table_name from retrieve_byom() |
1214
- | | | | | is used and schema name |
1215
- | | | | | associated with the current |
1216
- | | | | | context is used. |
1217
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1218
- | Not set | Set | Set | Set | Exception is raised. |
1219
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1220
- | Not set | Not set | Set | Set | table_name and schema_name |
1221
- | | | | | from set_byom_catalog() |
1222
- | | | | | are used for function execution. |
1223
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1224
- | Not set | Not set | Set | Not set | table_name from set_byom_catalog() |
1225
- | | | | | is used and schema name |
1226
- | | | | | associated with the current |
1227
- | | | | | context is used. |
1228
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1229
- | Not set | Not set | Not set | Not set | Exception is raised |
1230
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1231
-
1232
- RETURNS:
1233
- teradataml DataFrame
1234
-
1235
- RAISES:
1236
- TeradataMlException, TypeError
1237
-
1238
- EXAMPLES:
1239
- >>> import teradataml, os, datetime
1240
- >>> model_file = os.path.join(os.path.dirname(teradataml.__file__), 'data', 'models', 'iris_kmeans_model')
1241
- >>> from teradataml import save_byom, retrieve_byom, get_context
1242
- >>> save_byom('model5', model_file, 'byom_models')
1243
- Model is saved.
1244
- >>> save_byom('model6', model_file, 'byom_models', schema_name='test')
1245
- Model is saved.
1246
- >>> save_byom('licensed_model1', model_file, 'byom_licensed_models', additional_columns={"license_data": "A5sUL9KU_kP35Vq"})
1247
- Created the model table 'byom_licensed_models' as it does not exist.
1248
- Model is saved.
1249
- >>> # Store the license in a table.
1250
- >>> license = 'eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI'
1251
- >>> lic_table = 'create table license (id integer between 1 and 1,license_key varchar(2500)) unique primary index(id);'
1252
- >>> execute_sql(lic_table)
1253
- <sqlalchemy.engine.cursor.LegacyCursorResult object at 0x0000014AAFF27080>
1254
- >>> execute_sql("insert into license values (1, 'peBVRtjA-ib')")
1255
- <sqlalchemy.engine.cursor.LegacyCursorResult object at 0x0000014AAFF27278>
1256
- >>>
1257
-
1258
- # Example 1 - Retrieve a model with id 'model5' from the table 'byom_models'.
1259
- >>> df = retrieve_byom('model5', table_name='byom_models')
1260
- >>> df
1261
- model
1262
- model_id
1263
- model5 b'504B03041400080808...'
1264
-
1265
- # Example 2 - Retrieve a model with id 'model6' from the table 'byom_models'
1266
- # and the table is in 'test' DataBase.
1267
- >>> df = retrieve_byom('model6', table_name='byom_models', schema_name='test')
1268
- >>> df
1269
- model
1270
- model_id
1271
- model6 b'504B03041400080808...'
1272
-
1273
- # Example 3 - Retrieve a model with id 'model5' from the table 'byom_models'
1274
- # with license key stored in a variable 'license'.
1275
- >>> df = retrieve_byom('model5', table_name='byom_models', license=license)
1276
- >>> df
1277
- model license
1278
- model_id
1279
- model5 b'504B03041400080808...' eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI
1280
- >>>
1281
-
1282
- # Example 4 - Retrieve a model with id 'licensed_model1' and associated license
1283
- # key stored in table 'byom_licensed_models'. License key is stored
1284
- # in column 'license_data'.
1285
- >>> df = retrieve_byom('licensed_model1',
1286
- ... table_name='byom_licensed_models',
1287
- ... license='license_data',
1288
- ... is_license_column=True)
1289
- >>> df
1290
- model license
1291
- model_id
1292
- licensed_model1 b'504B03041400080808...' A5sUL9KU_kP35Vq
1293
- >>>
1294
-
1295
- # Example 5 - Retrieve a model with id 'licensed_model1' from the table
1296
- # 'byom_licensed_models' and associated license key stored in
1297
- # column 'license_key' of the table 'license'.
1298
- >>> df = retrieve_byom('licensed_model1',
1299
- ... table_name='byom_licensed_models',
1300
- ... license='license_key',
1301
- ... is_license_column=True,
1302
- ... license_table_name='license')
1303
- >>> df
1304
- model license
1305
- model_id
1306
- licensed_model1 b'504B03041400080808...' peBVRtjA-ib
1307
- >>>
1308
-
1309
- # Example 6 - Retrieve a model with id 'licensed_model1' from the table
1310
- # 'byom_licensed_models' and associated license key stored in
1311
- # column 'license_key' of the table 'license' present in the
1312
- # schema 'mldb'.
1313
- >>> df = retrieve_byom('licensed_model1',
1314
- ... table_name='byom_licensed_models',
1315
- ... license='license_key',
1316
- ... is_license_column=True,
1317
- ... license_table_name='license',
1318
- ... license_schema_name='mldb')
1319
- >>> df
1320
- model license
1321
- model_id
1322
- licensed_model1 b'504B03041400080808...' peBVRtjA-ib
1323
- >>>
1324
-
1325
- # Example 7 - Retrieve a model with id 'model5' from the table 'byom_models'
1326
- # with license key stored by set_license in a variable 'license'.
1327
- # The catalog information is set using set_byom_catalog()
1328
- # to table_name='byom_models', schema_name='alice'
1329
- # schema_name='alice' and is used to retrieve the model.
1330
- >>> set_byom_catalog(table_name='byom_models', schema_name='alice')
1331
- The model cataloging parameters are set to table_name='byom_models' and
1332
- schema_name='alice'
1333
- >>> set_license(license=license, source='string')
1334
- The license parameters are set.
1335
- The license is: eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI
1336
- >>> df = retrieve_byom('model5', require_license=True)
1337
- >>> df
1338
- model license
1339
- model_id
1340
- model5 b'504B03041400080808...' eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI
1341
- >>>
1342
-
1343
- # Example 8 - Retrieve a model with id 'model5' from the table 'byom_models'
1344
- # with license key stored by set_license in a file. Since the
1345
- # schema name is not provided, default schema is used.
1346
- >>> license_file = os.path.join(os.path.dirname(teradataml.__file__),
1347
- ... 'data', 'models', 'License_file.txt')
1348
- >>> set_license(license=license_file, source='file')
1349
- The license parameters are set.
1350
- The license is: license_string
1351
- >>> df = retrieve_byom('model5', table_name='byom_models', require_license=True)
1352
- >>> df
1353
- model license
1354
- model_id
1355
- model5 b'504B03041400080808...' license_string
1356
-
1357
- # Example 9 - Retrieve a model with id 'licensed_model1' and associated license
1358
- # key stored in column 'license_key' of the table 'license' present
1359
- # in the schema 'alice'. The byom catalog and license information is
1360
- # set using set_byom_catalog() and set_license() respectively.
1361
- # Function is executed with license parameters passed,
1362
- # which overrides the license information set at the session level.
1363
- >>> set_byom_catalog(table_name='byom_licensed_models', schema_name='alice')
1364
- The model cataloging parameters are set to table_name='byom_licensed_models'
1365
- and schema_name='alice'
1366
- >>> set_license(license=license, source='string')
1367
- The license parameters are set.
1368
- The license is: eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI
1369
- >>> df = retrieve_byom('licensed_model1', license='license_key',
1370
- ... is_license_column=True, license_table_name='license')
1371
- >>> df
1372
- model license
1373
- model_id
1374
- licensed_model1 b'504B03041400080808...' peBVRtjA-ib
1375
-
1376
- # Example 10 - Retrieve a model with id 'licensed_model1' from the table
1377
- # 'byom_licensed_models' and associated license key stored in
1378
- # column 'license_data' of the table 'byom_licensed_models'.
1379
- # The byom catalog and license information is already set
1380
- # at the session level, passing the table_name to the
1381
- # function call overrides the byom catalog information
1382
- # at the session level.
1383
- >>> set_byom_catalog(table_name='byom_models', schema_name='alice')
1384
- The model cataloging parameters are set to table_name='byom_models' and
1385
- schema_name='alice'
1386
- >>> set_license(license='license_data', table_name='byom_licensed_models',
1387
- schema_name='alice', source='column')
1388
- The license parameters are set.
1389
- The license is present in the table='byom_licensed_models', schema='alice'
1390
- and column='license_data'.
1391
- >>> df = retrieve_byom('licensed_model1', table_name='byom_licensed_models',
1392
- ... require_license=True)
1393
- >>> df
1394
- model license
1395
- model_id
1396
- licensed_model1 b'504B03041400080808...' A5sUL9KU_kP35Vq
1397
-
1398
- # Example 11 - If require license=False which is the default value for the above example,
1399
- # the license information is not retrieved.
1400
- >>> df = retrieve_byom('licensed_model1', table_name='byom_licensed_models')
1401
- >>> df
1402
- model
1403
- model_id
1404
- licensed_model1 b'504B03041400080808...'
1405
- """
1406
-
1407
-
1408
- # Let's perform argument validations.
1409
- # Create argument information matrix to do parameter checking
1410
- __arg_info_matrix = []
1411
- __arg_info_matrix.append(["model_id", model_id, False, str, True])
1412
- __arg_info_matrix.append(["table_name", table_name, True, str, True])
1413
- __arg_info_matrix.append(["schema_name", schema_name, True, str, True])
1414
- __arg_info_matrix.append(["license", license, True, str, True])
1415
- __arg_info_matrix.append(["is_license_column", is_license_column, False, bool])
1416
- __arg_info_matrix.append(["license_table_name", license_table_name, True, str, True])
1417
- __arg_info_matrix.append(["license_schema_name", license_schema_name, True, str, True])
1418
-
1419
- # Make sure that a correct type of values has been supplied to the arguments.
1420
- validator._validate_function_arguments(__arg_info_matrix)
1421
-
1422
- # Set the table and schema name according to the model cataloging parameters and the user inputs.
1423
- table_name, schema_name = __set_validate_catalog_parameters(table_name, schema_name)
1424
-
1425
- if require_license and license is None:
1426
- license = configure._byom_model_catalog_license
1427
- is_license_column = True if configure._byom_model_catalog_license_source == 'column' else False
1428
- license_table_name = configure._byom_model_catalog_license_table
1429
- license_schema_name = configure._byom_model_catalog_license_database
1430
-
1431
- # Check whether license information is present or not.
1432
- additional_error = Messages.get_message(MessageCodes.EITHER_FUNCTION_OR_ARGS, "license", "set_license",
1433
- "license", "")
1434
- validator._validate_argument_is_not_None(license, "license", additional_error)
1435
-
1436
- # Before proceeding further, check whether table exists or not.
1437
- conn = get_connection()
1438
- if not conn.dialect.has_table(conn, table_name=table_name, schema=schema_name):
1439
- error_code = MessageCodes.MODEL_CATALOGING_OPERATION_FAILED
1440
- error_msg = Messages.get_message(
1441
- error_code, "retrieve", 'Table "{}.{}" does not exist.'.format(schema_name, table_name))
1442
- raise TeradataMlException(error_msg, error_code)
1443
-
1444
- table_name = in_schema(schema_name=schema_name, table_name=table_name)
1445
- model_details = DataFrame(table_name)
1446
- model_details = model_details[model_details.model_id == model_id]
1447
-
1448
- # __check_if_model_exists does the same check however, but it do not return DataFrame.
1449
- # So, doing the model existence check here.
1450
- if model_details.shape[0] == 0:
1451
- error_code = MessageCodes.MODEL_NOT_FOUND
1452
- error_msg = Messages.get_message(error_code, model_id, " in the table '{}'".format(table_name))
1453
- raise TeradataMlException(error_msg, error_code)
1454
-
1455
- if model_details.shape[0] > 1:
1456
- error_code = MessageCodes.MODEL_CATALOGING_OPERATION_FAILED
1457
- error_msg = Messages.get_message(
1458
- error_code, "retrieve", "Duplicate model found for model id '{}'".format(model_id))
1459
- raise TeradataMlException(error_msg, error_code)
1460
-
1461
- # If license holds the actual license key, assign it to model DataFrame.
1462
- # If license holds the column name, i.e., license data is stored in a table,
1463
- # If table which holds license data is same as model table, select the column.
1464
- # If table which holds license data is different from model table, create a
1465
- # DataFrame on the table which holds license data and do cross join with
1466
- # models DataFrame. The cross join creates a new DataFrame which has columns
1467
- # of both tables.
1468
- # Note that, license table should hold only one record. so even cartesian
1469
- # product should hold only record in the DataFrame.
1470
-
1471
- if not license:
1472
- return model_details.select(["model_id", "model"])
1473
-
1474
- # Lambda function for attaching the license to model DataFrame.
1475
- _get_license_model_df = lambda license: model_details.assign(drop_columns=True,
1476
- model_id=model_details.model_id,
1477
- model=model_details.model,
1478
- license=license)
1479
-
1480
- # If user passed a license as a variable, attach it to the model DataFrame.
1481
- if not is_license_column:
1482
- return _get_license_model_df(license)
1483
-
1484
- # If license exists in the column of the same model table.
1485
- if is_license_column and not license_table_name:
1486
- _Validators._validate_column_exists_in_dataframe(license,
1487
- model_details._metaexpr,
1488
- for_table=True,
1489
- column_arg='license',
1490
- data_arg=table_name)
1491
- return _get_license_model_df(model_details[license])
1492
-
1493
- # If license exists in the column of the table different from model table.
1494
- license_schema_name = license_schema_name if license_schema_name else schema_name
1495
- license_table = in_schema(license_schema_name, license_table_name)
1496
-
1497
- # Check whether license table exists or not before proceed further.
1498
- if not conn.dialect.has_table(conn, table_name=license_table_name, schema=license_schema_name):
1499
- error_code = MessageCodes.EXECUTION_FAILED
1500
- error_msg = Messages.get_message(
1501
- error_code, "retrieve the model", 'Table "{}" does not exist.'.format(license_table))
1502
- raise TeradataMlException(error_msg, error_code)
1503
-
1504
- license_df = DataFrame(license_table)
1505
- # Check column existed in table.
1506
- _Validators._validate_column_exists_in_dataframe(license,
1507
- license_df._metaexpr,
1508
- for_table=True,
1509
- column_arg='license',
1510
- data_arg=license_table)
1511
-
1512
- if license_df.shape[0] > 1:
1513
- error_code = MessageCodes.MODEL_CATALOGING_OPERATION_FAILED
1514
- error_msg = Messages.get_message(
1515
- error_code, "retrieve", "Table which holds license key should have only one row.")
1516
- raise TeradataMlException(error_msg, error_code)
1517
-
1518
- model_details = model_details.select(["model_id", "model"])
1519
-
1520
- # Make sure license is the column name for license key.
1521
- license_df = license_df.assign(drop_columns=True, license=license_df[license])
1522
- return model_details.join(license_df, how="cross")
1523
-
1524
-
1525
- def list_byom(table_name=None, schema_name=None, model_id=None):
1526
- """
1527
- DESCRIPTION:
1528
- The list_byom() function allows a user to list saved models, filtering the results based on the optional arguments.
1529
-
1530
- PARAMETERS:
1531
- table_name:
1532
- Optional Argument.
1533
- Specifies the name of the table to list models from.
1534
- Notes:
1535
- * One must either specify this argument or set the byom model catalog table
1536
- name using set_byom_catalog().
1537
- * If none of these arguments are set, exception is raised; If both arguments
1538
- are set, the settings in list_byom() take precedence and is used for
1539
- function execution.
1540
- Types: str
1541
-
1542
- schema_name:
1543
- Optional Argument.
1544
- Specifies the name of the schema/database in which the table specified in
1545
- "table_name" is looked up.
1546
- Notes:
1547
- * One must either specify this argument and table_name argument
1548
- or set the byom model catalog schema and table name using set_byom_catalog().
1549
- * If none of these arguments are set, exception is raised; If both arguments
1550
- are set, the settings in list_byom() take precedence and is used for
1551
- function execution.
1552
- * If user specifies schema_name argument table_name argument has to be specified,
1553
- else exception is raised.
1554
- Types: str
1555
-
1556
- model_id:
1557
- Optional Argument.
1558
- Specifies the unique model identifier of the model(s). If specified,
1559
- the models with either exact match or a substring match, are listed.
1560
- Types: str OR list
1561
-
1562
- Note:
1563
- The following table describes the system behaviour in different scenarios:
1564
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1565
- | In list_byom() | In set_byom_catalog() | System Behavior |
1566
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1567
- | table_name | schema_name | table_name | schema_name | |
1568
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1569
- | Set | Set | Set | Set | schema_name and table_name in |
1570
- | | | | | list_byom() are used for |
1571
- | | | | | function execution. |
1572
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1573
- | Set | Set | Not set | Not set | schema_name and table_name in |
1574
- | | | | | list_byom() is used for |
1575
- | | | | | function execution. |
1576
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1577
- | Set | Not set | Set | Set | table_name from list_byom() |
1578
- | | | | | is used and schema name |
1579
- | | | | | associated with the current |
1580
- | | | | | context is used. |
1581
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1582
- | Not set | Set | Set | Set | Exception is raised. |
1583
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1584
- | Not set | Not set | Set | Set | table_name and schema_name |
1585
- | | | | | from set_byom_catalog() |
1586
- | | | | | are used for function execution. |
1587
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1588
- | Not set | Not set | Set | Not set | table_name from set_byom_catalog() |
1589
- | | | | | is used and schema name |
1590
- | | | | | associated with the current |
1591
- | | | | | context is used. |
1592
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1593
- | Not set | Not set | Not set | Not set | Exception is raised |
1594
- +----------------+-------------+-----------------------+-------------+-------------------------------------+
1595
- RETURNS:
1596
- None.
1597
-
1598
- RAISES:
1599
- TeradataMlException, TypeError
1600
-
1601
- EXAMPLES:
1602
- >>> import teradataml, os, datetime
1603
- >>> model_file = os.path.join(os.path.dirname(teradataml.__file__), 'data', 'models', 'iris_kmeans_model')
1604
- >>> from teradataml import save_byom, list_byom
1605
- >>> save_byom('model7', model_file, 'byom_models')
1606
- Model is saved.
1607
- >>> save_byom('iris_model1', model_file, 'byom_models')
1608
- Model is saved.
1609
- >>> save_byom('model8', model_file, 'byom_models', schema_name='test')
1610
- Model is saved.
1611
- >>> save_byom('iris_model1', model_file, 'byom_licensed_models')
1612
- Model is saved.
1613
- >>>
1614
-
1615
- # Example 1 - List all the models from the table byom_models.
1616
- >>> list_byom(table_name='byom_models')
1617
- model
1618
- model_id
1619
- model7 b'504B03041400080808...'
1620
- iris_model1 b'504B03041400080808...'
1621
- >>>
1622
-
1623
- # Example 2 - List all the models with model_id containing 'iris' string.
1624
- # List such models from 'byom_models' table.
1625
- >>> list_byom(table_name='byom_models', model_id='iris')
1626
- model
1627
- model_id
1628
- iris_model1 b'504B03041400080808...'
1629
- >>>
1630
-
1631
- # Example 3 - List all the models with model_id containing either 'iris'
1632
- # or '7'. List such models from 'byom_models' table.
1633
- >>> list_byom(table_name='byom_models', model_id=['iris', '7'])
1634
- model
1635
- model_id
1636
- model7 b'504B03041400080808...'
1637
- iris_model1 b'504B03041400080808...'
1638
- >>>
1639
-
1640
- # Example 4 - List all the models from the 'byom_models' table and table is
1641
- # in 'test' DataBase.
1642
- >>> list_byom(table_name='byom_models', schema_name='test')
1643
- model
1644
- model_id
1645
- model8 b'504B03041400080808...'
1646
- >>>
1647
-
1648
- # Example 5 - List all the models from the model cataloging table
1649
- # set by set_byom_catalog().
1650
- >>> set_byom_catalog(table_name='byom_models', schema_name='alice')
1651
- The model cataloging parameters are set to table_name='byom_models' and schema_name='alice'
1652
- >>> list_byom()
1653
- model
1654
- model_id
1655
- model8 b'504B03041400080808...'
1656
-
1657
- # Example 6 - List all the models from the table other than model cataloging table
1658
- # set at the session level.
1659
- >>> set_byom_catalog(table_name='byom_models', schema_name= 'alice')
1660
- The model cataloging parameters are set to table_name='byom_models' and schema_name='alice'
1661
- >>> list_byom(table_name='byom_licensed_models')
1662
- model
1663
- model_id
1664
- iris_model1 b'504B03041400080808...'
1665
-
1666
- """
1667
-
1668
- # Let's perform argument validations.
1669
- # Create argument information matrix to do parameter checking
1670
- __arg_info_matrix = []
1671
- __arg_info_matrix.append(["table_name", table_name, True, str, True])
1672
- __arg_info_matrix.append(["schema_name", schema_name, True, str, True])
1673
- __arg_info_matrix.append(["model_id", model_id, True, (str, list), True])
1674
-
1675
- # Make sure that a correct type of values has been supplied to the arguments.
1676
- validator._validate_function_arguments(__arg_info_matrix)
1677
-
1678
- # Set the table and schema name according to the model cataloging parameters and the user inputs.
1679
- table_name, schema_name = __set_validate_catalog_parameters(table_name, schema_name)
1680
-
1681
- # Before proceeding further, check whether table exists or not.
1682
- conn = get_connection()
1683
- if not conn.dialect.has_table(conn, table_name=table_name, schema=schema_name):
1684
- error_code = MessageCodes.MODEL_CATALOGING_OPERATION_FAILED
1685
- error_msg = Messages.get_message(
1686
- error_code, "list", 'Table "{}.{}" does not exist.'.format(schema_name, table_name))
1687
- raise TeradataMlException(error_msg, error_code)
1688
-
1689
- model_details = DataFrame(in_schema(schema_name, table_name))
1690
-
1691
- filter_condition = None
1692
- if model_id:
1693
- model_ids = UtilFuncs._as_list(model_id)
1694
- for modelid in model_ids:
1695
- # Filter Expression on model_id column.
1696
- # We are looking to find all rows with model_id matching with 'modelid' string.
1697
- # This is case-insensitive look-up.
1698
- filter_expression = __get_like_filter_expression_on_col(model_details._metaexpr,
1699
- "model_id", modelid)
1700
- filter_condition = filter_condition | filter_expression \
1701
- if filter_condition else filter_expression
1702
-
1703
- if filter_condition:
1704
- model_details = model_details[filter_condition]
1705
-
1706
- if model_details.shape[0] != 0:
1707
- orig_max_rows_num = display.max_rows
1708
- try:
1709
- display.max_rows = 99999
1710
- print(model_details)
1711
- except Exception:
1712
- raise
1713
- finally:
1714
- display.max_rows = orig_max_rows_num
1715
- else:
1716
- print("No models found.")
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 the core framework that allows user to load BYOM to Vantage.
10
+ """
11
+
12
+ from teradataml.dataframe.dataframe import DataFrame, in_schema
13
+ from teradataml.utils.validators import _Validators
14
+ from teradataml.context.context import _get_current_databasename, get_connection, get_context
15
+ from teradataml.common.messagecodes import MessageCodes
16
+ from teradataml.common.messages import Messages
17
+ from teradataml.common.exceptions import TeradataMlException
18
+ from teradatasql import OperationalError as SqlOperationalError
19
+ from teradatasqlalchemy.types import *
20
+ from teradatasqlalchemy.types import _TDType
21
+ from teradataml.dbutils.dbutils import _get_quoted_object_name, _create_table
22
+ from teradataml.common.utils import UtilFuncs
23
+ from teradataml.utils.dtypes import _Dtypes
24
+ from teradataml.catalog.model_cataloging_utils import __get_like_filter_expression_on_col
25
+ from teradataml.options.display import display
26
+ from teradataml.common.constants import ModelCatalogingConstants as mac
27
+ from teradataml.options.configure import configure
28
+ from teradataml.utils.utils import execute_sql
29
+ from teradatasqlalchemy.telemetry.queryband import collect_queryband
30
+
31
+ validator = _Validators()
32
+
33
+
34
+ def __check_if_model_exists(model_id,
35
+ table_name,
36
+ schema_name=None,
37
+ raise_error_if_model_found=False,
38
+ raise_error_if_model_not_found=False):
39
+ """
40
+ DESCRIPTION:
41
+ Internal function to check if byom model with given "model_id", exists or not.
42
+
43
+ PARAMETERS:
44
+ model_id:
45
+ Required Argument.
46
+ Specifies the name of the model identifier to check whether it exists or not.
47
+ Types: str
48
+
49
+ table_name:
50
+ Required Argument.
51
+ Specifies the table name that may or may not contain entry for the model.
52
+ Types: str
53
+
54
+ schema_name:
55
+ Optional Argument.
56
+ Specifies the name of the schema, to look out for table specified in
57
+ "table_name". If not specified, then "table_name" is looked over in
58
+ the current database.
59
+ Types: str
60
+
61
+ raise_error_if_model_found:
62
+ Optional Argument.
63
+ Specifies the flag to decide whether to raise error when model exists or not.
64
+ Default Value: False (Do not raise exception)
65
+ Types: bool
66
+
67
+ raise_error_if_model_not_found:
68
+ Optional Argument.
69
+ Specifies the flag to decide whether to raise error when model is found or not.
70
+ Default Value: False (Do not raise exception)
71
+ Types: bool
72
+
73
+ RETURNS:
74
+ bool.
75
+
76
+ RAISES:
77
+ TeradataMlException - MODEL_ALREADY_EXISTS, MODEL_NOT_FOUND
78
+
79
+ EXAMPLES:
80
+ >>> meta_df = __check_if_model_exists("glm_out")
81
+ """
82
+ # If external model, create DataFrame on table specified in parameters within
83
+ # current schema. Else, create DataFrame on table & schema specified in parameters.
84
+ schema_name = schema_name if schema_name is not None else _get_current_databasename()
85
+ models_meta_df = DataFrame(in_schema(schema_name, table_name))
86
+ models_meta_df = models_meta_df[models_meta_df.model_id == model_id]
87
+
88
+ num_rows = models_meta_df.shape[0]
89
+
90
+ if raise_error_if_model_found:
91
+ if num_rows == 1:
92
+ # If model with name 'name' already exists.
93
+ raise TeradataMlException(Messages.get_message(MessageCodes.MODEL_ALREADY_EXISTS,
94
+ model_id),
95
+ MessageCodes.MODEL_ALREADY_EXISTS)
96
+
97
+ if raise_error_if_model_not_found:
98
+ if num_rows == 0:
99
+ # 'name' MODEL_NOT_FOUND
100
+ raise TeradataMlException(Messages.get_message(MessageCodes.MODEL_NOT_FOUND,
101
+ model_id, ''),
102
+ MessageCodes.MODEL_NOT_FOUND)
103
+
104
+ return True if num_rows == 1 else False
105
+
106
+
107
+ def __set_validate_catalog_parameters(table_name=None, schema_name=None):
108
+ """
109
+ DESCRIPTION:
110
+ Internal function to set the table and schema name
111
+ for byom catalog API's according to the model cataloging
112
+ parameters and the user inputs.
113
+
114
+ PARAMETERS:
115
+ table_name:
116
+ Optional Argument.
117
+ Specifies the name of the byom catalog table.
118
+ Notes:
119
+ * One must either specify this argument or set the byom model catalog table
120
+ name using set_byom_catalog().
121
+ * If none of these arguments are set, exception is raised; If both arguments
122
+ are set, the settings in function call take precedence and is used for
123
+ function execution when saving an model.
124
+ Types: str
125
+
126
+ schema_name:
127
+ Optional Argument.
128
+ Specifies the name of the schema/database in which the table specified in
129
+ "table_name" is looked up.
130
+ Notes:
131
+ * One must either specify this argument or set the byom model catalog schema
132
+ name using set_byom_catalog().
133
+ * If none of these arguments are set, exception is raised; If both arguments
134
+ are set, the settings in function call take precedence and is used for
135
+ function execution when saving an model.
136
+ Types: str
137
+
138
+ RETURNS:
139
+ List of "table_name" and "schema_name".
140
+
141
+ RAISES:
142
+ ValueError
143
+
144
+ EXAMPLES:
145
+ >>> __set_validate_catalog_parameters(table_name = "model_catalog_table",
146
+ schema_name="model_catalog_schema")
147
+ """
148
+ # Raise an error if schema_name is provided and table_name is not provided
149
+ _Validators._validate_dependent_argument("schema_name", schema_name, "table_name", table_name)
150
+
151
+ # Set the schema_name to default schema_name if only table_name is provided.
152
+ # Set the table_name and schema_name to model catalog session level variables if not provided.
153
+ schema_name = schema_name if schema_name is not None else\
154
+ _get_current_databasename() if table_name is not None else configure._byom_model_catalog_database
155
+ table_name = table_name if table_name is not None else configure._byom_model_catalog_table
156
+
157
+ # Check whether table information is present and not None.
158
+ additional_error = Messages.get_message(MessageCodes.EITHER_FUNCTION_OR_ARGS, "catalog", "set_byom_catalog",
159
+ "catalog", "")
160
+ validator._validate_argument_is_not_None(table_name, "table_name", additional_error)
161
+
162
+ return [table_name, schema_name]
163
+
164
+
165
+ @collect_queryband(queryband="stByomCtlg")
166
+ def set_byom_catalog(table_name,
167
+ schema_name=None):
168
+ """
169
+ DESCRIPTION:
170
+ Function to set the BYOM model catalog information to be used by
171
+ BYOM model cataloging APIs such as:
172
+ * delete_byom
173
+ * list_byom
174
+ * retrieve_byom
175
+ * save_byom
176
+ * set_license
177
+
178
+ PARAMETERS:
179
+ table_name:
180
+ Required Argument.
181
+ Specifies the name of the table to be used for BYOM model cataloging.
182
+ This table will be used for saving, retrieving BYOM model information
183
+ by BYOM model cataloging APIs.
184
+ Types: str.
185
+
186
+ schema_name:
187
+ Optional Argument.
188
+ Specifies the name of the schema/database in which the table specified in
189
+ "table_name" is looked up. If not specified, then table is looked
190
+ up in current schema/database.
191
+ Types: str
192
+
193
+ RETURNS:
194
+ None
195
+
196
+ RAISES:
197
+ TeradataMlException
198
+
199
+ EXAMPLES:
200
+ >>> from teradataml import set_byom_catalog
201
+
202
+ # Example 1 - Set global parameters table_name = 'model_table_name' and schema_name = 'model_schema_name';
203
+ >>> set_byom_catalog(table_name='model_table_name', schema_name='model_schema_name')
204
+ The model cataloging parameters are set to table_name='model_table_name' and schema_name='model_schema_name'
205
+
206
+ """
207
+
208
+ # Let's perform argument validations.
209
+ # Create argument information matrix to do parameter checking.
210
+ __arg_info_matrix = []
211
+ __arg_info_matrix.append(["table_name", table_name, False, str, True])
212
+ __arg_info_matrix.append(["schema_name", schema_name, True, str, True])
213
+
214
+ # Make sure that a correct type of values has been supplied to the arguments.
215
+ validator._validate_function_arguments(__arg_info_matrix)
216
+
217
+ schema_name = schema_name if schema_name is not None else _get_current_databasename()
218
+
219
+ # Perform required validations for the API.
220
+ # Check whether the table given exist or not.
221
+ conn = get_connection()
222
+ validator._check_table_exists(conn, table_name, schema_name)
223
+
224
+ configure._byom_model_catalog_table = table_name
225
+ configure._byom_model_catalog_database = schema_name
226
+ print("The model cataloging parameters are set to table_name='{}' and "
227
+ "schema_name='{}'".format(table_name, schema_name))
228
+
229
+
230
+ @collect_queryband(queryband="svByom")
231
+ def save_byom(model_id,
232
+ model_file,
233
+ table_name=None,
234
+ schema_name=None,
235
+ additional_columns=None,
236
+ additional_columns_types=None):
237
+ """
238
+ DESCRIPTION:
239
+ Function to save externally trained models in Teradata Vantage in the
240
+ specified table. Function allows user to save various models stored in
241
+ different formats such as PMML, MOJO etc. If the specified model table
242
+ exists in Vantage, model data is saved in the same, otherwise model table
243
+ is created first based on the user parameters and then model data is
244
+ saved. See below 'Note' section for more details.
245
+
246
+ Notes:
247
+ If user specified table exists, then
248
+ a. Table must have at least two columns with names and types as
249
+ specified below:
250
+ * 'model_id' of type VARCHAR of any length and
251
+ * 'model' column of type BLOB.
252
+ b. User can choose to have the additional columns as well to store
253
+ additional information of the model. This information can be passed
254
+ using "additional_columns" parameter. See "additional_columns"
255
+ argument description for more details.
256
+ If user specified table does not exist, then
257
+ a. Function creates the table with the name specified in "table_name".
258
+ b. Table is created in the schema specified in "schema_name". If
259
+ "schema_name" is not specified, then current schema is considered
260
+ for "schema_name".
261
+ c. Table is created with columns:
262
+ * 'model_id' with type specified in "additional_columns_types". If
263
+ not specified, table is created with 'model_id' column as VARCHAR(128).
264
+ * 'model' with type specified in "additional_columns_types". If
265
+ not specified, table is created with 'model' column as BLOB.
266
+ * Columns specified in "additional_columns" parameter. See "additional_columns"
267
+ argument description for more details.
268
+ * Datatypes of these additional columns are either taken from
269
+ the values passed to "additional_columns_types" or inferred
270
+ from the values passed to the "additional_columns". See
271
+ "additional_columns_types" argument description for more details.
272
+
273
+ PARAMETERS:
274
+ model_id:
275
+ Required Argument.
276
+ Specifies the unique model identifier for model.
277
+ Types: str.
278
+
279
+ model_file:
280
+ Required Argument.
281
+ Specifies the absolute path of the file which has model information.
282
+ Types: str
283
+
284
+ table_name:
285
+ Optional Argument.
286
+ Specifies the name of the table where model is saved. If "table_name"
287
+ does not exist, this function creates table according to "additional_columns"
288
+ and "additional_columns_types".
289
+ Notes:
290
+ * One must either specify this argument or set the byom model catalog table
291
+ name using set_byom_catalog().
292
+ * If none of these arguments are set, exception is raised; If both arguments
293
+ are set, the settings in save_byom() take precedence and is used for
294
+ function execution when saving an model.
295
+ Types: str
296
+
297
+ schema_name:
298
+ Optional Argument.
299
+ Specifies the name of the schema/database in which the table specified in
300
+ "table_name" is looked up.
301
+ Notes:
302
+ * One must either specify this argument and table_name argument
303
+ or set the byom model catalog schema and table name using set_byom_catalog().
304
+ * If none of these arguments are set, exception is raised; If both arguments
305
+ are set, the settings in save_byom() take precedence and is used for
306
+ function execution when saving an model.
307
+ * If user specifies schema_name argument table_name argument has to be specified,
308
+ else exception is raised.
309
+ Types: str
310
+
311
+ additional_columns:
312
+ Optional Argument.
313
+ Specifies the additional information about the model to be saved in the
314
+ model table. Additional information about the model is passed as key value
315
+ pair, where key is the name of the column and value is data to be stored
316
+ in that column for the model being saved.
317
+ Notes:
318
+ 1. Following are the allowed types for the values passed in dictionary:
319
+ * int
320
+ * float
321
+ * str
322
+ * bool
323
+ * datetime.datetime
324
+ * datetime.date
325
+ * datetime.time
326
+ 2. "additional_columns" does not accept keys model_id and model.
327
+ Types: dict
328
+
329
+ additional_columns_types:
330
+ Optional Argument.
331
+ Specifies the column type of additional columns. These column types are used
332
+ while creating the table using the columns specified in "additional_columns"
333
+ argument. Additional column datatype information is passed as key value pair
334
+ with key being the column name and value as teradatasqlalchemy.types.
335
+ Notes:
336
+ 1. If, any of the column type for additional columns are not specified in
337
+ "additional_columns_types", it then derives the column type according
338
+ the below table:
339
+ +---------------------------+-----------------------------------------+
340
+ | Python Type | teradatasqlalchemy Type |
341
+ +---------------------------+-----------------------------------------+
342
+ | str | VARCHAR(1024) |
343
+ +---------------------------+-----------------------------------------+
344
+ | int | INTEGER |
345
+ +---------------------------+-----------------------------------------+
346
+ | bool | BYTEINT |
347
+ +---------------------------+-----------------------------------------+
348
+ | float | FLOAT |
349
+ +---------------------------+-----------------------------------------+
350
+ | datetime | TIMESTAMP |
351
+ +---------------------------+-----------------------------------------+
352
+ | date | DATE |
353
+ +---------------------------+-----------------------------------------+
354
+ | time | TIME |
355
+ +---------------------------+-----------------------------------------+
356
+ 2. Columns model_id, with column type as VARCHAR and model, with column type
357
+ as BLOB are mandatory for table. So, for the columns model_id and model,
358
+ acceptable values for "additional_columns_types" are VARCHAR and BLOB
359
+ respectively.
360
+ 3. This argument is ignored if table exists.
361
+ Types: dict
362
+
363
+ Note:
364
+ The following table describes the system behaviour in different scenarios:
365
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
366
+ | In save_byom() | In set_byom_catalog() | System Behavior |
367
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
368
+ | table_name | schema_name | table_name | schema_name | |
369
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
370
+ | Set | Set | Set | Set | schema_name and table_name in |
371
+ | | | | | save_byom() are used for |
372
+ | | | | | function execution. |
373
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
374
+ | Set | Set | Not set | Not set | schema_name and table_name in |
375
+ | | | | | save_byom() is used for |
376
+ | | | | | function execution. |
377
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
378
+ | Set | Not set | Set | Set | table_name from save_byom() |
379
+ | | | | | is used and schema name |
380
+ | | | | | associated with the current |
381
+ | | | | | context is used. |
382
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
383
+ | Not set | Set | Set | Set | Exception is raised. |
384
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
385
+ | Not set | Not set | Set | Set | table_name and schema_name |
386
+ | | | | | from set_byom_catalog() |
387
+ | | | | | are used for function execution. |
388
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
389
+ | Not set | Not set | Set | Not set | table_name from set_byom_catalog() |
390
+ | | | | | is used and schema name |
391
+ | | | | | associated with the current |
392
+ | | | | | context is used. |
393
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
394
+ | Not set | Not set | Not set | Not set | Exception is raised |
395
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
396
+
397
+ RETURNS:
398
+ None.
399
+
400
+ RAISES:
401
+ TeradataMlException, TypeError, ValueError
402
+
403
+ EXAMPLES:
404
+
405
+ >>> import teradataml, os, datetime
406
+ >>> model_file = os.path.join(os.path.dirname(teradataml.__file__), 'data', 'models', 'iris_kmeans_model')
407
+ >>> from teradataml import save_byom
408
+
409
+ # Example 1 - Create table "byom_model" with additional columns by specifying the type
410
+ # of the columns as below and save the model in it.
411
+ # +---------------------------+-----------------------------------------+
412
+ # | Column name | Column Type |
413
+ # +---------------------------+-----------------------------------------+
414
+ # | model_id | VARCHAR(128) |
415
+ # +---------------------------+-----------------------------------------+
416
+ # | model | BLOB |
417
+ # +---------------------------+-----------------------------------------+
418
+ # | Description | VARCHAR(2000) |
419
+ # +---------------------------+-----------------------------------------+
420
+ # | UserId | NUMBER(5) |
421
+ # +---------------------------+-----------------------------------------+
422
+ # | ProductionReady | BYTEINT |
423
+ # +---------------------------+-----------------------------------------+
424
+ # | ModelEfficiency | NUMBER(11,10) |
425
+ # +---------------------------+-----------------------------------------+
426
+ # | ModelSavedTime | TIMESTAMP |
427
+ # +---------------------------+-----------------------------------------+
428
+ # | ModelGeneratedDate | DATE |
429
+ # +---------------------------+-----------------------------------------+
430
+ # | ModelGeneratedTime | TIME |
431
+ # +---------------------------+-----------------------------------------+
432
+ #
433
+ >>> save_byom('model1',
434
+ ... model_file,
435
+ ... 'byom_models',
436
+ ... additional_columns={"Description": "KMeans model",
437
+ ... "UserId": "12345",
438
+ ... "ProductionReady": False,
439
+ ... "ModelEfficiency": 0.67412,
440
+ ... "ModelSavedTime": datetime.datetime.now(),
441
+ ... "ModelGeneratedDate":datetime.date.today(),
442
+ ... "ModelGeneratedTime": datetime.time(hour=0,minute=5,second=45,microsecond=110)
443
+ ... },
444
+ ... additional_columns_types={"Description": VARCHAR(2000),
445
+ ... "UserId": NUMBER(5),
446
+ ... "ProductionReady": BYTEINT,
447
+ ... "ModelEfficiency": NUMBER(11,10),
448
+ ... "ModelSavedTime": TIMESTAMP,
449
+ ... "ModelGeneratedDate": DATE,
450
+ ... "ModelGeneratedTime": TIME}
451
+ ... )
452
+ Created the table 'byom_models' as it does not exist.
453
+ Model is saved.
454
+ >>>
455
+
456
+ # Example 2 - Create table "byom_model1" in "test" DataBase, with additional columns
457
+ # by not specifying the type of the columns and once table is created,
458
+ # save the model in it.
459
+ >>> save_byom('model1',
460
+ ... model_file,
461
+ ... 'byom_models1',
462
+ ... additional_columns={"Description": "KMeans model",
463
+ ... "UserId": "12346",
464
+ ... "ProductionReady": False,
465
+ ... "ModelEfficiency": 0.67412,
466
+ ... "ModelSavedTime": datetime.datetime.now(),
467
+ ... "ModelGeneratedDate":datetime.date.today(),
468
+ ... "ModelGeneratedTime": datetime.time(hour=0,minute=5,second=45,microsecond=110)
469
+ ... },
470
+ ... schema_name='test'
471
+ ... )
472
+ Created the table 'byom_models1' as it does not exist.
473
+ Model is saved.
474
+ >>>
475
+
476
+ # Example 3 - Save the model in the existing table "byom_models".
477
+ >>> save_byom('model2',
478
+ ... model_file,
479
+ ... 'byom_models',
480
+ ... additional_columns={"Description": "KMeans model duplicated"}
481
+ ... )
482
+ Model is saved.
483
+ >>>
484
+
485
+ # Example 4 - Set the cataloging parameters and save the model
486
+ # in the existing table "byom_models".
487
+ >>> set_byom_catalog(table_name='byom_models', schema_name='alice')
488
+ The model cataloging parameters are set to table_name='byom_models' and schema_name='alice'
489
+ >>> save_byom('model3', model_file=model_file)
490
+ Model is saved.
491
+
492
+ # Example 4 - Set the cataloging table_name to 'byom_models'
493
+ # and save the model in table 'byom_licensed_models' other than model catalog table.
494
+ >>> set_byom_catalog(table_name='byom_models', schema_name='alice')
495
+ The model cataloging parameters are set to table_name='byom_models' and schema_name='alice'
496
+ >>> save_byom('licensed_model2', model_file=model_file, table_name='byom_licensed_models',
497
+ ... additional_columns={"license_data": "A5sUL9KU_kP35Vq"})
498
+ Created the model table 'byom_licensed_models' as it does not exist.
499
+ Model is saved.
500
+ >>>
501
+ """
502
+ try:
503
+ # Let's perform argument validations.
504
+ # Create argument information matrix to do parameter checking.
505
+ __arg_info_matrix = []
506
+ __arg_info_matrix.append(["model_id", model_id, False, str, True])
507
+ __arg_info_matrix.append(["model_file", model_file, False, str, True])
508
+ __arg_info_matrix.append(["table_name", table_name, True, str, True])
509
+ __arg_info_matrix.append(["schema_name", schema_name, True, str, True])
510
+ __arg_info_matrix.append(["additional_columns", additional_columns, True, dict])
511
+ __arg_info_matrix.append(["additional_columns_types", additional_columns_types, True, dict])
512
+
513
+ # Make sure that a correct type of values has been supplied to the arguments.
514
+ validator._validate_function_arguments(__arg_info_matrix)
515
+
516
+ # Set the table and schema name according to the model cataloging parameters and the user inputs.
517
+ table_name, schema_name = __set_validate_catalog_parameters(table_name, schema_name)
518
+
519
+ # Change the additional_columns_types and additional_columns to dictionary if
520
+ # it is None so that retrieval would be easy.
521
+ if additional_columns_types is None:
522
+ additional_columns_types = {}
523
+
524
+ if additional_columns is None:
525
+ additional_columns = {}
526
+
527
+ # Check if model_id or model in additional columns.
528
+ for column in ["model_id", "model"]:
529
+ if column in additional_columns:
530
+ error_code = MessageCodes.NOT_ALLOWED_VALUES
531
+ error_msg = Messages.get_message(error_code, column, "additional_columns")
532
+ raise TeradataMlException(error_msg, error_code)
533
+
534
+ # Add model_id and model columns information to lists
535
+ # which will be used in creating insert query.
536
+ column_names = ["model_id", "model"]
537
+ insert_parameters = [model_id, UtilFuncs._get_file_contents(model_file, True)]
538
+
539
+ connection = get_connection()
540
+ # Check if table already exists.
541
+ # If exists, extract required information about table columns types
542
+ # else extract from additional_columns_types.
543
+ # Also validate model_id against allowed length.
544
+ table_exists = connection.dialect.has_table(connection, table_name=table_name, schema=schema_name)
545
+ if table_exists:
546
+ # Check if model exists or not. If exists, raise error.
547
+ __check_if_model_exists(
548
+ model_id, table_name, schema_name, raise_error_if_model_found=True)
549
+ if len(additional_columns_types) != 0:
550
+ warnings.warn("Argument additional_columns_types is ignored since table already exists.", stacklevel=2)
551
+
552
+ # Gather column name and type information from existing table
553
+ existing_table_df = DataFrame(in_schema(schema_name, table_name))
554
+ existing_columns_name_sql_type_dict = existing_table_df._td_column_names_and_sqlalchemy_types
555
+
556
+ existing_table_model_id_type = existing_columns_name_sql_type_dict["model_id"]
557
+ # Validate length of model_id argument
558
+ _Validators._validate_column_value_length("model_id", model_id, existing_table_model_id_type.length,
559
+ "save the model")
560
+ else:
561
+ # Validate length of model_id argument
562
+ _Validators._validate_column_value_length("model_id", model_id, 128, "save the model")
563
+
564
+ columns_name_type_dict = {"model_id": additional_columns_types.get("model_id", VARCHAR(128)),
565
+ "model": additional_columns_types.get("model", BLOB)}
566
+
567
+ # List of columns whose type is not provided in additional_columns_types.
568
+ undefined_column_types = []
569
+
570
+ # If user passes any additional columns data, extract that also to insert it
571
+ # in table.
572
+ # If table exists, use the information about column types from existing table,
573
+ # ignore additional_columns_types argument.
574
+ if additional_columns:
575
+ for col_name, col_value in additional_columns.items():
576
+ # Before proceeding further, validate the additional column data.
577
+ # One should not pass custom types such as list, dict, user defined
578
+ # objects etc.
579
+ _Validators._validate_py_type_for_td_type_conversion(type(col_value), "additional_columns")
580
+
581
+ # If table exists, use same column data type.
582
+ # If table does not exist and column type is not specified
583
+ # in additional column types, derive the appropriate one.
584
+ if table_exists:
585
+ col_name_lower = col_name.lower()
586
+ if col_name_lower in existing_columns_name_sql_type_dict:
587
+ col_type = existing_columns_name_sql_type_dict[col_name_lower]
588
+ else:
589
+ raise TeradataMlException(Messages.get_message(MessageCodes.INSERTION_INCOMPATIBLE),
590
+ MessageCodes.INSERTION_INCOMPATIBLE)
591
+ else:
592
+ col_type = additional_columns_types.get(
593
+ col_name, _Dtypes._python_type_to_teradata_type(type(col_value)))
594
+ # Update columns_name_type_dict
595
+ columns_name_type_dict[col_name] = col_type
596
+
597
+ # Collect undefined column types to show warning.
598
+ if additional_columns_types.get(col_name) is None:
599
+ undefined_column_types.append(col_name)
600
+
601
+ # Validate the length of input varchar columns against allowed column lengths.
602
+ if isinstance(col_type, VARCHAR):
603
+ _Validators._validate_column_value_length(col_name, col_value, col_type.length,
604
+ "save the model")
605
+
606
+ # Add current column name and corresponding value in respective lists.
607
+ column_names.append(col_name)
608
+ insert_parameters.append(col_value)
609
+
610
+ # If table doesn't exist, create one using additional_columns_types
611
+ if not table_exists:
612
+ __mandatory_columns_types = {"model_id": VARCHAR, "model": BLOB}
613
+ is_mandatory_col_type_expected = lambda c_name, c_type: \
614
+ c_type == __mandatory_columns_types[c_name] or type(c_type) == __mandatory_columns_types[c_name]
615
+
616
+ # Validate additional_columns_types.
617
+ for c_name, c_type in additional_columns_types.items():
618
+ # Check if model_id & model columns have appropriate types.
619
+ if c_name in __mandatory_columns_types and not is_mandatory_col_type_expected(c_name, c_type):
620
+ error_code = MessageCodes.INVALID_COLUMN_DATATYPE
621
+ err_msg = Messages.get_message(error_code,
622
+ c_name,
623
+ "additional_columns_types",
624
+ "Valid",
625
+ "[{}]".format(__mandatory_columns_types[c_name].__name__)
626
+ )
627
+ raise TeradataMlException(err_msg, error_code)
628
+
629
+ # Check if value passed to additional_columns_types is a valid type or not.
630
+ # User can pass a class or an object of a class from teradatasqlalchemy.types .
631
+ # So, Check if c_type is either a subclass of TDType or a TDType.
632
+ # isinstance(c_type, _TDType), checks if c_type is an object of teradatasqlalchemy.types
633
+ # issubclass(c_type, _TDType), checks if c_type is a proper Teradata type or not.
634
+ # However, issubclass accepts only class in its 1st parameter so check if c_type is
635
+ # a class or not, before passing it to issubclass.
636
+ elif not (isinstance(c_type, _TDType) or (isinstance(c_type, type) and issubclass(c_type, _TDType))):
637
+ error_code = MessageCodes.INVALID_COLUMN_DATATYPE
638
+ err_msg = Messages.get_message(
639
+ error_code, c_name, "additional_columns_types", "Valid", "teradatasqlalchemy.types")
640
+ raise TeradataMlException(err_msg, error_code)
641
+
642
+ if len(undefined_column_types) > 0:
643
+ warnings.warn("Specified table does not exist and data types of {0} "\
644
+ "columns are not provided. Taking default datatypes."\
645
+ .format(", ".join(undefined_column_types)), stacklevel=2)
646
+
647
+ # Create empty vantage table using sqlalchemy object.
648
+ _create_table(
649
+ table_name, columns_name_type_dict, primary_index="model_id", schema_name=schema_name)
650
+ print("Created the model table '{}' as it does not exist.".format(table_name))
651
+
652
+ # If schema is specified, then concatenate schema name with table name.
653
+ if schema_name:
654
+ table_name = in_schema(schema_name, table_name)
655
+
656
+ # Generate insert query.
657
+ columns_clause = ", ".join(column_names)
658
+ values_clause = ", ".join(("?" for _ in range(len(column_names))))
659
+ insert_model = f"insert into {table_name} ({columns_clause}) values ({values_clause});"
660
+ # Empty queryband buffer before SQL call.
661
+ UtilFuncs._set_queryband()
662
+ execute_sql(insert_model, tuple([insert_parameters]))
663
+ print("Model is saved.")
664
+
665
+ except (SqlOperationalError, TeradataMlException, TypeError, ValueError):
666
+ raise
667
+ except Exception as err:
668
+ error_code = MessageCodes.MODEL_CATALOGING_OPERATION_FAILED
669
+ raise TeradataMlException(Messages.get_message(error_code, "save", str(err)), error_code)
670
+
671
+
672
+ @collect_queryband(queryband="dltByom")
673
+ def delete_byom(model_id, table_name=None, schema_name=None):
674
+ """
675
+ DESCRIPTION:
676
+ Delete a model from the user specified table in Teradata Vantage.
677
+
678
+ PARAMETERS:
679
+ model_id:
680
+ Required Argument.
681
+ Specifies the unique model identifier of the model to be deleted.
682
+ Types: str
683
+
684
+ table_name:
685
+ Optional Argument.
686
+ Specifies the name of the table to delete the model from.
687
+ Notes:
688
+ * One must either specify this argument or set the byom model catalog table
689
+ name using set_byom_catalog().
690
+ * If none of these arguments are set, exception is raised; If both arguments
691
+ are set, the settings in delete_byom() take precedence and is used for
692
+ function execution.
693
+ Types: str
694
+
695
+ schema_name:
696
+ Optional Argument.
697
+ Specifies the name of the schema/database in which the table specified in
698
+ "table_name" is looked up.
699
+ Notes:
700
+ * One must either specify this argument and table_name argument
701
+ or set the byom model catalog schema and table name using set_byom_catalog().
702
+ * If none of these arguments are set, exception is raised; If both arguments
703
+ are set, the settings in delete_byom() take precedence and is used for
704
+ function execution.
705
+ * If user specifies schema_name argument table_name argument has to be specified,
706
+ else exception is raised.
707
+ Types: str
708
+
709
+ Note:
710
+ The following table describes the system behaviour in different scenarios:
711
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
712
+ | In delete_byom() | In set_byom_catalog() | System Behavior |
713
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
714
+ | table_name | schema_name | table_name | schema_name | |
715
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
716
+ | Set | Set | Set | Set | schema_name and table_name in |
717
+ | | | | | delete_byom() are used for |
718
+ | | | | | function execution. |
719
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
720
+ | Set | Set | Not set | Not set | schema_name and table_name in |
721
+ | | | | | delete_byom() is used for |
722
+ | | | | | function execution. |
723
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
724
+ | Not set | Not set | Set | Set | table_name from delete_byom() |
725
+ | | | | | is used and schema name |
726
+ | | | | | associated with the current |
727
+ | | | | | context is used. |
728
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
729
+ | Not set | Set | Set | Set | Exception is raised. |
730
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
731
+ | Not set | Not set | Set | Set | table_name and schema_name |
732
+ | | | | | from set_byom_catalog() |
733
+ | | | | | are used for function execution. |
734
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
735
+ | Not set | Not set | Set | Not set | table_name from set_byom_catalog() |
736
+ | | | | | is used and schema name |
737
+ | | | | | associated with the current |
738
+ | | | | | context is used. |
739
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
740
+ | Not set | Not set | Not set | Not set | Exception is raised |
741
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
742
+
743
+ RETURNS:
744
+ None.
745
+
746
+ RAISES:
747
+ TeradataMlException
748
+
749
+ EXAMPLES:
750
+
751
+ >>> import teradataml, os, datetime
752
+ >>> model_file = os.path.join(os.path.dirname(teradataml.__file__), 'data', 'models', 'iris_kmeans_model')
753
+ >>> from teradataml import save_byom, delete_byom
754
+ >>> save_byom('model3', model_file, 'byom_models')
755
+ Model is saved.
756
+ >>> save_byom('model4', model_file, 'byom_models', schema_name='test')
757
+ Model is saved.
758
+ >>> save_byom('model5', model_file, 'byom_models', schema_name='test')
759
+ Model is saved.
760
+ >>> save_byom('model4', model_file, 'byom_models')
761
+ Model is saved.
762
+ >>> save_byom('model5', model_file, 'byom_models')
763
+ Model is saved.
764
+
765
+ # Example 1 - Delete a model with id 'model3' from the table byom_models.
766
+ >>> delete_byom(model_id='model3', table_name='byom_models')
767
+ Model is deleted.
768
+ >>>
769
+
770
+ # Example 2 - Delete a model with id 'model4' from the table byom_models
771
+ # and the table is in "test" DataBase.
772
+ >>> delete_byom(model_id='model4', table_name='byom_models', schema_name='test')
773
+ Model is deleted.
774
+ >>>
775
+
776
+ # Example 3 - Delete a model with id 'model4' from the model cataloging table 'byom_models'
777
+ # set by set_byom_catalog().
778
+ >>> set_byom_catalog(table_name='byom_models', schema_name='alice')
779
+ The model cataloging parameters are set to table_name='byom_models' and schema_name='alice'
780
+ >>> delete_byom(model_id='model4')
781
+ Model is deleted.
782
+
783
+ # Example 4 - Set the cataloging table_name to 'byom_models'
784
+ # and delete the model in table other than model catalog table 'byom_licensed_models'.
785
+ >>> set_byom_catalog(table_name='byom_models', schema_name= 'alice')
786
+ The model cataloging parameters are set to table_name='byom_models' and schema_name='alice'
787
+ >>> save_byom('licensed_model2', model_file=model_file, table_name='byom_licensed_models')
788
+ Created the model table 'byom_licensed_models' as it does not exist.
789
+ Model is saved.
790
+ >>> delete_byom(model_id='licensed_model2', table_name='byom_licensed_models')
791
+ Model is deleted.
792
+
793
+ """
794
+
795
+ # Let's perform argument validations.
796
+ # Create argument information matrix to do parameter checking
797
+ __arg_info_matrix = []
798
+ __arg_info_matrix.append(["model_id", model_id, False, str, True])
799
+ __arg_info_matrix.append(["table_name", table_name, True, str, True])
800
+ __arg_info_matrix.append(["schema_name", schema_name, True, str, True])
801
+
802
+ # Make sure that a correct type of values has been supplied to the arguments.
803
+ validator._validate_function_arguments(__arg_info_matrix)
804
+
805
+ # Set the table and schema name according to the model cataloging parameters and the user inputs.
806
+ table_name, schema_name = __set_validate_catalog_parameters(table_name, schema_name)
807
+
808
+ # Before proceed further, check whether table exists or not.
809
+ conn = get_connection()
810
+ if not conn.dialect.has_table(conn, table_name=table_name, schema=schema_name):
811
+ error_code = MessageCodes.MODEL_CATALOGING_OPERATION_FAILED
812
+ error_msg = Messages.get_message(
813
+ error_code, "delete", 'Table "{}.{}" does not exist.'.format(schema_name, table_name))
814
+ raise TeradataMlException(error_msg, error_code)
815
+
816
+ # Let's check if the user created the model since only the creator can delete it
817
+ __check_if_model_exists(model_id, table_name, schema_name, raise_error_if_model_not_found=True)
818
+
819
+ # Get the FQTN before deleting the model.
820
+ table_name = _get_quoted_object_name(schema_name, table_name)
821
+
822
+ try:
823
+ delete_model = f"delete from {table_name} where model_id = (?)"
824
+ # Empty queryband buffer before SQL call.
825
+ UtilFuncs._set_queryband()
826
+ execute_sql(delete_model, tuple([model_id]))
827
+ print("Model is deleted.")
828
+
829
+ except (SqlOperationalError, TeradataMlException):
830
+ raise
831
+ except Exception as err:
832
+ error_code = MessageCodes.MODEL_CATALOGING_OPERATION_FAILED
833
+ error_msg = Messages.get_message(error_code, "delete", str(err))
834
+ raise TeradataMlException(error_msg, error_code)
835
+
836
+
837
+ @collect_queryband(queryband="stLcns")
838
+ def set_license(license,
839
+ table_name=None,
840
+ schema_name=None,
841
+ source='string'):
842
+ """
843
+ DESCRIPTION:
844
+ The set_license() function allows a user to set the license information
845
+ associated with the externally generated model in a session level variable
846
+ which is required by H2O DAI models. It is used by the retrieve_byom()
847
+ function to retrieve the license information while retrieving the specific model.
848
+ If specified table name does not exist and is not the same as BYOM catalog tables,
849
+ then this function creates the table and stores the license information;
850
+ otherwise, this function just validates and sets the license information.
851
+
852
+ The license can be set by passing the license in the following ways:
853
+ * Passing the license as a variable;
854
+ * Passing the column name in the model table itself;
855
+ * Passing the table and the column name containing the license;
856
+ * Passing the license in a file.
857
+
858
+ PARAMETERS:
859
+ license:
860
+ Required Argument.
861
+ Specifies the license key information that can be passed as:
862
+ * a variable.
863
+ * in a file.
864
+ * name of the column containing license information in a table
865
+ specified by "table_name" argument.
866
+ Note:
867
+ Argument "source" must be set accordingly.
868
+ Types: str
869
+
870
+ table_name:
871
+ Optional Argument.
872
+ Specifies the table name containing the license information if "source" is 'column',
873
+ otherwise specifies the table to store the license into.
874
+ Note:
875
+ Argument "table_name" and "schema_name"
876
+ both should be specified or both should be None.
877
+ Types: str
878
+
879
+ schema_name:
880
+ Optional Argument.
881
+ Specifies the name of the schema in which the table specified in
882
+ "table_name" is looked up.
883
+ Note:
884
+ Argument "table_name" and "schema_name"
885
+ both should be specified or both should be None.
886
+ Types: str
887
+
888
+ source:
889
+ Required Argument.
890
+ Specifies whether license key specified in "license" is a string, file
891
+ or column name.
892
+ Default value: string
893
+ Permitted values: string, file, column
894
+
895
+ RETURNS:
896
+ None.
897
+
898
+ RAISES:
899
+ TeradataMlException
900
+
901
+ EXAMPLES:
902
+ >>> import os
903
+ >>> from teradataml import save_byom, retrieve_byom, get_context, set_license, set_byom_catalog
904
+
905
+ # Example 1: When license is passed as a string.
906
+ >>> set_license(license='eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI',
907
+ ... table_name=None, schema_name=None, source='string')
908
+ The license parameters are set.
909
+ The license is : eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI
910
+
911
+ # Example 2: When license is stored in a file and file is passed as input to "license".
912
+ # "source" must be set to "file".
913
+ >>> license_file = os.path.join(os.path.dirname(teradataml.__file__),
914
+ ... 'data', 'models', 'License_file.txt')
915
+ >>> set_license(license=license_file, source='file')
916
+ The license parameters are set.
917
+ The license is: license_string
918
+
919
+ # Example 3: When license is present in the byom model catalog table itself.
920
+ # Store a model with license information in the model table.
921
+ >>> model_file = os.path.join(os.path.dirname(teradataml.__file__),
922
+ ... 'data', 'models', 'iris_kmeans_model')
923
+ >>> save_byom('licensed_model1', model_file, 'byom_licensed_models',
924
+ ... additional_columns={"license_data": "A5sUL9KU_kP35Vq"})
925
+ Created the model table 'byom_licensed_models' as it does not exist.
926
+ Model is saved.
927
+ >>> set_byom_catalog(table_name='byom_licensed_models', schema_name='alice')
928
+ The model cataloging parameters are set to table_name='byom_licensed_models'
929
+ and schema_name='alice'
930
+ >>> set_license(license='license_data', source='column')
931
+ The license parameters are set.
932
+ The license is present in the table='byom_licensed_models',schema='alice' and
933
+ column='license_data'.
934
+
935
+ # Example 4: Set the license information using the license stored in a column
936
+ # 'license_key' of a table 'license_table'.
937
+ # Create a table and insert the license information in the table.
938
+ >>> license = 'eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI'
939
+ >>> lic_table = 'create table license (id integer between 1 and 1,
940
+ license_key varchar(2500)) unique primary index(id);'
941
+ >>> execute_sql(lic_table)
942
+ <sqlalchemy.engine.cursor.LegacyCursorResult object at 0x000001DC4F2EE9A0>
943
+ >>> execute_sql("insert into license values (1, 'peBVRtjA-ib')")
944
+ <sqlalchemy.engine.cursor.LegacyCursorResult object at 0x000001DC4F2EEF10>
945
+ >>> set_license(license='license_key', table_name='license', schema_name='alice',
946
+ ... source='column')
947
+ The license parameters are set.
948
+ The license is present in the table='license', schema='alice' and column='license_key'.
949
+
950
+ # Example 5: Set License when license is passed as a string, table
951
+ # and schema name are passed. Since table does not exist, table is
952
+ # created and license is stored in the table.
953
+ >>> set_license(license="eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI",
954
+ ... table_name='license_table', schema_name='alice', source='string')
955
+ The license parameters are set.
956
+ The license is present in the table='license_table', schema='alice' and column='license'.
957
+
958
+ # Example 6: Set License when license is passed as a file
959
+ # and table and schema name are passed. Since table does not exist,
960
+ # table is created and license is stored in the table.
961
+ >>> set_license(license=license_file, table_name='license_t1', schema_name= 'alice', source='file')
962
+ The license parameters are set.
963
+ The license is present in the table='license_t1', schema='alice' and column='license'.
964
+ """
965
+ # Create argument information matrix for validations.
966
+ __arg_info_matrix = []
967
+ __arg_info_matrix.append(["license", license, False, str, True])
968
+ __arg_info_matrix.append(["source", source, True, str, True, mac.LICENSE_SOURCE.value])
969
+ __arg_info_matrix.append(["table_name", table_name, True, str, True])
970
+ __arg_info_matrix.append(["schema_name", schema_name, True, str, True])
971
+
972
+ # Make sure that a correct type of values has been supplied to the arguments.
973
+ validator._validate_function_arguments(__arg_info_matrix)
974
+
975
+ # Make sure if table_name is provided, schema_name is also provided and vice_versa.
976
+ validator._validate_mutually_inclusive_arguments(table_name, "table_name", schema_name,
977
+ "schema_name")
978
+
979
+ source = source.lower()
980
+ if source == 'column':
981
+ conn = get_connection()
982
+ additional_error = ""
983
+ if table_name is None:
984
+ # Assign the table and schema name to model cataloging table and schema as
985
+ # table_name is not provided.
986
+ table_name = configure._byom_model_catalog_table
987
+ schema_name = configure._byom_model_catalog_database
988
+
989
+ # Raise an error if the catalog information is not set or table name is not passed
990
+ additional_error = Messages.get_message(MessageCodes.EITHER_FUNCTION_OR_ARGS, "catalog",
991
+ "set_byom_catalog", "catalog", "")
992
+ validator._validate_argument_is_not_None(table_name, "table_name", additional_error)
993
+
994
+ if validator._check_table_exists(conn, table_name, schema_name,
995
+ raise_error_if_does_not_exists=True,
996
+ additional_error=additional_error):
997
+
998
+ # Validate the column name provided in the license argument
999
+ # to check if column exists or not.
1000
+ license_table = DataFrame(in_schema(schema_name=schema_name,
1001
+ table_name=table_name))
1002
+
1003
+ _Validators._validate_column_exists_in_dataframe(license,
1004
+ license_table._metaexpr,
1005
+ for_table=True)
1006
+
1007
+ # Set the configuration option _byom_model_catalog_license,
1008
+ # _byom_model_catalog_license_source, _byom_model_catalog_license_table,
1009
+ # _byom_model_catalog_license_database.
1010
+
1011
+ configure._byom_model_catalog_license = license
1012
+ configure._byom_model_catalog_license_source = 'column'
1013
+ configure._byom_model_catalog_license_table = table_name
1014
+ configure._byom_model_catalog_license_database = schema_name
1015
+
1016
+ print("The license parameters are set.")
1017
+ print("The license is present in the table='{}', schema='{}' and column='{}'"
1018
+ ".".format(configure._byom_model_catalog_license_table,
1019
+ configure._byom_model_catalog_license_database,
1020
+ configure._byom_model_catalog_license))
1021
+ else:
1022
+ # Set the configuration option _byom_model_catalog_license.
1023
+ # If license is passed in a file, extract the same from the file and then set the option.
1024
+ configure._byom_model_catalog_license = license if source == 'string' else \
1025
+ UtilFuncs._get_file_contents(license)
1026
+
1027
+ if table_name is None:
1028
+ # Set the configuration option _byom_model_catalog_license_source.
1029
+ # If table_name is not provided set the value to 'string' and print the information.
1030
+ configure._byom_model_catalog_license_source = 'string'
1031
+ print("The license parameters are set.")
1032
+ print("The license is: {}".format(configure._byom_model_catalog_license))
1033
+
1034
+ else:
1035
+ conn = get_connection()
1036
+ if not validator._check_table_exists(conn, table_name, schema_name, False):
1037
+ # Create the license table with constraints
1038
+ license_table = table_name
1039
+ columns_to_create = {"id": NUMBER,
1040
+ "license": VARCHAR}
1041
+
1042
+ try:
1043
+ _create_table(license_table, columns_to_create, primary_index="id",
1044
+ schema_name=schema_name, check_constraint='id between 1 and 1')
1045
+ query = "insert into {}.{} values (1, '{}')".format(
1046
+ schema_name, license_table, configure._byom_model_catalog_license)
1047
+
1048
+ # Empty queryband buffer before SQL call.
1049
+ UtilFuncs._set_queryband()
1050
+ execute_sql(query)
1051
+ except:
1052
+ raise
1053
+
1054
+ configure._byom_model_catalog_license = 'license'
1055
+ configure._byom_model_catalog_license_source = 'column'
1056
+ configure._byom_model_catalog_license_table = license_table
1057
+ configure._byom_model_catalog_license_database = schema_name
1058
+
1059
+ print("The license parameters are set.")
1060
+ print("The license is present in the table='{}', schema='{}' and column='{}'"
1061
+ ".".format(configure._byom_model_catalog_license_table,
1062
+ configure._byom_model_catalog_license_database,
1063
+ configure._byom_model_catalog_license))
1064
+ else:
1065
+ raise TeradataMlException(Messages.get_message(MessageCodes.TABLE_ALREADY_EXISTS, table_name),
1066
+ MessageCodes.TABLE_ALREADY_EXISTS)
1067
+
1068
+
1069
+ @collect_queryband(queryband="gtLcns")
1070
+ def get_license():
1071
+ """
1072
+ DESCRIPTION:
1073
+ Get the license information set by set_license() function at the session level.
1074
+
1075
+ PARAMETERS:
1076
+ None.
1077
+
1078
+ RETURNS:
1079
+ None.
1080
+
1081
+ RAISES:
1082
+ None.
1083
+
1084
+ EXAMPLES:
1085
+ >>> import os, teradataml
1086
+ >>> from teradataml import save_byom, get_license, set_license
1087
+
1088
+ # Example 1: When license is passed as a string.
1089
+ >>> set_license(license='eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI',
1090
+ source='string')
1091
+ The license parameters are set.
1092
+ The license is: eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI
1093
+ >>> get_license()
1094
+ The license is: eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI
1095
+
1096
+ # Example 2: When license is present in the column='license_data' and table='byom_licensed_models'.
1097
+ >>> set_license(license='license_data', table_name='byom_licensed_models', schema_name='alice',
1098
+ source='column')
1099
+ The license parameters are set.
1100
+ The license is present in the table='byom_licensed_models', schema='alice' and
1101
+ column='license_data'.
1102
+ >>> get_license()
1103
+ The license is stored in:
1104
+ table = 'byom_licensed_models'
1105
+ schema = 'alice'
1106
+ column = 'license_data'
1107
+ >>>
1108
+
1109
+ """
1110
+ license = configure._byom_model_catalog_license
1111
+ source = configure._byom_model_catalog_license_source
1112
+ table_name = configure._byom_model_catalog_license_table
1113
+ schema_name = configure._byom_model_catalog_license_database
1114
+
1115
+ # Check whether license information is present or not.
1116
+ if license is not None:
1117
+ if source in 'string':
1118
+ print("The license is: {}".format(license))
1119
+ else:
1120
+ print("The license is stored in:\ntable = '{}'\nschema = '{}'\ncolumn = '{}'"
1121
+ .format(table_name, schema_name, license))
1122
+ else:
1123
+ print('Set the license information using set_license() function.')
1124
+
1125
+
1126
+ @collect_queryband(queryband="rtrvByom")
1127
+ def retrieve_byom(model_id,
1128
+ table_name=None,
1129
+ schema_name=None,
1130
+ license=None,
1131
+ is_license_column=False,
1132
+ license_table_name=None,
1133
+ license_schema_name=None,
1134
+ require_license=False,
1135
+ return_addition_columns=False):
1136
+ """
1137
+ DESCRIPTION:
1138
+ Function to retrieve a saved model. Output of this function can be
1139
+ directly passed as input to the PMMLPredict and H2OPredict functions.
1140
+ Some models generated, such as H2O-DAI has license associated with it.
1141
+ When such models are to be used for scoring, one must retrieve the model
1142
+ by passing relevant license information. Please refer to "license_key"
1143
+ for more details.
1144
+
1145
+ PARAMETERS:
1146
+ model_id:
1147
+ Required Argument.
1148
+ Specifies the unique model identifier of the model to be retrieved.
1149
+ Types: str
1150
+
1151
+ table_name:
1152
+ Optional Argument.
1153
+ Specifies the name of the table to retrieve external model from.
1154
+ Notes:
1155
+ * One must either specify this argument or set the byom model catalog table
1156
+ name using set_byom_catalog().
1157
+ * If none of these arguments are set, exception is raised; If both arguments
1158
+ are set, the settings in retrieve_byom() take precedence and is used for
1159
+ function execution.
1160
+ Types: str
1161
+
1162
+ schema_name:
1163
+ Optional Argument.
1164
+ Specifies the name of the schema/database in which the table specified in
1165
+ "table_name" is looked up.
1166
+ Notes:
1167
+ * One must either specify this argument and table_name argument
1168
+ or set the byom model catalog schema and table name using set_byom_catalog().
1169
+ * If none of these arguments are set, exception is raised; If both arguments
1170
+ are set, the settings in retrieve_byom() take precedence and is used for
1171
+ function execution.
1172
+ * If user specifies schema_name argument table_name argument has to be specified,
1173
+ else exception is raised.
1174
+ Types: str
1175
+
1176
+ license:
1177
+ Optional Argument.
1178
+ Specifies the license key information in different ways specified as below:
1179
+ * If the license key is stored in a variable, user can pass it as string.
1180
+ * If the license key is stored in table, then pass a column name containing
1181
+ the license. Based on the table which has license information stored,
1182
+ * If the information is stored in the same model table as that of the
1183
+ model, one must set "is_license_column" to True.
1184
+ * If the information is stored in the different table from that of the
1185
+ "table_name", one can specify the table name and schema name using
1186
+ "license_table_name" and "license_schema_name" respectively.
1187
+ Types: str
1188
+
1189
+ is_license_column:
1190
+ Optional Argument.
1191
+ Specifies whether license key specified in "license" is a license key
1192
+ or column name. When set to True, "license" contains the column name
1193
+ containing license data, otherwise contains the actual license key.
1194
+ Default Value: False
1195
+ Types: str
1196
+
1197
+ license_table_name:
1198
+ Optional Argument.
1199
+ Specifies the name of the table which holds license key. One can specify this
1200
+ argument if license is stored in a table other than "table_name".
1201
+ Types: str
1202
+
1203
+ license_schema_name:
1204
+ Optional Argument.
1205
+ Specifies the name of the Database associated with the "license_table_name".
1206
+ If not specified, current Database would be considered for "license_table_name".
1207
+ Types: str
1208
+
1209
+ require_license:
1210
+ Optional Argument.
1211
+ Specifies whether the model to be retrieved is associated with a license.
1212
+ If True, license information set by the set_license() is retrieved.
1213
+ Note:
1214
+ If license parameters are passed, then this argument is ignored.
1215
+ Default value: False
1216
+ Types: bool
1217
+
1218
+ return_addition_columns:
1219
+ Optional Argument.
1220
+ Specifies whether to return additional columns saved during save_byom() along with
1221
+ model_id and model columns.
1222
+ Default value: False
1223
+ Types: bool
1224
+
1225
+ Note:
1226
+ The following table describes the system behaviour in different scenarios:
1227
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1228
+ | In retrieve_byom() | In set_byom_catalog() | System Behavior |
1229
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1230
+ | table_name | schema_name | table_name | schema_name | |
1231
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1232
+ | Set | Set | Set | Set | schema_name and table_name in |
1233
+ | | | | | retrieve_byom() are used for |
1234
+ | | | | | function execution. |
1235
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1236
+ | Set | Set | Not set | Not set | schema_name and table_name in |
1237
+ | | | | | retrieve_byom() is used for |
1238
+ | | | | | function execution. |
1239
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1240
+ | Not set | Not set | Set | Set | table_name from retrieve_byom() |
1241
+ | | | | | is used and schema name |
1242
+ | | | | | associated with the current |
1243
+ | | | | | context is used. |
1244
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1245
+ | Not set | Set | Set | Set | Exception is raised. |
1246
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1247
+ | Not set | Not set | Set | Set | table_name and schema_name |
1248
+ | | | | | from set_byom_catalog() |
1249
+ | | | | | are used for function execution. |
1250
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1251
+ | Not set | Not set | Set | Not set | table_name from set_byom_catalog() |
1252
+ | | | | | is used and schema name |
1253
+ | | | | | associated with the current |
1254
+ | | | | | context is used. |
1255
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1256
+ | Not set | Not set | Not set | Not set | Exception is raised |
1257
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1258
+
1259
+ RETURNS:
1260
+ teradataml DataFrame
1261
+
1262
+ RAISES:
1263
+ TeradataMlException, TypeError
1264
+
1265
+ EXAMPLES:
1266
+ >>> import teradataml, os, datetime
1267
+ >>> model_file = os.path.join(os.path.dirname(teradataml.__file__), 'data', 'models', 'iris_kmeans_model')
1268
+ >>> from teradataml import save_byom, retrieve_byom, get_context
1269
+ >>> save_byom('model5', model_file, 'byom_models')
1270
+ Model is saved.
1271
+ >>> save_byom('model6', model_file, 'byom_models', schema_name='test')
1272
+ Model is saved.
1273
+ >>> # Save the license in an addtional column named "license_data" in the model table.
1274
+ >>> save_byom('licensed_model1', model_file, 'byom_licensed_models', additional_columns={"license_data": "A5sUL9KU_kP35Vq"})
1275
+ Created the model table 'byom_licensed_models' as it does not exist.
1276
+ Model is saved.
1277
+ >>> # Store the license in a table.
1278
+ >>> license = 'eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI'
1279
+ >>> lic_table = 'create table license (id integer between 1 and 1,license_key varchar(2500)) unique primary index(id);'
1280
+ >>> execute_sql(lic_table)
1281
+ <sqlalchemy.engine.cursor.LegacyCursorResult object at 0x0000014AAFF27080>
1282
+ >>> execute_sql("insert into license values (1, 'peBVRtjA-ib')")
1283
+ <sqlalchemy.engine.cursor.LegacyCursorResult object at 0x0000014AAFF27278>
1284
+ >>>
1285
+
1286
+ # Example 1 - Retrieve a model with id 'model5' from the table 'byom_models'.
1287
+ >>> df = retrieve_byom('model5', table_name='byom_models')
1288
+ >>> df
1289
+ model
1290
+ model_id
1291
+ model5 b'504B03041400080808...'
1292
+
1293
+ # Example 2 - Retrieve a model with id 'model6' from the table 'byom_models'
1294
+ # and the table is in 'test' DataBase.
1295
+ >>> df = retrieve_byom('model6', table_name='byom_models', schema_name='test')
1296
+ >>> df
1297
+ model
1298
+ model_id
1299
+ model6 b'504B03041400080808...'
1300
+
1301
+ # Example 3 - Retrieve a model with id 'model5' from the table 'byom_models'
1302
+ # with license key stored in a variable 'license'.
1303
+ >>> df = retrieve_byom('model5', table_name='byom_models', license=license)
1304
+ >>> df
1305
+ model license
1306
+ model_id
1307
+ model5 b'504B03041400080808...' eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI
1308
+ >>>
1309
+
1310
+ # Example 4 - Retrieve a model with id 'licensed_model1' and associated license
1311
+ # key stored in table 'byom_licensed_models'. License key is stored
1312
+ # in column 'license_data'.
1313
+ >>> df = retrieve_byom('licensed_model1',
1314
+ ... table_name='byom_licensed_models',
1315
+ ... license='license_data',
1316
+ ... is_license_column=True)
1317
+ >>> df
1318
+ model license
1319
+ model_id
1320
+ licensed_model1 b'504B03041400080808...' A5sUL9KU_kP35Vq
1321
+ >>>
1322
+
1323
+ # Example 5 - Retrieve a model with id 'licensed_model1' from the table
1324
+ # 'byom_licensed_models' and associated license key stored in
1325
+ # column 'license_key' of the table 'license'.
1326
+ >>> df = retrieve_byom('licensed_model1',
1327
+ ... table_name='byom_licensed_models',
1328
+ ... license='license_key',
1329
+ ... is_license_column=True,
1330
+ ... license_table_name='license')
1331
+ >>> df
1332
+ model license
1333
+ model_id
1334
+ licensed_model1 b'504B03041400080808...' peBVRtjA-ib
1335
+ >>>
1336
+
1337
+ # Example 6 - Retrieve a model with id 'licensed_model1' from the table
1338
+ # 'byom_licensed_models' and associated license key stored in
1339
+ # column 'license_key' of the table 'license' present in the
1340
+ # schema 'mldb'.
1341
+ >>> df = retrieve_byom('licensed_model1',
1342
+ ... table_name='byom_licensed_models',
1343
+ ... license='license_key',
1344
+ ... is_license_column=True,
1345
+ ... license_table_name='license',
1346
+ ... license_schema_name='mldb')
1347
+ >>> df
1348
+ model license
1349
+ model_id
1350
+ licensed_model1 b'504B03041400080808...' peBVRtjA-ib
1351
+ >>>
1352
+
1353
+ # Example 7 - Retrieve a model with id 'model5' from the table 'byom_models'
1354
+ # with license key stored by set_license in a variable 'license'.
1355
+ # The catalog information is set using set_byom_catalog()
1356
+ # to table_name='byom_models', schema_name='alice'
1357
+ # schema_name='alice' and is used to retrieve the model.
1358
+ >>> set_byom_catalog(table_name='byom_models', schema_name='alice')
1359
+ The model cataloging parameters are set to table_name='byom_models' and
1360
+ schema_name='alice'
1361
+ >>> set_license(license=license, source='string')
1362
+ The license parameters are set.
1363
+ The license is: eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI
1364
+ >>> df = retrieve_byom('model5', require_license=True)
1365
+ >>> df
1366
+ model license
1367
+ model_id
1368
+ model5 b'504B03041400080808...' eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI
1369
+ >>>
1370
+
1371
+ # Example 8 - Retrieve a model with id 'model5' from the table 'byom_models'
1372
+ # with license key stored by set_license in a file. Since the
1373
+ # schema name is not provided, default schema is used.
1374
+ >>> license_file = os.path.join(os.path.dirname(teradataml.__file__),
1375
+ ... 'data', 'models', 'License_file.txt')
1376
+ >>> set_license(license=license_file, source='file')
1377
+ The license parameters are set.
1378
+ The license is: license_string
1379
+ >>> df = retrieve_byom('model5', table_name='byom_models', require_license=True)
1380
+ >>> df
1381
+ model license
1382
+ model_id
1383
+ model5 b'504B03041400080808...' license_string
1384
+
1385
+ # Example 9 - Retrieve a model with id 'licensed_model1' and associated license
1386
+ # key stored in column 'license_key' of the table 'license' present
1387
+ # in the schema 'alice'. The byom catalog and license information is
1388
+ # set using set_byom_catalog() and set_license() respectively.
1389
+ # Function is executed with license parameters passed,
1390
+ # which overrides the license information set at the session level.
1391
+ >>> set_byom_catalog(table_name='byom_licensed_models', schema_name='alice')
1392
+ The model cataloging parameters are set to table_name='byom_licensed_models'
1393
+ and schema_name='alice'
1394
+ >>> set_license(license=license, source='string')
1395
+ The license parameters are set.
1396
+ The license is: eZSy3peBVRtjA-ibVuvNw5A5sUL9KU_kP35Vq4ZNBQ3iGY6oVSpE6g97sFY2LI
1397
+ >>> df = retrieve_byom('licensed_model1', license='license_key',
1398
+ ... is_license_column=True, license_table_name='license')
1399
+ >>> df
1400
+ model license
1401
+ model_id
1402
+ licensed_model1 b'504B03041400080808...' peBVRtjA-ib
1403
+
1404
+ # Example 10 - Retrieve a model with id 'licensed_model1' from the table
1405
+ # 'byom_licensed_models' and associated license key stored in
1406
+ # column 'license_data' of the table 'byom_licensed_models'.
1407
+ # The byom catalog and license information is already set
1408
+ # at the session level, passing the table_name to the
1409
+ # function call overrides the byom catalog information
1410
+ # at the session level.
1411
+ >>> set_byom_catalog(table_name='byom_models', schema_name='alice')
1412
+ The model cataloging parameters are set to table_name='byom_models' and
1413
+ schema_name='alice'
1414
+ >>> set_license(license='license_data', table_name='byom_licensed_models',
1415
+ schema_name='alice', source='column')
1416
+ The license parameters are set.
1417
+ The license is present in the table='byom_licensed_models', schema='alice'
1418
+ and column='license_data'.
1419
+ >>> df = retrieve_byom('licensed_model1', table_name='byom_licensed_models',
1420
+ ... require_license=True)
1421
+ >>> df
1422
+ model license
1423
+ model_id
1424
+ licensed_model1 b'504B03041400080808...' A5sUL9KU_kP35Vq
1425
+
1426
+ # Example 11 - If require license=False which is the default value for the above example,
1427
+ # the license information is not retrieved.
1428
+ >>> df = retrieve_byom('licensed_model1', table_name='byom_licensed_models')
1429
+ >>> df
1430
+ model
1431
+ model_id
1432
+ licensed_model1 b'504B03041400080808...'
1433
+
1434
+ # Example 12 - Retrieve a model with id 'licensed_model1' from the table along with all
1435
+ # additional columns saved during save_byom().
1436
+ >>> df = retrieve_byom('licensed_model1', table_name='byom_licensed_models',
1437
+ return_addition_columns=True)
1438
+ >>> df
1439
+ model license_data
1440
+ model_id
1441
+ licensed_model1 b'504B03041400080808...' A5sUL9KU_kP35Vq
1442
+ """
1443
+
1444
+
1445
+ # Let's perform argument validations.
1446
+ # Create argument information matrix to do parameter checking
1447
+ __arg_info_matrix = []
1448
+ __arg_info_matrix.append(["model_id", model_id, False, str, True])
1449
+ __arg_info_matrix.append(["table_name", table_name, True, str, True])
1450
+ __arg_info_matrix.append(["schema_name", schema_name, True, str, True])
1451
+ __arg_info_matrix.append(["license", license, True, str, True])
1452
+ __arg_info_matrix.append(["is_license_column", is_license_column, False, bool])
1453
+ __arg_info_matrix.append(["license_table_name", license_table_name, True, str, True])
1454
+ __arg_info_matrix.append(["license_schema_name", license_schema_name, True, str, True])
1455
+
1456
+ # Make sure that a correct type of values has been supplied to the arguments.
1457
+ validator._validate_function_arguments(__arg_info_matrix)
1458
+
1459
+ # Set the table and schema name according to the model cataloging parameters and the user inputs.
1460
+ table_name, schema_name = __set_validate_catalog_parameters(table_name, schema_name)
1461
+
1462
+ if require_license and license is None:
1463
+ license = configure._byom_model_catalog_license
1464
+ is_license_column = True if configure._byom_model_catalog_license_source == 'column' else False
1465
+ license_table_name = configure._byom_model_catalog_license_table
1466
+ license_schema_name = configure._byom_model_catalog_license_database
1467
+
1468
+ # Check whether license information is present or not.
1469
+ additional_error = Messages.get_message(MessageCodes.EITHER_FUNCTION_OR_ARGS, "license", "set_license",
1470
+ "license", "")
1471
+ validator._validate_argument_is_not_None(license, "license", additional_error)
1472
+
1473
+ # Before proceeding further, check whether table exists or not.
1474
+ conn = get_connection()
1475
+ if not conn.dialect.has_table(conn, table_name=table_name, schema=schema_name):
1476
+ error_code = MessageCodes.MODEL_CATALOGING_OPERATION_FAILED
1477
+ error_msg = Messages.get_message(
1478
+ error_code, "retrieve", 'Table "{}.{}" does not exist.'.format(schema_name, table_name))
1479
+ raise TeradataMlException(error_msg, error_code)
1480
+
1481
+ table_name = in_schema(schema_name=schema_name, table_name=table_name)
1482
+ model_details = DataFrame(table_name)
1483
+ model_details = model_details[model_details.model_id == model_id]
1484
+
1485
+ # __check_if_model_exists does the same check however, but it do not return DataFrame.
1486
+ # So, doing the model existence check here.
1487
+ if model_details.shape[0] == 0:
1488
+ error_code = MessageCodes.MODEL_NOT_FOUND
1489
+ error_msg = Messages.get_message(error_code, model_id, " in the table '{}'".format(table_name))
1490
+ raise TeradataMlException(error_msg, error_code)
1491
+
1492
+ if model_details.shape[0] > 1:
1493
+ error_code = MessageCodes.MODEL_CATALOGING_OPERATION_FAILED
1494
+ error_msg = Messages.get_message(
1495
+ error_code, "retrieve", "Duplicate model found for model id '{}'".format(model_id))
1496
+ raise TeradataMlException(error_msg, error_code)
1497
+
1498
+ # If license holds the actual license key, assign it to model DataFrame.
1499
+ # If license holds the column name, i.e., license data is stored in a table,
1500
+ # If table which holds license data is same as model table, select the column.
1501
+ # If table which holds license data is different from model table, create a
1502
+ # DataFrame on the table which holds license data and do cross join with
1503
+ # models DataFrame. The cross join creates a new DataFrame which has columns
1504
+ # of both tables.
1505
+ # Note that, license table should hold only one record. so even cartesian
1506
+ # product should hold only record in the DataFrame.
1507
+
1508
+ if not license:
1509
+ if return_addition_columns:
1510
+ # Return all columns if return_addition_columns is True.
1511
+ return model_details
1512
+ return model_details.select(["model_id", "model"])
1513
+
1514
+ # Lambda function for attaching the license to model DataFrame.
1515
+ _get_license_model_df = lambda license: model_details.assign(drop_columns=True,
1516
+ model_id=model_details.model_id,
1517
+ model=model_details.model,
1518
+ license=license)
1519
+
1520
+ # If user passed a license as a variable, attach it to the model DataFrame.
1521
+ if not is_license_column:
1522
+ return _get_license_model_df(license)
1523
+
1524
+ # If license exists in the column of the same model table.
1525
+ if is_license_column and not license_table_name:
1526
+ _Validators._validate_column_exists_in_dataframe(license,
1527
+ model_details._metaexpr,
1528
+ for_table=True,
1529
+ column_arg='license',
1530
+ data_arg=table_name)
1531
+ return _get_license_model_df(model_details[license])
1532
+
1533
+ # If license exists in the column of the table different from model table.
1534
+ license_schema_name = license_schema_name if license_schema_name else schema_name
1535
+ license_table = in_schema(license_schema_name, license_table_name)
1536
+
1537
+ # Check whether license table exists or not before proceed further.
1538
+ if not conn.dialect.has_table(conn, table_name=license_table_name, schema=license_schema_name):
1539
+ error_code = MessageCodes.EXECUTION_FAILED
1540
+ error_msg = Messages.get_message(
1541
+ error_code, "retrieve the model", 'Table "{}" does not exist.'.format(license_table))
1542
+ raise TeradataMlException(error_msg, error_code)
1543
+
1544
+ license_df = DataFrame(license_table)
1545
+ # Check column existed in table.
1546
+ _Validators._validate_column_exists_in_dataframe(license,
1547
+ license_df._metaexpr,
1548
+ for_table=True,
1549
+ column_arg='license',
1550
+ data_arg=license_table)
1551
+
1552
+ if license_df.shape[0] > 1:
1553
+ error_code = MessageCodes.MODEL_CATALOGING_OPERATION_FAILED
1554
+ error_msg = Messages.get_message(
1555
+ error_code, "retrieve", "Table which holds license key should have only one row.")
1556
+ raise TeradataMlException(error_msg, error_code)
1557
+
1558
+ if not return_addition_columns:
1559
+ # Return only model_id and model columns if return_addition_columns is False.
1560
+ model_details = model_details.select(["model_id", "model"])
1561
+
1562
+ # Make sure license is the column name for license key.
1563
+ license_df = license_df.assign(drop_columns=True, license=license_df[license])
1564
+ return model_details.join(license_df, how="cross")
1565
+
1566
+
1567
+ @collect_queryband(queryband="lstByom")
1568
+ def list_byom(table_name=None, schema_name=None, model_id=None):
1569
+ """
1570
+ DESCRIPTION:
1571
+ The list_byom() function allows a user to list saved models, filtering the results based on the optional arguments.
1572
+
1573
+ PARAMETERS:
1574
+ table_name:
1575
+ Optional Argument.
1576
+ Specifies the name of the table to list models from.
1577
+ Notes:
1578
+ * One must either specify this argument or set the byom model catalog table
1579
+ name using set_byom_catalog().
1580
+ * If none of these arguments are set, exception is raised; If both arguments
1581
+ are set, the settings in list_byom() take precedence and is used for
1582
+ function execution.
1583
+ Types: str
1584
+
1585
+ schema_name:
1586
+ Optional Argument.
1587
+ Specifies the name of the schema/database in which the table specified in
1588
+ "table_name" is looked up.
1589
+ Notes:
1590
+ * One must either specify this argument and table_name argument
1591
+ or set the byom model catalog schema and table name using set_byom_catalog().
1592
+ * If none of these arguments are set, exception is raised; If both arguments
1593
+ are set, the settings in list_byom() take precedence and is used for
1594
+ function execution.
1595
+ * If user specifies schema_name argument table_name argument has to be specified,
1596
+ else exception is raised.
1597
+ Types: str
1598
+
1599
+ model_id:
1600
+ Optional Argument.
1601
+ Specifies the unique model identifier of the model(s). If specified,
1602
+ the models with either exact match or a substring match, are listed.
1603
+ Types: str OR list
1604
+
1605
+ Note:
1606
+ The following table describes the system behaviour in different scenarios:
1607
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1608
+ | In list_byom() | In set_byom_catalog() | System Behavior |
1609
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1610
+ | table_name | schema_name | table_name | schema_name | |
1611
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1612
+ | Set | Set | Set | Set | schema_name and table_name in |
1613
+ | | | | | list_byom() are used for |
1614
+ | | | | | function execution. |
1615
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1616
+ | Set | Set | Not set | Not set | schema_name and table_name in |
1617
+ | | | | | list_byom() is used for |
1618
+ | | | | | function execution. |
1619
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1620
+ | Set | Not set | Set | Set | table_name from list_byom() |
1621
+ | | | | | is used and schema name |
1622
+ | | | | | associated with the current |
1623
+ | | | | | context is used. |
1624
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1625
+ | Not set | Set | Set | Set | Exception is raised. |
1626
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1627
+ | Not set | Not set | Set | Set | table_name and schema_name |
1628
+ | | | | | from set_byom_catalog() |
1629
+ | | | | | are used for function execution. |
1630
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1631
+ | Not set | Not set | Set | Not set | table_name from set_byom_catalog() |
1632
+ | | | | | is used and schema name |
1633
+ | | | | | associated with the current |
1634
+ | | | | | context is used. |
1635
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1636
+ | Not set | Not set | Not set | Not set | Exception is raised |
1637
+ +----------------+-------------+-----------------------+-------------+-------------------------------------+
1638
+ RETURNS:
1639
+ None.
1640
+
1641
+ RAISES:
1642
+ TeradataMlException, TypeError
1643
+
1644
+ EXAMPLES:
1645
+ >>> import teradataml, os, datetime
1646
+ >>> model_file = os.path.join(os.path.dirname(teradataml.__file__), 'data', 'models', 'iris_kmeans_model')
1647
+ >>> from teradataml import save_byom, list_byom
1648
+ >>> save_byom('model7', model_file, 'byom_models')
1649
+ Model is saved.
1650
+ >>> save_byom('iris_model1', model_file, 'byom_models')
1651
+ Model is saved.
1652
+ >>> save_byom('model8', model_file, 'byom_models', schema_name='test')
1653
+ Model is saved.
1654
+ >>> save_byom('iris_model1', model_file, 'byom_licensed_models')
1655
+ Model is saved.
1656
+ >>>
1657
+
1658
+ # Example 1 - List all the models from the table byom_models.
1659
+ >>> list_byom(table_name='byom_models')
1660
+ model
1661
+ model_id
1662
+ model7 b'504B03041400080808...'
1663
+ iris_model1 b'504B03041400080808...'
1664
+ >>>
1665
+
1666
+ # Example 2 - List all the models with model_id containing 'iris' string.
1667
+ # List such models from 'byom_models' table.
1668
+ >>> list_byom(table_name='byom_models', model_id='iris')
1669
+ model
1670
+ model_id
1671
+ iris_model1 b'504B03041400080808...'
1672
+ >>>
1673
+
1674
+ # Example 3 - List all the models with model_id containing either 'iris'
1675
+ # or '7'. List such models from 'byom_models' table.
1676
+ >>> list_byom(table_name='byom_models', model_id=['iris', '7'])
1677
+ model
1678
+ model_id
1679
+ model7 b'504B03041400080808...'
1680
+ iris_model1 b'504B03041400080808...'
1681
+ >>>
1682
+
1683
+ # Example 4 - List all the models from the 'byom_models' table and table is
1684
+ # in 'test' DataBase.
1685
+ >>> list_byom(table_name='byom_models', schema_name='test')
1686
+ model
1687
+ model_id
1688
+ model8 b'504B03041400080808...'
1689
+ >>>
1690
+
1691
+ # Example 5 - List all the models from the model cataloging table
1692
+ # set by set_byom_catalog().
1693
+ >>> set_byom_catalog(table_name='byom_models', schema_name='alice')
1694
+ The model cataloging parameters are set to table_name='byom_models' and schema_name='alice'
1695
+ >>> list_byom()
1696
+ model
1697
+ model_id
1698
+ model8 b'504B03041400080808...'
1699
+
1700
+ # Example 6 - List all the models from the table other than model cataloging table
1701
+ # set at the session level.
1702
+ >>> set_byom_catalog(table_name='byom_models', schema_name= 'alice')
1703
+ The model cataloging parameters are set to table_name='byom_models' and schema_name='alice'
1704
+ >>> list_byom(table_name='byom_licensed_models')
1705
+ model
1706
+ model_id
1707
+ iris_model1 b'504B03041400080808...'
1708
+
1709
+ """
1710
+
1711
+ # Let's perform argument validations.
1712
+ # Create argument information matrix to do parameter checking
1713
+ __arg_info_matrix = []
1714
+ __arg_info_matrix.append(["table_name", table_name, True, str, True])
1715
+ __arg_info_matrix.append(["schema_name", schema_name, True, str, True])
1716
+ __arg_info_matrix.append(["model_id", model_id, True, (str, list), True])
1717
+
1718
+ # Make sure that a correct type of values has been supplied to the arguments.
1719
+ validator._validate_function_arguments(__arg_info_matrix)
1720
+
1721
+ # Set the table and schema name according to the model cataloging parameters and the user inputs.
1722
+ table_name, schema_name = __set_validate_catalog_parameters(table_name, schema_name)
1723
+
1724
+ # Before proceeding further, check whether table exists or not.
1725
+ conn = get_connection()
1726
+ if not conn.dialect.has_table(conn, table_name=table_name, schema=schema_name):
1727
+ error_code = MessageCodes.MODEL_CATALOGING_OPERATION_FAILED
1728
+ error_msg = Messages.get_message(
1729
+ error_code, "list", 'Table "{}.{}" does not exist.'.format(schema_name, table_name))
1730
+ raise TeradataMlException(error_msg, error_code)
1731
+
1732
+ model_details = DataFrame(in_schema(schema_name, table_name))
1733
+
1734
+ filter_condition = None
1735
+ if model_id:
1736
+ model_ids = UtilFuncs._as_list(model_id)
1737
+ for modelid in model_ids:
1738
+ # Filter Expression on model_id column.
1739
+ # We are looking to find all rows with model_id matching with 'modelid' string.
1740
+ # This is case-insensitive look-up.
1741
+ filter_expression = __get_like_filter_expression_on_col(model_details._metaexpr,
1742
+ "model_id", modelid)
1743
+ filter_condition = filter_condition | filter_expression \
1744
+ if filter_condition else filter_expression
1745
+
1746
+ if filter_condition:
1747
+ model_details = model_details[filter_condition]
1748
+
1749
+ if model_details.shape[0] != 0:
1750
+ orig_max_rows_num = display.max_rows
1751
+ try:
1752
+ display.max_rows = 99999
1753
+ print(model_details)
1754
+ except Exception:
1755
+ raise
1756
+ finally:
1757
+ display.max_rows = orig_max_rows_num
1758
+ else:
1759
+ print("No models found.")