基于python的数学建模---机场航线设计

2022-12-30,,,,

数据集 拿走:

链接:https://pan.baidu.com/s/1zH5xhpEmx2_u5qO9W4gCkw
提取码:2wl5

数据集来自航空业,有一些关于航线的基本信息。有某段旅程的起始点和目的地。还有一些列表示每段旅程的到达和起飞时间。这个数据集非常适合作为图进行分析。想象一下通过航线(边)连接的几个城市(节点)。

如果你是航空公司,你可以问如下几个问题:

从A到B的最短途径是什么?分别从距离和时间角度考虑。
有没有办法从C到D?
哪些机场的交通最繁忙?
哪个机场位于大多数其他机场“之间”?这样它就可以变成当地的一个中转站。

import numpy as np
import pandas as pd
data = pd.read_csv('C:\\Users\\Style\\Desktop\\flights.csv')
print(data.shape)
# 336776行,19列

print(data.dtypes)  #各类型的变量

2.数据清洗

#将sched_dep_time转换为'std'—预定的出发时间
data['std'] = data.sched_dep_time.astype(str).str.replace('(\d{2}$)', '') + ':' + data.sched_dep_time.astype(str).str.extract('(\d{2}$)', expand=False) + ':00' #将sched_arr_time转换为“sta”—预定到达时间
data['sta'] = data.sched_arr_time.astype(str).str.replace('(\d{2}$)', '') + ':' + data.sched_arr_time.astype(str).str.extract('(\d{2}$)', expand=False) + ':00' #将dep_time转换为'atd' -实际出发时间
data['atd'] = data.dep_time.fillna(0).astype(np.int64).astype(str).str.replace('(\d{2}$)', '') + ':' + data.dep_time.fillna(0).astype(np.int64).astype(str).str.extract('(\d{2}$)', expand=False) + ':00' #将arr_time转换为'ata' -实际到达时间
data['ata'] = data.arr_time.fillna(0).astype(np.int64).astype(str).str.replace('(\d{2}$)', '') + ':' + data.arr_time.fillna(0).astype(np.int64).astype(str).str.extract('(\d{2}$)', expand=False) + ':00'

3.时间信息合并

data['date'] = pd.to_datetime(data[['year', 'month', 'day']])
data = data.drop(columns = ['year', 'month', 'day'])

4.创建图

import networkx as nx

FG = nx.from_pandas_edgelist(data, source='origin', target='dest', edge_attr=True,)
# 查看所有节点
print(FG.nodes())
['EWR', 'IAH', 'LGA', 'JFK', 'MIA', 'BQN', 'ATL', 'ORD', 'FLL', 'IAD', 'MCO', 'PBI', 'TPA', 'LAX', 'SFO', 'DFW', 'BOS', 'LAS', 'MSP', 'DTW', 'RSW', 'SJU', 'PHX', 'BWI', 'CLT', 'BUF', 'DEN', 'SNA', 'MSY', 'SLC', 'XNA', 'MKE', 'SEA', 'ROC', 'SYR', 'SRQ', 'RDU', 'CMH', 'JAX', 'CHS', 'MEM', 'PIT', 'SAN', 'DCA', 'CLE', 'STL', 'MYR', 'JAC', 'MDW', 'HNL', 'BNA', 'AUS', 'BTV', 'PHL', 'STT', 'EGE', 'AVL', 'PWM', 'IND', 'SAV', 'CAK', 'HOU', 'LGB', 'DAY', 'ALB', 'BDL', 'MHT', 'MSN', 'GSO', 'CVG', 'BUR', 'RIC', 'GSP', 'GRR', 'MCI', 'ORF', 'SAT', 'SDF', 'PDX', 'SJC', 'OMA', 'CRW', 'OAK', 'SMF', 'TUL', 'TYS', 'OKC', 'PVD', 'DSM', 'PSE', 'BHM', 'CAE', 'HDN', 'BZN', 'MTJ', 'EYW', 'PSP', 'ACK', 'BGR', 'ABQ', 'ILM', 'MVY', 'SBN', 'LEX', 'CHO', 'TVC', 'ANC']

查询图中的所有边

#查看所有边
print(FG.edges())
[('EWR', 'IAH'), ('EWR', 'ORD'), ('EWR', 'FLL'), ('EWR', 'SFO'), ('EWR', 'LAS'), ('EWR', 'PBI'), ('EWR', 'MIA'), ('EWR', 'ATL'), ('EWR', 'PHX'), ('EWR', 'MSP'), ('EWR', 'LAX'), ('EWR', 'CLT'), ('EWR', 'IAD'), ('EWR', 'SNA'), ('EWR', 'TPA'), ('EWR', 'RSW'), ('EWR', 'SJU'), ('EWR', 'SEA'), ('EWR', 'DFW'), ('EWR', 'DEN'), ('EWR', 'MCO'), ('EWR', 'BOS'), ('EWR', 'JAX'), ('EWR', 'CHS'), ('EWR', 'MEM'), ('EWR', 'MYR'), ('EWR', 'JAC'), ('EWR', 'RDU'), ('EWR', 'DTW'), ('EWR', 'SAN'), ('EWR', 'MDW'), ('EWR', 'STT'), ('EWR', 'CLE'), ('EWR', 'EGE'), ('EWR', 'DCA'), ('EWR', 'AVL'), ('EWR', 'STL'), ('EWR', 'BUF'), ('EWR', 'IND'), ('EWR', 'MKE'), ('EWR', 'PWM'), ('EWR', 'SAV'), ('EWR', 'SYR'), ('EWR', 'CMH'), ('EWR', 'ROC'), ('EWR', 'BWI'), ('EWR', 'BTV'), ('EWR', 'DAY'), ('EWR', 'HOU'), ('EWR', 'ALB'), ('EWR', 'BDL'), ('EWR', 'SLC'), ('EWR', 'PIT'), ('EWR', 'HNL'), ('EWR', 'MHT'), ('EWR', 'MSN'), ('EWR', 'GSO'), ('EWR', 'CVG'), ('EWR', 'AUS'), ('EWR', 'RIC'), ('EWR', 'GSP'), ('EWR', 'GRR'), ('EWR', 'MCI'), ('EWR', 'BNA'), ('EWR', 'SAT'), ('EWR', 'SDF'), ('EWR', 'PDX'), ('EWR', 'OMA'), ('EWR', 'BQN'), ('EWR', 'TUL'), ('EWR', 'TYS'), ('EWR', 'OKC'), ('EWR', 'PVD'), ('EWR', 'DSM'), ('EWR', 'ORF'), ('EWR', 'XNA'), ('EWR', 'MSY'), ('EWR', 'CAE'), ('EWR', 'PHL'), ('EWR', 'HDN'), ('EWR', 'BZN'), ('EWR', 'MTJ'), ('EWR', 'SBN'), ('EWR', 'TVC'), ('EWR', 'ANC'), ('EWR', 'LGA'), ('IAH', 'LGA'), ('IAH', 'JFK'), ('LGA', 'ATL'), ('LGA', 'IAD'), ('LGA', 'ORD'), ('LGA', 'DFW'), ('LGA', 'FLL'), ('LGA', 'MSP'), ('LGA', 'DTW'), ('LGA', 'MIA'), ('LGA', 'BWI'), ('LGA', 'MCO'), ('LGA', 'DEN'), ('LGA', 'PBI'), ('LGA', 'XNA'), ('LGA', 'MKE'), ('LGA', 'RSW'), ('LGA', 'TPA'), ('LGA', 'CLT'), ('LGA', 'CMH'), ('LGA', 'CLE'), ('LGA', 'STL'), ('LGA', 'RDU'), ('LGA', 'BNA'), ('LGA', 'PHL'), ('LGA', 'MDW'), ('LGA', 'SRQ'), ('LGA', 'DCA'), ('LGA', 'CAK'), ('LGA', 'MSY'), ('LGA', 'BOS'), ('LGA', 'MEM'), ('LGA', 'BUF'), ('LGA', 'PIT'), ('LGA', 'MCI'), ('LGA', 'CRW'), ('LGA', 'CVG'), ('LGA', 'GRR'), ('LGA', 'RIC'), ('LGA', 'ROC'), ('LGA', 'TYS'), ('LGA', 'BHM'), ('LGA', 'PWM'), ('LGA', 'EYW'), ('LGA', 'GSO'), ('LGA', 'HOU'), ('LGA', 'JAX'), ('LGA', 'BTV'), ('LGA', 'CHS'), ('LGA', 'SAV'), ('LGA', 'SDF'), ('LGA', 'IND'), ('LGA', 'DAY'), ('LGA', 'BGR'), ('LGA', 'MSN'), ('LGA', 'ORF'), ('LGA', 'OMA'), ('LGA', 'DSM'), ('LGA', 'GSP'), ('LGA', 'ILM'), ('LGA', 'SYR'), ('LGA', 'SBN'), ('LGA', 'LEX'), ('LGA', 'MHT'), ('LGA', 'CAE'), ('LGA', 'CHO'), ('LGA', 'AVL'), ('LGA', 'TVC'), ('LGA', 'MYR'), ('JFK', 'MIA'), ('JFK', 'BQN'), ('JFK', 'MCO'), ('JFK', 'PBI'), ('JFK', 'TPA'), ('JFK', 'LAX'), ('JFK', 'BOS'), ('JFK', 'ATL'), ('JFK', 'SFO'), ('JFK', 'RSW'), ('JFK', 'SJU'), ('JFK', 'PHX'), ('JFK', 'BUF'), ('JFK', 'LAS'), ('JFK', 'MSY'), ('JFK', 'SLC'), ('JFK', 'FLL'), ('JFK', 'ROC'), ('JFK', 'SYR'), ('JFK', 'SRQ'), ('JFK', 'SEA'), ('JFK', 'RDU'), ('JFK', 'CLT'), ('JFK', 'MSP'), ('JFK', 'PIT'), ('JFK', 'SAN'), ('JFK', 'DCA'), ('JFK', 'JAX'), ('JFK', 'ORD'), ('JFK', 'DTW'), ('JFK', 'BWI'), ('JFK', 'HNL'), ('JFK', 'AUS'), ('JFK', 'BTV'), ('JFK', 'STT'), ('JFK', 'IAD'), ('JFK', 'PWM'), ('JFK', 'HOU'), ('JFK', 'LGB'), ('JFK', 'BUR'), ('JFK', 'CLE'), ('JFK', 'IND'), ('JFK', 'CMH'), ('JFK', 'BNA'), ('JFK', 'DFW'), ('JFK', 'CVG'), ('JFK', 'PHL'), ('JFK', 'DEN'), ('JFK', 'EGE'), ('JFK', 'ORF'), ('JFK', 'PDX'), ('JFK', 'SJC'), ('JFK', 'CHS'), ('JFK', 'OAK'), ('JFK', 'SMF'), ('JFK', 'SAT'), ('JFK', 'PSE'), ('JFK', 'MEM'), ('JFK', 'RIC'), ('JFK', 'PSP'), ('JFK', 'ACK'), ('JFK', 'MCI'), ('JFK', 'ABQ'), ('JFK', 'MVY'), ('JFK', 'STL'), ('JFK', 'JAC'), ('JFK', 'SDF'), ('JFK', 'MKE'), ('JFK', 'BHM')]

计算图的平均边密度

nx.draw_networkx(FG, with_labels=True)
nx.algorithms.degree_centrality(FG)
plt.show()
# 图的平均边密度
print(nx.density(FG))

图中所有路径的平均最短路径长度

#图中所有路径的平均最短路径长度
print(nx.average_shortest_path_length(FG))

#对于一个度为k的节点-它的邻居度的平均值是多少

# k:相邻有几个可以飞的机场,就有几个度
result = nx.average_degree_connectivity(FG)
print(result)

#{86: 3.1511627906976742, 3: 75.0, 69: 3.7246376811594204, 70: 2.4571428571428573, 2: 77.27142857142857, 1: 75.66666666666667}

计算航线

# 找出所有 JAX 到 DFW 的航线
for path in nx.all_simple_paths(FG, source='JAX', target='DFW'):
print(path) #找出从JAX到DFW的dijkstra路径。
# 按照距离
dijpath = nx.dijkstra_path(FG, source='JAX', target='DFW')
print(dijpath)
# 按照时间
short_time = nx.dijkstra_path(FG, source='JAX', target='DFW', weight='air_time')
print(short_time)

起始点和目的地可以作为节点,其他信息应当作为节点或边属性;单条边可以被认为是一段旅程。这样的旅程将有不同的时间,航班号,飞机尾号等相关信息。
注意到年,月,日和时间信息分散在许多列;想创建一 个包含所有这些信息的日期时间列,还需要将预计的 (scheduled)和实际的(actual)到达离开时间分开;最终 应该有4个日期时间列(预计到达时间、预计起飞时间、 实际到达时间和实际起飞时间)
时间格式问题
数据类型问题
NaN值的麻烦

参考:https://juejin.cn/post/7014324199896383525

基于python的数学建模---机场航线设计的相关教程结束。

《基于python的数学建模---机场航线设计.doc》

下载本文的Word格式文档,以方便收藏与打印。