12. 找到持续最长的准时航班

  1. # 创建一个Series
  2. In[103]: s = pd.Series([1, 1, 1, 0, 1, 1, 1, 0])
  3. s
  4. Out[103]: 0 1
  5. 1 1
  6. 2 1
  7. 3 0
  8. 4 1
  9. 5 1
  10. 6 1
  11. 7 0
  12. dtype: int64
  1. # 累积求和
  2. In[104]: s1 = s.cumsum()
  3. s1
  4. Out[104]: 0 1
  5. 1 2
  6. 2 3
  7. 3 3
  8. 4 4
  9. 5 5
  10. 6 6
  11. 7 6
  12. dtype: int64
  1. In[105]: s.mul(s1).diff()
  2. Out[105]: 0 NaN
  3. 1 1.0
  4. 2 1.0
  5. 3 -3.0
  6. 4 4.0
  7. 5 1.0
  8. 6 1.0
  9. 7 -6.0
  10. dtype: float64
  1. # 将所有非负值变为缺失值
  2. In[106]: s.mul(s1).diff().where(lambda x: x < 0)
  3. Out[106]: 0 NaN
  4. 1 NaN
  5. 2 NaN
  6. 3 -3.0
  7. 4 NaN
  8. 5 NaN
  9. 6 NaN
  10. 7 -6.0
  11. dtype: float64
  1. In[107]: s.mul(s1).diff().where(lambda x: x < 0).ffill().add(s1, fill_value=0)
  2. Out[107]: 0 1.0
  3. 1 2.0
  4. 2 3.0
  5. 3 0.0
  6. 4 1.0
  7. 5 2.0
  8. 6 3.0
  9. 7 0.0
  10. dtype: float64
  1. # 创建一个准时的列 ON_TIME
  2. In[108]: flights = pd.read_csv('data/flights.csv')
  3. flights['ON_TIME'] = flights['ARR_DELAY'].lt(15).astype(int)
  4. flights[['AIRLINE', 'ORG_AIR', 'ON_TIME']].head(10)
  5. Out[108]:

12. 找到持续最长的准时航班 - 图1

  1. # 将之前的逻辑做成一个函数
  2. In[109]: def max_streak(s):
  3. s1 = s.cumsum()
  4. return s.mul(s1).diff().where(lambda x: x < 0) \
  5. .ffill().add(s1, fill_value=0).max()
  6. In[110]: flights.sort_values(['MONTH', 'DAY', 'SCHED_DEP']) \
  7. .groupby(['AIRLINE', 'ORG_AIR'])['ON_TIME'] \
  8. .agg(['mean', 'size', max_streak]).round(2).head()
  9. Out[110]:

12. 找到持续最长的准时航班 - 图2

更多

  1. # 求最长的延误航班
  2. In[111]: def max_delay_streak(df):
  3. df = df.reset_index(drop=True)
  4. s = 1 - df['ON_TIME']
  5. s1 = s.cumsum()
  6. streak = s.mul(s1).diff().where(lambda x: x < 0) \
  7. .ffill().add(s1, fill_value=0)
  8. last_idx = streak.idxmax()
  9. first_idx = last_idx - streak.max() + 1
  10. df_return = df.loc[[first_idx, last_idx], ['MONTH', 'DAY']]
  11. df_return['streak'] = streak.max()
  12. df_return.index = ['first', 'last']
  13. df_return.index.name='streak_row'
  14. return df_return
  15. In[112]: flights.sort_values(['MONTH', 'DAY', 'SCHED_DEP']) \
  16. .groupby(['AIRLINE', 'ORG_AIR']) \
  17. .apply(max_delay_streak) \
  18. .sort_values(['streak','MONTH','DAY'], ascending=[False, True, True]).head(10)
  19. Out[112]:

12. 找到持续最长的准时航班 - 图3