You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求修正基于df.loc的飞行阶段计算代码(pphase异常)

修正飞行阶段计算代码中的前阶段逻辑问题

问题分析

你的代码存在两个核心问题:

  1. 函数参数是df_to_be_computed,但内部直接使用未定义的df,会引发错误或意外修改原数据。
  2. pphase列基于初始全0的flight_phase生成,后续更新flight_phase时pphase不会同步更新,导致判断前一阶段时始终用的是初始0值,完全失效。

修正方案

  • 先创建输入数据的副本,避免修改原数据集;
  • 不再提前生成pphase列,而是在每个阶段的条件判断中直接使用df['flight_phase'].shift(1),实时获取前一行已计算出的飞行阶段值;
  • 确保阶段赋值的逻辑顺序合理,高优先级的阶段(如引擎停止)先判断,避免被低优先级覆盖。

修正后的代码示例

# 飞行阶段定义:
# 1) 引擎停止
# 2) 滑行离场
# 3) 起飞
# 4) 中断起飞
# 5) 第二阶段爬升
# 6) 初始爬升
# 7) 爬升
# 8) 巡航
# 9) 下降
# 10) 进近
# 11) 最终进近
# 12) 复飞
# 13) 着陆
# 14) 滑行进场

def compute_flight_phase(df_to_be_computed):
    # 创建副本,避免修改原数据
    df = df_to_be_computed.copy()
    
    # 初始化飞行阶段列
    df['flight_phase'] = 0

    # 1) 引擎停止
    df.loc[df['radioHeight-2a'] < 50, 'flight_phase'] = 1

    # 2) 滑行离场
    # 直接用flight_phase.shift(1)获取前一阶段值,替代原pphase列
    taxi_out_cond = (df['eng_stopped'] == 0) & \
                   (df['wOW-3a'] == 1) & \
                   (df['eng_takeoff'] == 0) & \
                   (
                       (df['flight_phase'].shift(1) < 5) | 
                       ((df['eng_2started'] == 1) & (df['groundSpeed-1a'] < df['gsc_min'])) | 
                       ((df['flight_phase'].shift(1) == 14) & ((df['eng_cruise'] == 1) | (df['conf'] > df['conf'].shift(-1))))
                   )
    df.loc[taxi_out_cond, 'flight_phase'] = 2

    # 后续其他阶段的计算逻辑同理,均使用flight_phase.shift(1)获取前阶段值
    # ...(此处补充剩余阶段的代码)

    # 如果需要保留前阶段列,可在所有阶段计算完成后生成
    df['pphase'] = df['flight_phase'].shift(1)
    return df

额外说明

  • 若飞行阶段存在互斥性,需确保判断顺序合理:比如引擎停止的条件应优先于滑行等阶段,避免符合引擎停止条件的行被错误赋值为其他阶段;
  • 对于依赖后续行数据的判断(如df['conf'] > df['conf'].shift(-1)),需注意数据末尾的shift(-1)会产生NaN值,可根据实际情况添加pd.notna()条件过滤。

内容的提问来源于stack exchange,提问作者Tfmr_uk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 18:45:56