{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Price elasticity of demand notebook\n", "\n", "This notebook helps you understand the impact that changes in price will have on consumer demand for a given product. Business analysts that measure price elasticity and business users that require elasticity as an input to make pricing decisions will benefit from this notebook.\n", "\n", "Following this workflow will allow you to identify relationships between price and demand, maximize revenue by properly pricing products, monitor price elasticities for changes in price and demand, and reduce manual processes used to obtain and update price elasticities. See the full description of the use case in the business overview for more background information." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Import libraries" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import datetime\n", "from datetime import date, timedelta\n", "\n", "import datarobot as dr\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import pandas as pd\n", "import seaborn as sns\n", "\n", "dr_dark_blue = \"#08233F\"\n", "dr_orange = \"#FF7F0E\"\n", "dr_blue = \"#1F77B4\"\n", "\n", "pd.set_option(\"display.max_columns\", None)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Connect to DataRobot\n", "\n", "Read more about different options for [connecting to DataRobot from the client](https://docs.datarobot.com/en/docs/api/api-quickstart/api-qs.html)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# If the config file is not in the default location described in the API Quickstart guide, '~/.config/datarobot/drconfig.yaml', then you will need to call\n", "# dr.Client(config_path='path-to-drconfig.yaml')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Import data\n", "\n", "Access the training dataset [here](https://datarobot.app.box.com/s/lzver7v68s3y693zgy0zqm5vvxp3br17)." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateSKUNameSalesPriceBaselinePriceActualPctOnSaleMarketinghotDaysunnyDayEconChangeGDPEconJobsChangeAnnualizedCPI
07/1/12Heck 97% Pork Sausages 400g1096733.252.939.96July In Store Credit Card Signup Discount; In ...NoNo0.5NaN0.02
17/2/12Heck 97% Pork Sausages 400g1317913.252.978.65July In Store Credit Card Signup Discount; In ...NoNoNaNNaNNaN
27/3/12Heck 97% Pork Sausages 400g1347113.252.968.96July In Store Credit Card Signup Discount; In ...NoNoNaNNaNNaN
37/4/12Heck 97% Pork Sausages 400g976403.252.9210.08July In Store Credit Card Signup Discount; In ...YesNoNaNNaNNaN
47/5/12Heck 97% Pork Sausages 400g1295383.252.939.80July In Store Credit Card Signup Discount; ID5...NoNoNaNNaNNaN
\n", "
" ], "text/plain": [ " Date SKUName Sales PriceBaseline \\\n", "0 7/1/12 Heck 97% Pork Sausages 400g 109673 3.25 \n", "1 7/2/12 Heck 97% Pork Sausages 400g 131791 3.25 \n", "2 7/3/12 Heck 97% Pork Sausages 400g 134711 3.25 \n", "3 7/4/12 Heck 97% Pork Sausages 400g 97640 3.25 \n", "4 7/5/12 Heck 97% Pork Sausages 400g 129538 3.25 \n", "\n", " PriceActual PctOnSale \\\n", "0 2.93 9.96 \n", "1 2.97 8.65 \n", "2 2.96 8.96 \n", "3 2.92 10.08 \n", "4 2.93 9.80 \n", "\n", " Marketing hotDay sunnyDay \\\n", "0 July In Store Credit Card Signup Discount; In ... No No \n", "1 July In Store Credit Card Signup Discount; In ... No No \n", "2 July In Store Credit Card Signup Discount; In ... No No \n", "3 July In Store Credit Card Signup Discount; In ... Yes No \n", "4 July In Store Credit Card Signup Discount; ID5... No No \n", "\n", " EconChangeGDP EconJobsChange AnnualizedCPI \n", "0 0.5 NaN 0.02 \n", "1 NaN NaN NaN \n", "2 NaN NaN NaN \n", "3 NaN NaN NaN \n", "4 NaN NaN NaN " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "train = pd.read_csv(\"1. DR_DEMO_priceOpt_training.csv\")\n", "train.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create a project\n", "\n", "The snippets below create and configure a DataRobot project." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Create a Datarobot project\n", "proj = dr.Project.create(train, project_name=\"Price elasticity of demand\")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# Create a dataframe from the training data\n", "informative = [\n", " feat_list for feat_list in proj.get_featurelists() if feat_list.name == \"Informative Features\"\n", "][0]\n", "# Update the feature list by subtracting parents and adding new variables provided by DataRobot\n", "new_fl = proj.create_featurelist(\"new_fl\", list((set(informative.features) - {\"Date (Year)\"})))\n", "# Create a new feature list to force a monotonic relationship between price and demand\n", "mono_dec = proj.create_featurelist(\"mono_dec\", list(({\"PriceActual\"})))\n", "advanced_options = dr.AdvancedOptions(\n", " monotonic_decreasing_featurelist_id=mono_dec.id, only_include_monotonic_blueprints=False\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Initiate Autopilot" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Project(Price elasticity of demand)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "proj.set_target(\n", " target=\"Sales\",\n", " mode=dr.enums.AUTOPILOT_MODE.FULL_AUTO,\n", " advanced_options=advanced_options,\n", " featurelist_id=new_fl.id,\n", " worker_count=-1,\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Import scoring data\n", "\n", "Import the [scoring dataset](https://datarobot.app.box.com/s/7qgnaw595unuot3w2le9609g5wzc58ek) and use it to simulate the effects of different price levels." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DateSKUNamePriceBaselinePriceActualPctOnSaleMarketinghotDaysunnyDayEconChangeGDPEconJobsChangeAnnualizedCPI
02/27/20Heck 97% Pork Sausages 400g3.252.939.96July In Store Credit Card Signup Discount; In ...NoNo0.5NaN0.02
12/27/20Yeo Valley Organic Greek Style Natural Yogurt ...1.301.1710.37July In Store Credit Card Signup Discount; In ...NoNo0.5NaN0.02
22/27/20Linda McCartney Rosemary Vegetarian Sausages x...2.001.7811.21July In Store Credit Card Signup Discount; In ...NoNo0.5NaN0.02
32/27/20Goodfella's Stonebaked Thin Margherita Pizza 345g1.501.3311.09July In Store Credit Card Signup Discount; In ...NoNo0.5NaN0.02
42/27/20New Covent Garden Potato & Leek Soup 600g1.501.3311.16July In Store Credit Card Signup Discount; In ...NoNo0.5NaN0.02
\n", "
" ], "text/plain": [ " Date SKUName PriceBaseline \\\n", "0 2/27/20 Heck 97% Pork Sausages 400g 3.25 \n", "1 2/27/20 Yeo Valley Organic Greek Style Natural Yogurt ... 1.30 \n", "2 2/27/20 Linda McCartney Rosemary Vegetarian Sausages x... 2.00 \n", "3 2/27/20 Goodfella's Stonebaked Thin Margherita Pizza 345g 1.50 \n", "4 2/27/20 New Covent Garden Potato & Leek Soup 600g 1.50 \n", "\n", " PriceActual PctOnSale Marketing \\\n", "0 2.93 9.96 July In Store Credit Card Signup Discount; In ... \n", "1 1.17 10.37 July In Store Credit Card Signup Discount; In ... \n", "2 1.78 11.21 July In Store Credit Card Signup Discount; In ... \n", "3 1.33 11.09 July In Store Credit Card Signup Discount; In ... \n", "4 1.33 11.16 July In Store Credit Card Signup Discount; In ... \n", "\n", " hotDay sunnyDay EconChangeGDP EconJobsChange AnnualizedCPI \n", "0 No No 0.5 NaN 0.02 \n", "1 No No 0.5 NaN 0.02 \n", "2 No No 0.5 NaN 0.02 \n", "3 No No 0.5 NaN 0.02 \n", "4 No No 0.5 NaN 0.02 " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "score = pd.read_csv(\"2. DR_DEMO_priceOpt_forScoring.csv\")\n", "score.head()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SKUNamediscountLevelDatePriceBaselinePriceActualPctOnSaleMarketinghotDaysunnyDayEconChangeGDPEconJobsChangeAnnualizedCPI
0Heck 97% Pork Sausages 400g0.742/27/203.252.40509.96July In Store Credit Card Signup Discount; In ...NoNo0.5NaN0.02
1Heck 97% Pork Sausages 400g0.752/27/203.252.43759.96July In Store Credit Card Signup Discount; In ...NoNo0.5NaN0.02
2Heck 97% Pork Sausages 400g0.762/27/203.252.47009.96July In Store Credit Card Signup Discount; In ...NoNo0.5NaN0.02
3Heck 97% Pork Sausages 400g0.772/27/203.252.50259.96July In Store Credit Card Signup Discount; In ...NoNo0.5NaN0.02
4Heck 97% Pork Sausages 400g0.782/27/203.252.53509.96July In Store Credit Card Signup Discount; In ...NoNo0.5NaN0.02
\n", "
" ], "text/plain": [ " SKUName discountLevel Date PriceBaseline \\\n", "0 Heck 97% Pork Sausages 400g 0.74 2/27/20 3.25 \n", "1 Heck 97% Pork Sausages 400g 0.75 2/27/20 3.25 \n", "2 Heck 97% Pork Sausages 400g 0.76 2/27/20 3.25 \n", "3 Heck 97% Pork Sausages 400g 0.77 2/27/20 3.25 \n", "4 Heck 97% Pork Sausages 400g 0.78 2/27/20 3.25 \n", "\n", " PriceActual PctOnSale Marketing \\\n", "0 2.4050 9.96 July In Store Credit Card Signup Discount; In ... \n", "1 2.4375 9.96 July In Store Credit Card Signup Discount; In ... \n", "2 2.4700 9.96 July In Store Credit Card Signup Discount; In ... \n", "3 2.5025 9.96 July In Store Credit Card Signup Discount; In ... \n", "4 2.5350 9.96 July In Store Credit Card Signup Discount; In ... \n", "\n", " hotDay sunnyDay EconChangeGDP EconJobsChange AnnualizedCPI \n", "0 No No 0.5 NaN 0.02 \n", "1 No No 0.5 NaN 0.02 \n", "2 No No 0.5 NaN 0.02 \n", "3 No No 0.5 NaN 0.02 \n", "4 No No 0.5 NaN 0.02 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Create different price points in the scoring dataset\n", "skuList = score[\"SKUName\"].unique()\n", "discountList = range(74, 126, 1)\n", "discountList = [discountList / 100 for discountList in discountList]\n", "\n", "index = pd.MultiIndex.from_product([skuList, discountList], names=[\"SKUName\", \"discountLevel\"])\n", "indexDF = pd.DataFrame(index=index).reset_index()\n", "scorePerm = pd.merge(indexDF, score, on=[\"SKUName\"], how=\"left\")\n", "scorePerm[\"PriceActual\"] = scorePerm[\"discountLevel\"] * scorePerm[\"PriceBaseline\"]\n", "scorePerm.head()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "# scorePerm.to_csv(\"2. DR_DEMO_priceOpt_forScoring_allPerm.csv\",index=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Test predictions \n", "\n", "Use the scoring dataset with the top-performing model to generate demand predictions for each stock keeping unit (SKU) at different price points." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "proj = dr.Project.get(project_id=\"your-project-id\")\n", "model = dr.ModelRecommendation.get(\n", " proj.id, dr.enums.RECOMMENDED_MODEL_TYPE.RECOMMENDED_FOR_DEPLOYMENT\n", ").get_model()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "dataset = proj.upload_dataset(scorePerm)\n", "pred_job = model.request_predictions(dataset.id)\n", "preds = pred_job.get_result_when_complete()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true, "jupyter": { "outputs_hidden": true } }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SKUNamediscountLevelDatePriceBaselinePriceActualPctOnSaleMarketinghotDaysunnyDayEconChangeGDPEconJobsChangeAnnualizedCPIrow_idpredictionrevenue
0Heck 97% Pork Sausages 400g0.742/27/203.252.40509.96July In Store Credit Card Signup Discount; In ...NoNo0.5NaN0.020115643.445312278122.485977
1Heck 97% Pork Sausages 400g0.752/27/203.252.43759.96July In Store Credit Card Signup Discount; In ...NoNo0.5NaN0.021115643.445312281880.897949
2Heck 97% Pork Sausages 400g0.762/27/203.252.47009.96July In Store Credit Card Signup Discount; In ...NoNo0.5NaN0.022115643.445312285639.309922
3Heck 97% Pork Sausages 400g0.772/27/203.252.50259.96July In Store Credit Card Signup Discount; In ...NoNo0.5NaN0.023115643.445312289397.721895
4Heck 97% Pork Sausages 400g0.782/27/203.252.53509.96July In Store Credit Card Signup Discount; In ...NoNo0.5NaN0.024115643.445312293156.133867
\n", "
" ], "text/plain": [ " SKUName discountLevel Date PriceBaseline \\\n", "0 Heck 97% Pork Sausages 400g 0.74 2/27/20 3.25 \n", "1 Heck 97% Pork Sausages 400g 0.75 2/27/20 3.25 \n", "2 Heck 97% Pork Sausages 400g 0.76 2/27/20 3.25 \n", "3 Heck 97% Pork Sausages 400g 0.77 2/27/20 3.25 \n", "4 Heck 97% Pork Sausages 400g 0.78 2/27/20 3.25 \n", "\n", " PriceActual PctOnSale Marketing \\\n", "0 2.4050 9.96 July In Store Credit Card Signup Discount; In ... \n", "1 2.4375 9.96 July In Store Credit Card Signup Discount; In ... \n", "2 2.4700 9.96 July In Store Credit Card Signup Discount; In ... \n", "3 2.5025 9.96 July In Store Credit Card Signup Discount; In ... \n", "4 2.5350 9.96 July In Store Credit Card Signup Discount; In ... \n", "\n", " hotDay sunnyDay EconChangeGDP EconJobsChange AnnualizedCPI row_id \\\n", "0 No No 0.5 NaN 0.02 0 \n", "1 No No 0.5 NaN 0.02 1 \n", "2 No No 0.5 NaN 0.02 2 \n", "3 No No 0.5 NaN 0.02 3 \n", "4 No No 0.5 NaN 0.02 4 \n", "\n", " prediction revenue \n", "0 115643.445312 278122.485977 \n", "1 115643.445312 281880.897949 \n", "2 115643.445312 285639.309922 \n", "3 115643.445312 289397.721895 \n", "4 115643.445312 293156.133867 " ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "predsAll = pd.concat([scorePerm, preds], axis=1)\n", "predsAll[\"revenue\"] = (\n", " predsAll[\"prediction\"] * predsAll[\"PriceActual\"]\n", ") # - predsAll['prediction']*predsAll['PriceBaseline']*0.2\n", "predsAll.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### View distribution of demand\n", "\n", "Use the snippets below to view the distribution of demand for different price points for one SKU." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "oneSKU = predsAll[predsAll[\"SKUName\"] == \"New Covent Garden Potato & Leek Soup 600g\"]" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "oneSKU = predsAll[predsAll[\"SKUName\"] == \"New Covent Garden Potato & Leek Soup 600g\"]\n", "\n", "plt.rcParams.update({\"text.color\": \"white\", \"axes.labelcolor\": \"white\"})\n", "fig = plt.figure(figsize=(8, 8))\n", "ax1 = fig.add_subplot(1, 1, 1, facecolor=dr_dark_blue)\n", "ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axis\n", "plt.title(\"Optimum Price Point\")\n", "\n", "ax1.set_xlabel(\"Change vs. Baseline Price\")\n", "ax1.tick_params(axis=\"x\", labelcolor=\"white\", colors=\"white\")\n", "\n", "ax1.set_ylabel(\"Total Revenue\", color=dr_blue)\n", "ax1.tick_params(axis=\"y\", labelcolor=dr_blue, colors=dr_blue)\n", "ax1.plot(oneSKU.discountLevel, oneSKU.revenue, color=dr_blue)\n", "\n", "ax2.set_ylabel(\"Total Sales\", color=dr_orange)\n", "ax2.tick_params(axis=\"y\", labelcolor=dr_orange, colors=dr_orange)\n", "ax2.plot(oneSKU.discountLevel, oneSKU.prediction, color=dr_orange)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Select the price point that maximizes revenue for each SKU." ] }, { "cell_type": "markdown", "metadata": { "jupyter": { "outputs_hidden": true } }, "source": [ "idx = predsAll.groupby(['SKUName'])['revenue'].transform(max) == predsAll['revenue']\n", "maxSales = predsAll[idx][['SKUName','discountLevel','PriceActual']]\n", "maxSales['discountLevel'] = ((maxSales['discountLevel'] - 1)*100).astype(int).astype(str)+\"%\"\n", "finalData = pd.merge(score, maxSales, on=[\"SKUName\"], how=\"left\")#.drop(\"Row Count - 2. DR_DEMO_priceOpt_forScoring.csv\",axis=1)\n", "finalData.head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Deploy a model to production\n", "\n", "\n", "If you are happy with the model's performance, you can deploy it to a production environment with [MLOps](https://docs.datarobot.com/en/mlops/index.html). Deploying the model will free up workers, as data scored through the deployment doesn't use any modeling workers. Furthermore, you are no longer restricted on the amount of data to score; score over 100GB with the deployment. Deployments also offer many model management benefits: monitoring service, data drift, model comparison, retraining, and more." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "autoscroll": "auto" }, "outputs": [ { "data": { "text/plain": [ "Deployment(Late Shipment Predictions)" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Retrieve a prediction server\n", "prediction_server = dr.PredictionServer.list()[0]\n", "\n", "# Get the top performing model. Uncomment if this did not execute in the previous section\n", "# model_top = sorted_by_metric(models, 'crossValidation', metric)[0]\n", "\n", "deployment = dr.Deployment.create_from_learning_model(\n", " model_top.id,\n", " label=\"Price elasticity\",\n", " description=\"Predict the optimal price for a product based on demand\",\n", " default_prediction_server_id=prediction_server.id,\n", ")\n", "deployment.id" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Before proceeding, provide the deployed model's deployment ID (retrieved from the deployment's [Overview tab](https://docs.datarobot.com/en/docs/mlops/monitor/dep-overview.html) or from the Deployment object in the Python client with \"deployment.id.\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Configure batch predictions\n", "\n", "After the model has been deployed, DataRobot creates an endpoint for real-time scoring. The deployment allows you to use DataRobot's batch prediction API to score large datasets with a deployed DataRobot model. \n", "\n", "The batch prediction API provides flexible intake and output options when scoring large datasets using prediction servers. The API is exposed through the DataRobot Public API and can be consumed using a REST-enabled client or Public API bindings for DataRobot's Python client." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Set the deployment ID" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "deployment_id = \"YOUR_DEPLOYMENT_ID\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Determine input and output options\n", "\n", "DataRobot's batch prediction API allows you to score data from and to multiple sources. You can take advantage of the credentials and data sources you have already established previously through the UI for easy scoring. Credentials are usernames and passwords, while data sources are any databases with which you have previously established a connection (e.g., Snowflake). View the example code below outlining how to query credentials and data sources.\n", "\n", "See the documentation for the full list of supported [input](https://docs.datarobot.com/en/docs/predictions/batch/batch-prediction-api/intake-options.html) and [output options](https://docs.datarobot.com/en/docs/predictions/batch/batch-prediction-api/output-options.html) and more information about [data connections](https://docs.datarobot.com/en/docs/data/connect-data/data-conn.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The snippet below shows how you can query all credentials tied to a DataRobot account." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dr.Credential.list()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The output above returns multiple sets of credentials. The alphanumeric string included in each item of the list is the credentials ID. You can use that ID to access credentials through the API." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The snippet below shows how you can query all data sources tied to a DataRobot account. The second line lists each datastore with an alphanumeric string; that is the datastore ID." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5e6696ff820e737a5bd78430\n" ] } ], "source": [ "dr.DataStore.list()\n", "print(dr.DataStore.list()[0].id)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Scoring examples" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The snippets below demonstrate how to score data with the Batch Prediction API. Edit the `intake_settings` and `output_settings` to suit your needs. You can mix and match until you get the outcome you prefer." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Score from CSV to CSV" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Scoring without Prediction Explanations\n", "if False:\n", " dr.BatchPredictionJob.score(\n", " deployment_id,\n", " intake_settings={\n", " \"type\": \"localFile\",\n", " \"file\": \"inputfile.csv\", # Provide the filepath, Pandas dataframe, or file-like object here\n", " },\n", " output_settings={\"type\": \"localFile\", \"path\": \"outputfile.csv\"},\n", " )\n", "\n", "# Scoring with Prediction Explanations\n", "if False:\n", " dr.BatchPredictionJob.score(\n", " deployment_id,\n", " intake_settings={\n", " \"type\": \"localFile\",\n", " \"file\": \"inputfile.csv\", # Provide the filepath, Pandas dataframe, or file-like object here\n", " },\n", " output_settings={\"type\": \"localFile\", \"path\": \"outputfile.csv\"},\n", " max_explanations=3, # Compute Prediction Explanations for the amount of features indicated here\n", " )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Score from S3 to S3" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "if False:\n", " dr.BatchPredictionJob.score(\n", " deployment_id,\n", " intake_settings={\n", " \"type\": \"s3\",\n", " \"url\": \"s3://theos-test-bucket/lending_club_scoring.csv\", # Provide the URL of your datastore here\n", " \"credential_id\": \"YOUR_CREDENTIAL_ID_FROM_ABOVE\", # Provide your credentials here\n", " },\n", " output_settings={\n", " \"type\": \"s3\",\n", " \"url\": \"s3://theos-test-bucket/lending_club_scored2.csv\",\n", " \"credential_id\": \"YOUR_CREDENTIAL_ID_FROM_ABOVE\",\n", " },\n", " )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Score from JDBC to JDBC" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "if False:\n", " dr.BatchPredictionJob.score(\n", " deployment_id,\n", " intake_settings={\n", " \"type\": \"jdbc\",\n", " \"table\": \"table_name\",\n", " \"schema\": \"public\",\n", " \"dataStoreId\": data_store.id, # Provide the ID of your datastore here\n", " \"credentialId\": cred.credential_id, # Provide your credentials here\n", " },\n", " output_settings={\n", " \"type\": \"jdbc\",\n", " \"table\": \"table_name\",\n", " \"schema\": \"public\",\n", " \"statementType\": \"insert\",\n", " \"dataStoreId\": data_store.id,\n", " \"credentialId\": cred.credential_id,\n", " },\n", " )" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 4 }