Live release feed
Sub-second macro releases for FX backtests
Point-in-time history
Official CPI, jobs, GDP, and central-bank events with point-in-time history.
USD 25/month 14-day free trial
Start Free Trial
Cara Membangun Dashboard Makro di Python dengan panda & Plotly image
Share headline card X LinkedIn Email
Download

By Language

Quick Start Guides

Cara Membangun Dashboard Makro di Python dengan panda & Plotly

Panduan langkah demi langkah untuk mengambil indikator FXMacroData melalui Python, membentuk ulang seri waktu dengan panda, dan merakit dashboard multi-panel interaktif dengan Plotly.

Juga tersedia dalam English
Share article X LinkedIn Email

Sebuah dasbor makro menempatkan indikator bank sentral dan ekonomi yang paling penting di satu tempat, sehingga Anda dapat memindai kondisi pasar dalam hitungan detik alih-alih memantul antara terminal data. panduan ini berjalan Anda melalui membangun penuh interaktif, multi-panel dasbor di Python mengambil data indikator hidup dari FXMacroData API, membentuk kembali dengan panda, dan membuatnya dengan Dengan sengajaSetiap panel diperbarui dari satu kunci API dan beberapa panggilan fungsi.

Apa yang Akan Anda Bangun

Skrip Python mandiri yang menarik suku bunga kebijakan, inflasi, pengangguran, dan PMI untuk empat mata uang FX utama (USD, EUR, GBP, AUD), mengumpulkan Panda DataFrame bersih untuk setiap indikator, dan membuat empat panel Plotly dashboard semua dalam kurang dari 150 baris kode.

Persyaratan

Sebelum memulai, Anda perlu hal berikut:

  • Python 3.9+
  • Kunci API FXMacroData daftar di /langganan dan menyalin kunci Anda dari dasbor
  • Paket PythonAku tidak tahu. requestsAku akan pergi. pandasAku akan pergi. plotly

Instal ketergantungan dalam satu perintah:

pip install requests pandas plotly

Simpan kunci API Anda sebagai variabel lingkungan tidak pernah hard-code kredensial dalam skrip:

export FXMD_API_KEY="YOUR_API_KEY"

Langkah 1 Memahami Bentuk Endpoint Indikator

Setiap indikator FXMacroData mengikuti pola REST yang sama, yang membuatnya sepele untuk menggeneralisasi ke dalam fungsi pengambilan tunggal.

GET https://fxmacrodata.com/api/v1/announcements/usd/policy_rate?api_key=YOUR_API_KEY&start=2020-01-01

Tanggapan JSON adalah objek datar dengan data array:

{
  "data": [
    { "date": "2025-03-19", "val": 4.25, "announcement_datetime": "2025-03-19T18:00:00Z" },
    { "date": "2025-01-29", "val": 4.25, "announcement_datetime": "2025-01-29T19:00:00Z" },
    { "date": "2024-12-18", "val": 4.25, "announcement_datetime": "2024-12-18T19:00:00Z" }
  ]
}

Setiap rekaman membawa date (YYY-MM-DD), sebuah angka val, dan jika tersedia UTC tingkat dua announcement_datetimeBentuk yang konsisten di semua indikator adalah apa yang memungkinkan satu fungsi melayani setiap panel di dasbor.

Langkah 2 Tuliskan fungsi fetch yang dapat digunakan kembali

Buat modul bernama macro_fetch.pyFungsi di bawah ini meminta indikator untuk mata uang apa pun, mengkonversi tanggapan ke seri panda, dan mengembalikannya diindeks oleh tanggal siap untuk langsung ke dalam DataFrame.

import os
import requests
import pandas as pd

BASE_URL = "https://fxmacrodata.com/api/v1"
API_KEY = os.environ["FXMD_API_KEY"]


def fetch_indicator(currency: str, indicator: str, start: str = "2020-01-01") -> pd.Series:
    """
    Fetch a single indicator series from FXMacroData and return it as a
    pandas Series with a DatetimeIndex, named '{currency.upper()}_{indicator}'.
    """
    url = f"{BASE_URL}/announcements/{currency}/{indicator}"
    resp = requests.get(url, params={"api_key": API_KEY, "start": start}, timeout=15)
    resp.raise_for_status()

    records = resp.json().get("data", [])
    if not records:
        return pd.Series(name=f"{currency.upper()}_{indicator}", dtype=float)

    series = (
        pd.DataFrame(records)
        .assign(date=lambda df: pd.to_datetime(df["date"]))
        .set_index("date")["val"]
        .sort_index()
        .rename(f"{currency.upper()}_{indicator}")
    )
    return series

Mengapa seri per indikator?

Indikator dari mata uang yang berbeda dirilis pada tanggal yang berbeda, sehingga mereka tidak pernah berbagi indeks yang selaras sempurna. pd.concat(..., axis=1) memungkinkan panda menangani keselarasan tanggal secara otomatis, mengisi celah dengan NaN dimana mata uang belum dilaporkan.

Langkah 3 Ambil Semua Indikator untuk Dashboard

Dengan bantuan mengambil di tempat, menarik empat indikator untuk empat mata uang adalah loop ringkas.

import time

CURRENCIES = ["usd", "eur", "gbp", "aud"]
INDICATORS = {
    "policy_rate": "Policy Rate (%)",
    "inflation": "CPI Inflation (% YoY)",
    "unemployment": "Unemployment Rate (%)",
    "pmi": "Manufacturing PMI",
}


def fetch_all(start: str = "2020-01-01", retries: int = 3) -> dict[str, pd.DataFrame]:
    """
    Return a dict mapping each indicator slug to a wide DataFrame where
    each column is one currency (e.g. USD_policy_rate, EUR_policy_rate).
    """
    frames: dict[str, list[pd.Series]] = {ind: [] for ind in INDICATORS}

    for currency in CURRENCIES:
        for indicator in INDICATORS:
            for attempt in range(retries):
                try:
                    s = fetch_indicator(currency, indicator, start=start)
                    frames[indicator].append(s)
                    break
                except requests.HTTPError as exc:
                    if attempt == retries - 1:
                        print(f"Warning: could not fetch {currency}/{indicator}: {exc}")
                    else:
                        time.sleep(1.5 ** attempt)

    return {ind: pd.concat(series, axis=1) for ind, series in frames.items() if series}

Anda dapat memeriksa DataFrame secara interaktif untuk memverifikasi tampilan data sebelum render:

data = fetch_all(start="2021-01-01")
print(data["policy_rate"].tail())
# Output (example):
#             USD_policy_rate  EUR_policy_rate  GBP_policy_rate  AUD_policy_rate
# date
# 2025-01-29             4.25              NaN              NaN              NaN
# 2025-02-06              NaN              NaN             4.50              NaN
# 2025-02-18              NaN              NaN              NaN             4.10
# 2025-03-06              NaN             2.50              NaN              NaN
# 2025-03-19             4.25              NaN              NaN              NaN

Langkah 4 Bentuk data untuk grafik

Plot bekerja dengan baik. diisi ke depan seri untuk grafik garis, sehingga nilai yang paling baru diketahui diteruskan sampai rilis berikutnya.

def prepare_for_chart(df: pd.DataFrame) -> pd.DataFrame:
    """
    Forward-fill each column so lines in the chart step at each release date
    rather than showing gaps between announcements.
    Resample to a monthly frequency for a cleaner visual.
    """
    return (
        df
        .ffill()
        .resample("ME")      # month-end
        .last()
        .dropna(how="all")
    )

Untuk PMI, yang merupakan indikator bulanan, pengisian ke depan kurang relevan tetapi fungsi menangani dengan elegan dengan hanya melewati data bulanan yang tidak berubah.

Langkah 5 Buatlah Dashboard Plotly

Plotly's make_subplots Utilitas ini memungkinkan Anda mengatur beberapa grafik dalam objek gambar tunggal, yang dapat Anda tampilkan di browser, ekspor sebagai HTML, atau menyematkan dalam buku catatan Jupyter.

import plotly.graph_objects as go
from plotly.subplots import make_subplots

# Palette aligned with FXMacroData brand colours
COLORS = {
    "usd": "#3B82F6",   # finance blue
    "eur": "#D97706",   # gold
    "gbp": "#16A34A",   # green
    "aud": "#7C3AED",   # purple
}

SUBPLOT_TITLES = list(INDICATORS.values())


def build_dashboard(data: dict[str, pd.DataFrame]) -> go.Figure:
    fig = make_subplots(
        rows=2, cols=2,
        subplot_titles=SUBPLOT_TITLES,
        shared_xaxes=False,
        vertical_spacing=0.12,
        horizontal_spacing=0.08,
    )

    positions = [(1, 1), (1, 2), (2, 1), (2, 2)]

    for (indicator, label), (row, col) in zip(INDICATORS.items(), positions):
        df = prepare_for_chart(data[indicator])
        for col_name in df.columns:
            currency = col_name.split("_")[0].lower()
            fig.add_trace(
                go.Scatter(
                    x=df.index,
                    y=df[col_name],
                    mode="lines",
                    name=currency.upper(),
                    line=dict(color=COLORS[currency], width=2),
                    legendgroup=currency,
                    showlegend=(indicator == "policy_rate"),  # one legend entry per currency
                    hovertemplate=f"%{{x|%b %Y}}: %{{y:.2f}}{mata uang.atas()}",
                ),
                row=row, col=col,
            )

    fig.update_layout(
        title=dict(
            text="G4 Central Bank Macro Dashboard",
            font=dict(size=22, color="#1e3a5f"),
            x=0.5,
        ),
        paper_bgcolor="#f8fafc",
        plot_bgcolor="#f1f5f9",
        font=dict(family="Inter, system-ui, sans-serif", size=12, color="#334155"),
        legend=dict(
            orientation="h",
            yanchor="bottom",
            y=1.04,
            xanchor="center",
            x=0.5,
        ),
        height=700,
        margin=dict(t=100, b=50, l=60, r=40),
    )

    fig.update_xaxes(showgrid=True, gridcolor="#e2e8f0", zeroline=False)
    fig.update_yaxes(showgrid=True, gridcolor="#e2e8f0", zeroline=False)

    return fig

Langkah 6 Jalankan Dashboard

Kabel semuanya bersama-sama dalam dashboard.py Aksara entry point. fig.show() membuka dashboard di browser default Anda. fig.write_html() menyimpan file HTML mandiri yang dapat Anda bagikan atau masukan di mana saja.

if __name__ == "__main__":
    print("Fetching macro data …")
    data = fetch_all(start="2021-01-01")

    print("Building dashboard …")
    fig = build_dashboard(data)

    # Option A: open in browser
    fig.show()

    # Option B: save as portable HTML file
    fig.write_html("macro_dashboard.html", include_plotlyjs="cdn")
    print("Saved macro_dashboard.html")

Jalankan dari terminal:

python dashboard.py

Plotly akan membuka jendela browser yang menampilkan dua baris, dua kolom dashboard dengan empat panel hidup satu untuk setiap indikator kode warna oleh mata uang.

Tambahkan lebih banyak indikator dalam hitungan detik

Dashboard dirancang untuk skala. INDICATORS dict misalnya "core_inflation": "Core CPI (% YoY)" atau "gdp_quarterly": "GDP Growth (% QoQ)" dan langkah mengambil, bentuk, dan grafik semuanya mengambil secara otomatis. Dokumentasi API.

Langkah 7 Tambahkan Anotasi Rilis-Tanggal (Opssional)

Salah satu peningkatan dasbor yang paling berguna adalah overlaying Penanda pelepasan garis vertikal atau titik yang menunjukkan persis kapan setiap pengumuman dibuat. announcement_datetime time stamp, jadi Anda dapat menambahkannya tanpa menebak:

def fetch_release_datetimes(currency: str, indicator: str, start: str) -> pd.Series:
    """Return a Series of UTC announcement datetimes for a given indicator."""
    url = f"{BASE_URL}/announcements/{currency}/{indicator}"
    resp = requests.get(url, params={"api_key": API_KEY, "start": start}, timeout=15)
    resp.raise_for_status()
    records = resp.json().get("data", [])
    if not records:
        return pd.Series(dtype="datetime64[ns, UTC]")
    df = pd.DataFrame(records)
    if "announcement_datetime" not in df.columns:
        return pd.Series(dtype="datetime64[ns, UTC]")
    return pd.to_datetime(df["announcement_datetime"], utc=True)


def add_release_markers(fig: go.Figure, currency: str, indicator: str,
                         start: str, row: int, col: int) -> None:
    """Overlay vertical dashed lines on a subplot at each release datetime."""
    datetimes = fetch_release_datetimes(currency, indicator, start)
    for dt in datetimes:
        fig.add_vline(
            x=dt.timestamp() * 1000,  # Plotly uses ms since epoch for datetime axes
            line_width=1,
            line_dash="dot",
            line_color=COLORS[currency],
            opacity=0.35,
            row=row, col=col,
        )

Hubungi. add_release_markers Setelah build_dashboard dan sebelumnya. fig.show() Untuk mengomentari panel mana yang paling relevan dengan analisis Anda, penanda rilis sangat berguna pada panel suku bunga kebijakan, di mana tanggal keputusan jarang tetapi berdampak tinggi.

Langkah 8 Ekspor Panel sebagai Gambar Individu

Jika Anda ingin memasukkan grafik individu dalam laporan atau slide deck, Plotly dapat mengekspor setiap subplot sebagai PNG melalui KaleidoAku tidak tahu.

pip install kaleido
fig.write_image("macro_dashboard.png", width=1400, height=700, scale=2)

Untuk ekspor per panel, bangun setiap indikator sebagai independen go.Figure menggunakan yang sama. go.Scatter jejak dan panggilan write_image Fungsi mengambil dan bentuk yang dikembangkan pada langkah-langkah sebelumnya bekerja tidak berubah untuk tokoh panel tunggal.

Referensi Skripsi Lengkap

Di bawah ini adalah skrip lengkap, mandiri menggabungkan semua langkah di atas. dashboard.py, diatur FXMD_API_KEY, dan menjalankannya.

"""
macro_dashboard.py — G4 Central Bank Macro Dashboard
Requires: requests, pandas, plotly
Usage:    FXMD_API_KEY=your_key python macro_dashboard.py
"""
import os
import time
import requests
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots

BASE_URL = "https://fxmacrodata.com/api/v1"
API_KEY = os.environ["FXMD_API_KEY"]

CURRENCIES = ["usd", "eur", "gbp", "aud"]
INDICATORS = {
    "policy_rate": "Policy Rate (%)",
    "inflation": "CPI Inflation (% YoY)",
    "unemployment": "Unemployment Rate (%)",
    "pmi": "Manufacturing PMI",
}
COLORS = {"usd": "#3B82F6", "eur": "#D97706", "gbp": "#16A34A", "aud": "#7C3AED"}


def fetch_indicator(currency: str, indicator: str, start: str = "2020-01-01") -> pd.Series:
    url = f"{BASE_URL}/announcements/{currency}/{indicator}"
    resp = requests.get(url, params={"api_key": API_KEY, "start": start}, timeout=15)
    resp.raise_for_status()
    records = resp.json().get("data", [])
    if not records:
        return pd.Series(name=f"{currency.upper()}_{indicator}", dtype=float)
    return (
        pd.DataFrame(records)
        .assign(date=lambda df: pd.to_datetime(df["date"]))
        .set_index("date")["val"]
        .sort_index()
        .rename(f"{currency.upper()}_{indicator}")
    )


def fetch_all(start: str = "2020-01-01", retries: int = 3) -> dict[str, pd.DataFrame]:
    frames: dict[str, list[pd.Series]] = {ind: [] for ind in INDICATORS}
    for currency in CURRENCIES:
        for indicator in INDICATORS:
            for attempt in range(retries):
                try:
                    frames[indicator].append(fetch_indicator(currency, indicator, start))
                    break
                except requests.HTTPError as exc:
                    if attempt == retries - 1:
                        print(f"Warning: {currency}/{indicator}: {exc}")
                    else:
                        time.sleep(1.5 ** attempt)
    return {ind: pd.concat(series, axis=1) for ind, series in frames.items() if series}


def prepare_for_chart(df: pd.DataFrame) -> pd.DataFrame:
    return df.ffill().resample("ME").last().dropna(how="all")


def build_dashboard(data: dict[str, pd.DataFrame]) -> go.Figure:
    fig = make_subplots(
        rows=2, cols=2,
        subplot_titles=list(INDICATORS.values()),
        vertical_spacing=0.12,
        horizontal_spacing=0.08,
    )
    for (indicator, _), (row, col) in zip(INDICATORS.items(), [(1,1),(1,2),(2,1),(2,2)]):
        df = prepare_for_chart(data[indicator])
        for col_name in df.columns:
            currency = col_name.split("_")[0].lower()
            fig.add_trace(
                go.Scatter(
                    x=df.index, y=df[col_name], mode="lines",
                    name=currency.upper(),
                    line=dict(color=COLORS[currency], width=2),
                    legendgroup=currency,
                    showlegend=(indicator == "policy_rate"),
                    hovertemplate=f"%{{x|%b %Y}}: %{{y:.2f}}{mata uang.atas()}",
                ),
                row=row, col=col,
            )
    fig.update_layout(
        title=dict(text="G4 Central Bank Macro Dashboard", font=dict(size=22, color="#1e3a5f"), x=0.5),
        paper_bgcolor="#f8fafc", plot_bgcolor="#f1f5f9",
        font=dict(family="Inter, system-ui, sans-serif", size=12),
        legend=dict(orientation="h", yanchor="bottom", y=1.04, xanchor="center", x=0.5),
        height=700, margin=dict(t=100, b=50, l=60, r=40),
    )
    fig.update_xaxes(showgrid=True, gridcolor="#e2e8f0", zeroline=False)
    fig.update_yaxes(showgrid=True, gridcolor="#e2e8f0", zeroline=False)
    return fig


if __name__ == "__main__":
    print("Fetching macro data …")
    data = fetch_all(start="2021-01-01")
    print("Building dashboard …")
    fig = build_dashboard(data)
    fig.show()
    fig.write_html("macro_dashboard.html", include_plotlyjs="cdn")
    print("Saved macro_dashboard.html")

Ringkasan

Anda sekarang memiliki dashboard makro yang berfungsi:

  • Mengambil suku bunga kebijakan, inflasi, pengangguran, dan PMI untuk USD, EUR, GBP, dan AUD dari FXMacroData pengumuman titik akhir
  • Mengubah bentuk data menjadi panda yang sejajar, yang diisi ke depan DataFrames
  • Membuat empat panel interaktif Dashboard Plotly dengan garis mata uang yang dikodekan warna
  • Ekspor file HTML mandiri yang dapat Anda bagikan atau masang

Dari sini Anda dapat memperluas dasbor dalam beberapa arah: menambahkan lebih banyak mata uang, overlay pengangguran Dengan menggunakan data yang terdaftar di database, Anda dapat melihat data yang dicatat di database yang tercatat di indeks indeks indeks perdagangan, atau mengkonversi data ke dalam jadwal yang diperbarui setiap pagi. api-data-docs.

Blogroll

AI Answer-Ready

Key Facts

Page
How To Build Macro Dashboard Python Pandas
Section
Articles
Canonical URL
https://fxmacrodata.com/id/articles/how-to-build-macro-dashboard-python-pandas
Source
FXMacroData editorial and official publisher references
Last Updated
2026-06-15 11:06 UTC

Provenance And Trust

Cite the canonical URL and source field above. Where available, this page maps to official publisher releases and timestamped updates.

Quick Q&A

What is this page about? This page explains How To Build Macro Dashboard Python Pandas with directly usable context for trading, research, and API workflows.

What source should be cited? Use the canonical URL and the listed source field; cite official publisher references when available.

How fresh is this content? The last updated value above reflects the page metadata or latest available data timestamp.

Can this be used in AI assistants? Yes. This section is intentionally structured for retrieval and citation in chat assistants.

Prompt Packs

Use these in ChatGPT, Claude, Gemini, Mistral, Perplexity, or Grok for consistent source-aware outputs.