无需硬编码100容量限制,优化停车场需求预测的比率方法
停车场预约需求预测优化方案
问题背景
需要预测容量为100的停车场未来7天的停车预约数,用于制定租赁定价策略。当前采用比率法:用7天前对应日期的「最终预约数/早期预约数」比值,乘以当前未来日期的早期预约数得到预测值,但该方法会出现预测值超过停车场容量的情况,且希望避免硬编码容量上限。
优化思路
1. 引入可配置容量参数
将停车场容量作为独立参数传入,替代硬编码值,提升代码灵活性和可维护性。
2. 饱和需求建模
使用逻辑斯蒂饱和函数替代线性比率计算,模拟真实场景中预约数趋近容量时增长放缓的规律,从原理上避免预测值突破上限。函数核心逻辑:
final_pred = 容量 / (1 + exp(-k * (当前早期预约数 - 中点值)))
其中k和中点值由历史数据拟合得到,分别控制曲线的陡峭程度和增长拐点位置。
3. 历史数据驱动的参数校准
从历史数据中提取关键统计量,用于初始化饱和函数参数,保证预测贴合实际运营情况:
- 历史平均早期预约数
- 历史平均转化率(最终预约/早期预约)
- 历史最大利用率(最终预约/容量)
修改后的代码实现
from datetime import datetime, timedelta import math # 可配置参数:停车场容量 PARKING_CAPACITY = 100 # 历史数据:(早期预约数, 最终预约数) historical_data = { '18-Feb-23': (35, 38), '19-Feb-23': (40, 50), '20-Feb-23': (35, 50), '21-Feb-23': (28, 50), '22-Feb-23': (15, 65), '23-Feb-23': (10, 54), '24-Feb-23': (3, 70) } # 未来数据:(早期预约数, 待填充的预测最终预约数) future_data = { '25-Feb-23': (40, None), '26-Feb-23': (35, None), '27-Feb-23': (28, None), '28-Feb-23': (20, None), '1-Mar-23': (25, None), '2-Mar-23': (3, None), '3-Mar-23': (1, None) } # 计算历史统计量 historical_early = [data[0] for data in historical_data.values()] historical_final = [data[1] for data in historical_data.values()] avg_early = sum(historical_early) / len(historical_early) avg_conversion = sum(f/e for f, e in zip(historical_final, historical_early) if e > 0) / len(historical_early) max_utilization = max(f/PARKING_CAPACITY for f in historical_final) # 拟合饱和函数参数:基于历史数据调整曲线斜率和拐点 k = 0.05 * avg_conversion midpoint = avg_early def predict_final(current_date, early_reservations): # 比率法初始预测 past_date = (datetime.strptime(current_date, '%d-%b-%y') - timedelta(days=7)).strftime('%d-%b-%y') if past_date in historical_data: past_e, past_f = historical_data[past_date] initial_pred = early_reservations * past_f / past_e if past_e > 0 else past_f else: initial_pred = early_reservations * avg_conversion # 饱和函数修正+历史利用率约束 saturation_pred = PARKING_CAPACITY / (1 + math.exp(-k * (early_reservations - midpoint))) capped_pred = min(initial_pred, saturation_pred, PARKING_CAPACITY * max_utilization) return int(round(capped_pred)) # 生成并更新预测结果 for current_date in future_data: early = future_data[current_date][0] final_pred = predict_final(current_date, early) future_data[current_date] = (early, final_pred) # 输出预测结果 for date in future_data: print(f"{date}: 预期最终预约数 = {future_data[date][1]}")
方案优势
- 无硬编码容量上限:所有约束基于可配置参数和历史数据自动计算
- 贴合真实需求:饱和函数模拟了预约数趋近容量时的增长放缓特性
- 鲁棒性更强:结合比率法的短期准确性和历史数据的长期规律,避免极端预测值
内容的提问来源于stack exchange,提问作者user13744439
相关产品推荐
相关产品推荐

