  More than ninety percent of published Jupyter notebooks do not state
dependencies on external packages. This makes them non-executable and thus
hinders reproducibility of scientific results. We present SnifferDog, an
approach that 1) collects the APIs of Python packages and versions, creating a
database of APIs; 2) analyzes notebooks to determine candidates for required
packages and versions; and 3) checks which packages are required to make the
notebook executable (and ideally, reproduce its stored results). In its
evaluation, we show that SnifferDog precisely restores execution environments
for the largest majority of notebooks, making them immediately executable for
end users.
