def score_to_hundred(self, project: scoring_base.ScoringProject) -> float: """Compute a score for the given ScoringProject.""" area_type = project.details.area_type if not area_type: raise scoring_base.NotEnoughDataException() if not project.imt_proto().yearly_avg_offers_per_10_candidates: raise scoring_base.NotEnoughDataException() num_better_departements = project.local_diagnosis( ).num_less_stressful_departements # User is already in one of the top 3 départements. if num_better_departements < 3: raise scoring_base.NotEnoughDataException() # Give a score centered around 50 corresponding to the user's mobility. # The worse the current département is, the more extreme we set the # score. score_range = min(num_better_departements * 1.5, 100) / 2 if area_type >= geo_pb2.COUNTRY: return 50 + score_range if area_type >= geo_pb2.REGION: return 50 if area_type >= geo_pb2.DEPARTEMENT: return 50 - score_range / 2 return 50 - score_range
def get_close_jobs(self, project: scoring_base.ScoringProject) \ -> reorient_to_close_pb2.ReorientCloseJobs: """Get the jobs close to a job group.""" recommended_jobs = reorient_to_close_pb2.ReorientCloseJobs() local_diagnosis = project.local_diagnosis() market_score = local_diagnosis.imt.yearly_avg_offers_per_10_candidates if not market_score: return recommended_jobs reorientation_jobs = local_diagnosis.less_stressful_job_groups close_jobs = [ job for job in reorientation_jobs if job.mobility_type == job_pb2.CLOSE ] evolution_jobs = [ job for job in reorientation_jobs if job.mobility_type == job_pb2.EVOLUTION ] database = project.database recommended_jobs.close_jobs.extend( self._convert_to_reorient_jobs(database, close_jobs, market_score, project)) recommended_jobs.evolution_jobs.extend( self._convert_to_reorient_jobs(database, evolution_jobs, market_score, project)) return recommended_jobs
def score_to_hundred(self, project: scoring_base.ScoringProject) -> float: local_diagnosis = project.local_diagnosis() offers_change = local_diagnosis.job_offers_change if local_diagnosis.num_job_offers_previous_year < 5\ and local_diagnosis.num_job_offers_last_year < 5: raise scoring_base.NotEnoughDataException() if offers_change < 0: return 0 # rescale offers: >=0 -> 50, >=10 -> 100 return offers_change * 5 + 50
def score_to_hundred(self, project: scoring_base.ScoringProject) -> float: """Compute a percentage score for the given ScoringProject.""" local_diagnosis = project.local_diagnosis() if not local_diagnosis.unemployment_duration.days: raise scoring_base.NotEnoughDataException() # Rescale unemployment_duration: 0 -> 100, >= 12 months -> 0 # As unemployment_duration has much more low values in DB, use ** .7 to have more variance # in high scores (50% -> 136 ~= median). return 100 * (1 - (local_diagnosis.unemployment_duration.days / 365)**.7)
def score_and_explain(self, project: scoring_base.ScoringProject) \ -> scoring_base.ExplainedScore: """Compute a score for the given ScoringProject.""" reasons = [] if project.details.area_type < geo_pb2.COUNTRY: return scoring_base.NULL_EXPLAINED_SCORE reasons.append( project.populate_template( project.translate_static_string( 'vous nous avez dit être prêt%eFeminine à déménager'))) local_stats = project.local_diagnosis() if local_stats.imt.yearly_avg_offers_per_10_candidates and \ local_stats.num_less_stressful_departements: reasons.append( project.translate_static_string( "il y a beaucoup plus d'offres par habitants dans d'autres villes" )) return scoring_base.ExplainedScore(2, reasons) return scoring_base.NULL_EXPLAINED_SCORE
def score_to_hundred(self, project: scoring_base.ScoringProject) -> int: bmo = project.local_diagnosis().bmo if not bmo.percent_difficult: raise scoring_base.NotEnoughDataException() return bmo.percent_difficult