Understanding Climate Indexes

Climate Index estimates the overall climate desirability of a city or country. It ranges from -100 to +100, with higher values indicating more favorable climates.

Cities with a Climate Index of 100 typically have moderate temperatures, low humidity, and no extreme weather conditions that are generally considered undesirable. However, climate preferences vary—some people prefer colder weather, others enjoy warmer climates, and some are comfortable with high humidity. Therefore, this index serves as a general guideline and should not be interpreted as an absolute measure of climate quality.

How the Index is Calculated

The formulas used to calculate the Climate Index are subject to change. The current formula estimates the index based on dew point, temperature, and an estimated average high humidex (calculated using these two factors). The implementation in Java is as follows:
  public double getHumidex() {
    return temp_high_avg + 0.5555 * (6.1 * Math.exp(5417.7530 * (1 / 273.16 - 1 / (dewpoint_high_avg + 273.15))) - 10);
  }
  
  public double getRanking() {
    //first it is calculated in range [-30, 30] then multiplied 
    double base = 30;
    if (dewpoint_low_avg < 10) {
      base -= Math.pow(0.25 * (10 - dewpoint_low_avg), 1.2);
    }

    //26 Severely high. Even deadly for asthma related illnesses
    //24 Extremely uncomfortable, fairly oppressive	
    //21 Very humid, quite uncomfortable
    //18 Somewhat uncomfortable for most people at upper edge	
    if (dewpoint_high_avg > 18) {
      base -= Math.pow( (dewpoint_high_avg - 18), 1.2);  // 10^1.2 = 15.8
    }

    //http://courses.washington.edu/me333afe/Comfort_Health.pdf
    //37.7 very uncomfortable
    //32 uncomfortable
    //12 uncomfortable
    //0 very uncomfortable
    if (temp_high_avg > 31) {
      base -= Math.pow(temp_high_avg - 31, 1.5);  // 10 ^ 1.4 = 25, 10 ^ 1.5 = 31.6
    }
    
    if (temp_low_avg < 8) {
      base -= Math.pow( (8 - temp_low_avg) / 2, 1.55); // -20c, 30/2=15 , 15 ^ 1.6 = 76
    }
    
    double humidex = getHumidex();
    //humindex > 31 yellow
    //humindex > 40 orange
    //humindex > 46 red
    if (humidex > 31) {
      base -= (humidex - 31) / 4.0;
    }
    if (base < -30) {
      base = -30.0;
    }
    if (base > 30) {
      base = 30.0;
    }
    base = base * 100 / 30.0;
    return base;

Climate index formulas used in the past

Formula used before June 2017

This formula was challenged in Quora and people didn't like it because it gives scores below 0 for Bangkok and Singapore. Most people think the climate in those cities is not that bad, and that was the reason why made a new formula.
  public double getRanking() {
    //first it is calculated in range [-30, 30] then multiplied 
    double base = 30;
    if (dewpoint_low_avg < 10) {
      base -= Math.pow(0.25 * (10 - dewpoint_low_avg), 1.2);
    }

    //26 Severely high. Even deadly for asthma related illnesses
    //24 Extremely uncomfortable, fairly oppressive	
    //21 Very humid, quite uncomfortable
    //18 Somewhat uncomfortable for most people at upper edge	
    if (dewpoint_high_avg > 16) {
      base -= Math.pow(dewpoint_high_avg - 16, 1.47);  // 10^1.5 = 31.11
    }
    

    //http://courses.washington.edu/me333afe/Comfort_Health.pdf
    //37.7 very uncomfortable
    //32 uncomfortable
    //12 uncomfortable
    //0 very uncomfortable
    if (temp_high_avg > 30) {
      base -= Math.pow(temp_high_avg - 30, 1.4);  // 10 ^ 1.4 = 25.11
    }
    
    if (temp_low_avg < 5) {
      base -= Math.pow( (5 - temp_low_avg) / 2, 1.35); // 10 ^ 1.35 = 22.00
    }
    
    if (chanceofthunderday > 40) {
      base -= (chanceofthunderday - 25) / 7;
    }
    if (chanceoftornadoday > 1) {
      base -= chanceoftornadoday * 2;
    }
    if (chanceofrainday > 40) {
      base -= (chanceofrainday - 25) / 7;
    }
    if (chanceofcloudyday > 50) {
      base -= (chanceofcloudyday - 25) / 7;
    }
    if (chanceoffogday > 30) {
      base -= (chanceoffogday - 15) / 5;
    }
    if (base < -30) {
      base = -30.0;
    }
    base *= 100 / 30.0;
    return base;
  }