File size: 2,100 Bytes
27e9c18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
from sqlalchemy import Column, String, Float, Integer, Boolean, DateTime, ForeignKey
from sqlalchemy.dialects.postgresql import UUID
from app.db.    session import Base
import uuid
from datetime import datetime

class Job(Base):
    __tablename__ = "jobs"

    id = Column(UUID(as_uuid = True), primary_key = True, default = uuid.uuid4)
    status = Column(String, default = "processing")
    filename = Column(String)
    row_count = Column(Integer)
    customer_count = Column(Integer)
    error_message = Column(String, nullable = True)
    created_at = Column(DateTime, default = datetime.utcnow)
    completed_at   = Column(DateTime, nullable=True)

class CustomerProfile(Base):
    __tablename__ = "customer_profiles"

    id = Column(UUID(as_uuid = True), primary_key = True, default = uuid.uuid4)
    job_id = Column(UUID(as_uuid = True), ForeignKey("jobs.id"))
    customer_id = Column(String)

    recency = Column(Float)
    frequency = Column(Float)
    monetary = Column(Float)
    avg_order_value = Column(Float)
    total_items = Column(Float)
    distinct_products = Column(Float)
    tenure_days = Column(Float)
    avg_items_per_order = Column(Float)

    r_score = Column(Integer)
    f_score = Column(Integer)
    m_score = Column(Integer)
    segment = Column(String)

    clv_12months = Column(Float, nullable = True)
    clv_segment = Column(String, nullable = True)
    prob_alive = Column(Float, nullable = True)
    predicted_purchases_90d = Column(Float, nullable = True)

    hvr_probability = Column(Float, nullable = True)
    hvr_potential = Column(String, nullable = True)
    
    anomaly_score = Column(Float)
    is_anomaly = Column(Boolean)
    anomaly_severity = Column(String)
    anomaly_type = Column(String)


class Insight(Base):
    __tablename__ = "insights"

    id = Column(UUID(as_uuid = True), primary_key = True, default = uuid.uuid4)
    job_id = Column(UUID(as_uuid = True), ForeignKey("jobs.id"))
    category = Column(String)
    title = Column(String)
    body = Column(String)
    priority = Column(Integer) # 1 = critical, 2 = high, 3 = medium