Split the tests for py36, py37, notebooks, examples, docs and coverage into independant tasks. This way they can run in parallel and won't get blocked by each other.
Remove the CI/CD caching. Cache is stored locally on the node on which the CI/CD job runs. These nodes are shut down once the jobs are executed. So, there is no point of caching the tox files since they are dropped anyway (this saves a few minutes of time as well).
Remove the integration_tests job. This job is running the tests for the above mentioned six environments sequentially. Later starts a jupyter notebook (and doesn't do anything).