This post is all about how one tiny Minion went on to change the world.
Ok not really.

It's about this guy: Short Standard Minion (2 Eyes) Clip-On 5" Plush Keychain and his incredibly volatile pricing.

## Why Minions?

Over the past several months, Waldo has been tracking product prices across several dozen retailers and millions of products. All of these retailers change product prices: some change super frequently (>1 time per day) and some only seasonally (think summer sales).

After some initial data collection, our Minion friend above was changing prices over 10 times a day, often multiple times within an hour.

I was pretty sure this was an error and that we were in need of some additional minion QA:

If however the data we had was correct, I was gonna get it at the lowest possible price.

I was on a mission: Mission Minion Impossible.

## Minion Methodology - Setting up the Experiment

To address all these questions, we setup a simple experiment to let us track the price over a 10 day period. Building the test was straightforward:

1. Save the price every day
2. Take a screenshot for validation
3. Analyze the data

I was quite skeptical,  What strategy was behind changing the price of a keychain so frequently? How much price sensitivity between a \$5.87 and \$6.50 plush keychain toy could there be?

## Minion Money Madness - The Results

After about 6 days of testing, we pulled the pricing data and screen captures together.

The gif below shows a time lapse of the product webpage, along with the price history. Right around 4/12/2018 is where things get wild.

In just 6 days:

1. The price changed 101 times
2. The price increased as much as \$1.10 or 19.93%

## Diggin' in a bit deeper

Below we can see another plot of the price over time. There's a pretty similar pattern (looks a lot like a step function) starting on both 4/12/2019 and 4/14/2019.

The first step occurs from 4/12/2019 6:45:15 to 4/13/2019 1:10:09 (18 hours, 24 minutes and 54 seconds)

The price first spikes to \$6.62 and then falls to \$5.53. On average, the minion drops \$.059 per hour during this period. 29hrs later, the pattern repeats again.

## Wait, but...its just a Minion Keychain

I really don't know why this minion's price changes so much. Like I mentioned earlier, I suspect demand elasticity for minion keychains to be flat. However...

If you look closely on the Target webpage, the Minion listed there is sold by another company: Tonyk.

After a quick search, I found that the exact same Minion keychain is listed on Tonyk's and Amazon's pages...all for different prices!

Try it yourself: each of the sites are linked below.  I'll put money on it that none of them are the same right now. Prices below are as of 4/25/2019 4:43pm MT:

1. Amazon Minion - \$5.89
2. Toynk Minion - \$5.95
3. Target Minion - \$5.90

It's possible that Amazon and Target are setting their prices off of one another, so they both slowly chase each other down to a floor of \$5.53, one then jacks the price up again, and the cycle starts over again. Potentially a topic for the next Minion-themed post.

## Sweet Sweet Victory

After wrapping up the analysis and seeing the price flatline at \$5.53, I went ahead and placed my order.

## Wrapping up

Product prices changes that aren't listed as sales are unnerving. As a consumer, you're left wondering: am I actually getting a low price?  Imagine buying a share of stock without having the price history. Thats exactly what purchasing retail items online is like. You don't have enough historical information to understand if a current price (whether its a listed sale or not) is truly a good deal.

We've built Waldo to help with this: rather than track prices every day waiting for the lowest price, we let you shop now and get you your money back when prices drop.

Enough talk. Go buy yourself a Minion keychain. Just get it at the lowest price.

Or just signup for Waldo.

### Appendix:

How we built the test:

To grab the data for each price change, we used the script below. It ran every 15min during the experiment.

``````const puppeteer = require('puppeteer');

(async () => {
// Open brower and go to the minion page
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://www.target.com/p/minion-movie-short-standard-minion-2-eyes-clip-on-5-plush/-/A-75480917');

const text = await page.evaluate(() => {
// Grab the price using an XPATH
const price = document.evaluate(
'string(//div/div/span[@data-test="product-price"][1]/text())',
document
).stringValue;

return price;
});

// Save the time, screenshot, and minion price to a file
let time = Math.round(+new Date() / 1000);
await page.screenshot({ path: './pics/' + time + '_' + text + '_minion.png' });
await browser.close();
``````

Combining the screenshots and charts:

``````from PIL import Image

# grab the screenshot and chart and combine:
def merge_img(img1_path, img2_path, name):
files = [img1_path, img2_path]
result = Image.new("RGB", (1600, 600))
size = 800
for index, file in enumerate(files):
path = os.path.expanduser(file)
img = Image.open(path)
img.thumbnail((size, size), Image.ANTIALIAS)
x = index % 2 * size
y = index // 2 * size
w, h = img.size
result.paste(img, (x, y, x + w, y + h))

save_path = './combined_img/' + name.split('.png')[0] + '_combined.png'
result.save(os.path.expanduser(save_path))
``````

Creating the video using ffmpeg:

``````ffmpeg -f image2 -pattern_type glob -framerate 45 -i '*.png' -c:v libx264 -r 30 -pix_fmt yuv420p out.mp4
``````