config.py 10 KB

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