Загрузка данных


import duckdb
import os
from typing import Optional
from sqlmodel import Field, SQLModel, create_engine, Session, select

# 1. ОПРЕДЕЛЕНИЕ МОДЕЛИ (согласно твоим новым заголовкам)
class JobMarket(SQLModel, table=True):
    id: Optional[int] = Field(default=None, primary_key=True)
    job_title: str
    experience_years: int
    education_level: str
    skills_count: int
    industry: str
    company_size: str
    location: str
    remote_work: str
    certifications: int
    salary: float

# Настройка базы данных SQLite
sqlite_url = "sqlite:///jobs_data.db"
engine = create_engine(sqlite_url)

def init_job_database(csv_file_path: str):
    """Парсинг новых данных через DuckDB и сохранение в SQLModel"""
    
    # Создаем таблицы
    SQLModel.metadata.create_all(engine)
    
    if not os.path.exists(csv_file_path):
        print(f"Файл {csv_file_path} не найден!")
        return

    con = duckdb.connect()
    
    print(f"Обработка рыночных данных из {csv_file_path}...")
    
    # DuckDB автоматически почистит пробелы через trim и приведет типы
    query = f"""
    SELECT 
        trim(Job_title),
        CAST(experience_years AS INTEGER),
        trim(education_level),
        CAST(skills_count AS INTEGER),
        trim(industry),
        trim(company_size),
        trim(location),
        trim(remote_work),
        CAST(certifications AS INTEGER),
        CAST(salary AS FLOAT)
    FROM read_csv_auto('{csv_file_path}')
    """
    
    try:
        raw_data = con.execute(query).fetchall()
    except Exception as e:
        print(f"Ошибка при чтении CSV: {e}")
        return

    with Session(engine) as session:
        # Проверка, чтобы не дублировать данные
        if session.exec(select(JobMarket)).first():
            print("База уже заполнена.")
            return

        for row in raw_data:
            entry = JobMarket(
                job_title=row[0],
                experience_years=row[1],
                education_level=row[2],
                skills_count=row[3],
                industry=row[4],
                company_size=row[5],
                location=row[6],
                remote_work=row[7],
                certifications=row[8],
                salary=row[9]
            )
            session.add(entry)
        
        session.commit()
        print(f"Успешно загружено {len(raw_data)} профессий.")

# 2. ПРИМЕРЫ ЗАПРОСОВ
if __name__ == "__main__":
    # Сохрани свои новые данные в файл 'jobs.csv'
    FILE_NAME = "jobs.csv" 
    
    init_job_database(FILE_NAME)
    
    print("\n--- АНАЛИЗ ДАННЫХ ---")
    with Session(engine) as session:
        # Запрос 1: Кто зарабатывает больше 100,000?
        high_salary_stmt = select(JobMarket).where(JobMarket.salary > 100000)
        high_earners = session.exec(high_salary_stmt).all()
        
        print(f"Найдено специалистов с высокой ЗП (>100k): {len(high_earners)}")
        for person in high_earners:
            print(f"• {person.job_title} в {person.location} ({person.salary})")

        # Запрос 2: Средняя зарплата для тех, у кого PhD
        phd_stmt = select(JobMarket).where(JobMarket.education_level == "PhD")
        phd_list = session.exec(phd_stmt).all()
        if phd_list:
            avg_salary = sum(p.salary for p in phd_list) / len(phd_list)
            print(f"\nСредняя зарплата специалистов с PhD: {avg_salary:.2f}")

        # Запрос 3: Поиск удаленки (Yes)
        remote_stmt = select(JobMarket).where(JobMarket.remote_work == "Yes")
        remote_jobs = session.exec(remote_stmt).all()
        print(f"\nДоступно удаленных позиций: {len(remote_jobs)}")