Skip to main content

Conversión de divisas y cálculo de impuestos con precisión decimal exacta

Project description

MoneyMap

Conversión de divisas y cálculo de impuestos con precisión decimal exacta.

MoneyMap resuelve el problema de los errores de redondeo al trabajar con dinero en Python. Usa el tipo Decimal de la librería estándar para garantizar que nunca pierdas un centavo en tus cálculos.

from moneymap import convertir, impuesto

pago = convertir(1000, origen="MXN", destino="USD")
print(f"Total: {pago} USD")  # Total: 58.65 USD

iva = impuesto(1000, pais="Mexico")
print(f"IVA: {iva}")         # IVA: 160.00

Instalación

pip install moneymap              # solo funciones básicas
pip install moneymap[pandas]      # con soporte para pandas
pip install moneymap[polars]      # con soporte para polars
pip install moneymap[pandas,polars]  # ambos

Requiere Python 3.10+.


Referencia de API

convertir(monto, origen, destino)

Convierte un monto de una divisa a otra.

Parámetro Tipo Descripción
monto int | float | str | Decimal El valor a convertir
origen str Código ISO de la divisa de origen
destino str Código ISO de la divisa de destino

Retorna: Decimal — el monto convertido, redondeado a 2 decimales.

from moneymap import convertir

convertir(100, "USD", "MXN")   # Decimal('1705.00')
convertir(500, "EUR", "GBP")   # Decimal('429.35')
convertir(1,   "USD", "JPY")   # Decimal('149.50')

impuesto(monto, pais)

Calcula el monto del impuesto aplicable (IVA, VAT, GST, etc.) según el país.

Nota: Devuelve sólo el impuesto, no el total. Para obtener el total, usa total_con_impuesto().

from moneymap import impuesto

impuesto(1000, "Mexico")    # Decimal('160.00')  → IVA 16%
impuesto(1000, "España")    # Decimal('210.00')  → IVA 21%
impuesto(1000, "USA")       # Decimal('0.00')    → Sin IVA federal

registrar_tasa(divisa, referencia, tasa)

Registra o actualiza la tasa de cambio de una divisa.

from moneymap import registrar_tasa, convertir

registrar_tasa("MXN", "USD", 17.05)   # 1 USD = 17.05 MXN
registrar_tasa("VEF", "USD", 35.50)   # divisa nueva

Funciones adicionales (módulo moneymap.taxes)

from moneymap.taxes import total_con_impuesto, tasa_fiscal

total_con_impuesto(1000, "Mexico")  # Decimal('1160.00')
tasa_fiscal("Mexico")               # Decimal('16')
tasa_fiscal("Suecia")               # Decimal('25')

divisas_disponibles() / paises_disponibles()

from moneymap import divisas_disponibles, paises_disponibles

divisas_disponibles()
# ['ARS', 'AUD', 'BRL', 'CAD', 'CHF', 'CLP', 'CNY', 'COP', 'EUR', ...]

paises_disponibles()
# ['Alemania', 'Argentina', 'Australia', 'Austria', 'Belgica', ...]

Integración con pandas

Activa el accessor importando el módulo una vez. Todas las operaciones son no destructivas y encadenables.

import pandas as pd
import moneymap.dataframe  # activa df.moneymap

df = pd.DataFrame({
    "producto": ["Laptop", "Monitor", "Teclado"],
    "precio":   [25000,    8500,      1200],
})

Métodos disponibles

# Agrega columna "precio_USD"
df = df.moneymap.convertir(col="precio", origen="MXN", destino="USD")

# Agrega columna "precio_impuesto"
df = df.moneymap.impuesto(col="precio", pais="Mexico")

# Agrega columna "precio_total"
df = df.moneymap.total_con_impuesto(col="precio", pais="Mexico")

# Agrega precio_impuesto + precio_total + precio_tasa_pct en una sola llamada
df = df.moneymap.resumen_fiscal(col="precio", pais="España")

Encadenado

resultado = (
    df
    .moneymap.convertir(col="precio", origen="MXN", destino="USD")
    .moneymap.impuesto(col="precio_USD", pais="USA")
    .moneymap.total_con_impuesto(col="precio_USD", pais="USA")
)

El parámetro opcional resultado permite nombrar la columna de salida:

df.moneymap.convertir(col="precio", origen="MXN", destino="USD", resultado="precio_dolar")

Integración con Polars

Polars no tiene sistema de accessors, por lo que la integración usa funciones que reciben el DataFrame como primer argumento. Soporta DataFrame, LazyFrame y expresiones (pl.Expr).

import polars as pl
import moneymap.polars as mm

DataFrame y LazyFrame

El mismo API funciona para ambos tipos — si pasas un LazyFrame, recibes un LazyFrame:

df_pl = pl.DataFrame({
    "producto": ["Laptop", "Monitor", "Teclado"],
    "precio":   [25000,    8500,      1200],
})

# DataFrame normal
df_pl = mm.convertir(df_pl, col="precio", origen="MXN", destino="USD")
df_pl = mm.impuesto(df_pl, col="precio", pais="Mexico")
df_pl = mm.total_con_impuesto(df_pl, col="precio", pais="Mexico")
df_pl = mm.resumen_fiscal(df_pl, col="precio", pais="España")

# LazyFrame — evaluación diferida, todo se ejecuta en .collect()
resultado = (
    df_pl.lazy()
    .pipe(mm.convertir, col="precio", origen="MXN", destino="USD")
    .pipe(mm.impuesto,  col="precio_USD", pais="USA")
    .pipe(mm.total_con_impuesto, col="precio_USD", pais="USA")
    .collect()
)

Expresiones

Las funciones expr_* devuelven una pl.Expr para usar dentro de .with_columns() o .select(), permitiendo calcular múltiples columnas en una sola pasada:

df_pl = df_pl.with_columns(
    mm.expr_convertir("precio", "MXN", "USD").alias("precio_USD"),
    mm.expr_convertir("precio", "MXN", "EUR").alias("precio_EUR"),
    mm.expr_impuesto("precio", "Mexico").alias("iva"),
    mm.expr_total_con_impuesto("precio", "Mexico").alias("precio_total"),
)
Función Retorna Uso
mm.convertir(df, col, origen, destino) DataFrame / LazyFrame Agrega columna {col}_{DESTINO}
mm.impuesto(df, col, pais) DataFrame / LazyFrame Agrega columna {col}_impuesto
mm.total_con_impuesto(df, col, pais) DataFrame / LazyFrame Agrega columna {col}_total
mm.resumen_fiscal(df, col, pais) DataFrame / LazyFrame Agrega impuesto + total + tasa_pct
mm.expr_convertir(col, origen, destino) pl.Expr Para usar en .with_columns()
mm.expr_impuesto(col, pais) pl.Expr Para usar en .with_columns()
mm.expr_total_con_impuesto(col, pais) pl.Expr Para usar en .with_columns()

Ayuda integrada

from moneymap import ayuda

ayuda()                        # índice de todas las funciones
ayuda("convertir")             # detalle con argumentos, retorno y ejemplo
ayuda("impuesto")
ayuda("registrar_tasa")
ayuda("total_con_impuesto")
ayuda("tasa_fiscal")
ayuda("divisas_disponibles")
ayuda("paises_disponibles")

Divisas incluidas

Código Divisa Código Divisa
USD Dólar estadounidense MXN Peso mexicano
EUR Euro CAD Dólar canadiense
GBP Libra esterlina JPY Yen japonés
BRL Real brasileño ARS Peso argentino
COP Peso colombiano CLP Peso chileno
PEN Sol peruano CHF Franco suizo
CNY Yuan chino INR Rupia india
AUD Dólar australiano ... y más

Países e impuestos incluidos

Más de 35 países de América Latina, Europa y Asia, incluyendo:

  • México (IVA 16%), Argentina (IVA 21%), Colombia (IVA 19%)
  • España (IVA 21%), Alemania (19%), Francia (20%), Reino Unido (20%)
  • Japón (10%), China (13%), India (18%), Australia (10%)
  • Y muchos más — consulta paises_disponibles() para la lista completa.

¿Por qué Decimal y no float?

# ❌ Con float: error de punto flotante
0.1 + 0.2 == 0.3       # False
0.1 + 0.2              # 0.30000000000000004

# ✅ Con MoneyMap: precisión exacta
from decimal import Decimal
Decimal("0.1") + Decimal("0.2") == Decimal("0.3")  # True

Licencia

MIT — libre para uso personal y comercial.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

moneymap-0.1.4.tar.gz (18.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

moneymap-0.1.4-py3-none-any.whl (18.9 kB view details)

Uploaded Python 3

File details

Details for the file moneymap-0.1.4.tar.gz.

File metadata

  • Download URL: moneymap-0.1.4.tar.gz
  • Upload date:
  • Size: 18.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for moneymap-0.1.4.tar.gz
Algorithm Hash digest
SHA256 c1c6a2facc66972b084c64a3c799d2dfa0ae35445bdce9f30a2ab0a235157aa8
MD5 bb61fc8f839f8055298b80dd929d7fea
BLAKE2b-256 8041d370ff97c7a4cb52f04d1a5ecf15a8bf24e97be20fdc7b4937ddc21b0b8d

See more details on using hashes here.

Provenance

The following attestation bundles were made for moneymap-0.1.4.tar.gz:

Publisher: pypi-publish.yml on AndreGoros/moneymap

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file moneymap-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: moneymap-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 18.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for moneymap-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 c1b31ca90027bddf95a6dc588b33c626f707ece92d28a9c81ee3c21370187004
MD5 59209c29b020c8e3a708ad663726f851
BLAKE2b-256 737f633802e055f7c64c3f1c0ebb0142d4cf8f12f512b37fa3dbdf93c84d76e7

See more details on using hashes here.

Provenance

The following attestation bundles were made for moneymap-0.1.4-py3-none-any.whl:

Publisher: pypi-publish.yml on AndreGoros/moneymap

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page