Análise de câmbio com Python/pandas

Load exchange-rate series into a DataFrame and analyze them

A saída plana da Moneta API cai direto num DataFrame: pd.DataFrame(resp.json()) e pronto. Com requests + pandas você busca séries, pivota por moeda, reamostra, plota e calcula variações. As taxas são de referência oficiais de bancos centrais.

Moneta's flat output drops straight into a DataFrame: pd.DataFrame(resp.json()) and you're done. With requests + pandas you fetch series, pivot by currency, resample, plot, and compute variations. Rates are official central-bank reference rates.

Base: https://moneta.api.insyde.one — aberta, sem autenticação / open, no auth.

1. Série → DataFrame / Series → DataFrame

import requests
import pandas as pd

BASE = "https://moneta.api.insyde.one"

def fetch_series(base, quotes, start, end, group=None):
    params = {"base": base, "quotes": quotes, "from": start, "to": end}
    if group:
        params["group"] = group
    resp = requests.get(f"{BASE}/rates", params=params, timeout=15)
    resp.raise_for_status()
    df = pd.DataFrame(resp.json())     # colunas: date, base, quote, rate
    df["date"] = pd.to_datetime(df["date"])
    return df.sort_values("date")

df = fetch_series("USD", "BRL,EUR", "2024-01-01", "2024-12-31")
print(df.head())

2. Pivot por moeda / Pivot by currency

Com várias quotes, pivote para ter uma coluna por moeda e o índice em datas:

With multiple quotes, pivot to get one column per currency and a date index:

wide = df.pivot(index="date", columns="quote", values="rate")
# wide["BRL"], wide["EUR"] — séries alinhadas por data
print(wide.tail())

3. Reamostrar e plotar / Resample and plot

Você pode reamostrar localmente (ou pedir group=month à API). Plotar é uma linha:

Resample locally (or ask the API for group=month). Plotting is a one-liner:

import matplotlib.pyplot as plt

monthly = wide.resample("ME").last()   # último valor de cada mês
monthly.plot(title="USD → BRL / EUR (2024)")
plt.ylabel("rate")
plt.tight_layout()
plt.savefig("usd_2024.png")

4. Variação mensal / Monthly variation

variation = monthly["BRL"].pct_change() * 100
print(variation.round(2))      # % de variação mês a mês

# variação total do período / total period change
total = (monthly["BRL"].iloc[-1] / monthly["BRL"].iloc[0] - 1) * 100
print(f"USD/BRL variou {total:.2f}% em 2024")

5. Conversão pontual / One-off conversion

Para um valor único, use /convert — a API faz a conta no edge:

For a single amount, use /convert — the API does the math at the edge:

def convert(amount, src, dst, date=None):
    params = {"from": src, "to": dst, "amount": amount}
    if date:
        params["date"] = date
    resp = requests.get(f"{BASE}/convert", params=params, timeout=15)
    resp.raise_for_status()
    return resp.json()              # { date, from, to, amount, rate, result }

print(convert(500, "USD", "BRL"))

6. "Quanto valia" / Historical lookup

Passe date para uma cotação de referência passada — útil para "quanto valia X naquele dia?".

Pass date for a past reference rate — handy for "how much was X worth back then?".

# Quanto valiam 500 dólares em reais no início de 2020?
res = convert(500, "USD", "BRL", date="2020-01-02")
print(f"Em {res['date']}: R$ {res['result']:.2f} (taxa {res['rate']})")
# → Em 2020-01-02: R$ 2015.30 (taxa 4.0306)
Dica: as colunas chegam prontas — date, base, quote, rate. Não precisa de parsing manual além de to_datetime.
Tip: columns arrive ready — date, base, quote, rate. No manual parsing beyond to_datetime.
Cache: intervalos e datas no passado são imutáveis e cacheados por 24 h; cotações atuais, ~1 h. Reexecutar a mesma análise histórica não toca o upstream.
Caching: past ranges and dates are immutable and cached for 24 h; latest rates ~1 h. Re-running the same historical analysis won't hit the upstream.

API reference · Live demo · Back to Insyde APIs