# Dunder Data Challenge #4 - Solution

Nov 13, 2019

In this post, I detail the solution to Dunder Data Challenge #4 — Finding the Date of the Largest Percentage Stock Price Drop.

#### Solution

To begin, we need to find the percentage drop for each stock for each day. pandas has a built-in method for this called `pct_change`. By default, it finds the percentage change between the current value and the one immediately above it. Like most DataFrame methods, it treats each column independently from the others.

If we call it on our current DataFrame, we’ll get an error as it will not work on our date column. Let’s re-read in the data, converting the date column to a datetime and place it in the index.

`stocks = pd.read_csv('../data/stocks10.csv', parse_dates=['date'],                     index_col='date')stocks.head()`

### Begin Mastering Data Science Now for Free!

Take my free Intro to Pandas course to begin your journey mastering data analysis with Python.

#### Solution continued

Placing the date column in the index is a key part of this challenge that makes our solution quite a bit nicer. Let’s now call the `pct_change` method to get the percentage change for each trading day.

`stocks.pct_change().head()`

Let’s verify that one of the calculated values is what we desire. MSFT dropped 2 cents from 29.84 to 29.82 on its second trading day in this dataset. The percentage calculated below equals the percentage calculated in the method above.

`>>> (29.82 - 29.84) / 29.82-0.0006706908115358676`

Most pandas users know how to get the maximum and minimum value of each column with the methods `max`/`min`. Let's find the largest drop by calling the `min` method.

`>>> stocks.pct_change().min()MSFT   -0.156201AAPL   -0.517964SLB    -0.184057AMZN   -0.247661TSLA   -0.193274XOM    -0.139395WMT    -0.101816T      -0.126392FB     -0.189609V      -0.136295dtype: float64`

For the first part of this challenge, we aren’t interested in the value of the largest percentage one-day drop, but the date that it happened. Since the date is in the index, we can use the lesser-known method called `idxmin` which returns the index of the minimum. An analogous `idxmax` method also exists.

`>>> stocks.pct_change().idxmin()MSFT   2000-04-24AAPL   2000-09-29SLB    2008-10-15AMZN   2001-07-24TSLA   2012-01-13XOM    2008-10-15WMT    2018-02-20T      2000-12-19FB     2018-07-26V      2008-10-15dtype: datetime64[ns]`

In general mathematical speak, this calculation is known as the arg min or arg max.

#### Extra challenge

Knowing the date of the largest drop is great, but it doesn’t tell us what the value of the drop was. We need to return both the minimum and the date of that minimum. This is possible with help from the `agg` method which allows us to return any number of aggregations from our DataFrame.

An aggregation is any function that returns a single value. Both `min` and `idxmin` return a single value and therefore are considered aggregations. The `agg` method works by accepting a list of aggregating functions where the functions are written as strings.

`stocks.pct_change().agg(['idxmin', 'min'])`

### Become a pandas expert

If you are looking to completely master the pandas library and become a trusted expert for doing data science work, check out my book Master Data Analysis with Python. It comes with over 300 exercises with detailed solutions covering the pandas library in-depth.

Close

### Register for a free account

Upon registration, you'll get access to the following free courses:

• Python Installation
• Intro to Jupyter Notebooks
• Intro to Pandas
• Python  and Pandas Challenges