| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- import holidays
- import pandas as pd
- CLEAN_VJ_HOT_NEAR_INFO_TAB = "clean_flights_vj_hot_0_7_info_tab"
- CLEAN_VJ_HOT_FAR_INFO_TAB = "clean_flights_vj_hot_7_30_info_tab"
- CLEAN_VJ_NOTHOT_NEAR_INFO_TAB = "clean_flights_vj_nothot_0_7_info_tab"
- CLEAN_VJ_NOTHOT_FAR_INFO_TAB = "clean_flights_vj_nothot_7_30_info_tab"
- mongodb_config = {
- "host": "192.168.20.218",
- "port": 27017,
- "db": "flights_datas_db",
- "user": "",
- "pwd": ""
- }
- # 城市码-国家码的映射
- city_to_country = {
- "CAN": "CN", # 广州,中国
- "DPS": "ID", # 巴厘岛,印度尼西亚
- "HAN": "VN", # 河内,越南
- "SGN": "VN", # 胡志明(西贡),越南
- "CTU": "CN", # 成都,中国
- "DAD": "VN", # 岘港,越南
- "SEL": "KR", # 首尔,韩国
- "DEL": "IN", # 德里,印度
- "UIH": "VN", # 归仁,越南
- "HKG": "HK", # 香港,中国
- "PQC": "VN", # 富国岛,越南
- "KUL": "MY", # 吉隆坡,马来西亚
- "NGO": "JP", # 名古屋,日本
- "NHA": "VN", # 芽庄,越南
- "PUS": "KR", # 釜山,韩国
- "SHA": "CN", # 上海,中国
- "SIN": "SG", # 新加坡,新加坡
- "TPE": "TW", # 台北,中国台湾
- "TYO": "JP", # 东京,日本
- "BKK": "TH", # 曼谷,泰国
- "BLR": "IN", # 班加罗尔,印度
- "FUK": "JP", # 福冈,日本
- "BMV": "VN", # 邦美蜀,越南
- "BNE": "AU", # 布里斯班,澳大利亚
- "BOM": "IN", # 孟买,印度
- "DLI": "VN", # 大叻,越南
- "OSA": "JP", # 大阪,日本
- "RMQ": "TW", # 台中,中国台湾
- "HKT": "TH", # 普吉岛,泰国
- "HPH": "VN", # 海防,越南
- "KHH": "TW", # 高雄,中国台湾
- "MEL": "AU", # 墨尔本,澳大利亚
- "MNL": "PH", # 马尼拉,菲律宾
- "SYD": "AU", # 悉尼,澳大利亚
- "REP": "KH", # 暹粒,柬埔寨
- "VTE": "LA", # 万象,老挝
- "HYD": "IN", # 海得拉巴,印度
- "AMD": "IN", # 艾哈迈达巴德,印度
- "JKT": "ID", # 雅加达,印度尼西亚
- }
- # 城市码-数字映射
- vj_city_code_map = {k: i for i, k in enumerate(city_to_country.keys())}
- # 航班号-数字映射
- vi_flight_number_map = {
- 'VJ': 0,
- 'VJ082': 1, 'VJ083': 2, 'VJ084': 3, 'VJ085': 4, 'VJ086': 5, 'VJ1159': 6, 'VJ120': 7, 'VJ121': 8, 'VJ122': 9, 'VJ123': 10,
- 'VJ124': 11, 'VJ125': 12, 'VJ126': 13, 'VJ127': 14, 'VJ128': 15, 'VJ129': 16, 'VJ130': 17, 'VJ131': 18, 'VJ132': 19, 'VJ1321': 20,
- 'VJ1322': 21, 'VJ1329': 22, 'VJ133': 23, 'VJ1330': 24, 'VJ134': 25, 'VJ135': 26, 'VJ136': 27, 'VJ137': 28, 'VJ138': 29, 'VJ139': 30,
- 'VJ142': 31, 'VJ143': 32, 'VJ144': 33, 'VJ1441': 34, 'VJ1443': 35, 'VJ1445': 36, 'VJ1447': 37, 'VJ145': 38, 'VJ146': 39, 'VJ147': 40,
- 'VJ148': 41, 'VJ149': 42, 'VJ1492': 43, 'VJ150': 44, 'VJ151': 45, 'VJ152': 46, 'VJ153': 47, 'VJ154': 48, 'VJ155': 49, 'VJ156': 50,
- 'VJ157': 51, 'VJ158': 52, 'VJ159': 53, 'VJ160': 54, 'VJ1602': 55, 'VJ1604': 56, 'VJ1606': 57, 'VJ1608': 58, 'VJ161': 59, 'VJ1612': 60,
- 'VJ1614': 61, 'VJ1616': 62, 'VJ1618': 63, 'VJ163': 64, 'VJ164': 65, 'VJ1643': 66, 'VJ165': 67, 'VJ166': 68, 'VJ167': 69, 'VJ169': 70,
- 'VJ171': 71, 'VJ1718': 72, 'VJ172': 73, 'VJ173': 74, 'VJ174': 75, 'VJ175': 76, 'VJ176': 77, 'VJ177': 78, 'VJ178': 79, 'VJ179': 80,
- 'VJ180': 81, 'VJ1801': 82, 'VJ1802': 83, 'VJ1803': 84, 'VJ1805': 85, 'VJ181': 86, 'VJ182': 87, 'VJ183': 88, 'VJ1831': 89, 'VJ184': 90,
- 'VJ185': 91, 'VJ186': 92, 'VJ187': 93, 'VJ188': 94, 'VJ189': 95, 'VJ190': 96, 'VJ191': 97, 'VJ192': 98, 'VJ1925': 99, 'VJ193': 100,
- 'VJ194': 101, 'VJ195': 102, 'VJ196': 103, 'VJ198': 104, 'VJ199': 105, 'VJ270': 106, 'VJ272': 107, 'VJ274': 108, 'VJ278': 109, 'VJ280': 110,
- 'VJ282': 111, 'VJ284': 112, 'VJ2841': 113, 'VJ288': 114, 'VJ320': 115, 'VJ321': 116, 'VJ322': 117, 'VJ324': 118, 'VJ325': 119, 'VJ326': 120,
- 'VJ327': 121, 'VJ328': 122, 'VJ329': 123, 'VJ330': 124, 'VJ331': 125, 'VJ343': 126, 'VJ344': 127, 'VJ345': 128, 'VJ347': 129, 'VJ3524': 130,
- 'VJ3526': 131, 'VJ381': 132, 'VJ385': 133, 'VJ387': 134, 'VJ3900': 135, 'VJ3901': 136, 'VJ3908': 137, 'VJ3909': 138, 'VJ3930': 139, 'VJ3931': 140,
- 'VJ401': 141, 'VJ402': 142, 'VJ403': 143, 'VJ404': 144, 'VJ407': 145, 'VJ408': 146, 'VJ409': 147, 'VJ410': 148, 'VJ431': 149, 'VJ433': 150,
- 'VJ441': 151, 'VJ443': 152, 'VJ445': 153, 'VJ492': 154, 'VJ494': 155, 'VJ501': 156, 'VJ502': 157, 'VJ503': 158, 'VJ504': 159, 'VJ505': 160,
- 'VJ506': 161, 'VJ507': 162, 'VJ508': 163, 'VJ509': 164, 'VJ510': 165, 'VJ511': 166, 'VJ512': 167, 'VJ513': 168, 'VJ514': 169, 'VJ515': 170,
- 'VJ516': 171, 'VJ517': 172, 'VJ518': 173, 'VJ519': 174, 'VJ520': 175, 'VJ521': 176, 'VJ522': 177, 'VJ523': 178, 'VJ524': 179, 'VJ527': 180,
- 'VJ528': 181, 'VJ600': 182, 'VJ602': 183, 'VJ620': 184, 'VJ621': 185, 'VJ622': 186, 'VJ623': 187, 'VJ624': 188, 'VJ625': 189, 'VJ626': 190,
- 'VJ627': 191, 'VJ628': 192, 'VJ629': 193, 'VJ630': 194, 'VJ631': 195, 'VJ632': 196, 'VJ633': 197, 'VJ634': 198, 'VJ635': 199, 'VJ636': 200,
- 'VJ637': 201, 'VJ638': 202, 'VJ639': 203, 'VJ640': 204, 'VJ641': 205, 'VJ642': 206, 'VJ643': 207, 'VJ644': 208, 'VJ645': 209, 'VJ646': 210,
- 'VJ647': 211, 'VJ648': 212, 'VJ649': 213, 'VJ6922': 214, 'VJ716': 215, 'VJ718': 216, 'VJ7238': 217, 'VJ7239': 218, 'VJ729': 219, 'VJ7306': 220,
- 'VJ7307': 221, 'VJ731': 222, 'VJ7526': 223, 'VJ7527': 224, 'VJ7614': 225, 'VJ770': 226, 'VJ771': 227, 'VJ772': 228, 'VJ773': 229, 'VJ774': 230,
- 'VJ775': 231, 'VJ778': 232, 'VJ779': 233, 'VJ780': 234, 'VJ781': 235, 'VJ783': 236, 'VJ784': 237, 'VJ802': 238, 'VJ8021': 239, 'VJ804': 240,
- 'VJ806': 241, 'VJ808': 242, 'VJ809': 243, 'VJ812': 244, 'VJ814': 245, 'VJ816': 246, 'VJ820': 247, 'VJ821': 248, 'VJ822': 249, 'VJ823': 250,
- 'VJ824': 251, 'VJ828': 252, 'VJ829': 253, 'VJ832': 254, 'VJ833': 255, 'VJ834': 256, 'VJ835': 257, 'VJ836': 258, 'VJ837': 259, 'VJ838': 260,
- 'VJ839': 261, 'VJ840': 262, 'VJ841': 263, 'VJ842': 264, 'VJ843': 265, 'VJ845': 266, 'VJ848': 267, 'VJ849': 268, 'VJ854': 269, 'VJ856': 270,
- 'VJ857': 271, 'VJ858': 272, 'VJ859': 273, 'VJ860': 274, 'VJ861': 275, 'VJ862': 276, 'VJ863': 277, 'VJ864': 278, 'VJ865': 279, 'VJ874': 280,
- 'VJ875': 281, 'VJ876': 282, 'VJ877': 283, 'VJ878': 284, 'VJ879': 285, 'VJ880': 286, 'VJ881': 287, 'VJ8814': 288, 'VJ883': 289, 'VJ885': 290,
- 'VJ890': 291, 'VJ892': 292, 'VJ893': 293, 'VJ894': 294, 'VJ895': 295, 'VJ896': 296, 'VJ897': 297, 'VJ898': 298, 'VJ899': 299, 'VJ900': 300,
- 'VJ905': 301, 'VJ906': 302, 'VJ907': 303, 'VJ913': 304, 'VJ916': 305, 'VJ919': 306, 'VJ920': 307, 'VJ921': 308, 'VJ928': 309, 'VJ930': 310,
- 'VJ931': 311, 'VJ932': 312, 'VJ933': 313, 'VJ934': 314, 'VJ935': 315, 'VJ938': 316, 'VJ939': 317, 'VJ940': 318, 'VJ941': 319, 'VJ942': 320,
- 'VJ943': 321, 'VJ948': 322, 'VJ959': 323, 'VJ970': 324, 'VJ971': 325, 'VJ972': 326, 'VJ974': 327, 'VJ976': 328, 'VJ978': 329, 'VJ9812': 330,
- 'VJ984': 331, 'VJ985': 332, 'VJ986': 333, 'VJ991': 334, 'VJ997': 335, 'VJ998': 336, 'VJ9986': 337, 'VZ3525': 338, 'VZ566': 339, 'VZ568': 340,
- 'VZ570': 341
- }
- # 生成各个国家(地区)的节假日
- def build_country_holidays(city_to_country):
- countries = sorted(set(city_to_country.values()))
- start_date = pd.Timestamp('2025-11-01')
- end_date = pd.Timestamp('2026-12-31')
- country_holidays = {}
- for country in countries:
- try:
- hdays = holidays.country_holidays(
- country,
- years=[2025, 2026]
- )
- # 转成 set[date],方便高速查询
- country_holidays[country] = {
- d for d in hdays
- if start_date.date() <= d <= end_date.date()
- }
- except Exception:
- # 个别国家 holidays 库可能不支持
- country_holidays[country] = set()
- return country_holidays
- # 热门的航线
- vj_flight_route_list_hot = [
- "CAN-DPS", "CAN-HAN", "CAN-SGN", "CTU-HAN", "CTU-SGN",
- "DAD-SEL", "DEL-HAN", "DPS-CAN", "HAN-CAN", "HAN-DAD",
- "HAN-SHA", "HAN-UIH", "HKG-PQC", "KUL-DAD", "NGO-HAN",
- "NHA-HAN", "NHA-SEL", "PQC-HKG", "PUS-NHA", "SEL-DAD",
- "SEL-SGN", "SGN-CAN", "SGN-DPS", "SGN-NGO", "SGN-NHA",
- "SGN-PQC", "SGN-SEL", "SGN-SHA", "SHA-HAN", "SHA-SGN",
- "SIN-DAD", "TPE-HAN", "TPE-PQC", "TPE-SGN", "TYO-HAN",
- "TYO-SGN"
- ]
- # 冷门的航线
- vj_flight_route_list_nothot = [
- "BKK-SGN", "BKK-TPE", "BLR-FUK", "BMV-HAN", "BNE-SGN",
- "CAN-PQC", "CTU-BNE", "CTU-DPS", "CTU-PQC", "DAD-DEL",
- "DAD-DLI", "DAD-HAN", "DLI-HAN", "DPS-BOM", "DPS-HAN",
- "DPS-SGN", "DPS-SHA", "FUK-DPS", "HAN-CTU",
- "HAN-DEL", "HAN-DLI", "HAN-KUL", "HAN-NGO",
- "HAN-NHA", "HAN-OSA", "HAN-PQC", "HAN-RMQ", "HAN-SGN",
- "HAN-TPE", "HAN-TYO", "HKG-SGN", "HKT-SGN", "HPH-NHA",
- "KHH-BNE", "KUL-HAN", "MEL-HKG", "MEL-HKT", "MEL-SGN",
- "MNL-SGN", "NGO-SYD", "OSA-REP", "OSA-SGN", "PQC-DAD",
- "PQC-SEL", "PQC-SGN", "SEL-NHA", "SEL-VTE", "SGN-CTU",
- "SGN-DAD", "SGN-HAN", "SGN-HKG", "SGN-HPH", "SGN-HYD",
- "SGN-MNL", "SGN-OSA", "SGN-SYD",
- "SGN-TPE", "SGN-TYO", "SHA-BKK", "SHA-BLR", "SHA-DPS",
- "SHA-PQC", "SIN-HAN", "SIN-PQC", "SIN-SGN", "SYD-SGN",
- "TYO-AMD", "UIH-SGN"
- ]
- # 所有航线
- vj_flight_route_list = vj_flight_route_list_hot + vj_flight_route_list_nothot
- if __name__ == '__main__':
- # from collections import Counter
- # # 检查重复项
- # # 统计每个航线出现的次数
- # route_counter = Counter(vj_flight_route_list)
- # # 找出重复的航线
- # duplicates = {route: count for route, count in route_counter.items() if count > 1}
- # # 输出结果
- # if duplicates:
- # print("发现重复的航线:")
- # for route, count in duplicates.items():
- # print(f" {route}: 出现 {count} 次")
- # print(f"\n总共发现 {len(duplicates)} 条重复航线")
- # # 查找这些航线分别在哪个列表中
- # print("\n重复航线分布:")
- # for route in duplicates:
- # hot_count = vj_flight_route_list_hot.count(route)
- # nothot_count = vj_flight_route_list_nothot.count(route)
- # print(f" {route}: hot列表中出现 {hot_count} 次, nothot列表中出现 {nothot_count} 次")
- # else:
- # print("没有发现重复航线")
- # COUNTRY_HOLIDAYS = build_country_holidays(city_to_country)
- # print(COUNTRY_HOLIDAYS)
-
- print(vj_city_code_map)
|