From ab5b201baca68c447724a4373584e465006f8693 Mon Sep 17 00:00:00 2001 From: John Stachurski Date: Tue, 30 Jul 2024 11:00:11 +1000 Subject: [PATCH 1/4] misc --- .../about_py/pytorch_vs_matlab.png | Bin 0 -> 58998 bytes lectures/about_py.md | 343 +++++++++++++++--- 2 files changed, 290 insertions(+), 53 deletions(-) create mode 100644 lectures/_static/lecture_specific/about_py/pytorch_vs_matlab.png diff --git a/lectures/_static/lecture_specific/about_py/pytorch_vs_matlab.png b/lectures/_static/lecture_specific/about_py/pytorch_vs_matlab.png new file mode 100644 index 0000000000000000000000000000000000000000..7230ad093e1aefb5dbc88b067c368151f19c8723 GIT binary patch literal 58998 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 is a general-purpose language used in almost all application domains such as +{index}`Python ` is a general-purpose language used in almost all application domains, including -* AI +* AI +* scientific computing * communication * web development * CGI and graphical user interfaces * game development * resource planning -* multimedia, data science, security, etc., etc., etc. +* multimedia +* etc. -Used and supported extensively by Internet services and high-tech companies including +It is used and supported extensively by tech firms including * [Google](https://www.google.com/) +* [OpenAI](https://openai.com/) * [Netflix](https://www.netflix.com/) * [Meta](https://opensource.fb.com/) * [Dropbox](https://www.dropbox.com/) * [Amazon](https://www.amazon.com/) * [Reddit](https://www.reddit.com/) +* etc. -For reasons we will discuss, Python is particularly popular within the scientific community - -Meanwhile, Python is also very beginner-friendly and is found to be suitable for -students learning programming and recommended to introduce computational methods -to students in fields other than computer science. -Python is also replacing familiar tools like Excel as an essential skill in the fields of finance and banking. ### Relative Popularity -The following chart, produced using Stack Overflow Trends, shows one measure of the relative popularity of Python +Python is, without doubt, one of the [most popular programming languages](https://www.tiobe.com/tiobe-index/). + +For reasons we will discuss, Python is particularly popular within the scientific community -- especially AI + +The following chart, produced using Stack Overflow Trends, provides some evidence. + +It shows the popularity of a Python AI library called [PyTorch](https://pytorch.org/) relative to MATLAB. -```{figure} /_static/lecture_specific/about_py/python_vs_matlab.png +```{figure} /_static/lecture_specific/about_py/pytorch_vs_matlab.png ``` -The figure indicates not only that Python is widely used but also that adoption of Python has accelerated significantly since 2012. +Note that this is just one of the thousands of Python libraries available for scientic computing. -This is driven at least in part by uptake in the scientific domain, particularly in rapidly growing fields like data science and AI. +While some are for AI and deep learning, others perform simple but useful tasks. +For example, Python libraries like [pandas](https://pandas.pydata.org/) and [Polars](https://pola.rs/) are replacing familiar tools like Excel and VBA as an essential skill in the fields of finance and banking. ### Features -Python is a [high-level language](https://en.wikipedia.org/wiki/High-level_programming_language) suitable for rapid development. +Python is a [high-level language](https://en.wikipedia.org/wiki/High-level_programming_language), which means it is to read, write and debug. -It has a relatively small core language supported by many libraries. +It has a relatively small core language that is easy to learn. + +This core is supported by many libraries, which you can learn to use as required. + +Python is very beginner-friendly + +* suitable for students learning programming +* used in many undergraduate and graduate programs Other features of Python: * multiple programming styles are supported (procedural, object-oriented, functional, etc.) -* it is interpreted rather than compiled. +* [interpreted](https://en.wikipedia.org/wiki/Interpreter_(computing)) rather than [compiled](https://en.wikipedia.org/wiki/Compiler) ahead of time. + + ### Syntax and Design ```{index} single: Python; syntax and design ``` -One nice feature of Python is its elegant syntax --- we'll see many examples later on. +One reason for Python's popularity is its simple and elegant design --- we'll see many examples later on. + +To get a feeling for this, let's look at an example. + +The code below is written in [Java](https://en.wikipedia.org/wiki/Java_(programming_language)) rather than Python. + +You do **not** need to read and understand this code! + + +```{code-block} java +:class: no-execute + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; + +public class CSVReader { + public static void main(String[] args) { + String filePath = "data.csv"; + String line; + String splitBy = ","; + int columnIndex = 1; + double sum = 0; + int count = 0; + + try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { + while ((line = br.readLine()) != null) { + String[] values = line.split(splitBy); + if (values.length > columnIndex) { + try { + double value = Double.parseDouble( + values[columnIndex] + ); + sum += value; + count++; + } catch (NumberFormatException e) { + System.out.println( + "Skipping non-numeric value: " + + values[columnIndex] + ); + } + } + } + } catch (IOException e) { + e.printStackTrace(); + } + + if (count > 0) { + double average = sum / count; + System.out.println( + "Average of the second column: " + average + ); + } else { + System.out.println( + "No valid numeric data found in the second column." + ); + } + } +} + +``` + +This Java code opens an imaginary file called `data.csv` and computes the mean +of the values in the second column. + +Even without knowing Java, you can see that the program is long and complex. + +Here's Python code that does the same thing. + +Even if you don't yet know Python, you can see that the code is simpler and +easier to read. + +```{code-cell} python3 +:class: no-execute + +import csv + +total, count = 0, 0 +with open(data.csv, mode='r') as file: + reader = csv.reader(file) + for row in reader: + try: + total += float(row[1]) + count += 1 + except (ValueError, IndexError): + pass +print(f"Average: {total / count if count else 'No valid data'}") + +``` -Elegant code might sound superfluous but in fact it's highly beneficial because it makes the syntax easy to read and easy to remember. +The simplicity of Python and its neat design are a big factor in its popularity. -Closely related to elegant syntax is an elegant design. -Features like iterators, generators, decorators and list comprehensions make Python highly expressive, allowing you to get more done with less code. +### The AI Connection -[Namespaces](https://en.wikipedia.org/wiki/Namespace) improve productivity by cutting down on bugs and syntax errors. +Unless you have been living under a rock and avoiding all contact with the +modern world, you will know that AI is rapidly advancing. +AI is already remarkably good at helping you write code, as discussed above. -## Scientific Programming +No doubt AI will take over many tasks currently performed by humans, +just like other forms of machinery have done over the past few centuries. + +Python is playing a huge role in the advance of AI and machine learning. + +This means that tech firms are pouring money into development of extremely +powerful Python libraries. + +Even if you don't plan to work on AI and machine learning, you can benefit from +learning to use some of these libraries for your own projects in economics, +finance and other fields of science. + +These lectures will explain how. + + +## Scientific Programming with Python ```{index} single: scientific programming ``` -Python has become one of the core languages of scientific computing. +We have already discussed the importance of Python for AI, machine learning and data science -It's either the dominant player or a major player in +Let's take a look at the role of Python in other areas of scientific computing. + +Python is either the dominant player or a major player in -* AI, machine learning and data science * astronomy * chemistry * computational biology @@ -137,39 +301,87 @@ It's either the dominant player or a major player in * natural language processing * etc. -This section briefly showcases some examples of Python for scientific programming. +Use of Python is also rising in economics, finance, and adjacent fields like +operations research -- which were previously dominated by MATLAB / Excel / STATA / C / Fortran. + +This section briefly showcases some examples of Python for general scientific programming. -* All of these topics below will be covered in detail later on. -### Numerical Programming +### NumPy ```{index} single: scientific programming; numeric ``` -Fundamental matrix and array processing capabilities are provided by the excellent [NumPy](http://www.numpy.org/) library. +One of the most important parts of scientific computing is working with data. -NumPy provides the basic array data type plus some simple processing operations. +Data is often stored in matrices, vectors and arrays. -For example, let's build some arrays +We can create a simple array of numbers with pure Python as follows: + +```{code-cell} python3 +a = [-3.14, 0, 3.14] # A Python list +a +``` + +This array is very small so it's fine to work with pure Python. + +But when we want to work with larger arrays in real programs we need more efficiency and more tools. + +For this we need to use libraries for working with arrays. + +For Python, the most important matrix and array processing library is +[NumPy](http://www.numpy.org/) library. + +For example, let's build a NumPy array with 100 elements ```{code-cell} python3 import numpy as np # Load the library a = np.linspace(-np.pi, np.pi, 100) # Create even grid from -π to π +a +``` + +Now let's transform this array by applying functions to it. + +```{code-cell} python3 b = np.cos(a) # Apply cosine to each element of a c = np.sin(a) # Apply sin to each element of a ``` -Now let's take the inner product +Now we can easily take the inner product of `b` and `c`. ```{code-cell} python3 b @ c ``` -The number you see here might vary slightly but it's essentially zero. +We can also do many other tasks, like + +* compute the mean and variance of arrays +* build matrices and solve linear systems +* generate random arrays for simulation, etc. + +We will discuss the details later in the lecture series, where we cover NumPy in depth. + -(For older versions of Python and NumPy you need to use the [np.dot](http://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html) function) +### NumPy Alternatives + +While NumPy is still the king of array processing in Python, there are now +important competitors. + +Libraries such as [JAX], [Pytorch], and [CuPy](https://cupy.dev/) also have +built in array types and array operations that can be very fast and efficient. + +In fact these libraries are better at exploiting parallelization and fast hardware, as +we'll explain later in this series. + +However, you should still learn NumPy first because + +* NumPy is simpler and provides a strong foundation, and +* libraries like JAX directly extend NumPy functionality and hence are easier to + learn when you already know NumPy. + +### SciPy The [SciPy](http://www.scipy.org) library is built on top of NumPy and provides additional functionality. @@ -196,11 +408,16 @@ SciPy includes many of the standard routines used in See them all [here](http://docs.scipy.org/doc/scipy/reference/index.html). +Later we'll discuss SciPy in more detail. + + ### Graphics ```{index} single: Matplotlib ``` +A major strength of Python is data visualization. + The most popular and comprehensive Python library for creating figures and graphs is [Matplotlib](http://matplotlib.org/), with functionality including * plots, histograms, contour images, 3D graphs, bar charts etc. @@ -235,14 +452,28 @@ Other graphics libraries include You can visit the [Python Graph Gallery](https://www.python-graph-gallery.com/) for more example plots drawn using a variety of libraries. + ### Networks and Graphs -Python has many libraries for studying graphs. +The study of networks and graphs becoming an important part of scientific work +in economics, finance and other fields. + +For example, we are interesting in studying + +* production networks +* networks of banks and financial institutions +* friendship and social networks +* etc. + +(We have a [book on economic networks](https://networks.quantecon.org/) if you would like to learn more.) + +Python has many libraries for studying networks and graphs. ```{index} single: NetworkX ``` One well-known example is [NetworkX](http://networkx.github.io/). + Its features include, among many other things: * standard graph algorithms for analyzing networks @@ -278,28 +509,34 @@ nx.draw_networkx_nodes(g, plt.show() ``` + ### Other Scientific Libraries -Here's a short list of more important scientific libraries for Python. +As discussed above, there are literally thousands of scientific libraries for +Python. + +Some are small and do very specific tasks. + +Others are huge in terms of lines of code and investment from coders and tech +firms. + +Here's a short list of some important scientific libraries for Python not +mentioned above. * [SymPy](http://www.sympy.org/) for symbolic algebra, including limits, derivatives and integrals -* [pandas](http://pandas.pydata.org/) for data maniputation * [statsmodels](http://statsmodels.sourceforge.net/) for statistical routines * [scikit-learn](http://scikit-learn.org/) for machine learning -* [JAX](https://github.com/google/jax) for automatic differentiation, accelerated linear algebra and GPU computing -* [PyTorch](https://pytorch.org/) for deep learning * [Keras](https://keras.io/) for machine learning * [Pyro](https://pyro.ai/) and [PyStan](https://pystan.readthedocs.org/en/latest/) for Bayesian data analysis -* [lifelines](https://lifelines.readthedocs.io/en/latest/) for survival analysis * [GeoPandas](https://geopandas.org/en/stable/) for spatial data analysis * [Dask](https://docs.dask.org/en/stable/) for parallelization * [Numba](http://numba.pydata.org/) for making Python run at the same speed as native machine code * [CVXPY](https://www.cvxpy.org/) for convex optimization -* [PyTables](http://www.pytables.org) for managing large data sets * [scikit-image](https://scikit-image.org/) and [OpenCV](https://opencv.org/) for processing and analysing image data -* [FLAML](https://mlflow.org/docs/latest/index.html) for automated machine learning and hyperparameter tuning * [BeautifulSoup](https://www.crummy.com/software/BeautifulSoup/bs4/doc/) for extracting data from HTML and XML files In this lecture series we will learn how to use many of these libraries for scientific computing tasks in economics and finance. + + From 792d38adfe4b1b7ebe3311b220095e79ef70a598 Mon Sep 17 00:00:00 2001 From: mmcky Date: Tue, 30 Jul 2024 11:25:16 +1000 Subject: [PATCH 2/4] adjust tags --- lectures/about_py.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lectures/about_py.md b/lectures/about_py.md index 8e7f3d35..097f32b9 100644 --- a/lectures/about_py.md +++ b/lectures/about_py.md @@ -178,7 +178,6 @@ You do **not** need to read and understand this code! ```{code-block} java -:class: no-execute import java.io.BufferedReader; import java.io.FileReader; @@ -241,7 +240,7 @@ Even if you don't yet know Python, you can see that the code is simpler and easier to read. ```{code-cell} python3 -:class: no-execute +:tags: [skip-execution] import csv From a7ffd20c549081435688449a3a7bcd1b60b7a1e1 Mon Sep 17 00:00:00 2001 From: John Stachurski Date: Tue, 30 Jul 2024 11:40:31 +1000 Subject: [PATCH 3/4] misc --- lectures/about_py.md | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/lectures/about_py.md b/lectures/about_py.md index 097f32b9..43a2ad6e 100644 --- a/lectures/about_py.md +++ b/lectures/about_py.md @@ -34,17 +34,14 @@ into R." -- Chris Wiggins This lecture series will teach you to use Python for scientific computing, with a focus on economics and finance. -### Contents - The series is aimed at Python novices, although experienced users will also find useful content in later lectures. - In this lecture we will * introduce Python, * showcase some of its abilities, * discuss the connection between Python and AI, -* explain why you should be using it for scientific computing, and +* explain why Python is our favorite language for scientific computing, and * point you to the next steps. You do **not** need to understand everything you see in this lecture -- we will work through the details slowly later in the lecture series. @@ -78,7 +75,7 @@ series, as well as in our later series on [JAX](https://jax.quantecon.org/intro. We will also explain how Python's elegant design helps you write clean, efficient code. -On top of these features, Python is more widely used, with a huge and helpful community, and its also free. +On top of these features, Python is more widely used, with a huge and helpful community, and free! ## What's Python? @@ -128,7 +125,9 @@ It is used and supported extensively by tech firms including Python is, without doubt, one of the [most popular programming languages](https://www.tiobe.com/tiobe-index/). -For reasons we will discuss, Python is particularly popular within the scientific community -- especially AI +Python libraries like [pandas](https://pandas.pydata.org/) and [Polars](https://pola.rs/) are replacing familiar tools like Excel and VBA as an essential skill in the fields of finance and banking. + +Moreover, Python is extremely popular within the scientific community -- especially AI The following chart, produced using Stack Overflow Trends, provides some evidence. @@ -137,11 +136,10 @@ It shows the popularity of a Python AI library called [PyTorch](https://pytorch. ```{figure} /_static/lecture_specific/about_py/pytorch_vs_matlab.png ``` -Note that this is just one of the thousands of Python libraries available for scientic computing. +The chart shows that MATLAB's popularity has faded, while PyTorch is growing rapidly. -While some are for AI and deep learning, others perform simple but useful tasks. +Moreover, PyTorch is just one of the thousands of Python libraries available for scientic computing. -For example, Python libraries like [pandas](https://pandas.pydata.org/) and [Polars](https://pola.rs/) are replacing familiar tools like Excel and VBA as an essential skill in the fields of finance and banking. ### Features @@ -368,7 +366,7 @@ We will discuss the details later in the lecture series, where we cover NumPy in While NumPy is still the king of array processing in Python, there are now important competitors. -Libraries such as [JAX], [Pytorch], and [CuPy](https://cupy.dev/) also have +Libraries such as [JAX](https://github.com/google/jax), [Pytorch](https://pytorch.org/), and [CuPy](https://cupy.dev/) also have built in array types and array operations that can be very fast and efficient. In fact these libraries are better at exploiting parallelization and fast hardware, as From ae3d28a9ef956b2cf8749d551801129f80bb1dc2 Mon Sep 17 00:00:00 2001 From: Matt McKay Date: Tue, 30 Jul 2024 11:59:23 +1000 Subject: [PATCH 4/4] Update lectures/about_py.md --- lectures/about_py.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lectures/about_py.md b/lectures/about_py.md index 43a2ad6e..8f5a4307 100644 --- a/lectures/about_py.md +++ b/lectures/about_py.md @@ -143,7 +143,7 @@ Moreover, PyTorch is just one of the thousands of Python libraries available for ### Features -Python is a [high-level language](https://en.wikipedia.org/wiki/High-level_programming_language), which means it is to read, write and debug. +Python is a [high-level language](https://en.wikipedia.org/wiki/High-level_programming_language), which means it is relatively easy to read, write and debug. It has a relatively small core language that is easy to learn.