MCP 开发者体验活动:连接 MCP 即可领取 3 天开发者版会员体验

立即领取

镜像地球开放平台

新能源与电力

风光功率预测与电力交易气象数据

历史预报回算训练,实时预报上线推理,同一模型、同一口径。

10+ 历史预报模型15 分钟输出10–200 m 风速GHI · DNI · DHI · GTI省 / 市 / 区县面平均
接入指南起报时次对照

应用场景

按业务选数据

风电功率预测

wind_speed_100mwind_direction_100mwind_gusts_10mtemperature_2msurface_pressure

archive_hres · archive_cma(30–200 m)· archive_gfs

接入文档

实时预报 · 场站 15 分钟

GET /v1/forecast

import os
import requests
import pandas as pd

params = {
    "latitude": 41.15,
    "longitude": 114.70,
    "elevation": 1450,  # 场站海拔(m)
    "hourly": "wind_speed_100m,wind_direction_100m,wind_gusts_10m,"
              "temperature_2m,surface_pressure,relative_humidity_2m",
    "models": "ecmwf_ifs",
    "temporal_resolution": "minutely_15",
    "forecast_days": 3,
    "timezone": "Asia/Shanghai",
    "apikey": os.environ["MIRROR_EARTH_API_KEY"],
}
res = requests.get("https://api.mirror-earth.com/v1/forecast", params=params, timeout=60)
res.raise_for_status()
df = pd.DataFrame(res.json()["hourly"])  # 15 分钟一行,北京时间
print(df.head())

光伏功率预测

global_tilted_irradiancedirect_normal_irradiancediffuse_radiationcloud_cover_lowtemperature_2m

archive_hres · archive_ifs · 葵花卫星辐射

接入文档

实时预报 · 斜面辐照

GET /v1/forecast

import os
import requests
import pandas as pd

params = {
    "latitude": 36.40,
    "longitude": 94.90,
    "hourly": "global_tilted_irradiance,shortwave_radiation,"
              "direct_normal_irradiance,diffuse_radiation,"
              "cloud_cover_low,temperature_2m,wind_speed_10m",
    "tilt": 35,     # 组件倾角
    "azimuth": 0,   # 0 正南,-90 正东,90 正西
    "models": "ecmwf_ifs",
    "temporal_resolution": "minutely_15",
    "forecast_days": 3,
    "timezone": "Asia/Shanghai",
    "apikey": os.environ["MIRROR_EARTH_API_KEY"],
}
res = requests.get("https://api.mirror-earth.com/v1/forecast", params=params, timeout=60)
res.raise_for_status()
df = pd.DataFrame(res.json()["hourly"])
print(df[["time", "global_tilted_irradiance"]].head())

现货电价与负荷预测

temperature_2mapparent_temperaturewind_speed_100mshortwave_radiationprecipitation

省 / 市 / 区县区域平均 · 多模型对比

接入文档

批量下载 · 省域面平均

POST /api/tasks/export

import os
import time
from datetime import date, timedelta
import requests

BASE_URL = "https://api.mirror-earth.com"
headers = {"X-API-Key": os.environ["MIRROR_EARTH_API_KEY"]}
today = date.today()

payload = {
    "domain": "ecmwf_ifs",
    "hourly": ["temperature_2m", "apparent_temperature", "relative_humidity_2m",
               "wind_speed_100m", "shortwave_radiation", "precipitation"],
    "daily": [],
    "monthly": [],
    "time_range": {
        "type": "date_range",
        "start": str(today),
        "end": str(today + timedelta(days=3)),
    },
    "area": {"type": "point", "adcodes": ["370000", "320000"]},  # 山东、江苏
    "area_average": True,   # 省域面平均,不是省会点值
    "time_resolution": "minutely_15",
    "timezone": "Asia/Shanghai",
}

est = requests.post(f"{BASE_URL}/api/tasks/estimate", json=payload, headers=headers).json()["data"]
if est.get("error") or not est.get("estimate_id"):
    raise RuntimeError(est.get("error_msg") or "预估失败")
payload["estimate_id"] = est["estimate_id"]

res = requests.post(f"{BASE_URL}/api/tasks/export", json=payload, headers=headers)
res.raise_for_status()
task_id = res.json()["data"]["task_id"]

while True:
    status = requests.get(f"{BASE_URL}/api/tasks/{task_id}/status", headers=headers).json()["data"]
    if status["status"] == "completed":
        print(status["output_file"])  # 下载:GET /user_downloads/<output_file>
        break
    if status["status"] in ("failed", "cancelled"):
        raise RuntimeError(status["status"])
    time.sleep(10)

资源评估与中长期交易

wind_speed_100mshortwave_radiationtemperature_2m

ERA5 1940 年至今 · 逐月统计

接入文档

ERA5 再分析 · 10 年逐月统计

GET /v1/archive

import os
import requests
import pandas as pd

params = {
    "latitude": 41.15,
    "longitude": 114.70,
    "hourly": "wind_speed_100m,shortwave_radiation,temperature_2m",
    "start_date": "2015-01-01",
    "end_date": "2024-12-31",
    "models": "era5",
    "timezone": "Asia/Shanghai",
    "apikey": os.environ["MIRROR_EARTH_API_KEY"],
}
res = requests.get("https://api.mirror-earth.com/v1/archive", params=params, timeout=300)
res.raise_for_status()
df = pd.DataFrame(res.json()["hourly"])
df["time"] = pd.to_datetime(df["time"])

monthly = df.set_index("time").resample("MS").agg({
    "wind_speed_100m": "mean",                               # 月平均风速 m/s
    "shortwave_radiation": lambda x: x.sum() * 3600 / 1e6,   # 月辐射量 MJ/m²
    "temperature_2m": "mean",
})
print(monthly.groupby(monthly.index.month).mean())  # 10 年逐月气候态

示例从环境变量 MIRROR_EARTH_API_KEY 读取 API Key。

训练与上线

用历史预报训练,用同一模型上线

01

回算训练集

批量导出多个起报场,输出 init_time 与 time

time_range.type = "forecast"

02

按时效切片

只保留申报时刻真实可用的起报时次与预报时效

start_hour = "12"

03

实时推理

同一模型的实时预报,与训练集口径一致

temporal_resolution = minutely_15
payload = {
    "domain": "archive_hres",
    "hourly": ["wind_speed_100m", "wind_direction_100m", "temperature_2m"],
    "daily": [],
    "monthly": [],
    "time_range": {
        "type": "forecast",
        "start": "2026-01-01",
        "end": "2026-03-31",
        "start_hour": "00,12",
        "forecast_hours": 72,
    },
    "area": {
        "type": "point",
        "locations": [
            {"id": "WF01", "name": "张北风场", "lon": 114.70, "lat": 41.15},
            {"id": "PV01", "name": "格尔木光伏", "lon": 94.90, "lat": 36.40},
        ],
    },
    "time_resolution": "minutely_15",
    "timezone": "UTC",
    "area_average": False,
}
完整代码批量下载历史预报数据

数据源

历史预报模型

模型标识符分辨率原始步长风速高度辐射起始
ECMWF IFS 9kmarchive_hres9 km1 h10 / 100 mGHI · DNI · DHI · GTI2019-01
ECMWF IFS 25kmarchive_ifs25 km1 h10 / 100 mGHI · DNI · DHI · GTI2023-01
NOAA GFSarchive_gfs25 km1 h10–100 m(7 层)GHI · DNI · DHI · GTI2023-07
中国气象局 CMAarchive_cma12.5 km3 h10–200 m(10 层)GHI · DNI · DHI · GTI2025-09
德国气象局 ICONarchive_icon11 km1 h10 / 80 / 120 / 180 mGHI · DNI · DHI · GTI2025-09
加拿大气象局 GEMarchive_gem15 km3 h10 / 40 / 80 / 120 mGHI · DNI · DHI · GTI2025-09
英国气象局 UKMOarchive_ukmo10 km1 h10 mGHI · DNI · DHI · GTI2025-09
ECMWF AIFSarchive_aifs25 km6 h10 / 100 mGHI2025-09

场站批量接入与定制数据

电话 / 微信:18914726080

开始接入API 体验