Files changed (1) hide show
  1. app.py +19 -13
app.py CHANGED
@@ -9,8 +9,9 @@ citizen_data = pd.read_csv("citizen_data_50000.csv")
9
  services_data = pd.read_csv("citizen_services_50000.csv")
10
  merged_data = pd.merge(citizen_data, services_data, on="citizen_id")
11
 
12
- # Encode categorical features
13
- categorical_cols = ['gender', 'education', 'marital_status', 'social_category']
 
14
  encoders = {}
15
  for col in categorical_cols:
16
  le = LabelEncoder()
@@ -21,17 +22,17 @@ for col in categorical_cols:
21
  scaler = StandardScaler()
22
  merged_data[['age', 'annual_income']] = scaler.fit_transform(merged_data[['age', 'annual_income']])
23
 
24
- # Define feature columns (location removed)
25
  feature_cols = ['age', 'gender', 'education', 'marital_status', 'social_category',
26
- 'annual_income']
27
  features_matrix = merged_data[feature_cols].values
28
 
29
  # Train KNN model
30
  knn = NearestNeighbors(n_neighbors=10, metric='cosine')
31
  knn.fit(features_matrix)
32
 
33
- # Recommendation function with weighted scoring
34
- def recommend(age, gender, education, marital, social, income, occupation):
35
  input_data = {
36
  'age': [age],
37
  'gender': [encoders['gender'].transform([gender])[0]],
@@ -39,11 +40,13 @@ def recommend(age, gender, education, marital, social, income, occupation):
39
  'marital_status': [encoders['marital_status'].transform([marital])[0]],
40
  'social_category': [encoders['social_category'].transform([social])[0]],
41
  'annual_income': [income],
42
- # 'occupation': [encoders['occupation'].transform([occupation])[0]]
 
 
43
  }
44
  input_vector = pd.DataFrame(input_data)
45
 
46
- # Normalize numeric
47
  input_vector[['age', 'annual_income']] = scaler.transform(input_vector[['age', 'annual_income']])
48
 
49
  # Get neighbors and calculate weighted similarity
@@ -60,7 +63,7 @@ def recommend(age, gender, education, marital, social, income, occupation):
60
  recommended_services = top_users[service_cols].sum().sort_values(ascending=False).head(5)
61
  return [f"{service} βœ…" for service in recommended_services.index]
62
 
63
- # Gradio UI
64
  iface = gr.Interface(
65
  fn=recommend,
66
  inputs=[
@@ -69,11 +72,14 @@ iface = gr.Interface(
69
  gr.Dropdown(encoders['education'].classes_.tolist(), label="Education Level"),
70
  gr.Dropdown(encoders['marital_status'].classes_.tolist(), label="Marital Status"),
71
  gr.Dropdown(encoders['social_category'].classes_.tolist(), label="Social Category"),
72
- gr.Slider(0, 2000000, value=300000, step=10000, label="Annual Income")
 
 
 
73
  ],
74
  outputs=gr.List(label="Top 5 Recommended Services"),
75
- title="🧠 Citizen Service Recommender ",
76
- description="Get recommended services based on citizens similar to you β€” without using location info.",
77
  )
78
 
79
- iface.launch()
 
9
  services_data = pd.read_csv("citizen_services_50000.csv")
10
  merged_data = pd.merge(citizen_data, services_data, on="citizen_id")
11
 
12
+ # Encode categorical features including location
13
+ categorical_cols = ['gender', 'education', 'marital_status', 'social_category',
14
+ 'village', 'block', 'district']
15
  encoders = {}
16
  for col in categorical_cols:
17
  le = LabelEncoder()
 
22
  scaler = StandardScaler()
23
  merged_data[['age', 'annual_income']] = scaler.fit_transform(merged_data[['age', 'annual_income']])
24
 
25
+ # Define feature columns including location
26
  feature_cols = ['age', 'gender', 'education', 'marital_status', 'social_category',
27
+ 'annual_income', 'village', 'block', 'district']
28
  features_matrix = merged_data[feature_cols].values
29
 
30
  # Train KNN model
31
  knn = NearestNeighbors(n_neighbors=10, metric='cosine')
32
  knn.fit(features_matrix)
33
 
34
+ # Recommendation function with location
35
+ def recommend(age, gender, education, marital, social, income, village, block, district):
36
  input_data = {
37
  'age': [age],
38
  'gender': [encoders['gender'].transform([gender])[0]],
 
40
  'marital_status': [encoders['marital_status'].transform([marital])[0]],
41
  'social_category': [encoders['social_category'].transform([social])[0]],
42
  'annual_income': [income],
43
+ 'village': [encoders['village'].transform([village])[0]],
44
+ 'block': [encoders['block'].transform([block])[0]],
45
+ 'district': [encoders['district'].transform([district])[0]],
46
  }
47
  input_vector = pd.DataFrame(input_data)
48
 
49
+ # Normalize numeric columns
50
  input_vector[['age', 'annual_income']] = scaler.transform(input_vector[['age', 'annual_income']])
51
 
52
  # Get neighbors and calculate weighted similarity
 
63
  recommended_services = top_users[service_cols].sum().sort_values(ascending=False).head(5)
64
  return [f"{service} βœ…" for service in recommended_services.index]
65
 
66
+ # Gradio UI with location inputs
67
  iface = gr.Interface(
68
  fn=recommend,
69
  inputs=[
 
72
  gr.Dropdown(encoders['education'].classes_.tolist(), label="Education Level"),
73
  gr.Dropdown(encoders['marital_status'].classes_.tolist(), label="Marital Status"),
74
  gr.Dropdown(encoders['social_category'].classes_.tolist(), label="Social Category"),
75
+ gr.Slider(0, 2000000, value=300000, step=10000, label="Annual Income"),
76
+ gr.Dropdown(encoders['village'].classes_.tolist(), label="Village"),
77
+ gr.Dropdown(encoders['block'].classes_.tolist(), label="Block"),
78
+ gr.Dropdown(encoders['district'].classes_.tolist(), label="District"),
79
  ],
80
  outputs=gr.List(label="Top 5 Recommended Services"),
81
+ title="🧠 Citizen Service Recommender",
82
+ description="Get recommended services based on citizens similar to you β€” using your demographic and location data.",
83
  )
84
 
85
+ iface.launch()