From 0d647cfb5f432e405a77ef1c8ae229f66c32680f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 22 Aug 2024 22:05:06 +0000 Subject: [PATCH] Render toc-less --- docs/no_toc/02-data-structures.md | 12 ++- docs/no_toc/03-data-wrangling1.md | 78 +++++++++++++----- docs/no_toc/About.md | 2 +- docs/no_toc/about-the-authors.html | 2 +- docs/no_toc/data-wrangling-part-1.html | 68 ++++++++++----- docs/no_toc/reference-keys.txt | 1 + .../figure-html/unnamed-chunk-13-5.png | Bin 0 -> 67349 bytes .../figure-html/unnamed-chunk-14-7.png | Bin 0 -> 67349 bytes docs/no_toc/search_index.json | 2 +- docs/no_toc/working-with-data-structures.html | 11 ++- 10 files changed, 121 insertions(+), 55 deletions(-) create mode 100644 docs/no_toc/resources/images/03-data-wrangling1_files/figure-html/unnamed-chunk-13-5.png create mode 100644 docs/no_toc/resources/images/03-data-wrangling1_files/figure-html/unnamed-chunk-14-7.png diff --git a/docs/no_toc/02-data-structures.md b/docs/no_toc/02-data-structures.md index 3ded80e..164ca95 100644 --- a/docs/no_toc/02-data-structures.md +++ b/docs/no_toc/02-data-structures.md @@ -71,16 +71,14 @@ If you want to access everything but the first three elements of `chrNum`: ``` python -chrNum[3:len(chrNum)] +chrNum[3:] ``` ``` ## [2, 2] ``` -where `len(chrNum)` is the length of the list. - -When the start or stop index is *not* specified, it implies that you are subsetting starting the from the beginning of the list or subsetting to the end of the list, respectively: +Here, the stop index number was not specificed. When the start or stop index is *not* specified, it implies that you are subsetting starting the from the beginning of the list or subsetting to the end of the list, respectively: ``` python @@ -99,7 +97,7 @@ chrNum[3:] ## [2, 2] ``` -More discussion of list slicing can be found [here](https://stackoverflow.com/questions/509211/how-slicing-in-python-works). +There are other popular uses of the slice operator `:`, such as negative indicies to count from the end of a list, or subsetting with a fixed increment. You can find more discussion of list slicing [here](https://wesmckinney.com/book/python-builtin#list_slicing). ## Objects in Python @@ -111,7 +109,7 @@ The list data structure has an organization and functionality that metaphoricall And if it "makes sense" to us, then it is well-designed. -The list data structure we have been working with is an example of an **Object**. The definition of an object allows us to ask the questions above: what does it contain, and what can it do? It is an organizational tool for a collection of data and functions that we can relate to, like a physical object. Formally, an object contains the following: +The list data structure we have been working with is an example of an **Object**. The definition of an object allows us to ask the questions above: *what does it contain, and what can it do?* It is an organizational tool for a collection of data and functions that we can relate to, like a physical object. Formally, an object contains the following: - **Value** that holds the essential data for the object. @@ -337,7 +335,7 @@ Subset the second to fourth rows, and the first two columns: ![](images/pandas_subset_1.png) -Now, back to `metadata` dataframe. +Now, back to `metadata` dataframe: Subset the first 5 rows, and first two columns: diff --git a/docs/no_toc/03-data-wrangling1.md b/docs/no_toc/03-data-wrangling1.md index 263bbf1..e18c63b 100644 --- a/docs/no_toc/03-data-wrangling1.md +++ b/docs/no_toc/03-data-wrangling1.md @@ -4,7 +4,7 @@ From our first two lessons, we are now equipped with enough fundamental programming skills to apply it to various steps in the data science workflow, which is a natural cycle that occurs in data analysis. -![Data science workflow. Image source: [R for Data Science.](https://r4ds.hadley.nz/whole-game)](https://d33wubrfki0l68.cloudfront.net/571b056757d68e6df81a3e3853f54d3c76ad6efc/32d37/diagrams/data-science.png){alt="Data science workflow. Image source: R for Data Science." width="550"} +![Data science workflow. Image source: R for Data Science.](https://d33wubrfki0l68.cloudfront.net/571b056757d68e6df81a3e3853f54d3c76ad6efc/32d37/diagrams/data-science.png){width="550"} For the rest of the course, we focus on *Transform* and *Visualize* with the assumption that our data is in a nice, "Tidy format". First, we need to understand what it means for a data to be "Tidy". @@ -22,7 +22,7 @@ If you want to be technical about what variables and observations are, Hadley Wi > A **variable** contains all values that measure the same underlying attribute (like height, temperature, duration) across units. An **observation** contains all values measured on the same unit (like a person, or a day, or a race) across attributes. -![A tidy dataframe. Image source: [R for Data Science](https://r4ds.hadley.nz/data-tidy).](https://r4ds.hadley.nz/images/tidy-1.png){alt="A tidy dataframe. Image source: R for Data Science." width="800"} +![A tidy dataframe. Image source: R for Data Science.](https://r4ds.hadley.nz/images/tidy-1.png){width="800"} ## Our working Tidy Data: DepMap Project @@ -191,7 +191,7 @@ df ## 4 treated 7 32 ``` -*"I want to subset for rows such that the status is "treated" and subset for columns status and age_case."* +*"I want to subset for rows such that the status is"treated" and subset for columns status and age_case."* ``` python @@ -210,14 +210,14 @@ df.loc[df.status == "treated", ["status", "age_case"]] Now that your Dataframe has be transformed based on your scientific question, you can start doing some analysis on it! A common data science task is to examine summary statistics of a dataset, which summarizes the all the values from a variable in a numeric summary, such as mean, median, or mode. -If we look at the data structre of a Dataframe's column, it is called a Series. It has methods can compute summary statistics for us. Let's take a look at a few popular examples: +If we look at the data structure of a Dataframe's column, it is actually not a List, but an object called Series. It has methods can compute summary statistics for us. Let's take a look at a few popular examples: -| Function method | What it takes in | What it does | Returns | -|---------------|---------------|----------------------------|---------------| -| `metadata.Age.mean()` | `metadata.Age` as a numeric value | Computes the mean value of the `Age` column. | Float (NumPy) | -| `metadata['Age'].median()` | `metadata['Age']` as a numeric value | Computes the median value of the `Age` column. | Float (NumPy) | -| `metadata.Age.max()` | `metadata.Age` as a numeric value | Computes the max value of the `Age` column. | Float (NumPy) | -| `metadata.OncotreeSubtype.value_counts()` | `metadata.OncotreeSubtype` as a String | Creates a frequency table of all unique elements in `OncotreeSubtype` column. | Series | +| Function method | What it takes in | What it does | Returns | +|----------------|----------------|-------------------------|----------------| +| `metadata.Age.mean()` | `metadata.Age` as a numeric Series | Computes the mean value of the `Age` column. | Float (NumPy) | +| `metadata['Age'].median()` | `metadata['Age']` as a numeric Series | Computes the median value of the `Age` column. | Float (NumPy) | +| `metadata.Age.max()` | `metadata.Age` as a numeric Series | Computes the max value of the `Age` column. | Float (NumPy) | +| `metadata.OncotreeSubtype.value_counts()` | `metadata.OncotreeSubtype` as a string Series | Creates a frequency table of all unique elements in `OncotreeSubtype` column. | Series | Let's try it out, with some nice print formatting: @@ -270,18 +270,16 @@ print("Frequency of column", metadata.OncotreeLineage.value_counts()) ## Name: count, dtype: int64 ``` -(Notice that the output of some of these methods are Float (NumPy). This refers to a Python Object called NumPy that is extremely popular for scientific computing, but we're not focused on that in this course.) +Notice that the output of some of these methods are Float (NumPy). This refers to a Python Object called NumPy that is extremely popular for scientific computing, but we're not focused on that in this course.) ## Simple data visualization -We will dedicate extensive time later this course to talk about data visualization, but the Dataframe's column, Series, has a method called `.plot()` that can help us make plots. The `.plot()` method will default make a line plot, but it is not necessary the plot style we want, so we can give the optional argument `kind` a String value to specify the plot style. We use it for making a histogram. +We will dedicate extensive time later this course to talk about data visualization, but the Dataframe's column, Series, has a method called `.plot()` that can help us make simple plots for one variable. The `.plot()` method will by default make a line plot, but it is not necessary the plot style we want, so we can give the optional argument `kind` a String value to specify the plot style. We use it for making a histogram or bar plot. -The `.plot()` method also exists for Dataframes, in which you need to specify a plot using multiple columns. We use it for making a bar plot. - -| Plot style | Useful for | kind = | Code | -|------------|------------|---------|--------------------------------------------------------------| -| Histogram | Numerics | "hist" | `metadata.Age.plot(kind = "hist")` | -| Bar plot | Strings | "bar" | `metadata.OncotreeSubtype.value_counts().plot(kind = "bar")` | +| Plot style | Useful for | kind = | Code | +|-----------|-----------|-----------|--------------------------------------| +| Histogram | Numerics | "hist" | `metadata.Age.plot(kind = "hist")` | +| Bar plot | Strings | "bar" | `metadata.OncotreeSubtype.value_counts().plot(kind = "bar")` | Let's look at a histogram: @@ -307,7 +305,49 @@ plt.show() -Notice here that we start with the column `metadata.OncotreeLineage`, and then we first use the method `.value_counts()` to get a *Dataframe* of a frequency table. Then, we take the frequency table Dataframe and use the `.plot()` method. It is quite common in Python to have multiple "chained" function calls, in which the output of `.value_counts()` is used for the input of `.plot()`. It takes a bit of time to get used to this! +(The `plt.figure()` and `plt.show()` functions are used to render the plots on the website, but you don't need to use it for your exercises - yet. We will discuss this in more detail during our week of data visualization.) + +#### Chained function calls + +Let's look at our bar plot syntax more carefully. We start with the column `metadata.OncotreeLineage`, and then we first use the method `.value_counts()` to get a *Series* of a frequency table. Then, we take the frequency table Series and use the `.plot()` method. + +It is quite common in Python to have multiple "chained" function calls, in which the output of `.value_counts()` is used for the input of `.plot()` all in one line of code. It takes a bit of time to get used to this! + +Here's another example of a chained function call, which looks quite complex, but let's break it down: + + +``` python +plt.figure() + +metadata.loc[metadata.AgeCategory == "Adult", ].OncotreeLineage.value_counts().plot(kind="bar") + +plt.show() +``` + + + +1. We first take the entire `metadata` and do some subsetting, which outputs a Dataframe. +2. We access the `OncotreeLineage` column, which outputs a Series. +3. We use the method `.value_counts()`, which outputs a Series. +4. We make a plot out of it! + +We could have, alternatively, done this in several lines of code: + + +``` python +plt.figure() + +metadata_subset = metadata.loc[metadata.AgeCategory == "Adult", ] +metadata_subset_lineage = metadata_subset.OncotreeLineage +lineage_freq = metadata_subset_lineage.value_counts() +lineage_freq.plot(kind = "bar") + +plt.show() +``` + + + +These are two different *styles* of code, but they do the exact same thing. It's up to you to decide what is easier for you to understand. ## Exercises diff --git a/docs/no_toc/About.md b/docs/no_toc/About.md index 0cbea42..9eac26b 100644 --- a/docs/no_toc/About.md +++ b/docs/no_toc/About.md @@ -51,7 +51,7 @@ These credits are based on our [course contributors table guidelines](https://ww ## collate en_US.UTF-8 ## ctype en_US.UTF-8 ## tz Etc/UTC -## date 2024-08-21 +## date 2024-08-22 ## pandoc 3.1.1 @ /usr/local/bin/ (via rmarkdown) ## ## ─ Packages ─────────────────────────────────────────────────────────────────── diff --git a/docs/no_toc/about-the-authors.html b/docs/no_toc/about-the-authors.html index fb30c02..2d70064 100644 --- a/docs/no_toc/about-the-authors.html +++ b/docs/no_toc/about-the-authors.html @@ -368,7 +368,7 @@

About the AuthorsChapter 3 Data Wrangling, Part 1<

From our first two lessons, we are now equipped with enough fundamental programming skills to apply it to various steps in the data science workflow, which is a natural cycle that occurs in data analysis.

Data science workflow. Image source: R for Data Science. - +
Data science workflow. Image source: R for Data Science.

For the rest of the course, we focus on Transform and Visualize with the assumption that our data is in a nice, “Tidy format”. First, we need to understand what it means for a data to be “Tidy”.

@@ -248,7 +248,7 @@

3.1 Tidy Data A tidy dataframe. Image source: R for Data Science. - +
A tidy dataframe. Image source: R for Data Science.

@@ -399,13 +399,13 @@

3.3.0.1 Let’s convert our impli

3.4 Summary Statistics

Now that your Dataframe has be transformed based on your scientific question, you can start doing some analysis on it! A common data science task is to examine summary statistics of a dataset, which summarizes the all the values from a variable in a numeric summary, such as mean, median, or mode.

-

If we look at the data structre of a Dataframe’s column, it is called a Series. It has methods can compute summary statistics for us. Let’s take a look at a few popular examples:

+

If we look at the data structure of a Dataframe’s column, it is actually not a List, but an object called Series. It has methods can compute summary statistics for us. Let’s take a look at a few popular examples:

----++++ @@ -418,25 +418,25 @@

3.4 Summary Statistics

- + - + - + - + @@ -479,18 +479,17 @@

3.4 Summary Statistics

3.5 Simple data visualization

-

We will dedicate extensive time later this course to talk about data visualization, but the Dataframe’s column, Series, has a method called .plot() that can help us make plots. The .plot() method will default make a line plot, but it is not necessary the plot style we want, so we can give the optional argument kind a String value to specify the plot style. We use it for making a histogram.

-

The .plot() method also exists for Dataframes, in which you need to specify a plot using multiple columns. We use it for making a bar plot.

-

metadata.Age.mean()metadata.Age as a numeric valuemetadata.Age as a numeric Series Computes the mean value of the Age column. Float (NumPy)
metadata['Age'].median()metadata['Age'] as a numeric valuemetadata['Age'] as a numeric Series Computes the median value of the Age column. Float (NumPy)
metadata.Age.max()metadata.Age as a numeric valuemetadata.Age as a numeric Series Computes the max value of the Age column. Float (NumPy)
metadata.OncotreeSubtype.value_counts()metadata.OncotreeSubtype as a Stringmetadata.OncotreeSubtype as a string Series Creates a frequency table of all unique elements in OncotreeSubtype column. Series
+

We will dedicate extensive time later this course to talk about data visualization, but the Dataframe’s column, Series, has a method called .plot() that can help us make simple plots for one variable. The .plot() method will by default make a line plot, but it is not necessary the plot style we want, so we can give the optional argument kind a String value to specify the plot style. We use it for making a histogram or bar plot.

+
----++++ @@ -527,7 +526,36 @@

3.5 Simple data visualizationmetadata.OncotreeLineage.value_counts().plot(kind = "bar") plt.show()

-

Notice here that we start with the column metadata.OncotreeLineage, and then we first use the method .value_counts() to get a Dataframe of a frequency table. Then, we take the frequency table Dataframe and use the .plot() method. It is quite common in Python to have multiple “chained” function calls, in which the output of .value_counts() is used for the input of .plot(). It takes a bit of time to get used to this!

+

(The plt.figure() and plt.show() functions are used to render the plots on the website, but you don’t need to use it for your exercises - yet. We will discuss this in more detail during our week of data visualization.)

+
+

3.5.0.1 Chained function calls

+

Let’s look at our bar plot syntax more carefully. We start with the column metadata.OncotreeLineage, and then we first use the method .value_counts() to get a Series of a frequency table. Then, we take the frequency table Series and use the .plot() method.

+

It is quite common in Python to have multiple “chained” function calls, in which the output of .value_counts() is used for the input of .plot() all in one line of code. It takes a bit of time to get used to this!

+

Here’s another example of a chained function call, which looks quite complex, but let’s break it down:

+
plt.figure()
+
+metadata.loc[metadata.AgeCategory == "Adult", ].OncotreeLineage.value_counts().plot(kind="bar")
+
+plt.show()
+

+
    +
  1. We first take the entire metadata and do some subsetting, which outputs a Dataframe.
  2. +
  3. We access the OncotreeLineage column, which outputs a Series.
  4. +
  5. We use the method .value_counts(), which outputs a Series.
  6. +
  7. We make a plot out of it!
  8. +
+

We could have, alternatively, done this in several lines of code:

+
plt.figure()
+
+metadata_subset = metadata.loc[metadata.AgeCategory == "Adult", ]
+metadata_subset_lineage = metadata_subset.OncotreeLineage
+lineage_freq = metadata_subset_lineage.value_counts()
+lineage_freq.plot(kind = "bar")
+
+plt.show()
+

+

These are two different styles of code, but they do the exact same thing. It’s up to you to decide what is easier for you to understand.

+

3.6 Exercises

diff --git a/docs/no_toc/reference-keys.txt b/docs/no_toc/reference-keys.txt index 231327f..e710f25 100644 --- a/docs/no_toc/reference-keys.txt +++ b/docs/no_toc/reference-keys.txt @@ -33,5 +33,6 @@ transform-what-do-you-want-to-do-with-this-dataframe lets-convert-our-implicit-subsetting-criteria-into-code summary-statistics simple-data-visualization +chained-function-calls exercises-2 references diff --git a/docs/no_toc/resources/images/03-data-wrangling1_files/figure-html/unnamed-chunk-13-5.png b/docs/no_toc/resources/images/03-data-wrangling1_files/figure-html/unnamed-chunk-13-5.png new file mode 100644 index 0000000000000000000000000000000000000000..9ef4a07ec7bb7c1c09b6b7e3af15b24b00521c99 GIT binary patch literal 67349 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
8^0W`&&MCvW6Nf*Uwp*YdrBkS+Tg0 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 qGxbEiGw<+kANs6P)X;EyBtg$ literal 0 HcmV?d00001 diff --git a/docs/no_toc/resources/images/03-data-wrangling1_files/figure-html/unnamed-chunk-14-7.png b/docs/no_toc/resources/images/03-data-wrangling1_files/figure-html/unnamed-chunk-14-7.png new file mode 100644 index 0000000000000000000000000000000000000000..9ef4a07ec7bb7c1c09b6b7e3af15b24b00521c99 GIT binary patch literal 67349 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
8^0W`&&MCvW6Nf*Uwp*YdrBkS+Tg0 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 qGxbEiGw<+kANs6P)X;EyBtg$ literal 0 HcmV?d00001 diff --git a/docs/no_toc/search_index.json b/docs/no_toc/search_index.json index 4573e91..299b3db 100644 --- a/docs/no_toc/search_index.json +++ b/docs/no_toc/search_index.json @@ -1 +1 @@ -[["index.html", "Introduction to Python About this Course 0.1 Curriculum 0.2 Target Audience 0.3 Learning Objectives 0.4 Offerings", " Introduction to Python August, 2024 About this Course 0.1 Curriculum The course covers fundamentals of Python, a high-level programming language, and use it to wrangle data for analysis and visualization. 0.2 Target Audience The course is intended for researchers who want to learn coding for the first time with a data science application via the Python language. This course is also appropriate for folks who have explored data science or programming on their own and want to focus on some fundamentals. 0.3 Learning Objectives Analyze Tidy datasets in the Python programming language via data subsetting, joining, and transformations. Evaluate summary statistics and data visualization to understand scientific questions. Describe how the Python programming environment interpret complex expressions made out of functions, operations, and data structures, in a step-by-step way. Apply problem solving strategies to debug broken code. 0.4 Offerings This course is taught on a regular basis at Fred Hutch Cancer Center through the Data Science Lab. Announcements of course offering can be found here. "],["intro-to-computing.html", "Chapter 1 Intro to Computing 1.1 Goals of the course 1.2 What is a computer program? 1.3 A programming language has following elements: 1.4 Google Colab Setup 1.5 Grammar Structure 1: Evaluation of Expressions 1.6 Grammar Structure 2: Storing data types in the Variable Environment 1.7 Grammar Structure 3: Evaluation of Functions 1.8 Tips on writing your first code 1.9 Exercises", " Chapter 1 Intro to Computing Welcome to Introduction to Python! Each week, we cover a chapter, which consists of a lesson and exercise. In our first week together, we will look at big conceptual themes in programming, see how code is run, and learn some basic grammar structures of programming. 1.1 Goals of the course In the next 6 weeks, we will explore: Fundamental concepts in high-level programming languages (Python, R, Julia, etc.) that is transferable: How do programs run, and how do we solve problems using functions and data structures? Beginning of data science fundamentals: How do you translate your scientific question to a data wrangling problem and answer it? Data science workflow. Image source: R for Data Science. Find a nice balance between the two throughout the course: we will try to reproduce a figure from a scientific publication using new data. 1.2 What is a computer program? A sequence of instructions to manipulate data for the computer to execute. A series of translations: English <-> Programming Code for Interpreter <-> Machine Code for Central Processing Unit (CPU) We will focus on English <-> Programming Code for Python Interpreter in this class. More importantly: How we organize ideas <-> Instructing a computer to do something. 1.3 A programming language has following elements: Grammar structure to construct expressions; combining expressions to create more complex expressions Encapsulate complex expressions via functions to create modular and reusable tasks Encapsulate complex data via data structures to allow efficient manipulation of data 1.4 Google Colab Setup Google Colab is a Integrated Development Environment (IDE) on a web browser. Think about it as Microsoft Word to a plain text editor. It provides extra bells and whistles to using Python that is easier for the user. Let’s open up the KRAS analysis in Google Colab. If you are taking this course while it is in session, the project name is probably named “KRAS Demo” in your Google Classroom workspace. If you are taking this course on your own time, you can view it here. Today, we will pay close attention to: Python Console (“Executions”): Open it via View -> Executed code history. You give it one line of Python code, and the console executes that single line of code; you give it a single piece of instruction, and it executes it for you. Notebook: in the central panel of the website, you will see Python code interspersed with word document text. This is called a Python Notebook (other similar services include Jupyter Notebook, iPython Notebook), which has chunks of plain text and Python code, and it helps us understand better the code we are writing. Variable Environment: Open it by clicking on the “{x}” button on the left-hand panel. Often, your code will store information in the Variable Environment, so that information can be reused. For instance, we often load in data and store it in the Variable Environment, and use it throughout rest of your Python code. The first thing we will do is see the different ways we can run Python code. You can do the following: Type something into the Python Console (Execution) and click the arrow button, such as 2+2. The Python Console will run it and give you an output. Look through the Python Notebook, and when you see a chunk of Python Code, click the arrow button. It will copy the Python code chunk to the Python Console and run all of it. You will likely see variables created in the Variables panel as you load in and manipulate data. Run every single Python code chunk via Runtime -> Run all. Remember that the order that you run your code matters in programming. Your final product would be the result of Option 3, in which you run every Python code chunk from start to finish. However, sometimes it is nice to try out smaller parts of your code via Options 1 or 2. But you will be at risk of running your code out of order! To create your own content in the notebook, click on a section you want to insert content, and then click on “+ Code” or “+ Text” to add Python code or text, respectively. Python Notebook is great for data science work, because: It encourages reproducible data analysis, when you run your analysis from start to finish. It encourages excellent documentation, as you can have code, output from code, and prose combined together. It is flexible to use other programming languages, such as R. Now, we will get to the basics of programming grammar. 1.5 Grammar Structure 1: Evaluation of Expressions Expressions are be built out of operations or functions. Functions and operations take in data types, do something with them, and return another data type. We can combine multiple expressions together to form more complex expressions: an expression can have other expressions nested inside it. For instance, consider the following expressions entered to the Python Console: 18 + 21 ## 39 max(18, 21) ## 21 max(18 + 21, 65) ## 65 18 + (21 + 65) ## 104 len("ATCG") ## 4 Here, our input data types to the operation are integer in lines 1-4 and our input data type to the function is string in line 5. We will go over common data types shortly. Operations are just functions in hiding. We could have written: from operator import add add(18, 21) ## 39 add(18, add(21, 65)) ## 104 Remember that the Python language is supposed to help us understand what we are writing in code easily, lending to readable code. Therefore, it is sometimes useful to come up with operations that is easier to read. (Most functions in Python are stored in a collection of functions called modules that needs to be loaded. The import statement gives us permission to access the functions in the module “operator”.) 1.5.1 Data types Here are some common data types we will be using in this course. Data type name Data type shorthand Examples Integer int 2, 4 Float float 3.5, -34.1009 String str “hello”, “234-234-8594” Boolean bool True, False 1.5.2 Function machine schema A nice way to summarize this first grammar structure is using the function machine schema, way back from algebra class: Function machine from algebra class. Here are some aspects of this schema to pay attention to: A programmer should not need to know how the function or operation is implemented in order to use it - this emphasizes abstraction and modular thinking, a foundation in any programming language. A function can have different kinds of inputs and outputs - it doesn’t need to be numbers. In the len() function, the input is a String, and the output is an Integer. We will see increasingly complex functions with all sorts of different inputs and outputs. 1.6 Grammar Structure 2: Storing data types in the Variable Environment To build up a computer program, we need to store our returned data type from our expression somewhere for downstream use. We can assign a variable to it as follows: x = 18 + 21 If you enter this in the Console, you will see that in the Variable Environment, the variable x has a value of 39. 1.6.1 Execution rule for variable assignment Evaluate the expression to the right of =. Bind variable to the left of = to the resulting value. The variable is stored in the Variable Environment. The Variable Environment is where all the variables are stored, and can be used for an expression anytime once it is defined. Only one unique variable name can be defined. The variable is stored in the working memory of your computer, Random Access Memory (RAM). This is temporary memory storage on the computer that can be accessed quickly. Typically a personal computer has 8, 16, 32 Gigabytes of RAM. Look, now x can be reused downstream: x - 2 ## 37 y = x * 2 It is quite common for programmers to have to look up the data type of a variable while they are coding. To learn about the data type of a variable, use the type() function on any variable in Python: type(y) ## <class 'int'> We should give useful variable names so that we know what to expect! If you are working with numerical sales data, consider num_sales instead of y. 1.7 Grammar Structure 3: Evaluation of Functions Let’s look at functions a little bit more formally: A function has a function name, arguments, and returns a data type. 1.7.1 Execution rule for functions: Evaluate the function by its arguments if there’s any, and if the arguments are functions or contains operations, evaluate those functions or operations first. The output of functions is called the returned value. Often, we will use multiple functions in a nested way, and it is important to understand how the Python console understand the order of operation. We can also use paranthesis to change the order of operation. Think about what the Python is going to do step-by–step in the lines of code below: max(len("hello"), 4) ## 5 (len("pumpkin") - 8) * 2 ## -2 If we don’t know how to use a function, such as pow(), we can ask for help: ?pow pow(base, exp, mod=None) Equivalent to base**exp with 2 arguments or base**exp % mod with 3 arguments Some types, such as ints, are able to use a more efficient algorithm when invoked using the three argument form. This shows the function takes in three input arguments: base, exp, and mod=None. When an argument has an assigned value of mod=None, that means the input argument already has a value, and you don’t need to specify anything, unless you want to. The following ways are equivalent ways of using the pow() function: pow(2, 3) ## 8 pow(base=2, exp=3) ## 8 pow(exp=3, base=2) ## 8 but this will give you something different: pow(3, 2) ## 9 And there is an operational equivalent: 2 ** 3 ## 8 We will mostly look at functions with input arguments and return types in this course, but not all functions need to have input arguments and output return. Here are some varieties of functions to stretch your horizons. Function call What it takes in What it does Returns pow(a, b) integer a, integer b Raises a to the bth power. Integer print(x) any data type x Prints out the value of x to the console. None datetime.now() Nothing Gets the current time. String 1.8 Tips on writing your first code Computer = powerful + stupid Computers are excellent at doing something specific over and over again, but is extremely rigid and lack flexibility. Here are some tips that is helpful for beginners: Write incrementally, test often Check your assumptions, especially using new functions, operations, and new data types. Live environments are great for testing, but not great for reproducibility. Ask for help! To get more familiar with the errors Python gives you, take a look at this summary of Python error messages. 1.9 Exercises Exercise for week 1 can be found here. "],["working-with-data-structures.html", "Chapter 2 Working with data structures 2.1 Lists 2.2 Objects in Python 2.3 Dataframes 2.4 Exercises", " Chapter 2 Working with data structures In our second lesson, we start to look at two data structures, Lists and Dataframes, that can handle a large amount of data for analysis. 2.1 Lists In the first exercise, you started to explore data structures, which store information about data types. You explored lists, which is an ordered collection of data types or data structures. Each element of a list contains a data type or another data structure. We can now store a vast amount of information in a list, and assign it to a single variable. Even more, we can use operations and functions on a list, modifying many elements within the list at once! This makes analyzing data much more scalable and less repetitive. We create a list via the bracket [ ] operation. staff = ["chris", "ted", "jeff"] chrNum = [2, 3, 1, 2, 2] mixedList = [False, False, False, "A", "B", 92] 2.1.1 Subsetting lists To access an element of a list, you can use the bracket notation [ ] to access the elements of the list. We simply access an element via the “index” number - the location of the data within the list. Here’s the tricky thing about the index number: it starts at 0! 1st element of chrNum: chrNum[0] 2nd element of chrNum: chrNum[1] … 5th element of chrNum: chrNum[4] With subsetting, you can modify elements of a list or use the element of a list as part of an expression. 2.1.2 Subsetting multiple elements of lists Suppose you want to access multiple elements of a list, such as accessing the first three elements of chrNum. You would use the slice operator :, which specifies: the index number to start the index number to stop, plus one. If you want to access the first three elements of chrNum: chrNum[0:3] ## [2, 3, 1] The first element’s index number is 0, the third element’s index number is 2, plus 1, which is 3. If you want to access the second and third elements of chrNum: chrNum[1:3] ## [3, 1] If you want to access everything but the first three elements of chrNum: chrNum[3:len(chrNum)] ## [2, 2] where len(chrNum) is the length of the list. When the start or stop index is not specified, it implies that you are subsetting starting the from the beginning of the list or subsetting to the end of the list, respectively: chrNum[:3] ## [2, 3, 1] chrNum[3:] ## [2, 2] More discussion of list slicing can be found here. 2.2 Objects in Python The list data structure has an organization and functionality that metaphorically represents a pen-and-paper list in our physical world. Like a physical object, we have examined: What does it contain (in terms of data)? What can it do (in terms of operations and functions)? And if it “makes sense” to us, then it is well-designed. The list data structure we have been working with is an example of an Object. The definition of an object allows us to ask the questions above: what does it contain, and what can it do? It is an organizational tool for a collection of data and functions that we can relate to, like a physical object. Formally, an object contains the following: Value that holds the essential data for the object. Attributes that store additional data for the object. Functions called Methods that can be used on the object. This organizing structure on an object applies to pretty much all Python data types and data structures. Let’s see how this applies to the list: Value: the contents of the list, such as [2, 3, 4]. Attributes that store additional values: Not relevant for lists. Methods that can be used on the object: chrNum.count(2) counts the number of instances 2 appears as an element of chrNum. Object methods are functions that does something with the object you are using it on. You should think about chrNum.count(2) as a function that takes in chrNum and 2 as inputs. If you want to use the count function on list mixedList, you would use mixedList.count(x). Here are some more examples of methods with lists: Function method What it takes in What it does Returns chrNum.count(x) list chrNum, data type x Counts the number of instances x appears as an element of chrNum. Integer chrNum.append(x) list chrNum, data type x Appends x to the end of the chrNum. None (but chrNum is modified!) chrNum.sort() list chrNum Sorts chrNum by ascending order. None (but chrNum is modified!) chrNum.reverse() list chrNum Reverses the order of chrNum. None (but chrNum is modified!) 2.3 Dataframes A Dataframe is a two-dimensional data structure that stores data like a spreadsheet does. The Dataframe data structure is found within a Python module called “Pandas”. A Python module is an organized collection of functions and data structures. The import statement below gives us permission to access the “Pandas” module via the variable pd. To load in a Dataframe from existing spreadsheet data, we use the function pd.read_csv(): import pandas as pd metadata = pd.read_csv("classroom_data/metadata.csv") type(metadata) ## <class 'pandas.core.frame.DataFrame'> There is a similar function pd.read_excel() for loading in Excel spreadsheets. Let’s investigate the Dataframe as an object: What does a Dataframe contain (in terms of data)? What can a Dataframe do (in terms of operations and functions)? 2.3.1 What does a Dataframe contain (in terms of data)? We first take a look at the contents: metadata ## ModelID ... OncotreeLineage ## 0 ACH-000001 ... Ovary/Fallopian Tube ## 1 ACH-000002 ... Myeloid ## 2 ACH-000003 ... Bowel ## 3 ACH-000004 ... Myeloid ## 4 ACH-000005 ... Myeloid ## ... ... ... ... ## 1859 ACH-002968 ... Esophagus/Stomach ## 1860 ACH-002972 ... Esophagus/Stomach ## 1861 ACH-002979 ... Esophagus/Stomach ## 1862 ACH-002981 ... Esophagus/Stomach ## 1863 ACH-003071 ... Lung ## ## [1864 rows x 30 columns] It looks like there are 1864 rows and 30 columns in this Dataframe, and when we display it it shows some of the data. We can look at specific columns by looking at attributes via the dot operation. We can also look at the columns via the bracket operation. metadata.ModelID ## 0 ACH-000001 ## 1 ACH-000002 ## 2 ACH-000003 ## 3 ACH-000004 ## 4 ACH-000005 ## ... ## 1859 ACH-002968 ## 1860 ACH-002972 ## 1861 ACH-002979 ## 1862 ACH-002981 ## 1863 ACH-003071 ## Name: ModelID, Length: 1864, dtype: object metadata['ModelID'] ## 0 ACH-000001 ## 1 ACH-000002 ## 2 ACH-000003 ## 3 ACH-000004 ## 4 ACH-000005 ## ... ## 1859 ACH-002968 ## 1860 ACH-002972 ## 1861 ACH-002979 ## 1862 ACH-002981 ## 1863 ACH-003071 ## Name: ModelID, Length: 1864, dtype: object The names of all columns is stored as an attribute, which can be accessed via the dot operation. metadata.columns ## Index(['ModelID', 'PatientID', 'CellLineName', 'StrippedCellLineName', 'Age', ## 'SourceType', 'SangerModelID', 'RRID', 'DepmapModelType', 'AgeCategory', ## 'GrowthPattern', 'LegacyMolecularSubtype', 'PrimaryOrMetastasis', ## 'SampleCollectionSite', 'Sex', 'SourceDetail', 'LegacySubSubtype', ## 'CatalogNumber', 'CCLEName', 'COSMICID', 'PublicComments', ## 'WTSIMasterCellID', 'EngineeredModel', 'TreatmentStatus', ## 'OnboardedMedia', 'PlateCoating', 'OncotreeCode', 'OncotreeSubtype', ## 'OncotreePrimaryDisease', 'OncotreeLineage'], ## dtype='object') The number of rows and columns are also stored as an attribute: metadata.shape ## (1864, 30) 2.3.2 What can a Dataframe do (in terms of operations and functions)? We can use the head() and tail() functions to look at the first few rows and last few rows of metadata, respectively: metadata.head() ## ModelID PatientID ... OncotreePrimaryDisease OncotreeLineage ## 0 ACH-000001 PT-gj46wT ... Ovarian Epithelial Tumor Ovary/Fallopian Tube ## 1 ACH-000002 PT-5qa3uk ... Acute Myeloid Leukemia Myeloid ## 2 ACH-000003 PT-puKIyc ... Colorectal Adenocarcinoma Bowel ## 3 ACH-000004 PT-q4K2cp ... Acute Myeloid Leukemia Myeloid ## 4 ACH-000005 PT-q4K2cp ... Acute Myeloid Leukemia Myeloid ## ## [5 rows x 30 columns] metadata.tail() ## ModelID PatientID ... OncotreePrimaryDisease OncotreeLineage ## 1859 ACH-002968 PT-pjhrsc ... Esophagogastric Adenocarcinoma Esophagus/Stomach ## 1860 ACH-002972 PT-dkXZB1 ... Esophagogastric Adenocarcinoma Esophagus/Stomach ## 1861 ACH-002979 PT-lyHTzo ... Esophagogastric Adenocarcinoma Esophagus/Stomach ## 1862 ACH-002981 PT-Z9akXf ... Esophagogastric Adenocarcinoma Esophagus/Stomach ## 1863 ACH-003071 PT-LAGmLq ... Lung Neuroendocrine Tumor Lung ## ## [5 rows x 30 columns] Both of these functions (without input arguments) are considered as methods: they are functions that does something with the Dataframe you are using it on. You should think about metadata.head() as a function that takes in metadata as an input. If we had another Dataframe called my_data and you want to use the same function, you will have to say my_data.head(). 2.3.2.1 Subsetting Dataframes Perhaps the most important operation you will can do with Dataframes is subsetting them. There are two ways to do it. The first way is to subset by numerical indicies, exactly like how we did for lists. You will use the iloc and bracket operations, and you give two slices: one for the row, and one for the column. Let’s start with a small dataframe to see how it works before returning to metadata: df = pd.DataFrame(data={'status': ["treated", "untreated", "untreated", "discharged", "treated"], 'age_case': [25, 43, 21, 65, 7], 'age_control': [49, 20, 32, 25, 32]}) df ## status age_case age_control ## 0 treated 25 49 ## 1 untreated 43 20 ## 2 untreated 21 32 ## 3 discharged 65 25 ## 4 treated 7 32 Here is how the dataframe looks like with the row and column index numbers: Subset the second to fourth rows, and the first two columns: Now, back to metadata dataframe. Subset the first 5 rows, and first two columns: metadata.iloc[:5, :2] ## ModelID PatientID ## 0 ACH-000001 PT-gj46wT ## 1 ACH-000002 PT-5qa3uk ## 2 ACH-000003 PT-puKIyc ## 3 ACH-000004 PT-q4K2cp ## 4 ACH-000005 PT-q4K2cp If we want a custom slice that is not sequential, we can use an integer list. Subset the last 5 rows, and the 1st and 10 and 21th column: metadata.iloc[5:, [1, 10, 21]] ## PatientID GrowthPattern WTSIMasterCellID ## 5 PT-ej13Dz Suspension 2167.0 ## 6 PT-NOXwpH Adherent 569.0 ## 7 PT-fp8PeY Adherent 1806.0 ## 8 PT-puKIyc Adherent 2104.0 ## 9 PT-AR7W9o Adherent NaN ## ... ... ... ... ## 1859 PT-pjhrsc Organoid NaN ## 1860 PT-dkXZB1 Organoid NaN ## 1861 PT-lyHTzo Organoid NaN ## 1862 PT-Z9akXf Organoid NaN ## 1863 PT-LAGmLq Suspension NaN ## ## [1859 rows x 3 columns] When we subset via numerical indicies, it’s called explicit subsetting. This is a great way to start thinking about subsetting your dataframes for analysis, but explicit subsetting can lead to some inconsistencies in the long run. For instance, suppose your collaborator added a new cell line to the metadata and changed the order of the column. Then your code to subset the last 5 rows and the columns will get you a different answer once the spreadsheet is changed. The second way is to subset by the column name and comparison operators, also known as implicit subsetting. This is much more robust in data analysis practice. You will learn about it next week! 2.4 Exercises Exercise for week 2 can be found here. "],["data-wrangling-part-1.html", "Chapter 3 Data Wrangling, Part 1 3.1 Tidy Data 3.2 Our working Tidy Data: DepMap Project 3.3 Transform: “What do you want to do with this Dataframe”? 3.4 Summary Statistics 3.5 Simple data visualization 3.6 Exercises", " Chapter 3 Data Wrangling, Part 1 From our first two lessons, we are now equipped with enough fundamental programming skills to apply it to various steps in the data science workflow, which is a natural cycle that occurs in data analysis. Data science workflow. Image source: R for Data Science. For the rest of the course, we focus on Transform and Visualize with the assumption that our data is in a nice, “Tidy format”. First, we need to understand what it means for a data to be “Tidy”. 3.1 Tidy Data Here, we describe a standard of organizing data. It is important to have standards, as it facilitates a consistent way of thinking about data organization and building tools (functions) that make use of that standard. The principles of tidy data, developed by Hadley Wickham: Each variable must have its own column. Each observation must have its own row. Each value must have its own cell. If you want to be technical about what variables and observations are, Hadley Wickham describes: A variable contains all values that measure the same underlying attribute (like height, temperature, duration) across units. An observation contains all values measured on the same unit (like a person, or a day, or a race) across attributes. A tidy dataframe. Image source: R for Data Science. 3.2 Our working Tidy Data: DepMap Project The Dependency Map project is a multi-omics profiling of cancer cell lines combined with functional assays such as CRISPR and drug sensitivity to help identify cancer vulnerabilities and drug targets. Here are some of the data that we have public access to. We have been looking at the metadata since last session. Metadata Somatic mutations Gene expression Drug sensitivity CRISPR knockout and more… Let’s load these datasets in, and see how these datasets fit the definition of Tidy data: import pandas as pd metadata = pd.read_csv("classroom_data/metadata.csv") mutation = pd.read_csv("classroom_data/mutation.csv") expression = pd.read_csv("classroom_data/expression.csv") metadata.head() ## ModelID PatientID ... OncotreePrimaryDisease OncotreeLineage ## 0 ACH-000001 PT-gj46wT ... Ovarian Epithelial Tumor Ovary/Fallopian Tube ## 1 ACH-000002 PT-5qa3uk ... Acute Myeloid Leukemia Myeloid ## 2 ACH-000003 PT-puKIyc ... Colorectal Adenocarcinoma Bowel ## 3 ACH-000004 PT-q4K2cp ... Acute Myeloid Leukemia Myeloid ## 4 ACH-000005 PT-q4K2cp ... Acute Myeloid Leukemia Myeloid ## ## [5 rows x 30 columns] mutation.head() ## ModelID CACNA1D_Mut CYP2D6_Mut ... CCDC28A_Mut C1orf194_Mut U2AF1_Mut ## 0 ACH-000001 False False ... False False False ## 1 ACH-000002 False False ... False False False ## 2 ACH-000004 False False ... False False False ## 3 ACH-000005 False False ... False False False ## 4 ACH-000006 False False ... False False False ## ## [5 rows x 540 columns] expression.head() ## ModelID ENPP4_Exp CREBBP_Exp ... OR5D13_Exp C2orf81_Exp OR8S1_Exp ## 0 ACH-001113 2.280956 4.094236 ... 0.0 1.726831 0.0 ## 1 ACH-001289 3.622930 3.606442 ... 0.0 0.790772 0.0 ## 2 ACH-001339 0.790772 2.970854 ... 0.0 0.575312 0.0 ## 3 ACH-001538 3.485427 2.801159 ... 0.0 1.077243 0.0 ## 4 ACH-000242 0.879706 3.327687 ... 0.0 0.722466 0.0 ## ## [5 rows x 536 columns] Dataframe The observation is Some variables are Some values are metadata Cell line ModelID, Age, OncotreeLineage “ACH-000001”, 60, “Myeloid” expression Cell line KRAS_Exp 2.4, .3 mutation Cell line KRAS_Mut TRUE, FALSE 3.3 Transform: “What do you want to do with this Dataframe”? Remember that a major theme of the course is about: How we organize ideas <-> Instructing a computer to do something. Until now, we haven’t focused too much on how we organize our scientific ideas to interact with what we can do with code. Let’s pivot to write our code driven by our scientific curiosity. After we are sure that we are working with Tidy data, we can ponder how we want to transform our data that satisfies our scientific question. We will look at several ways we can transform Tidy data, starting with subsetting columns and rows. Here’s a starting prompt: In the metadata dataframe, which rows would you subset for and columns would you subset for that relate to a scientific question? We have been using explicit subsetting with numerical indicies, such as “I want to filter for rows 20-50 and select columns 2 and 8”. We are now going to switch to implicit subsetting in which we describe the subsetting criteria via comparision operators and column names, such as: “I want to subset for rows such that the OncotreeLineage is breast cancer and subset for columns Age and Sex.” Notice that when we subset for rows in an implicit way, we formulate our criteria in terms of the columns.This is because we are guaranteed to have column names in Dataframes, but not row names. 3.3.0.1 Let’s convert our implicit subsetting criteria into code! To subset for rows implicitly, we will use the conditional operators on Dataframe columns you used in Exercise 2. To formulate a conditional operator expression that OncotreeLineage is breast cancer: metadata['OncotreeLineage'] == "Lung" ## 0 False ## 1 False ## 2 False ## 3 False ## 4 False ## ... ## 1859 False ## 1860 False ## 1861 False ## 1862 False ## 1863 True ## Name: OncotreeLineage, Length: 1864, dtype: bool Then, we will use the .loc operation (which is different than .iloc operation!) and subsetting brackets to subset rows and columns Age and Sex at the same time: metadata.loc[metadata['OncotreeLineage'] == "Lung", ["Age", "Sex"]] ## Age Sex ## 10 39.0 Female ## 13 44.0 Male ## 19 55.0 Female ## 27 39.0 Female ## 28 45.0 Male ## ... ... ... ## 1745 52.0 Male ## 1819 84.0 Male ## 1820 57.0 Female ## 1822 53.0 Male ## 1863 62.0 Male ## ## [241 rows x 2 columns] What’s going on here? The first component of the subset, metadata['OncotreeLineage'] == \"Lung\", subsets for the rows. It gives us a column of True and False values, and we keep rows that correspond to True values. Then, we specify the column names we want to subset for via a list. Here’s another example: df = pd.DataFrame(data={'status': ["treated", "untreated", "untreated", "discharged", "treated"], 'age_case': [25, 43, 21, 65, 7], 'age_control': [49, 20, 32, 25, 32]}) df ## status age_case age_control ## 0 treated 25 49 ## 1 untreated 43 20 ## 2 untreated 21 32 ## 3 discharged 65 25 ## 4 treated 7 32 “I want to subset for rows such that the status is”treated” and subset for columns status and age_case.” df.loc[df.status == "treated", ["status", "age_case"]] ## status age_case ## 0 treated 25 ## 4 treated 7 3.4 Summary Statistics Now that your Dataframe has be transformed based on your scientific question, you can start doing some analysis on it! A common data science task is to examine summary statistics of a dataset, which summarizes the all the values from a variable in a numeric summary, such as mean, median, or mode. If we look at the data structre of a Dataframe’s column, it is called a Series. It has methods can compute summary statistics for us. Let’s take a look at a few popular examples: Function method What it takes in What it does Returns metadata.Age.mean() metadata.Age as a numeric value Computes the mean value of the Age column. Float (NumPy) metadata['Age'].median() metadata['Age'] as a numeric value Computes the median value of the Age column. Float (NumPy) metadata.Age.max() metadata.Age as a numeric value Computes the max value of the Age column. Float (NumPy) metadata.OncotreeSubtype.value_counts() metadata.OncotreeSubtype as a String Creates a frequency table of all unique elements in OncotreeSubtype column. Series Let’s try it out, with some nice print formatting: print("Mean value of Age column:", metadata['Age'].mean()) ## Mean value of Age column: 47.45187165775401 print("Frequency of column", metadata.OncotreeLineage.value_counts()) ## Frequency of column OncotreeLineage ## Lung 241 ## Lymphoid 209 ## CNS/Brain 123 ## Skin 118 ## Esophagus/Stomach 95 ## Breast 92 ## Bowel 87 ## Head and Neck 81 ## Myeloid 77 ## Bone 75 ## Ovary/Fallopian Tube 74 ## Pancreas 65 ## Kidney 64 ## Peripheral Nervous System 55 ## Soft Tissue 54 ## Uterus 41 ## Fibroblast 41 ## Biliary Tract 40 ## Bladder/Urinary Tract 39 ## Normal 39 ## Pleura 35 ## Liver 28 ## Cervix 25 ## Eye 19 ## Thyroid 18 ## Prostate 14 ## Vulva/Vagina 5 ## Ampulla of Vater 4 ## Testis 4 ## Adrenal Gland 1 ## Other 1 ## Name: count, dtype: int64 (Notice that the output of some of these methods are Float (NumPy). This refers to a Python Object called NumPy that is extremely popular for scientific computing, but we’re not focused on that in this course.) 3.5 Simple data visualization We will dedicate extensive time later this course to talk about data visualization, but the Dataframe’s column, Series, has a method called .plot() that can help us make plots. The .plot() method will default make a line plot, but it is not necessary the plot style we want, so we can give the optional argument kind a String value to specify the plot style. We use it for making a histogram. The .plot() method also exists for Dataframes, in which you need to specify a plot using multiple columns. We use it for making a bar plot. Plot style Useful for kind = Code Histogram Numerics “hist” metadata.Age.plot(kind = \"hist\") Bar plot Strings “bar” metadata.OncotreeSubtype.value_counts().plot(kind = \"bar\") Let’s look at a histogram: import matplotlib.pyplot as plt plt.figure() metadata.Age.plot(kind = "hist") plt.show() Let’s look at a bar plot: plt.figure() metadata.OncotreeLineage.value_counts().plot(kind = "bar") plt.show() Notice here that we start with the column metadata.OncotreeLineage, and then we first use the method .value_counts() to get a Dataframe of a frequency table. Then, we take the frequency table Dataframe and use the .plot() method. It is quite common in Python to have multiple “chained” function calls, in which the output of .value_counts() is used for the input of .plot(). It takes a bit of time to get used to this! 3.6 Exercises Exercise for week 3 can be found here. "],["about-the-authors.html", "About the Authors", " About the Authors These credits are based on our course contributors table guidelines.     Credits Names Pedagogy Lead Content Instructor(s) FirstName LastName Lecturer(s) (include chapter name/link in parentheses if only for specific chapters) - make new line if more than one chapter involved Delivered the course in some way - video or audio Content Author(s) (include chapter name/link in parentheses if only for specific chapters) - make new line if more than one chapter involved If any other authors besides lead instructor Content Contributor(s) (include section name/link in parentheses) - make new line if more than one section involved Wrote less than a chapter Content Editor(s)/Reviewer(s) Checked your content Content Director(s) Helped guide the content direction Content Consultants (include chapter name/link in parentheses or word “General”) - make new line if more than one chapter involved Gave high level advice on content Acknowledgments Gave small assistance to content but not to the level of consulting Production Content Publisher(s) Helped with publishing platform Content Publishing Reviewer(s) Reviewed overall content and aesthetics on publishing platform Technical Course Publishing Engineer(s) Helped with the code for the technical aspects related to the specific course generation Template Publishing Engineers Candace Savonen, Carrie Wright, Ava Hoffman Publishing Maintenance Engineer Candace Savonen Technical Publishing Stylists Carrie Wright, Ava Hoffman, Candace Savonen Package Developers (ottrpal) Candace Savonen, John Muschelli, Carrie Wright Art and Design Illustrator(s) Created graphics for the course Figure Artist(s) Created figures/plots for course Videographer(s) Filmed videos Videography Editor(s) Edited film Audiographer(s) Recorded audio Audiography Editor(s) Edited audio recordings Funding Funder(s) Institution/individual who funded course including grant number Funding Staff Staff members who help with funding   ## ─ Session info ─────────────────────────────────────────────────────────────── ## setting value ## version R version 4.3.2 (2023-10-31) ## os Ubuntu 22.04.4 LTS ## system x86_64, linux-gnu ## ui X11 ## language (EN) ## collate en_US.UTF-8 ## ctype en_US.UTF-8 ## tz Etc/UTC ## date 2024-08-21 ## pandoc 3.1.1 @ /usr/local/bin/ (via rmarkdown) ## ## ─ Packages ─────────────────────────────────────────────────────────────────── ## package * version date (UTC) lib source ## askpass 1.2.0 2023-09-03 [1] RSPM (R 4.3.0) ## bookdown 0.39.1 2024-06-11 [1] Github (rstudio/bookdown@f244cf1) ## bslib 0.6.1 2023-11-28 [1] RSPM (R 4.3.0) ## cachem 1.0.8 2023-05-01 [1] RSPM (R 4.3.0) ## cli 3.6.2 2023-12-11 [1] RSPM (R 4.3.0) ## devtools 2.4.5 2022-10-11 [1] RSPM (R 4.3.0) ## digest 0.6.34 2024-01-11 [1] RSPM (R 4.3.0) ## ellipsis 0.3.2 2021-04-29 [1] RSPM (R 4.3.0) ## evaluate 0.23 2023-11-01 [1] RSPM (R 4.3.0) ## fansi 1.0.6 2023-12-08 [1] RSPM (R 4.3.0) ## fastmap 1.1.1 2023-02-24 [1] RSPM (R 4.3.0) ## fs 1.6.3 2023-07-20 [1] RSPM (R 4.3.0) ## glue 1.7.0 2024-01-09 [1] RSPM (R 4.3.0) ## hms 1.1.3 2023-03-21 [1] RSPM (R 4.3.0) ## htmltools 0.5.7 2023-11-03 [1] RSPM (R 4.3.0) ## htmlwidgets 1.6.4 2023-12-06 [1] RSPM (R 4.3.0) ## httpuv 1.6.14 2024-01-26 [1] RSPM (R 4.3.0) ## httr 1.4.7 2023-08-15 [1] RSPM (R 4.3.0) ## jquerylib 0.1.4 2021-04-26 [1] RSPM (R 4.3.0) ## jsonlite 1.8.8 2023-12-04 [1] RSPM (R 4.3.0) ## knitr 1.47.3 2024-06-11 [1] Github (yihui/knitr@e1edd34) ## later 1.3.2 2023-12-06 [1] RSPM (R 4.3.0) ## lifecycle 1.0.4 2023-11-07 [1] RSPM (R 4.3.0) ## magrittr 2.0.3 2022-03-30 [1] RSPM (R 4.3.0) ## memoise 2.0.1 2021-11-26 [1] RSPM (R 4.3.0) ## mime 0.12 2021-09-28 [1] RSPM (R 4.3.0) ## miniUI 0.1.1.1 2018-05-18 [1] RSPM (R 4.3.0) ## openssl 2.1.1 2023-09-25 [1] RSPM (R 4.3.0) ## ottrpal 1.2.1 2024-06-11 [1] Github (jhudsl/ottrpal@828539f) ## pillar 1.9.0 2023-03-22 [1] RSPM (R 4.3.0) ## pkgbuild 1.4.3 2023-12-10 [1] RSPM (R 4.3.0) ## pkgconfig 2.0.3 2019-09-22 [1] RSPM (R 4.3.0) ## pkgload 1.3.4 2024-01-16 [1] RSPM (R 4.3.0) ## profvis 0.3.8 2023-05-02 [1] RSPM (R 4.3.0) ## promises 1.2.1 2023-08-10 [1] RSPM (R 4.3.0) ## purrr 1.0.2 2023-08-10 [1] RSPM (R 4.3.0) ## R6 2.5.1 2021-08-19 [1] RSPM (R 4.3.0) ## Rcpp 1.0.12 2024-01-09 [1] RSPM (R 4.3.0) ## readr 2.1.5 2024-01-10 [1] RSPM (R 4.3.0) ## remotes 2.4.2.1 2023-07-18 [1] RSPM (R 4.3.0) ## rlang 1.1.4 2024-06-04 [1] CRAN (R 4.3.2) ## rmarkdown 2.27.1 2024-06-11 [1] Github (rstudio/rmarkdown@e1c93a9) ## sass 0.4.8 2023-12-06 [1] RSPM (R 4.3.0) ## sessioninfo 1.2.2 2021-12-06 [1] RSPM (R 4.3.0) ## shiny 1.8.0 2023-11-17 [1] RSPM (R 4.3.0) ## stringi 1.8.3 2023-12-11 [1] RSPM (R 4.3.0) ## stringr 1.5.1 2023-11-14 [1] RSPM (R 4.3.0) ## tibble 3.2.1 2023-03-20 [1] CRAN (R 4.3.2) ## tzdb 0.4.0 2023-05-12 [1] RSPM (R 4.3.0) ## urlchecker 1.0.1 2021-11-30 [1] RSPM (R 4.3.0) ## usethis 2.2.3 2024-02-19 [1] RSPM (R 4.3.0) ## utf8 1.2.4 2023-10-22 [1] RSPM (R 4.3.0) ## vctrs 0.6.5 2023-12-01 [1] RSPM (R 4.3.0) ## xfun 0.44.4 2024-06-11 [1] Github (yihui/xfun@9da62cc) ## xml2 1.3.6 2023-12-04 [1] RSPM (R 4.3.0) ## xtable 1.8-4 2019-04-21 [1] RSPM (R 4.3.0) ## yaml 2.3.8 2023-12-11 [1] RSPM (R 4.3.0) ## ## [1] /usr/local/lib/R/site-library ## [2] /usr/local/lib/R/library ## ## ────────────────────────────────────────────────────────────────────────────── "],["references.html", "Chapter 4 References", " Chapter 4 References "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]] +[["index.html", "Introduction to Python About this Course 0.1 Curriculum 0.2 Target Audience 0.3 Learning Objectives 0.4 Offerings", " Introduction to Python August, 2024 About this Course 0.1 Curriculum The course covers fundamentals of Python, a high-level programming language, and use it to wrangle data for analysis and visualization. 0.2 Target Audience The course is intended for researchers who want to learn coding for the first time with a data science application via the Python language. This course is also appropriate for folks who have explored data science or programming on their own and want to focus on some fundamentals. 0.3 Learning Objectives Analyze Tidy datasets in the Python programming language via data subsetting, joining, and transformations. Evaluate summary statistics and data visualization to understand scientific questions. Describe how the Python programming environment interpret complex expressions made out of functions, operations, and data structures, in a step-by-step way. Apply problem solving strategies to debug broken code. 0.4 Offerings This course is taught on a regular basis at Fred Hutch Cancer Center through the Data Science Lab. Announcements of course offering can be found here. "],["intro-to-computing.html", "Chapter 1 Intro to Computing 1.1 Goals of the course 1.2 What is a computer program? 1.3 A programming language has following elements: 1.4 Google Colab Setup 1.5 Grammar Structure 1: Evaluation of Expressions 1.6 Grammar Structure 2: Storing data types in the Variable Environment 1.7 Grammar Structure 3: Evaluation of Functions 1.8 Tips on writing your first code 1.9 Exercises", " Chapter 1 Intro to Computing Welcome to Introduction to Python! Each week, we cover a chapter, which consists of a lesson and exercise. In our first week together, we will look at big conceptual themes in programming, see how code is run, and learn some basic grammar structures of programming. 1.1 Goals of the course In the next 6 weeks, we will explore: Fundamental concepts in high-level programming languages (Python, R, Julia, etc.) that is transferable: How do programs run, and how do we solve problems using functions and data structures? Beginning of data science fundamentals: How do you translate your scientific question to a data wrangling problem and answer it? Data science workflow. Image source: R for Data Science. Find a nice balance between the two throughout the course: we will try to reproduce a figure from a scientific publication using new data. 1.2 What is a computer program? A sequence of instructions to manipulate data for the computer to execute. A series of translations: English <-> Programming Code for Interpreter <-> Machine Code for Central Processing Unit (CPU) We will focus on English <-> Programming Code for Python Interpreter in this class. More importantly: How we organize ideas <-> Instructing a computer to do something. 1.3 A programming language has following elements: Grammar structure to construct expressions; combining expressions to create more complex expressions Encapsulate complex expressions via functions to create modular and reusable tasks Encapsulate complex data via data structures to allow efficient manipulation of data 1.4 Google Colab Setup Google Colab is a Integrated Development Environment (IDE) on a web browser. Think about it as Microsoft Word to a plain text editor. It provides extra bells and whistles to using Python that is easier for the user. Let’s open up the KRAS analysis in Google Colab. If you are taking this course while it is in session, the project name is probably named “KRAS Demo” in your Google Classroom workspace. If you are taking this course on your own time, you can view it here. Today, we will pay close attention to: Python Console (“Executions”): Open it via View -> Executed code history. You give it one line of Python code, and the console executes that single line of code; you give it a single piece of instruction, and it executes it for you. Notebook: in the central panel of the website, you will see Python code interspersed with word document text. This is called a Python Notebook (other similar services include Jupyter Notebook, iPython Notebook), which has chunks of plain text and Python code, and it helps us understand better the code we are writing. Variable Environment: Open it by clicking on the “{x}” button on the left-hand panel. Often, your code will store information in the Variable Environment, so that information can be reused. For instance, we often load in data and store it in the Variable Environment, and use it throughout rest of your Python code. The first thing we will do is see the different ways we can run Python code. You can do the following: Type something into the Python Console (Execution) and click the arrow button, such as 2+2. The Python Console will run it and give you an output. Look through the Python Notebook, and when you see a chunk of Python Code, click the arrow button. It will copy the Python code chunk to the Python Console and run all of it. You will likely see variables created in the Variables panel as you load in and manipulate data. Run every single Python code chunk via Runtime -> Run all. Remember that the order that you run your code matters in programming. Your final product would be the result of Option 3, in which you run every Python code chunk from start to finish. However, sometimes it is nice to try out smaller parts of your code via Options 1 or 2. But you will be at risk of running your code out of order! To create your own content in the notebook, click on a section you want to insert content, and then click on “+ Code” or “+ Text” to add Python code or text, respectively. Python Notebook is great for data science work, because: It encourages reproducible data analysis, when you run your analysis from start to finish. It encourages excellent documentation, as you can have code, output from code, and prose combined together. It is flexible to use other programming languages, such as R. Now, we will get to the basics of programming grammar. 1.5 Grammar Structure 1: Evaluation of Expressions Expressions are be built out of operations or functions. Functions and operations take in data types, do something with them, and return another data type. We can combine multiple expressions together to form more complex expressions: an expression can have other expressions nested inside it. For instance, consider the following expressions entered to the Python Console: 18 + 21 ## 39 max(18, 21) ## 21 max(18 + 21, 65) ## 65 18 + (21 + 65) ## 104 len("ATCG") ## 4 Here, our input data types to the operation are integer in lines 1-4 and our input data type to the function is string in line 5. We will go over common data types shortly. Operations are just functions in hiding. We could have written: from operator import add add(18, 21) ## 39 add(18, add(21, 65)) ## 104 Remember that the Python language is supposed to help us understand what we are writing in code easily, lending to readable code. Therefore, it is sometimes useful to come up with operations that is easier to read. (Most functions in Python are stored in a collection of functions called modules that needs to be loaded. The import statement gives us permission to access the functions in the module “operator”.) 1.5.1 Data types Here are some common data types we will be using in this course. Data type name Data type shorthand Examples Integer int 2, 4 Float float 3.5, -34.1009 String str “hello”, “234-234-8594” Boolean bool True, False 1.5.2 Function machine schema A nice way to summarize this first grammar structure is using the function machine schema, way back from algebra class: Function machine from algebra class. Here are some aspects of this schema to pay attention to: A programmer should not need to know how the function or operation is implemented in order to use it - this emphasizes abstraction and modular thinking, a foundation in any programming language. A function can have different kinds of inputs and outputs - it doesn’t need to be numbers. In the len() function, the input is a String, and the output is an Integer. We will see increasingly complex functions with all sorts of different inputs and outputs. 1.6 Grammar Structure 2: Storing data types in the Variable Environment To build up a computer program, we need to store our returned data type from our expression somewhere for downstream use. We can assign a variable to it as follows: x = 18 + 21 If you enter this in the Console, you will see that in the Variable Environment, the variable x has a value of 39. 1.6.1 Execution rule for variable assignment Evaluate the expression to the right of =. Bind variable to the left of = to the resulting value. The variable is stored in the Variable Environment. The Variable Environment is where all the variables are stored, and can be used for an expression anytime once it is defined. Only one unique variable name can be defined. The variable is stored in the working memory of your computer, Random Access Memory (RAM). This is temporary memory storage on the computer that can be accessed quickly. Typically a personal computer has 8, 16, 32 Gigabytes of RAM. Look, now x can be reused downstream: x - 2 ## 37 y = x * 2 It is quite common for programmers to have to look up the data type of a variable while they are coding. To learn about the data type of a variable, use the type() function on any variable in Python: type(y) ## <class 'int'> We should give useful variable names so that we know what to expect! If you are working with numerical sales data, consider num_sales instead of y. 1.7 Grammar Structure 3: Evaluation of Functions Let’s look at functions a little bit more formally: A function has a function name, arguments, and returns a data type. 1.7.1 Execution rule for functions: Evaluate the function by its arguments if there’s any, and if the arguments are functions or contains operations, evaluate those functions or operations first. The output of functions is called the returned value. Often, we will use multiple functions in a nested way, and it is important to understand how the Python console understand the order of operation. We can also use paranthesis to change the order of operation. Think about what the Python is going to do step-by–step in the lines of code below: max(len("hello"), 4) ## 5 (len("pumpkin") - 8) * 2 ## -2 If we don’t know how to use a function, such as pow(), we can ask for help: ?pow pow(base, exp, mod=None) Equivalent to base**exp with 2 arguments or base**exp % mod with 3 arguments Some types, such as ints, are able to use a more efficient algorithm when invoked using the three argument form. This shows the function takes in three input arguments: base, exp, and mod=None. When an argument has an assigned value of mod=None, that means the input argument already has a value, and you don’t need to specify anything, unless you want to. The following ways are equivalent ways of using the pow() function: pow(2, 3) ## 8 pow(base=2, exp=3) ## 8 pow(exp=3, base=2) ## 8 but this will give you something different: pow(3, 2) ## 9 And there is an operational equivalent: 2 ** 3 ## 8 We will mostly look at functions with input arguments and return types in this course, but not all functions need to have input arguments and output return. Here are some varieties of functions to stretch your horizons. Function call What it takes in What it does Returns pow(a, b) integer a, integer b Raises a to the bth power. Integer print(x) any data type x Prints out the value of x to the console. None datetime.now() Nothing Gets the current time. String 1.8 Tips on writing your first code Computer = powerful + stupid Computers are excellent at doing something specific over and over again, but is extremely rigid and lack flexibility. Here are some tips that is helpful for beginners: Write incrementally, test often Check your assumptions, especially using new functions, operations, and new data types. Live environments are great for testing, but not great for reproducibility. Ask for help! To get more familiar with the errors Python gives you, take a look at this summary of Python error messages. 1.9 Exercises Exercise for week 1 can be found here. "],["working-with-data-structures.html", "Chapter 2 Working with data structures 2.1 Lists 2.2 Objects in Python 2.3 Dataframes 2.4 Exercises", " Chapter 2 Working with data structures In our second lesson, we start to look at two data structures, Lists and Dataframes, that can handle a large amount of data for analysis. 2.1 Lists In the first exercise, you started to explore data structures, which store information about data types. You explored lists, which is an ordered collection of data types or data structures. Each element of a list contains a data type or another data structure. We can now store a vast amount of information in a list, and assign it to a single variable. Even more, we can use operations and functions on a list, modifying many elements within the list at once! This makes analyzing data much more scalable and less repetitive. We create a list via the bracket [ ] operation. staff = ["chris", "ted", "jeff"] chrNum = [2, 3, 1, 2, 2] mixedList = [False, False, False, "A", "B", 92] 2.1.1 Subsetting lists To access an element of a list, you can use the bracket notation [ ] to access the elements of the list. We simply access an element via the “index” number - the location of the data within the list. Here’s the tricky thing about the index number: it starts at 0! 1st element of chrNum: chrNum[0] 2nd element of chrNum: chrNum[1] … 5th element of chrNum: chrNum[4] With subsetting, you can modify elements of a list or use the element of a list as part of an expression. 2.1.2 Subsetting multiple elements of lists Suppose you want to access multiple elements of a list, such as accessing the first three elements of chrNum. You would use the slice operator :, which specifies: the index number to start the index number to stop, plus one. If you want to access the first three elements of chrNum: chrNum[0:3] ## [2, 3, 1] The first element’s index number is 0, the third element’s index number is 2, plus 1, which is 3. If you want to access the second and third elements of chrNum: chrNum[1:3] ## [3, 1] If you want to access everything but the first three elements of chrNum: chrNum[3:] ## [2, 2] Here, the stop index number was not specificed. When the start or stop index is not specified, it implies that you are subsetting starting the from the beginning of the list or subsetting to the end of the list, respectively: chrNum[:3] ## [2, 3, 1] chrNum[3:] ## [2, 2] There are other popular uses of the slice operator :, such as negative indicies to count from the end of a list, or subsetting with a fixed increment. You can find more discussion of list slicing here. 2.2 Objects in Python The list data structure has an organization and functionality that metaphorically represents a pen-and-paper list in our physical world. Like a physical object, we have examined: What does it contain (in terms of data)? What can it do (in terms of operations and functions)? And if it “makes sense” to us, then it is well-designed. The list data structure we have been working with is an example of an Object. The definition of an object allows us to ask the questions above: what does it contain, and what can it do? It is an organizational tool for a collection of data and functions that we can relate to, like a physical object. Formally, an object contains the following: Value that holds the essential data for the object. Attributes that store additional data for the object. Functions called Methods that can be used on the object. This organizing structure on an object applies to pretty much all Python data types and data structures. Let’s see how this applies to the list: Value: the contents of the list, such as [2, 3, 4]. Attributes that store additional values: Not relevant for lists. Methods that can be used on the object: chrNum.count(2) counts the number of instances 2 appears as an element of chrNum. Object methods are functions that does something with the object you are using it on. You should think about chrNum.count(2) as a function that takes in chrNum and 2 as inputs. If you want to use the count function on list mixedList, you would use mixedList.count(x). Here are some more examples of methods with lists: Function method What it takes in What it does Returns chrNum.count(x) list chrNum, data type x Counts the number of instances x appears as an element of chrNum. Integer chrNum.append(x) list chrNum, data type x Appends x to the end of the chrNum. None (but chrNum is modified!) chrNum.sort() list chrNum Sorts chrNum by ascending order. None (but chrNum is modified!) chrNum.reverse() list chrNum Reverses the order of chrNum. None (but chrNum is modified!) 2.3 Dataframes A Dataframe is a two-dimensional data structure that stores data like a spreadsheet does. The Dataframe data structure is found within a Python module called “Pandas”. A Python module is an organized collection of functions and data structures. The import statement below gives us permission to access the “Pandas” module via the variable pd. To load in a Dataframe from existing spreadsheet data, we use the function pd.read_csv(): import pandas as pd metadata = pd.read_csv("classroom_data/metadata.csv") type(metadata) ## <class 'pandas.core.frame.DataFrame'> There is a similar function pd.read_excel() for loading in Excel spreadsheets. Let’s investigate the Dataframe as an object: What does a Dataframe contain (in terms of data)? What can a Dataframe do (in terms of operations and functions)? 2.3.1 What does a Dataframe contain (in terms of data)? We first take a look at the contents: metadata ## ModelID ... OncotreeLineage ## 0 ACH-000001 ... Ovary/Fallopian Tube ## 1 ACH-000002 ... Myeloid ## 2 ACH-000003 ... Bowel ## 3 ACH-000004 ... Myeloid ## 4 ACH-000005 ... Myeloid ## ... ... ... ... ## 1859 ACH-002968 ... Esophagus/Stomach ## 1860 ACH-002972 ... Esophagus/Stomach ## 1861 ACH-002979 ... Esophagus/Stomach ## 1862 ACH-002981 ... Esophagus/Stomach ## 1863 ACH-003071 ... Lung ## ## [1864 rows x 30 columns] It looks like there are 1864 rows and 30 columns in this Dataframe, and when we display it it shows some of the data. We can look at specific columns by looking at attributes via the dot operation. We can also look at the columns via the bracket operation. metadata.ModelID ## 0 ACH-000001 ## 1 ACH-000002 ## 2 ACH-000003 ## 3 ACH-000004 ## 4 ACH-000005 ## ... ## 1859 ACH-002968 ## 1860 ACH-002972 ## 1861 ACH-002979 ## 1862 ACH-002981 ## 1863 ACH-003071 ## Name: ModelID, Length: 1864, dtype: object metadata['ModelID'] ## 0 ACH-000001 ## 1 ACH-000002 ## 2 ACH-000003 ## 3 ACH-000004 ## 4 ACH-000005 ## ... ## 1859 ACH-002968 ## 1860 ACH-002972 ## 1861 ACH-002979 ## 1862 ACH-002981 ## 1863 ACH-003071 ## Name: ModelID, Length: 1864, dtype: object The names of all columns is stored as an attribute, which can be accessed via the dot operation. metadata.columns ## Index(['ModelID', 'PatientID', 'CellLineName', 'StrippedCellLineName', 'Age', ## 'SourceType', 'SangerModelID', 'RRID', 'DepmapModelType', 'AgeCategory', ## 'GrowthPattern', 'LegacyMolecularSubtype', 'PrimaryOrMetastasis', ## 'SampleCollectionSite', 'Sex', 'SourceDetail', 'LegacySubSubtype', ## 'CatalogNumber', 'CCLEName', 'COSMICID', 'PublicComments', ## 'WTSIMasterCellID', 'EngineeredModel', 'TreatmentStatus', ## 'OnboardedMedia', 'PlateCoating', 'OncotreeCode', 'OncotreeSubtype', ## 'OncotreePrimaryDisease', 'OncotreeLineage'], ## dtype='object') The number of rows and columns are also stored as an attribute: metadata.shape ## (1864, 30) 2.3.2 What can a Dataframe do (in terms of operations and functions)? We can use the head() and tail() functions to look at the first few rows and last few rows of metadata, respectively: metadata.head() ## ModelID PatientID ... OncotreePrimaryDisease OncotreeLineage ## 0 ACH-000001 PT-gj46wT ... Ovarian Epithelial Tumor Ovary/Fallopian Tube ## 1 ACH-000002 PT-5qa3uk ... Acute Myeloid Leukemia Myeloid ## 2 ACH-000003 PT-puKIyc ... Colorectal Adenocarcinoma Bowel ## 3 ACH-000004 PT-q4K2cp ... Acute Myeloid Leukemia Myeloid ## 4 ACH-000005 PT-q4K2cp ... Acute Myeloid Leukemia Myeloid ## ## [5 rows x 30 columns] metadata.tail() ## ModelID PatientID ... OncotreePrimaryDisease OncotreeLineage ## 1859 ACH-002968 PT-pjhrsc ... Esophagogastric Adenocarcinoma Esophagus/Stomach ## 1860 ACH-002972 PT-dkXZB1 ... Esophagogastric Adenocarcinoma Esophagus/Stomach ## 1861 ACH-002979 PT-lyHTzo ... Esophagogastric Adenocarcinoma Esophagus/Stomach ## 1862 ACH-002981 PT-Z9akXf ... Esophagogastric Adenocarcinoma Esophagus/Stomach ## 1863 ACH-003071 PT-LAGmLq ... Lung Neuroendocrine Tumor Lung ## ## [5 rows x 30 columns] Both of these functions (without input arguments) are considered as methods: they are functions that does something with the Dataframe you are using it on. You should think about metadata.head() as a function that takes in metadata as an input. If we had another Dataframe called my_data and you want to use the same function, you will have to say my_data.head(). 2.3.2.1 Subsetting Dataframes Perhaps the most important operation you will can do with Dataframes is subsetting them. There are two ways to do it. The first way is to subset by numerical indicies, exactly like how we did for lists. You will use the iloc and bracket operations, and you give two slices: one for the row, and one for the column. Let’s start with a small dataframe to see how it works before returning to metadata: df = pd.DataFrame(data={'status': ["treated", "untreated", "untreated", "discharged", "treated"], 'age_case': [25, 43, 21, 65, 7], 'age_control': [49, 20, 32, 25, 32]}) df ## status age_case age_control ## 0 treated 25 49 ## 1 untreated 43 20 ## 2 untreated 21 32 ## 3 discharged 65 25 ## 4 treated 7 32 Here is how the dataframe looks like with the row and column index numbers: Subset the second to fourth rows, and the first two columns: Now, back to metadata dataframe: Subset the first 5 rows, and first two columns: metadata.iloc[:5, :2] ## ModelID PatientID ## 0 ACH-000001 PT-gj46wT ## 1 ACH-000002 PT-5qa3uk ## 2 ACH-000003 PT-puKIyc ## 3 ACH-000004 PT-q4K2cp ## 4 ACH-000005 PT-q4K2cp If we want a custom slice that is not sequential, we can use an integer list. Subset the last 5 rows, and the 1st and 10 and 21th column: metadata.iloc[5:, [1, 10, 21]] ## PatientID GrowthPattern WTSIMasterCellID ## 5 PT-ej13Dz Suspension 2167.0 ## 6 PT-NOXwpH Adherent 569.0 ## 7 PT-fp8PeY Adherent 1806.0 ## 8 PT-puKIyc Adherent 2104.0 ## 9 PT-AR7W9o Adherent NaN ## ... ... ... ... ## 1859 PT-pjhrsc Organoid NaN ## 1860 PT-dkXZB1 Organoid NaN ## 1861 PT-lyHTzo Organoid NaN ## 1862 PT-Z9akXf Organoid NaN ## 1863 PT-LAGmLq Suspension NaN ## ## [1859 rows x 3 columns] When we subset via numerical indicies, it’s called explicit subsetting. This is a great way to start thinking about subsetting your dataframes for analysis, but explicit subsetting can lead to some inconsistencies in the long run. For instance, suppose your collaborator added a new cell line to the metadata and changed the order of the column. Then your code to subset the last 5 rows and the columns will get you a different answer once the spreadsheet is changed. The second way is to subset by the column name and comparison operators, also known as implicit subsetting. This is much more robust in data analysis practice. You will learn about it next week! 2.4 Exercises Exercise for week 2 can be found here. "],["data-wrangling-part-1.html", "Chapter 3 Data Wrangling, Part 1 3.1 Tidy Data 3.2 Our working Tidy Data: DepMap Project 3.3 Transform: “What do you want to do with this Dataframe”? 3.4 Summary Statistics 3.5 Simple data visualization 3.6 Exercises", " Chapter 3 Data Wrangling, Part 1 From our first two lessons, we are now equipped with enough fundamental programming skills to apply it to various steps in the data science workflow, which is a natural cycle that occurs in data analysis. Data science workflow. Image source: R for Data Science. For the rest of the course, we focus on Transform and Visualize with the assumption that our data is in a nice, “Tidy format”. First, we need to understand what it means for a data to be “Tidy”. 3.1 Tidy Data Here, we describe a standard of organizing data. It is important to have standards, as it facilitates a consistent way of thinking about data organization and building tools (functions) that make use of that standard. The principles of tidy data, developed by Hadley Wickham: Each variable must have its own column. Each observation must have its own row. Each value must have its own cell. If you want to be technical about what variables and observations are, Hadley Wickham describes: A variable contains all values that measure the same underlying attribute (like height, temperature, duration) across units. An observation contains all values measured on the same unit (like a person, or a day, or a race) across attributes. A tidy dataframe. Image source: R for Data Science. 3.2 Our working Tidy Data: DepMap Project The Dependency Map project is a multi-omics profiling of cancer cell lines combined with functional assays such as CRISPR and drug sensitivity to help identify cancer vulnerabilities and drug targets. Here are some of the data that we have public access to. We have been looking at the metadata since last session. Metadata Somatic mutations Gene expression Drug sensitivity CRISPR knockout and more… Let’s load these datasets in, and see how these datasets fit the definition of Tidy data: import pandas as pd metadata = pd.read_csv("classroom_data/metadata.csv") mutation = pd.read_csv("classroom_data/mutation.csv") expression = pd.read_csv("classroom_data/expression.csv") metadata.head() ## ModelID PatientID ... OncotreePrimaryDisease OncotreeLineage ## 0 ACH-000001 PT-gj46wT ... Ovarian Epithelial Tumor Ovary/Fallopian Tube ## 1 ACH-000002 PT-5qa3uk ... Acute Myeloid Leukemia Myeloid ## 2 ACH-000003 PT-puKIyc ... Colorectal Adenocarcinoma Bowel ## 3 ACH-000004 PT-q4K2cp ... Acute Myeloid Leukemia Myeloid ## 4 ACH-000005 PT-q4K2cp ... Acute Myeloid Leukemia Myeloid ## ## [5 rows x 30 columns] mutation.head() ## ModelID CACNA1D_Mut CYP2D6_Mut ... CCDC28A_Mut C1orf194_Mut U2AF1_Mut ## 0 ACH-000001 False False ... False False False ## 1 ACH-000002 False False ... False False False ## 2 ACH-000004 False False ... False False False ## 3 ACH-000005 False False ... False False False ## 4 ACH-000006 False False ... False False False ## ## [5 rows x 540 columns] expression.head() ## ModelID ENPP4_Exp CREBBP_Exp ... OR5D13_Exp C2orf81_Exp OR8S1_Exp ## 0 ACH-001113 2.280956 4.094236 ... 0.0 1.726831 0.0 ## 1 ACH-001289 3.622930 3.606442 ... 0.0 0.790772 0.0 ## 2 ACH-001339 0.790772 2.970854 ... 0.0 0.575312 0.0 ## 3 ACH-001538 3.485427 2.801159 ... 0.0 1.077243 0.0 ## 4 ACH-000242 0.879706 3.327687 ... 0.0 0.722466 0.0 ## ## [5 rows x 536 columns] Dataframe The observation is Some variables are Some values are metadata Cell line ModelID, Age, OncotreeLineage “ACH-000001”, 60, “Myeloid” expression Cell line KRAS_Exp 2.4, .3 mutation Cell line KRAS_Mut TRUE, FALSE 3.3 Transform: “What do you want to do with this Dataframe”? Remember that a major theme of the course is about: How we organize ideas <-> Instructing a computer to do something. Until now, we haven’t focused too much on how we organize our scientific ideas to interact with what we can do with code. Let’s pivot to write our code driven by our scientific curiosity. After we are sure that we are working with Tidy data, we can ponder how we want to transform our data that satisfies our scientific question. We will look at several ways we can transform Tidy data, starting with subsetting columns and rows. Here’s a starting prompt: In the metadata dataframe, which rows would you subset for and columns would you subset for that relate to a scientific question? We have been using explicit subsetting with numerical indicies, such as “I want to filter for rows 20-50 and select columns 2 and 8”. We are now going to switch to implicit subsetting in which we describe the subsetting criteria via comparision operators and column names, such as: “I want to subset for rows such that the OncotreeLineage is breast cancer and subset for columns Age and Sex.” Notice that when we subset for rows in an implicit way, we formulate our criteria in terms of the columns.This is because we are guaranteed to have column names in Dataframes, but not row names. 3.3.0.1 Let’s convert our implicit subsetting criteria into code! To subset for rows implicitly, we will use the conditional operators on Dataframe columns you used in Exercise 2. To formulate a conditional operator expression that OncotreeLineage is breast cancer: metadata['OncotreeLineage'] == "Lung" ## 0 False ## 1 False ## 2 False ## 3 False ## 4 False ## ... ## 1859 False ## 1860 False ## 1861 False ## 1862 False ## 1863 True ## Name: OncotreeLineage, Length: 1864, dtype: bool Then, we will use the .loc operation (which is different than .iloc operation!) and subsetting brackets to subset rows and columns Age and Sex at the same time: metadata.loc[metadata['OncotreeLineage'] == "Lung", ["Age", "Sex"]] ## Age Sex ## 10 39.0 Female ## 13 44.0 Male ## 19 55.0 Female ## 27 39.0 Female ## 28 45.0 Male ## ... ... ... ## 1745 52.0 Male ## 1819 84.0 Male ## 1820 57.0 Female ## 1822 53.0 Male ## 1863 62.0 Male ## ## [241 rows x 2 columns] What’s going on here? The first component of the subset, metadata['OncotreeLineage'] == \"Lung\", subsets for the rows. It gives us a column of True and False values, and we keep rows that correspond to True values. Then, we specify the column names we want to subset for via a list. Here’s another example: df = pd.DataFrame(data={'status': ["treated", "untreated", "untreated", "discharged", "treated"], 'age_case': [25, 43, 21, 65, 7], 'age_control': [49, 20, 32, 25, 32]}) df ## status age_case age_control ## 0 treated 25 49 ## 1 untreated 43 20 ## 2 untreated 21 32 ## 3 discharged 65 25 ## 4 treated 7 32 “I want to subset for rows such that the status is”treated” and subset for columns status and age_case.” df.loc[df.status == "treated", ["status", "age_case"]] ## status age_case ## 0 treated 25 ## 4 treated 7 3.4 Summary Statistics Now that your Dataframe has be transformed based on your scientific question, you can start doing some analysis on it! A common data science task is to examine summary statistics of a dataset, which summarizes the all the values from a variable in a numeric summary, such as mean, median, or mode. If we look at the data structure of a Dataframe’s column, it is actually not a List, but an object called Series. It has methods can compute summary statistics for us. Let’s take a look at a few popular examples: Function method What it takes in What it does Returns metadata.Age.mean() metadata.Age as a numeric Series Computes the mean value of the Age column. Float (NumPy) metadata['Age'].median() metadata['Age'] as a numeric Series Computes the median value of the Age column. Float (NumPy) metadata.Age.max() metadata.Age as a numeric Series Computes the max value of the Age column. Float (NumPy) metadata.OncotreeSubtype.value_counts() metadata.OncotreeSubtype as a string Series Creates a frequency table of all unique elements in OncotreeSubtype column. Series Let’s try it out, with some nice print formatting: print("Mean value of Age column:", metadata['Age'].mean()) ## Mean value of Age column: 47.45187165775401 print("Frequency of column", metadata.OncotreeLineage.value_counts()) ## Frequency of column OncotreeLineage ## Lung 241 ## Lymphoid 209 ## CNS/Brain 123 ## Skin 118 ## Esophagus/Stomach 95 ## Breast 92 ## Bowel 87 ## Head and Neck 81 ## Myeloid 77 ## Bone 75 ## Ovary/Fallopian Tube 74 ## Pancreas 65 ## Kidney 64 ## Peripheral Nervous System 55 ## Soft Tissue 54 ## Uterus 41 ## Fibroblast 41 ## Biliary Tract 40 ## Bladder/Urinary Tract 39 ## Normal 39 ## Pleura 35 ## Liver 28 ## Cervix 25 ## Eye 19 ## Thyroid 18 ## Prostate 14 ## Vulva/Vagina 5 ## Ampulla of Vater 4 ## Testis 4 ## Adrenal Gland 1 ## Other 1 ## Name: count, dtype: int64 Notice that the output of some of these methods are Float (NumPy). This refers to a Python Object called NumPy that is extremely popular for scientific computing, but we’re not focused on that in this course.) 3.5 Simple data visualization We will dedicate extensive time later this course to talk about data visualization, but the Dataframe’s column, Series, has a method called .plot() that can help us make simple plots for one variable. The .plot() method will by default make a line plot, but it is not necessary the plot style we want, so we can give the optional argument kind a String value to specify the plot style. We use it for making a histogram or bar plot. Plot style Useful for kind = Code Histogram Numerics “hist” metadata.Age.plot(kind = \"hist\") Bar plot Strings “bar” metadata.OncotreeSubtype.value_counts().plot(kind = \"bar\") Let’s look at a histogram: import matplotlib.pyplot as plt plt.figure() metadata.Age.plot(kind = "hist") plt.show() Let’s look at a bar plot: plt.figure() metadata.OncotreeLineage.value_counts().plot(kind = "bar") plt.show() (The plt.figure() and plt.show() functions are used to render the plots on the website, but you don’t need to use it for your exercises - yet. We will discuss this in more detail during our week of data visualization.) 3.5.0.1 Chained function calls Let’s look at our bar plot syntax more carefully. We start with the column metadata.OncotreeLineage, and then we first use the method .value_counts() to get a Series of a frequency table. Then, we take the frequency table Series and use the .plot() method. It is quite common in Python to have multiple “chained” function calls, in which the output of .value_counts() is used for the input of .plot() all in one line of code. It takes a bit of time to get used to this! Here’s another example of a chained function call, which looks quite complex, but let’s break it down: plt.figure() metadata.loc[metadata.AgeCategory == "Adult", ].OncotreeLineage.value_counts().plot(kind="bar") plt.show() We first take the entire metadata and do some subsetting, which outputs a Dataframe. We access the OncotreeLineage column, which outputs a Series. We use the method .value_counts(), which outputs a Series. We make a plot out of it! We could have, alternatively, done this in several lines of code: plt.figure() metadata_subset = metadata.loc[metadata.AgeCategory == "Adult", ] metadata_subset_lineage = metadata_subset.OncotreeLineage lineage_freq = metadata_subset_lineage.value_counts() lineage_freq.plot(kind = "bar") plt.show() These are two different styles of code, but they do the exact same thing. It’s up to you to decide what is easier for you to understand. 3.6 Exercises Exercise for week 3 can be found here. "],["about-the-authors.html", "About the Authors", " About the Authors These credits are based on our course contributors table guidelines.     Credits Names Pedagogy Lead Content Instructor(s) FirstName LastName Lecturer(s) (include chapter name/link in parentheses if only for specific chapters) - make new line if more than one chapter involved Delivered the course in some way - video or audio Content Author(s) (include chapter name/link in parentheses if only for specific chapters) - make new line if more than one chapter involved If any other authors besides lead instructor Content Contributor(s) (include section name/link in parentheses) - make new line if more than one section involved Wrote less than a chapter Content Editor(s)/Reviewer(s) Checked your content Content Director(s) Helped guide the content direction Content Consultants (include chapter name/link in parentheses or word “General”) - make new line if more than one chapter involved Gave high level advice on content Acknowledgments Gave small assistance to content but not to the level of consulting Production Content Publisher(s) Helped with publishing platform Content Publishing Reviewer(s) Reviewed overall content and aesthetics on publishing platform Technical Course Publishing Engineer(s) Helped with the code for the technical aspects related to the specific course generation Template Publishing Engineers Candace Savonen, Carrie Wright, Ava Hoffman Publishing Maintenance Engineer Candace Savonen Technical Publishing Stylists Carrie Wright, Ava Hoffman, Candace Savonen Package Developers (ottrpal) Candace Savonen, John Muschelli, Carrie Wright Art and Design Illustrator(s) Created graphics for the course Figure Artist(s) Created figures/plots for course Videographer(s) Filmed videos Videography Editor(s) Edited film Audiographer(s) Recorded audio Audiography Editor(s) Edited audio recordings Funding Funder(s) Institution/individual who funded course including grant number Funding Staff Staff members who help with funding   ## ─ Session info ─────────────────────────────────────────────────────────────── ## setting value ## version R version 4.3.2 (2023-10-31) ## os Ubuntu 22.04.4 LTS ## system x86_64, linux-gnu ## ui X11 ## language (EN) ## collate en_US.UTF-8 ## ctype en_US.UTF-8 ## tz Etc/UTC ## date 2024-08-22 ## pandoc 3.1.1 @ /usr/local/bin/ (via rmarkdown) ## ## ─ Packages ─────────────────────────────────────────────────────────────────── ## package * version date (UTC) lib source ## askpass 1.2.0 2023-09-03 [1] RSPM (R 4.3.0) ## bookdown 0.39.1 2024-06-11 [1] Github (rstudio/bookdown@f244cf1) ## bslib 0.6.1 2023-11-28 [1] RSPM (R 4.3.0) ## cachem 1.0.8 2023-05-01 [1] RSPM (R 4.3.0) ## cli 3.6.2 2023-12-11 [1] RSPM (R 4.3.0) ## devtools 2.4.5 2022-10-11 [1] RSPM (R 4.3.0) ## digest 0.6.34 2024-01-11 [1] RSPM (R 4.3.0) ## ellipsis 0.3.2 2021-04-29 [1] RSPM (R 4.3.0) ## evaluate 0.23 2023-11-01 [1] RSPM (R 4.3.0) ## fansi 1.0.6 2023-12-08 [1] RSPM (R 4.3.0) ## fastmap 1.1.1 2023-02-24 [1] RSPM (R 4.3.0) ## fs 1.6.3 2023-07-20 [1] RSPM (R 4.3.0) ## glue 1.7.0 2024-01-09 [1] RSPM (R 4.3.0) ## hms 1.1.3 2023-03-21 [1] RSPM (R 4.3.0) ## htmltools 0.5.7 2023-11-03 [1] RSPM (R 4.3.0) ## htmlwidgets 1.6.4 2023-12-06 [1] RSPM (R 4.3.0) ## httpuv 1.6.14 2024-01-26 [1] RSPM (R 4.3.0) ## httr 1.4.7 2023-08-15 [1] RSPM (R 4.3.0) ## jquerylib 0.1.4 2021-04-26 [1] RSPM (R 4.3.0) ## jsonlite 1.8.8 2023-12-04 [1] RSPM (R 4.3.0) ## knitr 1.47.3 2024-06-11 [1] Github (yihui/knitr@e1edd34) ## later 1.3.2 2023-12-06 [1] RSPM (R 4.3.0) ## lifecycle 1.0.4 2023-11-07 [1] RSPM (R 4.3.0) ## magrittr 2.0.3 2022-03-30 [1] RSPM (R 4.3.0) ## memoise 2.0.1 2021-11-26 [1] RSPM (R 4.3.0) ## mime 0.12 2021-09-28 [1] RSPM (R 4.3.0) ## miniUI 0.1.1.1 2018-05-18 [1] RSPM (R 4.3.0) ## openssl 2.1.1 2023-09-25 [1] RSPM (R 4.3.0) ## ottrpal 1.2.1 2024-06-11 [1] Github (jhudsl/ottrpal@828539f) ## pillar 1.9.0 2023-03-22 [1] RSPM (R 4.3.0) ## pkgbuild 1.4.3 2023-12-10 [1] RSPM (R 4.3.0) ## pkgconfig 2.0.3 2019-09-22 [1] RSPM (R 4.3.0) ## pkgload 1.3.4 2024-01-16 [1] RSPM (R 4.3.0) ## profvis 0.3.8 2023-05-02 [1] RSPM (R 4.3.0) ## promises 1.2.1 2023-08-10 [1] RSPM (R 4.3.0) ## purrr 1.0.2 2023-08-10 [1] RSPM (R 4.3.0) ## R6 2.5.1 2021-08-19 [1] RSPM (R 4.3.0) ## Rcpp 1.0.12 2024-01-09 [1] RSPM (R 4.3.0) ## readr 2.1.5 2024-01-10 [1] RSPM (R 4.3.0) ## remotes 2.4.2.1 2023-07-18 [1] RSPM (R 4.3.0) ## rlang 1.1.4 2024-06-04 [1] CRAN (R 4.3.2) ## rmarkdown 2.27.1 2024-06-11 [1] Github (rstudio/rmarkdown@e1c93a9) ## sass 0.4.8 2023-12-06 [1] RSPM (R 4.3.0) ## sessioninfo 1.2.2 2021-12-06 [1] RSPM (R 4.3.0) ## shiny 1.8.0 2023-11-17 [1] RSPM (R 4.3.0) ## stringi 1.8.3 2023-12-11 [1] RSPM (R 4.3.0) ## stringr 1.5.1 2023-11-14 [1] RSPM (R 4.3.0) ## tibble 3.2.1 2023-03-20 [1] CRAN (R 4.3.2) ## tzdb 0.4.0 2023-05-12 [1] RSPM (R 4.3.0) ## urlchecker 1.0.1 2021-11-30 [1] RSPM (R 4.3.0) ## usethis 2.2.3 2024-02-19 [1] RSPM (R 4.3.0) ## utf8 1.2.4 2023-10-22 [1] RSPM (R 4.3.0) ## vctrs 0.6.5 2023-12-01 [1] RSPM (R 4.3.0) ## xfun 0.44.4 2024-06-11 [1] Github (yihui/xfun@9da62cc) ## xml2 1.3.6 2023-12-04 [1] RSPM (R 4.3.0) ## xtable 1.8-4 2019-04-21 [1] RSPM (R 4.3.0) ## yaml 2.3.8 2023-12-11 [1] RSPM (R 4.3.0) ## ## [1] /usr/local/lib/R/site-library ## [2] /usr/local/lib/R/library ## ## ────────────────────────────────────────────────────────────────────────────── "],["references.html", "Chapter 4 References", " Chapter 4 References "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]] diff --git a/docs/no_toc/working-with-data-structures.html b/docs/no_toc/working-with-data-structures.html index da3efc3..7d07291 100644 --- a/docs/no_toc/working-with-data-structures.html +++ b/docs/no_toc/working-with-data-structures.html @@ -262,15 +262,14 @@

2.1.2 Subsetting multiple element
chrNum[1:3]
## [3, 1]

If you want to access everything but the first three elements of chrNum:

-
chrNum[3:len(chrNum)]
+
chrNum[3:]
## [2, 2]
-

where len(chrNum) is the length of the list.

-

When the start or stop index is not specified, it implies that you are subsetting starting the from the beginning of the list or subsetting to the end of the list, respectively:

+

Here, the stop index number was not specificed. When the start or stop index is not specified, it implies that you are subsetting starting the from the beginning of the list or subsetting to the end of the list, respectively:

chrNum[:3]
## [2, 3, 1]
chrNum[3:]
## [2, 2]
-

More discussion of list slicing can be found here.

+

There are other popular uses of the slice operator :, such as negative indicies to count from the end of a list, or subsetting with a fixed increment. You can find more discussion of list slicing here.