diff --git a/talks/matlab_vs_python/migp/fetch_data.ipynb b/talks/matlab_vs_python/migp/fetch_data.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..33f4f27bb97a47483b9f2f0308b95c6c460369e2
--- /dev/null
+++ b/talks/matlab_vs_python/migp/fetch_data.ipynb
@@ -0,0 +1,209 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Fetch Data\n",
+    "\n",
+    "This notebook will download an open fMRI dataset (~50MB) for use in the MIGP demo. It also regresses confounds from the data and performs spatial smoothing with 10mm FWHM.\n",
+    "\n",
+    "This data is a derivative from the COBRE sample found in the International Neuroimaging Data-sharing Initiative (http://fcon_1000.projects.nitrc.org/indi/retro/cobre.html), originally released under Creative Commons - Attribution Non-Commercial.\n",
+    "\n",
+    "It comprises 10 preprocessed resting-state fMRI selected from 72 patients diagnosed with schizophrenia and 74 healthy controls (6mm isotropic, TR=2s, 150 volumes).\n",
+    "\n",
+    "* [Download the data](#download-the-data)\n",
+    "* [Clean the data](#clean-the-data)\n",
+    "* [Run `melodic`](#run-melodic)\n",
+    "\n",
+    "Firstly we will import the necessary packages for this notebook:                                 "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from nilearn import datasets\n",
+    "from nilearn import image\n",
+    "from nilearn import plotting\n",
+    "import nibabel as nb\n",
+    "import numpy as np\n",
+    "import os.path as op\n",
+    "import os\n",
+    "import glob\n",
+    "import matplotlib.pyplot as plt"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This function will be used to plot ICs later:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def map_plot(d):\n",
+    "\n",
+    "    N = d.shape[-1]\n",
+    "\n",
+    "    fig, ax = plt.subplots(int(np.ceil((N/2))),2, figsize=(12, N))\n",
+    "\n",
+    "    for img, ax0 in zip(image.iter_img(d), ax.ravel()):\n",
+    "        coord = plotting.find_xyz_cut_coords(img, activation_threshold=2.3)\n",
+    "        plotting.plot_stat_map(img, cut_coords=coord, vmax=10, axes=ax0)\n",
+    "        \n",
+    "    return fig"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a class=\"anchor\" id=\"download-the-data\"></a>\n",
+    "## Download the data\n",
+    "\n",
+    "We use a method from [`nilearn`](https://nilearn.github.io/index.html) called `fetch_cobre` to download the fMRI data:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Create a directory in the users home directory to store the downloaded data\n",
+    "data_dir = op.expanduser('~/nilearn_data')\n",
+    "\n",
+    "if not op.exists(data_dir):\n",
+    "    os.makedirs(data_dir)\n",
+    "    \n",
+    "# Download the data (if not already downloaded)\n",
+    "d = datasets.fetch_cobre(data_dir=data_dir)    "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a class=\"anchor\" id=\"clean-the-data\"></a>\n",
+    "## Clean the data\n",
+    "\n",
+    "We use methods from [`nilearn`](https://nilearn.github.io/index.html) to regress confounds from the data (```clean_img```) and to spatially smooth the data with a gaussian filter of 10mm FWHM (```smooth_img```):"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Create a list of filenames for cleaned and smoothed data\n",
+    "clean = [f.replace('.nii.gz', '_clean.nii.gz') for f in d.func]\n",
+    "smooth = [f.replace('.nii.gz', '_clean_smooth.nii.gz') for f in d.func]\n",
+    "\n",
+    "# loop through each subject, regress confounds and smooth\n",
+    "for img, cleaned, smoothed, conf in zip(d.func, clean, smooth, d.confounds):\n",
+    "    image.clean_img(img, confounds=conf).to_filename(cleaned)\n",
+    "    image.smooth_img(img, 10).to_filename(smoothed)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "To run ```melodic``` we will need a brain mask in MNI152 space at the same resolution as the fMRI.  Here we use [`nilearn`](https://nilearn.github.io/index.html) methods to load the MNI152 mask (```load_mni152_brain_mask```), resample to the resolution of the fMRI (```resample_to_img```), and binarize (```math_img```):"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# load a single fMRI dataset (func0)\n",
+    "func0 = nb.load(d.func[0].replace('.nii.gz', '_clean_smooth.nii.gz'))\n",
+    "\n",
+    "# load MNI153 brainmask, resample to func0 resolution, binarize, and save to nifti\n",
+    "mask = datasets.load_mni152_brain_mask()\n",
+    "mask = image.resample_to_img(mask, func0)\n",
+    "mask = image.math_img('img > 0.5', img=mask)\n",
+    "mask.to_filename(op.join(data_dir, 'brain_mask.nii.gz'))\n",
+    "\n",
+    "# plot brainmask to make sure it looks OK\n",
+    "disp = plotting.plot_anat(image.index_img(func0, 0))\n",
+    "disp.add_contours(mask, threshold=0.5)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<a class=\"anchor\" id=\"run-melodic\"></a>\n",
+    "### Run ```melodic```\n",
+    "\n",
+    "Generate a command line string and run group ```melodic``` on the smoothed fMRI with a dimension of 10 components:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# generate melodic command line string\n",
+    "melodic_cmd = f\"melodic -i {','.join(smooth)} --mask={op.join(data_dir, 'brain_mask.nii.gz')} -d 10 -v --Oall -o cobre.gica \"\n",
+    "print(melodic_cmd)\n",
+    "\n",
+    "# run melodic\n",
+    "! {melodic_cmd}"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Now we can load and plot the group ICs generated by ```melodic```.\n",
+    "\n",
+    "Hopefully you can see some familiar looking RSN spatial patterns:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "ics = nb.load('cobre.gica/melodic_IC.nii.gz')\n",
+    "fig = map_plot(ics)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.7.4"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}