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.
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())
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())
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")
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")
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"))
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)
date, base, quote,
rate. Não precisa de parsing manual além de to_datetime.
date, base, quote,
rate. No manual parsing beyond to_datetime.