Transcript #240: This is GitHub, your pilot speaking...
Return to episode page view on github00:00 Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to your earbuds.
00:04 This is episode 240, recorded July 1st, 2021, How Time Does Fly.
00:10 I'm Michael Kennedy.
00:11 And I'm Brian Arkin.
00:12 And I'm Chris Moffitt.
00:14 Hey, Chris. Welcome to the show.
00:16 Thank you. Great to be here.
00:18 Yeah, it's great to have you here.
00:19 We've had you talking about the missteps of Excel and how the Python data tools chain can make that better over on Talk Python a few times.
00:28 This is your first time on Python Bytes, right?
00:30 It is. Yes.
00:31 Yeah. Exciting to have you here.
00:32 Definitely. Definitely.
00:33 But maybe you want to go ahead and kick us off.
00:35 I want to talk about subclassing today.
00:38 But Hinnick wrote an article called Subclassing in Python.
00:41 And, you know, dealing with classes is just everywhere in Python.
00:46 Even if you're not using classes, Python itself has all sorts of classes and objects that you're using all the time, whether you know it or not.
00:55 But when you start getting into larger design, there is a question around, you know, composition versus inheritance and stuff.
01:05 So I really like this article that Hinnick put together because I think people should think about the ramifications more.
01:14 So the general gist is he prefers composition over inheritance and I do, too.
01:19 And but then goes through if you have to do inheritance when sometimes you do in Python, for instance, the greatest the greatest example I know of is when you're having exception hierarchies.
01:34 And it's really it's really easy to build up exception hierarchies in Python.
01:39 And it's there's like nothing there is except for like the class definitions and their inheritance.
01:45 And that's the easiest class you've ever created.
01:47 Class exception name path.
01:48 Yeah.
01:49 And but it's useful to do that.
01:52 But then if you want to go further, there's other there's other design patterns and stuff, especially from the C world, C++ world where people might be thinking, well, I want to do something similar in Python and stuff.
02:05 And so this is this is actually kind of a really great article to discussion about it.
02:09 It's pretty long.
02:10 I don't want to summarize it too much, but I'll jump into the three types.
02:13 So he talks about three types of subclassing that's often happens subclassing for code sharing.
02:19 And the short answer is it's just people are trying to do the drive principle and try to share code.
02:26 And it's just it ends up being a bad idea, essentially.
02:29 And there's a bunch of references for it.
02:32 And if you don't, I think if you don't believe me or him, read, read this article and read a bunch.
02:37 He's got a whole bunch of linked articles to that discuss it.
02:41 But but I kind of agree.
02:43 The the second type is inherited in is abstract data types or interfaces in a lot of languages are called the interfaces.
02:51 And this is kind of a neat use of it.
02:54 And there's a bunch of things.
02:56 But it's it's and I thought, OK, yeah, you definitely will use.
03:01 It's a little bit of inheritance and composition for for data type stuff.
03:05 But there's in his discussion, he talks about some of the cool things that Python has that allow you to to have these sort of hierarchies without actually doing subclassing.
03:19 So there's there's some cool features of Python, like like the the protocol syntax that came in recently in in typing dot protocol.
03:28 Yeah, protocols like formal duck typing, which is an odd thing to combine.
03:33 But yes.
03:33 Yeah.
03:34 But it's it's kind of really cool how it's put together in Python.
03:37 So I like that.
03:38 And then lastly is a specialization.
03:41 And that's where kind of the exception hierarchies come in.
03:44 But also he's got a great discussion about structuring data classes that have common elements.
03:49 And and I think that's an interesting discussion, too.
03:53 And I I think I already said this.
03:56 The summary really it's really hard to summarize this article other than it's good to think about your design, especially if you're going to try to bring subclassing into it.
04:05 So let's do that.
04:06 Yeah.
04:07 Awesome.
04:07 I haven't had a chance to dive into this article, but I do want to read it and explore it.
04:11 You know, it touches on a couple of things like it touches on namespaces and modules, which I think is pretty interesting.
04:17 So many people coming from C++, C#, Java, et cetera, like all these really strongly OOP, especially C# and Java, where everything has to be a class.
04:25 They you'll see people creating classes just for things like static variables and so on.
04:31 Right.
04:31 Or static functions.
04:32 If you just have a bunch of static functions, you know what works really well for that?
04:35 A module that has functions in it.
04:36 Right.
04:37 That's the same thing.
04:38 You import module.
04:39 Then you say module dot function name is the same as from module import class, class dot static function name.
04:45 Right.
04:45 Like it's just a layer that doesn't really need to be there.
04:48 So the article touches on that, which I think is neat.
04:51 Like sometimes you just don't need those.
04:52 And then also the composition over inheritance.
04:56 I think composition over inheritance is a really important thing to think about, because so often people say, well, you can't use OOP because it's horrible in all these ways.
05:04 And you end up with like a robotic duck that can't quack.
05:07 Right.
05:07 Like you end up with these weird situations.
05:09 If you like derive too many things and you put a weird specialty on the end, you're like a duck is an animal.
05:14 And then like, but it has wings.
05:16 But wait, now it's a robot.
05:18 Now, why does it eat water?
05:19 You know, it's like what happened to it?
05:20 Right.
05:20 But the composition allows for you to keep things much more tight and small in the inheritance stack, but still put them together in meaningful ways.
05:27 So anyway, yeah, I want to see more about this.
05:29 This looks great.
05:30 And I'm coming from a standpoint of I'm a C++ person as well.
05:35 And I've done both extremes.
05:37 I've like gone way down the inheritance hierarchy thing and had like seven deep in hierarchy, maybe not seven, but like five deep.
05:45 And it gets to be a nightmare.
05:47 So then I got went to the other direction and didn't do any inheritance at all in a design.
05:52 But there's there's problems there, too.
05:54 So thinking about it and doing it smartly is you just need to.
05:59 Yeah.
05:59 So it's often like salt.
06:01 I could see it's really good when you have some.
06:03 You try to go like salt.
06:05 It's great.
06:05 I'm going to have that for dinner.
06:06 Like, no, you shouldn't do that.
06:08 I think the other thing that's really important about this is depending on how long you've been working in Python, sometimes you kind of get stuck in a rut.
06:17 And you're always doing the same thing.
06:19 And the language has evolved and grown over time.
06:21 And so I think articles like this kind of force you to take a step back and see if you're using all the new features in a way that maybe aren't idiomatic.
06:31 Also, quick comment out there from the live stream.
06:33 Paul says, first time watching the live stream.
06:35 Hey, Paul.
06:36 Weird seeing everyone when they say the intro.
06:38 Indeed, it is kind of weird.
06:40 But I want to highlight this one to say hi to Paul.
06:42 Thanks for being here.
06:43 But also, if you're listening, you're like, hey, I'd kind of like to see what's on the screen while you're all talking about this.
06:47 You'll follow us on YouTube.
06:48 There's like a live stream menu right on Pythonbytes.fm.
06:51 So it's easy to sign up for that.
06:53 And also, Sam out there in the live stream following up on that says, currently maintaining a library with a deep templated class and hierarchies.
07:00 It's very hard to keep track of it all.
07:03 Yeah, I hear you that.
07:04 That's for sure.
07:05 All right.
07:06 Let's switch over to the next one.
07:08 Now, I tried.
07:09 I tried to resist this, Brian.
07:11 I promise I did.
07:12 But I've ended up with an extra extra with seven more extras.
07:16 Hear all about it.
07:18 And it just had to become a main item because otherwise we'd be here for hours.
07:21 It's not the idea of the show.
07:23 So we've got an extra extra.
07:24 Hear all about it.
07:25 Nine extras.
07:26 Let's pull them up.
07:28 Action number one.
07:29 We've talked about Pyodide.
07:31 I had a whole talk Python episode on Pyodide, which is an interesting thing.
07:34 It is this project by Mozilla where you take Python and you run it in the browser.
07:39 And then you take many of the data science packages like NumPy and Matplotlib and stuff and compile them into the browser.
07:46 And then you basically have client side Python data science, which is really interesting.
07:51 This project is being spun out as its own topic, as its own project.
07:56 It's no longer under Mozilla.
07:57 Usually that doesn't sound good to me.
07:59 It kind of sounds like it's been orphaned.
08:01 I have no idea what the status of Pyodide is.
08:04 People can check that out.
08:05 But it's no longer under Mozilla.
08:06 It's its own separate thing, as they say.
08:09 So it's cruising out there.
08:11 And also, it didn't get compiled to JavaScript.
08:13 It got compiled to WebAssembly, which is interesting because that's faster.
08:17 All right.
08:17 That's number one.
08:18 Number two, I just, as in a couple hours ago, released a brand new course, Python powered chat
08:23 apps with Wilio and SendGrid.
08:25 So the idea is if you want to have some kind of chat bot, but a lot of that conversation
08:29 has to involve your database and your data and verifying things.
08:34 Like the app that we built here is a tech savvy bakery where you can order cakes by sending
08:40 it a WhatsApp message.
08:41 And then it'll say, hey, you want a cake?
08:43 Well, here's the menu.
08:44 And it actually gets the menu from our Flask app.
08:46 And then they pick something off the menu.
08:48 And once they pick all the details, they said like this.
08:51 Okay, great.
08:52 We send it back to our website and figure out how much that's going to cost.
08:55 They order it.
08:56 It goes back.
08:57 We send them a, if once they accept it, they get like a customized pretty email.
09:02 It goes back to the backend.
09:03 The bakers bake it.
09:04 It sends them another message to let them know.
09:06 So if you want to build kind of like that workflow, if Wilio and SendGrid, check it out.
09:11 This course is super fun.
09:12 It's six hours and it's 100% free.
09:14 So people can check that out.
09:16 I think if you're trying to build that kind of thing, that'll be a lot of fun.
09:19 So links in the show notes there.
09:20 I had something.
09:21 Yes.
09:22 If I can't afford free, can I get a discount code?
09:24 I will give anyone listening 50% off that.
09:28 So I have this really cool tweet and Twitter is broken from what I can tell for everything
09:33 that's not the homepage.
09:34 So something went wrong, but let me describe it.
09:37 So when you look at it in the show notes, you'll be able to see there's a really cool tweet
09:42 from Nick Maul, who was on the guest on the show last week.
09:45 Oh, you got it.
09:46 How can you get this to work?
09:48 You've got some sort of magic.
09:49 All right.
09:49 Well, so thanks for putting on your screen.
09:51 So here we have Will McGuigan showing an animation of basically this really cool, like collapsible
10:00 sidebar and like scrolling within sub windows inside of textual.
10:06 Right.
10:06 We talked about textual as well.
10:08 And it's just such a cool graphic that says like, wow, you can build some pretty amazing
10:12 applications there.
10:13 What do you think?
10:14 Will's just knocking it out of the park with this.
10:16 It's fun to watch him go so fast.
10:18 Absolutely.
10:19 Well done there, Will.
10:20 I'll switch back to mine for a moment.
10:22 Okay.
10:22 Ars Technica works on my computer.
10:25 So remember we did an episode and I titled it something like Flock No or something like
10:29 that.
10:30 So Flock, Federated Learning of Cohorts, is something that Google was trying to do so that they can
10:38 replace third-party cookies.
10:40 Why?
10:40 Because people are running ad blockers or like I am right now, a VPN that at the network
10:46 level blocks all the ad tracking and third-party cookies.
10:50 So they're just basically not working very well anymore.
10:53 So they need to, they're going to cancel third-party cookies from, which means they're
10:57 canceling for the net, the internet.
10:59 And, but because they're Google and they're based on ad revenue primarily, they can't just
11:04 go and we canceled tracking.
11:05 Hooray.
11:06 We're all winning on privacy, right?
11:09 It has to be replaced with some other form of tracking, which they call this Federated Learning
11:14 of Cohorts.
11:15 But the Federated Learning of Cohorts has all these almost more negative consequences.
11:20 And I don't want to go too much into that because we went into quite a lot of detail.
11:24 But for example, you can say, I would like to target, you know, lesbians who just got divorced.
11:29 You run an ad on that.
11:30 People show up on your site.
11:32 They sign up.
11:33 You have an email.
11:33 And now guess what?
11:35 Not only do you know what their email is, you know that they're in this group.
11:38 And maybe this is the very first time you've ever met them, right?
11:40 So really weird, creepy stuff that you could like pull out with this.
11:45 Anyway, the big news is Google delays the rollout till 2023 because you know what?
11:49 People don't like it.
11:50 They're not super keen about it.
11:52 So there's a whole bunch of people who are against that.
11:56 But you're saying they're just delaying it, not stopping it?
12:00 Yes, for now.
12:02 Like, let me, this is a great article that people should check out.
12:06 Like, let me read the first sentence or two.
12:08 Google's plan to up in web advertising and user tracking by dropping third party cookie
12:12 support in Chrome has been delayed.
12:13 Most browsers block third party tracking cookies now as the VPN, like I mentioned.
12:18 But Google, the world's largest advertising company, it wasn't going to follow suit without
12:22 protecting its business model first.
12:24 But there's a lot of challenges with this.
12:27 A lot of people have come out against it.
12:28 And yeah, it's not going to work out super well.
12:32 So they decided to delay it.
12:35 That's what they said.
12:36 Stage two starts mid 2023.
12:38 Google says it's received substantial feedback.
12:42 Including from us.
12:44 And other companies out there are like, we kind of want to keep tracking too, but we're not
12:51 really excited about this.
12:52 So we're just going to not say anything.
12:53 Like Apple, Opera, Mozilla, Microsoft.
12:56 Yeah, they're like, ah, what is I sure about this?
12:58 Anyway, yeah, they've received substantial feedback.
13:01 So hooray, I think for now.
13:02 One thing that we don't talk very often about in Python is what if you want to ship your code
13:08 to somebody and it has sensitive algorithms in it, right?
13:12 It's not that common, but you could get Py2.exe or Py2.app bundle up your code and give it to somebody.
13:16 For example, Dropbox does something to this effect, right?
13:19 Got your Python code running up in your little menu bar.
13:22 There's other ones as well.
13:23 But you might want to encrypt how that works or protect how that works.
13:26 So people can't just open the PY files and look around.
13:30 So there's this thing called Source Defender.
13:32 I'll be clear, this is a paid commercial product.
13:34 I have no affiliation, but they pointed out, they sent me a message.
13:37 Hey, we're doing this thing.
13:38 What do you think?
13:39 It looks kind of interesting.
13:40 I think it's going to be a pretty limited set of people who actually care about this.
13:44 Like if you're running on Docker, you're running on the server, you probably don't care.
13:47 Maybe you do, but probably not.
13:49 But if you'd like to be able to encrypt your source code so it's much harder to see and then
13:53 ship that to somebody, you can use this thing as part of their paid service.
13:56 So that's kind of cool.
13:57 People can check that out.
13:59 Let's see, oh, there's a play noise.
14:00 I don't want that.
14:01 So I was recently interviewed on a day in the life and a work from home Pythonista, which
14:05 is a cool series being done by the folks in the Philippines.
14:09 If you want a tour of the behind the scenes studio and all the work from home stuff, people
14:12 can check that out.
14:13 Python 396 was just released.
14:16 We can check out the change log and see what's happening there.
14:19 There's a security HTTP client about what I think is like a denial of service.
14:25 It sounds like it avoids an infinite loop sort of thing.
14:28 So that might matter to people.
14:30 Probably not, but maybe it does.
14:33 Then a bunch of changes that are happening here, including platform specific ones.
14:38 So if you're running Python 39, and why wouldn't you be?
14:41 Update that.
14:42 Because you're running 310.
14:43 Yes, that's right.
14:44 You're already ahead of the world.
14:45 You're in the future.
14:46 So also, we had Calvin on from six feet up a while ago, and we talked about the conference
14:54 that he was putting together.
14:55 Well, the videos from that conference are out as a YouTube playlist, so people can check
14:59 that out.
14:59 I don't remember how many videos there are.
15:01 Let's click on it and see.
15:02 There are 61 videos, including one on the Python memory deep dive talk that I gave.
15:08 So if you want to check that out, they can.
15:10 Let's see.
15:11 Oh, this one.
15:12 Check this out, Brian.
15:13 Have you seen this?
15:14 Did you know you can pip install Python bytes?
15:15 Yeah.
15:16 You can literally pip install Python bytes because of Scott Stoltzman created this for us as a
15:25 joke.
15:25 He was listening to one of our episodes.
15:26 I can't remember what we talked about.
15:28 This was episode 239, but we must have talked about packaging and pip and things like that.
15:33 So he created a package called Python bytes.
15:35 And what it does is basically you give it a number, like 240, and it would download this
15:41 version as an MP3 file and put it right next to whatever the working directory is.
15:45 So if you want to pip install Python bytes and then python bytes.downloadepisode instead
15:50 of using a podcast player, we're all for that.
15:52 You can check that out.
15:53 Yeah.
15:54 Yeah.
15:54 And that's it.
15:54 That's extra, extra, extra, extra.
15:56 Well, many, many extras.
15:57 Yeah.
15:58 So the Python bytes package is just sort of, it was for fun, but it also, it's really
16:03 small.
16:03 And one of the things I like about it is it's just a really cool example of like with Python,
16:09 you got something that downloads MP3 files off of a feed somewhere.
16:14 It's that easy.
16:15 It's just, that's pretty cool.
16:17 Yeah.
16:18 That's fantastic.
16:18 Absolutely.
16:19 All right.
16:20 Let's see.
16:21 A couple of things from the live stream.
16:22 Sam says, things have happened with Mozilla the last two years that really shook my confidence
16:26 with them.
16:27 I am still a big fan of Firefox and I support their mission, but yeah, it's, I want to see
16:32 them succeed.
16:33 Let's see.
16:34 Another one from the live stream.
16:36 Antonio said, Hey guys, have you mentioned Kivy before?
16:38 Hey, GUIs and Kivy.
16:39 There you go.
16:40 I watched a video about this week.
16:42 It's a GUI that's compatible with many things, including the mobile devices.
16:45 I do.
16:46 My feeling is that Kivy is, is a lot about, it's more about building almost game-like interactions.
16:52 Whereas a lot of GUIs people want, they want like, here's a text box.
16:56 I type in the text box.
16:57 Here's a button I drop in, you know?
16:58 So, but yeah, pretty cool.
17:00 Well, let's see.
17:01 Kim Venwick says, as an aside, shipping a Docker image won't obfuscate the Python.
17:06 The image can be taken apart in files like that.
17:08 That's true.
17:09 They absolutely can.
17:10 I was just thinking like, you're probably just running on like a container service.
17:13 But yeah, if you're shipping it to someone, it's the same.
17:15 Nick Harvey out in the live stream says, could just send the PYC files with no PY.
17:21 It's not foolproof, but it does require more work.
17:24 You're right.
17:24 You'd basically be down to like this dot this and like reading the byte code.
17:28 Yeah, for sure.
17:29 Let's see.
17:31 Final one.
17:31 Rahan says, if it ends up running code on your machine, you can read it.
17:35 It's about putting enough barriers that people won't bother.
17:37 Yeah, that's definitely true.
17:39 I mean, you think of C++ and things like that being completely opaque and yet people take
17:44 that apart all the time.
17:44 But there is also a difference from I'm literally shipping you the source files here to, you know,
17:50 because then you could go in like, oh, here's where the license check is.
17:53 Let's just, you know, command slash comment that out.
17:55 All right.
17:56 Now we're ready to run.
17:57 Yeah.
17:57 Right.
17:57 You want to make it a little bit of a challenge, at least I suspect.
18:00 Anyway, thanks for all the feedback out there, everyone.
18:02 That's the everything extra, extra nine times.
18:06 All right, Chris, what's your first one here?
18:08 All right.
18:09 So the first one is from Andreas Kanz, I think is how you pronounce it.
18:14 And it's a library called Clib, I believe.
18:18 I wasn't sure if it's K-Lib or Clib, but I think it's Clib.
18:21 And it's for automated cleaning of Pandas data frames.
18:26 I guess I should even say it's a little bit more than just cleaning.
18:28 It's automated analysis.
18:30 And, you know, I'll be the first to say I'm a little skeptical about some things that try
18:36 and automate the process.
18:37 But I was playing around with it.
18:39 And there's some pretty cool things that it does.
18:42 The documentation, probably the best way to learn about it is the Towards Data Science article
18:49 that he wrote, which gives a pretty nice overview of what it does.
18:53 It has some, as I mentioned, some pretty nice cleaning features as well as analysis features.
19:01 So I was going to kind of go through a couple of the, describe a couple of things.
19:07 The first one that I thought was really interesting is the, there's this function called data cleaning.
19:15 And it essentially does, you can control what it does.
19:18 So it can clean the column names.
19:20 It can convert data types.
19:21 It can drop missing.
19:23 So one of the things that pandas does is it's not really aggressive about the size or the data types that it uses.
19:32 So when you read in data, it will just kind of assign it maybe to a float or, you know, an object.
19:40 But if you want, you can get in there.
19:42 And if it's a value, if it's a column, let's say that has only values from, you know, less than 100.
19:48 If you convert it to an integer, it saves memory.
19:51 If you save enough memory, then you can actually speed up your code.
19:55 And so this goes behind the scenes and takes your data frame and converts it essentially to the smallest value, NumPy value that it can store.
20:05 And then, you know, I took a random data set and sure enough, it did reduce the memory footprint quite a bit, which I thought was pretty interesting because it's one of those things that is very tedious to do on your own by hand.
20:18 Does it do like if you have the same string?
20:20 Does it just create a pointer to one copy instead of having that many times, stuff like that?
20:24 It can do that by converting it to a category type.
20:28 That's essentially what pandas is doing when you create a category.
20:31 It does that to kind of string to like a list conversion.
20:36 And it's, you know, it's pretty effective.
20:38 And yeah, I've used the category piece before, but I haven't actually gone in and tried to, you know, shorten up the numeric columns, which is really useful.
20:49 The other thing...
20:50 You just convert them to all the integers and then it'll just be shorter.
20:52 So you don't have to worry about the size.
20:54 I'm just teasing.
20:55 Yeah.
20:55 But I mean, it does even do, it's like, it can do even like int 16s or int 32s or int 8.
21:04 Oh yeah, interesting.
21:04 Like it'll shrink to the size that'll like, oh, these are all under 256.
21:08 So we'll go to like one byte.
21:10 Exactly.
21:10 Exactly.
21:11 You know, and I haven't looked at the code to see, you know, how it actually figures it out, but I had a fairly large data frame and it was pretty quick.
21:19 The other one that was interesting is the clean column names.
21:22 So I think there are some other libraries out there that will like strip spaces or special characters from column names.
21:29 But what this one will actually do is actually, if you have a column name that has, let's say camel case, it'll convert it to all underscore.
21:37 Or it will just essentially normalize all of your column names, which, you know, you could have a debate about whether you want to do that.
21:47 But when you have a data frame that has a lot of columns and you're just looking at it the first time, that can really be helpful.
21:53 And then the other function that it does that works pretty well is for cleaning duplicate data or empty data.
22:04 So if you have a lot of columns that have no values in it or just, you know, maybe 90% of the values are empty, you can set thresholds and just clean that all out.
22:15 So I was playing around with it and I was pretty impressed.
22:18 And I kind of wanted to call it out because the documentation right now is mostly around the Jupyter notebooks that he has.
22:30 So I think, you know, it would be nice if we could get some more docs in there and some more examples.
22:36 But overall, I was really impressed with the library.
22:40 And I think people should kind of take a look at it and see if it's something they want to use for some of their own processes.
22:47 Yeah.
22:48 Some of them sound interesting, even if you don't have to trust it, right?
22:52 Like the shrink to the smallest data set, data type, for example, or normalized column names.
22:57 Those don't seem as risky as, you know, clean it up.
23:01 Exactly.
23:02 Find the wrong data.
23:03 Exactly.
23:03 And then I forgot to mention, it also has some nice correlation plots.
23:08 And some of these things you can already do with Seaborn or Matplotlib, but I found that it gives you a little more control and it's just a little bit easier to do it.
23:18 There are certainly other tools out there that do this as well.
23:22 So, oh, and then the categorical data plots I thought was a nice summary of the data and gives you some nice graphs and it helps you understand where you've got some missing values.
23:35 But yeah.
23:36 Yeah.
23:36 The visualizing the missing data is a really interesting feature.
23:39 Yeah.
23:39 And there is another Pandas data frame called MissingNo that does this and does it well.
23:44 But I think this is a unique combination, especially some of the data, the memory saving features that it has are pretty neat.
23:53 Yeah.
23:53 So the cleaning features, though, have a lot of, there's a lot of parameters to it.
23:58 So it looks like you have a lot of control.
24:00 And one of the, I mean, again, this is open source, so it isn't that magical.
24:05 You can just look at the source and see what it's doing.
24:07 So it looks.
24:08 Exactly.
24:09 Yeah.
24:10 And that was one of the things I was looking at is like data cleaning, I think is kind of the top level.
24:14 And you can just run that wide open and it'll do everything.
24:17 And it actually prints out a pretty nice summary of what it does.
24:20 But you can also go in there and specify parameters, like you said, to control it so that maybe it doesn't rename the columns.
24:28 Or drop some of the missing data.
24:30 The other thing that I tried to play with that seemed really interesting is this pool duplicate subsets.
24:37 And essentially what it tries to do, and I had a little bit of trouble with this because I think I put too much data at it.
24:45 But it tries to, maybe if you have 10 columns of data, it says, well, you know what, four or five of them are very heavily correlated.
24:53 So we're going to drop them and just give you the four or five that are actually most useful.
24:58 And so I think that's some interesting tools to use when you get some data that maybe you haven't worked with before.
25:05 Yeah.
25:06 Yeah.
25:06 Very nice.
25:07 What a good find.
25:08 Brian, you got the next one?
25:09 Sure.
25:10 Yeah.
25:10 Just a second.
25:12 So I wanted to remind people to every once in a while, look at functools.
25:18 Because I've experienced functools as kind of an interesting library that's built in.
25:27 That is, it kind of grows with you.
25:30 So if you're new to Python and you look at it, it's going to be confusing.
25:34 It's like all intermediate stuff in there.
25:38 But as you learn and experience more Python programming, come back to it every once in a while because there's stuff in there that you'll use that you didn't think about before.
25:48 So I'm going to go through a few things.
25:51 And actually, I wanted to call out, there was an article by Martin Hines that I read that kind of reminded me to go through and look this.
25:59 So I want to shout out to him.
26:01 Thanks.
26:02 We've talked about some of this stuff before.
26:04 We talked about function overloading and using single dispatch as one of the ways you can do function overloading in Python, which is cool.
26:14 And that's part of functools.
26:15 And hopefully people are familiar with wraps.
26:18 Wraps is a way to create decorators that act like the thing that you decorated.
26:24 And so if you're writing decorators, make sure you check out wraps.
26:29 And then caching as well.
26:30 I think, I'm sure we've talked about LRU cache.
26:33 I'm sure we have, yeah.
26:35 Yeah.
26:35 So that's in functools, the caching.
26:39 And new in 3.9, there's just a simple cache.
26:44 You don't have to say LRU cache.
26:45 And it's just a convenience wrapper around LRU cache.
26:49 But it also, there's no max size.
26:52 So you don't want to do that for things that you actually want to throw items away.
26:57 But caching is super cool.
26:59 So check that out.
27:01 And then I didn't.
27:01 When I first saw the LRU cache, I'm like, whoa, I got to go figure out what this LRU is.
27:05 And it's not like, rather than just like cache the response.
27:08 Yeah.
27:09 I guess the other question, though, you might be is like, well, what if you pass two variable or two arguments or sets of arguments?
27:14 How do those?
27:15 Yeah.
27:15 So either way, it's kind of not 100% totally obvious what's going to happen.
27:19 Yeah, it's very cool.
27:20 Yeah.
27:20 So there's a bunch of caching stuff in there, like the LRU cache.
27:24 But then you can also cache a property.
27:26 And actually, the property one I hadn't used before.
27:29 But I was playing with it this morning.
27:31 And it's really cool.
27:33 So like, for instance, if you've got a data class or any class that has a bunch of stuff, and some of the things, you have an expensive read on one of those because you have to calculate the value.
27:46 You can throw a cache property on it, and it looks pretty cool.
27:54 One of the neat things about it is, so it only reads it once, and then it caches the value of the property.
28:00 And if you need it to refresh, you call delete on it, which is kind of a weird but kind of cool also.
28:08 But it's odd to call delete on something that you want to still be there, and it'll just reread it next time.
28:14 So that's how that works.
28:15 That is weird.
28:16 That's definitely weird.
28:17 Total ordering, I didn't realize, was there.
28:21 So if you have some data type that you want to be able to compare, you can use total ordering to define equal and one other operator.
28:31 And then you get all of the comparison operators to show up.
28:35 You can use that.
28:36 And then the last one I wanted to highlight is partial method, which partial and partial method, which these are kind of neat in that, like, let's say you've got a function that takes a whole bunch of arguments.
28:50 But you want to pre-fill some of those in and create a new function that has some of the arguments pre-filled in.
28:56 You can do that with this, and it's pretty neat.
29:00 Yeah.
29:01 Okay, interesting.
29:02 I see you partially supply some of the arguments, but not all of them.
29:05 Yeah.
29:06 So, yeah, just a shout out to this, that, yeah, these are intermediate or advanced topics.
29:12 But, but there, as, so as you learn more Python, come back to this every once in a while and you, you might use, find it useful.
29:21 Yep.
29:22 Indeed.
29:22 I was like, how did I miss this hashed property thing?
29:26 Like, surely I would have paid attention to that because what, so often these properties that are like computed things, but they, you know, often don't change.
29:33 Right.
29:34 You get something back from the database.
29:35 You want to, it has time sorted in seconds.
29:37 You want to know how many days it is.
29:38 So if something happens, you might have a day's property.
29:40 Right.
29:41 But that's probably not good.
29:41 So having that hashed is cool.
29:43 If you're sure it's not going to change.
29:45 But I'm like, how did I miss it?
29:46 It's new in 3.8.
29:47 Yeah.
29:47 So it's not, it's not super old.
29:49 And like Chris said, one of the reasons to revisit a lot of these things and pay attention to the news on Python is because the language changes like this.
29:59 So, yeah.
29:59 Yeah, for sure.
30:00 Kim out there in live streams says, also worth looking at intertools from time to time.
30:04 Definitely.
30:05 Great.
30:06 Indeed.
30:06 It's in the same level of complexity, but for collection.
30:09 It's kind of like, you wouldn't first go there, but eventually like, oh yeah, this is what I wanted.
30:13 I just didn't know it.
30:14 Speaking of things you didn't know it, let me scare you all a little, make you all delighted.
30:19 I don't know.
30:19 You tell me how you take to this.
30:20 So let me set the stage.
30:22 GitHub has a little bit of source code.
30:24 Much of it actually public, right?
30:26 Like it's public repos and whatnot.
30:29 So it can be analyzed and talked about and shared or used to train an artificial intelligence, which is pretty crazy.
30:36 And if you look at the artificial intelligence around text, there's the GPT-3 stuff, which is like scary, good text-based AI.
30:43 Well, they decided, what if, you know, our parent company also makes this editor?
30:48 What if we hit an AI based on understanding the source code from GitHub, like all the source code from GitHub and put it into VS Code and then it did stuff?
30:58 Have you all seen this?
30:59 It's called GitHub Copilot.
31:00 Yeah.
31:01 Yeah.
31:02 Yeah.
31:02 I haven't done it yet.
31:03 I was going to put the link in there and you beat me to it.
31:06 Oh yeah.
31:07 I was on top of it.
31:08 So if you go over here, there actually works for TypeScript, Go, Ruby, Python, a couple other languages.
31:14 It says it works for many languages, but it's best on those, of course.
31:18 But if you just look like at their homepage, the copilot.github.com, they've got this little animation and it says, I'm going to write a function that says parse expenses.
31:27 And it takes some kind of text.
31:29 And you put a doc string, literally a doc string in Python.
31:32 It says, parse the list of expenses and return the list of tuples, date, value, currency.
31:37 Ignore a line starting with hash.
31:39 Parse using date time.
31:40 Here's some examples.
31:41 Tab.
31:42 And then it writes the code that does that.
31:46 And let's see, what is it going to do?
31:48 It says, it's in the middle of animation.
31:50 It creates a list of expenses.
31:52 It goes through each line on split.
31:53 It says, if the line starts with hash, this is all Python code.
31:56 Continue on your loop.
31:58 Otherwise, date, value, currency equals split it.
32:01 And then it knows how to parse the date one.
32:03 Convert the value to a float and then store the currency as a string.
32:07 And it's not just that sometimes it'll do this.
32:10 You can actually get alternate implementations by tabbing through its recommended solution, which is,
32:16 pretty crazy.
32:17 So this is powered by OpenAIs.
32:20 It's called Codec or something like that.
32:24 I don't see it right here right now.
32:25 Anyway, I'll probably run across it in a second.
32:27 That's what it's powered by.
32:28 And it says things like, you're the pilot.
32:31 So with GitHub Copilot, you're always in charge.
32:33 You can cycle through alternative suggestions and choose which to accept or reject and then manually edit the suggested code.
32:40 Oh, yeah.
32:41 And it learns from you.
32:42 So I don't know.
32:44 This is wild, y'all.
32:46 This is pretty wild stuff here.
32:47 What do you think?
32:48 I think it's really impressive.
32:51 I mean, it will be interesting to see what it's like when you use it in real life.
32:55 And I think that there could certainly be limitations.
32:59 But I don't know about you.
33:02 But whenever I'm programming, there's always these things I just need to go and look at the documentation or look at Stack Overflow to refresh my memory.
33:10 You've got to connect to SQLAlchemy.
33:11 And I totally forgot how to do those three steps for that connection string sequence.
33:15 Right?
33:15 Exactly.
33:16 Yeah.
33:17 And I've seen, I saw on Twitter where someone was throwing a little shade at that example that you're walking through because they said, well, why are you storing the currency as a float?
33:27 It should be a decimal because if you store a currency as a float, you're going to have all the rounding issues.
33:31 So...
33:33 That's how Superman makes all his money or the evil villain in Superman.
33:36 What was it?
33:36 One of those shows.
33:37 Yeah.
33:37 Richard Pryor in one of the original Superman.
33:41 Yeah.
33:41 Yeah.
33:44 And it's not just based on the doc string.
33:45 Like the example I first spoke about was you wrote complex doc string and then say, do that thing.
33:51 But you can do it based just on function name.
33:55 You can just type a meaningful function name.
33:57 What was the example they used?
34:00 I can't remember.
34:00 But yeah, so you basically just write a doc string, a comment, a function name, or even some code to give more context to it.
34:09 And then off it goes.
34:10 So yeah, pretty neat.
34:11 Codex, that's the name of the AI system behind it.
34:14 So basically, this is a plugin for VS Code, but a really nice one.
34:19 So here's some examples we'll all be familiar with.
34:21 So fetch tweets.
34:22 And the example here is you literally write def fetch underscore tweets underscore from underscore user have.
34:29 And then what it auto completes with is, oh, you're going to need to pass the username in.
34:33 And then here's how you authorize with Tweepy, set up the API credentials.
34:37 And then here's the code you write.
34:39 Oh, yeah.
34:39 And here's your return.
34:40 Or I want to do a scatter plot.
34:42 And you write import, import matplotlib dot pyplot as plot, draw scatter plot, have.
34:48 And then boom, there it is.
34:49 Or memoization.
34:50 I wanted to point this one out because of what you're covering, Brian.
34:53 It says, oh, here's how you memoize a function, which is to, if it's past a set of arguments, it's always going to return the same answer.
35:00 So just give that answer.
35:01 Like, remember, these arguments equal this return value once it's run.
35:04 And it shows how to create a complex decorator that is going to have a function that remembers the values using caching.
35:11 It could just go at funktools dot cache.
35:14 You know what I mean?
35:15 Like, so there's things like that that is missing, right?
35:18 Because you could achieve the exact same outcome with funktools cache decorators, right?
35:23 Instead of trying to write a bunch of code that reimplements that.
35:26 But anyway, pretty, pretty wild thing.
35:28 I don't know really how to feel about that.
35:29 I've been thinking about this today.
35:30 It's kind of freaking me out, but it's also kind of cool.
35:32 Yeah.
35:33 I wanted to point out a comic that people have been pointing out with relation to this is, is the, you know, I wish we could have just specify what we wanted to do, the computer to do.
35:45 And, and it just does it.
35:47 And we already have that.
35:49 It's called code.
35:50 So anyway.
35:50 Yeah.
35:52 I, I don't think this, you know, people often say things like.
35:56 I remember hearing this 20 years ago.
35:58 Oh, this low code thing where you create these little boxes that do stuff and you drag and drop between them.
36:02 We're not going to need programmers anymore.
36:04 We're all just going to become drag or droppies.
36:06 And then like you programmers won't be needed.
36:08 The business people will just drag you drop either way the future.
36:11 And that never, ever happened.
36:13 Right.
36:14 Because people got to put them in production.
36:15 They've got to debug them.
36:17 They've got to scale them.
36:18 And so on.
36:19 Yeah.
36:20 Yeah.
36:20 I think the same thing here.
36:21 Like sure.
36:22 It wrote it once, but you can't have a write only experience.
36:25 For your code.
36:26 You have to understand your code and be able to evolve your code and work with.
36:30 So this might power you into a solution faster.
36:33 But I don't think it escapes the need of people doing meaningful software work.
36:37 The person that pointed out.
36:39 And several people pointed out the example of using money.
36:43 Floats and money.
36:45 That does highlight one of the problems with something like this, though, that everybody
36:49 needs to be careful of is the code that's generated.
36:51 Now you have to like, you were already creating, carefully thinking about it when you were creating
36:57 it.
36:58 But if something else creates it, you've got to scrutinize that to make sure that's really
37:02 doing the right thing.
37:03 And so you're code reviewing some AI code while you're coding your own stuff.
37:09 That's just a different part of your brain.
37:11 You've got to make sure that you're really paying attention.
37:13 Yeah.
37:13 Yeah.
37:13 And even I was looking at that matplotlib example.
37:17 And I would even argue that's not really the way you should do a scatterplot in matplotlib.
37:21 Because you should use the object-oriented interface in matplotlib.
37:26 I mean, the code will work.
37:27 But I wouldn't advocate that you use that code.
37:31 And so to your point, I think it will be interesting to see if it does learn on your own coding style.
37:37 So does it start to recognize those things that you're always, you know, like you said, connecting
37:42 to a database or fetching a file or doing a certain pandas function?
37:47 Will it start to learn that?
37:49 And then that would be really interesting.
37:51 I think there's something about it adapting to you and it learning from what you're doing.
37:55 But I have no idea what that actually means.
37:57 Yeah.
37:57 Hopefully it's paying attention.
37:58 So if it generates something and you change it to the different method and everybody else
38:03 is doing that also, maybe they'll stop suggesting the old one and start suggesting the new one.
38:09 Yeah.
38:09 I'll, you know, Chris, your point about having to, maybe it was you, Brian, sorry.
38:13 Whoever said about, you've got to like criticize this and you didn't write it.
38:17 So you basically have to study it and then, then understand or understand it and study it
38:20 to make sure it's doing the right thing.
38:22 You know, I, a couple of years ago, I don't know, a while ago, I was river floating and
38:27 broke my hand on some rocks, broke my finger in a bunch of places.
38:31 And like my fingers were completely wrapped up all the way to the very tips.
38:35 There was no like, oh, little pecking typing while my hand healed.
38:38 It was like, nope, no one handed, really slow.
38:41 So to keep things going, I used voice to text to try to like, at least keep email flowing
38:47 for a month or something, you know?
38:49 And what I found was I could write pretty decent emails.
38:52 It's hard to like stop and think in whole sentences the way the little tools like it to
38:56 work, but you can get it to work pretty well.
38:57 But the mistakes it makes that are phonetically correct, but actually what you mean wrong, like
39:03 they and they, or, or something that sounds like what you said, but is actually not
39:08 what you mean to say is incredibly hard.
39:10 It's much harder to understand and edit than you would think.
39:14 And so things like this, like, well, I wanted it to do that and I hit tab and I, okay, it's
39:18 doing, I feel like there's going to be a lot of blind spots.
39:20 Yeah.
39:21 Well, it did what it says.
39:22 It didn't.
39:22 I typed the thing and it seems right.
39:24 And like, how do you really, really know?
39:26 I, it just seems like in the same type of situation, it's going to be harder than normal code to
39:31 check.
39:31 Cause you didn't have to think through it to create it.
39:34 You know?
39:34 Yeah.
39:35 A couple of comments from the live stream.
39:36 Ray Han, don't, don't give him ideas.
39:39 It says, greeting Dr. Falcon.
39:42 Gosh, where have you been?
39:45 Let's play thermonuclear war as a dock string.
39:49 And Nick says, I can't help but think of Microsoft pay, which Microsoft pay was this really cool
39:54 bot that was like super good at adapting this stuff and they put it on Twitter, but people
39:58 decided to like be mean to, to, to it instead of teach it.
40:01 I think in like Japanese Twitter, it became a very kind and intelligent bot, but on like English
40:07 Twitter, it got turned into like a racist, horrible creature like right away.
40:12 And they actually had to cancel the project.
40:14 So yeah.
40:16 And then Arthur says, next April fool, April, April fool's day prank.
40:21 Everyone start writing terrible code that influences the AI.
40:24 And this, this is why English day went down the tubes.
40:27 Let's see.
40:30 And then Sam, for goodness sakes, don't trade it on GitHub code.
40:34 It'll arbitrarily turn on debug mode.
40:37 Yeah, perhaps.
40:37 Yeah.
40:39 Kim thinks this is both very impressive and vaguely unsettling.
40:42 And that captures what I was thinking.
40:44 Rahen, will it go and talk to the marketing people for me?
40:47 No.
40:48 I'm good with people.
40:50 That's what I do.
40:51 Yeah.
40:52 Okay.
40:52 Another thing that's not mentioned here explicitly, but I think is interesting is this code is coming
41:00 from GitHub.
41:00 Yeah.
41:01 When I go and I'm saying like, I'm working on super secret commercial project for large organization
41:08 that has lots of people trying to scrutinize it.
41:10 And I hit memoize tab.
41:13 It's going to write some amazing code.
41:14 Oh, by the way, was that GPL?
41:16 Where did that code come from?
41:17 Right?
41:18 Like what's the license of the code that was on GitHub?
41:20 Did I just now all of a sudden grab something that turned, you know, like if I was doing this
41:25 on Windows and I hit tab is Windows now open source.
41:28 I don't know.
41:29 That's a really interesting point.
41:30 And you would think if it was a small startup, someone will probably sue them.
41:34 But, you know, this is Microsoft now.
41:37 Yeah.
41:37 Exactly.
41:38 Yeah.
41:38 Yeah.
41:39 Anyway, so I agree with Kim.
41:42 This is both very impressive.
41:43 If this is the start, like where will it go?
41:45 It would be very amazing.
41:46 But it's also vaguely unsettling at the same time.
41:49 And I don't know how I feel about it.
41:51 Other than I wish it was in PyToram so I could play with it more often.
41:53 All right.
41:56 Chris, you got the last one?
41:57 I do.
41:58 So this is another library called Cats.
42:02 And it's a time series analysis library.
42:06 And it's made by the same.
42:08 Well, it's from Facebook.
42:10 And a lot of people may have heard of Profit, which is a library for time series forecasting.
42:16 And one of the things that's interesting to me about Profit and Cats is I think time series
42:24 forecasting is something that's really common in the business world.
42:27 I mean, you think about trying to forecast sales or maybe inventory movements or stock prices,
42:34 a whole bunch of different use cases for it.
42:37 And I think in general, most organizations don't have a group of PhDs that are really sophisticated
42:45 in their analysis.
42:46 So people use Excel and kind of come up with their own approaches.
42:50 And that's why I thought Profit was interesting.
42:53 And I think this is interesting because it does come from Facebook.
42:57 And you have to assume that they've got a lot of smart people that are doing a lot of forecasting.
43:02 And they've taken some of the things that Profit was good at and added some additional tools.
43:09 So before I go too much into Cats, one thing I wanted to mention is I did write an article
43:16 about Profit.
43:17 But I think other people, this gentleman, Peter Cotton, wrote an article about Profit and essentially
43:27 questioning how good it was.
43:29 And this is a really long, really well thought out article.
43:34 And some of the math and some of the concepts are way over my head.
43:37 But I do encourage people, if you're looking at time series forecasting, take a look at this.
43:41 But what Cats does is instead of just doing forecasting with Profit, it has a couple of different models
43:49 that you can use.
43:50 You can also do some more just basic time series analysis with it to detect seasonality patterns
43:58 and change points and other trends.
44:00 There's also, if you want to incorporate this in some of your other machine learning algorithms
44:06 to pull out features from your time series data, you can do that with this library as well.
44:11 And there's a whole bunch of other libraries or utilities to build like ensemble models and
44:18 other approaches for time series forecasting.
44:20 This is another one where it is relatively new.
44:24 So there's not a whole lot of documentation, but it's a whole bunch of different Python notebooks,
44:31 Jupyter notebooks, I mean.
44:33 And like one of the things I think is interesting is from a forecasting perspective, you can use Profit,
44:38 but use the same API and use Cerema, I think, Cerema and Holt Winners, as well as some other
44:46 ensemble models.
44:47 You can backtest, you can tune your hyperparameters.
44:50 And then you can also, it's got several of these other algorithms for change point detection.
44:58 And, you know, a lot of this, like I said, is I'm not an expert on the math, but I am interested in how you
45:05 figure out how to take these tools and apply them to those real world business problems.
45:10 And so I think it's really great when we have some of these libraries out there that are developed by
45:15 really smart people that do understand the state of the art, that can maybe make it a little simpler
45:20 for others to apply to their own unique challenges.
45:23 Yeah, this looks really nice to bundle these all together.
45:25 What's a type of problem you might answer with this?
45:29 I think so.
45:30 One example could be help me figure out what my blog or my website traffic is going to look like in six months
45:39 from now.
45:39 So I need to figure out, do I need to, you know, resize my servers or upgrade my disk space or...
45:48 What's my AWS bandwidth bill going to be?
45:50 Exactly.
45:51 You know, the other one that I think it's probably used a lot in inventory.
45:57 So trying to figure out, okay, what do I think sales is going to look like?
46:00 What do I need to reorder so that I actually have enough product so that we don't stock out?
46:07 I think those are some pretty common use cases.
46:11 A lot of the examples here are the airline flight data.
46:15 So anything that you have that's over a period of time, typically kind of on a daily basis over multiple years,
46:22 you can then start to forecast out what the future, what those future numbers would look like.
46:27 Then you have this magic prediction power for the executives.
46:31 Exactly.
46:32 And I think what's interesting about it is most of these, I think most times when people do prediction in Excel,
46:38 it's kind of you put the numbers in there and kind of do your linear line.
46:43 But these tend to give you more error bars so you can give a range.
46:48 So I think a prediction like this is much more valuable when you say it could be between, you know, 100 and 110 versus it's going to be 101.5.
46:58 And when you do that, it conveys a lot more precision than is really there.
47:02 Yeah, that makes a lot of sense.
47:04 Comment from the live stream, Sam Morley says, when I was experimenting with time series data, I managed to get better results with a fairly simple, naive Dharma model than I did using profit.
47:14 And I think that's exactly what this article, I don't know if he's read this article, but this, the article from Dr. Cotton,
47:23 that's essentially what he says is some of the more simple models did outperform profit.
47:29 Yeah. Interesting.
47:30 Well, cool.
47:30 All right.
47:31 Brian, is that it for all of our items?
47:32 It is.
47:33 Got any extra stuff you want to throw out there?
47:35 Oh, I just had a, just a quick one.
47:38 Somebody on Twitter last week asked, why did I write a second edition of the book?
47:43 And so I thought, well, that's a reasonable question.
47:46 So at pytestBook.com, you can go and I've added a, why a second edition section.
47:51 So I think I'll read that.
47:53 New built-in fixtures, new flags, package scope features, F-strings, types, all sorts of good things are available that weren't available then, right?
48:02 Yep.
48:02 Yeah.
48:03 There's all sorts of reasons.
48:05 Always good to see Pathlib there.
48:07 I love Pathlib.
48:08 It makes my life so much easier when dealing with files.
48:10 Yeah.
48:11 I finally made the move.
48:13 I've put down OS.path and I'm now all about the Pathlib.
48:16 Loving it.
48:17 That's good.
48:18 Yeah.
48:18 Chris, anything else you want to throw out there?
48:20 I was going to throw out one other.
48:22 I was doing some research for working with units of measure.
48:32 UNYT.
48:32 UNYT.
48:32 UNYT.
48:33 UNYT.
48:34 UNYT.
48:35 UNYT.
48:35 That allows you to do things like convert kilometers to miles.
48:41 it works with numpy it works with all the scientific stack and that was um i i hadn't
48:48 heard of that one i thought it was kind of interesting and want to put that out there
48:51 next time you need to actually do something with units and convert uh back and forth might want to
48:57 consider that and then it looks like there's a lot of like physics and chemistry type things like
49:02 the mass of the earth the radius of the earth as constants probably pi and e and all those things
49:07 yes exactly and i think it's when you start getting into it there's probably temptation just
49:12 to code it all yourself just put those constants in there but uh when it starts to get more
49:17 complicated i think something like this could be really uh useful and then there's another approach
49:22 called pint which also works there we go uh which also works with units and it has a little bit
49:29 different uh approach and so i i think it's good to take a look at both of them and if you have a need
49:34 then you can decide which api is going to work best for your unique situation yeah these are cool i
49:39 haven't looked at unit but i love pint and i think the name is so good yes uh because my wife asked me
49:46 like how many else's are in a pound or how many pints are in a liter i'll be like or even in i don't know
49:53 a court or vice versa i'm like i have no idea i just these are such messed up volume measures and so
49:59 it's like here's the thing that takes the thing you don't really know about and allows you to convert it
50:03 to the others in a safe way it's good exactly i got one more quick extra to throw out as well for
50:07 you chris there i forgot to mention that you were the author of the move to from excel to python
50:12 with pandas course over at talk python trainings which is a really popular course basically it's
50:17 a intro to pandas course disguised as solving problems you might with excel right exactly yeah
50:22 yeah no thanks and uh i've had a lot of good feedback from folks so hopefully it's uh
50:27 interesting to the listeners that haven't had a chance to check it out i might have to buy that for
50:32 my boss maybe you can get that discount code yeah yeah the discount code all right you ready for
50:39 some jokes my twitter came back so i can show the twitter joke now yeah all right so dean who is
50:45 often but i don't see him this day today on the live stream sent a joke over and said do you know how
50:51 they say async in italian async yo or async io which i thought was a pretty good one async io i think you
50:59 love italian all right um you guys got another one out there i saw one in the notes another joke but i
51:05 didn't see who put it there i i've got one um so does anyone know why cryptocurrency engineers
51:12 allowed to vote no i don't know because they're minors oh that's a good dad joke yeah it is
51:19 absolutely well on that high note let's uh let's call a show what do you what do you say
51:27 yep right thanks as always chris thanks for joining us this time thank you very much really appreciate
51:31 it yeah bye everyone thank you for listening to python bytes follow the show on twitter via at
51:36 python bytes that's python bytes as in b-y-t-e-s and get the full show notes at pythonbytes.fm if you
51:44 have a news item you want featured just visit pythonbytes.fm and send it our way we're always on the lookout for
51:49 sharing something cool on behalf of myself and brian aukin this is michael kennedy thank you for
51:54 listening and sharing this podcast with your friends and colleagues