WEBVTT

00:00:00.001 --> 00:00:05.460
Join me as I chat with Rich Annone and Michael Chow from Posit, where we explore the transformative

00:00:05.460 --> 00:00:08.540
power of data tables with the Great Tables Library.

00:00:08.540 --> 00:00:13.960
We'll cover practical applications of great tables, showcasing how thoughtful design and

00:00:13.960 --> 00:00:16.720
advanced formatting can elevate your data presentations.

00:00:16.720 --> 00:00:21.380
And you'll learn about innovative features like nanoplots and interactive elements, as

00:00:21.380 --> 00:00:26.300
well as the importance of structure, format, and style in crafting tables that inspire.

00:00:26.820 --> 00:00:30.100
Whether you're a seasoned data scientist or just starting out, this episode is packed

00:00:30.100 --> 00:00:34.340
with valuable tips and inspiring examples to enhance your data storytelling.

00:00:34.340 --> 00:00:38.280
This is Talk Python To Me, recorded December 19th, 2024.

00:00:38.280 --> 00:00:41.020
Are you ready for your host, David?

00:00:41.020 --> 00:00:44.740
You're listening to Michael Kennedy on Talk Python To Me.

00:00:44.740 --> 00:00:48.400
Live from Portland, Oregon, and this segment was made with Python.

00:00:48.400 --> 00:00:54.500
Welcome to Talk Python To Me, a weekly podcast on Python.

00:00:54.500 --> 00:00:56.740
This is your host, Michael Kennedy.

00:00:56.740 --> 00:01:01.960
Follow me on Mastodon, where I'm @mkennedy, and follow the podcast using @talkpython,

00:01:01.960 --> 00:01:05.060
both accounts over at fosstodon.org.

00:01:05.060 --> 00:01:09.960
And keep up with the show and listen to over nine years of episodes at talkpython.fm.

00:01:09.960 --> 00:01:14.460
If you want to be part of our live episodes, you can find the live streams over on YouTube.

00:01:14.460 --> 00:01:20.320
Subscribe to our YouTube channel over at talkpython.fm/youtube and get notified about upcoming

00:01:20.320 --> 00:01:20.820
shows.

00:01:20.820 --> 00:01:24.740
This episode is sponsored by Posit Connect from the makers of Shiny.

00:01:24.740 --> 00:01:29.240
Publish, share, and deploy all of your data projects that you're creating using Python.

00:01:29.240 --> 00:01:35.700
Streamlit, Dash, Shiny, Bokeh, FastAPI, Flask, Quattro, Reports, Dashboards, and APIs.

00:01:35.700 --> 00:01:38.100
Posit Connect supports all of them.

00:01:38.100 --> 00:01:42.460
Try Posit Connect for free by going to talkpython.fm/posit.

00:01:42.800 --> 00:01:43.780
P-O-S-I-T.

00:01:43.780 --> 00:01:48.180
And it's also brought to you by us over at Talk Python Training.

00:01:48.180 --> 00:01:52.800
Did you know that we have over 250 hours of Python courses?

00:01:52.800 --> 00:01:54.000
Yeah, that's right.

00:01:54.000 --> 00:01:56.560
Check them out at talkpython.fm/courses.

00:01:56.560 --> 00:01:58.060
Hey, everyone.

00:01:58.060 --> 00:02:00.320
Two quick announcements before we dive into great tables.

00:02:00.320 --> 00:02:01.980
First, thanks for all your patience.

00:02:01.980 --> 00:02:04.280
It's been a few weeks since my last episode release.

00:02:04.280 --> 00:02:08.460
What I thought was going to be a brief winter break, pause, turned out to be longer.

00:02:08.460 --> 00:02:11.940
I had to slow my work down recently to help my dad with some health issues.

00:02:12.120 --> 00:02:15.800
We're getting that sorted and things are back on track with regard to the episodes.

00:02:15.800 --> 00:02:18.300
I have six already recorded and in the queue.

00:02:18.300 --> 00:02:20.740
Now, for some awesome news.

00:02:20.740 --> 00:02:24.380
I have a new feature I know you're going to love for the podcast episodes.

00:02:24.380 --> 00:02:25.920
I named it Deep Dives.

00:02:25.920 --> 00:02:28.580
I sent an email out about this early January.

00:02:28.580 --> 00:02:30.460
And if you're not part of the newsletter, you should be.

00:02:30.460 --> 00:02:36.740
The idea is to add way more reference material and backstory information to each episode page

00:02:36.740 --> 00:02:41.780
so that when you come back, you can skim through the content, pulling out important quotes,

00:02:41.940 --> 00:02:43.860
important topics, and extra detail.

00:02:43.860 --> 00:02:48.820
For example, on the episode I did with Carson Gross about HTMX, the deep dive starts out

00:02:48.820 --> 00:02:53.200
with a section called what to know if you're new to Python to help you get the most out of

00:02:53.200 --> 00:02:54.620
that specific episode.

00:02:54.620 --> 00:03:00.500
Then it features incremental adoption and complexity budgets, HTML fragments and partial updates,

00:03:00.500 --> 00:03:06.480
minimal JavaScript for React-like UIs, and even interesting quotes such as,

00:03:06.620 --> 00:03:08.640
your application has a complexity budget.

00:03:08.640 --> 00:03:10.480
Spend it efficiently by Carson.

00:03:11.040 --> 00:03:15.920
These do not appear in your podcast player, but if you visit any episode page for episodes

00:03:15.920 --> 00:03:20.060
that are published after October 2020, you'll find a deep dive for that show.

00:03:20.060 --> 00:03:25.820
Now, this does not replace the links section, which still exists on the episode page and in

00:03:25.820 --> 00:03:26.600
your podcast players.

00:03:26.960 --> 00:03:28.560
I think it adds a ton of value.

00:03:28.560 --> 00:03:34.560
I actually did a long write-up on this over at the Talk Python blog at talkpython.fm/blog.

00:03:34.560 --> 00:03:35.680
Creative, I know.

00:03:35.680 --> 00:03:37.920
So please give it a read if you want to know more.

00:03:37.920 --> 00:03:39.780
And there's an Easter egg there as well.

00:03:39.780 --> 00:03:46.520
There's an awesome notebook LM AI mind-blowing audio track I put in the middle that you should

00:03:46.520 --> 00:03:48.680
check out if you're interested in that kind of thing.

00:03:48.680 --> 00:03:50.320
It's really, really interesting.

00:03:50.320 --> 00:03:51.140
Well done.

00:03:51.140 --> 00:03:52.900
And we live in crazy times.

00:03:52.900 --> 00:03:53.720
Let's just leave it there.

00:03:53.800 --> 00:03:54.560
Check it out on the blog.

00:03:54.560 --> 00:03:56.400
So with that, thank you.

00:03:56.400 --> 00:03:57.860
Thank you for all the support.

00:03:57.860 --> 00:03:59.680
And let's dive into great tables.

00:03:59.680 --> 00:04:00.880
It's an awesome episode.

00:04:00.880 --> 00:04:04.140
Rich, Michael, welcome to Talk Python To Me.

00:04:04.140 --> 00:04:05.020
Great to have you two here.

00:04:05.020 --> 00:04:06.420
Hey, thanks for having us.

00:04:06.420 --> 00:04:07.000
Great to be here.

00:04:07.000 --> 00:04:10.440
It's a pretty interesting topic, these tables.

00:04:10.440 --> 00:04:14.420
You know, when I first heard about it, I was like, I was like, I, you know, it sounds

00:04:14.420 --> 00:04:17.660
interesting, but how are we going to talk about tables on the podcast?

00:04:17.660 --> 00:04:20.960
And you know, how, how much is it really to talk about with tables?

00:04:20.960 --> 00:04:22.160
Turns out there's a lot.

00:04:22.360 --> 00:04:24.340
And we're going to find a way to talk about it on the podcast.

00:04:24.340 --> 00:04:26.640
So it's, it's a pretty deep topic.

00:04:26.640 --> 00:04:27.460
There's so much.

00:04:27.460 --> 00:04:28.460
You don't need two hours.

00:04:28.460 --> 00:04:33.340
And honestly, like what you said just now is like story of my life for the past year of

00:04:33.340 --> 00:04:36.580
like being like, what, what could tables do?

00:04:36.580 --> 00:04:37.680
Like, yeah.

00:04:37.680 --> 00:04:38.540
And then just being freaked out.

00:04:38.540 --> 00:04:39.920
I mean, df.head, doesn't it?

00:04:39.920 --> 00:04:40.500
I just solve it.

00:04:40.500 --> 00:04:40.900
Come on.

00:04:40.900 --> 00:04:41.260
Right.

00:04:41.260 --> 00:04:41.720
We already got that.

00:04:41.720 --> 00:04:42.860
We already live.

00:04:42.860 --> 00:04:44.100
It's already so perfect.

00:04:44.100 --> 00:04:45.960
How could we improve on that?

00:04:45.960 --> 00:04:47.780
But yeah, I'm really excited.

00:04:47.780 --> 00:04:51.600
Cause this is, this is me kind of like fanning over rich, but like, I think it's like the

00:04:51.600 --> 00:04:52.280
perfect way to frame it.

00:04:52.280 --> 00:04:53.800
Like what's up with tables.

00:04:53.800 --> 00:04:58.760
I feel like having pulled that thread for the last year, I'm always excited to talk about

00:04:58.760 --> 00:05:03.800
these things here because like, I don't even be able to recapture how freaked out I am by

00:05:03.800 --> 00:05:08.240
whatever I just experienced for the past year with tables that we're just shipping away at

00:05:08.240 --> 00:05:09.640
is really exciting.

00:05:09.640 --> 00:05:10.760
Tables.

00:05:12.200 --> 00:05:17.220
So you know what I would say probably my impression, which I will grant you is a pretty

00:05:17.220 --> 00:05:18.200
fresh take on this.

00:05:18.200 --> 00:05:20.820
It's a little bit like, oh, well, we already got Excel.

00:05:20.820 --> 00:05:26.320
You can draw graphs with Excel or Altair, Plotly, those types of, you know, it's like, oh, wait,

00:05:26.320 --> 00:05:28.000
there's, there's actually a lot more we could do.

00:05:28.000 --> 00:05:28.700
That's pretty awesome.

00:05:28.700 --> 00:05:29.180
Yeah.

00:05:29.180 --> 00:05:30.860
We have a language too.

00:05:30.860 --> 00:05:35.960
I feel like having discovered there's a whole vocabulary for tables, I feel like was really

00:05:35.960 --> 00:05:37.460
enlightening.

00:05:37.460 --> 00:05:37.980
Yeah.

00:05:37.980 --> 00:05:38.920
I would think so.

00:05:38.920 --> 00:05:43.060
There's, there's almost like design patterns of tables or to get into that and like structure

00:05:43.060 --> 00:05:45.420
and some history and many things.

00:05:45.420 --> 00:05:50.180
But as per usual, before we jump into that, let's get a little bit of background on you

00:05:50.180 --> 00:05:54.120
guys and, you know, maybe quick introduction on the two of you, how you got motivated to

00:05:54.120 --> 00:05:56.760
get into work with great tables and that sort of thing.

00:05:56.760 --> 00:05:57.100
Yeah.

00:05:57.100 --> 00:05:58.260
Rich, you want to?

00:05:58.260 --> 00:05:58.740
Yeah.

00:05:58.740 --> 00:05:59.620
So I'm rich.

00:05:59.620 --> 00:06:01.500
How do you get into tables?

00:06:01.500 --> 00:06:03.240
I mean, I had to make tons of them.

00:06:03.240 --> 00:06:05.260
So that was sort of a necessity.

00:06:06.580 --> 00:06:11.500
So the problem was it was annoying to do like really annoying either doing it word was

00:06:11.500 --> 00:06:14.740
repetitive, you know, not reproducible, which kind of annoying me.

00:06:14.740 --> 00:06:19.900
I had to redo tables all the time because we had to use a tool that was outside of like

00:06:19.900 --> 00:06:20.400
programming.

00:06:20.400 --> 00:06:20.840
Right.

00:06:20.840 --> 00:06:22.700
That was like a major problem.

00:06:22.700 --> 00:06:24.400
Actually had to retranscribe them.

00:06:24.400 --> 00:06:25.380
There was many of them.

00:06:25.380 --> 00:06:26.360
It was kind of blah.

00:06:26.360 --> 00:06:27.140
So.

00:06:27.140 --> 00:06:27.440
Right.

00:06:27.440 --> 00:06:27.940
I swear.

00:06:27.940 --> 00:06:28.540
I swear.

00:06:28.540 --> 00:06:34.020
Like kind of like I opened with you could, you could automate the graphs, but you couldn't

00:06:34.020 --> 00:06:34.820
automate the tables.

00:06:34.820 --> 00:06:35.120
Right.

00:06:35.120 --> 00:06:36.080
Exactly.

00:06:36.080 --> 00:06:36.600
Yes.

00:06:36.600 --> 00:06:38.320
It was like the one last thing.

00:06:38.320 --> 00:06:40.820
So that was like where I came from with tables.

00:06:40.820 --> 00:06:43.420
And years later, I finally got to it.

00:06:43.420 --> 00:06:44.420
I mean, better late than never.

00:06:44.420 --> 00:06:45.340
Yeah.

00:06:45.340 --> 00:06:45.600
Yeah.

00:06:45.600 --> 00:06:48.560
I came in mostly to support rich.

00:06:48.560 --> 00:06:54.700
So a lot of what I've done is work is like a data scientist in R and Python.

00:06:54.700 --> 00:06:58.020
And I've, I've always kind of had a split and kind of split brain.

00:06:58.020 --> 00:07:02.680
So doing a lot of data analysis in R and more engineering tasks in Python.

00:07:03.440 --> 00:07:10.080
But I think as, as I noticed, Rich was kind of bringing this table idea to Python, I talked

00:07:10.080 --> 00:07:13.480
with him a bit and then I peeked through the code he was working on.

00:07:13.480 --> 00:07:16.440
And I was sort of really intrigued by how much was there.

00:07:16.440 --> 00:07:23.040
Like, I would say the first thing that really kind of surprised me is just how much code he

00:07:23.040 --> 00:07:27.200
had was just more than I kind of thought tables would need.

00:07:27.200 --> 00:07:30.980
And so this is more than one's file.

00:07:30.980 --> 00:07:31.600
I mean, come on.

00:07:31.600 --> 00:07:33.700
Don't we just put out a header and put out the rows?

00:07:33.700 --> 00:07:36.800
It was kind of like, there's a lot going on here for people who are not familiar with this.

00:07:36.800 --> 00:07:37.280
Yeah.

00:07:37.280 --> 00:07:37.840
Right.

00:07:37.840 --> 00:07:40.000
I surprised myself too with how much I wrote.

00:07:40.000 --> 00:07:43.500
I mean, it just kept snowballing the amount of things that had to be done.

00:07:43.500 --> 00:07:44.260
Yeah.

00:07:44.260 --> 00:07:45.060
I'm sure.

00:07:45.060 --> 00:07:48.680
And we did, we both came from academics.

00:07:48.680 --> 00:07:54.780
So we both did PhDs and I think we both produced like a decent number of tables as we did that.

00:07:55.560 --> 00:08:01.260
But yeah, never, never quite dove as deep into them or as intricate.

00:08:01.260 --> 00:08:01.940
Yeah.

00:08:01.940 --> 00:08:05.900
And probably most of the time, you know, you're knocking out something in Excel or LaTeX or

00:08:05.900 --> 00:08:06.680
something like that.

00:08:06.680 --> 00:08:07.080
Yeah.

00:08:07.080 --> 00:08:08.480
Once it's done, it's kind of done.

00:08:08.480 --> 00:08:14.240
It's not, not live in the sense like every day I want a new popular view of the status or,

00:08:14.240 --> 00:08:16.060
you know, whatever, like the dashboard sort of deal.

00:08:16.060 --> 00:08:17.280
What were your PhDs in?

00:08:17.280 --> 00:08:19.700
I did a chemistry of all things.

00:08:19.700 --> 00:08:20.280
Chemistry.

00:08:20.280 --> 00:08:21.000
I love chemistry.

00:08:21.000 --> 00:08:21.400
Yeah.

00:08:21.400 --> 00:08:22.080
A lot of tables.

00:08:22.080 --> 00:08:24.500
Again, a chemistry was one of my favorite courses I ever took.

00:08:24.500 --> 00:08:25.300
I love the two.

00:08:25.420 --> 00:08:25.540
Yeah.

00:08:25.540 --> 00:08:26.280
Organic was great.

00:08:26.280 --> 00:08:26.820
Yeah.

00:08:26.820 --> 00:08:27.320
Beautiful.

00:08:27.320 --> 00:08:27.800
Yeah.

00:08:27.800 --> 00:08:30.140
And I know, I know very little about chemistry.

00:08:30.140 --> 00:08:32.000
I did cognitive psychology.

00:08:32.000 --> 00:08:32.680
So.

00:08:32.680 --> 00:08:33.000
Okay.

00:08:33.000 --> 00:08:35.120
Tables in the mind or something.

00:08:35.120 --> 00:08:35.700
I don't know.

00:08:35.700 --> 00:08:37.240
Something like that.

00:08:37.240 --> 00:08:38.580
Yeah, absolutely.

00:08:38.580 --> 00:08:39.580
That's cool.

00:08:39.580 --> 00:08:45.040
So you must have had a lot of experience with trying to present your research and your thesis

00:08:45.040 --> 00:08:47.160
and stuff through, through tables, right?

00:08:47.160 --> 00:08:47.680
Yeah.

00:08:47.680 --> 00:08:48.160
Big time.

00:08:48.160 --> 00:08:52.840
I think it counted like something like 100 tables, including that the raw data section.

00:08:52.840 --> 00:08:54.800
So yeah, no shortage of tables there.

00:08:54.800 --> 00:08:57.200
And a lot of it came up in presentations and stuff.

00:08:57.200 --> 00:08:58.160
Had to remake them.

00:08:58.160 --> 00:08:59.960
Again, no, no good tool.

00:08:59.960 --> 00:09:04.880
So I was like, I felt like, I felt sad, but I had no time to like pursue a tool.

00:09:04.880 --> 00:09:06.180
So I just kept going.

00:09:06.180 --> 00:09:06.840
Yeah.

00:09:06.980 --> 00:09:11.760
I will say, I kind of picked up too, as I started working with Rich, that he's a supreme

00:09:11.760 --> 00:09:12.340
dabbler.

00:09:12.340 --> 00:09:18.020
Like he has collected tables from across the world in a lot of different domains.

00:09:18.020 --> 00:09:22.520
So that's, that's one thing that caught me too, was like, I don't doubt he produced a

00:09:22.520 --> 00:09:27.800
lot of chemistry tables, but I was amazed that I felt like he was like a guy in an alleyway

00:09:27.800 --> 00:09:29.800
trying to like sell me tables.

00:09:29.800 --> 00:09:32.560
Like, oh, you like a sports table?

00:09:32.560 --> 00:09:34.200
He's like, oh, you like basketball?

00:09:34.200 --> 00:09:35.080
You know, you like.

00:09:35.600 --> 00:09:36.000
Yeah.

00:09:36.000 --> 00:09:36.640
Yeah.

00:09:36.640 --> 00:09:39.280
The first, the first brackets free and then.

00:09:39.280 --> 00:09:39.800
Yeah.

00:09:39.800 --> 00:09:40.000
Yeah.

00:09:40.000 --> 00:09:40.260
Yeah.

00:09:40.260 --> 00:09:42.160
That's how it gets your hooks.

00:09:42.160 --> 00:09:42.780
Yeah.

00:09:42.780 --> 00:09:43.600
It kind of is like that.

00:09:43.600 --> 00:09:44.080
Yeah.

00:09:44.080 --> 00:09:46.620
Try to make tables possible for everybody, you know?

00:09:46.620 --> 00:09:47.160
Yeah.

00:09:47.160 --> 00:09:48.700
So how do we kick this off?

00:09:48.700 --> 00:09:53.800
We got to, I just want to say to all the listeners who are not watching the YouTube live stream,

00:09:53.800 --> 00:09:56.720
but are just listening, like most listen to the show do.

00:09:56.720 --> 00:09:59.620
We're going to do our best to describe some of these things.

00:09:59.620 --> 00:10:03.420
Some of them are visual, but I think we can pretty much capture the essence of them.

00:10:03.720 --> 00:10:09.120
I will try to set up chapters and put some chapter, chapter art.

00:10:09.120 --> 00:10:14.920
So keep an eye on your podcast player or your CarPlay view of now playing or whatever it is

00:10:14.920 --> 00:10:15.800
that's playing the thing.

00:10:15.800 --> 00:10:17.540
It might show, show some pictures.

00:10:17.540 --> 00:10:19.020
We'll see what we can do with that.

00:10:19.020 --> 00:10:24.600
But let's start off the conversation here, not on great tables exactly, but maybe just

00:10:24.600 --> 00:10:29.480
some examples of some good, good tables to give people a sense of just, you know, what

00:10:29.480 --> 00:10:34.500
more could you possibly do than just, you know, data frame dot header, something to that effect.

00:10:34.500 --> 00:10:35.020
You know what I mean?

00:10:35.020 --> 00:10:38.440
So I think it was Rich who sent this over.

00:10:38.440 --> 00:10:39.140
Yeah.

00:10:39.140 --> 00:10:39.960
What do you guys said?

00:10:39.960 --> 00:10:41.520
A visualization gallery.

00:10:41.520 --> 00:10:42.120
Yes.

00:10:42.120 --> 00:10:43.300
From Andrew Weatherman.

00:10:43.300 --> 00:10:44.260
And includes tables.

00:10:44.260 --> 00:10:45.780
It has got some awesome tables.

00:10:45.780 --> 00:10:46.940
The first thing is a table.

00:10:46.940 --> 00:10:46.940
Yeah.

00:10:46.940 --> 00:10:50.560
And there are 10 tutorials here.

00:10:50.560 --> 00:10:53.560
And there are a lot of them are based on code.

00:10:53.560 --> 00:10:55.220
A lot of them from R and stuff like that.

00:10:55.220 --> 00:10:57.820
But which one should, which one do you think we should talk about?

00:10:57.820 --> 00:10:59.720
Just as an introductory example, maybe.

00:10:59.720 --> 00:11:01.300
Pretty good one is the first one.

00:11:01.300 --> 00:11:02.300
The very first.

00:11:02.300 --> 00:11:04.720
Like it leads with a table at the very top of the page.

00:11:04.720 --> 00:11:05.560
It's called.

00:11:05.720 --> 00:11:08.560
So there's conference realignment travel.

00:11:08.560 --> 00:11:09.060
Yeah.

00:11:09.060 --> 00:11:09.860
And right away.

00:11:09.860 --> 00:11:13.640
So if you, yeah, if we open this table up, there is, there's pictures.

00:11:13.640 --> 00:11:16.440
Like, so this talks about like, what is this?

00:11:16.440 --> 00:11:18.480
A basketball college, American basketball.

00:11:18.480 --> 00:11:19.020
Yeah.

00:11:19.020 --> 00:11:26.620
So you've got the logo or the icon, you know, like the Stanford tree or the Miami, Florida

00:11:26.620 --> 00:11:30.560
U, which is like the school colors.

00:11:30.560 --> 00:11:33.960
And you've got little chiclets of the information.

00:11:34.360 --> 00:11:37.140
It's, those are also embedded in sort of a heat map.

00:11:37.140 --> 00:11:42.420
There's a lot more that there's a lot of pieces of this conveying information all at the same

00:11:42.420 --> 00:11:42.760
time.

00:11:42.760 --> 00:11:45.140
You want to maybe just riff on that a little bit.

00:11:45.140 --> 00:11:45.480
Yeah.

00:11:45.480 --> 00:11:47.840
I don't mind trying to tackle this table.

00:11:47.840 --> 00:11:48.960
I'm just taking it in.

00:11:48.960 --> 00:11:50.400
I think, I think it's really nice.

00:11:50.400 --> 00:11:51.780
So this table, yeah.

00:11:51.780 --> 00:11:54.400
Basketball realignment travel in the ACC.

00:11:54.400 --> 00:12:00.620
So they're talking about, I guess, how hard would it be for these teams to drive to games?

00:12:00.620 --> 00:12:03.240
And so in the table, every row is a team.

00:12:03.640 --> 00:12:06.720
And they use like the logos next to the team name.

00:12:06.720 --> 00:12:08.220
So it's really fast to look up.

00:12:08.220 --> 00:12:13.300
And then in the columns are things about like, yeah, visiting arena to home arena.

00:12:13.300 --> 00:12:19.520
So like how, how many miles would it take for this team to travel to the arenas they're going

00:12:19.520 --> 00:12:19.820
to?

00:12:20.780 --> 00:12:26.400
And I think that what's nice about this table is, for example, there are multiple measures

00:12:26.400 --> 00:12:32.020
of how many miles it would take a given team to go to their visiting arenas.

00:12:32.020 --> 00:12:35.240
So for example, on the first row, we have California.

00:12:35.920 --> 00:12:42.340
And in columns, we have like median miles for one column and average miles for another column.

00:12:43.080 --> 00:12:48.340
But I think what's nice about just kind of basic table structure is because these two columns,

00:12:48.340 --> 00:12:52.940
medium miles and average miles are both kind of about a similar thing.

00:12:52.940 --> 00:12:57.900
They're able to put a label over it called a column spanner, and they label it visiting

00:12:57.900 --> 00:12:59.240
arena to home arena.

00:12:59.420 --> 00:13:02.380
So they're able to do a little bit of grouping of information.

00:13:02.380 --> 00:13:07.720
So you can see like these two measures, these two columns are related to each other.

00:13:07.720 --> 00:13:08.740
And then I like...

00:13:08.740 --> 00:13:08.740
Yeah.

00:13:08.740 --> 00:13:13.680
Michael, that's a super interesting point that I think is very well represented in gray tables.

00:13:13.680 --> 00:13:17.080
And that is almost multi-dimensional data.

00:13:17.080 --> 00:13:17.540
Yeah.

00:13:17.760 --> 00:13:18.140
Right.

00:13:18.140 --> 00:13:22.800
And so, like you say, it's got three columns here, median miles, average miles, and then

00:13:22.800 --> 00:13:25.000
this other geographic center column.

00:13:25.000 --> 00:13:27.740
But above those, there's like groupings.

00:13:27.740 --> 00:13:34.260
Like these two columns speak to how far is the visiting arena from home versus the other one

00:13:34.260 --> 00:13:37.160
is just sort of an extra description, right?

00:13:37.160 --> 00:13:42.760
So you're able to say, here's this axis of information, but you can really group them together

00:13:42.760 --> 00:13:47.580
and think of them as something else it's representing almost or something combined, like a projection.

00:13:47.700 --> 00:13:48.700
I don't know, something like this.

00:13:48.700 --> 00:13:49.460
Yeah, totally.

00:13:49.460 --> 00:13:54.740
And I think the interesting thing too is like in databases or in data analysis, this kind

00:13:54.740 --> 00:13:57.500
of structure is there, but it's not visual oftentimes.

00:13:57.500 --> 00:14:03.700
Like someone might have a table and they might have two columns, one for like median miles,

00:14:03.700 --> 00:14:09.440
average miles, but they might actually like, oftentimes people in the name will put the grouping.

00:14:09.440 --> 00:14:14.640
So like if those two columns are related, they might say like visiting, you know, prefix it

00:14:14.640 --> 00:14:15.760
with like visiting underscore.

00:14:16.440 --> 00:14:21.660
And so it's interesting, like tables, raw data tables often have these hierarchies, but

00:14:21.660 --> 00:14:23.700
this kind of lets you pull it out visually.

00:14:23.700 --> 00:14:27.860
So like the human eye can quickly kind of group things.

00:14:27.860 --> 00:14:32.860
And then to your point about multi-dimensional, that is kind of like one of the big benefits

00:14:32.860 --> 00:14:39.080
of a table is that this, for example, this table has three columns related to miles and

00:14:39.080 --> 00:14:39.580
a plot.

00:14:39.720 --> 00:14:41.300
You could show that in a plot.

00:14:41.300 --> 00:14:46.160
You could plot two columns against each other with a scatter plot and maybe use the third

00:14:46.160 --> 00:14:49.080
column another way through like color or size.

00:14:49.080 --> 00:14:52.120
But at that point, you've kind of maxed out the plot.

00:14:52.120 --> 00:14:53.880
There's not a lot more you can do.

00:14:53.880 --> 00:14:59.780
A table, you can just keep adding columns and they don't even have to be numeric or like

00:14:59.780 --> 00:15:01.120
kind of on the same scale.

00:15:01.360 --> 00:15:05.360
You could add like all kinds of information in columns and keep going.

00:15:05.360 --> 00:15:10.520
And I think to your point of it being multi-dimensional, that's one kind of nice thing table support is

00:15:10.520 --> 00:15:13.120
many measures on the columns.

00:15:13.500 --> 00:15:14.080
Yeah, absolutely.

00:15:14.080 --> 00:15:19.940
This portion of Talk Python To Me is brought to you by Posit, the makers of Shiny, formerly

00:15:19.940 --> 00:15:23.280
RStudio and especially Shiny for Python.

00:15:23.280 --> 00:15:25.200
Let me ask you a question.

00:15:25.200 --> 00:15:26.900
Are you building awesome things?

00:15:26.900 --> 00:15:27.960
Of course you are.

00:15:27.960 --> 00:15:29.520
You're a developer or data scientist.

00:15:29.520 --> 00:15:30.440
That's what we do.

00:15:30.440 --> 00:15:32.480
And you should check out Posit Connect.

00:15:32.480 --> 00:15:38.200
Posit Connect is a way for you to publish, share and deploy all the data products that you're

00:15:38.200 --> 00:15:39.460
building using Python.

00:15:39.460 --> 00:15:42.640
People ask me the same question all the time.

00:15:42.840 --> 00:15:45.800
Michael, I have some cool data science project or notebook that I built.

00:15:45.800 --> 00:15:49.080
How do I share it with my users, stakeholders, teammates?

00:15:49.080 --> 00:15:53.860
Do I need to learn FastAPI or Flask or maybe Vue or React.js?

00:15:53.860 --> 00:15:55.120
Hold on now.

00:15:55.120 --> 00:15:59.300
Those are cool technologies and I'm sure you'd benefit from them, but maybe stay focused on

00:15:59.300 --> 00:15:59.920
the data project.

00:15:59.920 --> 00:16:02.400
Let Posit Connect handle that side of things.

00:16:02.400 --> 00:16:07.120
With Posit Connect, you can rapidly and securely deploy the things you build in Python.

00:16:07.120 --> 00:16:12.620
Streamlit, Dash, Shiny, Bokeh, FastAPI, Flask, Quarto, Ports, Dashboards.

00:16:12.620 --> 00:16:13.460
And APIs.

00:16:13.460 --> 00:16:15.860
Posit Connect supports all of them.

00:16:15.860 --> 00:16:21.100
And Posit Connect comes with all the bells and whistles to satisfy IT and other enterprise

00:16:21.100 --> 00:16:21.720
requirements.

00:16:21.720 --> 00:16:26.000
Make deployment the easiest step in your workflow with Posit Connect.

00:16:26.000 --> 00:16:31.240
For a limited time, you can try Posit Connect for free for three months by going to talkpython.fm

00:16:31.240 --> 00:16:32.200
slash posit.

00:16:32.200 --> 00:16:35.840
That's talkpython.fm/P-O-S-I-T.

00:16:36.040 --> 00:16:37.740
The link is in your podcast player show notes.

00:16:37.740 --> 00:16:41.000
Thank you to the team at Posit for supporting Talk Python.

00:16:42.160 --> 00:16:43.080
Out of the audience.

00:16:43.080 --> 00:16:48.080
Carol points out that the ACC used to be mostly Southern based, but now they span the whole

00:16:48.080 --> 00:16:48.440
U.S.

00:16:48.440 --> 00:16:54.620
But what you can see from this chart is all, or this table rather, that all the Southeast

00:16:54.620 --> 00:16:59.320
based universities have a much easier time.

00:16:59.820 --> 00:17:05.320
The color of their little chiclets of distance are all very light colored.

00:17:05.320 --> 00:17:10.780
Whereas if you look at all the California West Coast, it's like distance across the U.S.

00:17:10.780 --> 00:17:13.240
is your average distance you travel to each game.

00:17:13.600 --> 00:17:15.180
And it's pretty wild.

00:17:15.180 --> 00:17:24.820
You could probably put in things like, what is the team's typical winning outcome based by distance?

00:17:24.820 --> 00:17:31.680
If it has to play a team that is twice as far away, are the players more likely to show up tired

00:17:31.680 --> 00:17:34.160
and not quite be able to play as good?

00:17:34.160 --> 00:17:39.260
And then that might somehow affect the rankings just based where you physically are located.

00:17:39.440 --> 00:17:39.840
Yeah.

00:17:39.840 --> 00:17:43.720
That's what makes this a good table because it basically tries to get that slice of the

00:17:43.720 --> 00:17:44.260
data, right?

00:17:44.260 --> 00:17:47.000
That one view of the data and present it so nicely.

00:17:47.000 --> 00:17:49.660
And then it causes you to think those things, right?

00:17:49.660 --> 00:17:50.820
To explore further.

00:17:50.820 --> 00:17:51.520
Yeah, exactly.

00:17:51.520 --> 00:17:53.360
I don't know what I would have been able to do before.

00:17:53.360 --> 00:17:54.080
Yeah.

00:17:54.080 --> 00:17:54.600
Yeah.

00:17:54.600 --> 00:18:00.880
But looking at the colors, you're like, oh, California, as in Berkeley and Stanford and those

00:18:00.880 --> 00:18:08.000
types of schools, they're much darker versus Louisville, which is not very much, or Duke

00:18:08.000 --> 00:18:09.620
or all these other teams.

00:18:09.620 --> 00:18:13.900
And then you start to realize, oh, maybe distance does play an important role.

00:18:13.900 --> 00:18:18.000
It just jumps right out, even though this is not a thing that I think about or care very

00:18:18.000 --> 00:18:19.440
much about on a lot of levels.

00:18:19.440 --> 00:18:20.100
But, you know.

00:18:20.100 --> 00:18:20.560
Yeah.

00:18:20.560 --> 00:18:26.220
And even to Michael's point, that last column is like a total qualitative measure or not

00:18:26.220 --> 00:18:30.960
qualitative, but it's basically just like a label rather than like a number, essentially.

00:18:30.960 --> 00:18:32.820
So it's much easier.

00:18:32.820 --> 00:18:34.660
In a plot, I don't even know how you would do that.

00:18:34.660 --> 00:18:35.980
You just, I guess.

00:18:35.980 --> 00:18:36.820
But here you can.

00:18:36.820 --> 00:18:40.600
Just to describe the last column is, you're talking about like furthest.

00:18:40.600 --> 00:18:44.320
So the last column shows what's the furthest team from.

00:18:44.320 --> 00:18:45.720
So each row is a team.

00:18:45.720 --> 00:18:48.840
The last column is essentially what's the furthest team from you.

00:18:48.840 --> 00:18:52.360
And they're able to just put a logo in to get a quick kind of snapshot.

00:18:52.360 --> 00:18:55.100
And you can play on that extra column.

00:18:55.440 --> 00:19:00.160
Basically, if you were to play an away game at that team, that's the worst travel for you.

00:19:00.160 --> 00:19:01.960
But at least measured by distance.

00:19:01.960 --> 00:19:03.760
It's not like by time.

00:19:03.760 --> 00:19:07.340
And like if you're taking a flight, you could have three connections to a small town versus

00:19:07.340 --> 00:19:08.580
a direct one that's far away.

00:19:08.580 --> 00:19:08.760
Right.

00:19:08.760 --> 00:19:12.020
Like there's different metrics you might apply to what defines furthest.

00:19:12.020 --> 00:19:13.680
But that's a neat idea.

00:19:13.680 --> 00:19:14.140
Yeah.

00:19:14.140 --> 00:19:14.820
It's interesting though.

00:19:14.820 --> 00:19:14.980
Right.

00:19:14.980 --> 00:19:17.940
Because they didn't put bother to like rewrite the name of that team.

00:19:17.940 --> 00:19:21.820
They just economize the space and just like threw it in in case you're interested.

00:19:21.820 --> 00:19:22.200
It's like.

00:19:22.200 --> 00:19:22.620
Yeah.

00:19:22.620 --> 00:19:25.800
And the value for that column is not the name of the school.

00:19:25.800 --> 00:19:27.400
It's the school logo.

00:19:27.400 --> 00:19:27.980
Yeah.

00:19:28.200 --> 00:19:34.740
And I will say, I can't believe that the year is 2024 and we just had a five minute

00:19:34.740 --> 00:19:41.280
discussion on the design of a single, I didn't imagine myself being here a year ago, but it's

00:19:41.280 --> 00:19:41.560
really.

00:19:41.560 --> 00:19:42.400
This is the problem.

00:19:42.400 --> 00:19:43.980
I'm telling about it to me.

00:19:43.980 --> 00:19:45.180
Yeah.

00:19:45.180 --> 00:19:45.860
Amazing.

00:19:45.860 --> 00:19:52.200
I feel like Edward Tuftay must come into existence a lot for you guys.

00:19:52.200 --> 00:19:54.420
But it kind of goes to show tables can be cool, right?

00:19:54.420 --> 00:19:57.920
Like we're actually talking about this table and it's interesting.

00:19:58.100 --> 00:19:58.920
And it's good to look at.

00:19:58.920 --> 00:20:00.660
And I'm like, I don't know.

00:20:00.660 --> 00:20:02.660
Like this is like a leisure thing.

00:20:02.660 --> 00:20:04.060
I'm not compelled to look at this.

00:20:04.060 --> 00:20:04.560
Yeah.

00:20:04.560 --> 00:20:05.480
I'm looking at this for fun.

00:20:05.480 --> 00:20:06.860
And like, it actually is okay.

00:20:06.860 --> 00:20:09.360
I enjoy looking at this table.

00:20:09.360 --> 00:20:09.980
Yeah.

00:20:09.980 --> 00:20:10.260
Yeah.

00:20:10.260 --> 00:20:11.700
I'll pull one more down.

00:20:11.700 --> 00:20:15.440
I have no idea what I'm going to be getting here, but let's do Spotify listening.

00:20:15.440 --> 00:20:18.060
How long do I listen to my top artists before skipping?

00:20:18.060 --> 00:20:18.600
Yeah.

00:20:18.600 --> 00:20:23.360
I think to your Tufte point too, this is a good example that you can have, you can have a

00:20:23.360 --> 00:20:26.760
little bar chart inside your table.

00:20:27.120 --> 00:20:31.940
So like this, this table, how long do I listen to my top artists before skipping?

00:20:31.940 --> 00:20:37.180
Each row is an artist with some information about them.

00:20:37.180 --> 00:20:42.280
And then the big thing it sounds like is this average stream duration column, which has a

00:20:42.280 --> 00:20:46.840
bar of how long people stream them on average, maybe before skipping.

00:20:47.360 --> 00:20:47.500
Yeah.

00:20:47.500 --> 00:20:48.680
I love your point about Tufte.

00:20:48.680 --> 00:20:55.280
Like this idea that you can encode a small graph, like visual, like a bar is very, I think

00:20:55.280 --> 00:20:57.680
Tufte, like with sparklines and things like that.

00:20:57.680 --> 00:21:03.360
Tables can have a really compact representation that bring in some of the value of charts.

00:21:04.180 --> 00:21:09.180
But also it's like, it's like three quarters table, one quarter chart.

00:21:09.180 --> 00:21:10.920
And that's kind of common.

00:21:10.920 --> 00:21:15.940
For those out there who don't are not steeped in Edward Tufte sort of lore.

00:21:15.940 --> 00:21:21.340
He's a guy who thinks very deeply about data presentation, not necessarily tables or graphs or

00:21:21.340 --> 00:21:25.480
whatever, but just, I have a bunch of kind of data stats based information.

00:21:25.480 --> 00:21:30.700
And how could I possibly present this in the way that conveys the most information easiest?

00:21:30.700 --> 00:21:31.540
So on.

00:21:31.540 --> 00:21:34.920
So yeah, he's got, he's got some great books, some great presentations out there.

00:21:35.580 --> 00:21:36.500
That's why I brought it up.

00:21:36.500 --> 00:21:40.320
Cause it's his whole career is about how do you present data basically.

00:21:40.320 --> 00:21:40.640
Right.

00:21:40.640 --> 00:21:42.460
And if you guys should add to that, what do you think?

00:21:42.460 --> 00:21:45.280
I think there is a, I don't have it on hand.

00:21:45.280 --> 00:21:50.280
There is a quote, I think from Tufte, I don't want to butcher about, there is some analysis

00:21:50.280 --> 00:21:54.940
he's done of tables of like, like your entry architecture or something, which is essentially

00:21:54.940 --> 00:21:58.460
like the structure of the table where you enter it as a user.

00:21:58.460 --> 00:22:02.160
And then like how you read usually determines your like orientation.

00:22:02.160 --> 00:22:06.660
So like, if you're, if you're reading left to right, there's usually like the table structure

00:22:06.660 --> 00:22:07.900
has like an entry point.

00:22:07.900 --> 00:22:12.520
And then if you're reading left to right, it kind of determines how you're going to go through.

00:22:12.520 --> 00:22:19.060
He's done some thinking about tables as sort of architectures, I think, but I haven't, I haven't

00:22:19.060 --> 00:22:20.940
gone too deep into it.

00:22:20.940 --> 00:22:21.360
Me neither.

00:22:21.360 --> 00:22:24.540
But I guess that informs like things like sorting that we saw in other tables.

00:22:24.540 --> 00:22:28.700
Like there's a dominant sort, the most important things are at the top, maybe least important,

00:22:28.700 --> 00:22:31.840
but there's, there's definitely some sort of like, you know, like conscious sorting.

00:22:31.840 --> 00:22:36.500
And like, it's obvious what it is and it's just to sort of serve a purpose.

00:22:36.500 --> 00:22:37.020
Yeah.

00:22:37.020 --> 00:22:41.360
There's probably an art to finding the thing that attracts your attention first.

00:22:41.360 --> 00:22:46.840
And so then as you progress through looking at it, you can do so in a deterministic, purposeful

00:22:46.840 --> 00:22:50.940
way rather than just, you know, you land anywhere and you start looking around visually.

00:22:50.940 --> 00:22:51.540
Yeah.

00:22:51.540 --> 00:22:51.860
Yeah.

00:22:51.860 --> 00:22:52.240
Yeah.

00:22:52.240 --> 00:22:56.240
It's wild because like it is such a, such a creative act making a table.

00:22:56.240 --> 00:22:57.560
It seems weird to say it.

00:22:57.560 --> 00:22:58.480
It's not just results.

00:22:58.540 --> 00:22:59.520
You just slap down.

00:22:59.520 --> 00:23:03.400
You have to envision yourself in the viewer's shoes and like how to, how they would

00:23:03.400 --> 00:23:09.080
ingest or like digest information in the most easiest manner possible with all sorts of like

00:23:09.080 --> 00:23:13.980
little affordances, like the way you format things, space in between columns, all sorts

00:23:13.980 --> 00:23:15.800
of wild, little tiny details.

00:23:15.800 --> 00:23:20.360
They all really combine to like make something really good or to make the table shine.

00:23:20.360 --> 00:23:21.020
I guess you can say.

00:23:21.020 --> 00:23:21.440
Yeah.

00:23:21.440 --> 00:23:22.320
Yeah, absolutely.

00:23:22.700 --> 00:23:25.740
I want to come back to this one about the listening.

00:23:25.740 --> 00:23:30.240
and I'll, I'll link to all these in the show notes, of course, here we've got the average

00:23:30.240 --> 00:23:35.700
stream duration and it's represented by little bars in the table itself, which we've already

00:23:35.700 --> 00:23:36.580
talked about, which is awesome.

00:23:36.580 --> 00:23:43.780
And the values are things like 87%, 80%, 84%, whatever that little section is fraught with

00:23:43.780 --> 00:23:45.440
possible misrepresentation.

00:23:45.440 --> 00:23:52.420
So if that was just a number and it was average seconds, well, if you listen to say the scorpions

00:23:52.420 --> 00:23:58.160
or some of the older rock bands or iron maiden, I don't know where they have songs that are

00:23:58.160 --> 00:24:03.800
like seven or eight minutes long versus more modern songs that are, it may be two and a half

00:24:03.800 --> 00:24:04.460
minutes long.

00:24:04.460 --> 00:24:08.140
And it said, Hey, look, I only listened to these like two and a half minutes, but I listened

00:24:08.140 --> 00:24:09.440
to the scorpions for three minutes.

00:24:09.440 --> 00:24:10.500
That must be the winner, right?

00:24:10.500 --> 00:24:13.220
Like, no, you're not even listening close to the same amount.

00:24:13.220 --> 00:24:17.160
So putting numbers even there, even before you would normalize them, right?

00:24:17.160 --> 00:24:21.860
Just put them as a percent of, of that, as like the total average of the song or something.

00:24:21.860 --> 00:24:26.500
There's a lot to think about with these things and that can kind of go away with these graphs,

00:24:26.500 --> 00:24:26.700
right?

00:24:26.700 --> 00:24:27.760
You don't have to worry about that.

00:24:27.760 --> 00:24:30.920
You're like, Oh, you don't have to worry about how long is their average song.

00:24:30.920 --> 00:24:34.000
You can see, you know, just how long did I listen to their stuff?

00:24:34.000 --> 00:24:34.820
That's kind of cool.

00:24:34.820 --> 00:24:35.260
Yeah.

00:24:35.260 --> 00:24:35.920
It's really cool.

00:24:35.920 --> 00:24:37.480
And it's a great use of space too, right?

00:24:37.480 --> 00:24:38.700
Like horizontal bar plot.

00:24:38.700 --> 00:24:43.060
I mean, these are like rows, which are not that high, but you still fit a plot in.

00:24:43.060 --> 00:24:46.180
We don't have that many choices, but, horizontal bar plot.

00:24:46.180 --> 00:24:46.260
Yeah.

00:24:46.260 --> 00:24:49.780
It could be just a couple of pixels high and you can still see, see that kind of information

00:24:49.780 --> 00:24:50.400
super well.

00:24:50.400 --> 00:24:50.400
Exactly.

00:24:50.400 --> 00:24:52.020
As long as you use enough color or whatever.

00:24:52.020 --> 00:24:52.800
All right.

00:24:52.800 --> 00:24:55.260
Well, let's talk about great tables.

00:24:55.260 --> 00:25:01.240
So I feel like we probably have set the stage well enough for, for people to go, okay,

00:25:01.240 --> 00:25:06.320
maybe there's, maybe there's something here rather than just, you know, header rows and columns.

00:25:06.320 --> 00:25:08.080
So tell us about great tables.

00:25:08.080 --> 00:25:09.580
When did it come into existence?

00:25:09.580 --> 00:25:11.240
Why do you guys build it?

00:25:11.240 --> 00:25:11.780
What is it?

00:25:11.780 --> 00:25:12.060
Yeah.

00:25:12.060 --> 00:25:13.480
Yeah, sure.

00:25:13.480 --> 00:25:18.580
So I actually started from an R program or package a long time ago back in 2018.

00:25:18.580 --> 00:25:23.160
and like, there was like essentially like a list of projects that were sort of like,

00:25:23.160 --> 00:25:28.180
I'm not being handled at our, at then our studio now posit and tables was there.

00:25:28.180 --> 00:25:29.980
It was like, Oh, this seems like such an obvious one.

00:25:29.980 --> 00:25:30.940
I will take that.

00:25:30.940 --> 00:25:31.980
I will work on that.

00:25:31.980 --> 00:25:33.240
And I have an interest in that.

00:25:33.240 --> 00:25:34.040
I'm going to do it.

00:25:34.040 --> 00:25:35.060
Nobody else did it.

00:25:35.060 --> 00:25:36.280
It was on that list for years.

00:25:36.860 --> 00:25:38.680
And it kind of begs the question, like why?

00:25:38.680 --> 00:25:43.380
Because tables are such omnipresent, you know, way of presenting data.

00:25:43.380 --> 00:25:47.440
I see it like in, I don't know, like journal articles, like half the things are tables, half

00:25:47.440 --> 00:25:48.120
things are plots.

00:25:48.120 --> 00:25:50.740
and they're, you know, everywhere else.

00:25:50.900 --> 00:25:52.520
So like, yeah, there should be this thing.

00:25:52.520 --> 00:25:54.620
So I decided to just get going on that.

00:25:55.140 --> 00:26:00.180
And, as, as Michael said, like, it's a lot of code and like, I didn't envision

00:26:00.180 --> 00:26:01.120
it would take that much code.

00:26:01.120 --> 00:26:05.520
I thought it'd be rather simple working with HTML table and then, you know, expanding towards

00:26:05.520 --> 00:26:10.260
other types of like table outputs, like a PDF, you know, word and stuff like that.

00:26:10.260 --> 00:26:14.340
but I thought, you know, those would be bite-sized little things as it turns out tables

00:26:14.340 --> 00:26:15.180
run pretty deep.

00:26:15.180 --> 00:26:20.140
and I really only found that out when looking at, I was doing some like literature review

00:26:20.140 --> 00:26:25.700
and I found that 1949 census manual, it's like the review of tabular, presentation.

00:26:25.700 --> 00:26:26.280
Yeah.

00:26:26.280 --> 00:26:28.060
It's a great PDF that lives on the internet.

00:26:28.060 --> 00:26:28.840
It's always there.

00:26:28.840 --> 00:26:29.480
Thanks.

00:26:29.480 --> 00:26:30.200
Whoever put that up.

00:26:30.200 --> 00:26:30.720
What year is this from?

00:26:30.720 --> 00:26:31.460
1949.

00:26:31.460 --> 00:26:31.740
49.

00:26:31.740 --> 00:26:32.240
Yeah.

00:26:32.240 --> 00:26:36.260
It's, it's like a janky scanned in thing.

00:26:36.260 --> 00:26:36.460
Yeah.

00:26:36.460 --> 00:26:43.520
But that's only a line, but it's, you know, this is like hundreds of pages of table stuff.

00:26:43.520 --> 00:26:46.060
It's both a style guide for the census at the time.

00:26:46.060 --> 00:26:51.420
And also just like an amazing reference for anything in tables and even just presenting

00:26:51.420 --> 00:26:51.780
data.

00:26:51.780 --> 00:26:55.880
Like they, they go so deep on the smallest little things.

00:26:55.880 --> 00:26:56.500
It's incredible.

00:26:56.500 --> 00:26:56.960
Yeah.

00:26:56.960 --> 00:26:57.880
They sketch things out.

00:26:57.880 --> 00:26:58.800
They give things names.

00:26:58.800 --> 00:27:02.720
That was super important because otherwise he'd just be saying that area on the top left,

00:27:02.720 --> 00:27:03.580
whatever that is.

00:27:03.580 --> 00:27:04.460
It's good to have names.

00:27:04.460 --> 00:27:06.580
It's like design patterns for.

00:27:06.580 --> 00:27:07.060
Exactly.

00:27:07.060 --> 00:27:07.680
Yes.

00:27:07.680 --> 00:27:09.120
And this is what was needed.

00:27:09.120 --> 00:27:10.800
And I'm pretty thankful I found this.

00:27:10.800 --> 00:27:14.860
Otherwise we'd have to make it up, but this seems like as close to a standard as we'll

00:27:14.860 --> 00:27:17.660
ever find on this sort of thing on making tables.

00:27:17.660 --> 00:27:18.240
Right.

00:27:18.240 --> 00:27:23.740
So in 1942, we have the formal table and its major parts continued, you know?

00:27:23.740 --> 00:27:24.200
Yeah.

00:27:24.200 --> 00:27:24.800
Yeah.

00:27:24.800 --> 00:27:26.440
And there's so much good text.

00:27:26.440 --> 00:27:28.080
Like it's expertly written.

00:27:28.080 --> 00:27:33.280
this stuff, I mean, of course these are tables in print and of course we have the web.

00:27:33.280 --> 00:27:37.400
So that changes things a little bit, but you'd be kind of surprised how, how, you know,

00:27:37.400 --> 00:27:39.560
still relevant these recommendations are.

00:27:39.560 --> 00:27:43.500
They teach you to be economical with how much data you put on, how much, basically the

00:27:43.500 --> 00:27:46.380
Tufte thing, how much ink are you going to like spend on a visualization?

00:27:46.380 --> 00:27:51.160
And, it just carries it through to all the different parts, which is, you know, amazing.

00:27:51.160 --> 00:27:54.980
And we took a lot of that and applied to here as best as we could, you know, with some

00:27:54.980 --> 00:27:59.840
more modern things as well, but, yeah, of course, but it's yeah, pretty much a very

00:27:59.840 --> 00:28:02.020
useful reference, like the foundational reference for this.

00:28:02.580 --> 00:28:06.900
So right on the great tables page, you've got the components of a table.

00:28:06.900 --> 00:28:07.380
Yeah.

00:28:07.380 --> 00:28:10.540
You want to give us a sense of what's beyond header rows and columns?

00:28:10.540 --> 00:28:10.980
Yeah.

00:28:10.980 --> 00:28:11.820
Michael, would you?

00:28:11.820 --> 00:28:12.240
Sure.

00:28:12.240 --> 00:28:12.700
Yeah.

00:28:12.700 --> 00:28:13.040
Yeah.

00:28:13.040 --> 00:28:13.720
I think so.

00:28:13.720 --> 00:28:19.420
I mean, I think even just the very first thing at the top, this table header with a title and

00:28:19.420 --> 00:28:24.900
a subtitle that's like, that, that seems like a really simple thing, but I think that it's

00:28:24.900 --> 00:28:25.820
easy to overlook.

00:28:25.820 --> 00:28:31.440
like a lot of people think of a table as just the like data and maybe some labels.

00:28:31.440 --> 00:28:37.660
But if you think about like the information hierarchy and someone who has maybe 10 seconds,

00:28:37.660 --> 00:28:39.520
five seconds to figure out what's going on.

00:28:39.520 --> 00:28:44.380
As it turns out, the title is probably the most, one of the most important parts because it tells

00:28:44.380 --> 00:28:48.120
them in two seconds, what should I expect from this thing?

00:28:48.120 --> 00:28:52.920
So like, if you send to your boss a table, if you had to do one thing, you should probably

00:28:52.920 --> 00:28:56.600
put a title on it so that they know what you're sending to them.

00:28:56.600 --> 00:28:59.400
And I think, so that's like, maybe a silly thing.

00:28:59.400 --> 00:29:04.560
Maybe it feels like table stakes, but I think like the title and the subtitle are small elements

00:29:04.560 --> 00:29:09.420
that really kind of, if you're thinking of a table as communication, you, you wouldn't

00:29:09.420 --> 00:29:10.900
write an article without a title.

00:29:10.900 --> 00:29:13.240
so this really is just.

00:29:13.720 --> 00:29:15.540
Probably wouldn't put a graph up without a title.

00:29:15.540 --> 00:29:16.220
Right.

00:29:16.220 --> 00:29:16.680
Yeah.

00:29:16.680 --> 00:29:17.020
Right.

00:29:17.020 --> 00:29:21.420
So it's kind of bringing tables up to the standard of other communications.

00:29:21.420 --> 00:29:22.160
Yeah.

00:29:22.160 --> 00:29:26.920
And then I think, the other thing I really like is these are really simple elements,

00:29:26.920 --> 00:29:31.600
but these footnotes on the bottom and source notes, this idea that if you just create a

00:29:31.600 --> 00:29:37.920
spot for your like references, it's a lot easier to get into the habit of, of referencing

00:29:37.920 --> 00:29:39.040
where things came from.

00:29:39.040 --> 00:29:43.460
So like we have some table examples in our gallery and they, in their footnotes, they often

00:29:43.460 --> 00:29:45.920
say where, we got them from.

00:29:45.920 --> 00:29:51.340
And it's just so, so helpful having that like hook that you can hang into to quickly, like

00:29:51.340 --> 00:29:56.700
as a quick reminder that if you, like, if you make it easy to put your references and footnotes,

00:29:56.700 --> 00:29:58.900
you know, you just can make a habit of it.

00:29:58.900 --> 00:30:00.700
So those are kind of funny.

00:30:00.700 --> 00:30:05.340
Those are like the bookends of a table, but I really appreciate that they're there to

00:30:05.340 --> 00:30:07.540
emphasize how critical they are.

00:30:07.540 --> 00:30:10.180
If tables are a form of, communication.

00:30:10.180 --> 00:30:10.780
Yeah.

00:30:10.780 --> 00:30:15.400
The one that stood out to me and I called out at the first table we talked about was the

00:30:15.400 --> 00:30:16.380
spanner label.

00:30:16.380 --> 00:30:21.060
That kind of says these three columns are kind of in some category together.

00:30:21.060 --> 00:30:21.500
Yeah.

00:30:21.500 --> 00:30:21.860
Yeah.

00:30:21.860 --> 00:30:22.900
The hierarchy is pretty important.

00:30:22.900 --> 00:30:27.300
It lets you sort of like, Oh yeah, I care about this package of, or this set of columns,

00:30:27.300 --> 00:30:29.260
or maybe I don't, maybe I care about these ones over here.

00:30:29.260 --> 00:30:33.460
You just quickly get oriented to like the columns that, you know, are more useful.

00:30:33.460 --> 00:30:36.340
And also it allows you to do that thing that Michael mentioned before.

00:30:36.340 --> 00:30:41.760
You don't have to like have tons of like label on the below columns, like on one label or

00:30:41.760 --> 00:30:42.480
tons of text on one label.

00:30:42.480 --> 00:30:46.160
You can split it up between like spanner and then like the things that it's associated to,

00:30:46.160 --> 00:30:46.980
you know, the columns.

00:30:46.980 --> 00:30:50.860
So you might have things like, some type of measure and then like the units for the

00:30:50.860 --> 00:30:51.840
column labels, for instance.

00:30:51.840 --> 00:30:52.160
Yeah.

00:30:52.160 --> 00:30:57.240
In our basketball example, it could be distance from visiting arena that could just have average

00:30:57.240 --> 00:31:00.300
or miles from visiting arena and then just average and median.

00:31:00.300 --> 00:31:03.040
And that's all it has to say, but you wouldn't have average and median.

00:31:03.040 --> 00:31:07.320
And that's called them like, unless it was really, really clear, but in a complicated

00:31:07.320 --> 00:31:10.720
thing, it wouldn't make sense to just have those two words like average or what, you know?

00:31:10.720 --> 00:31:11.140
Yeah.

00:31:11.140 --> 00:31:15.860
As part of that visualization, thoughtful design is about, allows you to be creative and also

00:31:15.860 --> 00:31:18.300
thoughtful for the user or the reader, I should say.

00:31:18.300 --> 00:31:19.180
I think it helps too.

00:31:19.180 --> 00:31:21.800
Cause a lot of tables I've seen go big on columns.

00:31:21.800 --> 00:31:25.020
There's like quite a few, there can be tons of columns.

00:31:25.020 --> 00:31:29.640
And so I think when you have like, let's say you have a dozen columns, if you have like

00:31:29.640 --> 00:31:33.300
two or three spanners over them, it feels easier.

00:31:33.300 --> 00:31:36.640
It feels like closer to a table with three columns in a sense.

00:31:36.640 --> 00:31:39.360
When you get started, you kind of know what you're getting into.

00:31:39.360 --> 00:31:41.000
So you can kind of ease into it.

00:31:41.000 --> 00:31:41.440
Yeah.

00:31:41.440 --> 00:31:45.900
You can kind of zoom in by picking a spanner and then paying attention to those pieces or

00:31:45.900 --> 00:31:46.120
something.

00:31:46.120 --> 00:31:46.600
Yeah.

00:31:46.600 --> 00:31:47.480
Yeah, totally.

00:31:47.480 --> 00:31:48.420
As well.

00:31:48.520 --> 00:31:50.560
Having these tools at your disposal as well.

00:31:50.560 --> 00:31:55.980
Also kind of like lets you be, I guess, creative, but also it gives you options to, to explore

00:31:55.980 --> 00:31:57.480
different ways of creating a table.

00:31:57.480 --> 00:32:01.780
If you didn't have like the ability to put a spanner, say in this program, this, this Python

00:32:01.780 --> 00:32:06.420
library, you'd have to think of other ways you'd have to, it, it basically changes your

00:32:06.420 --> 00:32:08.660
whole presentation, not having options to do so.

00:32:08.660 --> 00:32:09.380
Right.

00:32:09.380 --> 00:32:14.700
You'd want to try to leverage color maybe to try to infer their group somehow, but then

00:32:14.700 --> 00:32:16.400
yeah, it's still, it's incomplete.

00:32:16.400 --> 00:32:16.900
Yeah.

00:32:16.900 --> 00:32:17.200
For sure.

00:32:17.200 --> 00:32:17.740
Yeah.

00:32:17.740 --> 00:32:23.140
So a non out in the audience asks, like there's a lot, R has lots of great examples, but I've

00:32:23.140 --> 00:32:25.920
struggled since it's not equivalent in Python.

00:32:25.920 --> 00:32:26.700
Let me suggest.

00:32:26.700 --> 00:32:27.120
Oh yeah.

00:32:27.120 --> 00:32:32.540
I kind of feel like, like great tables is the entry point for a lot of that.

00:32:32.540 --> 00:32:32.780
Right.

00:32:32.780 --> 00:32:33.360
What do you think?

00:32:33.360 --> 00:32:33.760
Yeah.

00:32:33.760 --> 00:32:37.780
I think too, maybe something rich you can hit on is there's a lot to appreciate from the

00:32:37.780 --> 00:32:43.280
history of R. Like it's really surprising to people how hard people have gone on tables

00:32:43.280 --> 00:32:43.940
in R.

00:32:44.280 --> 00:32:44.540
Yeah.

00:32:44.540 --> 00:32:50.520
And some of everything leading up to rich working on GT and R tables in R in 2018.

00:32:50.520 --> 00:32:54.840
There's actually like a 20 year history leading into that.

00:32:54.840 --> 00:32:55.120
Yeah.

00:32:55.120 --> 00:32:55.800
That maybe rich.

00:32:55.800 --> 00:32:57.500
You can talk a bit about the kind of.

00:32:57.500 --> 00:32:58.000
Yeah.

00:32:58.000 --> 00:33:01.920
Before you guys just jump in real quick.

00:33:01.920 --> 00:33:07.600
You guys both are, we didn't catch this in the introduction, but you're both working at

00:33:07.600 --> 00:33:09.520
Posit, the company that created Shiny.

00:33:09.520 --> 00:33:14.460
It was an absolute leader in R and now has Shiny for Python and all those kinds of things.

00:33:14.460 --> 00:33:16.080
So just adding some background.

00:33:16.080 --> 00:33:16.760
Yeah.

00:33:16.760 --> 00:33:17.620
History for everyone.

00:33:17.620 --> 00:33:17.820
Okay.

00:33:17.820 --> 00:33:18.120
Go ahead.

00:33:18.340 --> 00:33:18.540
Yeah.

00:33:18.540 --> 00:33:24.000
So basically R goes back probably about as far as Python, 90s or so.

00:33:24.000 --> 00:33:27.600
But R seemed to have a head start on tables.

00:33:27.600 --> 00:33:33.140
I mean, as far back as 2000, they had a LaTeX sort of table generating package.

00:33:33.540 --> 00:33:39.580
And then in the intervening years, the decades since up to now, they've had upwards of eight

00:33:39.580 --> 00:33:41.040
to 10 table packages.

00:33:41.040 --> 00:33:44.680
I think had to do with the fact that data frames are just like, you know, as part of the language.

00:33:44.680 --> 00:33:46.440
So it just made sense to make a table.

00:33:46.440 --> 00:33:51.860
And also they just had, I guess, a lot of tooling for creating PDFs, especially for like

00:33:51.860 --> 00:33:53.720
package like references.

00:33:54.320 --> 00:33:57.740
So basically R has tons of like examples, vignettes and things like that.

00:33:57.740 --> 00:33:59.860
Maybe not so much on the Python side.

00:33:59.860 --> 00:34:01.260
We're trying to get that in.

00:34:01.260 --> 00:34:06.320
Although I've been maximal on the table examples for the R version of this, which is called GT.

00:34:06.320 --> 00:34:09.300
Haven't quite got there yet on the Python side.

00:34:09.300 --> 00:34:13.860
So if you're seeing less examples, then you might see on the R side, make sure that they

00:34:13.860 --> 00:34:14.940
are coming soon.

00:34:14.940 --> 00:34:15.960
Yeah.

00:34:15.960 --> 00:34:17.320
Still working on it.

00:34:17.320 --> 00:34:17.620
Yeah.

00:34:17.620 --> 00:34:22.700
So let's talk about, let's talk about the Python side about what is my data journey to

00:34:22.700 --> 00:34:27.180
get something into great tables and then maybe what comes out of great tables.

00:34:27.180 --> 00:34:30.620
So it starts with sounds like data frame libraries.

00:34:30.620 --> 00:34:32.280
What ones are supported?

00:34:32.280 --> 00:34:33.020
How's that work?

00:34:33.020 --> 00:34:35.200
What's the most ideal one?

00:34:35.200 --> 00:34:35.600
Yeah.

00:34:35.600 --> 00:34:40.040
So we, we support out of the gate pandas and polars.

00:34:40.040 --> 00:34:47.080
And we have, we've made this into lean pretty hard on polars in our examples, just because

00:34:47.080 --> 00:34:50.800
it has some kind of special moves that work really well with great tables.

00:34:50.800 --> 00:34:53.300
So for example, selectors and stuff, right?

00:34:53.300 --> 00:34:53.820
Yeah.

00:34:53.820 --> 00:34:54.440
Selectors.

00:34:54.440 --> 00:34:56.400
So that really was eyeopening to us.

00:34:56.400 --> 00:35:00.300
And I think the polars team a little bit, I think they hadn't, I think great tables was

00:35:00.300 --> 00:35:05.520
one of the first packages that went really hard in integrating with polar selectors as part

00:35:05.520 --> 00:35:06.260
of our API.

00:35:06.260 --> 00:35:11.480
So there are like, if you want to set a spanner label, so you want to set a label over some

00:35:11.480 --> 00:35:15.280
columns, you can use polar selectors to do that in great tables.

00:35:15.760 --> 00:35:18.640
And that's a really nice, that's, that's what we do all the time.

00:35:18.640 --> 00:35:19.720
And it's really convenient.

00:35:19.720 --> 00:35:25.340
I think that that was kind of an early use of an external package for the polars team

00:35:25.340 --> 00:35:27.960
using their selectors and stuff.

00:35:27.960 --> 00:35:34.060
So we, we had a lot of communication with them about it early on, but I would say, so it takes

00:35:34.060 --> 00:35:35.640
a pandas or a polars data frame.

00:35:35.640 --> 00:35:41.300
And we've leaned pretty hard into polars just because of some of these really nice affordances.

00:35:41.300 --> 00:35:41.860
Yeah.

00:35:41.860 --> 00:35:46.680
If you go to the get started guide, you'll see it inside of selecting table parts and then

00:35:46.680 --> 00:35:47.700
like selecting columns.

00:35:47.700 --> 00:35:51.520
I believe we have this little sidebar, which sections up the getting started.

00:35:51.520 --> 00:35:52.400
Oh boy.

00:35:52.400 --> 00:35:52.760
Yeah.

00:35:52.760 --> 00:35:52.960
Okay.

00:35:52.960 --> 00:35:53.680
Getting started.

00:35:53.680 --> 00:35:56.800
Oh, if you go to the very bottom on the sidebar.

00:35:56.800 --> 00:35:58.380
So scroll down.

00:35:58.380 --> 00:35:58.680
Yeah.

00:35:58.680 --> 00:35:59.080
Yeah.

00:35:59.080 --> 00:35:59.400
That.

00:35:59.400 --> 00:36:00.140
Column selection.

00:36:00.140 --> 00:36:01.020
Column selection.

00:36:01.020 --> 00:36:01.920
So sorry.

00:36:01.920 --> 00:36:02.420
There we go.

00:36:02.420 --> 00:36:02.940
Yeah.

00:36:02.940 --> 00:36:06.080
There's a whole using polar selectors section.

00:36:06.080 --> 00:36:06.620
Yeah.

00:36:06.620 --> 00:36:07.080
Here we go.

00:36:07.080 --> 00:36:07.460
Here we go.

00:36:07.460 --> 00:36:07.840
Yeah.

00:36:07.840 --> 00:36:08.260
Yeah.

00:36:08.260 --> 00:36:15.800
So that's just an example of dropping polar selectors into the great table method to move

00:36:15.800 --> 00:36:17.820
certain columns to the beginning of the table.

00:36:17.820 --> 00:36:18.320
Yeah.

00:36:18.320 --> 00:36:22.600
Or you might do another example where you choose a number of columns to put a spanner over

00:36:22.600 --> 00:36:26.660
top of, and they might be named in a systematic way, which is like the advantage here.

00:36:26.660 --> 00:36:29.220
And you can do it for pandas as well.

00:36:29.220 --> 00:36:30.140
Just not with selectors.

00:36:30.140 --> 00:36:33.480
You just use lambdas and such to have similar functionality.

00:36:33.480 --> 00:36:34.100
Interesting.

00:36:34.100 --> 00:36:34.660
Okay.

00:36:34.660 --> 00:36:35.600
Yeah.

00:36:35.600 --> 00:36:36.520
So yeah.

00:36:36.520 --> 00:36:40.760
Pandas are polar's polar's has some really nice benefits like selectors.

00:36:40.760 --> 00:36:44.860
And then it also, it's used quite a bit whenever we style a table.

00:36:44.860 --> 00:36:50.400
We often use polar's expressions to kind of target the areas to style.

00:36:50.400 --> 00:36:56.360
So if you want to choose like for this column, make the maximum value of the column yellow.

00:36:56.360 --> 00:37:03.800
It's really easy with polar's expressions to say, you know, when this column is equal to

00:37:03.800 --> 00:37:06.340
the max value in itself.

00:37:06.340 --> 00:37:06.840
I see.

00:37:06.840 --> 00:37:07.460
Yeah.

00:37:07.460 --> 00:37:08.120
That's really cool.

00:37:08.120 --> 00:37:12.020
And because then you don't have to figure out what the max is and then try to come up

00:37:12.020 --> 00:37:13.460
with a gradient range of it.

00:37:13.460 --> 00:37:16.840
You just put it into little bins or whatever.

00:37:16.840 --> 00:37:17.080
Yeah.

00:37:17.080 --> 00:37:17.820
Yeah, exactly.

00:37:17.820 --> 00:37:18.520
Totally.

00:37:18.520 --> 00:37:23.160
One thing I just noticed that's pretty sweet about this actually is you, you already talked

00:37:23.160 --> 00:37:26.720
about the sources and the references and things like that.

00:37:26.900 --> 00:37:27.060
Yeah.

00:37:27.060 --> 00:37:31.120
But I just noticed that you have markdown support for your references.

00:37:31.120 --> 00:37:31.820
Yeah.

00:37:31.820 --> 00:37:32.380
That's a good one.

00:37:32.380 --> 00:37:37.360
Because like sometimes you want to bold italicize things, maybe make a list within your footer,

00:37:37.360 --> 00:37:38.300
your source notes.

00:37:38.300 --> 00:37:39.300
Yeah, sure.

00:37:39.300 --> 00:37:44.040
I mean, even in the official way you're supposed to reference things, there's stuff that's supposed

00:37:44.040 --> 00:37:45.960
to be italicized and stuff that's not right.

00:37:46.340 --> 00:37:46.640
Exactly.

00:37:46.640 --> 00:37:47.340
Yeah.

00:37:47.340 --> 00:37:52.780
So you want these tables to be useful for like a wide range of people.

00:37:52.780 --> 00:37:54.960
And if they didn't have that, I don't know what they would do.

00:37:54.960 --> 00:37:57.780
They'd just use HTML, I guess, and try their best with tags.

00:37:57.780 --> 00:38:01.680
But this is just an easy, obvious way to make it simple.

00:38:02.020 --> 00:38:02.740
Yeah, that's really great.

00:38:02.740 --> 00:38:04.720
So we start with some data.

00:38:04.720 --> 00:38:08.740
We load it ideally into polars, it sounds like, but pandas is also supported.

00:38:08.740 --> 00:38:15.240
And then you kind of visually, I say visually, the indentation of the way the code looks somewhat

00:38:15.240 --> 00:38:17.120
represents the structure of the table.

00:38:17.120 --> 00:38:21.040
A little Flutter or HTML-esque in that sense.

00:38:21.040 --> 00:38:21.820
Yeah.

00:38:21.820 --> 00:38:22.500
Yeah, totally.

00:38:22.500 --> 00:38:28.980
I think we think a lot of it about in terms of three main activities, structure, format,

00:38:29.180 --> 00:38:33.680
and style, and we've tried to make the method names match up a bit.

00:38:33.680 --> 00:38:37.940
So everything starting with tab is basically about structuring the table.

00:38:37.940 --> 00:38:43.180
So that's those big pieces in the diagram we looked at, whether it's setting the title with

00:38:43.180 --> 00:38:47.480
tab title or tab header or setting footnotes.

00:38:47.480 --> 00:38:49.820
Those are all structure activities.

00:38:49.820 --> 00:38:51.120
So they all start with tab.

00:38:51.120 --> 00:38:54.500
And then there's this just incredible bucket of formatters.

00:38:54.500 --> 00:38:57.800
Rich really went ham on formatting methods.

00:38:57.980 --> 00:39:00.020
So it's everything starting with FMT.

00:39:00.020 --> 00:39:01.840
This is like, yeah.

00:39:01.840 --> 00:39:02.400
Yeah.

00:39:02.400 --> 00:39:08.520
This is like, maybe you want to format the number of decimal places, but Rich has gone even further

00:39:08.520 --> 00:39:12.400
to like, maybe you want to put like a country flag in your table.

00:39:12.400 --> 00:39:14.780
Rich has got you.

00:39:14.780 --> 00:39:17.880
He wanted it to be easy for country flags.

00:39:17.880 --> 00:39:18.880
And I'm here for it.

00:39:19.400 --> 00:39:19.620
Yeah.

00:39:19.620 --> 00:39:24.660
So those little graphical elements are amazing for quickly conveying information.

00:39:24.660 --> 00:39:29.020
Kind of like the logo of the various universities that you would see on SportsCenter or whatever.

00:39:29.020 --> 00:39:30.740
You're like, yeah, that's what I'm used to looking at.

00:39:30.740 --> 00:39:31.140
Yeah.

00:39:31.140 --> 00:39:31.500
That's right.

00:39:31.500 --> 00:39:32.820
You just use format image for that.

00:39:32.820 --> 00:39:33.700
And you just, yeah.

00:39:33.700 --> 00:39:35.840
Give it an image on disk or wherever.

00:39:35.840 --> 00:39:37.700
And it gets in there.

00:39:38.040 --> 00:39:38.160
Yeah.

00:39:38.160 --> 00:39:38.540
Yeah.

00:39:38.540 --> 00:39:42.120
And I was kind of confused why I was adding so many formatters at first.

00:39:42.120 --> 00:39:46.500
But I feel like the thing that really clicked for me is that if you think about, so if you

00:39:46.500 --> 00:39:52.700
go, actually, if you go up to the very top and then into the reference on the top bar, that

00:39:52.700 --> 00:39:55.680
will have lots of formatters under, yeah, format.

00:39:55.680 --> 00:39:56.320
Yeah.

00:39:56.320 --> 00:39:57.760
They're just listed out.

00:39:57.760 --> 00:40:02.360
So what clicked for me is that spreadsheet users.

00:40:02.360 --> 00:40:07.780
So people in Excel making a table are really used to tons of convenient things like formatting

00:40:07.780 --> 00:40:08.900
dates, formatting.

00:40:08.900 --> 00:40:09.120
Right.

00:40:09.120 --> 00:40:13.700
You highlight a column, you press currency, then you press the move, the decimal point, two points

00:40:13.700 --> 00:40:16.840
to the left to drop the portion, the partial ones and all that.

00:40:16.840 --> 00:40:17.040
Yeah.

00:40:17.040 --> 00:40:17.560
Yeah.

00:40:17.560 --> 00:40:22.220
So there's a world like the engineer in me thought like, ooh, I kind of wish this wasn't

00:40:22.220 --> 00:40:24.240
our job to do all this formatting.

00:40:24.240 --> 00:40:30.000
But I think Rich very intuitively picked up on like, well, if people use Excel for tables,

00:40:30.000 --> 00:40:35.880
I think you have to give them a compelling reason to be able to do it all in Python, or

00:40:35.880 --> 00:40:37.780
they're not going to really want to make the jump.

00:40:37.780 --> 00:40:42.180
And so I think having all these formatters is just a way of bringing that kind of nuts

00:40:42.180 --> 00:40:45.740
aspect of Excel into great tables.

00:40:45.740 --> 00:40:49.420
And some of this stuff is tough and fiddly if you do it yourself.

00:40:49.420 --> 00:40:51.880
I'm not just talking about simple format.

00:40:51.880 --> 00:40:52.760
Like strings.

00:40:52.760 --> 00:40:53.000
Yeah.

00:40:53.000 --> 00:40:53.060
Yeah.

00:40:53.060 --> 00:40:53.520
I'm talking about.

00:40:53.520 --> 00:40:53.880
Yeah.

00:40:53.880 --> 00:40:57.840
Can I do like a colon and then a comma and then a 0.2 and we're done?

00:40:57.840 --> 00:40:58.100
Yeah.

00:40:58.100 --> 00:40:58.960
First you got to do that.

00:40:58.960 --> 00:41:01.000
And then like, there might be some other weird things.

00:41:01.000 --> 00:41:05.940
So we try to like make it super simple with just some simple options, some arguments and

00:41:05.940 --> 00:41:06.720
you're pretty much there.

00:41:06.720 --> 00:41:07.200
Yeah.

00:41:07.200 --> 00:41:09.260
One thing I'll maybe give a shout out.

00:41:09.260 --> 00:41:14.080
I know you talked about it, PyCon, was if you've got a bunch of numbers, like let's say

00:41:14.080 --> 00:41:14.640
it's currency.

00:41:14.640 --> 00:41:20.600
You might want to format that using like, if it's over a million, 1.2 M.

00:41:20.600 --> 00:41:25.600
But if it's only 120,000, you might want to say 120 K.

00:41:25.600 --> 00:41:26.100
Yeah.

00:41:26.100 --> 00:41:26.600
Right.

00:41:26.600 --> 00:41:27.760
Something where it's.

00:41:27.760 --> 00:41:28.360
Yeah.

00:41:28.680 --> 00:41:30.060
You don't need sort of an abbreviator.

00:41:30.060 --> 00:41:30.460
Yeah.

00:41:30.460 --> 00:41:33.980
It's, it's also useful if you have like tons and tons of numbers, like a wall of numbers,

00:41:33.980 --> 00:41:35.020
you're running out of space.

00:41:35.020 --> 00:41:36.180
So you just need to compactly.

00:41:36.180 --> 00:41:38.340
And like the small figures don't really mean much.

00:41:38.340 --> 00:41:39.560
Like you just want broad strokes.

00:41:39.560 --> 00:41:41.340
Like it just can be the compact thing.

00:41:41.340 --> 00:41:41.880
It's great.

00:41:41.880 --> 00:41:45.500
And it works really well for like things where you don't need to have that much precision.

00:41:45.500 --> 00:41:46.180
Based on the.

00:41:46.180 --> 00:41:47.180
Yeah.

00:41:47.180 --> 00:41:52.660
You also seem to have taken a pragmatic approach where it's not like, well, you're not, we're

00:41:52.660 --> 00:41:55.360
not going to let you mix units in a column.

00:41:55.360 --> 00:41:55.880
Right.

00:41:55.880 --> 00:42:00.240
If it's, it's not, you know, kilometers and meters, like it's all kilometers.

00:42:00.240 --> 00:42:01.120
It's all meters.

00:42:01.120 --> 00:42:02.220
Take it or leave it.

00:42:02.220 --> 00:42:02.540
You know?

00:42:02.540 --> 00:42:02.900
Yeah.

00:42:02.900 --> 00:42:03.080
I think.

00:42:03.080 --> 00:42:04.840
Freedom, baby.

00:42:04.840 --> 00:42:05.380
That's what you want.

00:42:05.380 --> 00:42:07.280
You can like, you can target.

00:42:07.280 --> 00:42:11.600
So we have like a column targeting system, but you can also like sort of like subset,

00:42:11.800 --> 00:42:13.020
like what rows you want.

00:42:13.020 --> 00:42:14.100
So that's the way.

00:42:14.100 --> 00:42:18.780
So basically you can like format different ways down the column if you so choose to, which

00:42:18.780 --> 00:42:19.720
makes it more flexible.

00:42:19.720 --> 00:42:20.120
Yeah.

00:42:20.120 --> 00:42:24.840
I think, I think it goes back to, to Excel and, you know, Excel is just a big lump of

00:42:24.840 --> 00:42:25.120
clay.

00:42:25.120 --> 00:42:27.660
You can just carve out your table however you want.

00:42:27.660 --> 00:42:30.780
And it, it does like do formatting, but it doesn't prescribe.

00:42:30.780 --> 00:42:31.080
Yeah.

00:42:31.080 --> 00:42:35.380
Like you said, it doesn't constrain you to have to like do it for a whole column.

00:42:35.380 --> 00:42:41.240
And I think that's like, we're endlessly surprised by the types of tables people create and the

00:42:41.240 --> 00:42:42.180
things they communicate.

00:42:42.180 --> 00:42:48.140
And in a way it's like leaving room for surprise that people are so creative.

00:42:48.140 --> 00:42:54.720
You, you want some constraints, but you kind of also want to let them surprise you with things

00:42:54.720 --> 00:42:57.600
you wouldn't think of, but that end up being really useful.

00:42:57.600 --> 00:43:02.960
And I don't doubt someone's there like mixing all kinds of things in ways I wouldn't

00:43:02.960 --> 00:43:05.340
imagine, but end up kind of working out.

00:43:05.340 --> 00:43:08.720
I think it was like in our table contests where I was like first surprised.

00:43:08.720 --> 00:43:13.240
Basically we, we, we throw together table contests at, at posit.

00:43:13.240 --> 00:43:17.340
It's such a nerdy thing, but like people submit tables and they get judged on them.

00:43:17.340 --> 00:43:18.600
Like they, they get prizes.

00:43:18.600 --> 00:43:19.560
Everyone's a winner.

00:43:19.560 --> 00:43:21.820
Rich is a very kind judge to be sure.

00:43:21.820 --> 00:43:25.280
It's like everybody wins in Rich's house.

00:43:25.540 --> 00:43:25.780
Yeah.

00:43:25.780 --> 00:43:27.560
But they're so good.

00:43:27.560 --> 00:43:29.980
Like when I see his tables, I'm like, I never even thought of that.

00:43:29.980 --> 00:43:30.980
Like that, that could be done.

00:43:30.980 --> 00:43:32.020
You'd want to do that.

00:43:32.020 --> 00:43:33.260
And I actually like it.

00:43:33.260 --> 00:43:36.460
Like, yeah, it's actually inspiring every time.

00:43:36.460 --> 00:43:41.700
It's gotta be pretty hard to build a framework around such a visual flexibility, you know?

00:43:41.700 --> 00:43:42.140
Yeah.

00:43:42.140 --> 00:43:44.360
But still have some kind of something prescriptive, right?

00:43:44.960 --> 00:43:45.180
Yeah.

00:43:45.180 --> 00:43:51.220
I guess the trick is just like have easy conveniences just to do broad swaths of formatting and styling,

00:43:51.220 --> 00:43:52.780
but also make it granular.

00:43:52.780 --> 00:43:55.940
Give people power, I guess you could say with, along with simplicity.

00:43:55.940 --> 00:43:56.460
Yeah.

00:43:56.460 --> 00:43:57.880
So tell people about these contests.

00:43:57.880 --> 00:44:02.900
If somebody wants to try, try their hand at great tables and submitting something, you know,

00:44:02.900 --> 00:44:06.020
I think we're even in the advent of code time.

00:44:06.020 --> 00:44:09.880
And I guess we just had the hour of code stuff, but there's a lot of these things where people

00:44:09.880 --> 00:44:13.460
are trying, I just need some examples to play with, to try to, to learn a thing.

00:44:13.460 --> 00:44:13.780
Right?

00:44:13.780 --> 00:44:14.280
Yeah.

00:44:14.380 --> 00:44:17.940
So we do it in the summer, so not wintertime, which is actually good for submissions.

00:44:17.940 --> 00:44:18.840
So it's still coming up.

00:44:18.840 --> 00:44:19.060
Yeah.

00:44:19.060 --> 00:44:19.580
Yeah.

00:44:19.580 --> 00:44:23.980
And we give a generous amount of time, I think like two or three months, if I remember correctly.

00:44:23.980 --> 00:44:27.200
But yeah, we just, we just made the call, say, submit your table.

00:44:27.200 --> 00:44:30.040
We have a nice form and people submit them.

00:44:30.040 --> 00:44:33.640
And we sometimes get up to 50, not 80 entries.

00:44:33.640 --> 00:44:34.960
It's like, we get quite a few.

00:44:34.960 --> 00:44:40.280
And then we, we do the tough job of, you know, having a number of judges and just, you know,

00:44:40.280 --> 00:44:42.460
multiple judge grading of the tables.

00:44:42.880 --> 00:44:45.720
And we had so many that we had to split them up into categories, right?

00:44:45.720 --> 00:44:49.200
Because we were going to celebrate all these different types of tables and different domains

00:44:49.200 --> 00:44:52.560
of, you know, have typically different types of tables.

00:44:52.560 --> 00:44:55.300
And so it just makes sense to break it up in that way.

00:44:55.300 --> 00:44:55.840
Yeah.

00:44:56.080 --> 00:45:00.340
And I do, if I had to give advice, it's like much more free form than a lot of the advent

00:45:00.340 --> 00:45:00.820
of code.

00:45:00.820 --> 00:45:05.120
There's no, because there's no target or even necessarily starting point.

00:45:05.120 --> 00:45:09.400
It could be really hard for some people, I think, to get started or figure out like, what

00:45:09.400 --> 00:45:10.340
could I do with this?

00:45:10.340 --> 00:45:15.480
But I think if I had to give any advice, I think looking through the past entries is so

00:45:15.480 --> 00:45:20.460
helpful, like scanning past entries and even choosing some that inspire you.

00:45:20.860 --> 00:45:25.320
And then whether it's, whether you take data similar to those and maybe try to do something

00:45:25.320 --> 00:45:30.100
related or go in like a similar direction and look for new data.

00:45:30.100 --> 00:45:33.940
I think the existing entries are really, really inspiring.

00:45:33.940 --> 00:45:35.300
I, if I had to-

00:45:35.300 --> 00:45:36.680
Get that creative juices flowing, right?

00:45:36.680 --> 00:45:38.900
Like, oh, I didn't even think you could go down that direction.

00:45:38.900 --> 00:45:40.480
Let's try that with my data.

00:45:40.820 --> 00:45:41.060
Yeah.

00:45:41.060 --> 00:45:41.160
Yeah.

00:45:41.160 --> 00:45:46.200
Because I think if you start with just a blank page and you're kind of new, even to

00:45:46.200 --> 00:45:48.300
great tables, it can be hard to know where to go.

00:45:48.300 --> 00:45:51.920
But once you start looking at entries, I think you get a feel for all the kinds of things you

00:45:51.920 --> 00:45:53.040
can do with it.

00:45:53.040 --> 00:45:54.540
Oh, that sounds great.

00:45:54.540 --> 00:45:58.860
How important is it that you have interesting data to start with?

00:45:58.860 --> 00:46:04.960
Like, hey, let's grab the data that they use to image the first black hole, try to make

00:46:04.960 --> 00:46:07.680
a cool picture out of, you know, table picture out of that.

00:46:07.680 --> 00:46:09.020
That's a great question.

00:46:09.020 --> 00:46:14.020
I think it really hits on one of the neat things about these contests is that you don't

00:46:14.020 --> 00:46:15.460
have to have interesting data at all.

00:46:15.460 --> 00:46:18.960
Actually, one category of entry is kind of zany.

00:46:18.960 --> 00:46:25.780
It's like recreating something that exists in, say, like great tables or some other library.

00:46:25.780 --> 00:46:29.860
Like Rich and I were talking recently about GitHub issues.

00:46:29.860 --> 00:46:35.360
So like GitHub issues are a really interesting example of a table because they're a table that

00:46:35.360 --> 00:46:37.660
software developers work with nonstop.

00:46:37.660 --> 00:46:41.680
Like I'm all in those tables all day.

00:46:41.680 --> 00:46:46.360
And it's like an interesting entry would just be to recreate that.

00:46:46.360 --> 00:46:52.320
Like if you recreated GitHub issues in a table and it looked really spot on, that's like its

00:46:52.320 --> 00:46:54.320
own kind of special accomplishment.

00:46:55.160 --> 00:47:02.160
Like, and I think those entries are fun to see like someone recreate an existing thing in great tables or something else.

00:47:02.760 --> 00:47:12.860
So that, so yeah, to your point on data, I think you could start with even not having to find interesting data, but find an interesting table out in the wild and just try to
recreate it.

00:47:12.860 --> 00:47:13.280
Yeah.

00:47:13.540 --> 00:47:22.900
So I don't know if this has anything to do with your contest or not, but let me suggest an interesting angle to this in terms of like competitions for this or just broadly
for people who are listening.

00:47:23.100 --> 00:47:24.940
One is I've got really interesting data.

00:47:24.940 --> 00:47:29.860
I have a story to tell and let me try to like really inspire you with my custom story.

00:47:29.860 --> 00:47:36.060
You know, if you look at racing, like specifically auto racing, we've got F1 where everyone designs their own car.

00:47:36.060 --> 00:47:40.400
There are some rules, but they kind of, they all have a thousand or 500 people that work on it.

00:47:40.440 --> 00:47:47.320
Then you've got spec racing series, like Indy, where everyone has the same car, the same engine, or there's two choices, whatever, same thing.

00:47:47.320 --> 00:47:48.340
And then they compete.

00:47:48.340 --> 00:47:52.220
So it would be interesting to have a category that is like, this is the data.

00:47:52.220 --> 00:47:54.920
You have to work with this, but tell a story.

00:47:54.920 --> 00:48:00.640
Like who could tell the story the most interesting with like the same data, which sounds a little bit Kaggle-like, I suppose.

00:48:00.640 --> 00:48:01.180
Yeah.

00:48:01.180 --> 00:48:02.460
Or Tidy.

00:48:02.460 --> 00:48:03.720
Have you seen Tidy Tuesday?

00:48:03.720 --> 00:48:04.900
Tidy Tuesday?

00:48:04.900 --> 00:48:05.500
Yeah.

00:48:05.500 --> 00:48:06.080
Tidy Tuesday.

00:48:06.080 --> 00:48:07.840
I think it's exactly what you're describing.

00:48:07.840 --> 00:48:09.740
Every Tuesday they release a data set.

00:48:09.740 --> 00:48:10.160
Yeah.

00:48:10.300 --> 00:48:12.600
And then people, oh, wow.

00:48:12.600 --> 00:48:16.800
It's very, there's a GitHub repo somewhere where they.

00:48:16.800 --> 00:48:17.360
Yeah.

00:48:17.360 --> 00:48:19.760
If you search for Tidy Tuesday GitHub, you'll definitely find it.

00:48:19.760 --> 00:48:24.700
But essentially, yeah, it's just like data and you're, you left your own devices about how to present it.

00:48:24.700 --> 00:48:26.780
It could be tables, plots, anything.

00:48:26.780 --> 00:48:27.340
Yeah.

00:48:27.340 --> 00:48:30.500
I'm surprised the big Tidy Tuesdays, it's kind of a tricky one.

00:48:30.500 --> 00:48:39.680
There's a, I think there's a Tidy Tuesday organization, but yeah, same data and yeah, people analyze it and then they share it out on socials.

00:48:39.680 --> 00:48:40.020
Yeah.

00:48:40.160 --> 00:48:45.320
So you get to, I think exactly to your point, like you start from the same place and you see where people get to.

00:48:45.320 --> 00:48:52.960
And I know like one R user, Dave Robinson for a long time, would screencast himself live analyzing for an hour.

00:48:52.960 --> 00:48:53.760
Oh, wow.

00:48:53.760 --> 00:48:54.120
Okay.

00:48:54.120 --> 00:48:57.600
So he plots like, what does it look like for someone to analyze the data?

00:48:57.920 --> 00:49:01.260
And I think that's, that's a fun dimension too, that you don't see often.

00:49:01.260 --> 00:49:03.160
Like just how does it unfold?

00:49:03.160 --> 00:49:03.960
Like, right.

00:49:03.960 --> 00:49:05.260
What point does he plot?

00:49:05.260 --> 00:49:06.700
And when does he go backwards?

00:49:06.700 --> 00:49:15.060
It's like the Bob Ross of, of tables, you know, like the happy little trees come first and then this and that, oh, that's how you make that picture.

00:49:15.060 --> 00:49:15.380
Okay.

00:49:15.380 --> 00:49:15.880
Right.

00:49:15.880 --> 00:49:16.920
It does take time.

00:49:16.920 --> 00:49:17.360
Yeah.

00:49:17.580 --> 00:49:19.420
I mean, like just yesterday I was making new examples.

00:49:19.420 --> 00:49:22.520
I'm not surprised how long it takes to make a compelling example for a table.

00:49:22.520 --> 00:49:23.680
It's like, thanks time.

00:49:23.680 --> 00:49:25.060
You have to mess with the data.

00:49:25.060 --> 00:49:25.680
Yeah.

00:49:25.680 --> 00:49:30.400
And I will say this, this coffee table example that Marco pointed out.

00:49:30.400 --> 00:49:39.960
So the coffee table example for people listening is, it's an example table we created where every row is a like coffee device.

00:49:39.960 --> 00:49:46.760
So it's the idea of this table is for like a fictional coffee device shop and every row is a coffee device.

00:49:46.760 --> 00:49:50.800
And then there are columns on like, oh, how many did we sell?

00:49:50.800 --> 00:49:52.640
How much profit did we make?

00:49:52.640 --> 00:49:59.560
And then there's a nice little, there's a column that's little bar charts, that show the monthly sales broken down.

00:50:00.000 --> 00:50:02.580
try hovering over one of those bars.

00:50:02.580 --> 00:50:03.160
Yeah.

00:50:03.160 --> 00:50:03.400
Yeah.

00:50:03.400 --> 00:50:03.520
Yeah.

00:50:03.520 --> 00:50:03.680
Yeah.

00:50:03.680 --> 00:50:11.900
So this is one of the things I wanted to make sure that we got a chance to talk about, because this is, we've talked about having images in here, which is great.

00:50:11.900 --> 00:50:14.100
And the, what is this thing called?

00:50:14.100 --> 00:50:17.140
That this group spanner, I can only think splitter.

00:50:17.140 --> 00:50:26.160
I'm like, no, it's not the spanners and the colors and stuff there, but then you have what in the framework referred to as nano plots.

00:50:26.160 --> 00:50:26.600
Yeah.

00:50:26.600 --> 00:50:26.960
Right.

00:50:27.040 --> 00:50:32.140
So that we already saw the bar graph, but that was just an example, but here we've got like a little bar chart.

00:50:32.140 --> 00:50:36.400
And Rich, as you point out, as I interact with it, it's, it's like a little plotly type thing.

00:50:36.400 --> 00:50:40.160
Like if I had, if I were real young and my eyes were real good, I could read that.

00:50:40.160 --> 00:50:45.420
Well, they're very small, but you have very low space.

00:50:45.420 --> 00:50:47.260
So like, I mean, they're nano size.

00:50:47.260 --> 00:50:48.280
That's why they're nano size.

00:50:48.280 --> 00:50:49.420
They're not even micro plots.

00:50:49.420 --> 00:50:50.260
They're just nano plots.

00:50:50.820 --> 00:50:51.220
Exactly.

00:50:51.220 --> 00:50:51.820
But yeah.

00:50:51.820 --> 00:50:52.840
That's all we got here.

00:50:52.840 --> 00:50:56.680
They're meant for HTML and meant to be lightweight, slightly interactive.

00:50:56.680 --> 00:51:01.340
Just to give you a little something, you know, to, to mouse over and to, to drill down.

00:51:01.340 --> 00:51:09.100
Massively important because it shows you it's, I had Stephanie, Stephanie Molin on a little

00:51:09.100 --> 00:51:14.200
while ago and she has this project that sort of, if you want the same information about the

00:51:14.200 --> 00:51:20.100
statistical summary of some set of data, like the standard distribution, the mean, the max,

00:51:20.100 --> 00:51:25.040
the min, and it could be like one little blob or she has this thing, it'll animate it into

00:51:25.040 --> 00:51:26.520
like a kangaroo or something.

00:51:26.520 --> 00:51:28.540
And then it's, it's got all the same information.

00:51:28.540 --> 00:51:30.380
You have the same problem with tables here, right?

00:51:30.380 --> 00:51:32.960
Like the total amount sold, the percent sold.

00:51:32.960 --> 00:51:38.160
But if you look at the nano plots, some of them are really spotty and some of them are

00:51:38.160 --> 00:51:41.740
pretty much flat and that it tells you a whole nother dimension.

00:51:41.740 --> 00:51:43.800
That's kind of, this is kind of what I was getting at.

00:51:43.800 --> 00:51:47.160
Like you could make this multi-dimensional and that that's another piece of communication

00:51:47.160 --> 00:51:50.320
that isn't just, you know, rows and columns.

00:51:50.320 --> 00:51:50.700
Yeah.

00:51:50.700 --> 00:51:54.480
It's a nice conversation too, because each of those bars could variable be a column, right?

00:51:54.480 --> 00:51:56.580
I can have like a January column all the way up to.

00:51:56.580 --> 00:51:57.200
Yeah, exactly.

00:51:57.200 --> 00:51:57.880
Yeah.

00:51:57.880 --> 00:51:59.380
So it just shrinks it down.

00:51:59.380 --> 00:52:00.140
And it's useful.

00:52:00.140 --> 00:52:03.460
So you're having a table and a plot and you got to like jump back and forth.

00:52:03.460 --> 00:52:06.460
Like it's, it emerges these two ideas in a pretty cool way.

00:52:06.460 --> 00:52:06.760
Yeah.

00:52:06.760 --> 00:52:09.040
Sort of explain the difference between tables and plots.

00:52:09.040 --> 00:52:14.480
I like too, that with the nano plots, like these little bar charts, maybe their job, like

00:52:14.480 --> 00:52:17.480
in a lot of tables, their job is to focus you onto a row.

00:52:17.480 --> 00:52:22.280
Like if you notice that pattern's interesting, it pulls you onto that record, that row.

00:52:22.280 --> 00:52:28.220
And then that lets you visit other columns to see like supplemental information that maybe

00:52:28.220 --> 00:52:33.100
suggests what could be happening or like gives you information to look up more as you're doing

00:52:33.100 --> 00:52:33.680
an analysis.

00:52:33.880 --> 00:52:39.600
So it's kind of a neat, like visual pattern as a way to index onto interesting cases.

00:52:39.600 --> 00:52:44.840
And then table columns have the power to give you more information about these cases.

00:52:44.840 --> 00:52:45.960
Yeah, that's cool.

00:52:45.960 --> 00:52:50.120
It seems like because you can put markdown into these pieces as well, you could have them

00:52:50.120 --> 00:52:55.120
maybe jump to the full size plot or something more, more rich as you want to kind of expand

00:52:55.120 --> 00:52:56.300
a row or something.

00:52:56.580 --> 00:52:57.080
Yeah, totally.

00:52:57.080 --> 00:53:01.020
I think there are interactive table libraries too.

00:53:01.020 --> 00:53:05.200
So one we have ported to Python recently is called Reactable.

00:53:05.200 --> 00:53:10.140
So we made a port called ReactablePy that it offers expanding tables.

00:53:10.140 --> 00:53:17.140
So if you're interested in a row, you can click it to expand down, say like more information

00:53:17.140 --> 00:53:20.220
or even a lot of like detail and description.

00:53:21.000 --> 00:53:25.520
But I think to your point, yeah, that's a really neat possibility of being able to like

00:53:25.520 --> 00:53:30.160
click and either be taken somewhere or have the table like open up.

00:53:30.160 --> 00:53:33.980
And yeah, that would be cool to have an inline capability.

00:53:33.980 --> 00:53:35.160
Yeah, I do.

00:53:35.160 --> 00:53:40.140
I do want to note one thing about this table that I think about a lot is we I'm so glad that

00:53:40.140 --> 00:53:40.860
Marco brought up.

00:53:40.860 --> 00:53:43.580
It was useful because we spent a long time.

00:53:43.580 --> 00:53:46.600
We spent, I think, a couple of weeks creating this table.

00:53:46.740 --> 00:53:53.320
And I talk about this with open source developers sometimes that I think about this, like how

00:53:53.320 --> 00:53:59.700
long we spent on this table, because this table's job was to illustrate like structuring, formatting

00:53:59.700 --> 00:54:05.220
and styling in like what should be like your first encounter with great tables.

00:54:05.220 --> 00:54:10.920
And so we really, in a sense, as we created this table, we were on the hunt for a table that

00:54:10.920 --> 00:54:17.320
both introduced people to a range of activities, like looked nice, but also had code that we

00:54:17.320 --> 00:54:18.560
could explain.

00:54:18.560 --> 00:54:20.420
And I it's like so hard.

00:54:20.420 --> 00:54:26.120
I feel like as open source maintainers sometimes to find that like right example, like compelling

00:54:26.120 --> 00:54:30.460
shows off like a range of activities, but also is approachable.

00:54:31.060 --> 00:54:35.680
And I do remember like Marco, one thing that opened my eyes is he, I think he shared this

00:54:35.680 --> 00:54:39.860
table on LinkedIn once, but he shortened it to like three or four rows.

00:54:39.860 --> 00:54:44.900
And that I'm always really interested in seeing those types of activities because I think that

00:54:44.900 --> 00:54:46.040
post really took off.

00:54:46.040 --> 00:54:52.660
And it, I don't know, it always like teaches me the power and the value of really like getting

00:54:52.660 --> 00:54:54.960
an example down and getting it.

00:54:55.040 --> 00:55:00.080
So it's interesting, but also like short and compact is like such a art that some people

00:55:00.080 --> 00:55:01.240
are so good at.

00:55:01.240 --> 00:55:01.580
Yeah.

00:55:01.580 --> 00:55:02.340
It's, it's very cool.

00:55:02.340 --> 00:55:03.580
We don't have much time left.

00:55:03.580 --> 00:55:09.020
So I want to focus on the last bit of this journey that data goes through great tables.

00:55:09.020 --> 00:55:12.800
And that is what happens, where does it go at the end?

00:55:12.800 --> 00:55:15.280
You know, like what can I export?

00:55:15.280 --> 00:55:16.040
Yeah.

00:55:16.040 --> 00:55:22.220
So we talked about HTML and this interactive bit, but what are the different places that you

00:55:22.220 --> 00:55:23.120
could send this to?

00:55:23.340 --> 00:55:24.880
Well, I think the big ones are notebook.

00:55:24.880 --> 00:55:27.600
You're just iterating through some data and you want a table.

00:55:27.600 --> 00:55:28.840
Maybe you want to present that as well.

00:55:28.840 --> 00:55:30.660
So notebook is like a really good example.

00:55:30.660 --> 00:55:35.140
So maybe you put that actually just in a cell and just as part of the notebook, it just runs

00:55:35.140 --> 00:55:35.340
there.

00:55:35.340 --> 00:55:35.520
Yeah.

00:55:35.520 --> 00:55:36.020
That's right.

00:55:36.020 --> 00:55:36.400
That's right.

00:55:36.400 --> 00:55:40.660
And another one is just like, you want it somewhere else and maybe you want it in a presentation.

00:55:40.660 --> 00:55:41.560
You want a graphic.

00:55:41.560 --> 00:55:42.940
So we have a facility for that.

00:55:42.940 --> 00:55:43.880
It's the save method.

00:55:43.880 --> 00:55:47.700
We just like you get a image file or even a PDF from the table.

00:55:47.700 --> 00:55:51.540
And sometimes you just want to take that HTML and run with it somewhere else, maybe embedded somewhere,

00:55:51.720 --> 00:55:52.800
maybe put it inside of an email.

00:55:52.800 --> 00:55:58.940
So we have an as raw HTML method, which gives you an HTML string that you can just like pop

00:55:58.940 --> 00:55:59.740
in somewhere else.

00:55:59.740 --> 00:55:59.840
Nice.

00:55:59.840 --> 00:56:05.620
And does that just give you like the worst possible HTML in the sense that like everything that

00:56:05.620 --> 00:56:08.900
has a color has a style set straight on it and stuff like that?

00:56:08.900 --> 00:56:10.840
You have two different stages.

00:56:10.840 --> 00:56:14.860
You can have it like the style block, sort of like as a one div with the table and the

00:56:14.860 --> 00:56:16.320
style block embedded.

00:56:16.320 --> 00:56:19.640
Or you can have all the styles in line, which is a new feature, which is actually useful for

00:56:19.640 --> 00:56:19.960
emails.

00:56:19.960 --> 00:56:21.100
Yeah, exactly.

00:56:21.100 --> 00:56:26.180
Because as much as you want to write nice stuff, we can't have nice things because a lot of

00:56:26.180 --> 00:56:28.900
the email clients forbid you from putting styles in there.

00:56:28.900 --> 00:56:30.420
It's most notably Gmail.

00:56:30.880 --> 00:56:34.080
If you put a style, even a solid style block, it'll just throw it away.

00:56:34.080 --> 00:56:36.100
So you've got to just jam it onto everything.

00:56:36.100 --> 00:56:40.980
If that thing can be bold, it's in a span and it has, you know, style, font weight bold

00:56:40.980 --> 00:56:41.640
on it, you know?

00:56:41.640 --> 00:56:44.920
When I first learned of that like years ago, because I'm in the email game as well.

00:56:44.920 --> 00:56:45.940
I was like, really?

00:56:45.940 --> 00:56:48.560
How does this exist in this year?

00:56:48.560 --> 00:56:49.540
But it does.

00:56:49.540 --> 00:56:51.820
It still exists because of certain clients.

00:56:52.060 --> 00:56:55.780
So, yeah, but luckily there's lots of like great, and we have it here too, but there's

00:56:55.780 --> 00:56:59.860
lots of people who have developed libraries to inline CSS into tags.

00:56:59.860 --> 00:57:00.420
Yeah.

00:57:00.420 --> 00:57:00.840
Yeah.

00:57:00.840 --> 00:57:02.000
That's the right purpose.

00:57:02.000 --> 00:57:07.360
I guess one more output, sorry, is a little attack, right?

00:57:07.360 --> 00:57:07.720
Yeah.

00:57:07.720 --> 00:57:08.840
As the final destination.

00:57:08.840 --> 00:57:09.400
Yeah.

00:57:09.400 --> 00:57:10.140
That's a new thing.

00:57:10.140 --> 00:57:14.560
So if you're running a paper, you want a table in it, we now have some way to get the

00:57:14.560 --> 00:57:15.780
table in attack.

00:57:15.780 --> 00:57:19.640
If you want your academic paper or your dissertation to have it, like, in it goes.

00:57:19.640 --> 00:57:20.060
Yeah.

00:57:20.060 --> 00:57:21.280
Sorry, Michael, what were you going to say?

00:57:21.520 --> 00:57:26.760
Oh, no, I think one interesting thing too, is I think .show, we have a really great contributor,

00:57:26.760 --> 00:57:29.580
Ju Young, that prompted this.

00:57:29.580 --> 00:57:35.680
I think because he was teaching a workshop to vision impaired, like data scientists.

00:57:35.680 --> 00:57:40.860
And so .show is handy to be able to call .show and have it open a browser with the table, I

00:57:40.860 --> 00:57:42.240
think was like really useful.

00:57:42.240 --> 00:57:45.800
And that was so helpful to have as a issue.

00:57:45.800 --> 00:57:50.440
And I think that contribution to GreatTable is really huge.

00:57:50.980 --> 00:57:51.480
Yeah.

00:57:51.480 --> 00:57:51.480
Yeah.

00:57:51.480 --> 00:57:53.620
Because then a screen reader could read it.

00:57:53.620 --> 00:57:54.060
Exactly.

00:57:54.060 --> 00:57:54.560
Yeah.

00:57:54.560 --> 00:57:54.560
Yeah.

00:57:54.560 --> 00:57:55.060
Yeah.

00:57:55.060 --> 00:57:55.760
Facility for that.

00:57:55.760 --> 00:58:00.440
But also it's kind of disappointing to work in the console and not have anything being shown.

00:58:00.440 --> 00:58:01.440
It's like, what?

00:58:01.440 --> 00:58:02.440
Yeah.

00:58:02.440 --> 00:58:04.020
So that's really good.

00:58:04.020 --> 00:58:09.720
And I see Carol noted Quarto, which is actually the whole GreatTable's website is built with

00:58:09.720 --> 00:58:10.060
Quarto.

00:58:10.060 --> 00:58:11.060
Quarto.

00:58:11.060 --> 00:58:12.700
And that's a nice format.

00:58:12.700 --> 00:58:13.700
And that's a nice format.

00:58:13.700 --> 00:58:19.520
So it uses a file called a QMD, which is a lot like Markdown, but it can run the code.

00:58:19.520 --> 00:58:23.840
And Quarto is really convenient for building things like websites or HTML reports.

00:58:23.840 --> 00:58:25.820
And it's also developed by Posit.

00:58:25.820 --> 00:58:32.360
But we, yeah, we end up putting tables a lot in like Quarto documents or the like Great Tables

00:58:32.360 --> 00:58:32.880
website.

00:58:32.880 --> 00:58:33.280
Yeah.

00:58:33.280 --> 00:58:33.820
Through Quarto.

00:58:34.180 --> 00:58:37.940
And maybe he's too bashful to mention it, but he developed like the library Quarto doc,

00:58:37.940 --> 00:58:41.140
which makes this site possible and makes those tables rendered.

00:58:41.140 --> 00:58:42.300
Oh, that's awesome.

00:58:42.300 --> 00:58:42.500
Like Michael.

00:58:42.500 --> 00:58:42.980
That is.

00:58:42.980 --> 00:58:43.420
Oh, yeah.

00:58:43.420 --> 00:58:44.480
I guess for context.

00:58:44.480 --> 00:58:49.880
So like some tools like IBIS, their API docs and the Great Tables docs.

00:58:49.880 --> 00:58:50.480
Yeah.

00:58:50.480 --> 00:58:56.220
We just created a small tool called Quarto doc to let them put their like API references in

00:58:56.220 --> 00:58:57.800
these websites so they can use Quarto.

00:58:57.800 --> 00:58:58.360
Yeah.

00:58:58.360 --> 00:58:58.860
That's excellent.

00:58:58.860 --> 00:58:59.240
Yeah.

00:58:59.240 --> 00:58:59.800
Very, very cool.

00:58:59.800 --> 00:59:00.420
All right.

00:59:00.420 --> 00:59:03.120
Well, I think we're pretty much out of time.

00:59:03.220 --> 00:59:07.940
I guess give people a sense of where you're going, like roadmap type stuff.

00:59:07.940 --> 00:59:09.720
Is anything they should be looking out for?

00:59:09.720 --> 00:59:10.120
Yeah.

00:59:10.120 --> 00:59:14.300
I think we want to port quite a bit more from the R program over to Great Tables.

00:59:14.300 --> 00:59:18.960
That includes things like merging, concatenating values from different columns into single columns.

00:59:18.960 --> 00:59:21.840
Things like adding footnotes to tables.

00:59:21.840 --> 00:59:24.240
So the footer is more put to better use.

00:59:24.240 --> 00:59:27.740
And more refinements to formatters and additional formatters.

00:59:27.740 --> 00:59:29.440
There's quite a few more things to go.

00:59:29.440 --> 00:59:31.880
But even right now, it's pretty mature.

00:59:32.100 --> 00:59:35.120
But there's probably things people will ask for that I haven't thought of.

00:59:35.120 --> 00:59:36.920
So that's the nature of the game.

00:59:36.920 --> 00:59:38.500
I think Anon is asking for Excel.

00:59:38.500 --> 00:59:40.980
We'll put Excel in there, you know?

00:59:40.980 --> 00:59:41.440
Yeah.

00:59:41.440 --> 00:59:42.320
Yeah, I'll get to that.

00:59:42.320 --> 00:59:43.700
The snake will eat its own tail.

00:59:43.700 --> 00:59:46.520
Excel's a big one.

00:59:46.520 --> 00:59:50.980
We'll put Great Tables in Excel so you can just go all the way to the bottom, wherever that is.

00:59:51.760 --> 00:59:59.220
Well, I think one other thing to note is extensions that in R, tons of people have extended GT, the Great Tables for R.

00:59:59.220 --> 01:00:01.760
And tons of helper packages.

01:00:01.760 --> 01:00:09.760
Like if putting a bar in your table is something you want to do, there are a lot of these inside extra helper packages.

01:00:09.760 --> 01:00:20.720
And so I think one nice thing would be we want to kind of create a example helper package just to give a feel for how people in Python could also create this kind of stuff for
Great Tables.

01:00:20.960 --> 01:00:30.260
If you want to extend like, yeah, if you wanted to create your own little bar charts in Great Tables, it seems like people have done a lot of that in R.

01:00:30.260 --> 01:00:34.760
And so it'd be cool to try to foster that kind of ecosystem and extension.

01:00:34.760 --> 01:00:35.460
Absolutely.

01:00:35.460 --> 01:00:36.380
Yeah, that's awesome.

01:00:36.380 --> 01:00:36.860
All right.

01:00:36.860 --> 01:00:43.480
Well, I'm going to leave everybody with one parting thought, and then I'll let you guys give a final call to action.

01:00:43.480 --> 01:00:50.460
You're looking at some of these examples, especially those 10 ones that you called out, Rich, that I'll link in the show notes.

01:00:50.760 --> 01:01:03.260
If you're doing a presentation to your company on your blog as a data scientist or just generally, it's so easy, I think, to just have the tables and then maybe somewhere
you have a picture or something.

01:01:03.260 --> 01:01:07.760
But if you put something together like that, that will get people's attention straight away, right?

01:01:07.760 --> 01:01:11.140
It's just really another level of production.

01:01:11.140 --> 01:01:14.500
And the fact that you do it with Python means it's reproducible.

01:01:14.500 --> 01:01:16.080
You do it once and off it goes.

01:01:16.080 --> 01:01:17.060
Like that's pretty excellent.

01:01:17.060 --> 01:01:20.480
So if that sounds like something you all do, you should check out Great Tables.

01:01:20.480 --> 01:01:21.320
It looks pretty excellent.

01:01:21.320 --> 01:01:22.580
All right.

01:01:22.580 --> 01:01:25.360
Michael, give a final call to action.

01:01:25.360 --> 01:01:27.160
People wanting to get started with Great Tables, what do you tell them?

01:01:27.160 --> 01:01:28.440
You know what?

01:01:28.440 --> 01:01:31.780
Visit Great Tables, probably on GitHub.

01:01:31.780 --> 01:01:34.620
Check out the examples.

01:01:34.620 --> 01:01:37.660
I think the examples are such a helpful way to get started.

01:01:37.980 --> 01:01:44.360
And then if you get any questions at all, we have a Discord or we love hearing from people in the issues.

01:01:44.360 --> 01:01:45.720
You know, we want to hear from you.

01:01:45.720 --> 01:01:46.160
Read it all.

01:01:46.160 --> 01:01:48.480
We consider it pretty, you know, pretty carefully.

01:01:48.480 --> 01:01:50.660
Not carefully, but we want to do people.

01:01:50.660 --> 01:01:52.080
Like style pays.

01:01:52.080 --> 01:01:55.740
Like you just got to churn out those beautiful tables.

01:01:55.740 --> 01:01:57.180
You know, there's no other choice.

01:01:57.180 --> 01:01:58.080
That's right.

01:01:58.080 --> 01:02:06.340
I think also once you set up one of them, if you kind of do similar types of tables, like you can reuse that code in a lot of ways.

01:02:06.340 --> 01:02:09.080
So unlike doing a design or something.

01:02:09.080 --> 01:02:11.100
All right, Rich, final word.

01:02:11.100 --> 01:02:11.920
Final word.

01:02:11.920 --> 01:02:13.180
Contribute.

01:02:13.180 --> 01:02:18.160
Like if you want more of a call to action, just get into the site, discuss things with us.

01:02:18.160 --> 01:02:22.840
Even if your idea is like way in left field, we'll probably consider it and maybe even do it.

01:02:22.840 --> 01:02:26.020
That's how eager we are to please when it comes to tables.

01:02:26.020 --> 01:02:26.660
Awesome.

01:02:26.660 --> 01:02:27.900
So PRs are accepted.

01:02:27.900 --> 01:02:28.900
PRs, anything.

01:02:28.900 --> 01:02:30.840
Issues, complaints, whatever.

01:02:30.840 --> 01:02:32.540
Beautiful.

01:02:32.540 --> 01:02:33.400
All right.

01:02:33.400 --> 01:02:34.740
Thanks for coming on the show, guys.

01:02:34.740 --> 01:02:35.200
Yeah.

01:02:35.200 --> 01:02:35.940
Thanks for having us.

01:02:36.240 --> 01:02:36.400
Yeah.

01:02:36.400 --> 01:02:37.200
Congrats on the project.

01:02:37.200 --> 01:02:37.660
See you later.

01:02:37.660 --> 01:02:38.280
See you.

01:02:38.280 --> 01:02:42.020
This has been another episode of Talk Python To Me.

01:02:42.020 --> 01:02:43.820
Thank you to our sponsors.

01:02:43.820 --> 01:02:45.440
Be sure to check out what they're offering.

01:02:45.440 --> 01:02:46.840
It really helps support the show.

01:02:46.840 --> 01:02:51.200
This episode is sponsored by Posit Connect from the makers of Shiny.

01:02:51.200 --> 01:02:55.700
Publish, share, and deploy all of your data projects that you're creating using Python.

01:02:55.700 --> 01:03:02.280
Streamlit, Dash, Shiny, Bokeh, FastAPI, Flask, Quarto, Reports, Dashboards, and APIs.

01:03:02.280 --> 01:03:04.680
Posit Connect supports all of them.

01:03:04.680 --> 01:03:06.080
Try Posit Connect for free.

01:03:06.140 --> 01:03:09.060
By going to talkpython.fm/posit.

01:03:09.060 --> 01:03:10.380
P-O-S-I-T.

01:03:11.100 --> 01:03:12.360
Want to level up your Python?

01:03:12.360 --> 01:03:16.520
We have one of the largest catalogs of Python video courses over at Talk Python.

01:03:16.520 --> 01:03:21.600
Our content ranges from true beginners to deeply advanced topics like memory and async.

01:03:21.600 --> 01:03:24.260
And best of all, there's not a subscription in sight.

01:03:24.260 --> 01:03:27.160
Check it out for yourself at training.talkpython.fm.

01:03:27.480 --> 01:03:28.480
Be sure to subscribe to the show.

01:03:28.480 --> 01:03:29.280
Be sure to subscribe to the show.

01:03:29.280 --> 01:03:32.060
Open your favorite podcast app and search for Python.

01:03:32.060 --> 01:03:33.380
We should be right at the top.

01:03:33.380 --> 01:03:39.460
You can also find the iTunes feed at /itunes, the Google Play feed at /play, and the direct

01:03:39.460 --> 01:03:42.720
RSS feed at /rss on talkpython.fm.

01:03:43.140 --> 01:03:45.700
We're live streaming most of our recordings these days.

01:03:45.700 --> 01:03:49.800
If you want to be part of the show and have your comments featured on the air, be sure to

01:03:49.800 --> 01:03:53.480
subscribe to our YouTube channel at talkpython.fm/youtube.

01:03:54.220 --> 01:03:55.580
This is your host, Michael Kennedy.

01:03:55.580 --> 01:03:56.880
Thanks so much for listening.

01:03:56.880 --> 01:03:58.040
I really appreciate it.

01:03:58.040 --> 01:03:59.940
Now get out there and write some Python code.

01:03:59.940 --> 01:04:00.940
Bye.

01:04:00.940 --> 01:04:01.940
Bye.

01:04:01.940 --> 01:04:02.940
Bye.

01:04:02.940 --> 01:04:03.940
Bye.

01:04:03.940 --> 01:04:04.940
Bye.

01:04:04.940 --> 01:04:05.940
Bye.

01:04:05.940 --> 01:04:06.940
Bye.

01:04:06.940 --> 01:04:07.940
Bye.

01:04:07.940 --> 01:04:08.940
Bye.

01:04:08.940 --> 01:04:09.940
Bye.

01:04:09.940 --> 01:04:10.940
Bye.

01:04:10.940 --> 01:04:11.940
Bye.

01:04:11.940 --> 01:04:12.940
Bye.

01:04:12.940 --> 01:04:13.940
Bye.

01:04:13.940 --> 01:04:14.940
Bye.

01:04:14.940 --> 01:04:15.940
Bye.

01:04:15.940 --> 01:04:16.940
Bye.

01:04:16.940 --> 01:04:17.440
you

01:04:17.440 --> 01:04:47.420
Thank you.