قائمة وثائق المطورين

ابنِ خطة أسعار ليلية من بيانات السوق

متقدم

حوّل العقارات المماثلة ومتوسط السعر اليومي حسب أيام الأسبوع والمهلة المسبقة للحجز إلى خطة أسعار لثلاثين ليلة يمكنك مراجعتها.

الإعداد

يستخدم هذا الدرس الأداة المساعدة jokerprice.py من درس البدء السريع. احفظها بجوار نصك البرمجي واضبط JOKERPRICE_API_KEY.

حدّد سعرًا أساسيًا من العقارات المماثلة

Python
from jokerprice import api

home = {"latitude": 21.5675, "longitude": 39.1293, "bedrooms": 2, "typeId": "6"}
est = api("POST", "/api/v1/estimate", json={**home, "radiusKm": 2})["estimate"]
base_rate = est["adr"]["value"]
print("base rate SAR", round(base_rate), "from", est["adr"]["basis"], "|", est["asking"]["count"], "comps")

عندما يكون أساس متوسط السعر اليومي هو الليالي المحجوزة، يعكس السعر الأساسي ما حُجز فعلًا في المنطقة، وإلا فهو وسيط السعر المعروض للعقارات المماثلة.

معاملات أيام الأسبوع

اقسم متوسط السعر اليومي لكل يوم من أيام الأسبوع على المتوسط العام. تجاوز الأيام التي رُصدت فيها ليالٍ قليلة، وضع حدًّا للمعاملات حتى لا يقلب يوم مضطرب الخطة.

Python
d = 0.03
area = {"north": home["latitude"] + d, "south": home["latitude"] - d, "east": home["longitude"] + d, "west": home["longitude"] - d}
m = api("GET", "/api/v1/metrics", params={**area, "past_days": 90, "forward_days": 60})["metrics"]

overall = m["past"]["adr"]
multiplier = {}
for day in m["byWeekday"]:
    ok = overall and day["adr"] and day["nights"] >= 50
    multiplier[day["weekday"]] = min(1.4, max(0.8, day["adr"] / overall)) if ok else 1.0
print({k: round(v, 2) for k, v in multiplier.items()})

سلوك اللحظة الأخيرة

يحصي leadTimes الليالي المحجوزة حسب المهلة المسبقة للحجز. فإذا حُجزت نسبة كبيرة خلال يوم واحد، فالإبقاء على السعر معقول؛ وإذا لم يُحجز شيء تقريبًا في اللحظة الأخيرة، فقد يفيد خصم معتدل على الليالي غير المحجوزة قبل موعدها بـ 0–2 يوم.

Python
lead = {b["label"]: b["nights"] for b in m["leadTimes"]}
total = sum(lead.values()) or 1
late_share = lead.get("0–1 days", 0) / total
last_minute = 1.0 if late_share >= 0.2 else 0.9
print(f"{late_share:.0%} of booked nights were booked 0-1 days ahead -> last-minute factor {last_minute}")

اكتب خطة الثلاثين ليلة

Python
import csv, datetime

today = datetime.date.today()
with open("rate-plan.csv", "w", newline="") as f:
    out = csv.writer(f)
    out.writerow(["date", "weekday", "rate_sar"])
    for i in range(30):
        day = today + datetime.timedelta(days=i)
        weekday = (day.weekday() + 1) % 7        # Python Monday=0 -> API Sunday=0
        rate = base_rate * multiplier.get(weekday, 1.0) * (last_minute if i <= 1 else 1.0)
        out.writerow([day.isoformat(), weekday, round(rate / 5) * 5])

تُقرَّب الأسعار إلى أقرب 5 ريالات. أعد التشغيل أسبوعيًا: كلما ارتفعت قيمة forward.onTheBooks لفترة ما، ارفع السعر لما تبقى من لياليها.