Files
Gainsight/Scripts/Jupyter/combo_3.ipynb

3283 lines
155 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "code",
"execution_count": 895,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd \n",
"import numpy as np \n",
"import seaborn as sns \n",
"import matplotlib.pylab as plt \n",
"import sketch\n",
"#plt.style.use('ggplot')"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"# First Import\n",
"\n",
"What we are doing here is importing some organizational data that we can compare to Heap's data. We need items like the Customer's Unique ID, the Instance ID, some ICP and use-case information, and the customer's customer name. \n",
"\n",
"Currently, I am pulling from [this look](https://northpasshq.looker.com/looks/125). Use this."
]
},
{
"cell_type": "code",
"execution_count": 896,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Customers Customer ID</th>\n",
" <th>Mal Actuals School ID</th>\n",
" <th>Mal Actuals School Name</th>\n",
" <th>Chris Bookings ICP</th>\n",
" <th>Customers Organization</th>\n",
" <th>Customers Use Case</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>30799651</td>\n",
" <td>5365.0</td>\n",
" <td>CORE College</td>\n",
" <td>Non-CE</td>\n",
" <td>The CORE Group</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>30801577</td>\n",
" <td>5454.0</td>\n",
" <td>Serge</td>\n",
" <td>Non-CE</td>\n",
" <td>Serge</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>30857025</td>\n",
" <td>4581.0</td>\n",
" <td>Team Trudeau Training</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>The Federal Liberal Agency of Canada</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>30857025</td>\n",
" <td>5265.0</td>\n",
" <td>Formation de l'Équipe Trudeau</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>The Federal Liberal Agency of Canada</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>30861952</td>\n",
" <td>6097.0</td>\n",
" <td>ElderSource Internal</td>\n",
" <td>Non-CE</td>\n",
" <td>Eldersource</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Customers Customer ID Mal Actuals School ID \n",
"0 30799651 5365.0 \\\n",
"1 30801577 5454.0 \n",
"2 30857025 4581.0 \n",
"3 30857025 5265.0 \n",
"4 30861952 6097.0 \n",
"\n",
" Mal Actuals School Name Chris Bookings ICP \n",
"0 CORE College Non-CE \\\n",
"1 Serge Non-CE \n",
"2 Team Trudeau Training CE Non-ICP \n",
"3 Formation de l'Équipe Trudeau CE Non-ICP \n",
"4 ElderSource Internal Non-CE \n",
"\n",
" Customers Organization Customers Use Case \n",
"0 The CORE Group Employees \n",
"1 Serge Employees \n",
"2 The Federal Liberal Agency of Canada Customers \n",
"3 The Federal Liberal Agency of Canada Customers \n",
"4 Eldersource Employees "
]
},
"execution_count": 896,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ids= pd.read_csv(\"/Users/normrasmussen/Downloads/school_names_ids.csv\")\n",
"ids.head(5)"
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"### Next, we need to rename the columns for better and easier access. "
]
},
{
"cell_type": "code",
"execution_count": 897,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>customer_id</th>\n",
" <th>school_id</th>\n",
" <th>school_name</th>\n",
" <th>icp_boolean</th>\n",
" <th>customer_name</th>\n",
" <th>use_case</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>30799651</td>\n",
" <td>5365.0</td>\n",
" <td>CORE College</td>\n",
" <td>Non-CE</td>\n",
" <td>The CORE Group</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>30801577</td>\n",
" <td>5454.0</td>\n",
" <td>Serge</td>\n",
" <td>Non-CE</td>\n",
" <td>Serge</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>30857025</td>\n",
" <td>4581.0</td>\n",
" <td>Team Trudeau Training</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>The Federal Liberal Agency of Canada</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>30857025</td>\n",
" <td>5265.0</td>\n",
" <td>Formation de l'Équipe Trudeau</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>The Federal Liberal Agency of Canada</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>30861952</td>\n",
" <td>6097.0</td>\n",
" <td>ElderSource Internal</td>\n",
" <td>Non-CE</td>\n",
" <td>Eldersource</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>30861952</td>\n",
" <td>6099.0</td>\n",
" <td>ElderSource Ecommerce</td>\n",
" <td>Non-CE</td>\n",
" <td>Eldersource</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>30861952</td>\n",
" <td>6101.0</td>\n",
" <td>ElderSource Partner</td>\n",
" <td>Non-CE</td>\n",
" <td>Eldersource</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>30867042</td>\n",
" <td>4706.0</td>\n",
" <td>Givergy Academy</td>\n",
" <td>Non-CE</td>\n",
" <td>Givergy</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>30867043</td>\n",
" <td>3332.0</td>\n",
" <td>Access University</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>Access E-Forms</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>30867046</td>\n",
" <td>5667.0</td>\n",
" <td>School of Rokt</td>\n",
" <td>Non-CE</td>\n",
" <td>Rokt Pte Ltd</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" customer_id school_id school_name icp_boolean \n",
"0 30799651 5365.0 CORE College Non-CE \\\n",
"1 30801577 5454.0 Serge Non-CE \n",
"2 30857025 4581.0 Team Trudeau Training CE Non-ICP \n",
"3 30857025 5265.0 Formation de l'Équipe Trudeau CE Non-ICP \n",
"4 30861952 6097.0 ElderSource Internal Non-CE \n",
"5 30861952 6099.0 ElderSource Ecommerce Non-CE \n",
"6 30861952 6101.0 ElderSource Partner Non-CE \n",
"7 30867042 4706.0 Givergy Academy Non-CE \n",
"8 30867043 3332.0 Access University CE Non-ICP \n",
"9 30867046 5667.0 School of Rokt Non-CE \n",
"\n",
" customer_name use_case \n",
"0 The CORE Group Employees \n",
"1 Serge Employees \n",
"2 The Federal Liberal Agency of Canada Customers \n",
"3 The Federal Liberal Agency of Canada Customers \n",
"4 Eldersource Employees \n",
"5 Eldersource Employees \n",
"6 Eldersource Employees \n",
"7 Givergy Employees \n",
"8 Access E-Forms Customers \n",
"9 Rokt Pte Ltd Employees "
]
},
"execution_count": 897,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ids = ids.rename(\n",
" columns={\n",
" 'Customers Customer ID':'customer_id', \n",
" 'Customers Organization':'customer_name', \n",
" 'Mal Actuals School ID':'school_id', \n",
" 'Mal Actuals School Name':'school_name',\n",
" 'Chris Bookings ICP': 'icp_boolean',\n",
" 'Customers Use Case':'use_case',\n",
" },\n",
" )\n",
"ids.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 898,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>customer_id</th>\n",
" <th>school_id</th>\n",
" <th>school_name</th>\n",
" <th>icp_boolean</th>\n",
" <th>customer_name</th>\n",
" <th>use_case</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>555</th>\n",
" <td>47167414</td>\n",
" <td>7684.0</td>\n",
" <td>Walmart Suppliers Onboarding</td>\n",
" <td>Non-CE</td>\n",
" <td>Volt Systems</td>\n",
" <td>Gig</td>\n",
" </tr>\n",
" <tr>\n",
" <th>585</th>\n",
" <td>47167440</td>\n",
" <td>7056.0</td>\n",
" <td>Spark Driver Resources Hub (MIGRATED TO AZURE)</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>Walmart Inc.</td>\n",
" <td>Customers,Gig</td>\n",
" </tr>\n",
" <tr>\n",
" <th>586</th>\n",
" <td>47167440</td>\n",
" <td>7540.0</td>\n",
" <td>Walmart Sandbox (MIGRATED TO AZURE)</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>Walmart Inc.</td>\n",
" <td>Customers,Gig</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" customer_id school_id school_name \n",
"555 47167414 7684.0 Walmart Suppliers Onboarding \\\n",
"585 47167440 7056.0 Spark Driver Resources Hub (MIGRATED TO AZURE) \n",
"586 47167440 7540.0 Walmart Sandbox (MIGRATED TO AZURE) \n",
"\n",
" icp_boolean customer_name use_case \n",
"555 Non-CE Volt Systems Gig \n",
"585 CE Non-ICP Walmart Inc. Customers,Gig \n",
"586 CE Non-ICP Walmart Inc. Customers,Gig "
]
},
"execution_count": 898,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# A quick little check to make sure Walmart is still on the list. Feel free to switch out different Academy names to find if a customer's school exists\n",
"search_for = ['walmart', 'spark', 'luminate']\n",
"ids.loc[ids.school_name.str.contains('|'.join(search_for), case=False, na=False)]"
]
},
{
"cell_type": "code",
"execution_count": 899,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/5l/fmyj8l8n74v0m3zfncrycj7m0000gn/T/ipykernel_24478/1163457763.py:1: UserWarning: This pattern is interpreted as a regular expression, and has match groups. To actually get the groups, use str.extract.\n",
" ids.loc[ids.school_name.str.contains(\"(migrated to azure)\", case=False, na=False)]\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>customer_id</th>\n",
" <th>school_id</th>\n",
" <th>school_name</th>\n",
" <th>icp_boolean</th>\n",
" <th>customer_name</th>\n",
" <th>use_case</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>585</th>\n",
" <td>47167440</td>\n",
" <td>7056.0</td>\n",
" <td>Spark Driver Resources Hub (MIGRATED TO AZURE)</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>Walmart Inc.</td>\n",
" <td>Customers,Gig</td>\n",
" </tr>\n",
" <tr>\n",
" <th>586</th>\n",
" <td>47167440</td>\n",
" <td>7540.0</td>\n",
" <td>Walmart Sandbox (MIGRATED TO AZURE)</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>Walmart Inc.</td>\n",
" <td>Customers,Gig</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" customer_id school_id school_name \n",
"585 47167440 7056.0 Spark Driver Resources Hub (MIGRATED TO AZURE) \\\n",
"586 47167440 7540.0 Walmart Sandbox (MIGRATED TO AZURE) \n",
"\n",
" icp_boolean customer_name use_case \n",
"585 CE Non-ICP Walmart Inc. Customers,Gig \n",
"586 CE Non-ICP Walmart Inc. Customers,Gig "
]
},
"execution_count": 899,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ids.loc[ids.school_name.str.contains(\"(migrated to azure)\", case=False, na=False)]"
]
},
{
"cell_type": "code",
"execution_count": 900,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>customer_id</th>\n",
" <th>school_id</th>\n",
" <th>school_name</th>\n",
" <th>icp_boolean</th>\n",
" <th>customer_name</th>\n",
" <th>use_case</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>555</th>\n",
" <td>47167414</td>\n",
" <td>7684.0</td>\n",
" <td>Walmart Suppliers Onboarding</td>\n",
" <td>Non-CE</td>\n",
" <td>Volt Systems</td>\n",
" <td>Gig</td>\n",
" </tr>\n",
" <tr>\n",
" <th>585</th>\n",
" <td>47167440</td>\n",
" <td>7056.0</td>\n",
" <td>Spark Driver Resources Hub</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>Walmart Inc.</td>\n",
" <td>Customers,Gig</td>\n",
" </tr>\n",
" <tr>\n",
" <th>586</th>\n",
" <td>47167440</td>\n",
" <td>7540.0</td>\n",
" <td>Walmart Sandbox</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>Walmart Inc.</td>\n",
" <td>Customers,Gig</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" customer_id school_id school_name icp_boolean \n",
"555 47167414 7684.0 Walmart Suppliers Onboarding Non-CE \\\n",
"585 47167440 7056.0 Spark Driver Resources Hub CE Non-ICP \n",
"586 47167440 7540.0 Walmart Sandbox CE Non-ICP \n",
"\n",
" customer_name use_case \n",
"555 Volt Systems Gig \n",
"585 Walmart Inc. Customers,Gig \n",
"586 Walmart Inc. Customers,Gig "
]
},
"execution_count": 900,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Back to Walmart. If they aren't there, you need to go into the CSV and remove \"(MIGRATED TO AZURE)\" from the values. Uncomment the next line to find and remove.\n",
"ids.school_name = ids.school_name.str.replace('(MIGRATED TO AZURE)', '')\n",
"search_for = ['walmart', 'spark', 'luminate']\n",
"ids.loc[ids.school_name.str.contains('|'.join(search_for), case=False, na=False)]"
]
},
{
"cell_type": "code",
"execution_count": 901,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>school_name</th>\n",
" <th>total_views</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>'@properties</td>\n",
" <td>322</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>4 Pillars</td>\n",
" <td>112</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>AIIM+</td>\n",
" <td>528</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>ASAPP</td>\n",
" <td>153</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Académie Évolupharma</td>\n",
" <td>253</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Access</td>\n",
" <td>11</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>ActiveLearner</td>\n",
" <td>1907</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Ad Intel</td>\n",
" <td>767</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>AdCellerant</td>\n",
" <td>5270</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Adkins</td>\n",
" <td>107</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" school_name total_views\n",
"0 '@properties 322\n",
"1 4 Pillars 112\n",
"2 AIIM+ 528\n",
"3 ASAPP 153\n",
"4 Académie Évolupharma 253\n",
"5 Access 11\n",
"6 ActiveLearner 1907\n",
"7 Ad Intel 767\n",
"8 AdCellerant 5270\n",
"9 Adkins 107"
]
},
"execution_count": 901,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%store -r pages\n",
"pages = pages.drop(['level_0', 'index'], axis=1).rename(columns={\n",
" 'School Name':'school_name',\n",
" 'Twotal':'total_views'})\n",
"pages.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 902,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>school_name</th>\n",
" <th>total_views</th>\n",
" <th>customer_id</th>\n",
" <th>school_id</th>\n",
" <th>icp_boolean</th>\n",
" <th>customer_name</th>\n",
" <th>use_case</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>AIIM+</td>\n",
" <td>528</td>\n",
" <td>46757198</td>\n",
" <td>7079.0</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>AIIM</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Académie Évolupharma</td>\n",
" <td>253</td>\n",
" <td>47167390</td>\n",
" <td>7326.0</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>Évolupharma, Inc.</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>ActiveLearner</td>\n",
" <td>1907</td>\n",
" <td>30867718</td>\n",
" <td>5301.0</td>\n",
" <td>Non-CE</td>\n",
" <td>BrandActive International Inc.</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Akua Mind Body</td>\n",
" <td>578</td>\n",
" <td>37441607</td>\n",
" <td>6718.0</td>\n",
" <td>Non-CE</td>\n",
" <td>Akua Mind &amp; Body</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Altima Dental</td>\n",
" <td>33</td>\n",
" <td>30867707</td>\n",
" <td>5670.0</td>\n",
" <td>Non-CE</td>\n",
" <td>Altima Dental Canada</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>American Concrete Pipe Association Learning Ce...</td>\n",
" <td>2864</td>\n",
" <td>47167457</td>\n",
" <td>7582.0</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>American Concrete Pipe Association</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Andhealth Internal Training</td>\n",
" <td>17</td>\n",
" <td>47167421</td>\n",
" <td>7912.0</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>AndHealth</td>\n",
" <td>Customers,Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Anthology Internal</td>\n",
" <td>104</td>\n",
" <td>47167502</td>\n",
" <td>7871.0</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>Blackboard Inc.</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Anthology Trial</td>\n",
" <td>418</td>\n",
" <td>47167502</td>\n",
" <td>7874.0</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>Blackboard Inc.</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Ascend Training by Stenograph</td>\n",
" <td>9</td>\n",
" <td>30988476</td>\n",
" <td>7692.0</td>\n",
" <td>CE ICP</td>\n",
" <td>MarketScale</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" school_name total_views \n",
"0 AIIM+ 528 \\\n",
"1 Académie Évolupharma 253 \n",
"2 ActiveLearner 1907 \n",
"3 Akua Mind Body 578 \n",
"4 Altima Dental 33 \n",
"5 American Concrete Pipe Association Learning Ce... 2864 \n",
"6 Andhealth Internal Training 17 \n",
"7 Anthology Internal 104 \n",
"8 Anthology Trial 418 \n",
"9 Ascend Training by Stenograph 9 \n",
"\n",
" customer_id school_id icp_boolean customer_name \n",
"0 46757198 7079.0 CE Non-ICP AIIM \\\n",
"1 47167390 7326.0 CE Non-ICP Évolupharma, Inc. \n",
"2 30867718 5301.0 Non-CE BrandActive International Inc. \n",
"3 37441607 6718.0 Non-CE Akua Mind & Body \n",
"4 30867707 5670.0 Non-CE Altima Dental Canada \n",
"5 47167457 7582.0 CE Non-ICP American Concrete Pipe Association \n",
"6 47167421 7912.0 CE Non-ICP AndHealth \n",
"7 47167502 7871.0 CE Non-ICP Blackboard Inc. \n",
"8 47167502 7874.0 CE Non-ICP Blackboard Inc. \n",
"9 30988476 7692.0 CE ICP MarketScale \n",
"\n",
" use_case \n",
"0 Customers \n",
"1 Customers \n",
"2 Employees \n",
"3 Employees \n",
"4 Employees \n",
"5 Customers \n",
"6 Customers,Employees \n",
"7 Customers \n",
"8 Customers \n",
"9 Customers "
]
},
"execution_count": 902,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"newpd = pd.merge(pages, ids, on='school_name')\n",
"newpd.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 903,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"school_name object\n",
"total_views int64\n",
"customer_id int64\n",
"school_id int64\n",
"icp_boolean object\n",
"customer_name object\n",
"use_case object\n",
"dtype: object\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>school_name</th>\n",
" <th>total_views</th>\n",
" <th>customer_id</th>\n",
" <th>school_id</th>\n",
" <th>icp_boolean</th>\n",
" <th>customer_name</th>\n",
" <th>use_case</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>AIIM+</td>\n",
" <td>528</td>\n",
" <td>46757198</td>\n",
" <td>7079</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>AIIM</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Académie Évolupharma</td>\n",
" <td>253</td>\n",
" <td>47167390</td>\n",
" <td>7326</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>Évolupharma, Inc.</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>ActiveLearner</td>\n",
" <td>1907</td>\n",
" <td>30867718</td>\n",
" <td>5301</td>\n",
" <td>Non-CE</td>\n",
" <td>BrandActive International Inc.</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Akua Mind Body</td>\n",
" <td>578</td>\n",
" <td>37441607</td>\n",
" <td>6718</td>\n",
" <td>Non-CE</td>\n",
" <td>Akua Mind &amp; Body</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Altima Dental</td>\n",
" <td>33</td>\n",
" <td>30867707</td>\n",
" <td>5670</td>\n",
" <td>Non-CE</td>\n",
" <td>Altima Dental Canada</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>American Concrete Pipe Association Learning Ce...</td>\n",
" <td>2864</td>\n",
" <td>47167457</td>\n",
" <td>7582</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>American Concrete Pipe Association</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Andhealth Internal Training</td>\n",
" <td>17</td>\n",
" <td>47167421</td>\n",
" <td>7912</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>AndHealth</td>\n",
" <td>Customers,Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Anthology Internal</td>\n",
" <td>104</td>\n",
" <td>47167502</td>\n",
" <td>7871</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>Blackboard Inc.</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" school_name total_views \n",
"0 AIIM+ 528 \\\n",
"1 Académie Évolupharma 253 \n",
"2 ActiveLearner 1907 \n",
"3 Akua Mind Body 578 \n",
"4 Altima Dental 33 \n",
"5 American Concrete Pipe Association Learning Ce... 2864 \n",
"6 Andhealth Internal Training 17 \n",
"7 Anthology Internal 104 \n",
"\n",
" customer_id school_id icp_boolean customer_name \n",
"0 46757198 7079 CE Non-ICP AIIM \\\n",
"1 47167390 7326 CE Non-ICP Évolupharma, Inc. \n",
"2 30867718 5301 Non-CE BrandActive International Inc. \n",
"3 37441607 6718 Non-CE Akua Mind & Body \n",
"4 30867707 5670 Non-CE Altima Dental Canada \n",
"5 47167457 7582 CE Non-ICP American Concrete Pipe Association \n",
"6 47167421 7912 CE Non-ICP AndHealth \n",
"7 47167502 7871 CE Non-ICP Blackboard Inc. \n",
"\n",
" use_case \n",
"0 Customers \n",
"1 Customers \n",
"2 Employees \n",
"3 Employees \n",
"4 Employees \n",
"5 Customers \n",
"6 Customers,Employees \n",
"7 Customers "
]
},
"execution_count": 903,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"newpd['school_id'] =newpd['school_id'].astype(int)\n",
"print(newpd.dtypes)\n",
"newpd.head(8)"
]
},
{
"cell_type": "code",
"execution_count": 904,
"metadata": {},
"outputs": [],
"source": [
"arr = pd.read_csv(\"/Users/normrasmussen/Downloads/ARR_OrgID.csv\")\n",
"arr = arr.reset_index()"
]
},
{
"cell_type": "code",
"execution_count": 905,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>level_0</th>\n",
" <th>index</th>\n",
" <th>Unnamed: 0</th>\n",
" <th>customer_id</th>\n",
" <th>csm</th>\n",
" <th>product</th>\n",
" <th>arr</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>30867043</td>\n",
" <td>Courtney Donargo</td>\n",
" <td>premium</td>\n",
" <td>1872</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>47167499</td>\n",
" <td>Tracy McMahon</td>\n",
" <td>premium</td>\n",
" <td>20000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>47167366</td>\n",
" <td>Support</td>\n",
" <td>essentials</td>\n",
" <td>1500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>4</td>\n",
" <td>47167483</td>\n",
" <td>Nergis Tepeli</td>\n",
" <td>premium</td>\n",
" <td>14438</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>4</td>\n",
" <td>5</td>\n",
" <td>30867493</td>\n",
" <td>Support</td>\n",
" <td>premium</td>\n",
" <td>2160</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>5</td>\n",
" <td>5</td>\n",
" <td>6</td>\n",
" <td>47167458</td>\n",
" <td>Nergis Tepeli</td>\n",
" <td>premium</td>\n",
" <td>26000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>6</td>\n",
" <td>6</td>\n",
" <td>7</td>\n",
" <td>41684806</td>\n",
" <td>Tracy McMahon</td>\n",
" <td>enterprise</td>\n",
" <td>23000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>7</td>\n",
" <td>7</td>\n",
" <td>8</td>\n",
" <td>46757198</td>\n",
" <td>Norm Rasmussen</td>\n",
" <td>premium</td>\n",
" <td>22000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>8</td>\n",
" <td>8</td>\n",
" <td>9</td>\n",
" <td>37441607</td>\n",
" <td>Support</td>\n",
" <td>essentials</td>\n",
" <td>6000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" <td>10</td>\n",
" <td>30867644</td>\n",
" <td>Support</td>\n",
" <td>premium</td>\n",
" <td>3000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" level_0 index Unnamed: 0 customer_id csm product \n",
"0 0 0 1 30867043 Courtney Donargo premium \\\n",
"1 1 1 2 47167499 Tracy McMahon premium \n",
"2 2 2 3 47167366 Support essentials \n",
"3 3 3 4 47167483 Nergis Tepeli premium \n",
"4 4 4 5 30867493 Support premium \n",
"5 5 5 6 47167458 Nergis Tepeli premium \n",
"6 6 6 7 41684806 Tracy McMahon enterprise \n",
"7 7 7 8 46757198 Norm Rasmussen premium \n",
"8 8 8 9 37441607 Support essentials \n",
"9 9 9 10 30867644 Support premium \n",
"\n",
" arr \n",
"0 1872 \n",
"1 20000 \n",
"2 1500 \n",
"3 14438 \n",
"4 2160 \n",
"5 26000 \n",
"6 23000 \n",
"7 22000 \n",
"8 6000 \n",
"9 3000 "
]
},
"execution_count": 905,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"arr = arr.rename(\n",
" columns={\n",
" 'Customer ID':'customer_id', \n",
" 'CSM':'csm', \n",
" 'Active ARR':'arr', \n",
" 'Product':'product'\n",
" }).drop(\n",
" ['Account Executive', 'Mal Limit', 'Customer Since Date', \n",
" 'Last Contacted Date', 'Actual Mal', 'Current Mal',\n",
" 'Organization', 'Billing Interval'],\n",
" axis=1\n",
" ).reset_index()\n",
"arr['arr'] = arr['arr'].str.replace(',', '').astype(int)\n",
"arr.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 906,
"metadata": {},
"outputs": [],
"source": [
"newpd = pd.merge(newpd, arr, on='customer_id')\n"
]
},
{
"cell_type": "code",
"execution_count": 907,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>school_name</th>\n",
" <th>total_views</th>\n",
" <th>customer_id</th>\n",
" <th>school_id</th>\n",
" <th>icp_boolean</th>\n",
" <th>customer_name</th>\n",
" <th>use_case</th>\n",
" <th>csm</th>\n",
" <th>product</th>\n",
" <th>arr</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>AIIM+</td>\n",
" <td>528</td>\n",
" <td>46757198</td>\n",
" <td>7079</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>AIIM</td>\n",
" <td>Customers</td>\n",
" <td>Norm Rasmussen</td>\n",
" <td>premium</td>\n",
" <td>22000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Académie Évolupharma</td>\n",
" <td>253</td>\n",
" <td>47167390</td>\n",
" <td>7326</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>Évolupharma, Inc.</td>\n",
" <td>Customers</td>\n",
" <td>Tracy McMahon</td>\n",
" <td>premium</td>\n",
" <td>28000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>ActiveLearner</td>\n",
" <td>1907</td>\n",
" <td>30867718</td>\n",
" <td>5301</td>\n",
" <td>Non-CE</td>\n",
" <td>BrandActive International Inc.</td>\n",
" <td>Employees</td>\n",
" <td>Support</td>\n",
" <td>premium</td>\n",
" <td>6720</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Akua Mind Body</td>\n",
" <td>578</td>\n",
" <td>37441607</td>\n",
" <td>6718</td>\n",
" <td>Non-CE</td>\n",
" <td>Akua Mind &amp; Body</td>\n",
" <td>Employees</td>\n",
" <td>Support</td>\n",
" <td>essentials</td>\n",
" <td>6000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Altima Dental</td>\n",
" <td>33</td>\n",
" <td>30867707</td>\n",
" <td>5670</td>\n",
" <td>Non-CE</td>\n",
" <td>Altima Dental Canada</td>\n",
" <td>Employees</td>\n",
" <td>Support</td>\n",
" <td>premium</td>\n",
" <td>7474</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>American Concrete Pipe Association Learning Ce...</td>\n",
" <td>2864</td>\n",
" <td>47167457</td>\n",
" <td>7582</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>American Concrete Pipe Association</td>\n",
" <td>Customers</td>\n",
" <td>Nergis Tepeli</td>\n",
" <td>premium</td>\n",
" <td>20000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>Andhealth Internal Training</td>\n",
" <td>17</td>\n",
" <td>47167421</td>\n",
" <td>7912</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>AndHealth</td>\n",
" <td>Customers,Employees</td>\n",
" <td>Tracy McMahon</td>\n",
" <td>premium</td>\n",
" <td>31900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Anthology Internal</td>\n",
" <td>104</td>\n",
" <td>47167502</td>\n",
" <td>7871</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>Blackboard Inc.</td>\n",
" <td>Customers</td>\n",
" <td>Norm Rasmussen</td>\n",
" <td>enterprise</td>\n",
" <td>95000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Anthology Trial</td>\n",
" <td>418</td>\n",
" <td>47167502</td>\n",
" <td>7874</td>\n",
" <td>CE Non-ICP</td>\n",
" <td>Blackboard Inc.</td>\n",
" <td>Customers</td>\n",
" <td>Norm Rasmussen</td>\n",
" <td>enterprise</td>\n",
" <td>95000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Ascend Training by Stenograph</td>\n",
" <td>9</td>\n",
" <td>30988476</td>\n",
" <td>7692</td>\n",
" <td>CE ICP</td>\n",
" <td>MarketScale</td>\n",
" <td>Customers</td>\n",
" <td>Nergis Tepeli</td>\n",
" <td>enterprise</td>\n",
" <td>68000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" school_name total_views \n",
"0 AIIM+ 528 \\\n",
"1 Académie Évolupharma 253 \n",
"2 ActiveLearner 1907 \n",
"3 Akua Mind Body 578 \n",
"4 Altima Dental 33 \n",
"5 American Concrete Pipe Association Learning Ce... 2864 \n",
"6 Andhealth Internal Training 17 \n",
"7 Anthology Internal 104 \n",
"8 Anthology Trial 418 \n",
"9 Ascend Training by Stenograph 9 \n",
"\n",
" customer_id school_id icp_boolean customer_name \n",
"0 46757198 7079 CE Non-ICP AIIM \\\n",
"1 47167390 7326 CE Non-ICP Évolupharma, Inc. \n",
"2 30867718 5301 Non-CE BrandActive International Inc. \n",
"3 37441607 6718 Non-CE Akua Mind & Body \n",
"4 30867707 5670 Non-CE Altima Dental Canada \n",
"5 47167457 7582 CE Non-ICP American Concrete Pipe Association \n",
"6 47167421 7912 CE Non-ICP AndHealth \n",
"7 47167502 7871 CE Non-ICP Blackboard Inc. \n",
"8 47167502 7874 CE Non-ICP Blackboard Inc. \n",
"9 30988476 7692 CE ICP MarketScale \n",
"\n",
" use_case csm product arr \n",
"0 Customers Norm Rasmussen premium 22000 \n",
"1 Customers Tracy McMahon premium 28000 \n",
"2 Employees Support premium 6720 \n",
"3 Employees Support essentials 6000 \n",
"4 Employees Support premium 7474 \n",
"5 Customers Nergis Tepeli premium 20000 \n",
"6 Customers,Employees Tracy McMahon premium 31900 \n",
"7 Customers Norm Rasmussen enterprise 95000 \n",
"8 Customers Norm Rasmussen enterprise 95000 \n",
"9 Customers Nergis Tepeli enterprise 68000 "
]
},
"execution_count": 907,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"newpd = newpd.drop(['index', 'Unnamed: 0', 'level_0'], axis=1)\n",
"newpd.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 914,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>customer_id</th>\n",
" <th>total_views</th>\n",
" <th>arr</th>\n",
" <th>use_case</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>46757198</td>\n",
" <td>528</td>\n",
" <td>22000</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>47167390</td>\n",
" <td>253</td>\n",
" <td>28000</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>30867718</td>\n",
" <td>1907</td>\n",
" <td>6720</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>37441607</td>\n",
" <td>578</td>\n",
" <td>6000</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>30867707</td>\n",
" <td>33</td>\n",
" <td>7474</td>\n",
" <td>Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>47167457</td>\n",
" <td>2864</td>\n",
" <td>20000</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>47167421</td>\n",
" <td>17</td>\n",
" <td>31900</td>\n",
" <td>Customers,Employees</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>47167502</td>\n",
" <td>104</td>\n",
" <td>95000</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>47167502</td>\n",
" <td>418</td>\n",
" <td>95000</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>30988476</td>\n",
" <td>9</td>\n",
" <td>68000</td>\n",
" <td>Customers</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" customer_id total_views arr use_case\n",
"0 46757198 528 22000 Customers\n",
"1 47167390 253 28000 Customers\n",
"2 30867718 1907 6720 Employees\n",
"3 37441607 578 6000 Employees\n",
"4 30867707 33 7474 Employees\n",
"5 47167457 2864 20000 Customers\n",
"6 47167421 17 31900 Customers,Employees\n",
"7 47167502 104 95000 Customers\n",
"8 47167502 418 95000 Customers\n",
"9 30988476 9 68000 Customers"
]
},
"execution_count": 914,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"usecases_split = newpd[['customer_id', 'total_views', 'arr', 'use_case']].copy()\n",
"usecases_split.head(10)\n"
]
},
{
"cell_type": "code",
"execution_count": 917,
"metadata": {},
"outputs": [
{
"ename": "ValueError",
"evalue": "malformed node or string on line 1: <ast.Name object at 0x14eb37640>",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)",
"Cell \u001b[0;32mIn[917], line 4\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[39mfrom\u001b[39;00m \u001b[39mast\u001b[39;00m \u001b[39mimport\u001b[39;00m literal_eval\n\u001b[1;32m 2\u001b[0m \u001b[39m#usecases_split = usecases_split.use_case.str.split('|')\u001b[39;00m\n\u001b[1;32m 3\u001b[0m \u001b[39m# usecases_split = usecases_split.groupby('use_case').agg({'total_views':'sum','arr':'sum'})\u001b[39;00m\n\u001b[0;32m----> 4\u001b[0m usecases_split\u001b[39m.\u001b[39muse_case \u001b[39m=\u001b[39m usecases_split\u001b[39m.\u001b[39;49muse_case\u001b[39m.\u001b[39;49mapply(literal_eval)\n\u001b[1;32m 5\u001b[0m usecases_split\u001b[39m.\u001b[39muse_case\u001b[39m.\u001b[39mexplode(usecases_split\u001b[39m.\u001b[39massign(use_case\u001b[39m=\u001b[39musecases_split\u001b[39m.\u001b[39muse_case\u001b[39m.\u001b[39mstr\u001b[39m.\u001b[39msplit(\u001b[39m'\u001b[39m\u001b[39m,\u001b[39m\u001b[39m'\u001b[39m)), \u001b[39m'\u001b[39m\u001b[39muse_case\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[1;32m 6\u001b[0m usecases_split\u001b[39m.\u001b[39mhead(\u001b[39m25\u001b[39m)\n",
"File \u001b[0;32m~/.pyenv/versions/3.11.1/envs/jupyter/lib/python3.11/site-packages/pandas/core/series.py:4631\u001b[0m, in \u001b[0;36mSeries.apply\u001b[0;34m(self, func, convert_dtype, args, **kwargs)\u001b[0m\n\u001b[1;32m 4521\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mapply\u001b[39m(\n\u001b[1;32m 4522\u001b[0m \u001b[39mself\u001b[39m,\n\u001b[1;32m 4523\u001b[0m func: AggFuncType,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 4526\u001b[0m \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs,\n\u001b[1;32m 4527\u001b[0m ) \u001b[39m-\u001b[39m\u001b[39m>\u001b[39m DataFrame \u001b[39m|\u001b[39m Series:\n\u001b[1;32m 4528\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m 4529\u001b[0m \u001b[39m Invoke function on values of Series.\u001b[39;00m\n\u001b[1;32m 4530\u001b[0m \n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 4629\u001b[0m \u001b[39m dtype: float64\u001b[39;00m\n\u001b[1;32m 4630\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[0;32m-> 4631\u001b[0m \u001b[39mreturn\u001b[39;00m SeriesApply(\u001b[39mself\u001b[39;49m, func, convert_dtype, args, kwargs)\u001b[39m.\u001b[39;49mapply()\n",
"File \u001b[0;32m~/.pyenv/versions/3.11.1/envs/jupyter/lib/python3.11/site-packages/pandas/core/apply.py:1025\u001b[0m, in \u001b[0;36mSeriesApply.apply\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1022\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mapply_str()\n\u001b[1;32m 1024\u001b[0m \u001b[39m# self.f is Callable\u001b[39;00m\n\u001b[0;32m-> 1025\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mapply_standard()\n",
"File \u001b[0;32m~/.pyenv/versions/3.11.1/envs/jupyter/lib/python3.11/site-packages/pandas/core/apply.py:1076\u001b[0m, in \u001b[0;36mSeriesApply.apply_standard\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1074\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 1075\u001b[0m values \u001b[39m=\u001b[39m obj\u001b[39m.\u001b[39mastype(\u001b[39mobject\u001b[39m)\u001b[39m.\u001b[39m_values\n\u001b[0;32m-> 1076\u001b[0m mapped \u001b[39m=\u001b[39m lib\u001b[39m.\u001b[39;49mmap_infer(\n\u001b[1;32m 1077\u001b[0m values,\n\u001b[1;32m 1078\u001b[0m f,\n\u001b[1;32m 1079\u001b[0m convert\u001b[39m=\u001b[39;49m\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mconvert_dtype,\n\u001b[1;32m 1080\u001b[0m )\n\u001b[1;32m 1082\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mlen\u001b[39m(mapped) \u001b[39mand\u001b[39;00m \u001b[39misinstance\u001b[39m(mapped[\u001b[39m0\u001b[39m], ABCSeries):\n\u001b[1;32m 1083\u001b[0m \u001b[39m# GH#43986 Need to do list(mapped) in order to get treated as nested\u001b[39;00m\n\u001b[1;32m 1084\u001b[0m \u001b[39m# See also GH#25959 regarding EA support\u001b[39;00m\n\u001b[1;32m 1085\u001b[0m \u001b[39mreturn\u001b[39;00m obj\u001b[39m.\u001b[39m_constructor_expanddim(\u001b[39mlist\u001b[39m(mapped), index\u001b[39m=\u001b[39mobj\u001b[39m.\u001b[39mindex)\n",
"File \u001b[0;32m~/.pyenv/versions/3.11.1/envs/jupyter/lib/python3.11/site-packages/pandas/_libs/lib.pyx:2834\u001b[0m, in \u001b[0;36mpandas._libs.lib.map_infer\u001b[0;34m()\u001b[0m\n",
"File \u001b[0;32m~/.pyenv/versions/3.11.1/lib/python3.11/ast.py:110\u001b[0m, in \u001b[0;36mliteral_eval\u001b[0;34m(node_or_string)\u001b[0m\n\u001b[1;32m 108\u001b[0m \u001b[39mreturn\u001b[39;00m left \u001b[39m-\u001b[39m right\n\u001b[1;32m 109\u001b[0m \u001b[39mreturn\u001b[39;00m _convert_signed_num(node)\n\u001b[0;32m--> 110\u001b[0m \u001b[39mreturn\u001b[39;00m _convert(node_or_string)\n",
"File \u001b[0;32m~/.pyenv/versions/3.11.1/lib/python3.11/ast.py:109\u001b[0m, in \u001b[0;36mliteral_eval.<locals>._convert\u001b[0;34m(node)\u001b[0m\n\u001b[1;32m 107\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 108\u001b[0m \u001b[39mreturn\u001b[39;00m left \u001b[39m-\u001b[39m right\n\u001b[0;32m--> 109\u001b[0m \u001b[39mreturn\u001b[39;00m _convert_signed_num(node)\n",
"File \u001b[0;32m~/.pyenv/versions/3.11.1/lib/python3.11/ast.py:83\u001b[0m, in \u001b[0;36mliteral_eval.<locals>._convert_signed_num\u001b[0;34m(node)\u001b[0m\n\u001b[1;32m 81\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 82\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39m-\u001b[39m operand\n\u001b[0;32m---> 83\u001b[0m \u001b[39mreturn\u001b[39;00m _convert_num(node)\n",
"File \u001b[0;32m~/.pyenv/versions/3.11.1/lib/python3.11/ast.py:74\u001b[0m, in \u001b[0;36mliteral_eval.<locals>._convert_num\u001b[0;34m(node)\u001b[0m\n\u001b[1;32m 72\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_convert_num\u001b[39m(node):\n\u001b[1;32m 73\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39misinstance\u001b[39m(node, Constant) \u001b[39mor\u001b[39;00m \u001b[39mtype\u001b[39m(node\u001b[39m.\u001b[39mvalue) \u001b[39mnot\u001b[39;00m \u001b[39min\u001b[39;00m (\u001b[39mint\u001b[39m, \u001b[39mfloat\u001b[39m, \u001b[39mcomplex\u001b[39m):\n\u001b[0;32m---> 74\u001b[0m _raise_malformed_node(node)\n\u001b[1;32m 75\u001b[0m \u001b[39mreturn\u001b[39;00m node\u001b[39m.\u001b[39mvalue\n",
"File \u001b[0;32m~/.pyenv/versions/3.11.1/lib/python3.11/ast.py:71\u001b[0m, in \u001b[0;36mliteral_eval.<locals>._raise_malformed_node\u001b[0;34m(node)\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[39mif\u001b[39;00m lno \u001b[39m:=\u001b[39m \u001b[39mgetattr\u001b[39m(node, \u001b[39m'\u001b[39m\u001b[39mlineno\u001b[39m\u001b[39m'\u001b[39m, \u001b[39mNone\u001b[39;00m):\n\u001b[1;32m 70\u001b[0m msg \u001b[39m+\u001b[39m\u001b[39m=\u001b[39m \u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m on line \u001b[39m\u001b[39m{\u001b[39;00mlno\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m\n\u001b[0;32m---> 71\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(msg \u001b[39m+\u001b[39m \u001b[39mf\u001b[39m\u001b[39m'\u001b[39m\u001b[39m: \u001b[39m\u001b[39m{\u001b[39;00mnode\u001b[39m!r}\u001b[39;00m\u001b[39m'\u001b[39m)\n",
"\u001b[0;31mValueError\u001b[0m: malformed node or string on line 1: <ast.Name object at 0x14eb37640>"
]
}
],
"source": [
"from ast import literal_eval\n",
"#usecases_split = usecases_split.use_case.str.split('|')\n",
"# usecases_split = usecases_split.groupby('use_case').agg({'total_views':'sum','arr':'sum'})\n",
"usecases_split.use_case = usecases_split.use_case.apply(literal_eval)\n",
"usecases_split.use_case.explode(usecases_split.assign(use_case=usecases_split.use_case.str.split(',')), 'use_case')\n",
"usecases_split.head(25)"
]
},
{
"cell_type": "code",
"execution_count": 854,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>total_views</th>\n",
" <th>arr</th>\n",
" </tr>\n",
" <tr>\n",
" <th>icp_boolean</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>CE ICP</th>\n",
" <td>11139</td>\n",
" <td>1276680</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CE Non-ICP</th>\n",
" <td>52362</td>\n",
" <td>1258130</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Non-CE</th>\n",
" <td>48485</td>\n",
" <td>2407191</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" total_views arr\n",
"icp_boolean \n",
"CE ICP 11139 1276680\n",
"CE Non-ICP 52362 1258130\n",
"Non-CE 48485 2407191"
]
},
"execution_count": 854,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# icp_groups = pd.DataFrame(columns=['views_sum', 'arr_sum'])\n",
"# icp_groups = newpd.groupby('icp_boolean')['total_views', 'arr'].sum()\n",
"icp_groups = newpd.groupby('icp_boolean').agg({'total_views':'sum','arr':'sum'})\n",
"icp_groups.head(12)"
]
},
{
"cell_type": "code",
"execution_count": 891,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>total_views</th>\n",
" <th>arr</th>\n",
" <th>scaled_views_percent</th>\n",
" </tr>\n",
" <tr>\n",
" <th>customer_name</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>CHEK Institute</th>\n",
" <td>11138</td>\n",
" <td>20000</td>\n",
" <td>100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>UX Design Institute</th>\n",
" <td>7167</td>\n",
" <td>113580</td>\n",
" <td>64</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Anchor QEA, LLC</th>\n",
" <td>4853</td>\n",
" <td>10000</td>\n",
" <td>43</td>\n",
" </tr>\n",
" <tr>\n",
" <th>MOLITOR Formations</th>\n",
" <td>4009</td>\n",
" <td>9000</td>\n",
" <td>35</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Whitetail Properties Real Estate</th>\n",
" <td>3604</td>\n",
" <td>18000</td>\n",
" <td>32</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Luma Health, Inc.</th>\n",
" <td>3459</td>\n",
" <td>20000</td>\n",
" <td>31</td>\n",
" </tr>\n",
" <tr>\n",
" <th>SPS Commerce</th>\n",
" <td>3205</td>\n",
" <td>51000</td>\n",
" <td>28</td>\n",
" </tr>\n",
" <tr>\n",
" <th>American Concrete Pipe Association</th>\n",
" <td>2864</td>\n",
" <td>20000</td>\n",
" <td>25</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Hardskills Pte. Ltd</th>\n",
" <td>2780</td>\n",
" <td>24996</td>\n",
" <td>24</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Viva Online Services SA</th>\n",
" <td>2365</td>\n",
" <td>5837</td>\n",
" <td>21</td>\n",
" </tr>\n",
" <tr>\n",
" <th>English for Asia</th>\n",
" <td>2270</td>\n",
" <td>6060</td>\n",
" <td>20</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Magis Center</th>\n",
" <td>2136</td>\n",
" <td>20000</td>\n",
" <td>19</td>\n",
" </tr>\n",
" <tr>\n",
" <th>StatesServ/Hospicelink</th>\n",
" <td>2103</td>\n",
" <td>9075</td>\n",
" <td>18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Zenjob GmbH</th>\n",
" <td>2046</td>\n",
" <td>75000</td>\n",
" <td>18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>BrandActive International Inc.</th>\n",
" <td>1907</td>\n",
" <td>6720</td>\n",
" <td>17</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Herrmann</th>\n",
" <td>1681</td>\n",
" <td>12000</td>\n",
" <td>15</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Maven Clinic</th>\n",
" <td>1579</td>\n",
" <td>15225</td>\n",
" <td>14</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Scinapsis Analytics Inc. d.b.a. BenchSci</th>\n",
" <td>1659</td>\n",
" <td>5100</td>\n",
" <td>14</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Upland Software Inc.</th>\n",
" <td>1600</td>\n",
" <td>19552</td>\n",
" <td>14</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Canavan Byrne</th>\n",
" <td>1380</td>\n",
" <td>23000</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Cultural Care</th>\n",
" <td>1431</td>\n",
" <td>21600</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>LJ Hooker Corporation Pty Ltd</th>\n",
" <td>1378</td>\n",
" <td>206250</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Serge</th>\n",
" <td>1369</td>\n",
" <td>10860</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>The CORE Group</th>\n",
" <td>1419</td>\n",
" <td>20000</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Talkspace</th>\n",
" <td>1317</td>\n",
" <td>261384</td>\n",
" <td>11</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" total_views arr \n",
"customer_name \n",
"CHEK Institute 11138 20000 \\\n",
"UX Design Institute 7167 113580 \n",
"Anchor QEA, LLC 4853 10000 \n",
"MOLITOR Formations 4009 9000 \n",
"Whitetail Properties Real Estate 3604 18000 \n",
"Luma Health, Inc. 3459 20000 \n",
"SPS Commerce 3205 51000 \n",
"American Concrete Pipe Association 2864 20000 \n",
"Hardskills Pte. Ltd 2780 24996 \n",
"Viva Online Services SA 2365 5837 \n",
"English for Asia 2270 6060 \n",
"Magis Center 2136 20000 \n",
"StatesServ/Hospicelink 2103 9075 \n",
"Zenjob GmbH 2046 75000 \n",
"BrandActive International Inc. 1907 6720 \n",
"Herrmann 1681 12000 \n",
"Maven Clinic 1579 15225 \n",
"Scinapsis Analytics Inc. d.b.a. BenchSci 1659 5100 \n",
"Upland Software Inc. 1600 19552 \n",
"Canavan Byrne 1380 23000 \n",
"Cultural Care 1431 21600 \n",
"LJ Hooker Corporation Pty Ltd 1378 206250 \n",
"Serge 1369 10860 \n",
"The CORE Group 1419 20000 \n",
"Talkspace 1317 261384 \n",
"\n",
" scaled_views_percent \n",
"customer_name \n",
"CHEK Institute 100 \n",
"UX Design Institute 64 \n",
"Anchor QEA, LLC 43 \n",
"MOLITOR Formations 35 \n",
"Whitetail Properties Real Estate 32 \n",
"Luma Health, Inc. 31 \n",
"SPS Commerce 28 \n",
"American Concrete Pipe Association 25 \n",
"Hardskills Pte. Ltd 24 \n",
"Viva Online Services SA 21 \n",
"English for Asia 20 \n",
"Magis Center 19 \n",
"StatesServ/Hospicelink 18 \n",
"Zenjob GmbH 18 \n",
"BrandActive International Inc. 17 \n",
"Herrmann 15 \n",
"Maven Clinic 14 \n",
"Scinapsis Analytics Inc. d.b.a. BenchSci 14 \n",
"Upland Software Inc. 14 \n",
"Canavan Byrne 12 \n",
"Cultural Care 12 \n",
"LJ Hooker Corporation Pty Ltd 12 \n",
"Serge 12 \n",
"The CORE Group 12 \n",
"Talkspace 11 "
]
},
"execution_count": 891,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.preprocessing import MinMaxScaler\n",
"\n",
"cust_groups = newpd.groupby('customer_name').agg({'total_views':'sum','arr':'sum'})\n",
"\n",
"scaler = MinMaxScaler()\n",
"\n",
"cust_groups[[\"scaled_views\"]] = scaler.fit_transform(cust_groups[[\"total_views\"]])\n",
"cust_groups['scaled_views'] = cust_groups['scaled_views'].multiply(100).astype(int)\n",
"cust_groups['scaled_views_percent'] = cust_groups['scaled_views']\n",
"cust_groups = cust_groups.drop(['scaled_views'], axis=1)\n",
"\n",
"cust_groups.nlargest(25, 'scaled_views_percent')\n",
"#icp_groups.head(12)"
]
},
{
"cell_type": "code",
"execution_count": 861,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>total_views</th>\n",
" <th>arr</th>\n",
" </tr>\n",
" <tr>\n",
" <th>use_case</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Customers</th>\n",
" <td>62171</td>\n",
" <td>2360462</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Customers,Employees</th>\n",
" <td>1233</td>\n",
" <td>161484</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Customers,Gig</th>\n",
" <td>97</td>\n",
" <td>12864</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Employees</th>\n",
" <td>27020</td>\n",
" <td>690496</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Employees,Gig</th>\n",
" <td>3</td>\n",
" <td>7800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Employees,Partner Training</th>\n",
" <td>1579</td>\n",
" <td>15225</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Gig</th>\n",
" <td>10252</td>\n",
" <td>1027732</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Partner Training</th>\n",
" <td>2046</td>\n",
" <td>75000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Real Estate</th>\n",
" <td>7585</td>\n",
" <td>590938</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" total_views arr\n",
"use_case \n",
"Customers 62171 2360462\n",
"Customers,Employees 1233 161484\n",
"Customers,Gig 97 12864\n",
"Employees 27020 690496\n",
"Employees,Gig 3 7800\n",
"Employees,Partner Training 1579 15225\n",
"Gig 10252 1027732\n",
"Partner Training 2046 75000\n",
"Real Estate 7585 590938"
]
},
"execution_count": 861,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"usecase_groups = newpd.groupby('use_case').agg({'total_views':'sum','arr':'sum'})\n",
"usecase_groups.head(12)"
]
},
{
"cell_type": "code",
"execution_count": 862,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>total_views</th>\n",
" <th>arr</th>\n",
" </tr>\n",
" <tr>\n",
" <th>csm</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Support</th>\n",
" <td>34553</td>\n",
" <td>616466</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Tracy McMahon</th>\n",
" <td>25921</td>\n",
" <td>961379</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Nergis Tepeli</th>\n",
" <td>18085</td>\n",
" <td>1571381</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Courtney Donargo</th>\n",
" <td>17237</td>\n",
" <td>351893</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Norm Rasmussen</th>\n",
" <td>16190</td>\n",
" <td>1440882</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" total_views arr\n",
"csm \n",
"Support 34553 616466\n",
"Tracy McMahon 25921 961379\n",
"Nergis Tepeli 18085 1571381\n",
"Courtney Donargo 17237 351893\n",
"Norm Rasmussen 16190 1440882"
]
},
"execution_count": 862,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"csm_groups = newpd.groupby('csm').agg({'total_views':'sum','arr':'sum'})\n",
"csm_groups.nlargest(25, 'total_views')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# This is a just a test. It's ugly formatting. \n",
"\n",
"# newpd[['total_views']].style.format('{:.3f}', na_rep=\"\") \\\n",
"# .bar(align=2, vmin=0, vmax=2000, cmap='bwr', height=60,\n",
"# width=100, props=\"width:1520px, border-right: 1px solid green;\") \\\n",
"# .text_gradient(cmap=\"bwr\", vmin=0, vmax=2000)"
]
},
{
"cell_type": "code",
"execution_count": 824,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Stored 'newpd' (DataFrame)\n"
]
}
],
"source": [
"newpd.to_csv('/Users/normrasmussen/Downloads/total_views_with_acctdata.csv')\n",
"%store newpd"
]
},
{
"cell_type": "code",
"execution_count": 825,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/5l/fmyj8l8n74v0m3zfncrycj7m0000gn/T/ipykernel_24478/1696825021.py:5: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" plotpd['school_name']=plotpd['school_name'].astype('category').cat.codes\n",
"/var/folders/5l/fmyj8l8n74v0m3zfncrycj7m0000gn/T/ipykernel_24478/1696825021.py:6: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" plotpd['customer_name']=plotpd['customer_name'].astype('category').cat.codes\n",
"/var/folders/5l/fmyj8l8n74v0m3zfncrycj7m0000gn/T/ipykernel_24478/1696825021.py:7: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" plotpd['use_case']=plotpd['use_case'].astype('category').cat.codes\n",
"/var/folders/5l/fmyj8l8n74v0m3zfncrycj7m0000gn/T/ipykernel_24478/1696825021.py:8: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" plotpd['icp_boolean']=plotpd['icp_boolean'].astype('category').cat.codes\n",
"/var/folders/5l/fmyj8l8n74v0m3zfncrycj7m0000gn/T/ipykernel_24478/1696825021.py:9: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" plotpd['product']=plotpd['product'].astype('category').cat.codes\n"
]
},
{
"data": {
"text/plain": [
"<Figure size 1000x1000 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 480x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Create new dataframe with only some columns. \n",
"plotpd = newpd[['school_name', 'total_views', 'icp_boolean', 'customer_name', 'use_case', 'product', 'arr']]\n",
"\n",
"# First, we have to change strings to categorical data. So each column. \n",
"plotpd['school_name']=plotpd['school_name'].astype('category').cat.codes\n",
"plotpd['customer_name']=plotpd['customer_name'].astype('category').cat.codes\n",
"plotpd['use_case']=plotpd['use_case'].astype('category').cat.codes\n",
"plotpd['icp_boolean']=plotpd['icp_boolean'].astype('category').cat.codes\n",
"plotpd['product']=plotpd['product'].astype('category').cat.codes\n",
"corrs = plotpd.corr()\n",
"\n",
"fig = plt.figure(figsize=(10,10))\n",
"plt.matshow(corrs, cmap='RdBu')\n",
"plt.xticks(range(len(corrs.columns)), corrs.columns, rotation='vertical')\n",
"plt.yticks(range(len(corrs.columns)), corrs.columns)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 826,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>school_name</th>\n",
" <th>total_views</th>\n",
" <th>icp_boolean</th>\n",
" <th>customer_name</th>\n",
" <th>use_case</th>\n",
" <th>product</th>\n",
" <th>arr</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>528</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>22000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>253</td>\n",
" <td>1</td>\n",
" <td>132</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>28000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>1907</td>\n",
" <td>2</td>\n",
" <td>13</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>6720</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>578</td>\n",
" <td>2</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>6000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>33</td>\n",
" <td>2</td>\n",
" <td>3</td>\n",
" <td>3</td>\n",
" <td>2</td>\n",
" <td>7474</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>5</td>\n",
" <td>2864</td>\n",
" <td>1</td>\n",
" <td>4</td>\n",
" <td>0</td>\n",
" <td>2</td>\n",
" <td>20000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>6</td>\n",
" <td>17</td>\n",
" <td>1</td>\n",
" <td>6</td>\n",
" <td>1</td>\n",
" <td>2</td>\n",
" <td>31900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>7</td>\n",
" <td>104</td>\n",
" <td>1</td>\n",
" <td>9</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>95000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>8</td>\n",
" <td>418</td>\n",
" <td>1</td>\n",
" <td>9</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>95000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>9</td>\n",
" <td>9</td>\n",
" <td>0</td>\n",
" <td>66</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>68000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" school_name total_views icp_boolean customer_name use_case product \n",
"0 0 528 1 0 0 2 \\\n",
"1 1 253 1 132 0 2 \n",
"2 2 1907 2 13 3 2 \n",
"3 3 578 2 2 3 1 \n",
"4 4 33 2 3 3 2 \n",
"5 5 2864 1 4 0 2 \n",
"6 6 17 1 6 1 2 \n",
"7 7 104 1 9 0 0 \n",
"8 8 418 1 9 0 0 \n",
"9 9 9 0 66 0 0 \n",
"\n",
" arr \n",
"0 22000 \n",
"1 28000 \n",
"2 6720 \n",
"3 6000 \n",
"4 7474 \n",
"5 20000 \n",
"6 31900 \n",
"7 95000 \n",
"8 95000 \n",
"9 68000 "
]
},
"execution_count": 826,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"plotpd.head(10)"
]
},
{
"cell_type": "code",
"execution_count": 710,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>level_0</th>\n",
" <th>index</th>\n",
" <th>school_name</th>\n",
" <th>total_page_views</th>\n",
" <th>customer_name</th>\n",
" <th>school_id</th>\n",
" <th>Unnamed: 0</th>\n",
" <th>csm</th>\n",
" <th>product</th>\n",
" <th>arr</th>\n",
" </tr>\n",
" <tr>\n",
" <th>customer_id</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>47167440</th>\n",
" <td>405</td>\n",
" <td>405</td>\n",
" <td>Spark Driver Resources Hub</td>\n",
" <td>1093</td>\n",
" <td>Walmart Inc.</td>\n",
" <td>7056</td>\n",
" <td>326</td>\n",
" <td>Norm Rasmussen</td>\n",
" <td>enterprise</td>\n",
" <td>820435</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" level_0 index school_name total_page_views \n",
"customer_id \n",
"47167440 405 405 Spark Driver Resources Hub 1093 \\\n",
"\n",
" customer_name school_id Unnamed: 0 csm product \n",
"customer_id \n",
"47167440 Walmart Inc. 7056 326 Norm Rasmussen enterprise \\\n",
"\n",
" arr \n",
"customer_id \n",
"47167440 820435 "
]
},
"execution_count": 710,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"newpd.set_index('customer_id', inplace=True)\n",
"newpd.loc[newpd.customer_name == 'Walmart Inc.']"
]
},
{
"cell_type": "code",
"execution_count": 711,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>school_name</th>\n",
" <th>total_page_views</th>\n",
" <th>customer_name</th>\n",
" <th>school_id</th>\n",
" <th>Unnamed: 0</th>\n",
" <th>csm</th>\n",
" <th>product</th>\n",
" <th>arr</th>\n",
" </tr>\n",
" <tr>\n",
" <th>customer_id</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>46757198</th>\n",
" <td>AIIM+</td>\n",
" <td>528</td>\n",
" <td>AIIM</td>\n",
" <td>7079</td>\n",
" <td>8</td>\n",
" <td>Norm Rasmussen</td>\n",
" <td>premium</td>\n",
" <td>22000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47167390</th>\n",
" <td>Académie Évolupharma</td>\n",
" <td>253</td>\n",
" <td>Évolupharma, Inc.</td>\n",
" <td>7326</td>\n",
" <td>94</td>\n",
" <td>Tracy McMahon</td>\n",
" <td>premium</td>\n",
" <td>28000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30867718</th>\n",
" <td>ActiveLearner</td>\n",
" <td>1907</td>\n",
" <td>BrandActive International Inc.</td>\n",
" <td>5301</td>\n",
" <td>36</td>\n",
" <td>Support</td>\n",
" <td>premium</td>\n",
" <td>6720</td>\n",
" </tr>\n",
" <tr>\n",
" <th>37441607</th>\n",
" <td>Akua Mind Body</td>\n",
" <td>578</td>\n",
" <td>Akua Mind &amp; Body</td>\n",
" <td>6718</td>\n",
" <td>9</td>\n",
" <td>Support</td>\n",
" <td>essentials</td>\n",
" <td>6000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30867707</th>\n",
" <td>Altima Dental</td>\n",
" <td>33</td>\n",
" <td>Altima Dental Canada</td>\n",
" <td>5670</td>\n",
" <td>14</td>\n",
" <td>Support</td>\n",
" <td>premium</td>\n",
" <td>7474</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30867710</th>\n",
" <td>Missouri State Employees Retirement System</td>\n",
" <td>1</td>\n",
" <td>Missouri State Employees Retirement System</td>\n",
" <td>5444</td>\n",
" <td>184</td>\n",
" <td>Support</td>\n",
" <td>premium</td>\n",
" <td>5220</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30867711</th>\n",
" <td>My Meeting Courses</td>\n",
" <td>767</td>\n",
" <td>International Care Ltd.</td>\n",
" <td>5012</td>\n",
" <td>144</td>\n",
" <td>Support</td>\n",
" <td>premium</td>\n",
" <td>7200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30867711</th>\n",
" <td>MyAuPairCourses</td>\n",
" <td>103</td>\n",
" <td>International Care Ltd.</td>\n",
" <td>4638</td>\n",
" <td>144</td>\n",
" <td>Support</td>\n",
" <td>premium</td>\n",
" <td>7200</td>\n",
" </tr>\n",
" <tr>\n",
" <th>36347227</th>\n",
" <td>NEMO Safety Training</td>\n",
" <td>255</td>\n",
" <td>New England Mechanical Overlay (NEMO)</td>\n",
" <td>6577</td>\n",
" <td>194</td>\n",
" <td>Support</td>\n",
" <td>essentials</td>\n",
" <td>5000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>37790045</th>\n",
" <td>Nest U</td>\n",
" <td>434</td>\n",
" <td>At World Properties, LLC</td>\n",
" <td>6942</td>\n",
" <td>25</td>\n",
" <td>Tracy McMahon</td>\n",
" <td>enterprise</td>\n",
" <td>87500</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>100 rows × 8 columns</p>\n",
"</div>"
],
"text/plain": [
" school_name total_page_views \n",
"customer_id \n",
"46757198 AIIM+ 528 \\\n",
"47167390 Académie Évolupharma 253 \n",
"30867718 ActiveLearner 1907 \n",
"37441607 Akua Mind Body 578 \n",
"30867707 Altima Dental 33 \n",
"... ... ... \n",
"30867710 Missouri State Employees Retirement System 1 \n",
"30867711 My Meeting Courses 767 \n",
"30867711 MyAuPairCourses 103 \n",
"36347227 NEMO Safety Training 255 \n",
"37790045 Nest U 434 \n",
"\n",
" customer_name school_id \n",
"customer_id \n",
"46757198 AIIM 7079 \\\n",
"47167390 Évolupharma, Inc. 7326 \n",
"30867718 BrandActive International Inc. 5301 \n",
"37441607 Akua Mind & Body 6718 \n",
"30867707 Altima Dental Canada 5670 \n",
"... ... ... \n",
"30867710 Missouri State Employees Retirement System 5444 \n",
"30867711 International Care Ltd. 5012 \n",
"30867711 International Care Ltd. 4638 \n",
"36347227 New England Mechanical Overlay (NEMO) 6577 \n",
"37790045 At World Properties, LLC 6942 \n",
"\n",
" Unnamed: 0 csm product arr \n",
"customer_id \n",
"46757198 8 Norm Rasmussen premium 22000 \n",
"47167390 94 Tracy McMahon premium 28000 \n",
"30867718 36 Support premium 6720 \n",
"37441607 9 Support essentials 6000 \n",
"30867707 14 Support premium 7474 \n",
"... ... ... ... ... \n",
"30867710 184 Support premium 5220 \n",
"30867711 144 Support premium 7200 \n",
"30867711 144 Support premium 7200 \n",
"36347227 194 Support essentials 5000 \n",
"37790045 25 Tracy McMahon enterprise 87500 \n",
"\n",
"[100 rows x 8 columns]"
]
},
"execution_count": 711,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"newpd = newpd.drop(['level_0', 'index'], axis=1)\n",
"newpd.head(100)"
]
},
{
"cell_type": "code",
"execution_count": 712,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>school_name</th>\n",
" <th>total_page_views</th>\n",
" <th>customer_name</th>\n",
" <th>school_id</th>\n",
" <th>Unnamed: 0</th>\n",
" <th>csm</th>\n",
" <th>product</th>\n",
" <th>arr</th>\n",
" </tr>\n",
" <tr>\n",
" <th>customer_id</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>47167440</th>\n",
" <td>Spark Driver Resources Hub</td>\n",
" <td>1093</td>\n",
" <td>Walmart Inc.</td>\n",
" <td>7056</td>\n",
" <td>326</td>\n",
" <td>Norm Rasmussen</td>\n",
" <td>enterprise</td>\n",
" <td>820435</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30867645</th>\n",
" <td>Bolt</td>\n",
" <td>1177</td>\n",
" <td>Bolt Operations OÜ</td>\n",
" <td>5388</td>\n",
" <td>32</td>\n",
" <td>Norm Rasmussen</td>\n",
" <td>enterprise</td>\n",
" <td>240480</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47167369</th>\n",
" <td>Lighthouse by LJ Hooker Group</td>\n",
" <td>1378</td>\n",
" <td>LJ Hooker Corporation Pty Ltd</td>\n",
" <td>7066</td>\n",
" <td>164</td>\n",
" <td>Tracy McMahon</td>\n",
" <td>enterprise</td>\n",
" <td>206250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30867741</th>\n",
" <td>Skin Laundry</td>\n",
" <td>52</td>\n",
" <td>Soham, Inc. (Zenoti)</td>\n",
" <td>6510</td>\n",
" <td>274</td>\n",
" <td>Nergis Tepeli</td>\n",
" <td>enterprise</td>\n",
" <td>120000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30867741</th>\n",
" <td>ZENOTI</td>\n",
" <td>42</td>\n",
" <td>Soham, Inc. (Zenoti)</td>\n",
" <td>5689</td>\n",
" <td>274</td>\n",
" <td>Nergis Tepeli</td>\n",
" <td>enterprise</td>\n",
" <td>120000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30867741</th>\n",
" <td>ZU EWC</td>\n",
" <td>14</td>\n",
" <td>Soham, Inc. (Zenoti)</td>\n",
" <td>6167</td>\n",
" <td>274</td>\n",
" <td>Nergis Tepeli</td>\n",
" <td>enterprise</td>\n",
" <td>120000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30867741</th>\n",
" <td>ZU Sorbet</td>\n",
" <td>8</td>\n",
" <td>Soham, Inc. (Zenoti)</td>\n",
" <td>7654</td>\n",
" <td>274</td>\n",
" <td>Nergis Tepeli</td>\n",
" <td>enterprise</td>\n",
" <td>120000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47167502</th>\n",
" <td>Anthology Internal</td>\n",
" <td>104</td>\n",
" <td>Blackboard Inc.</td>\n",
" <td>7871</td>\n",
" <td>30</td>\n",
" <td>Norm Rasmussen</td>\n",
" <td>enterprise</td>\n",
" <td>95000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47167502</th>\n",
" <td>Anthology Trial</td>\n",
" <td>418</td>\n",
" <td>Blackboard Inc.</td>\n",
" <td>7874</td>\n",
" <td>30</td>\n",
" <td>Norm Rasmussen</td>\n",
" <td>enterprise</td>\n",
" <td>95000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30867653</th>\n",
" <td>Shipt Passport</td>\n",
" <td>1034</td>\n",
" <td>Shipt</td>\n",
" <td>4912</td>\n",
" <td>259</td>\n",
" <td>Nergis Tepeli</td>\n",
" <td>premium</td>\n",
" <td>88564</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" school_name total_page_views \n",
"customer_id \n",
"47167440 Spark Driver Resources Hub 1093 \\\n",
"30867645 Bolt 1177 \n",
"47167369 Lighthouse by LJ Hooker Group 1378 \n",
"30867741 Skin Laundry 52 \n",
"30867741 ZENOTI 42 \n",
"30867741 ZU EWC 14 \n",
"30867741 ZU Sorbet 8 \n",
"47167502 Anthology Internal 104 \n",
"47167502 Anthology Trial 418 \n",
"30867653 Shipt Passport 1034 \n",
"\n",
" customer_name school_id Unnamed: 0 \n",
"customer_id \n",
"47167440 Walmart Inc. 7056 326 \\\n",
"30867645 Bolt Operations OÜ 5388 32 \n",
"47167369 LJ Hooker Corporation Pty Ltd 7066 164 \n",
"30867741 Soham, Inc. (Zenoti) 6510 274 \n",
"30867741 Soham, Inc. (Zenoti) 5689 274 \n",
"30867741 Soham, Inc. (Zenoti) 6167 274 \n",
"30867741 Soham, Inc. (Zenoti) 7654 274 \n",
"47167502 Blackboard Inc. 7871 30 \n",
"47167502 Blackboard Inc. 7874 30 \n",
"30867653 Shipt 4912 259 \n",
"\n",
" csm product arr \n",
"customer_id \n",
"47167440 Norm Rasmussen enterprise 820435 \n",
"30867645 Norm Rasmussen enterprise 240480 \n",
"47167369 Tracy McMahon enterprise 206250 \n",
"30867741 Nergis Tepeli enterprise 120000 \n",
"30867741 Nergis Tepeli enterprise 120000 \n",
"30867741 Nergis Tepeli enterprise 120000 \n",
"30867741 Nergis Tepeli enterprise 120000 \n",
"47167502 Norm Rasmussen enterprise 95000 \n",
"47167502 Norm Rasmussen enterprise 95000 \n",
"30867653 Nergis Tepeli premium 88564 "
]
},
"execution_count": 712,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"newpd.nlargest(10, 'arr')"
]
},
{
"cell_type": "code",
"execution_count": 719,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>school_name</th>\n",
" <th>total_page_views</th>\n",
" <th>customer_name</th>\n",
" <th>school_id</th>\n",
" <th>Unnamed: 0</th>\n",
" <th>csm</th>\n",
" <th>product</th>\n",
" <th>arr</th>\n",
" <th>scaled_views</th>\n",
" </tr>\n",
" <tr>\n",
" <th>customer_id</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>47167356</th>\n",
" <td>CHEK Institute</td>\n",
" <td>11138</td>\n",
" <td>CHEK Institute</td>\n",
" <td>7112</td>\n",
" <td>51</td>\n",
" <td>Tracy McMahon</td>\n",
" <td>premium</td>\n",
" <td>20000</td>\n",
" <td>1.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>34511981</th>\n",
" <td>Compass</td>\n",
" <td>4853</td>\n",
" <td>Anchor QEA, LLC</td>\n",
" <td>6508</td>\n",
" <td>20</td>\n",
" <td>Support</td>\n",
" <td>premium</td>\n",
" <td>10000</td>\n",
" <td>0.435665</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47167413</th>\n",
" <td>MASSÉNA Formations</td>\n",
" <td>4009</td>\n",
" <td>MOLITOR Formations</td>\n",
" <td>7369</td>\n",
" <td>186</td>\n",
" <td>Support</td>\n",
" <td>premium</td>\n",
" <td>9000</td>\n",
" <td>0.359881</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47167511</th>\n",
" <td>Whitetail Properties Education Platform</td>\n",
" <td>3604</td>\n",
" <td>Whitetail Properties Real Estate</td>\n",
" <td>7952</td>\n",
" <td>330</td>\n",
" <td>Tracy McMahon</td>\n",
" <td>premium</td>\n",
" <td>18000</td>\n",
" <td>0.323516</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30867585</th>\n",
" <td>UX Design Institute</td>\n",
" <td>3583</td>\n",
" <td>UX Design Institute</td>\n",
" <td>5283</td>\n",
" <td>317</td>\n",
" <td>Nergis Tepeli</td>\n",
" <td>enterprise</td>\n",
" <td>37860</td>\n",
" <td>0.321631</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30867585</th>\n",
" <td>UX Design Institute</td>\n",
" <td>3583</td>\n",
" <td>UX Design Institute</td>\n",
" <td>7744</td>\n",
" <td>317</td>\n",
" <td>Nergis Tepeli</td>\n",
" <td>enterprise</td>\n",
" <td>37860</td>\n",
" <td>0.321631</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47167487</th>\n",
" <td>Luma U</td>\n",
" <td>3459</td>\n",
" <td>Luma Health, Inc.</td>\n",
" <td>7847</td>\n",
" <td>168</td>\n",
" <td>Tracy McMahon</td>\n",
" <td>premium</td>\n",
" <td>20000</td>\n",
" <td>0.310497</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30867654</th>\n",
" <td>Training Center</td>\n",
" <td>3205</td>\n",
" <td>SPS Commerce</td>\n",
" <td>3209</td>\n",
" <td>281</td>\n",
" <td>Norm Rasmussen</td>\n",
" <td>premium</td>\n",
" <td>51000</td>\n",
" <td>0.287690</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47167457</th>\n",
" <td>American Concrete Pipe Association Learning Ce...</td>\n",
" <td>2864</td>\n",
" <td>American Concrete Pipe Association</td>\n",
" <td>7582</td>\n",
" <td>15</td>\n",
" <td>Nergis Tepeli</td>\n",
" <td>premium</td>\n",
" <td>20000</td>\n",
" <td>0.257071</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30867576</th>\n",
" <td>Viva Wallet</td>\n",
" <td>2365</td>\n",
" <td>Viva Online Services SA</td>\n",
" <td>5549</td>\n",
" <td>322</td>\n",
" <td>Courtney Donargo</td>\n",
" <td>premium</td>\n",
" <td>5837</td>\n",
" <td>0.212265</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" school_name \n",
"customer_id \n",
"47167356 CHEK Institute \\\n",
"34511981 Compass \n",
"47167413 MASSÉNA Formations \n",
"47167511 Whitetail Properties Education Platform \n",
"30867585 UX Design Institute \n",
"30867585 UX Design Institute \n",
"47167487 Luma U \n",
"30867654 Training Center \n",
"47167457 American Concrete Pipe Association Learning Ce... \n",
"30867576 Viva Wallet \n",
"\n",
" total_page_views customer_name school_id \n",
"customer_id \n",
"47167356 11138 CHEK Institute 7112 \\\n",
"34511981 4853 Anchor QEA, LLC 6508 \n",
"47167413 4009 MOLITOR Formations 7369 \n",
"47167511 3604 Whitetail Properties Real Estate 7952 \n",
"30867585 3583 UX Design Institute 5283 \n",
"30867585 3583 UX Design Institute 7744 \n",
"47167487 3459 Luma Health, Inc. 7847 \n",
"30867654 3205 SPS Commerce 3209 \n",
"47167457 2864 American Concrete Pipe Association 7582 \n",
"30867576 2365 Viva Online Services SA 5549 \n",
"\n",
" Unnamed: 0 csm product arr scaled_views \n",
"customer_id \n",
"47167356 51 Tracy McMahon premium 20000 1.000000 \n",
"34511981 20 Support premium 10000 0.435665 \n",
"47167413 186 Support premium 9000 0.359881 \n",
"47167511 330 Tracy McMahon premium 18000 0.323516 \n",
"30867585 317 Nergis Tepeli enterprise 37860 0.321631 \n",
"30867585 317 Nergis Tepeli enterprise 37860 0.321631 \n",
"47167487 168 Tracy McMahon premium 20000 0.310497 \n",
"30867654 281 Norm Rasmussen premium 51000 0.287690 \n",
"47167457 15 Nergis Tepeli premium 20000 0.257071 \n",
"30867576 322 Courtney Donargo premium 5837 0.212265 "
]
},
"execution_count": 719,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.preprocessing import MinMaxScaler\n",
"scaler = MinMaxScaler()\n",
"newpd[[\"scaled_views\"]] = scaler.fit_transform(newpd[[\"total_page_views\"]])\n",
"\n",
"newpd.nlargest(10, 'scaled_views')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "jupyter",
"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.11.1"
},
"orig_nbformat": 4
},
"nbformat": 4,
"nbformat_minor": 2
}