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:
- Save the price every day
- Take a screenshot for validation
- 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:
- The price changed 101 times
- 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:
- Amazon Minion - $5.89
- Toynk Minion - $5.95
- 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