Parece que sqlalchemy.migrate não tem suporte para renderização de consulta válida em caso de alteração dos tipos de coluna String para Integer para postgresql.
No seu caso, eu implementaria como uma execução de consulta direta e seguiria em frente.
def downgrade(migrate_engine):
# ALTER TABLE courses ALTER COLUMN number SET DATA TYPE integer;
migrate_engine.execute('ALTER TABLE courses ALTER COLUMN number TYPE INTEGER USING number::numeric')
BTW migrar de String para Integer pode falhar por diferentes motivos - quando o valor da coluna contém algum valor que não pode ser convertido em número. Então, eu adicionaria alguma validação extra na lógica do aplicativo para manter a migração de downgrade possível mais tarde.