Загрузка данных
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)}")