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)