Фух, добавил файлы по аэропртам, плюс роутеры и прочее и прочее

This commit is contained in:
maksim 2024-06-06 22:49:43 +04:00
parent b6fb5534e2
commit 092486052c
7 changed files with 142 additions and 84 deletions

View File

@ -5,6 +5,7 @@ from contextlib import asynccontextmanager
from database import create_tables, delete_tables from database import create_tables, delete_tables
from router_questions import router as questions_router from router_questions import router as questions_router
from router_class import router as class_router from router_class import router as class_router
from router_flight import router as flight_router
# Настройка логирования # Настройка логирования
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
@ -22,3 +23,5 @@ async def lifespan(app: FastAPI):
app = FastAPI(lifespan=lifespan) app = FastAPI(lifespan=lifespan)
app.include_router(questions_router) app.include_router(questions_router)
app.include_router(class_router) app.include_router(class_router)
app.include_router(flight_router)

View File

@ -1,51 +0,0 @@
import json
import pandas as pd
# JSON данные
json_data = '''
[
{ "value": "AAQ", "label": "Анапа, Витязево, AAQ", "timezone": "+3", "latitude": 45.0029, "longitude": 37.3473 },
{ "value": "ARH", "label": "Архангельск, Талаги, ARH", "timezone": "+3", "latitude": 64.6003, "longitude": 40.7168 },
{ "value": "ASF", "label": "Астрахань, им. Б.Н. Кустодиева, ASF", "timezone": "+4", "latitude": 46.2833, "longitude": 48.0063 },
{ "value": "BAX", "label": "Барнаул, Михайловка, BAX", "timezone": "+7", "latitude": 53.3638, "longitude": 83.5385 }
]
'''
data = json.loads(json_data)
# Извлекаем первое слово перед запятой и первое слово после запятой
cities_set = set()
for entry in data:
parts = entry['label'].split(',')
if len(parts) > 1:
city1 = parts[0].strip().split()[0] if parts[0].strip().split() else ''
city2 = parts[1].strip().split()[0] if parts[1].strip().split() else ''
cities_set.update([city1, city2])
# Прочитаем CSV файл
csv_file_path = 'geo-reviews-dataset-2023.csv'
df = pd.read_csv(csv_file_path)
# Функция для проверки совпадения города в адресе
def find_city(address, cities_set):
parts = address.split(',')
if len(parts) > 1:
word1 = parts[0].strip().split()[0] if parts[0].strip().split() else ''
word2 = parts[1].strip().split()[0] if parts[1].strip().split() else ''
if word1 in cities_set:
return word1
elif word2 in cities_set:
return word2
return None
# Добавим новый столбец на основе первого слова из адреса
df['city'] = df['address'].apply(lambda x: find_city(x, cities_set))
# Оставим только те строки, где город из CSV файла совпадает с городом из JSON
df_filtered = df[df['city'].notnull()]
# Сохраним отсортированный DataFrame обратно в CSV
output_file_path = 'sorted_filtered_geo-reviews-dataset-2023.csv'
df_filtered.to_csv(output_file_path, index=False)
print(df_filtered[:15])

View File

@ -1,41 +1,12 @@
from typing import Annotated from fastapi import APIRouter
from fastapi import APIRouter, Depends, HTTPException
from typing import List from typing import List
from pydantic import ValidationError
from enums import TypeMood, TypeModel
from genetic_algorithm.genetic_algorithm import genetic_algorithm, load_graph_from_request
from repository import QuestionRepository
from schemas import SQuestionAdd, SQuestion, SQuestionId, Flight, TripRequest
router = APIRouter( router = APIRouter(
prefix="/class", prefix="/class",
tags=["Class"], tags=["Class"],
) )
@router.post("/get_flight/")
async def get_flight(request: TripRequest):
graphTo, graphBack, start_point, end_point, flightsDataTo, flightsDataBack, departure_date, departure_date_return = load_graph_from_request(request)
if request.returnDate:
resultTo = genetic_algorithm(start=start_point, end=end_point, graph=graphTo, flights_data=flightsDataTo, type = "to", departure_date = departure_date)
resulFrom = genetic_algorithm(end=start_point, start=end_point, graph=graphBack, flights_data=flightsDataBack, type = "back", departure_date = departure_date_return)
if not resultTo or not resulFrom:
raise HTTPException(status_code=404, detail="No valid paths found")
return resultTo, resulFrom
if not request.returnDate:
resultTo = genetic_algorithm(start=start_point, end=end_point, graph=graphTo, flights_data=flightsDataTo,
type="to", departure_date = departure_date)
resultTo.append({
"back": []
})
if not resultTo:
raise HTTPException(status_code=404, detail="No valid paths found")
return resultTo
@router.get("/negative") @router.get("/negative")
async def get_class_names() -> List[str]: async def get_class_names() -> List[str]:
with open(".//neural_network/classification/class_names_negative.txt", "r", encoding="utf-8") as file: with open(".//neural_network/classification/class_names_negative.txt", "r", encoding="utf-8") as file:

31
router_flight.py Normal file
View File

@ -0,0 +1,31 @@
from fastapi import APIRouter, HTTPException
from genetic_algorithm.genetic_algorithm import genetic_algorithm, load_graph_from_request
from schemas import TripRequest
router = APIRouter(
prefix="/flight",
tags=["Flight"],
)
@router.post("/get/")
async def get_flight(request: TripRequest):
graphTo, graphBack, start_point, end_point, flightsDataTo, flightsDataBack, departure_date, departure_date_return = load_graph_from_request(request)
if request.returnDate:
resultTo = genetic_algorithm(start=start_point, end=end_point, graph=graphTo, flights_data=flightsDataTo, type = "to", departure_date = departure_date)
resulFrom = genetic_algorithm(end=start_point, start=end_point, graph=graphBack, flights_data=flightsDataBack, type = "back", departure_date = departure_date_return)
if not resultTo or not resulFrom:
raise HTTPException(status_code=404, detail="No valid paths found")
return resultTo, resulFrom
if not request.returnDate:
resultTo = genetic_algorithm(start=start_point, end=end_point, graph=graphTo, flights_data=flightsDataTo,
type="to", departure_date = departure_date)
if resultTo:
resultTo.append({
"back": []
})
else:
raise HTTPException(status_code=404, detail="No valid paths found")
return resultTo

View File

@ -11,7 +11,7 @@ router = APIRouter(
tags=["Questions"], tags=["Questions"],
) )
@router.post("") @router.post("/add")
async def add_question( async def add_question(
question: Annotated[SQuestionAdd, Depends()], question: Annotated[SQuestionAdd, Depends()],
type_mood: TypeMood, # Добавлен параметр type_mood type_mood: TypeMood, # Добавлен параметр type_mood
@ -20,13 +20,13 @@ async def add_question(
question_id, answer = await QuestionRepository.add_one(question, type_mood, type_model) # Передача параметров type_mood и type_model question_id, answer = await QuestionRepository.add_one(question, type_mood, type_model) # Передача параметров type_mood и type_model
return {"question_id": question_id, "answer": answer} return {"question_id": question_id, "answer": answer}
@router.get("") @router.get("/get_all")
async def get_questions() -> list[SQuestion]: async def get_questions() -> list[SQuestion]:
questions = await QuestionRepository.find_all() questions = await QuestionRepository.find_all()
return questions return questions
@router.get("/{email_user}") @router.get("/get/{email_user}")
async def get_questions_by_email(email_user: str) -> list[SQuestion]: async def get_questions_by_email(email_user: str) -> list[SQuestion]:
questions = await QuestionRepository.find_by_email(email_user) questions = await QuestionRepository.find_by_email(email_user)
return questions return questions

51
sity/airports.json Normal file
View File

@ -0,0 +1,51 @@
[
{ "value": "ABA", "label": "Абакан, Абакан, ABA", "timezone": "+7", "latitude": 53.7400, "longitude": 91.3850 },
{ "value": "AAQ", "label": "Анапа, Витязево, AAQ", "timezone": "+3", "latitude": 45.0029, "longitude": 37.3473 },
{ "value": "ARH", "label": "Архангельск, Талаги, ARH", "timezone": "+3", "latitude": 64.6003, "longitude": 40.7168 },
{ "value": "ASF", "label": "Астрахань, им. Б.Н. Кустодиева, ASF", "timezone": "+4", "latitude": 46.2833, "longitude": 48.0063 },
{ "value": "BAX", "label": "Барнаул, Михайловка, BAX", "timezone": "+7", "latitude": 53.3638, "longitude": 83.5385 },
{ "value": "EGO", "label": "Белгород, им. В.Г. Шухова, EGO", "timezone": "+3", "latitude": 50.6439, "longitude": 36.5901 },
{ "value": "BQS", "label": "Благовещенск, Игнатьево, BQS", "timezone": "+9", "latitude": 50.4250, "longitude": 127.4125 },
{ "value": "BTK", "label": "Братск, Братск, BTK", "timezone": "+8", "latitude": 56.3706, "longitude": 101.6983 },
{ "value": "BZK", "label": "Брянск, Брянск, BZK", "timezone": "+3", "latitude": 53.2142, "longitude": 34.1769 },
{ "value": "VVO", "label": "Владивосток, Кневичи, VVO", "timezone": "+10", "latitude": 43.3989, "longitude": 132.1478 },
{ "value": "VOZ", "label": "Воронеж, Чертовицкое, VOZ", "timezone": "+3", "latitude": 51.8142, "longitude": 39.2296 },
{ "value": "YKS", "label": "Якутск, Якутск, YKS", "timezone": "+9", "latitude": 62.0933, "longitude": 129.7708 },
{ "value": "SVX", "label": "Екатеринбург, Кольцово, SVX", "timezone": "+5", "latitude": 56.7431, "longitude": 60.8027 },
{ "value": "KZN", "label": "Казань, Казань, KZN", "timezone": "+3", "latitude": 55.6062, "longitude": 49.2787 },
{ "value": "KUF", "label": "Самара, Курумоч, KUF", "timezone": "+4", "latitude": 53.5049, "longitude": 50.1643 },
{ "value": "IKT", "label": "Иркутск, Иркутск, IKT", "timezone": "+8", "latitude": 52.2680, "longitude": 104.3880 },
{ "value": "KGD", "label": "Калининград, Храброво, KGD", "timezone": "+2", "latitude": 54.8900, "longitude": 20.5926 },
{ "value": "KEJ", "label": "Кемерово, Кемерово, KEJ", "timezone": "+7", "latitude": 55.2700, "longitude": 86.1072 },
{ "value": "KRR", "label": "Краснодар, Пашковский, KRR", "timezone": "+3", "latitude": 45.0347, "longitude": 39.1705 },
{ "value": "KJA", "label": "Красноярск, Емельяново, KJA", "timezone": "+7", "latitude": 56.1729, "longitude": 92.4933 },
{ "value": "MCX", "label": "Махачкала, Уйташ, MCX", "timezone": "+3", "latitude": 42.8168, "longitude": 47.6523 },
{ "value": "MRV", "label": "Минеральные Воды, Минеральные Воды, MRV", "timezone": "+3", "latitude": 44.2251, "longitude": 43.0819 },
{ "value": "NBC", "label": "Набережные Челны, Бегишево, NBC", "timezone": "+3", "latitude": 55.5647, "longitude": 52.0938 },
{ "value": "NNM", "label": "Нарьян-Мар, Нарьян-Мар, NNM", "timezone": "+3", "latitude": 67.6392, "longitude": 53.1219 },
{ "value": "NJC", "label": "Нижневартовск, Нижневартовск, NJC", "timezone": "+5", "latitude": 60.9493, "longitude": 76.4836 },
{ "value": "GOJ", "label": "Нижний Новгород, Стригино, GOJ", "timezone": "+3", "latitude": 56.2301, "longitude": 43.7840 },
{ "value": "NOJ", "label": "Ноябрьск, Ноябрьск, NOJ", "timezone": "+5", "latitude": 63.1101, "longitude": 75.1624 },
{ "value": "NSK", "label": "Норильск, Алыкель, NSK", "timezone": "+7", "latitude": 69.3111, "longitude": 87.3322 },
{ "value": "OMS", "label": "Омск, Центральный, OMS", "timezone": "+6", "latitude": 54.9660, "longitude": 73.3105 },
{ "value": "REN", "label": "Оренбург, Оренбург, REN", "timezone": "+5", "latitude": 51.7958, "longitude": 55.4567 },
{ "value": "OSW", "label": "Орск, Орск, OSW", "timezone": "+5", "latitude": 51.0725, "longitude": 58.5956 },
{ "value": "PEE", "label": "Пермь, Большое Савино, PEE", "timezone": "+5", "latitude": 57.9145, "longitude": 56.0212 },
{ "value": "PKC", "label": "Петропавловск-Камчатский, Елизово, PKC", "timezone": "+12", "latitude": 53.1679, "longitude": 158.4536 },
{ "value": "PES", "label": "Петрозаводск, Бесовец, PES", "timezone": "+3", "latitude": 61.8852, "longitude": 34.1547 },
{ "value": "PYJ", "label": "Полярный, Полярный, PYJ", "timezone": "+9", "latitude": 66.4000, "longitude": 112.0333 },
{ "value": "ROV", "label": "Ростов-на-Дону, Платов, ROV", "timezone": "+3", "latitude": 47.4939, "longitude": 39.9242 },
{ "value": "RTW", "label": "Саратов, Гагарин, RTW", "timezone": "+4", "latitude": 51.5643, "longitude": 46.0468 },
{ "value": "AER", "label": "Сочи, Адлер, AER", "timezone": "+3", "latitude": 43.4499, "longitude": 39.9566 },
{ "value": "SGC", "label": "Сургут, Сургут, SGC", "timezone": "+5", "latitude": 61.3437, "longitude": 73.4010 },
{ "value": "THX", "label": "Тюмень, Рощино, THX", "timezone": "+5", "latitude": 57.1896, "longitude": 65.3243 },
{ "value": "UFA", "label": "Уфа, Уфа, UFA", "timezone": "+5", "latitude": 54.5575, "longitude": 55.8744 },
{ "value": "UCT", "label": "Ухта, Ухта, UCT", "timezone": "+4", "latitude": 63.5668, "longitude": 53.8047 },
{ "value": "ULY", "label": "Ульяновск, Баратаевка, ULY", "timezone": "+4", "latitude": 54.2683, "longitude": 48.2269 },
{ "value": "VOG", "label": "Волгоград, Гумрак, VOG", "timezone": "+3", "latitude": 48.7825, "longitude": 44.3456 },
{ "value": "VKO", "label": "Москва, Внуково, VKO", "timezone": "+3", "latitude": 55.5915, "longitude": 37.2615 },
{ "value": "SVO", "label": "Москва, Шереметьево, SVO", "timezone": "+3", "latitude": 55.9726, "longitude": 37.4146 },
{ "value": "DME", "label": "Москва, Домодедово, DME", "timezone": "+3", "latitude": 55.4103, "longitude": 37.9021 },
{ "value": "LED", "label": "Санкт-Петербург, Пулково, LED", "timezone": "+3", "latitude": 59.8003, "longitude": 30.2625 },
{ "value": "CEK", "label": "Челябинск, Баландино, CEK", "timezone": "+5", "latitude": 55.3058, "longitude": 61.5033 }
]

53
sity/conversion.py Normal file
View File

@ -0,0 +1,53 @@
import json
import pandas as pd
class CityFilter:
def __init__(self, json_file_path):
self.json_file_path = json_file_path
self.cities_set = self.load_and_extract_cities()
def load_and_extract_cities(self):
data = self.load_json(self.json_file_path)
cities_set = set()
for entry in data:
parts = entry['label'].split(',')
if len(parts) > 1:
city1 = parts[0].strip().split()[0] if parts[0].strip().split() else ''
city2 = parts[1].strip().split()[0] if parts[1].strip().split() else ''
cities_set.update([city1, city2])
return cities_set
@staticmethod
def load_json(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
data = json.load(file)
return data
@staticmethod
def find_city(address, cities_set):
parts = address.split(',')
for part in parts:
words = part.strip().split()
for word in words:
if word in cities_set:
return word
return None
def filter_cities_in_csv(self, csv_file_path, output_path):
df = pd.read_csv(csv_file_path)
df['city'] = df['address'].apply(lambda x: self.find_city(x, self.cities_set))
df = df[df['city'].notnull()]
df.to_csv(output_path, index=False)
print(f"Filtered entries:\n{df.head(15)}")
# Пример использования класса
json_file_path = 'airports.json'
csv_file_path_positive = '../neural_network/dataset/filtered/filtered_dataset_positive.csv'
csv_file_path_negative = '../neural_network/dataset/filtered/filtered_dataset_negative.csv'
positive_output_path_negative = '../sity/sity_negative.csv'
negative_output_path_positive = '../sity/sity_positive.csv'
city_filter = CityFilter(json_file_path)
city_filter.filter_cities_in_csv(csv_file_path_positive, negative_output_path_positive)
city_filter.filter_cities_in_csv(csv_file_path_negative, positive_output_path_negative)