Upload 31 files
Browse files- data/climate_data.py +233 -0
data/climate_data.py
CHANGED
|
@@ -70,6 +70,239 @@ class ClimateData:
|
|
| 70 |
self.countries = sorted(list(set(loc.country for loc in self.locations.values())))
|
| 71 |
self.country_states = self._group_locations_by_country_state()
|
| 72 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 73 |
def _load_climate_locations(self) -> Dict[str, ClimateLocation]:
|
| 74 |
"""
|
| 75 |
Load climate location data.
|
|
|
|
| 70 |
self.countries = sorted(list(set(loc.country for loc in self.locations.values())))
|
| 71 |
self.country_states = self._group_locations_by_country_state()
|
| 72 |
|
| 73 |
+
@staticmethod
|
| 74 |
+
def get_design_conditions(climate_zone: str) -> Dict[str, Dict[str, float]]:
|
| 75 |
+
"""
|
| 76 |
+
Get design conditions for a specific climate zone.
|
| 77 |
+
|
| 78 |
+
Args:
|
| 79 |
+
climate_zone: ASHRAE climate zone (e.g., '1A', '3B', '5A')
|
| 80 |
+
|
| 81 |
+
Returns:
|
| 82 |
+
Dictionary with summer and winter design conditions
|
| 83 |
+
"""
|
| 84 |
+
# Default design conditions by climate zone
|
| 85 |
+
design_conditions_by_zone = {
|
| 86 |
+
# Hot-Humid
|
| 87 |
+
"1A": {
|
| 88 |
+
"summer": {"db": 35.0, "wb": 28.0, "dp": 25.5},
|
| 89 |
+
"winter": {"db": 12.0, "rh": 80.0}
|
| 90 |
+
},
|
| 91 |
+
# Hot-Dry
|
| 92 |
+
"1B": {
|
| 93 |
+
"summer": {"db": 42.0, "wb": 24.0, "dp": 18.0},
|
| 94 |
+
"winter": {"db": 10.0, "rh": 40.0}
|
| 95 |
+
},
|
| 96 |
+
# Hot-Humid
|
| 97 |
+
"2A": {
|
| 98 |
+
"summer": {"db": 34.0, "wb": 26.5, "dp": 24.0},
|
| 99 |
+
"winter": {"db": 8.0, "rh": 75.0}
|
| 100 |
+
},
|
| 101 |
+
# Hot-Dry
|
| 102 |
+
"2B": {
|
| 103 |
+
"summer": {"db": 40.0, "wb": 23.0, "dp": 16.5},
|
| 104 |
+
"winter": {"db": 6.0, "rh": 45.0}
|
| 105 |
+
},
|
| 106 |
+
# Warm-Humid
|
| 107 |
+
"3A": {
|
| 108 |
+
"summer": {"db": 33.0, "wb": 25.0, "dp": 22.5},
|
| 109 |
+
"winter": {"db": 2.0, "rh": 70.0}
|
| 110 |
+
},
|
| 111 |
+
# Warm-Dry
|
| 112 |
+
"3B": {
|
| 113 |
+
"summer": {"db": 38.0, "wb": 22.0, "dp": 15.0},
|
| 114 |
+
"winter": {"db": 4.0, "rh": 40.0}
|
| 115 |
+
},
|
| 116 |
+
# Warm-Marine
|
| 117 |
+
"3C": {
|
| 118 |
+
"summer": {"db": 28.0, "wb": 20.0, "dp": 17.0},
|
| 119 |
+
"winter": {"db": 5.0, "rh": 80.0}
|
| 120 |
+
},
|
| 121 |
+
# Mixed-Humid
|
| 122 |
+
"4A": {
|
| 123 |
+
"summer": {"db": 32.0, "wb": 24.0, "dp": 21.0},
|
| 124 |
+
"winter": {"db": -5.0, "rh": 70.0}
|
| 125 |
+
},
|
| 126 |
+
# Mixed-Dry
|
| 127 |
+
"4B": {
|
| 128 |
+
"summer": {"db": 35.0, "wb": 20.0, "dp": 13.0},
|
| 129 |
+
"winter": {"db": -3.0, "rh": 45.0}
|
| 130 |
+
},
|
| 131 |
+
# Mixed-Marine
|
| 132 |
+
"4C": {
|
| 133 |
+
"summer": {"db": 27.0, "wb": 19.0, "dp": 16.0},
|
| 134 |
+
"winter": {"db": -2.0, "rh": 80.0}
|
| 135 |
+
},
|
| 136 |
+
# Cool-Humid
|
| 137 |
+
"5A": {
|
| 138 |
+
"summer": {"db": 31.0, "wb": 23.0, "dp": 20.0},
|
| 139 |
+
"winter": {"db": -15.0, "rh": 70.0}
|
| 140 |
+
},
|
| 141 |
+
# Cool-Dry
|
| 142 |
+
"5B": {
|
| 143 |
+
"summer": {"db": 33.0, "wb": 18.0, "dp": 11.0},
|
| 144 |
+
"winter": {"db": -10.0, "rh": 45.0}
|
| 145 |
+
},
|
| 146 |
+
# Cool-Marine
|
| 147 |
+
"5C": {
|
| 148 |
+
"summer": {"db": 25.0, "wb": 18.0, "dp": 15.0},
|
| 149 |
+
"winter": {"db": -5.0, "rh": 80.0}
|
| 150 |
+
},
|
| 151 |
+
# Cold-Humid
|
| 152 |
+
"6A": {
|
| 153 |
+
"summer": {"db": 30.0, "wb": 22.0, "dp": 19.0},
|
| 154 |
+
"winter": {"db": -20.0, "rh": 70.0}
|
| 155 |
+
},
|
| 156 |
+
# Cold-Dry
|
| 157 |
+
"6B": {
|
| 158 |
+
"summer": {"db": 31.0, "wb": 17.0, "dp": 10.0},
|
| 159 |
+
"winter": {"db": -15.0, "rh": 45.0}
|
| 160 |
+
},
|
| 161 |
+
# Very Cold
|
| 162 |
+
"7": {
|
| 163 |
+
"summer": {"db": 28.0, "wb": 20.0, "dp": 17.0},
|
| 164 |
+
"winter": {"db": -25.0, "rh": 70.0}
|
| 165 |
+
},
|
| 166 |
+
# Subarctic/Arctic
|
| 167 |
+
"8": {
|
| 168 |
+
"summer": {"db": 25.0, "wb": 18.0, "dp": 15.0},
|
| 169 |
+
"winter": {"db": -30.0, "rh": 70.0}
|
| 170 |
+
}
|
| 171 |
+
}
|
| 172 |
+
|
| 173 |
+
# Return design conditions for the specified climate zone
|
| 174 |
+
# If climate zone not found, return default values
|
| 175 |
+
if climate_zone in design_conditions_by_zone:
|
| 176 |
+
return design_conditions_by_zone[climate_zone]
|
| 177 |
+
else:
|
| 178 |
+
# Default to 4A if climate zone not found
|
| 179 |
+
return design_conditions_by_zone["4A"]
|
| 180 |
+
|
| 181 |
+
@staticmethod
|
| 182 |
+
def get_monthly_temperatures(climate_zone: str) -> Dict[str, float]:
|
| 183 |
+
"""
|
| 184 |
+
Get monthly average temperatures for a specific climate zone.
|
| 185 |
+
|
| 186 |
+
Args:
|
| 187 |
+
climate_zone: ASHRAE climate zone (e.g., '1A', '3B', '5A')
|
| 188 |
+
|
| 189 |
+
Returns:
|
| 190 |
+
Dictionary with monthly average temperatures
|
| 191 |
+
"""
|
| 192 |
+
# Default monthly temperatures by climate zone
|
| 193 |
+
monthly_temps_by_zone = {
|
| 194 |
+
# Hot-Humid (like Miami)
|
| 195 |
+
"1A": {
|
| 196 |
+
"Jan": 20.0, "Feb": 20.5, "Mar": 22.0, "Apr": 24.0, "May": 26.0,
|
| 197 |
+
"Jun": 28.0, "Jul": 29.0, "Aug": 29.0, "Sep": 28.0, "Oct": 26.0,
|
| 198 |
+
"Nov": 23.0, "Dec": 21.0
|
| 199 |
+
},
|
| 200 |
+
# Hot-Dry (like Riyadh)
|
| 201 |
+
"1B": {
|
| 202 |
+
"Jan": 15.0, "Feb": 17.0, "Mar": 22.0, "Apr": 27.0, "May": 32.0,
|
| 203 |
+
"Jun": 35.0, "Jul": 37.0, "Aug": 36.0, "Sep": 33.0, "Oct": 28.0,
|
| 204 |
+
"Nov": 22.0, "Dec": 17.0
|
| 205 |
+
},
|
| 206 |
+
# Hot-Humid (like Houston)
|
| 207 |
+
"2A": {
|
| 208 |
+
"Jan": 12.0, "Feb": 13.5, "Mar": 17.0, "Apr": 21.0, "May": 25.0,
|
| 209 |
+
"Jun": 28.0, "Jul": 29.0, "Aug": 29.0, "Sep": 27.0, "Oct": 22.0,
|
| 210 |
+
"Nov": 17.0, "Dec": 13.0
|
| 211 |
+
},
|
| 212 |
+
# Hot-Dry (like Phoenix)
|
| 213 |
+
"2B": {
|
| 214 |
+
"Jan": 13.0, "Feb": 15.0, "Mar": 18.0, "Apr": 23.0, "May": 28.0,
|
| 215 |
+
"Jun": 33.0, "Jul": 35.0, "Aug": 34.0, "Sep": 31.0, "Oct": 25.0,
|
| 216 |
+
"Nov": 18.0, "Dec": 13.0
|
| 217 |
+
},
|
| 218 |
+
# Warm-Humid (like Atlanta)
|
| 219 |
+
"3A": {
|
| 220 |
+
"Jan": 6.0, "Feb": 8.0, "Mar": 12.0, "Apr": 17.0, "May": 21.0,
|
| 221 |
+
"Jun": 25.0, "Jul": 27.0, "Aug": 26.0, "Sep": 23.0, "Oct": 18.0,
|
| 222 |
+
"Nov": 12.0, "Dec": 7.0
|
| 223 |
+
},
|
| 224 |
+
# Warm-Dry (like Los Angeles)
|
| 225 |
+
"3B": {
|
| 226 |
+
"Jan": 14.6, "Feb": 15.1, "Mar": 15.8, "Apr": 17.1, "May": 18.3,
|
| 227 |
+
"Jun": 20.1, "Jul": 22.3, "Aug": 22.9, "Sep": 22.1, "Oct": 20.3,
|
| 228 |
+
"Nov": 17.2, "Dec": 14.9
|
| 229 |
+
},
|
| 230 |
+
# Warm-Marine (like San Francisco)
|
| 231 |
+
"3C": {
|
| 232 |
+
"Jan": 10.0, "Feb": 11.0, "Mar": 12.0, "Apr": 13.0, "May": 14.0,
|
| 233 |
+
"Jun": 16.0, "Jul": 17.0, "Aug": 17.0, "Sep": 18.0, "Oct": 16.0,
|
| 234 |
+
"Nov": 13.0, "Dec": 10.0
|
| 235 |
+
},
|
| 236 |
+
# Mixed-Humid (like New York)
|
| 237 |
+
"4A": {
|
| 238 |
+
"Jan": 0.5, "Feb": 2.1, "Mar": 6.3, "Apr": 12.5, "May": 18.2,
|
| 239 |
+
"Jun": 23.1, "Jul": 25.8, "Aug": 24.9, "Sep": 20.7, "Oct": 14.3,
|
| 240 |
+
"Nov": 8.2, "Dec": 2.4
|
| 241 |
+
},
|
| 242 |
+
# Mixed-Dry (like Albuquerque)
|
| 243 |
+
"4B": {
|
| 244 |
+
"Jan": 3.0, "Feb": 5.0, "Mar": 9.0, "Apr": 14.0, "May": 19.0,
|
| 245 |
+
"Jun": 24.0, "Jul": 26.0, "Aug": 25.0, "Sep": 21.0, "Oct": 15.0,
|
| 246 |
+
"Nov": 8.0, "Dec": 3.0
|
| 247 |
+
},
|
| 248 |
+
# Mixed-Marine (like Seattle)
|
| 249 |
+
"4C": {
|
| 250 |
+
"Jan": 5.0, "Feb": 6.0, "Mar": 8.0, "Apr": 10.0, "May": 13.0,
|
| 251 |
+
"Jun": 16.0, "Jul": 18.0, "Aug": 18.0, "Sep": 16.0, "Oct": 12.0,
|
| 252 |
+
"Nov": 8.0, "Dec": 5.0
|
| 253 |
+
},
|
| 254 |
+
# Cool-Humid (like Chicago)
|
| 255 |
+
"5A": {
|
| 256 |
+
"Jan": -3.5, "Feb": -1.2, "Mar": 4.1, "Apr": 10.3, "May": 16.5,
|
| 257 |
+
"Jun": 22.1, "Jul": 24.8, "Aug": 23.9, "Sep": 19.7, "Oct": 12.8,
|
| 258 |
+
"Nov": 5.2, "Dec": -1.4
|
| 259 |
+
},
|
| 260 |
+
# Cool-Dry (like Denver)
|
| 261 |
+
"5B": {
|
| 262 |
+
"Jan": 0.0, "Feb": 2.0, "Mar": 6.0, "Apr": 10.0, "May": 15.0,
|
| 263 |
+
"Jun": 20.0, "Jul": 23.0, "Aug": 22.0, "Sep": 18.0, "Oct": 12.0,
|
| 264 |
+
"Nov": 5.0, "Dec": 0.0
|
| 265 |
+
},
|
| 266 |
+
# Cool-Marine (like Vancouver)
|
| 267 |
+
"5C": {
|
| 268 |
+
"Jan": 3.0, "Feb": 4.0, "Mar": 6.0, "Apr": 9.0, "May": 12.0,
|
| 269 |
+
"Jun": 15.0, "Jul": 17.0, "Aug": 17.0, "Sep": 14.0, "Oct": 10.0,
|
| 270 |
+
"Nov": 6.0, "Dec": 3.0
|
| 271 |
+
},
|
| 272 |
+
# Cold-Humid (like Minneapolis)
|
| 273 |
+
"6A": {
|
| 274 |
+
"Jan": -9.0, "Feb": -6.0, "Mar": 0.0, "Apr": 8.0, "May": 15.0,
|
| 275 |
+
"Jun": 20.0, "Jul": 23.0, "Aug": 22.0, "Sep": 17.0, "Oct": 10.0,
|
| 276 |
+
"Nov": 1.0, "Dec": -6.0
|
| 277 |
+
},
|
| 278 |
+
# Cold-Dry (like Helena)
|
| 279 |
+
"6B": {
|
| 280 |
+
"Jan": -5.0, "Feb": -2.0, "Mar": 2.0, "Apr": 7.0, "May": 12.0,
|
| 281 |
+
"Jun": 17.0, "Jul": 21.0, "Aug": 20.0, "Sep": 15.0, "Oct": 9.0,
|
| 282 |
+
"Nov": 1.0, "Dec": -4.0
|
| 283 |
+
},
|
| 284 |
+
# Very Cold (like Duluth)
|
| 285 |
+
"7": {
|
| 286 |
+
"Jan": -12.0, "Feb": -9.0, "Mar": -3.0, "Apr": 5.0, "May": 12.0,
|
| 287 |
+
"Jun": 17.0, "Jul": 20.0, "Aug": 19.0, "Sep": 14.0, "Oct": 7.0,
|
| 288 |
+
"Nov": -1.0, "Dec": -9.0
|
| 289 |
+
},
|
| 290 |
+
# Subarctic/Arctic (like Fairbanks)
|
| 291 |
+
"8": {
|
| 292 |
+
"Jan": -20.0, "Feb": -16.0, "Mar": -10.0, "Apr": 0.0, "May": 10.0,
|
| 293 |
+
"Jun": 16.0, "Jul": 18.0, "Aug": 15.0, "Sep": 8.0, "Oct": -2.0,
|
| 294 |
+
"Nov": -12.0, "Dec": -18.0
|
| 295 |
+
}
|
| 296 |
+
}
|
| 297 |
+
|
| 298 |
+
# Return monthly temperatures for the specified climate zone
|
| 299 |
+
# If climate zone not found, return default values
|
| 300 |
+
if climate_zone in monthly_temps_by_zone:
|
| 301 |
+
return monthly_temps_by_zone[climate_zone]
|
| 302 |
+
else:
|
| 303 |
+
# Default to 4A if climate zone not found
|
| 304 |
+
return monthly_temps_by_zone["4A"]
|
| 305 |
+
|
| 306 |
def _load_climate_locations(self) -> Dict[str, ClimateLocation]:
|
| 307 |
"""
|
| 308 |
Load climate location data.
|