Analytics Extensions Explained with Aidan Moore | Data Science in Tableau & more
Aidan's big realisation: because a Python script can return zero and do nothing, it can also do anything.
- Analytics extensions connect via Help > Settings and Performance > Manage Analytics Extension, pointing at a TabPy instance (here on localhost port 9004).
- Because a SCRIPT_REAL calculation can simply return zero and do effectively nothing in Python, you can insert almost any Python code in the middle to do anything you like.
- Beyond data science, you can use PyODBC to write back to SQL databases, SMTPlib to send emails, and the requests library to authenticate against and call APIs, all triggered from a Tableau dashboard button.
- Aidan staged near real-time Salesforce data by having Python delete and re-insert opportunity records into a SQL table on demand, sidestepping the 15-minute extract replication delay.
- Embedding automation into a click action avoids needing a separate write-to-database extension or extra interface element, keeping users inside the Tableau and Salesforce ecosystem.
- The Anaconda TabPy distribution ships with libraries like NLTK pre-installed, whereas a native GitHub install may require manually pulling in dependencies.
- Meeting Aidan and Salesforce data0:30
- Table extensions use cases1:55
- Connecting to the analytics extension3:24
- Sentiment analysis demo4:36
- Doing nothing means doing anything10:20
- Writing back to SQL with PyODBC11:48
- Sending emails and triggering UiPath14:18
- Salesforce pricing approval workflow18:28
- Near real-time Salesforce data23:55
- Scaling and where to run the work29:02
0:00Hey, it's Tim here. In today's video, we're
0:02going to be taking another look at
0:03analytics extensions. After reaching out to
0:05the community about table extensions, I
0:07realized that analytics extensions were
0:09just a huge gap in my understanding. So I'm
0:11learning a lot over the last few days. And
0:13I really wanted to share the conversations
0:15I'm having with other people on this
0:17channel. In this video, Aiden Moore is
0:19going to be walking through some use cases
0:20for analytics extensions. And he's actually
0:22going to walk us through his thinking
0:24process when he discovered a solution that
0:26allows him to do something pretty cool with
0:29Salesforce.
0:29As ever, let's get stuck in.
0:31So Aiden Moore, I'm head of analytics at a
0:34company called Informer. I work
0:36specifically in the business operations
0:38team. So looking at a lot of Salesforce
0:41data and marketing data, that kind of thing
0:44.
0:44Amazing, amazing. And with with Salesforce
0:47data, it's probably worth asking the
0:49question, has that has that gotten better
0:51since Salesforce acquisition of Tableau?
0:53Are you finding there's more synergies
0:55between the two? I always ask that question
0:58when everyone works with Salesforce.
0:59It's a good question. I don't want to be
1:04rude to Tableau Salesforce. I think there's
1:06, is it getting better? I think there's ways
1:12, and actually some of the stuff that I want
1:14to demo to you today, I think overcomes one
1:17of the big problems that I find with
1:20integrating Salesforce data into Tableau.
1:22Amazing. Amazing. Okay, excellent. Yeah. So
1:26yeah, I sort of let you just show me what
1:29you want to demo. For the people who do end
1:31up watching the video, what I'll do is I'll
1:34explain the difference between extensions
1:37and analytics extensions, dashboard
1:39extensions and analytic extensions.
1:41And then I'll also explain ahead of time
1:44how table extensions use analytics
1:46extensions, if that makes sense. So you don
1:49't have to sort of worry about that clarity.
1:51I'll do that in the video itself. So that's
1:54all good.
1:55Did you get some good use cases for the
1:57table?
1:57I did. Yeah, I did. I did. I did. I'll send
2:01I'll send them through to you as a link. I
2:04got some from Tableau actually reached out.
2:07Francois reached out directly. He had an
2:10internal sales rep, not sales rep, sorry,
2:13sales engineer, who had sort of non AI/ML
2:16examples of them using table extensions.
2:19What was really interesting about that is
2:21quite varied. There's about seven examples
2:23in there, a lot of them to do with API
2:25calls, actually, which is turned out to be
2:27quite a sort of hidden gem within the table
2:29extensions, because you can essentially use
2:32it to call in call in datasets.
2:35But broadly speaking, I think I'm still in
2:37the early sort of phase of my understanding
2:40of the capability. So and my impression is
2:43whatever you code is whatever the
2:45capability you put into the extension. So I
2:48'm sure there's going to be hundreds of
2:50different things that get built with this.
2:53And it's just understanding the realm, the
2:55high level realm that this opens up rather
2:57than trying to understand every single
2:59individual use case. Yeah.
3:01Okay.
3:04I'm actually demoing some of this stuff to
3:06the Pittsburgh Tableau user group next week
3:10.
3:10Nice. Amazing. Amazing.
3:12My very, very first Tableau.
3:14This is your dry run.
3:15It'd be super interesting to see if there
3:17are bits that you're kind of interested in.
3:21Yeah, absolutely. Definitely. Yeah.
3:24Used to my advantage. So I've got here a
3:26very, very basic example. I take it you don
3:28't need me to go through how to connect to
3:30the analytics extension, do you?
3:33Why not? Why not? Just explain for everyone
3:35's benefit. I know you can repeat these
3:36things 100 times. People don't always get
3:39it. So why not?
3:40So I assume that people already have a Tab
3:46Pi set up to connect to it.
3:47It is very straightforward. We're going to
3:51help settings and performance. We're going
3:54to manage our analytics extension.
3:57You see here that I'm using a local host on
4:00port 9004. I can test my connection.
4:03I love that it sits under the help menu.
4:10I never understood that. Help, I need an
4:16analytics extension.
4:17So we can test it and it should work. I don
4:21't know if it'll look quicker than that. I
4:22don't know if that's because I'm sharing my
4:23screen or something.
4:27There we go. I've done a fast thing.
4:29I'll just cut the gap. We'll blame Tablai.
4:33Yeah, good stuff. Okay, good. So super
4:36straightforward example of one of the
4:38classic use cases, I think, that
4:39came out as soon as Tab Pi was announced in
4:43vision 10.2, for those of us that can
4:45remember
4:46that far back, was sentiment analysis. So
4:49essentially what we have here is a very
4:53simple
4:54dashboard. I can type in a text string
4:57and it's now going off via Python to use
5:03the natural language toolkit to do a
5:08sentiment analysis
5:10of the statement that I've put in there. So
5:12we can see that this has a very positive
5:1493 percent score. If I make an adjustment
5:23that has a very negative score.
5:26Interestingly enough, it's only 91 percent
5:30negative or its
5:30love is 93 percent positive. So I think we
5:33can prove statistically that love is
5:35stronger than
5:35hate. I wonder what gets 100 percent minus
5:38100 percent. It's probably one word.
5:40Does make you wonder. I won't ask. Actually
5:44increasing the number of exclamation marks
5:46sometimes. So maybe. Yeah, right. But yeah,
5:51so that's the kind of thing. And then
5:52people came
5:53up with great ideas of looking at things
5:55like song title, song lyrics. So we could
6:00do that.
6:01So a little bit of Gloria Gaynor, 81
6:05percent. This is Nine Inch Nails. Although
6:09I think Johnny Cash
6:09did it better. Sad song, 77 percent, minus
6:1377 percent. So what's happening in the
6:16background is
6:19I just opened this. So here we have a
6:24script real table calculation. So what is
6:27happening is we're
6:28importing the natural language toolkit in
6:32Python. And we are passing to it a text
6:35string. The text
6:36string is underscore arg one, which is a
6:39positional argument. So that's coming from
6:41this first
6:42attributes here. Right. And then in Python
6:45terms, we're creating a list here for the
6:48scores.
6:49And then for each of the words in our text
6:52string, we're getting the polarity of it.
6:56Then we're comparing that and adding it to
6:58our list of scores and then returning the
7:00score
7:01back to the dashboard. So that is what's
7:03happening. Very nice. Very interesting.
7:06Really cool.
7:08It's also quite simple as well. I mean,
7:11whenever you hear Python analytics
7:13extensions,
7:15I think people immediately just see tons of
7:17code in their eyes. But actually for a very
7:20powerful set of features, it's quite an
7:23easy sort of follow along example.
7:26Yeah, yeah, absolutely. And anybody who,
7:29well, I don't claim to be a professional
7:30Python code at
7:31all. I think anybody who's middled with
7:34Python before will completely get this.
7:38Right, right. And just to sort of give some
7:42users some background context, I understand
7:45that that
7:46import ni, is that n-i-t-k? N-l-t-k,
7:49natural language toolkit. N-l-t-k, natural
7:51language
7:51toolkit. That's a library that sits inside
7:54of the Python. And have you added that to
7:57the
7:57TabPy setup or is that just coming natively
8:01built within TabPy? So it doesn't come
8:03natively with
8:04TabPy. It depends which way you install Tab
8:07Py. So there are, to my knowledge, three
8:10different
8:10ways of doing it. The most straightforward
8:13way, in my view, is to use the Anaconda
8:15distribution,
8:16because that comes with a whole bunch of
8:18libraries pre-installed. So in that
8:21scenario,
8:21I didn't have to go and install the natural
8:24language toolkit. If people were just using
8:28native Python and had downloaded TabPy from
8:31GitHub, then they may well have to go and
8:34pull
8:36some of these in. Cool, and then the rest
8:39of it is just from the documentation, I
8:42guess. You've just
8:43followed the guide for nltk and you fed it
8:45an argument and then it comes back with a
8:47score.
8:48That's it. For full disclosure, I think I
8:51found this online a couple of years ago,
8:53maybe. I don't
8:54know who to attribute it to, but yeah, this
8:58is something I got. But in 2019, I was very
9:02lucky
9:02that I went to the Tableau conference in
9:04Europe in Berlin and also to the Tableau
9:06conference in
9:06Vegas, which was really cool. But it was
9:09actually the Berlin one that for me turned
9:12out to be much
9:12more cool because I had a bit of downtime
9:15and I didn't know what to do. And there was
9:18this great
9:18big hoard of people that walked past me and
9:20went up some stairs. And so being a bit of
9:22a sheep,
9:23I followed this hoard of people and ended
9:25up in an absolutely fantastic presentation
9:28by Rachel Bose.
9:30It was called "From Hello World to Saving
9:32the World with Python."
9:34Nice. And at that point, I hadn't even
9:36thought about any of this.
9:38Okay. Well, Rachel's presentation was
9:40really, really cool and it had some stuff
9:42like this.
9:42And so I investigated it a little bit more.
9:44I can send you a YouTube video that she did
9:46.
9:46Yeah, yeah. I'll be sure to put a link to
9:48it in the video as well.
9:50What really excited me when I saw this... I
9:54can tell you the bits that excited me. It
9:57was...
10:16Another bit that really excited me was this
10:19bit. Because what I'm doing here in Python
10:24terms is
10:25I'm creating a list. I'm adding zero to
10:27that list and I'm returning zero.
10:29Okay. So I'm effectively doing nothing. But
10:33what that means is...
10:36And the bit that I want to demo to you
10:39today is that knowing that I can do nothing
10:42in Python
10:44almost means that I can do anything. So
10:46instead of just pulling in the natural
10:50language toolkit
10:51and doing sentiment analysis, instead of
10:55pulling in some SKlearn to do some
10:58statistical data
11:00science-y kind of stuff, I can do anything
11:02I want. So long as I can do it in Python.
11:05Right. How did you arrive at that? Sorry.
11:08How did you arrive at that sort of...
11:12I would never come to that conclusion.
11:13Because I can do nothing. I can do
11:15everything.
11:15How do you sort of arrive at that
11:17conclusion? It's a good question. Maybe it
11:21's some dyslexic
11:22thinking. Maybe it's that I had a lot of
11:24beer on the day-to-night out. I don't know
11:26what it was.
11:27Right. But I left with the distinct
11:29impression that if I could re-raise those
11:32bits and if I
11:33could then stick anything that I want to in
11:35the middle. Right. Right. So let me give
11:37you some
11:37examples of what you can stick in the
11:42middle. So that's my safe one. Let's take a
11:47look at this.
11:47So here I'm doing what we've just had a
11:51look at. I'm creating my list of scores. I
11:55'm then adding
11:56zero to that. But now instead of importing
11:58natural language toolkit, I'm also creating
12:01basically a true false thing. Because this
12:03is a table calculation, it will fire
12:05every time something is filtered or not. I
12:08only want this to fire when I choose to do
12:11it.
12:11Instead of pulling in one of the
12:14statistical libraries or something like
12:16that, I'm actually
12:17pulling in PyODBC. And PyODBC is what you
12:20can use to interact with databases. Oh,
12:24nice.
12:24So here I've got... I'm setting up a
12:27connection. I'm writing an insert statement
12:30. I'm adding to
12:31that insert statement the value of arg1,
12:34which you can see down here is my username
12:37in Tableau.
12:38Yeah. I'm also adding in arg2, which is
12:42just a piece of text, after the name of the
12:45dashboard.
12:45So if I go here, let me just maybe blur
12:50that out. Shouldn't be better preferred.
12:53Yeah.
12:54So if we have a look at that, we can see
13:03that I have an empty table.
13:04Excuse the column headings. But what I can
13:08do in my non-safe version, if I hit my SQL
13:13button,
13:18I now go to my SQL table. You'll see I now
13:23have a row of data.
13:24Oh, yeah.
13:26Corresponds to my username and the string
13:29of text that I have been there.
13:30So I'm able, by using the analytics
13:34extension, to do things that people would
13:37more commonly
13:38associate with things that are in the
13:41extension gallery.
13:42Right. I see.
13:43But I'm able to code that in-house using
13:46the functionality of Python.
13:48I see. I see. So what you've done here is
13:51you've just grabbed your username, I guess,
13:55and you've just inserted it with the name
13:57of the data source, right?
13:58Yes.
13:59Username functions there. Yeah, perfect.
14:00Yeah.
14:01Cool.
14:02That was the first thing that I tried to do
14:04.
14:04Okay.
14:06I then took it a step forward. I thought,
14:07well, could I...
14:08Okay. That's the safe one without any
14:14credentials in it.
14:17Let's do that.
14:18I then thought, could I pull in one of the
14:21other libraries?
14:23Could I pull in...
14:25Doesn't like me now because I haven't got
14:28any credentials.
14:30Could I write a slightly longer script?
14:36And this time I'm pulling in SMTP lib,
14:39which helps me to connect to libraries,
14:42to get stuck in an email.
14:45I'm able to create a method. I'm able to
14:48pass, have some variables that are passed
14:51to that method.
14:52And ultimately what this will do is it's
14:58going to send an email to the address that
15:00I give it,
15:00saying this stuff. I clicked the button a
15:04few seconds ago. And if I go to my email...
15:08Do I have an email?
15:14Okay. I have an email. So I was thinking
15:16about things, maybe some offline training
15:18material,
15:19perhaps having it as a repository for forms
15:21for the business operations teams use.
15:23Then I extended a little bit further. I'm
15:29hoping this journey is useful.
15:32It does lead to just lead somewhere.
15:37I can feel like you're building up little
15:40components.
15:43Yeah. So I have a fantastic automation tool
15:47that we use in the team called UiPath.
15:49There are lots of other tools there, Autom
15:51ation Anywhere, Blue Prism,
15:53Power Automate, MuleSoft, even if we want
15:56to stay within the Salesforce ecosystem.
16:00When this loads, we will see...
16:08Okay. So this is a queue in UiPath, which
16:24is basically just think of a
16:26queue as a list of things that need to be
16:29done.
16:30Need to be done. Yeah.
16:33So I'll turn the safe one. So at the moment
16:35, just to clarify, at the moment you can see
16:38that my
16:39queue is empty, has no new items in it.
16:41Yeah.
16:42Yeah. But perhaps predictably now I'm going
16:45to click my UiPath button.
16:47Then if I refresh this,
17:00you'll see I now have a new item. Yeah.
17:03Nice.
17:03So I've been able to take some information
17:06from Tableau.
17:09And this time in between my scores, I'm now
17:15using the request library, JSON.
17:17I'm running methods to authenticate against
17:22the API.
17:23And I'm then taking some bits of
17:26information. In this case, I've hard coded
17:30it.
17:30I'm able to take these bits of information.
17:33And if I have a look at my new item here in
17:35this queue,
17:36you will see that it matches. So I've had
17:40some information in Tableau.
17:43I've been able to click a button in Tableau
17:45, which is an intuitive part of the
17:47dashboard itself.
17:48Yeah. If you look out of place on the
17:50dashboard, I've been able to ping that
17:51information into
17:52awaiting API. As part of doing that, I've
17:55also been interacting with APIs and that I
17:58've had to
17:59go off and get an authentication credential
18:02in order to do that. So I'm within the
18:04Python
18:05environment and I'm managing the process
18:07for exactly how that authentication goes on
18:11.
18:11Yeah. So hopefully that was good background
18:16for what I'm about to show you now.
18:27So if I go... I thought I had it open.
18:31Okay. That's Salesforce.
18:49I'm now in Salesforce. Yeah.
18:53And this is an opportunity record and this
18:55opportunity record has some products on it.
18:59There used to be a process to do pricing
19:05approvals for our Salesforce records,
19:10but it was very manual, very clunky, took
19:12ages, wasn't particularly reliable and
19:15generally caused
19:16a whole lot of headaches. They looked at
19:19getting CPQ, but due to some restructuring
19:22in the business
19:23wasn't the right time to really explore. So
19:26the question came to me.
19:29Sorry. For everyone's benefit, what's CPQ?
19:32So customer price quote or customer price
19:35quote. It's a tool to do pricing approvals,
19:39but it also does it from additional bits.
19:41But the pricing approvals was the really
19:44key part
19:45for my business. So the question came, was
19:48there anything that we could do to improve
19:51this
19:52entirely manual process that they had?
19:54Right.
19:55And I thought, well, knowing what I now
19:58know about the fact that I can click a
20:00button somewhere and
20:01it can interact with an API, or I can click
20:03a button somewhere and interact with SQL.
20:07I thought, yeah, I imagine there's some
20:09stuff that we can do. I already had an if
20:12rame. And so
20:14we do a lot of reporting as an opportunity
20:18level via my Tableau iframe in Salesforce.
20:23So we're looking at this now. And here we
20:27have something for pricing approvals.
20:30What I'm going to do is I'm going to submit
20:33for pricing approval.
20:35Now what this is doing, this is using
20:46replicated data of Salesforce. It's a Table
20:50au dashboard.
20:51It's pulling in some bits of information
20:53and what the currency is, what the
20:55opportunity number is,
20:56the products, how many seats, some fake
20:59list prices, what the sales prices are that
21:03is on
21:03the opportunity record. And then Tableau is
21:05doing a calculation of what sort of
21:08discount
21:08percentage that is. Because of the size of
21:11the discount percentage, who needs to
21:13authorize
21:13this opportunity? And then down at the
21:16bottom, there's a submit button.
21:21And this submit button is doing exactly
21:22what I've just demonstrated. It's firing
21:24something
21:25out into UiPath. And when it does that, you
21:27don't have to use UiPath. You could just
21:29have
21:30a back script, SQL table, or any other
21:33automation tool. But that will then result
21:36in a bunch of
21:37emails coming out to say this opportunity
21:39needs approval. People then click on the
21:42button,
21:42and then that button will turn into another
21:47Tableau dashboard where they can go and
21:50click
21:50a button that says either approve or deny.
21:53So again, it's using all this functionality
21:55of
21:55being able to interact with APIs via click
21:58buttons in a Tableau dashboard.
22:00But there is-- having shown you how great
22:05this is, and it is a great process,
22:07I'm now going to tell you why it's a bit of
22:09a pain. Because if I go back to--
22:11If I go back to here, we can see that I've
22:14got some sales prices here. And I've got
22:18some sales
22:18prices. And those sales prices, as I
22:20mentioned, are being pulled by replicated
22:23data.
22:24Right. Yeah. But the replication, it
22:28happens, let's say, every 15 minutes or so.
22:32So if I'm
22:32a veteran, I'm talking to a customer. And I
22:36want to get the deal through as quickly as
22:38possible.
22:39So let's say I'm going to come in here, and
22:41you and I are talking about this particular
22:44product.
22:51And we're going to say-- I like you, Tim.
22:54So I'm going to give you this for 20,000.
22:56It's a special deal just for you. 20% off.
23:00Wow.
23:00So I'm going to give you that. So we've
23:05agreed that. And now I want to push it
23:07straight through
23:08for approval. Yeah.
23:10I go into my analytics. And I select my
23:15pricing approval.
23:20I'm going to submit it for pricing, please.
23:22Nice.
23:23But you'll notice that the 20,000 that we
23:36just agreed--
23:38It's not on there. Yeah. Yeah. Now, that's
23:41a bit of a pain,
23:41right? Because I'm an ambitious rep. And I
23:43want this to go through--
23:44You want it now. --pricing approval.
23:46Yeah. But so I guess the question is, how
23:50do we get around that process?
23:54Yeah. So let me show you how we get around
23:59that process. And this is where I think
24:00there's a lot of opportunity for the table
24:02extensions.
24:03What we're going to do now is-- we've
24:11talked a bit more. I'm going to edit the
24:14products.
24:15We've talked a bit more. And actually,
24:18maybe I don't like you so much anymore. So
24:20now I'm
24:20going to charge you 40,000 pounds. Oh, no.
24:23Inflation. You've just cost yourself 20,000
24:27.
24:27I'm going to save that. So I'm showing us
24:3840,000 here.
24:41I'm going to the Analytics tab now. But
24:48instead of hitting on my pricing approval,
24:49I'm going to hit my super secret button
24:51down here.
24:51Is that just the white box that any unit
24:55exists? Yes. That's it.
24:57Love it. And I'm going to submit my pricing
24:59approval this way.
25:00Right.
25:09Now, let's see. It's instantly--
25:17Yeah. Yeah.
25:21Yeah. So how did I do that? Because if you
25:24're connecting Tableau to Salesforce,
25:28you can only replicate every 15 minutes on
25:30an extract. You know that my replicated
25:33data
25:33in SQL takes between 15 minutes and
25:34sometimes a couple of hours. So how have we
25:37done that?
25:38Yeah. You have to pull it in somehow, right
25:41? Yeah. Exactly. The way that I have done it
25:45,
25:45and up until the recent announcement about
25:48Snowflake and Tableau having
25:50basically live replication, I believe I was
25:53the only person in the world who had pretty
25:57much real
25:57time access to Salesforce data. Amazing.
26:04And if I can find my safe one, I'll show
26:08you what I'm doing.
26:10It opens.
26:16Yeah. You'd hope that in the future, Table
26:23au just figure this out. So you're always
26:26seeing
26:26the latest version of the truth, right?
26:28Yeah. You'd expect so. But in the
26:32meantime, what I'm doing-- so similar to
26:35what I was doing with the UI path and
26:38pulling the request.
26:38I'm also pulling in PyODBC. So I'm creating
26:42a method to enable me to interact with SQL
26:45Server.
26:46I'm deleting anything from a particular
26:48table, which has the ID of the opportunity
26:52that I'm in.
26:53I'm then connecting to the API from Sales
26:56force. I'm asking Salesforce to give me
26:59everything
27:02for the opportunity, the opportunity to
27:04line items, the price, et cetera,
27:06and then using Python to insert that into a
27:09SQL table. And then when I do the hop from
27:12that
27:12button to make a pricing approval, that's
27:18then moving onto a dashboard, which is
27:20making a live
27:21query to this particular table. And in
27:24doing so, I'm able to have a live-- I say
27:29live in inverted
27:31commas connection to the Salesforce data. I
27:35see. So you're creating almost like a--
27:41you're staging the real-time data. Exactly.
27:44And then over time, it will eventually
27:46replicate. It would just turn up for this
27:49use case, right?
27:49Exactly that. Amazing.
27:51So by using the analytics extension, I'm
27:53able to, first of all, create the
27:57functionality within
27:58Tableau to enable me to do things like
28:00pricing approval. And the benefit of that
28:03is it's keeping
28:03people within the Tableau and Salesforce
28:05ecosystem. We're not sending them off to do
28:07some manual
28:08process. It's really fairly straightforward
28:10to set up. It's self-coded in Python, which
28:13is
28:13widely available within the data analysis
28:16community. And then I'm able to do funky
28:20stuff like interact with APIs, pulling in
28:21data, putting that data somewhere, staging
28:23it, as you've
28:24said, and using it in tools like this. That
28:28's really impressive. I had no idea that--
28:33in my head, I think I had this very narrow
28:35perspective that analytics extensions were
28:37only used for, I guess, data science-like
28:41analytic capabilities.
28:44Yeah. You were using the middle of the
28:46scores. Yeah. As you say, because you can
28:48do nothing,
28:49you can do everything, right? Yeah. You're
28:52using that opportunity in there to bring
28:56other things in
28:57and also send things out, I assume, to make
28:59things work really nicely. That's really
29:02clean.
29:02Do you see that-- I guess in your
29:05particular instance, this is a fairly
29:08tactical deployment,
29:09right? So do you find it easy to scale?
29:13When you put this on Salesforce, and I
29:16guess you're
29:16setting this up, do people find it easy to
29:19use that sort of button and just know it
29:22works? And
29:22it works really well, right? Yeah,
29:24absolutely. Yeah. Absolutely. It's simply a
29:26one-click button.
29:28Everything else is being pulled in for them
29:31. Previously, they had to literally go
29:33somewhere
29:33else and type all these things out. Heck
29:36yeah. God, yeah. And it's an interesting
29:40one because
29:40in this use case, if I heard you sort of
29:42explain the use case at the start, I would
29:44have said,
29:45surely that needs a write to database
29:47extension or something like that, right?
29:49Because at that point,
29:52I mean, that's sort of just in my
29:53simplistic head, that's the most obvious
29:56way to do it.
29:56But you're kind of almost abstracting the
29:59need to have an element in the interface,
30:01and you're just building it into an action
30:03rather than having to create an interface
30:06for it,
30:06which is quite nice. Yeah, exactly that.
30:09Yeah. Good. It works brilliantly.
30:13Yeah. There were other things that I'd like
30:15to try with perhaps with the table
30:17extensions.
30:17Because you can interact with APIs, it's
30:21out there. You can do pretty much anything
30:24you like,
30:24right? But yeah, Twitter data live and
30:26doing sentiment analysis. So combining the
30:29non-traditional and the traditional use
30:31cases for the analytics extension, bringing
30:34those together
30:35would be awesome. I don't know. I think it
30:38's one of these features where I was talking
30:39to
30:40Charles Laporte from Bistry yesterday. And
30:44we were talking about sort of where does
30:47analytics
30:48extensions and table extensions really sit
30:51within the day-to-day analytical flow? It
30:54doesn't feel
30:54something that's mainstream across, let's
30:56say, all the creators who have access to
30:58that license.
30:59But it maybe is more of what I call explor
31:02atory analysis sort of tool initially for
31:06someone who's
31:07just investigating data. And then when you
31:09come to productionizing it, you kind of
31:11have to do a
31:11little bit of the work you've done to
31:13simplify it into a button to kind of really
31:15package it up
31:16nicely and then move it on. Or you could
31:18move that work further back. But in your
31:20case, that's not
31:21possible because of the setup with Sales
31:23force. But you could potentially move some
31:24of that further
31:25back into the stack and have it come
31:27through in the day source natively. Yeah.
31:29Yeah. Yeah. I agree.
31:31And you mentioned Snowflake as well. And I
31:34was going to ask you, have you done any
31:36work with
31:37Snowpop, which is their sort of take on
31:39running Python on Snowflake, if that makes
31:42sense?
31:42Not yet. We are currently an AWS house. But
31:47we are.
31:47Oh, right. Right.
31:48I've just started testing Snowflake.
31:50Snowflake. Nice. Of course. It's funny
31:52because Snowflake run on AWS as well, right
31:55? So
31:57they're also an AWS house, if anything. But
32:01the thing I'm trying to sort of see if
32:05anyone has any
32:06understanding of is where is the best place
32:09to be doing this kind of data science work?
32:13Is it
32:13alongside the database as Snowflake is
32:16suggesting with the data? Or is it sort of
32:20bringing it closer
32:20to the people who actually know how to
32:22write these tools? Or is it actually a
32:24mixture of both? You do
32:25it locally with Tab High, then you move it
32:28further back into something like Snowpark
32:30or AWS Lambda.
32:31Yeah, potentially. And with the stuff that
32:35I've demoed, although I've been showing the
32:37table calculations with the actual Python
32:40scripts in, I could deploy those as models
32:42to my
32:43Tab High server. For example, not entirely
32:45the same as what you're talking about, but
32:48you don't
32:48have to have great big long Python scripts
32:50within your table calculations. You can
32:52have the script
32:53saved up to your Tab High server and then
32:55call them. Right. And so if you call them
32:57as modules,
32:57they're almost working like functions in a
32:59piece of code, right? Yeah. So you just
33:01pass the
33:01attributes to it that it needs. Yeah.
33:04Amazing. But it's not so fun to demonstrate
33:06if it's just
33:06like one line of attributes. Yeah, that's
33:10the thing. People always want to know what
33:12's under
33:12their head. What's in the black box? That's
33:14always the ephemeral question, right? Yeah.
33:17Good. Well,
33:18thanks so much for that. That's been really
33:21fantastic. What I'll do is I'll edit this
33:24up.
33:24Do you want me to send it to you ahead of
33:26time so you can just watch it, make sure
33:27that
33:28everything's good? I'll do a good job of
33:30going through and sort of cleansing
33:31anything that
33:32shouldn't be in public. If you can make me
33:34look handsome though, if you've got some
33:35filters or
33:36something. Yeah. Oh, God.
33:40[silence]
33:46[ Silence ]
In this discussion with Aidan Moore, I continue my journey trying to understand the art of the possible with analytics extensions, and Aidan walks me through progressively interesting solutions that come together to make something really simple for an end user but powerful for the Salesforce Platform.
Tableau release notes Beginning with version 2021.2, you can create multiple analytics extension connections for any site. Versions prior to 2021.2 are limited to a single analytics extension for any site.
After you create a connection to an analytic extension, you can communicate with your external service through calculated fields. Each calculated field uses the SCRIPT functions for expressions, operating as a table calculation.
Join this channel to get access to the perks: https://www.youtube.com/channel/UC7HYxRWmaNlJux-X7rNLZyw/join
#tableau #salesforce #analytics #data
Timestamps 0:00 Intro 0:30 Introductions from Aidan Moore 3:03 Setting up an Analytics Extension in Tableau 4:31 Sentiment Analysis with analytics extensions from Tableau 11:21 The moment that created an Idea 11:47 Send SQL commands with Analytic Extensions 14:09 Sending an email with Analytic Extensions 15:29 Triggering an Automation with an Analytic Extension 18:20 A Business Challenge presents itself 23:57 The Solution using an Analytic Extension 29:11 Other use cases