cryogenic22's picture
Update utils/analytics.py
4c11d71 verified
# utils/analytics.py
import streamlit as st
import pandas as pd
import sqlite3
from typing import Dict, List
from datetime import datetime, timedelta
import plotly.express as px
import plotly.graph_objects as go
from utils.database import conn_lock
def get_collection_analytics(conn: sqlite3.Connection) -> Dict:
"""Get analytics for collections and documents."""
analytics = {}
# Most used collections
cursor = conn.cursor()
cursor.execute("""
SELECT
c.name,
COUNT(DISTINCT cm.chat_id) as usage_count
FROM collections c
LEFT JOIN chats ch ON c.id = ch.collection_id
LEFT JOIN chat_messages cm ON ch.id = cm.chat_id
GROUP BY c.id
ORDER BY usage_count DESC
LIMIT 5
""")
analytics['top_collections'] = cursor.fetchall()
# Most viewed documents
cursor.execute("""
SELECT
d.name,
COUNT(q.id) as query_count
FROM documents d
LEFT JOIN queries q ON d.id = q.document_id
GROUP BY d.id
ORDER BY query_count DESC
LIMIT 5
""")
analytics['top_documents'] = cursor.fetchall()
# Recent questions
cursor.execute("""
SELECT DISTINCT query
FROM queries
ORDER BY query_date DESC
LIMIT 5
""")
analytics['recent_questions'] = cursor.fetchall()
return analytics
def display_analytics_dashboard():
"""Display analytics dashboard."""
st.markdown("### 📊 Analytics Dashboard")
analytics = get_collection_analytics(st.session_state.db_conn)
col1, col2, col3 = st.columns(3)
with col1:
st.markdown("#### Top Collections")
if analytics['top_collections']:
chart_data = pd.DataFrame(
analytics['top_collections'],
columns=['Collection', 'Usage']
)
st.bar_chart(chart_data.set_index('Collection'))
with col2:
st.markdown("#### Most Viewed Documents")
if analytics['top_documents']:
for doc in analytics['top_documents']:
st.metric(doc[0], f"{doc[1]} views")
with col3:
st.markdown("#### Recent Questions")
if analytics['recent_questions']:
for question in analytics['recent_questions']:
st.write(f"• {question[0]}")