Reutilizar código con import
Un módulo es un archivo de Python cuyos nombres (funciones, constantes, clases) puede usar otro código. import math carga el módulo math de la biblioteca estándar y lo deja disponible con ese nombre: luego escribes math.sqrt(2). Python incluye cientos de módulos, y lo que instales después (por ejemplo numpy) se importa igual. Pon las importaciones al principio del archivo para que se vea enseguida de qué 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 y alias
from datetime import date trae solo un nombre, así que escribes date(2025, 1, 2) sin prefijo. import numpy as np da un alias más corto a un módulo, una convención que verás en todas partes. Evita from module import *: vuelca nombres desconocidos en tu archivo y puede reemplazar los tuyos sin avisar. Prefiere nombres claros y usa el prefijo cuando haga evidente el origen.
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.0Tus propios módulos
Cualquier archivo .py es un módulo. Si fees.py está junto a main.py y define commission, entonces main.py puede hacer import fees y llamar a fees.commission(...). Cuando un archivo se ejecuta directamente, Python pone su __name__ en "__main__"; cuando se importa, __name__ es el nombre del módulo. Así, la guarda if __name__ == "__main__": hace que el código se ejecute solo cuando el archivo se lanza, no cuando se importa, lo que aparta las demos y las pruebas.
# 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__Dónde busca Python, y una trampa clásica
Con import name, Python busca primero en la carpeta del script en ejecución, luego en la biblioteca estándar y los paquetes instalados (la lista es sys.path). Gana la primera coincidencia. Por eso un archivo tuyo llamado random.py o statistics.py oculta el módulo real, y import random carga tu archivo y falla de formas confusas. Nunca llames a tus archivos como módulos de la biblioteca estándar. Evita también dos módulos que se importan entre sí al principio (importación circular); mueve la parte común a un tercer 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). El código de biblioteca probado casi siempre es más seguro que una versión casera rápida, y el lab marca el análisis manual de fechas como un error de técnica.import moduley luegomodule.name;from module import namepara un nombre;import module as shortpara un alias.- Las importaciones van arriba; evita
import *. - No llames a tus archivos como módulos estándar; usa
if __name__ == "__main__":para el código que solo debe ejecutarse directamente.
A continuación: paquetes y estructura de proyecto, cómo organizar varios módulos en carpetas que se importen limpiamente.
Lab: qué se califica
- Medir la volatilidad con
daily_vol25 pts - Llevar la volatilidad a un año con
annualize_vol25 pts - Contar los días entre dos fechas con
days_between25 pts - Distinguir días laborables y fines de semana con
is_business_day25 pts