Проект аудита отелей: основные скрипты и документация

- Краулеры: smart_crawler.py, regional_crawler.py
- Аудит: audit_orel_to_excel.py, audit_chukotka_to_excel.py
- РКН проверка: check_rkn_registry.py, recheck_unclear_rkn.py
- Отчёты: create_orel_horizontal_report.py
- Обработка: process_all_hotels_embeddings.py
- Документация: README.md, DB_SCHEMA_REFERENCE.md
This commit is contained in:
Фёдор
2025-10-16 10:52:09 +03:00
parent 545e199389
commit 0cf3297290
105 changed files with 28743 additions and 0 deletions

83
check_audit_readiness.py Executable file
View File

@@ -0,0 +1,83 @@
#!/usr/bin/env python3
"""
Скрипт для подсчёта отелей, готовых к аудиту
"""
import psycopg2
from psycopg2.extras import RealDictCursor
from urllib.parse import unquote
DB_CONFIG = {
'host': '147.45.189.234',
'port': 5432,
'database': 'default_db',
'user': 'gen_user',
'password': unquote('2~~9_%5EkVsU%3F2%5CS')
}
def main():
conn = psycopg2.connect(**DB_CONFIG)
cur = conn.cursor(cursor_factory=RealDictCursor)
print("📊 ГОТОВНОСТЬ ОТЕЛЕЙ К АУДИТУ\n" + "="*60)
# 1. Сколько отелей с chunks
cur.execute("""
SELECT COUNT(DISTINCT metadata->>'hotel_id') AS count
FROM hotel_website_chunks
WHERE metadata->>'hotel_id' IS NOT NULL
""")
hotels_with_chunks = cur.fetchone()['count']
# 2. Общее количество chunks
cur.execute("SELECT COUNT(*) AS count FROM hotel_website_chunks")
total_chunks = cur.fetchone()['count']
# 3. Средний размер chunks на отель
cur.execute("""
SELECT
ROUND(AVG(chunk_count), 0) AS avg_chunks
FROM (
SELECT COUNT(*) AS chunk_count
FROM hotel_website_chunks
WHERE metadata->>'hotel_id' IS NOT NULL
GROUP BY metadata->>'hotel_id'
) sub
""")
avg_chunks = cur.fetchone()['avg_chunks'] or 0
# 4. Топ-10 регионов по готовности
cur.execute("""
SELECT
h.region_name,
COUNT(DISTINCT hwc.metadata->>'hotel_id') AS hotels_ready,
COUNT(DISTINCT h.id) AS total_hotels,
ROUND(100.0 * COUNT(DISTINCT hwc.metadata->>'hotel_id') / COUNT(DISTINCT h.id), 1) AS percentage
FROM hotel_main h
LEFT JOIN hotel_website_chunks hwc ON hwc.metadata->>'hotel_id' = h.id::text
WHERE h.region_name IS NOT NULL
GROUP BY h.region_name
HAVING COUNT(DISTINCT hwc.metadata->>'hotel_id') > 0
ORDER BY hotels_ready DESC
LIMIT 10
""")
top_regions = cur.fetchall()
print(f"✅ Отелей с chunks (готовы к аудиту): {hotels_with_chunks:,}")
print(f"📦 Всего chunks в базе: {total_chunks:,}")
print(f"📊 Среднее chunks на отель: {avg_chunks}")
print(f"\n⏱️ ПРОГНОЗ ВРЕМЕНИ АУДИТА:")
print(f" • При 42 сек/отель: {hotels_with_chunks * 42 / 3600:.1f} часов ({hotels_with_chunks * 42 / 86400:.1f} дней)")
print(f" • При 20 сек/отель: {hotels_with_chunks * 20 / 3600:.1f} часов ({hotels_with_chunks * 20 / 86400:.1f} дней)")
print(f" • При 10 сек/отель: {hotels_with_chunks * 10 / 3600:.1f} часов ({hotels_with_chunks * 10 / 86400:.1f} дней)")
print(f"\n🏆 ТОП-10 РЕГИОНОВ ПО ГОТОВНОСТИ:\n{'-'*60}")
for region in top_regions:
print(f"{region['region']:<30} {region['hotels_ready']:>5} отелей ({region['percentage']:>5}%)")
cur.close()
conn.close()
if __name__ == '__main__':
main()