diff --git a/examples/ih/Conversion_Reporting.ipynb b/examples/ih/Conversion_Reporting.ipynb
index 7cbb0fa2..91c84afd 100644
--- a/examples/ih/Conversion_Reporting.ipynb
+++ b/examples/ih/Conversion_Reporting.ipynb
@@ -56,8 +56,9 @@
"metadata": {},
"outputs": [],
"source": [
- "ih.plots.conversion_overall_gauges(\n",
- " experiment_field=\"ExperimentGroup\",\n",
+ "ih.plots.overall_gauges(\n",
+ " metric=\"Conversion\",\n",
+ " condition=\"ExperimentGroup\",\n",
" by=\"Channel\",\n",
" reference_values={\"Web\": 0.055, \"Email\": 0.09},\n",
")"
@@ -78,7 +79,7 @@
"metadata": {},
"outputs": [],
"source": [
- "ih.plots.conversion_success_rates_tree_map()\n"
+ "ih.plots.success_rates_tree_map(metric=\"Conversion\")\n"
]
},
{
@@ -96,10 +97,20 @@
"metadata": {},
"outputs": [],
"source": [
- "ih.plots.conversion_success_rates_trend_bar(\n",
- " experiment_field=\"ExperimentGroup\",\n",
+ "ih.plots.success_rates_trend_bar(\n",
+ " metric=\"Conversion\",\n",
+ " condition=\"ExperimentGroup\",\n",
" every=\"1w\",\n",
- ")"
+ ")\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "ih.plots.success_rates_trend(metric=\"Conversion\", every=\"1d\")"
]
},
{
@@ -115,8 +126,8 @@
"metadata": {},
"outputs": [],
"source": [
- "ih.plots.egagement_overall_gauges(\n",
- " experiment_field=\"ExperimentGroup\",\n",
+ "ih.plots.overall_gauges(\n",
+ " condition=\"ExperimentGroup\",\n",
" by=\"Channel\",\n",
" reference_values={\"Web\": 0.20, \"Email\": 0.20},\n",
")"
@@ -128,7 +139,7 @@
"metadata": {},
"outputs": [],
"source": [
- "ih.plots.conversion_success_rates_trend_line(\n",
+ "ih.plots.success_rates_trend(\n",
" by=\"Channel\"\n",
")"
]
diff --git a/examples/ih/Example_IH_Analysis.ipynb b/examples/ih/Example_IH_Analysis.ipynb
index 2430ac13..5fad5087 100644
--- a/examples/ih/Example_IH_Analysis.ipynb
+++ b/examples/ih/Example_IH_Analysis.ipynb
@@ -2,821 +2,155 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": null,
"metadata": {},
- "outputs": [
- {
- "ename": "ModuleNotFoundError",
- "evalue": "No module named 'cdhtools'",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)",
- "Cell \u001b[0;32mIn[1], line 4\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpandas\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01msys\u001b[39;00m\n\u001b[0;32m----> 4\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mcdhtools\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mIHanalysis\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;241m*\u001b[39m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mcdhtools\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcdh_utils\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m readDSExport\n\u001b[1;32m 7\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mmatplotlib\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpyplot\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mplt\u001b[39;00m\n",
- "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'cdhtools'"
- ]
- }
- ],
+ "outputs": [],
"source": [
- "import pandas as pd\n",
- "import sys\n",
+ "from pdstools import IH\n",
+ "from pdstools.utils import cdh_utils\n",
"\n",
- "from cdhtools.IHanalysis import *\n",
- "from cdhtools.cdh_utils import readDSExport\n",
+ "import polars as pl\n",
+ "import plotly.io as pio\n",
+ "import plotly as plotly\n",
"\n",
- "import matplotlib.pyplot as plt\n",
- "%matplotlib inline"
+ "plotly.offline.init_notebook_mode()\n",
+ "pio.renderers.default = \"vscode\""
]
},
{
- "cell_type": "code",
- "execution_count": null,
+ "cell_type": "markdown",
"metadata": {},
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "Importing: ../../data/Data-pxStrategyResult_pxInteractionHistory_20210101T010000_GMT.zip\n"
- ]
- }
- ],
"source": [
- "df_orig = readDSExport(\"Data-pxStrategyResult_pxInteractionHistory_20210101T010000_GMT.zip\", path=\"../../data\")"
+ "# Example IH Analysis\n",
+ "\n",
+ "Interaction History (IH) is a rich source of data at the level of individual interactions from Pega DSM applications. It contains the time of the interaction, the channel, the actions/treatments, the customer ID and is used to track different types of outcomes (decisions, sends, opens, clicks, etc). It does **not** contain customer attributes - only the IDs.\n",
+ "\n",
+ "This notebook gives some examples of data analysis on IH. Like most of PDSTools, it uses [plotly](https://plotly.com/python/) for visualization and [polars](https://docs.pola.rs/) (dataframe) but the purpose of this Notebook is more to serve example analyses than re-usable code, although of course we do try to provide some generic, re-usable functions. All of the analyses should be able to be replicated easily in other analytical BI environments - except perhaps the analysis of model performance / AUC.\n",
+ "\n",
+ "This notebook uses sample data shipped with PDStools. Replace it with your own actual IH data and modify the analyses as appropriate."
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
- "df = initial_prep(df_orig, referenceTime='pxOutcomeTime')"
+ "ih = IH.from_ds_export(\n",
+ " \"../../data/Data-pxStrategyResult_pxInteractionHistory_20210101T010000_GMT.zip\"\n",
+ ")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "At first, take a look into the IH dataframe, explore the columns, outcome types and business structure"
+ "Preview of the raw IH data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "
\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " pySubjectType | \n",
- " pxInteractionID | \n",
- " ControlGroupValidityStart | \n",
- " pyStage | \n",
- " pyJourney | \n",
- " CustomerID | \n",
- " ChannelSubGroup | \n",
- " pyChannel | \n",
- " pyCustomerSubSegment | \n",
- " pyStep | \n",
- " ... | \n",
- " pyResponse | \n",
- " pyCategory | \n",
- " ControlGroupValidityEnd | \n",
- " pxDecisionTime | \n",
- " pyLabel | \n",
- " ChannelGroup | \n",
- " pyStrategy | \n",
- " Date | \n",
- " WeekOfYear | \n",
- " Week | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " 0 | \n",
- " CDHSample-Data-Customer | \n",
- " -3586780626931683381 | \n",
- " | \n",
- " | \n",
- " | \n",
- " Customer-4118 | \n",
- " | \n",
- " SMS | \n",
- " | \n",
- " | \n",
- " ... | \n",
- " | \n",
- " | \n",
- " | \n",
- " 2021-01-27 13:22:05.810000+00:00 | \n",
- " U+ Personal Card | \n",
- " | \n",
- " InitializeModelsSmall | \n",
- " 2021-01-27 | \n",
- " 4 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- " 1 | \n",
- " CDHSample-Data-Customer | \n",
- " -3586780626931683381 | \n",
- " | \n",
- " | \n",
- " | \n",
- " Customer-4118 | \n",
- " | \n",
- " Web | \n",
- " | \n",
- " | \n",
- " ... | \n",
- " | \n",
- " | \n",
- " | \n",
- " 2021-01-27 13:22:05.810000+00:00 | \n",
- " U+ Personal Card | \n",
- " | \n",
- " InitializeModelsSmall | \n",
- " 2021-01-27 | \n",
- " 4 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- " 2 | \n",
- " CDHSample-Data-Customer | \n",
- " -3586780626931683381 | \n",
- " | \n",
- " | \n",
- " | \n",
- " Customer-4118 | \n",
- " | \n",
- " Web | \n",
- " | \n",
- " | \n",
- " ... | \n",
- " | \n",
- " | \n",
- " | \n",
- " 2021-01-27 13:22:05.810000+00:00 | \n",
- " Visa Gold Card | \n",
- " | \n",
- " InitializeModelsSmall | \n",
- " 2021-01-27 | \n",
- " 4 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- " 3 | \n",
- " CDHSample-Data-Customer | \n",
- " -3586780626931683381 | \n",
- " | \n",
- " | \n",
- " | \n",
- " Customer-4118 | \n",
- " | \n",
- " SMS | \n",
- " | \n",
- " | \n",
- " ... | \n",
- " | \n",
- " | \n",
- " | \n",
- " 2021-01-27 13:22:05.810000+00:00 | \n",
- " MasterCard Gold | \n",
- " | \n",
- " InitializeModelsSmall | \n",
- " 2021-01-27 | \n",
- " 4 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- " 4 | \n",
- " CDHSample-Data-Customer | \n",
- " -3586780626931683381 | \n",
- " | \n",
- " | \n",
- " | \n",
- " Customer-4118 | \n",
- " | \n",
- " Web | \n",
- " | \n",
- " | \n",
- " ... | \n",
- " | \n",
- " | \n",
- " | \n",
- " 2021-01-27 13:22:05.810000+00:00 | \n",
- " AMEXPersonal | \n",
- " | \n",
- " InitializeModelsSmall | \n",
- " 2021-01-27 | \n",
- " 4 | \n",
- " 1 | \n",
- "
\n",
- " \n",
- "
\n",
- "
5 rows × 52 columns
\n",
- "
"
- ],
- "text/plain": [
- " pySubjectType pxInteractionID ControlGroupValidityStart \\\n",
- "0 CDHSample-Data-Customer -3586780626931683381 \n",
- "1 CDHSample-Data-Customer -3586780626931683381 \n",
- "2 CDHSample-Data-Customer -3586780626931683381 \n",
- "3 CDHSample-Data-Customer -3586780626931683381 \n",
- "4 CDHSample-Data-Customer -3586780626931683381 \n",
- "\n",
- " pyStage pyJourney CustomerID ChannelSubGroup pyChannel \\\n",
- "0 Customer-4118 SMS \n",
- "1 Customer-4118 Web \n",
- "2 Customer-4118 Web \n",
- "3 Customer-4118 SMS \n",
- "4 Customer-4118 Web \n",
- "\n",
- " pyCustomerSubSegment pyStep ... pyResponse pyCategory \\\n",
- "0 ... \n",
- "1 ... \n",
- "2 ... \n",
- "3 ... \n",
- "4 ... \n",
- "\n",
- " ControlGroupValidityEnd pxDecisionTime pyLabel \\\n",
- "0 2021-01-27 13:22:05.810000+00:00 U+ Personal Card \n",
- "1 2021-01-27 13:22:05.810000+00:00 U+ Personal Card \n",
- "2 2021-01-27 13:22:05.810000+00:00 Visa Gold Card \n",
- "3 2021-01-27 13:22:05.810000+00:00 MasterCard Gold \n",
- "4 2021-01-27 13:22:05.810000+00:00 AMEXPersonal \n",
- "\n",
- " ChannelGroup pyStrategy Date WeekOfYear Week \n",
- "0 InitializeModelsSmall 2021-01-27 4 1 \n",
- "1 InitializeModelsSmall 2021-01-27 4 1 \n",
- "2 InitializeModelsSmall 2021-01-27 4 1 \n",
- "3 InitializeModelsSmall 2021-01-27 4 1 \n",
- "4 InitializeModelsSmall 2021-01-27 4 1 \n",
- "\n",
- "[5 rows x 52 columns]"
- ]
- },
- "execution_count": 6,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "df.head()"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "text/html": [
- "\n",
- "\n",
- "
\n",
- " \n",
- " \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " Count | \n",
- "
\n",
- " \n",
- " pyIssue | \n",
- " pyGroup | \n",
- " pyDirection | \n",
- " pyChannel | \n",
- " pyName | \n",
- " pyOutcome | \n",
- " | \n",
- "
\n",
- " \n",
- " \n",
- " \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " | \n",
- " Churned | \n",
- " 5072 | \n",
- "
\n",
- " \n",
- " Loyal | \n",
- " 4928 | \n",
- "
\n",
- " \n",
- " Sales | \n",
- " CreditCards | \n",
- " Inbound | \n",
- " Web | \n",
- " AMEXPersonal | \n",
- " Clicked | \n",
- " 1487 | \n",
- "
\n",
- " \n",
- " NoResponse | \n",
- " 6331 | \n",
- "
\n",
- " \n",
- " UPlusFinGold | \n",
- " Accepted | \n",
- " 367 | \n",
- "
\n",
- " \n",
- " Rejected | \n",
- " 6468 | \n",
- "
\n",
- " \n",
- " UPlusFinPersonal | \n",
- " Accepted | \n",
- " 367 | \n",
- "
\n",
- " \n",
- " Rejected | \n",
- " 6534 | \n",
- "
\n",
- " \n",
- " UPlusGold | \n",
- " Accepted | \n",
- " 1843 | \n",
- "
\n",
- " \n",
- " Clicked | \n",
- " 1204 | \n",
- "
\n",
- " \n",
- " NoResponse | \n",
- " 7004 | \n",
- "
\n",
- " \n",
- " Rejected | \n",
- " 5487 | \n",
- "
\n",
- " \n",
- " UPlusPersonal | \n",
- " Accept | \n",
- " 2635 | \n",
- "
\n",
- " \n",
- " Accepted | \n",
- " 970 | \n",
- "
\n",
- " \n",
- " Rejected | \n",
- " 4361 | \n",
- "
\n",
- " \n",
- " VisaGold | \n",
- " Clicked | \n",
- " 1777 | \n",
- "
\n",
- " \n",
- " NoResponse | \n",
- " 5538 | \n",
- "
\n",
- " \n",
- " Outbound | \n",
- " SMS | \n",
- " AMEXPersonal | \n",
- " Clicked | \n",
- " 1002 | \n",
- "
\n",
- " \n",
- " NoResponse | \n",
- " 6775 | \n",
- "
\n",
- " \n",
- " MasterCardGold | \n",
- " Clicked | \n",
- " 296 | \n",
- "
\n",
- " \n",
- " NoResponse | \n",
- " 6438 | \n",
- "
\n",
- " \n",
- " MasterCardWorld | \n",
- " Clicked | \n",
- " 342 | \n",
- "
\n",
- " \n",
- " NoResponse | \n",
- " 5846 | \n",
- "
\n",
- " \n",
- " UPlusFinGold | \n",
- " Accepted | \n",
- " 297 | \n",
- "
\n",
- " \n",
- " Clicked | \n",
- " 265 | \n",
- "
\n",
- " \n",
- " NoResponse | \n",
- " 7081 | \n",
- "
\n",
- " \n",
- " Rejected | \n",
- " 6645 | \n",
- "
\n",
- " \n",
- " UPlusFinPersonal | \n",
- " Accepted | \n",
- " 311 | \n",
- "
\n",
- " \n",
- " Rejected | \n",
- " 6482 | \n",
- "
\n",
- " \n",
- " UPlusGold | \n",
- " Accepted | \n",
- " 1463 | \n",
- "
\n",
- " \n",
- " Rejected | \n",
- " 5474 | \n",
- "
\n",
- " \n",
- " UPlusPersonal | \n",
- " Accept | \n",
- " 5206 | \n",
- "
\n",
- " \n",
- " Accepted | \n",
- " 684 | \n",
- "
\n",
- " \n",
- " Clicked | \n",
- " 581 | \n",
- "
\n",
- " \n",
- " NoResponse | \n",
- " 4984 | \n",
- "
\n",
- " \n",
- " Rejected | \n",
- " 4578 | \n",
- "
\n",
- " \n",
- "
\n",
- "
"
- ],
- "text/plain": [
- " Count\n",
- "pyIssue pyGroup pyDirection pyChannel pyName pyOutcome \n",
- " Churned 5072\n",
- " Loyal 4928\n",
- "Sales CreditCards Inbound Web AMEXPersonal Clicked 1487\n",
- " NoResponse 6331\n",
- " UPlusFinGold Accepted 367\n",
- " Rejected 6468\n",
- " UPlusFinPersonal Accepted 367\n",
- " Rejected 6534\n",
- " UPlusGold Accepted 1843\n",
- " Clicked 1204\n",
- " NoResponse 7004\n",
- " Rejected 5487\n",
- " UPlusPersonal Accept 2635\n",
- " Accepted 970\n",
- " Rejected 4361\n",
- " VisaGold Clicked 1777\n",
- " NoResponse 5538\n",
- " Outbound SMS AMEXPersonal Clicked 1002\n",
- " NoResponse 6775\n",
- " MasterCardGold Clicked 296\n",
- " NoResponse 6438\n",
- " MasterCardWorld Clicked 342\n",
- " NoResponse 5846\n",
- " UPlusFinGold Accepted 297\n",
- " Clicked 265\n",
- " NoResponse 7081\n",
- " Rejected 6645\n",
- " UPlusFinPersonal Accepted 311\n",
- " Rejected 6482\n",
- " UPlusGold Accepted 1463\n",
- " Rejected 5474\n",
- " UPlusPersonal Accept 5206\n",
- " Accepted 684\n",
- " Clicked 581\n",
- " NoResponse 4984\n",
- " Rejected 4578"
- ]
- },
- "execution_count": 7,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
- "source": [
- "df.groupby(['pyIssue', 'pyGroup', 'pyDirection', 'pyChannel', 'pyName', 'pyOutcome']).count()[[\n",
- " 'pxInteractionID']].rename(columns={'pxInteractionID':'Count'})"
- ]
- },
- {
- "cell_type": "markdown",
- "metadata": {},
- "source": [
- "Use \"plot_daily_accept_rate\" to plot accept rate per day to understand how accept rates changed over time. To define accept rate, enter the positive (here: Accepted) and negative (here: Rejected) behaviour in the function. use kwargs to customize the graph. If the time ticks on the x axis are too many, shrink them using 'shrinkTicks'. If data is missing in certain days, force the graph make gaps for the missing days by setting 'allTime':True. you can also define hue"
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [
- {
- "data": {
- "image/png": "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",
- "text/plain": [
- "