Hello and welcome to Python Bytes, where we deliver Python news and headlines directly to
your earbuds. This is episode 219, recorded February 3rd, 2021. I'm Brian Okken.
I'm Michael Kennedy.
And I'm Jennifer Stark. Hiya.
Yay!
Yay! Welcome, Jennifer. It's so great to have you here.
Thank you. It's really great to be here. Thank you.
Yeah, yeah. It's been great. It's great to have you here. You know, we had you or I had you as a
guest over on Talk Python. And that was really fun talking about data science stuff over there.
And now we're happy to have you here on Python Bytes as well. Yeah. So you really quickly want
to just tell people about yourself before we jump into the topics.
Sure. Yep. So I'm Jennifer. I work at Loud Bible as a lead data engineer on a really small team of
three, but we're a bigger data team for research and insights as well. We've been spending most of
our time working on engineering stuff, but we've been moving gradually into like include more
data science tasks as well. So looking forward to doing some more of that.
Yeah, it sounds really fun. All right, Brian, you want to kick us off? I mean, I heard that you're
supposed to use virtual environments and not mess up what you're doing, but if you don't want to,
I guess you just don't do that.
Well, I use virtual environments.
I do.
All the time. But there was an article, so I wanted to cover this and there was some
discussion online. An article from Frostming titled, You Don't Really Need a Virtual Environment.
So what's the story there?
Yeah.
Yeah. So there's a little hint in the slug of the URL that the slug is introducing PDM.
So I don't know if he's really saying that you don't need it, but PDM stands for, what does it stand for?
Package Python Development Master. Well, that's cool. I think I want to put that on my business card.
I'm a Python Development Master. Anyway, so let's just go back up a little bit. This is kind of a neat tool.
It's sort of poetry-like, but it says it doesn't use virtual environments. It uses the package,
Dunder package directory. So what is that? So there's, we do have this problem with virtual
environments and I do. The main problem I think is it's hard to teach people. So if you're teaching
somebody new and you want them to install something, you kind of have to say, okay,
well type Python-M-VenV or, you know, Python-M-VenV space VENV and then you have to activate it.
And in the Mac people do this, the Windows people do something else. And then after you've activated
it, then if we've got requirements, you need to install them or install the requirements. And,
and I, you know, that's not a fun way to start teaching people how to use Python. So
I think we do need to solve that, but I'm not sure this is it, but there's-
Sure. Well, like Node.js has a similar problem, but they don't necessarily have as much of a
challenge because they have this like directory structure, which I think what DunderPyPackage
is trying to do, right? Like if you have a, a node modules folder, some directory up and you do
something with NPM, it just goes up till it finds when it's like, well, there, there's the top of
the project. We're good.
Yeah. So there's, that's, that's kind of what, so there's a PEP 582, which we'll link to that.
But, kind of has that, has this, it's proposing to have this Dunder packages, package directory
and have that sort of thing. So if you're, if you're in a directory with one of those around
and you do a pip install, I think this is how it works. Either it's supposed to, I think it's just
going to install stuff there instead of in your global one. So I actually think this would be cool.
Even, even if it's only used for teaching, it would be a cool thing to have because also you could,
you could possibly zip this whole thing up and give somebody a directory and they'd already have
all the packages and everything. That'd be kind of interesting. I wonder if that's kind of similar
to how Conda, is that similar to how Conda works? Can I use Conda ends instead?
Yeah. So it feels easier. Yeah. Yeah. You probably live way more in the Conda world than
the pip world. Right. Yeah. I think Conda is sort of a intermediate, right? So with Conda,
you do have to say Conda activate, right? Yeah. Manually, but you don't have to be in the right
place. Like with pip, you could be anywhere. Yeah, exactly. You just say, I have an environment
called this. Let's roll, like activate that and then go. Right. Whereas this is, it's like,
I'm in the right location, but I don't want to have to talk about environments. And it just happens
to be that that environment has a directory structure that Python will know about. Yeah. Yeah. Yeah. So
there's another, another part of virtual environments. It's a little icky is that I guess it's time,
you know, maybe, it's that if you, if you create a virtual environment, you kind of tie it to a
particular Python version. Yes. And if you update your Python version, then you're not, your virtual
environments aren't pointing to the new one. And I don't really know. I don't know how to,
actually, I don't deal with that. I just delete the virtual environment and recreate it.
maybe there's really good at doing that because, you know, every time I brew upgrade my Python
for a major version, it just stops working. I'm like, Oh, come on, here we go. You know,
time just time to erase everything and start over. Yeah. So the PEP 582 might fix that also. Cause you
could just, I don't know if it fixes that because it's still in the directory structure. It does have,
uh, Python versions in the directory naming thing. So, I think for minor upgrades,
it would work, but for major ones like going from three nine to three 10, I don't think it would help
you there. I don't know. anyway, I don't, I don't know enough about 582 to comment on this,
but I do think it's cool that PDM is around so that you can play with the dunder packages to see what
it's like. However, the workflow within PDM is way more complicated than virtual environments.
So in my opinion, so I don't think that it's going to fix the newbie, problem,
but yeah, it's still, that's, that's what I feel about with all of these things is it's like,
it solves two problems and it adds three. You're just like, Oh, come on.
Do I really want to trade those? a couple of comments from the, the live stream.
Hi Lang says conda rocks mostly. So, right there with you, Jennifer. Yeah. And then, yeah,
yeah. And then, Danelli says, there was a way to set up conda thing. So it automatically
switches to the conda invite, environment, see the environment.yaml file. I don't know anything
about this. Have you seen that Jennifer? I have not used that. No, it sounds like we should all check
that helpful. Yeah. Yeah. Thank you, Daniel. All right. Well, I guess we should jump over to the
next one. Something else that's really, helpful is a cookie cutter, right? So often we want to go
and say, well, I want to create a project and I don't want to just start from file, new project.
I want to have a certain structure. I want to maybe have some of the files there. So for example,
if I go and create a new pyramid web app, I can use a cookie cutter to generate that. And it'll say
things like what template language do you want to use? Do you want to use SQLAlchemy? And you answer
a couple of questions and it generates project already integrating those things with the right
directory structure and the right extra dependencies and whatnot. And that's cool, right? So I think
cookie cutter is really taken over as the primary way of creating projects that are structured. It's not
just Python. You could even create like Atari 2600 assembly language projects and C++, other weird stuff
like that. Anything that has to do with projects, just here's a bunch of files, replace, some
conditionally include others and so on. That's what cookie cutter does. And so that's not what I want
to talk about. What I want to talk about is this thing called copier. Have you guys heard of copier?
I have not. I have used cookie cutter, but I've not heard of this one.
Yeah. Cookie cutter is cool. And it's way more popular than copier copiers pretty relatively unknown,
but I think it's worth checking out. I don't know that I'll replace what I'm doing with
cookie cutter with copier. They're not interchangeable. They should be, that would be a great feature,
but I don't think they can share each other's templates. That said, the thing that is interesting
about copier primarily is that it allows you to upgrade working with projects. So if I go and make
a decision to create, say some web application or whatever else application, it even works for data
science, like structuring notebooks and whatnot. If I make a decision and then I change my mind after
I've already worked on it for a while, too bad. You don't get any choice. Like it's,
you throw it away or you create another one and you kind of diff the files. You're like,
ah, well, what's the difference over here? Oh, I should include this thing. But with copier,
you can rerun it on the project and make changes and apply those changes and different choices
to an existing project you're working on. That's why I think it's interesting.
That's cool. Does it have a, like a prompt like thing also? I mean,
cookie cutter asks you things. I believe it does. Yeah. It will ask you questions. If you look at it,
it has, yeah, it absolutely has prompts. I can't really see a great example here.
It's, it doesn't use, I believe cookie cutters like native Python that you program it in. The scripts
are Python and then they drive arbitrary text files and whatnot with replacement. And it's kind of like
Jinja. This actually uses YAML. So if you look at an example somewhere, I'm not sure exactly
where a good example is, but basically you set up YAML files and the YAML files have different types of
prompts and questions. You can say like here, I want to ask for a password and then confirm it,
but don't show the output. So there's a lot of configurability and interesting things like that.
And then if you rerun it again, it'll say, here's the project structure that you have. Here's the
project structure that we're creating. And if it runs into a file, it'll say,
this one already exists. Do you want to override it? Use the one we're about to generate things like
that. So it's pretty neat. I think that's, it looks pretty cool. I definitely want to check it out.
Yeah. Yeah. It's, it seems to solve a slightly different problem than cookie cutter, but it's,
I think cookie cutter is the right conceptualization to have when you think about it.
Yeah. I did start using, I created my own cookie cutter for some data science-y things that I was
working on. And there's a data science cookie cutter that exists already, templates exist,
but it wasn't completely sitting my knees. So I, I made my own and then I was going to make one
for, for projects in our team. Cause we do some, you know, like one-off data analysis,
advanced projects. And then discovered that GitHub now has, you can make a repo with a temp as a
template and you can set it as a template in GitHub and then you just clone it and name it something
else. So that's solved part of, it doesn't solve everything. You know, if you want something
different, then, you know, this might be really good, but yeah, yeah, yeah, that's right. So I
remember if you go to your GitHub repository under settings, there's a checkbox that's off by default
that says this repository is a template. That's what you're talking about, right?
Yeah.
I see.
So if you set up like empty, you can set up your, set your file structure. so it's got nothing
about, I guess, some of the things that you're setting up in this one are not what you set up in,
in the GitHub template. It's just the file structure really. And if any files, you know,
that you want to pre-populate with any files. but yeah, so you, that's what I was going to
solve with cookie cutter. Cookie cutter would have been overkill for this.
I see. Yeah. I had never really thought of those two things as being the same, but you're right.
They're, they're basically the same. Cause normally when you fork a repo, it's like, well, now you can
contribute back, but the templates are just, now you start from here and it's not really related back.
Right. Cool.
Yeah.
Nice. Well, that, yeah, that, that brings us to your first topic, right? Tell us about it.
Yeah. Yeah. so I was thinking of data science and our team, we, we had a data science project,
uh, that we started a couple of weeks ago and it had a deadline. So we weren't going to make anything
particularly pretty. We just wanted to get something analyzed and done. so we were using lots of
tooling that we hadn't used before because we're using massive data set. I think it was a couple of
gigs worth of text. So we had to use, Google AI platform notebook, which is just Jupyter notebook
on Google cloud. but you can, you can have different sizes of your machine. You can have as many
cores as you want, different types of machines if you want. and it would just run notebook
for you. So we thought that was sort of the problem. We just have like, have all these cores,
um, and we run our notebook on that and it'll be magical, but it, it wasn't, and a hub.
We're trying to apply to a pandas apply to this huge data frame. It just was not, was not working
at all. we, we even had the process bar on the bottom, like under the cell and it would take,
I think it was like 10 minutes to do, and it was still on 0%. And I thought, Oh wow.
You don't have time for this. Yeah. Don't have time for this. We're already on a deadline and it's
like, this isn't working. and then went over to, terminal and just checked like, top to see
what, what, processes were going on. And this was like one Python thing. I thought, well,
well, it's not, we could speed that up. Let's see what we can do there. Even though you have a ton
of cores and a lot of heart, a high end machine, it's still just single threaded basically. Right.
Yes, it is. so I looked at a few alternatives and didn't want to get too much into, I think some
people were suggesting, there's some desk related modules we could use. Like I think Swifter
was one, but there was, it didn't work instantly for me. So I looked for something else and found,
um, you have 30 seconds library work for me. Yeah.
I can't figure it out. Bin it. Start again. Find something else. I tried, found Pandarello,
um, which just parallelizes any pandas apply function. so you can tell it, you can tell it if you,
how many cores you want to use. You might not want to use all of them. and it's not like a linear
or exponential improvement. Is it like doubling your cores? Does not necessarily have your time.
Yeah. there's some overhead. but yeah, you can tell it how many cores you want to use.
Um, you can also opt to think on the, if you scroll down, it says you can also add like a progress bar to
it in the options. but it's, and then you've got some benchmarking there as well. And it's just really
easy to use. so that solved our problem again, like the whole project was just quick and dirty,
but, to get it done quickly, this is great. And then going over to terminal and doing top again,
it's like all Python, just Python, Python, Python, Python. I was like, yeah. Yeah. Yeah. Beautiful.
And by default, if you don't, you can specify the number of workers, but if you don't,
it's just the number of CPU cores. Yeah. All of them. so just a quick question. It looks like this is,
um, it says that it's mostly around the apply function. What does apply do as a reminder?
Um, if you have a, if you specify a function somewhere and then when you, when you hit
apply, I think it's an example that's actually a bit further down of the, of the kinds of,
applies that you do. So you can have, where you'd normally put apply func. So you can apply
a function to that whole directory of, sorry, to that whole data frame or to a specific,
column within that data frame. so any function you apply will be column will be
row wise in that column. Oh, okay. so the function only has to work on a single
row essentially. so anywhere where you'd put apply, if you're using parallel, you just
panderal, you just replace apply with parallel apply, and then it will. Nice.
Yeah. That's cool. That's very cool. Yeah. That's super cool. Daniel asks,
whoops, not that one, this one. He asks, how does this compare to Dask?
I do not know.
You know, I have not used Dask a lot either, but I think Dask can be set up to run in parallel on a
given machine. it can also be set up to run, you know, in a distributed cluster basically.
Yeah. my, my feeling is, yeah, my, my first impression is probably like, this is about,
I've got to apply this function to every element. I want that to be fast and simple. Let's just do
that. that's, that's my first thought.
I think the, the other option I used or looked at for 30 seconds was Swifter. And I think that is
a Dask base module, I think. but I might be misremembering.
And then, somebody else said, that apply is like a map in base Python. So.
Yeah, absolutely. Yeah. Very cool. Brian, what else is cool before we get on the next thing?
What is, if I wanted to learn pytest, say if I was Jennifer's team, maybe I could get a book on
pytest, right? So this episode is brought to you by us. Yeah. So I, I highly recommend a book called
Python testing with pytest. There's a small glitch with it though. It was written in 2017. So,
I, if you go to pytestbook.com, there's a bunch of a rata that will help you. There's some,
just some minor changes. I forgot to pin a version of one of the libraries, stuff like that. So,
um, if you go to pytestbook.com, that page has some a rata that helps you through learning pytest.
Awesome. And with the book, there is a second edition on its way, but it is
a long way out. So don't wait for it. That's a lot of work. Yeah. So, I'll over talk by the
trading and we're working on a bunch of courses, breaking news, never mentioned this before,
but we may be having a desk course coming soon. So, just, just so you know, and, Damon also
says, probably with more experience than definitely me or Brian, the desk has more features.
It can do chunking on the data frame to work around the Ram size limit, for example, and whatnot,
which is pretty interesting. And also notice down over here, I was it, this option use memory.fs.
Uh, it will actually use this memory file system thing, which sounds like it's good for lots of data
as well. But, and I, I haven't been out much. I used to love to go out and get like a milkshake
or something, but you wanted me to use ice cream instead for Python.
Yes. What's going on here?
Yeah. So actually, kind of love this. there's a, there's an article, from,
Kuyen Tran, stop using print to debug in Python, use ice cream instead. And I think we've
covered a couple of others, like other print alternatives. but, I went in and tried
this and it's pretty cool. So, with the, with the new F print stuff, you can, there's,
I forget when it came in, but you can do an equal sign, to, to print in, it prints a nice,
like variable name or whatever, whatever you want. And then the value of it next to it. So it's nice,
nice, but it's still a lot of typing. So if you want to print, print something nice,
you, you know, type it's a, it's a lot of typing. It's not tons, but when you're throwing debugging in,
you're probably stressed doing it quickly is good. So ice cream is just a way to do this faster. So
ice cream is, instead of typing print for your debugging output, you type IC.
So first of all, fewer characters, right? Right there. No curly brackets. You don't have to do
quotes. it's just, I see. And then, and then you give it whatever object or expression
you want to print. So that's cool. That's it. so even just at that, it's worth it. It's less
typing. I mean, you do have to import it, but there's that. but there's other stuff too.
So you can, if you don't give it any arguments, it, logs, it's kind of like easy deep flow
control debugging without having a debugger, because if it, every time it hits an IC statement without,
uh, without any arguments, it'll by default print, like the file and function and line number where
it's at. So you can kind of trace through your stuff. So that's nice. if you want to have
that tracing, be part of all of your statements, even the ones where you pass something in, there's
a way to configure that too, which is very nice. Oh, nice. I, you can custom prefix, which is kind
of, it's, which is like super powerful. I'm totally going to use it for this. so the example that they
have is, is instead of you can, of course you can just put a string in or something, but it's a
callback. So you have a callback function getting called. So you can use that. Their example is to
inject the date time, which is kind of neat. You can inject the date time in your print statement,
but I was thinking you could use that to, encode system state, like which users logged in or,
whatever other system state you kind of want to, track while you're debugging something.
This would be really cool to do since you can use a callback function. a couple other features
with it. It, it doesn't go to standard out. It goes to standard error by default. So it's not
cluttering up your output if you're storing your output somewhere. and then, one of the other
things I'm glad they like this article lists this as a, as a feature, it's not a print statement. So
when you want to clean out all your debugging, you can just search for all of your IC lines and clean
those out. you don't, because you might have print statements that are supposed to be there and
you don't need to clean those out. So definitely. Yeah. You could even sort of cancel it out with
an import statement, just define import, define IC to be a function that takes whatever and does
nothing. Yeah. Yeah. That's really cool. So people who are listening, you know, you, you say, if I were
to say IC of a function call, like plus five and give it the number four, the output would be IC colon,
then actually plus five with the argument values colon, the return value. And so it's a really nice
way. Instead of just printing nine and 10, it prints, I called plus five with four and got nine.
I called plus five with five and got 10. And it just, it sort of summarizes the, the debug information
a little bit better. Jennifer, I think this might make sense inside even a Jupyter notebook.
Yeah, I think it will. I was just, I was just thinking this is even less typing than if you used
f-strings. Yeah. Yeah. Yeah. And a little more powerful. And like Brian said, you kind of know
it's intentionally a debug thing. You could even rename, you know, import IC as debug and just like
make it really clear if you really want it. Right. Oh yeah. Three extra letters to type. Yeah. I know.
I know. Cause I'm not sure if I saw IC in my code, you know, without being familiar with this,
that I know what that's about. It's your code. It's not a pun. Yeah. Are they making a pun?
Like I see, I see my errors. Oh, I see. I see. Yes. They may be. They may be. And Piling is a fan of
the name. Brilliant name. Yeah. It's pretty clever. All right. Good one, Brian. So the last two,
by the way, the parallel Pandarello had a great visualization. This one has some great visuals.
And this next one I want to talk about, you know, I think might be what part of the reason we love
these things. It's like they, they communicate their value. So clearly this thing called HTMX,
high power tools for HTML. So Brian, I know you fall into this realm. I do some of the time as well.
Jennifer, maybe not sure. If you're going to write some interactive web pages, you really want to drop
in and write a ton of JavaScript and do all that interaction by hand. Or would you rather just have
it like magic its way into interactivity? And so that's a little bit. Yeah. Who doesn't want the magic,
right? So this is kind of what this is like. Normally, if you have a web page, you have two
options. You can have a form and that form could like post back and submit some data. And then you
could write some JavaScript. So if I click on some element, something happens. But what this does is
it lets you to go to almost any, any element in your page, a picture, paragraph, whatever. And you can say,
if you interact with this, here is a CSS transition to run. Here's a WebSocket call to do. Here is a
Ajax JavaScript call. And then it does something in reverse. So what I could say, for example, is when
somebody clicks on this picture, replace it with whatever HTML fragment I get back on the server
that I told it to call. So the picture could be like, click this for this bit of data report. And
then what it does is return actually the HTML for a graph. That's like a live graph with the data
prefilled. And all you have to do is touch the picture and teach the server how to return the HTML.
And now you have this interactive page that's like live with animations and stuff. Super cool.
So let me show you probably the best way to see this is through an example. So for example,
there's a button. If you just include the script, that's all you got to do. And you say button,
instead of having it in a form, you just say HX dash post. That's the HTMLX thing. You give it a URL.
And when you click it, it says call slash clicked. And when it comes back, replace what button is,
the outer HTML, like button and everything in it with whatever you got back from the server. Okay.
And even has a, a haiku in here, which is pretty cool. JavaScript fatigue,
longing for a hypertext already in hand, but let's go, let's go look at some examples. These are cool.
For example, let's do lazy load. If I go over to lazy load, which is a little slow. So it probably
it's lazy. It's quite lazy. It is indeed. Maybe we will. Here we go. So we come over here and
if you just scroll down, you can see like it automatically loaded in this by refreshing.
See, there's a little action, boop, boop, boop. And then off it goes. And all I got to do is say,
is this image, it has this indicator. Here's the image to show while you're loading. And then what
you want to do is just show whatever you get from slash graph. Isn't that slick? And like,
that's literally what you get have to write. Let me show you another one.
I might do this just for the lazy loading. That's great.
I know here. Let's go do. Yeah. Look at the active search. So over here, I can type
J E. Okay. There you go. And just, as you type, all you got to do to like type in this little text
box and have all these search results come up lazy is just say, here's what you call ATP post. And the
trigger is the key change. There's even a delay. So as you type really fast, it doesn't go insane on
the server. It like waits really, really cool. Yeah. As a little indicator. And then if you notice at the
bottom, there's this thing you can show and it shows all the requests and the responses
that have gone back and forth. There's like a little debug toolbar here for the whole Ajax
interaction. Oh, sweet. Isn't that sweet? Yeah.
It is nice. How did you find this?
Gosh, I don't remember. I feel like maybe, maybe somebody, some listener told us about it, or I just,
I ran across it on Twitter or something. I feel like I found it from the community somewhere.
Cool.
But I don't remember where, but I'm, I'm excited about this. Include a JavaScript file,
put one line, and then it becomes this cool interactive thing all over the place. So yeah,
definitely digging it.
Yeah. Totally can use that.
Yeah, for sure.
Yeah. Same.
I'm sorry.
It might, it might encourage me to update my website.
Exactly. You're like, oh, it's super interactive. Look at all this. I rewrote it completely.
So much fun.
Yeah. Yeah. Cool. All right. What's next?
Hi, LDA Viz. Yes. This is also part of that quick turnaround data science project that my team did
a couple of weeks ago, we were looking at doing some topic analysis on text. And our first approach
was to use latent dirichlet, dirichlet. Nobody knows how to say it. Just got to say it with confidence.
Latent dirichlet. Oh no, I can't remember what the A stands for. Analysis. Maybe that's the A.
We applied that. And, but it's the output to understand what you're looking at. You know,
you can, you can have it print out what the topics are and what words contained in that topic. And,
but, you know, you can't, it's really hard to sort of get into the output of your model to evaluate
if it's a good model or not. So what some wonderful people in the R community did was they made LDA Viz,
which just displays the different elements of the LDA output in a really, really intuitive way. So even if
you're not too sure on the math behind LDA and, you know, what everything means, what, what Lambda is and what all the different,
like complex interactions are, it's quite intuitive. If you, if you spend a bit of time exploring the visualization.
So that was then ported into Python and that's called, in Python it's called PyLDA Viz, but the visualization is exactly the same.
So, yeah. So you'd have, so in this little partial screenshot of visualization, we have some bars and the blue bars and the red bars.
So the blue bars are like how, how much of the overall,
you'd have all the words in all the topics, like in all the documents.
So baseball, how of the, all the words in all the documents, how much does baseball,
how much is baseball represented in all those documents?
And the red bar represents how much in that topic, topic number 19,
how much topic number 19 is made up of baseball.
Oh, I see. So you have these different topics on the left that you can like click on them and it'll generate the bars to explain more detail.
Yes.
Okay.
You can click in all the different topics.
The number of topics is determined already in the model that you've already created.
And you can change that, rerun the model and get that many topics out.
So yes, you can like, you can click on the different topics and explore the top words,
either top words based on how it's sensitive they are across all the documents or within that, that one topic.
And then there's a slider as well.
I don't know if it's an example, if you scroll down, but there'll be a slider,
which goes between zero and one.
And at one, it's the word order, the topic words order is ordered by representation across all the documents.
And if you slide the slider all the way down to zero, it's shuffled all the words to be more specific,
to show the words that are more specific to that topic, that are exclusive to that topic and not in other topics.
Whereas if you have it to one, it's prioritizing the words in the list of words that are like everywhere.
So yeah, that's just really easy and nice to play around with and explore your model.
It seems like such a powerful way to explore these models around NLP stuff.
Yeah.
It just looks, it's just nice.
It's just well designed and makes you feel happy playing with it.
Yeah.
These pictures and live interactions are great.
Yeah.
And there's really good documentation as well.
So they've got links to easy to read documents that explain way better than I did what everything means
and how to interpret stuff.
So definitely take a look at that.
And there's some, I think, links to some YouTube videos and whatnot as well.
So yeah, the docs are really nice.
Links to academic papers explaining what everything is and topic models.
And yeah, good.
Yeah.
And there's some linked videos there.
I didn't pull them out because I think they're probably like talks or something.
But yeah, those look good as well.
Yeah.
Cool.
Nice.
So it says this package was ported over from R.
And I know there's a fair number of things in the Python data science world that's like that.
Do you see that still happening a lot?
Like what's this interplay between R and Python these days?
I think I've actually not seen that in a while.
To me, I'm not very aware of it, but it seemed like that was really popular a couple of years ago.
And I hear less of it now.
Yeah.
Well, yeah, same.
I think R is really, because R is a stat stat.
It's a very popular language.
So, and it's been around the stats longer, I think, than Python has been.
It's much more mature when it comes to stats.
And I think like very specific statistical applications are more advanced in R just because they've been around for longer.
Python is definitely catching up, though.
But, you know, with something like this, I think it's nice that rather than reinventing the wheel in Python, they've just taken something that already works and made it work in Python.
Exactly.
You're like, we like this.
Yeah.
We'll just do this.
This is great.
Yeah.
Like, why change it?
Yeah.
Daniel Chen threw out there, going back a few topics, that there's conda-auto-env, that project, which works, I think, probably like the PDM thing that you had, Brian?
What do you think?
Say that again?
I think we're talking about whether conda has this idea of automatically activating environments under PyPackages.
I think this project, conda-auto-env probably does.
And apparently there's a tie-in with RStudio as well.
I think I agree with it.
Nice.
I was just looking at R.
So R looks like it's been around since 93.
I didn't know it was that old.
Oh, wow.
Yeah.
Based on S, apparently.
Based on what?
F?
Based on S?
S.
Yeah.
Just one character, please.
One character is all we need.
Yeah.
See what's ahead.
We'll go with it.
What was up to follow on?
Yeah.
R was my first programming language for data analysis.
But I'm really out of touch with it.
Now that we've got TidyR, which is supposed to be really amazing and great for, I guess, it makes it easier for people new to programming to get up and running quicker.
But I look at R now and I think, oh, I don't know how that works or what that is.
I've just been out of it for so long.
Okay.
So you're completely in Python now?
Yes.
Yeah.
But I'm not like no to R.
I don't know.
You see it sometimes when people are like, yay to Python and no to R or the other way around.
And I think it's just silly.
Yeah.
They're both really, really good at what they do.
Yeah.
If they're doing something cool like this, like LDA viz, do that here as well.
Yeah.
Speaking of visualization, I want to remind people that are listening to the podcast that we do live stream it.
So you can hop on Wednesdays and watch with us.
Or you can catch it on our YouTube channel so that you can see the things we're looking at.
We highlight if we're looking at a web page or a cool visualization, we can see it.
Yeah, absolutely.
Is that it, Brian?
I think it is.
It is.
Do you have any extra news or anything?
Nothing super exciting, but I did want to tell people about the JetBrains survey.
And if you've ever gone to the JetBrains site, did you know that they have a little terminal command prompt for agreeing to the cookie policy, which is kind of cool?
Anyway.
Yeah, I love it.
I'm like, oh, I hate these cookie things, but that's kind of cool.
I'm going to do that.
So they are launching the developer ecosystem survey for 2021.
And if you participate, you get some prizes.
It does take a little while.
It took me like 15 minutes.
It's a non-trivial amount of questions.
But I'm sure that we'll cover this in three months or whenever the report comes out, and there'll be all sorts of cool stuff we can talk about.
So, you know, Python people, get your voice heard.
Nice.
Yeah.
Got to remember to take that.
Yeah.
How about you?
I've got a couple exciting bits.
I am going to be speaking next week at a couple places.
So I'm going to be speaking at the Python user group for Aberdeen, which it's in the UK.
That's about all I know.
It's online.
It's a virtual thing.
It's online.
Yeah.
It's online now.
Yeah.
It's an online thing.
And so I'm going to teach.
We kind of did a survey of the people going, and there's a lot of people new to testing and new to pytest.
So I'm going to do sort of an intro to pytest sort of a thing, or at least a topic around pytest that's introductory.
And then I'm going to do a similar talk, but targeted a little bit closer to what they're doing to NOAA, which I'll probably get that wrong.
National Oceanic something, something.
So I'm going to talk with a group of those people next week.
That'll be fun.
And, oh, it's in Scotland.
Aberdeen is in Scotland.
Sorry.
Thank you, Alex.
So I told my kids about both of the things, and they're like, yeah, Aberdeen, that sounds neat.
But NOAA, really?
You're going to be talking to them?
So my kids are excited about that.
Yeah, that's super cool.
Jennifer, anything you want to throw out to people listening?
You run a user group, right?
Yeah.
We've got PyData in Manchester that we have going on.
And our next, it's on Meetup, and it's obviously on YouTube, because where else are we going to be?
But then our next one coming up is on agent-based models.
So that's going to be really cool.
Looking forward to that one.
And hopefully, and I'm not going to promise too much, but we did put our own podcast on hold for a little bit.
So hopefully, we will start that up again this year.
So one reason why I'm pretty interested in the tools that you guys use for your podcast, because I think this makes it really interesting and engaging.
Yeah, well, I think some of these tools, like we're using, for example, StreamYard for our live streams and stuff,
I do think there's a lot of low bar to adopt those kind of things for a lot of meetups and stuff.
So yeah, that's cool.
If people want to know what we're doing, they can shoot us a message, and we'll let them know.
I just looked it up.
Scotland is in the UK, so I wasn't completely wrong.
It is.
No, you're not wrong at all.
It's like squares and rectangles.
Come on.
You said it was a rectangle.
It's all good.
All right.
Well, with that, you think we should close it out with a joke?
Yes.
You think, Brian?
Yeah.
All right.
So this one comes to us from Edward Orochena, and send us this cool picture here.
And this has to do with an engineer helping a designer fix a problem.
I kind of feel like I want to be the developer.
Do you mind being the designer, Brian?
Sure.
All right.
So Brian comes to me, the designer comes and says, there's a problem with this design.
So I say, oh, no problem.
No problem.
We can fix this here in the terminal.
I pull open Z shell, and I'm rolling along.
Whoa, you're a hacker.
No, no.
It's just the terminal.
But where are all the buttons and icons and drop-down menus?
Is this the matrix?
Yes.
Have you ever had one of those experiences?
I had one of those experiences at a coffee shop.
I was doing something with the terminal, and I had three of them open.
And one of them was tailing a log, and one was running a pip install script with a bunch
of progress bars, and people were like, are you trying to hack us here on the wife?
I'm like, no, I'm just working.
Leave me alone.
So I was on the other side of it to start with.
I was a grad student.
I shared an office with a couple other people.
And one of the women that shared the office with us was a Vim user, or VI user at the time.
And I was with tags and everything.
And I was an Emacs person at the time with menus and stuff.
And so I was watching her code once, and it's just jumping all over the place.
So she'll go to a very, and her hand's on the keyboard, nothing, no mouse.
And the windows are popping back and forth, and she's going all over the place.
I'm like, oh, my God.
She's like thinking into the computer.
So I learned VI because of that experience.
Oh, that's awesome.
Yeah.
When you see people just using Vim or any of Emacs, whatever, like that's mind-blowing.
I still need my, I like to use my mouse.
Yeah, I like a blended experience as well.
Cool.
Well, thanks, everybody.
Yeah, thanks, Brian.
Thanks, Jennifer.
Thank you.
Yeah, this was really fun.
Thanks for having me.
Thank you for listening to Python Bytes.
Follow the show on Twitter via at Python Bytes.
That's Python Bytes as in B-Y-T-E-S.
And get the full show notes at pythonbytes.fm.
If you have a news item you want featured, just visit pythonbytes.fm and send it our way.
We're always on the lookout for sharing something cool.
On behalf of myself and Brian Okken, this is Michael Kennedy.
Thank you for listening and sharing this podcast with your friends and colleagues.