Installing Python on my M1 in under 10 minutes
Installing python has never been an easy task for me. I remember back in 2016 I wanted to learn how to use pyspark and thus python, I couldn’t figure out how to install python so I gave up. In graduate school I couldn’t install python so I used a docker container my professor created and never changed a thing. When working at RStudio I used the Jupyter Lab instance in RStudio Workbench when I couldn’t install it locally.
Now, I want to compare pysal results to some functionality I’ve written in R. To do that, I need a python installation. I’ve heard extra horror stories about installing Python on the new Mac M1 chip—which I have.
Prior to installing, I took to twitter for suggestions. I received the phenomenal tweet below encouraging me to install with {reticulate}
1 which was absolutely phenomenal advice.
1 is a package that lets you call python from R.
reticulate::install_miniconda() 😉
— Kevin Ushey (@kevin_ushey) February 8, 2022
Installing Python
The steps to install python, at least for me, was very simple.
- Install reticulate
- Install miniconda
install.packages("reticulate")
::install_miniconda() reticulate
That’s it. That’s all it took.
Creating my first conda environment
After installing python, I restarted R, and began building my first conda environment. I created a conda environment called geo
for my geospatial work. I installed libpysal
, geopandas
, and esda
. These installed every other dependency I needed–e.g. pandas
, and numpy
.
::conda_create("geo")
reticulate::use_condaenv("geo")
reticulate::conda_install("geo", c("libpysal", "geopandas", "esda")) reticulate
Using my conda environment
To begin using my new conda environment, I opened up a fresh R session and a fresh R Markdown document. In my first code chunk I told reticulate which conda environment to use. Then my following code chunks were python which opened up the python repl. Make sure that you start your code chunk with ```{python}
reticulate::use_condaenv("geo")
In the following example I utilize esda
to calculate a local join count.
import libpysal
import geopandas as gpd
from esda.join_counts_local import Join_Counts_Local
fp = libpysal.examples.root + "/guerry/" + "Guerry.shp"
guerry_ds = gpd.read_file(fp)
guerry_ds['SELECTED'] = 0
guerry_ds.loc[(guerry_ds['Donatns'] > 10997), 'SELECTED'] = 1
w = libpysal.weights.Queen.from_dataframe(guerry_ds)
LJC_uni = Join_Counts_Local(connectivity=w).fit(guerry_ds['SELECTED'])
LJC_uni.p_sim
## array([ nan, nan, nan, nan, nan, nan, nan, nan, nan,
## nan, nan, nan, 0.435, nan, 0.025, 0.025, nan, 0.328,
## nan, nan, nan, nan, nan, nan, 0.342, nan, 0.334,
## nan, nan, nan, nan, nan, nan, 0.329, nan, nan,
## nan, nan, nan, nan, nan, nan, nan, nan, nan,
## nan, nan, nan, nan, nan, nan, nan, nan, 0.481,
## nan, nan, nan, nan, nan, nan, nan, nan, nan,
## nan, nan, nan, nan, nan, nan, nan, nan, nan,
## nan, nan, 0.02 , nan, nan, nan, nan, nan, 0.125,
## nan, 0.043, nan, nan])