finish up adding socio economic disag filter

This commit is contained in:
rebuilt 2025-06-25 17:12:20 -07:00
parent a258b32b39
commit cab0a3955e
11 changed files with 139 additions and 12 deletions

View file

@ -17,7 +17,7 @@ class Benefit < ApplicationRecord
puts "************************************"
puts "******** ERROR **********"
puts ""
puts "Error parsing Income column. '#{benefits}' is not a known value. Halting execution"
puts "Error parsing benefits column. '#{benefits}' is not a known value. Halting execution"
puts ""
puts "************************************"
exit

View file

@ -27,7 +27,7 @@ class Education < ApplicationRecord
puts "************************************"
puts "******** ERROR **********"
puts ""
puts "Error parsing Income column. '#{education}' is not a known value. Halting execution"
puts "Error parsing Education column. '#{education}' is not a known value. Halting execution"
puts ""
puts "************************************"
exit

View file

@ -5,23 +5,23 @@ class Employment < ApplicationRecord
return "Unknown" if employment.blank? or employment.nil?
case employment
in /^1$/i
in /^1$|^1100$/i
"Two adults with full-time employment"
in /^2$/i
in /^2$|^2100$/i
"One adult with full-time employment"
in /^3$/i
in /^3$|^3100$/i
"Two adults with part-time employment"
in /^4$/i
in /^4$|^4100$/i
"One adult with part-time employment"
in /^5$/i
in /^5$|^5100$/i
"No full-time or part-time employment"
in /^99$|^100$/i
in /^99$|^100$|^99100$/i
"Unknown"
else
puts "************************************"
puts "******** ERROR **********"
puts ""
puts "Error parsing Income column. '#{employment}' is not a known value. Halting execution"
puts "Error parsing Employment column. '#{employment}' is not a known value. Halting execution"
puts ""
puts "************************************"
exit

View file

@ -75,6 +75,10 @@ class SurveyItemResponse < ActiveRecord::Base
SurveyItemResponse.joins([parent: :languages]).where(languages: { designation: designations }, survey_item: survey_items, school:, academic_year:).group(:survey_item).average(:likert_score)
}
scope :averages_for_socio_economic_status, lambda { |survey_items, school, academic_year, socio_economic_status|
SurveyItemResponse.joins(:parent).where(parent: { socio_economic_status: }, survey_item: survey_items, school:, academic_year:).group(:survey_item).average(:likert_score)
}
def self.grouped_responses(school:, academic_year:)
@grouped_responses ||= Hash.new do |memo, (school, academic_year)|
memo[[school, academic_year]] =

View file

@ -0,0 +1,39 @@
# frozen_string_literal: true
module Analyze
module Graph
module Column
module Parent
class SocioEconomicStatus < Base
attr_reader :socio_economic_status, :label
def initialize(socio_economic_status:, label:, show_irrelevancy_message:)
@socio_economic_status = socio_economic_status
@label = label
@show_irrelevancy_message = show_irrelevancy_message
end
def n_size(construct:, school:, academic_year:)
SurveyItemResponse.joins(:parent).where(parent: { socio_economic_status: }, survey_item: construct.parent_survey_items, school:, academic_year:).select(:parent_id).distinct.count
end
def score(construct:, school:, academic_year:)
return Score::NIL_SCORE if n_size(construct:, school:, academic_year:) < 10
averages = SurveyItemResponse.averages_for_socio_economic_status(construct.parent_survey_items, school, academic_year,
socio_economic_status)
average = bubble_up_averages(construct:, averages:).round(2)
Score.new(average:,
meets_teacher_threshold: false,
meets_student_threshold: true,
meets_admin_data_threshold: false)
end
def designations
language.map(&:designation)
end
end
end
end
end
end

View file

@ -0,0 +1,38 @@
# frozen_string_literal: true
module Analyze
module Graph
class ParentsBySocioEconomicStatus
def to_s
"Parents by Socio-Economic Status"
end
def slug
"parents-by-socio-economic-status"
end
def columns
[].tap do |array|
array << Analyze::Graph::Column::Parent::SocioEconomicStatus.new(socio_economic_status: 0, label: ["No Advantage"], show_irrelevancy_message: false)
array << Analyze::Graph::Column::Parent::SocioEconomicStatus.new(socio_economic_status: 1, label: ["Low Advantage"], show_irrelevancy_message: false)
array << Analyze::Graph::Column::Parent::SocioEconomicStatus.new(socio_economic_status: 2, label: ["Mediumn Advantage"], show_irrelevancy_message: false)
array << Analyze::Graph::Column::Parent::SocioEconomicStatus.new(socio_economic_status: 3, label: ["High Advantage"], show_irrelevancy_message: false)
array << Analyze::Graph::Column::Parent::SocioEconomicStatus.new(socio_economic_status: [0, 1, 2, 3, nil], label: ["All Students"], show_irrelevancy_message: true)
end
end
def source
Analyze::Source::SurveyData.new(slices: nil, graph: self)
end
def slice
Analyze::Slice::ParentsByGroup.new(graph: self)
end
def group
Analyze::Group::Base.new(name: "Parents By Socio-Economic Status", slug: "parents-by-socio-economic-status", graph: self)
end
end
end
end

View file

@ -167,7 +167,8 @@ module Analyze
"students-by-ell" => Analyze::Graph::StudentsByEll.new(ells: selected_ells),
"parents-by-race" => Analyze::Graph::ParentsByRace.new,
"parents-by-language" => Analyze::Graph::ParentsByLanguage.new,
"parents-by-gender" => Analyze::Graph::ParentsByGender.new }
"parents-by-gender" => Analyze::Graph::ParentsByGender.new,
"parents-by-socio-economic-status" => Analyze::Graph::ParentsBySocioEconomicStatus.new }
end
# The last item will per slice type will be selected as the default slice
@ -185,7 +186,9 @@ module Analyze
"students-by-ell" => nil,
"parents-by-race" => Analyze::Graph::ParentsByRace.new,
"parents-by-language" => Analyze::Graph::ParentsByLanguage.new,
"parents-by-gender" => Analyze::Graph::ParentsByGender.new }
"parents-by-gender" => Analyze::Graph::ParentsByGender.new,
"parents-by-socio-economic-status" => Analyze::Graph::ParentsBySocioEconomicStatus.new }
end
def graphs

View file

@ -52,6 +52,13 @@ class SurveyResponsesDataLoader
SurveyItemResponse.import(survey_item_responses.compact.flatten, batch_size:, on_duplicate_key_update: :all)
end
def socio_economic_score(education, benefits, employment)
employment_points = employment.map(&:points).sum.clamp(0, 1)
ed_points = education&.points || 0
benefits_points = benefits&.points || 0
ed_points + benefits_points + employment_points
end
private
def schools
@ -141,7 +148,9 @@ class SurveyResponsesDataLoader
tmp_employments = row.employments.map { |employment| employments[employment] }.reject(&:nil?)
parent.employments.concat(tmp_employments)
parent.socio_economic_status = socio_economic_score(educations[row.education], benefits[row.benefits], tmp_employments)
parent.housing = housings[row.housing] if row.housing.present?
parent.save
end