Reutilizar código com import
Um módulo é um arquivo Python cujos nomes (funções, constantes, classes) outro código pode usar. import math carrega o módulo math da biblioteca padrão e o deixa disponível com esse nome: depois você escreve math.sqrt(2). O Python traz centenas de módulos, e o que você instalar depois (por exemplo numpy) é importado do mesmo jeito. Coloque os imports no topo do arquivo para que se veja de imediato do que ele depende.
import math
import statistics
# Use a name from a module with module.name
print(math.sqrt(252)) # 15.874507866387544
print(round(math.sqrt(252), 2)) # 15.87
returns = [0.01, -0.02, 0.015, 0.0]
print(round(statistics.stdev(returns), 4)) # 0.0155from ... import e apelidos
from datetime import date traz só um nome, então você escreve date(2025, 1, 2) sem prefixo. import numpy as np dá a um módulo um apelido mais curto, uma convenção que você verá em todo lugar. Evite from module import *: ele despeja nomes desconhecidos no seu arquivo e pode substituir os seus em silêncio. Prefira nomes claros e use o prefixo quando ele deixar a origem óbvia.
from datetime import date
from math import sqrt as square_root
import statistics as stats
# Only the names you asked for are imported
start = date(2025, 1, 2)
end = date(2025, 3, 3)
print((end - start).days) # 60
print(square_root(16)) # 4.0
print(stats.mean([1.0, 2.0, 3.0])) # 2.0Seus próprios módulos
Qualquer arquivo .py é um módulo. Se fees.py está ao lado de main.py e define commission, então main.py pode fazer import fees e chamar fees.commission(...). Quando um arquivo é executado diretamente, o Python define seu __name__ como "__main__"; quando ele é importado, __name__ é o nome do módulo. Assim, a guarda if __name__ == "__main__": faz o código rodar só quando o arquivo é executado, não quando é importado, o que tira demos e testes do caminho.
# fees.py
RATE = 0.001
def commission(notional):
return notional * RATE
if __name__ == "__main__":
print(commission(10000)) # runs only with: python fees.py
# main.py (next to fees.py)
import fees
print(fees.commission(50000)) # 50.0
print(__name__) # __main__Onde o Python procura, e uma armadilha clássica
Em import name, o Python procura primeiro na pasta do script em execução, depois na biblioteca padrão e nos pacotes instalados (a lista é sys.path). A primeira correspondência vence. Por isso um arquivo seu chamado random.py ou statistics.py esconde o módulo real, e import random carrega o seu arquivo e falha de formas confusas. Nunca dê aos seus arquivos nomes de módulos da biblioteca padrão. Evite também dois módulos que se importam no topo (importação circular); mova a parte comum para um terceiro módulo.
import sys
import random
# Imported modules are remembered in sys.modules; sys.path is the search list
print("random" in sys.modules) # True
print(random.__name__) # random
print(len(sys.path) > 0) # True
# A quick tour of useful standard-library modules
import collections, datetime, itertools, pathlib
print(collections.Counter("AAPL")["A"]) # 2
print(datetime.date(2025, 1, 2).weekday()) # 3 (Thursday; Monday is 0)datetime, statistics, csv, json, collections, itertools, pathlib). Código de biblioteca testado quase sempre é mais seguro que uma versão caseira rápida, e o lab marca a leitura manual de datas como erro de técnica.import modulee depoismodule.name;from module import namepara um nome;import module as shortpara um apelido.- Os imports ficam no topo; evite
import *. - Não dê aos arquivos nomes de módulos padrão; use
if __name__ == "__main__":para o código que só deve rodar diretamente.
A seguir: pacotes e estrutura de projeto, como organizar vários módulos em pastas que se importam de forma limpa.
Lab: o que é avaliado
- Medir a volatilidade com
daily_vol25 pts - Levar a volatilidade a um ano com
annualize_vol25 pts - Contar os dias entre duas datas com
days_between25 pts - Distinguir dias úteis de fins de semana com
is_business_day25 pts