A comprehensive introduction to mathematical optimization and gurobipy tailored to data scientists and problem solvers