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

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

Potentially problematic release.


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

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