We may earn an affiliate commission when you visit our partners.
Boris Paskhaver

Student Testimonials:

Read more

Student Testimonials:

  • The instructor knows the material, and has detailed explanation on every topic he discusses. Has clarity too, and warns students of potential pitfalls. He has a very logical explanation, and it is easy to follow him. I highly recommend this class, and would look into taking a new class from him. - Diana

  • This is excellent, and I cannot complement the instructor enough. Extremely clear, relevant, and high quality - with helpful practical tips and advice. Would recommend this to anyone wanting to learn pandas. Lessons are well constructed. I'm actually surprised at how well done this is. I don't give many 5 stars, but this has earned it so far. - Michael

  • This course is very thorough, clear, and well thought out. This is the best Udemy course I have taken thus far. (This is my third course.) The instruction is excellent. - James

Welcome to the most comprehensive Pandas course available on Udemy. An excellent choice for both beginners and experts looking to expand their knowledge on one of the most popular Python libraries in the world.

Data Analysis with Pandas and Python offers 19+ hours of in-depth video tutorials on the most powerful data analysis toolkit available today. Lessons include:

  • installing

  • sorting

  • filtering

  • grouping

  • aggregating

  • de-duplicating

  • pivoting

  • munging

  • deleting

  • merging

  • visualizing

and more.

Why learn pandas?

If you've spent time in a spreadsheet software like Microsoft Excel, Apple Numbers, or Google Sheets and are eager to take your data analysis skills to the next level, this course is for you.  

Data Analysis with Pandas and Python introduces you to the popular Pandas library built on top of the Python programming language. 

Pandas is a powerhouse tool that allows you to do anything and everything with colossal data sets analyzing, organizing, sorting, filtering, pivoting, aggregating, munging, cleaning, calculating, and more.  

I call it "Excel on steroids".

Over the course of more than 19 hours, I'll take you step-by-step through Pandas, from installation to visualization. We'll cover hundreds of different methods, attributes, features, and functionalities packed away inside this awesome library. We'll dive into tons of different datasets, short and long, broken and pristine, to demonstrate the incredible versatility and efficiency of this package.

Data Analysis with Pandas and Python is bundled with dozens of datasets for you to use. Dive right in and follow along with my lessons to see how easy it is to get started with pandas.

Whether you're a new data analyst or have spent years (*cough* too long *cough*) in Excel, Data Analysis with pandas and Python offers you an incredible introduction to one of the most powerful data toolkits available today.

Enroll now

What's inside

Learning objectives

  • Perform a multitude of data operations in python's popular pandas library including grouping, pivoting, joining and more!
  • Learn hundreds of methods and attributes across numerous pandas objects
  • Possess a strong understanding of manipulating 1d, 2d, and 3d data sets
  • Resolve common issues in broken or incomplete data sets

Syllabus

Learn about the pandas library for data analysis, install the Anaconda distribution, download course materials, and explore the Jupyter Lab coding environment
Read more

Welcome to Data Analysis with Pandas and Python! In this lesson, we'll introduce the pandas library, the Python language, the structure of the course, and the prerequisites.

In this lesson, we download and install the Anaconda distribution for macOS computers. Windows users are welcome to skip this lesson.

In this lesson, we download and install the Anaconda distribution for Windows computers. macOS users are welcome to skip this lesson.

Learn how to uninstall the Anaconda distribution both Windows and macOS computers.

Anaconda Navigator is a graphical program for creating and managing conda environments. In this lesson, we create a new environment for the course and install pandas within it. We also setup the Jupyter Lab coding environment where we'll be writing our Python/pandas code.

Download the course materials (datasets and Jupyter Notebooks) for the course.

In this lesson, we walk through the process of starting up and shutting down Jupyter Lab, our coding environment. We open some sample Jupyter Notebooks and describe how a Python server runs continuously in the background, waiting to execute the contents of a code cell.

In this lesson, we introduce the Jupyter Lab interface. A Notebook consists of cells, which can have different types. We introduce some common actions like creating cells, cutting and pasting cells, stopping the kernel, and restarting the Jupyter server.

In this lesson, we observe how to execute Python code cells in Jupyter Lab. Use Shift + Enter to run a cell and navigate to the next one. Use Ctrl + Enter to execute a cell and stay within it.

To conserve memory, Jupyter won't load Python packages into your Notebook automatically. In this lesson, we use Python's import keyword to bring the pandas library into a Notebook. We also talk about assigning aliases with the as keyword.

Test your knowledge of the concepts introduced in this section in this multiple-choice quiz.

Learn the fundamentals of the Python programming language including basic data types, variables, Booleans, functions, lists, and dictionaries

A comment is a line ignored by the Python interpreter when the program/cell runs. Declare a comment with a hashtag (#) symbol.

In this lesson, we introduce the most common data types in Python including integers, floating-points, strings, Booleans, and None.

In this lesson, we discuss common mathematical and logical operators including addition, subtraction, multiplication, division, concatenation, modulo, equality, inequality, and more.

A variable is a name we assign to a value in our program. In this lesson, we practice declaring variables and discuss Python community conventions for naming them.

Declare Variables

A function is a reusable procedure, a sequence of steps to follow in order. In this lesson, we introduce Python's built-in functions and the syntax for invoking them.

Built-in Functions

Now it's time to build our own custom functions. In this lesson, we walk through defining a temperature conversion function from start to finish.

Custom Functions

A method is a function attached to an object. It's a command or action we can ask the object to take. In this lesson, we explore some common string methods and discuss mutable vs. immutable objects.

String Methods

A list is a mutable collection of ordered values. In this lesson, we learn the syntax for declaring lists as well as some common methods like pop and append.

Creating Lists

Python assigns each list element and each string character an index position that reflects its place in line. In this lesson, we learn how to extract elements and characters from their lists/strings using square bracket notation.

Index Positions and Slicing

A dictionary is a mutable collection of key-value pairs. A key serves as a unique identifier for a value. The keys must be unique, while the values can contain duplicates. In this lesson, we practice declaring some dictionary objects.

Creating Dictionaries

A class is a blueprint/template for creating an object. In this lesson, we walk through the terminology and provide a real-world analogy.

In this lesson, we import the pandas library and explore some of its available classes, functions, and modules.

Test your knowledge of the concepts introduced in this course section.

Create and work with the pandas Series object, a one-dimensional labelled array that combines the best features of a list and dictionary

A pandas Series is a one-dimensional labelled array that combines the best features of a list and a dictionary. In this lesson, we instantiate our first Series objects and introduce the index, the collection of identifiers for the Series' values.

In this lesson, we practice creating Series objects with dictionaries as the data source. Pandas will use the keys for the Series's index labels ad the values for the Series's values.

Create a Series Object

In this lesson, we invoke some sample methods like sum, product, and mean on Series objects.

An attribute is a piece of data that lives on an object. It's a fact, a detail, a characteristic of the object. In this lesson, we access various attributes on the Series and introduce the concept of composition. We also explore the underlying numpy.ndarray object that holds the Series' values.

Attributes and Methods on a Series

A parameter is the name for an expected input to a function/method/class instantiation. An argument is the concrete value we provide for a parameter during invocation. In this lesson, we discuss the data and index parameters of the Series constructor.

Parameters and Arguments

A CSV is a plain text file that uses line breaks to separate rows and commas to separate row values. In this lesson, we use the pd.read_csv function to import 2 CSV datasets into pandas. We also introduce the 2-dimensional DataFrame object and learn how to convert it to a 1-dimensional Series.

Import Series with the read_csv Function

The head method returns a number of rows from the beginning of the Series. The complementary tail method returns a number of rows from the end of the Series.

The head and tail Methods

In this lesson, we pass a Series to Python's built-in functions including len, type, list, dict, sorted, max, and min.

In this lesson, we practice using Python's in and not in keywords to check for inclusion among the Series' values and index labels.

The sort_values method sorts a Series values in order. In this lesson, we invoke the method on both our alphabetical and numeric Series and also learn how to customize the sort type.

The sort_values Method

In this lesson, we set a custom index on our Series and learn how to sort an index using the sort_index method.

The sort_index Method
Check for Inclusion with Python's in Keyword

In this lesson, we use the iloc accessor to extract a Series value by its index position. iloc is short for "index location" and requires a special square bracket syntax.

In this lesson, we use the loc accessor to extract a Series value by its index label. loc requires a special square bracket syntax.

Extract Series Values by Index Position or Index Label

In this lesson, we introduce the get method for retrieving a Series value by index label and providing a fallback value in case the label does not exist.

In this lesson, we show the syntax to overwrite a Series value. We first target it with the iloc/loc accessor, then provide an equal sign and the value to overwrite the origin value with.

In this lesson, we discuss the differences between a copy and a view in pandas. We also learn the benefits of the copy method in creating a clone of a pandas object.

In this lesson, we run through some common mathematical methods on Series including count, sum, product, mean, max, min, median, mode, and more.

Broadcasting describes the process of applying an arithmetic operation to an array. We can combine mathematical operators with a Series to apply the mathematical operation to every value.

In this lesson, we explore the value_counts method, which returns the number of times each unique value occurs in the Series. The normalize parameter returns the relative frequencies / percentages of the values instead of the counts.

The value_counts Method

In this lesson, we use the apply method to invoke a function for every Series value. Pandas collects the results in a new Series. The advantage of apply is that we can utilize basic Python code to achieve whatever manipulation we want. If we don't know a specific Series method but can accomplish the same result with Python constructs, apply can be a useful tool.

The map method connects each Series value to a value from another data structure. It provides a mapping/connection/association/bridge to the other value. In this lesson, we practice using the method with arguments of a dictionary and a Series.

Test your knowledge of the Series concepts introduced in this section in this multiple-choice quiz.

Dive into the pandas DataFrame object, a two-dimensional table for storing data

A DataFrame is a 2-dimensional table with an index. In this lesson, we introduce this new data structure and explore some of the methods and attributes it shares with the Series object. We also identify some unique attributes that exist only on one object but not the other.

In this lesson, we do a deeper dive into the sum method and how it operates differently between Series and DataFrame objects.

In this lesson, we introduce two syntax options to extract a column from a DataFrame: attribute access and square brackets. We also discuss the tradeoffs between the two approaches. Pandas returns a view when extracting a single Series from a DataFrame.

Select One Column from a DataFrame

In this lesson, we learn how to extract multiple DataFrame columns by passing a list between the square bracket extraction syntax. Pandas returns a copy/new DataFrame when extracting multiple columns.

Select Multiple Columns from a DataFrame

In this lesson, we add a new column to a DataFrame using square bracket notation. We show how to populate the new Series with a single value or a dynamic calculation from performing an operation on another Series' values.

In this lesson, we quickly review the value_counts method on a Series, which counts the number of occurrences of every unique value in a Series.

In this lesson, we practice using the dropna method to remove DataFrame rows consisting of missing/NaN values. We discuss how to target rows that only hold missing values as well as rows with a missing value in a target column.

Drop DataFrame Rows with Missing Values

In this lesson, we explore an alternative approach for dealing with missing values: using the fillna method to populate missing values with a static value. We practice the method on both a DataFrame and a Series.

In this lesson, we introduce the astype method for converting the data types in a Series. We practice converting our floating-point columns to store integers.

The category type is helpful when a Series has a small number of unique values. In this lesson, we convert two columns in our nba DataFrame to store category values.

The astype Method

In this lesson, we explore the sort_values method on a DataFrame. The default sort order is ascending (smallest to greatest, alphabetical), but we can customize the order with the ascending parameter. We also discuss the na_position parameter for placing the NaN values at the beginning or end of the sorted values.

In this lesson, we sort a DataFrame by multiple columns by passing a list of column names to the by parameter. We also customize the sort order for each type by passing a list to the ascending parameter.

Sort a DataFrame with the sort_values Method

The sort_index method sorts a DataFrame by the index labels. In this lesson, we explore the method and a few of its parameters.

In this lesson, we learn the rank method for ordering and ranking the values in a Series. We use it to the rank our NBA players by their salaries.

Test your knowledge of this section's DataFrames concepts in this multiple choice quiz.

Filter rows from a DataFrame using conditions, logical operations, and various methods

Welcome to the next section of the course! In this lesson, we import and introduce the new employees DataFrame. We also convert some columns to their optimal formats and introduce the to_datetime function at the top level of pandas.

To filter a DataFrame, we must first generate a Boolean Series, then pass it in square brackets after the DataFrame. In this lesson, we practice extraction using a variety of data types and operations (equality, less than, greater than, and more).

Filter a DataFrame Based on a Condition

In this lesson, we introduce the & operator for combining two Boolean Series with AND logic. We use this technique to filter a subset of DataFrame rows that fit multiple conditions.

Filter DataFrame with More than One Condition (AND - &)

In this lesson, we introduce the | operator for combining two Boolean Series with OR logic. We use this technique to filter a subset of DataFrame rows that fit either one of several conditions. We also discuss caveats when combining & and | in the extraction syntax.

Filter DataFrame with More than One Condition (OR - |)

The isin method checks for each Series' value presence in a predefined list. It returns a Boolean Series if the row's value is found within the collection.

The isin Method

In this lesson, we discuss the isnull and notnull methods. They generate Boolean Series that validate whether a row's value is NaN or non-NaN. We apply these methods to a few examples.

In this lesson, we utilize the between method to check if each Series value exists within a range/boundary of values. We utilize the resulting Boolean Series to filter our DataFrame.

The between Method

Good to know

Know what's good
, what to watch for
, and possible dealbreakers
Offers a comprehensive toolkit for data manipulation, analysis, and visualization, making it highly valuable for professionals in data-driven roles
Provides a strong foundation in Pandas, starting with installation and progressing to advanced operations like pivoting and munging, which is suitable for various skill levels
Bridges the gap between spreadsheet software and Python-based data analysis, offering a transition for those looking to leverage more powerful tools
Bundled with numerous datasets, allowing learners to immediately apply the concepts taught and gain practical experience with real-world data scenarios
Includes lessons on installing and uninstalling the Anaconda distribution on both Windows and macOS, which may be useful for learners who want to use this platform
Explores the Jupyter Lab coding environment, which is a popular tool for data analysis and visualization, and teaches learners how to use it effectively

Save this course

Save Data Analysis with Pandas and Python to your list so you can find it easily later:
Save

Activities

Be better prepared before your course. Deepen your understanding during and after it. Supplement your coursework and achieve mastery of the topics covered in Data Analysis with Pandas and Python with these activities:
Review Python Fundamentals
Strengthen your understanding of Python fundamentals before diving into Pandas. This will make learning Pandas syntax and concepts easier.
Browse courses on Python Basics
Show steps
  • Review data types, variables, and operators in Python.
  • Practice writing basic Python functions and control flow statements.
  • Work through online Python tutorials or exercises.
Review 'Data Science from Scratch' by Joel Grus
Expand your data science knowledge with a book that covers statistics, machine learning, and data visualization. This will provide a broader context for your Pandas skills.
Show steps
  • Read the chapters on statistics and data visualization.
  • Explore the examples related to data analysis.
  • Consider how the concepts relate to your Pandas projects.
Review 'Python for Data Analysis' by Wes McKinney
Deepen your understanding of Pandas with a comprehensive guide written by its creator. This book provides detailed explanations and practical examples.
Show steps
  • Read the chapters relevant to the course syllabus.
  • Work through the examples provided in the book.
  • Experiment with different Pandas functions and techniques.
Four other activities
Expand to see all activities and additional details
Show all seven activities
Pandas Data Manipulation Exercises
Reinforce your Pandas skills through targeted practice exercises. This will help you become more comfortable with common data manipulation tasks.
Show steps
  • Find online Pandas exercise datasets.
  • Practice filtering, sorting, and grouping data.
  • Work on exercises involving merging and joining DataFrames.
Create a Pandas Cheat Sheet
Consolidate your knowledge by creating a cheat sheet of commonly used Pandas functions and techniques. This will serve as a valuable reference for future projects.
Show steps
  • Identify the most important Pandas functions and methods.
  • Organize the cheat sheet by category (e.g., data selection, filtering, grouping).
  • Include concise explanations and examples for each function.
Analyze a Real-World Dataset with Pandas
Apply your Pandas knowledge to a real-world dataset to solidify your understanding. This will give you practical experience in data analysis.
Show steps
  • Choose a dataset from a source like Kaggle or UCI Machine Learning Repository.
  • Use Pandas to clean, transform, and analyze the data.
  • Visualize your findings using Matplotlib or Seaborn.
  • Document your analysis and findings in a report.
Help others in online forums
Reinforce your understanding of Pandas by helping others learn. Explaining concepts to others is a great way to solidify your own knowledge.
Show steps
  • Find online forums or communities related to Pandas.
  • Answer questions from other learners.
  • Explain concepts in a clear and concise manner.

Career center

Learners who complete Data Analysis with Pandas and Python will develop knowledge and skills that may be useful to these careers:
Data Analyst
A data analyst uses tools like Pandas and Python to extract insights from data, making this course particularly relevant for aspiring data analysts. The role involves data cleaning, manipulation, and analysis, all of which are covered in this course. Data analysts need to be able to sort, filter, group, aggregate, and visualize data, skills that are taught explicitly in this course. The course's comprehensive approach, with its focus on real-world datasets, provides a practical foundation for anyone looking to enter the field and perform these kinds of data operations daily. The included lessons on installing pandas and setting up the coding environment means that students will be able to get to work immediately.
Business Intelligence Analyst
Business intelligence analysts work to identify business trends through data analysis, often using tools such as Pandas. This course helps prepare a future business intelligence analyst by providing a thorough tutorial in data operations, which is a fundamental component of business intelligence. Business intelligence analysts must be able to effectively manipulate and analyze data to produce actionable insights, and this course provides a strong foundation in these areas. The course’s focus on cleaning, sorting, filtering, and aggregating datasets is directly applicable to the daily tasks of a business intelligence analyst, and the included tutorials on visualization will help students to present their findings clearly.
Financial Analyst
Financial analysts use data analysis to make financial forecasts and recommendations, which can be aided with the Pandas Python library. This course in data analysis with Pandas helps future financial analysts learn how to effectively process and extract information from large financial datasets. Financial analysts often need to handle large datasets, requiring the ability to perform tasks such as filtering, sorting, and aggregating data. The course covers these operations in detail, which is useful for these purposes. The course's focus on practical applications using real datasets provides a valuable skillset for a financial analyst.
Market Research Analyst
Market research analysts analyze market trends and consumer behavior through data, and learning Pandas for data analysis helps significantly in this role. This course is directly relevant for anyone aiming to be a market research analyst. Market research analysts need to be able to work efficiently with data. This course helps build a foundation in data manipulation using Python and Pandas. This course’s emphasis on hands-on exercises and diverse datasets will prepare a market research analyst to handle real-world data effectively. The ability to sort, filter, and analyze data, which is emphasized in this course, is key to drawing accurate conclusions from market data. The tutorials on installation and environment setup also allow the user to work immediately.
Data Scientist
Data scientists use programming languages and statistical tools to analyze and interpret large datasets, and Pandas is a critical tool for data preparation. This course in Data Analysis with Pandas helps aspiring data scientists learn how to effectively manipulate large datasets, a crucial part of the data science process. Data scientists need skills in data cleaning, transformation, and analysis, all of which are covered in this course's 19 hours of content. This course, with its extensive lessons on data manipulation, filtering, grouping, and more, is especially useful for data scientists who need to prepare data for machine learning models or other complex analyses. A strong knowledge of Pandas allows data scientists to work more efficiently and effectively.
Research Analyst
Research analysts use data to conduct studies and investigate various topics, and this course could be useful for this career path. The course provides a thorough guide to data analysis using Pandas, beginning with installation, covering a broad array of manipulation techniques, and extending to data visualization. Many research analysts may find themselves working with large datasets, which this course prepares its students to handle. While this course does not focus on statistical analysis, it provides the essential data processing skills needed to prepare data for analysis. This course would be particularly helpful for those wanting to develop foundational skills in Pandas.
Quantitative Analyst
Quantitative analysts, often working in finance, use mathematical and statistical models to analyze data, and a library like Pandas helps them to organize data. This course may be useful for those who are new to data analysis and wish to become a quantitative analyst, especially for those with less experience with the Pandas library. This course introduces the student to fundamental data operations, such as filtering, aggregating, and visualizing, and provides practical experience with many real-world data sets. This course will be useful for a quantitative analyst who needs to perform fundamental data manipulation as part of their workflow.
Operations Analyst
An operations analyst analyzes operational data to improve efficiency, and this course in Pandas may be useful for this career. Operations analysts who wish to gain skills in data manipulation may want to take this course. Operations analysts may make use of data to identify trends, streamline processes, and improve workflow, making Pandas skills valuable. This course's focus on practical data handling, including techniques to sort, filter, and group data, will be beneficial to an operations analyst. The course provides a robust introduction to data analysis with Pandas, and can be a solid starting point for individuals interested in operations analysis.
Database Administrator
A database administrator is responsible for the maintenance and organization of databases, and while this course doesn't focus on databases directly, it may be useful for querying and analyzing data pulled from databases. Database administrators who want to gain skills in data manipulation may find some use from this course. Database administrators may use data analysis tools for tasks such as identifying opportunities for database optimization, creating reports on database performance, and so on. While this course does not directly discuss databases, its detailed exploration of the Pandas library provides a basis in data analysis. This may be helpful to database administrators who seek to better understand the data within their databases.
Project Manager
Project managers oversee projects, and while this course doesn't focus directly on project management, experience with data manipulation can help a project manager. Project managers who are learning how to analyze data may find this course to be of some use. Project managers can use data analysis to monitor project progress, track resource allocation, and identify potential issues. While this is not a core job function of a project manager, learning data manipulation, as taught in this course, could be valuable. This course can help a project manager learn the basics of data analysis, which can be useful in overall process management.
Management Consultant
Management consultants analyze business problems and suggest solutions, and while this course does not directly teach business strategy, this course may help a management consultant to improve data analysis skills. Management consultants may need to process data for presentations and to extract information. This course will help them learn how to manipulate datasets, and to create visualizations. This course provides a solid foundation in data manipulation and analysis, which can be a useful skill for a management consultant.
Actuary
Actuaries assess risk and analyze data for insurance and finance, and this course may be useful for learning to handle data sets, but it would only be a small part of the skills they require. Actuaries may find that this course provides a useful introduction to data handling, as it provides instruction in how to sort, filter, and generally manipulate datasets. Actuaries need to be able to work effectively with data, and this course offers practical experience using the Pandas library, although it would only be a small part of an actuary's skillset. The course provides a good introduction to data cleaning and processing.
Statistician
A statistician develops and applies statistical theories, and while this course does not teach statistics, it may be useful in manipulating data. While a statistician needs deep knowledge of statistical methods, the lessons on Pandas may help them with data wrangling and pre-processing. A statistician can use Pandas to prepare datasets for statistical modeling and for exploration. This course covers data manipulation techniques that will be helpful to future statisticians, although more coursework will be needed to master statistical theory.
Research Scientist
Research scientists conduct scientific research, and while this course doesn't teach science, it may be useful to those who use data in their investigations. Research scientists sometimes need to be able to analyze and manipulate data, and this course can provide a practical guide to manipulating data using Pandas. Research scientists who are less skilled in data manipulation, but work with data regularly, will find this course provides an introduction to data operations, such as sorting and filtering.
Software Engineer
Software engineers design and develop software, and while this course isn't directly related to software development, some software engineers may find data manipulation skills useful. Software engineers who work with data heavy projects, or who perform testing, may find this course is useful. Although it is not a central skill for most software engineers, this course provides some basic skills in data manipulation, and may be helpful for software engineers who need to deal directly with data sets. The course's lessons on Python and Pandas can help software engineers to handle data-related tasks.

Reading list

We've selected two books that we think will supplement your learning. Use these to develop background knowledge, enrich your coursework, and gain a deeper understanding of the topics covered in Data Analysis with Pandas and Python.
This book, written by the creator of Pandas, is an invaluable resource for anyone serious about data analysis with Python. It provides a comprehensive guide to using Pandas for data manipulation, cleaning, and analysis. It serves as both a tutorial and a reference, offering in-depth explanations and practical examples. is commonly used as a textbook at academic institutions and by industry professionals.
Provides a broader context for data analysis, covering fundamental concepts in statistics, machine learning, and data visualization. While not solely focused on Pandas, it offers valuable insights into the underlying principles of data science. It is more valuable as additional reading than it is as a current reference. It is helpful in providing background or prerequisite knowledge.

Share

Help others find this course page by sharing it with your friends and followers:

Similar courses

Similar courses are unavailable at this time. Please try again later.
Our mission

OpenCourser helps millions of learners each year. People visit us to learn workspace skills, ace their exams, and nurture their curiosity.

Our extensive catalog contains over 50,000 courses and twice as many books. Browse by search, by topic, or even by career interests. We'll match you to the right resources quickly.

Find this site helpful? Tell a friend about us.

Affiliate disclosure

We're supported by our community of learners. When you purchase or subscribe to courses and programs or purchase books, we may earn a commission from our partners.

Your purchases help us maintain our catalog and keep our servers humming without ads.

Thank you for supporting OpenCourser.

© 2016 - 2025 OpenCourser