File size: 2,757 Bytes
87cdc48
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
64
65
66
67
68
69
# cear_model.py
import numpy as np
import pandas as pd
import json
import os # Necessary for finding the JSON file

# --- 1. Load PLATFORM_WEIGHTS variable from JSON ---
PLATFORM_WEIGHTS = {} # Default value

try:
    # Get the directory of the current script (cear_model.py)
    script_dir = os.path.dirname(os.path.abspath(__file__))
    json_path = os.path.join(script_dir, 'platform_weights.json')
    
    with open(json_path, 'r') as f:
        # Load the configuration data into the global variable
        PLATFORM_WEIGHTS = json.load(f)
        
except FileNotFoundError:
    # This warning is useful for debugging if the file is missing
    print("FATAL ERROR: platform_weights.json not found! Using empty weights.")
    # The default empty {} dict is used if the file is missing

# --- 2. Define the Model Class ---
# The class can now safely reference the global PLATFORM_WEIGHTS variable
class CEARModel:
    def __init__(self, weights=PLATFORM_WEIGHTS): 
        # The weights dictionary is passed as a default parameter
        self.weights = weights
        
    def _diminishing_returns(self, minutes):
        # ... your method code ...
        return np.log10(minutes + 1)
    def calculate_scores(self, user_input_df: pd.DataFrame):
        # 1. Merge weights with user input
        df = user_input_df.merge(
            pd.DataFrame.from_dict(self.weights, orient='index'),
            left_on='platform_name',
            right_index=True,
            how='left'
        ).fillna(0) # Fills missing weights with 0 for platforms not in list

        total_mins = df['minutes_per_week'].sum()

        # 2. Calculate Core Scores
        df['C_Contrib'] = df.apply(lambda row: row['W_C'] * self._diminishing_returns(row['minutes_per_week']), axis=1)
        df['A_Contrib'] = df.apply(lambda row: row['W_A'] * row['minutes_per_week'], axis=1)

        C_Score = df['C_Contrib'].sum()
        A_Risk = df['A_Contrib'].sum()

        # 3. Calculate D-Index (Platform Diversity)
        df['Min_Share'] = df['minutes_per_week'] / total_mins
        D_Index = 1 / (df['Min_Share']**2).sum() if total_mins > 0 else 0

        # 4. Calculate Cultural Efficiency
        df['Cultural_Efficiency'] = df['C_Contrib'] / df['minutes_per_week'].replace(0, np.nan) # Avoid div by zero

        return {
            "C_Score": C_Score,
            "A_Risk": A_Risk,
            "D_Index": D_Index,
            "Per_Platform_Efficiency": df[['platform_name', 'Cultural_Efficiency']].dropna().to_dict('records')
        }

# Example Usage:
# user_data = pd.DataFrame([{'platform_name': 'TikTok', 'minutes_per_week': 300}, ...])
# model = CEARModel()
# model.calculate_scores(user_data)