Which Midwest markets are earliest in the recovery cycle? Identify metros with rising demand but still-depressed pricing. Show me the data and trends
placeholder
ids = """ 39500 16020 41180 40420 36837 41180 40420 16580 45380 41180 16660 16980 20820 16980 16980 41180 16980 20820 45380 20820 15900 16980 16980 34500 41180 16980 28100 16980 23660 16980 36837 19940 38700 30660 31380 16980 14010 19500 41180 41180 16460 37900 37140 44100 19340 41180 27300 40300 37900 16580 37900 40420 16580 27300 16580 36837 44100 41180 32060 40420 37900 19540 23060 18020 29200 26900 26900 29200 30900 31140 45460 23140 47780 17140 24700 12140 34620 27540 21140 18220 31140 17140 26900 26900 31140 26900 35220 29020 26540 42980 16980 31500 26900 47180 47700 16980 33140 13260 26900 26900 38500 37940 14020 18820 26900 16980 28340 17140 14020 21780 24600 26900 43780 26900 21780 45460 11420 45460 29200 26900 21780 45460 45460 47340 29200 21780 31140 39980 23060 33900 23060 16300 47940 11180 47940 44740 16140 32380 16140 43980 17540 19780 15460 44020 20220 39500 15460 16580 23300 16580 16580 36540 19780 19780 37800 32260 36540 34700 30180 19780 19340 11180 32380 43580 19780 22800 16300 36820 26980 36900 22700 11860 24460 48620 21380 27900 48620 19980 36840 31740 23780 45820 45820 28140 41140 29940 25700 30580 21380 48620 45820 41460 45820 26740 31740 32700 48620 28140 28140 30580 45820 48620 45820 41460 27900 26090 10980 24340 13020 45900 35660 17740 12980 43780 42300 29620 21540 27020 29620 37950 22420 45900 10940 25880 26340 29620 24340 34380 27100 28020 45900 24340 26340 19820 45900 10300 19820 19820 32100 31220 13660 31940 33220 15620 33780 24340 34740 19820 15620 40980 44780 37020 11460 19820 15620 33460 19810 13420 41060 31860 35580 20260 33460 14660 33460 22020 14660 33460 22020 33460 18100 43580 30420 23340 36540 37800 19780 30420 24260 13100 30420 24260 24260 28260 30700 35820 35820 35740 24260 28260 35820 30700 43620 18100 30700 44740 39960 24580 11540 20740 31540 31540 13180 20260 32860 20740
[
{"entity":"Akron, OH","id":"10420","est_value_median_natl_pctile":45,"est_value_median_t12_pct_chg":0.0258,"population_growth_t12_pct_chg":0.0099,"job_growth_1_year":0.0,"net_pct_natl_pctile":30,"tradeout_new_lease_pct_avg":0.0323,"total_units_permitted_t12":691,"households":303143,"est_value_median":234742,"value_to_income_ratio_natl_pctile":35,"occupancy_latest":0.9623,"occupancy_t12_pct_chg":-0.0049,"in_place_rent_t12_pct_chg_median":-0.0175},
{"entity":"Ann Arbor, MI","id":"11460","est_value_median_natl_pctile":86,"est_value_median_t12_pct_chg":-0.0033,"population_growth_t12_pct_chg":0.0069,"job_growth_1_year":0.027,"net_pct_natl_pctile":14,"tradeout_new_lease_pct_avg":-0.0039,"total_units_permitted_t12":1576,"households":151711,"est_value_median":429624,"value_to_income_ratio_natl_pctile":76,"occupancy_latest":0.96,"occupancy_t12_pct_chg":-0.0164,"in_place_rent_t12_pct_chg_median":-0.0143},
{"entity":"Cedar Rapids, IA","id":"16300","est_value_median_natl_pctile":41,"est_value_median_t12_pct_chg":0.0391,"population_growth_t12_pct_chg":0.015,"job_growth_1_year":0.0186,"net_pct_natl_pctile":57,"tradeout_new_lease_pct_avg":0.1583,"total_units_permitted_t12":936,"households":116781,"est_value_median":221529,"value_to_income_ratio_natl_pctile":24,"occupancy_latest":0.9922,"occupancy_t12_pct_chg":0.0159,"in_place_rent_t12_pct_chg_median":0.0853},
{"entity":"Chicago, IL","id":"16980","est_value_median_natl_pctile":76,"est_value_median_t12_pct_chg":0.0416,"population_growth_t12_pct_chg":0.0094,"job_growth_1_year":0.0166,"net_pct_natl_pctile":15,"tradeout_new_lease_pct_avg":0.0701,"total_units_permitted_t12":14801,"households":3690402,"est_value_median":355421,"value_to_income_ratio_natl_pctile":55,"occupancy_latest":0.9603,"occupancy_t12_pct_chg":-0.0149,"in_place_rent_t12_pct_chg_median":0.0401},
{"entity":"Cincinnati, OH","id":"17140","est_value_median_natl_pctile":63,"est_value_median_t12_pct_chg":0.0320,"population_growth_t12_pct_chg":0.0105,"job_growth_1_year":0.0143,"net_pct_natl_pctile":33,"tradeout_new_lease_pct_avg":0.0365,"total_units_permitted_t12":8688,"households":922646,"est_value_median":291629,"value_to_income_ratio_natl_pctile":46,"occupancy_latest":0.9449,"occupancy_t12_pct_chg":-0.0211,"in_place_rent_t12_pct_chg_median":0.0473},
{"entity":"Cleveland, OH","id":"17410","est_value_median_natl_pctile":49,"est_value_median_t12_pct_chg":0.0419,"population_growth_t12_pct_chg":0.0098,"job_growth_1_year":0.0116,"net_pct_natl_pctile":30,"tradeout_new_lease_pct_avg":0.0489,"total_units_permitted_t12":4553,"households":936673,"est_value_median":244530,"value_to_income_ratio_natl_pctile":41,"occupancy_latest":0.9375,"occupancy_t12_pct_chg":-0.0275,"in_place_rent_t12_pct_chg_median":-0.0006},
{"entity":"Columbia, MO","id":"17860","est_value_median_natl_pctile":67,"est_value_median_t12_pct_chg":0.0368,"population_growth_t12_pct_chg":0.0134,"job_growth_1_year":0.0213,"net_pct_natl_pctile":11,"tradeout_new_lease_pct_avg":0.0475,"total_units_permitted_t12":1026,"households":88462,"est_value_median":308487,"value_to_income_ratio_natl_pctile":50,"occupancy_latest":0.9725,"occupancy_t12_pct_chg":-0.0151,"in_place_rent_t12_pct_chg_median":0.0470},
{"entity":"Columbus, OH","id":"18140","est_value_median_natl_pctile":70,"est_value_median_t12_pct_chg":0.0145,"population_growth_t12_pct_chg":0.0107,"job_growth_1_year":0.0206,"net_pct_natl_pctile":25,"tradeout_new_lease_pct_avg":0.0270,"total_units_permitted_t12":13145,"households":880121,"est_value_median":325581,"value_to_income_ratio_natl_pctile":52,"occupancy_latest":0.9408,"occupancy_t12_pct_chg":-0.0231,"in_place_rent_t12_pct_chg_median":0.0107},
{"entity":"Davenport, IA","id":"19340","est_value_median_natl_pctile":23,"est_value_median_t12_pct_chg":0.0227,"population_growth_t12_pct_chg":0.0087,"job_growth_1_year":-0.0108,"net_pct_natl_pctile":28,"tradeout_new_lease_pct_avg":0.0217,"total_units_permitted_t12":620,"households":164167,"est_value_median":179297,"value_to_income_ratio_natl_pctile":13,"occupancy_latest":0.961,"occupancy_t12_pct_chg":-0.0149,"in_place_rent_t12_pct_chg_median":0.0688},
{"entity":"Dayton, OH","id":"19430","est_value_median_natl_pctile":42,"est_value_median_t12_pct_chg":0.0403,"population_growth_t12_pct_chg":0.0118,"job_growth_1_year":0.025,"net_pct_natl_pctile":26,"tradeout_new_lease_pct_avg":0.0743,"total_units_permitted_t12":2122,"households":347200,"est_value_median":227359,"value_to_income_ratio_natl_pctile":28,"occupancy_latest":0.9616,"occupancy_t12_pct_chg":-0.0131,"in_place_rent_t12_pct_chg_median":0.0380},
{"entity":"Des Moines, IA","id":"19780","est_value_median_natl_pctile":61,"est_value_median_t12_pct_chg":0.0407,"population_growth_t12_pct_chg":0.0124,"job_growth_1_year":0.0324,"net_pct_natl_pctile":68,"tradeout_new_lease_pct_avg":0.0159,"total_units_permitted_t12":5058,"households":307502,"est_value_median":285243,"value_to_income_ratio_natl_pctile":39,"occupancy_latest":0.9496,"occupancy_t12_pct_chg":-0.0064,"in_place_rent_t12_pct_chg_median":0.0219},
{"entity":"Detroit, MI","id":"19820","est_value_median_natl_pctile":59,"est_value_median_t12_pct_chg":0.0045,"population_growth_t12_pct_chg":0.0102,"job_growth_1_year":0.0091,"net_pct_natl_pctile":18,"tradeout_new_lease_pct_avg":0.0520,"total_units_permitted_t12":8322,"households":1777768,"est_value_median":277801,"value_to_income_ratio_natl_pctile":51,"occupancy_latest":0.9571,"occupancy_t12_pct_chg":-0.0116,"in_place_rent_t12_pct_chg_median":0.0136},
{"entity":"Evansville, IN","id":"21780","est_value_median_natl_pctile":42,"est_value_median_t12_pct_chg":0.0212,"population_growth_t12_pct_chg":0.0119,"job_growth_1_year":0.0188,"net_pct_natl_pctile":35,"tradeout_new_lease_pct_avg":0.0107,"total_units_permitted_t12":804,"households":117981,"est_value_median":226991,"value_to_income_ratio_natl_pctile":35,"occupancy_latest":0.9353,"occupancy_t12_pct_chg":-0.0368,"in_place_rent_t12_pct_chg_median":0.0156},
{"entity":"Fargo, ND","id":"22020","est_value_median_natl_pctile":67,"est_value_median_t12_pct_chg":0.0347,"population_growth_t12_pct_chg":0.0084,"job_growth_1_year":0.0315,"net_pct_natl_pctile":29,"tradeout_new_lease_pct_avg":0.0598,"total_units_permitted_t12":1294,"households":117879,"est_value_median":309562,"value_to_income_ratio_natl_pctile":61,"occupancy_latest":0.9663,"occupancy_t12_pct_chg":0.013,"in_place_rent_t12_pct_chg_median":0.1510},
{"entity":"Fort Wayne, IN","id":"23060","est_value_median_natl_pctile":49,"est_value_median_t12_pct_chg":0.0190,"population_growth_t12_pct_chg":0.0118,"job_growth_1_year":0.0345,"net_pct_natl_pctile":48,"tradeout_new_lease_pct_avg":0.0609,"total_units_permitted_t12":1646,"households":185429,"est_value_median":244193,"value_to_income_ratio_natl_pctile":36,"occupancy_latest":0.956,"occupancy_t12_pct_chg":-0.023,"in_place_rent_t12_pct_chg_median":0.0054},
{"entity":"Grand Rapids, MI","id":"24340","est_value_median_natl_pctile":74,"est_value_median_t12_pct_chg":0.0209,"population_growth_t12_pct_chg":0.0106,"job_growth_1_year":0.0091,"net_pct_natl_pctile":41,"tradeout_new_lease_pct_avg":0.0572,"total_units_permitted_t12":4003,"households":447475,"est_value_median":344322,"value_to_income_ratio_natl_pctile":65,"occupancy_latest":0.9689,"occupancy_t12_pct_chg":-0.0038,"in_place_rent_t12_pct_chg_median":0.0179},
{"entity":"Green Bay, WI","id":"24580","est_value_median_natl_pctile":72,"est_value_median_t12_pct_chg":0.0519,"population_growth_t12_pct_chg":0.0129,"job_growth_1_year":0.0075,"net_pct_natl_pctile":46,"tradeout_new_lease_pct_avg":0.0937,"total_units_permitted_t12":1791,"households":135961,"est_value_median":335564,"value_to_income_ratio_natl_pctile":61,"occupancy_latest":0.9768,"occupancy_t12_pct_chg":0.0087,"in_place_rent_t12_pct_chg_median":-0.0082},
{"entity":"Indianapolis, IN","id":"26900","est_value_median_natl_pctile":61,"est_value_median_t12_pct_chg":0.0066,"population_growth_t12_pct_chg":0.0119,"job_growth_1_year":0.0135,"net_pct_natl_pctile":58,"tradeout_new_lease_pct_avg":0.0053,"total_units_permitted_t12":12831,"households":869616,"est_value_median":286915,"value_to_income_ratio_natl_pctile":43,"occupancy_latest":0.9239,"occupancy_t12_pct_chg":-0.0398,"in_place_rent_t12_pct_chg_median":-0.0031},
{"entity":"Kansas City, MO","id":"28140","est_value_median_natl_pctile":69,"est_value_median_t12_pct_chg":0.0287,"population_growth_t12_pct_chg":0.0106,"job_growth_1_year":0.0209,"net_pct_natl_pctile":65,"tradeout_new_lease_pct_avg":0.0472,"total_units_permitted_t12":10133,"households":914522,"est_value_median":316756,"value_to_income_ratio_natl_pctile":54,"occupancy_latest":0.9443,"occupancy_t12_pct_chg":-0.0228,"in_place_rent_t12_pct_chg_median":0.0422},
{"entity":"Lansing, MI","id":"29620","est_value_median_natl_pctile":51,"est_value_median_t12_pct_chg":0.0304,"population_growth_t12_pct_chg":0.0072,"job_growth_1_year":0.0233,"net_pct_natl_pctile":15,"tradeout_new_lease_pct_avg":0.0833,"total_units_permitted_t12":918,"households":197873,"est_value_median":252200,"value_to_income_ratio_natl_pctile":42,"occupancy_latest":0.9418,"occupancy_t12_pct_chg":-0.0348,"in_place_rent_t12_pct_chg_median":0.0309},
{"entity":"Lincoln, NE","id":"30700","est_value_median_natl_pctile":64,"est_value_median_t12_pct_chg":0.0579,"population_growth_t12_pct_chg":0.013,"job_growth_1_year":0.037,"net_pct_natl_pctile":32,"tradeout_new_lease_pct_avg":0.0501,"total_units_permitted_t12":2089,"households":146302,"est_value_median":295868,"value_to_income_ratio_natl_pctile":57,"occupancy_latest":0.9538,"occupancy_t12_pct_chg":-0.005,"in_place_rent_t12_pct_chg_median":0.0144},
{"entity":"Madison, WI","id":"31540","est_value_median_natl_pctile":86,"est_value_median_t12_pct_chg":0.0284,"population_growth_t12_pct_chg":0.0081,"job_growth_1_year":0.0408,"net_pct_natl_pctile":17,"tradeout_new_lease_pct_avg":0.0157,"total_units_permitted_t12":6708,"households":309316,"est_value_median":429875,"value_to_income_ratio_natl_pctile":77,"occupancy_latest":0.9195,"occupancy_t12_pct_chg":-0.0398,"in_place_rent_t12_pct_chg_median":0.0104},
{"entity":"Milwaukee, WI","id":"33340","est_value_median_natl_pctile":78,"est_value_median_t12_pct_chg":0.0584,"population_growth_t12_pct_chg":0.0107,"job_growth_1_year":0.0106,"net_pct_natl_pctile":19,"tradeout_new_lease_pct_avg":0.0597,"total_units_permitted_t12":3126,"households":663225,"est_value_median":370602,"value_to_income_ratio_natl_pctile":77,"occupancy_latest":0.9615,"occupancy_t12_pct_chg":-0.0037,"in_place_rent_t12_pct_chg_median":0.0464},
{"entity":"Minneapolis-St. Paul, MN","id":"33460","est_value_median_natl_pctile":82,"est_value_median_t12_pct_chg":0.0097,"population_growth_t12_pct_chg":0.0113,"job_growth_1_year":0.0082,"net_pct_natl_pctile":49,"tradeout_new_lease_pct_avg":0.0433,"total_units_permitted_t12":14757,"households":1508526,"est_value_median":391418,"value_to_income_ratio_natl_pctile":61,"occupancy_latest":0.9483,"occupancy_t12_pct_chg":-0.0107,"in_place_rent_t12_pct_chg_median":0.0162},
{"entity":"Omaha, NE","id":"36540","est_value_median_natl_pctile":63,"est_value_median_t12_pct_chg":0.0327,"population_growth_t12_pct_chg":0.0137,"job_growth_1_year":0.0067,"net_pct_natl_pctile":45,"tradeout_new_lease_pct_avg":0.0321,"total_units_permitted_t12":7088,"households":400079,"est_value_median":291913,"value_to_income_ratio_natl_pctile":43,"occupancy_latest":0.9502,"occupancy_t12_pct_chg":-0.0213,"in_place_rent_t12_pct_chg_median":0.0348},
{"entity":"Peoria, IL","id":"37900","est_value_median_natl_pctile":19,"est_value_median_t12_pct_chg":0.0570,"population_growth_t12_pct_chg":0.0127,"job_growth_1_year":0.016,"net_pct_natl_pctile":31,"tradeout_new_lease_pct_avg":0.0580,"total_units_permitted_t12":234,"households":155721,"est_value_median":169201,"value_to_income_ratio_natl_pctile":8,"occupancy_latest":0.9647,"occupancy_t12_pct_chg":-0.0185,"in_place_rent_t12_pct_chg_median":-0.0329},
{"entity":"Rochester, MN","id":"40340","est_value_median_natl_pctile":72,"est_value_median_t12_pct_chg":0.0260,"population_growth_t12_pct_chg":0.0127,"job_growth_1_year":0.0401,"net_pct_natl_pctile":28,"tradeout_new_lease_pct_avg":0.0258,"total_units_permitted_t12":1515,"households":94844,"est_value_median":331006,"value_to_income_ratio_natl_pctile":44,"occupancy_latest":0.9536,"occupancy_t12_pct_chg":-0.003,"in_place_rent_t12_pct_chg_median":0.0223},
{"entity":"Rockford, IL","id":"40420","est_value_median_natl_pctile":36,"est_value_median_t12_pct_chg":0.0610,"population_growth_t12_pct_chg":0.0107,"job_growth_1_year":0.0103,"net_pct_natl_pctile":28,"tradeout_new_lease_pct_avg":0.0956,"total_units_permitted_t12":408,"households":137941,"est_value_median":211191,"value_to_income_ratio_natl_pctile":26,"occupancy_latest":0.9798,"occupancy_t12_pct_chg":-0.0007,"in_place_rent_t12_pct_chg_median":-0.0263},
{"entity":"St. Louis, MO","id":"41180","est_value_median_natl_pctile":57,"est_value_median_t12_pct_chg":0.0157,"population_growth_t12_pct_chg":0.0095,"job_growth_1_year":-0.0017,"net_pct_natl_pctile":30,"tradeout_new_lease_pct_avg":0.0512,"total_units_permitted_t12":6544,"households":1178246,"est_value_median":274227,"value_to_income_ratio_natl_pctile":39,"occupancy_latest":0.9527,"occupancy_t12_pct_chg":-0.0155,"in_place_rent_t12_pct_chg_median":0.0306},
{"entity":"Sioux Falls, SD","id":"43620","est_value_median_natl_pctile":71,"est_value_median_t12_pct_chg":0.0248,"population_growth_t12_pct_chg":0.0121,"job_growth_1_year":0.0134,"net_pct_natl_pctile":85,"tradeout_new_lease_pct_avg":0.0377,"total_units_permitted_t12":2866,"households":130223,"est_value_median":328875,"value_to_income_ratio_natl_pctile":57,"occupancy_latest":0.9498,"occupancy_t12_pct_chg":-0.0045,"in_place_rent_t12_pct_chg_median":0.0034},
{"entity":"South Bend, IN","id":"43780","est_value_median_natl_pctile":43,"est_value_median_t12_pct_chg":0.0212,"population_growth_t12_pct_chg":0.0109,"job_growth_1_year":0.0052,"net_pct_natl_pctile":21,"tradeout_new_lease_pct_avg":0.0324,"total_units_permitted_t12":1062,"households":128463,"est_value_median":230080,"value_to_income_ratio_natl_pctile":42,"occupancy_latest":0.9574,"occupancy_t12_pct_chg":-0.0273,"in_place_rent_t12_pct_chg_median":0.0788},
{"entity":"Springfield, IL","id":"44100","est_value_median_natl_pctile":27,"est_value_median_t12_pct_chg":0.0519,"population_growth_t12_pct_chg":0.0143,"job_growth_1_year":0.0226,"net_pct_natl_pctile":29,"tradeout_new_lease_pct_avg":0.0876,"total_units_permitted_t12":206,"households":91607,"est_value_median":190694,"value_to_income_ratio_natl_pctile":9,"occupancy_latest":0.963,"occupancy_t12_pct_chg":-0.0017,"in_place_rent_t12_pct_chg_median":0.0343},
{"entity":"Springfield, MO","id":"44180","est_value_median_natl_pctile":56,"est_value_median_t12_pct_chg":0.0326,"population_growth_t12_pct_chg":0.0142,"job_growth_1_year":0.015,"net_pct_natl_pctile":80,"tradeout_new_lease_pct_avg":0.0367,"total_units_permitted_t12":2010,"households":201977,"est_value_median":264889,"value_to_income_ratio_natl_pctile":59,"occupancy_latest":0.9691,"occupancy_t12_pct_chg":-0.0129,"in_place_rent_t12_pct_chg_median":0.0204},
{"entity":"Toledo, OH","id":"45780","est_value_median_natl_pctile":30,"est_value_median_t12_pct_chg":0.0151,"population_growth_t12_pct_chg":0.0121,"job_growth_1_year":0.0053,"net_pct_natl_pctile":19,"tradeout_new_lease_pct_avg":0.0481,"total_units_permitted_t12":531,"households":257906,"est_value_median":194984,"value_to_income_ratio_natl_pctile":24,"occupancy_latest":0.9676,"occupancy_t12_pct_chg":-0.0056,"in_place_rent_t12_pct_chg_median":0.0112},
{"entity":"Topeka, KS","id":"45820","est_value_median_natl_pctile":30,"est_value_median_t12_pct_chg":0.0381,"population_growth_t12_pct_chg":0.0122,"job_growth_1_year":0.0572,"net_pct_natl_pctile":89,"tradeout_new_lease_pct_avg":0.0934,"total_units_permitted_t12":569,"households":100603,"est_value_median":195767,"value_to_income_ratio_natl_pctile":9,"occupancy_latest":0.9733,"occupancy_t12_pct_chg":-0.0065,"in_place_rent_t12_pct_chg_median":0.0297},
{"entity":"Wichita, KS","id":"48620","est_value_median_natl_pctile":39,"est_value_median_t12_pct_chg":0.0072,"population_growth_t12_pct_chg":0.013,"job_growth_1_year":0.0187,"net_pct_natl_pctile":91,"tradeout_new_lease_pct_avg":0.0635,"total_units_permitted_t12":3919,"households":260869,"est_value_median":217907,"value_to_income_ratio_natl_pctile":25,"occupancy_latest":0.9665,"occupancy_t12_pct_chg":-0.004,"in_place_rent_t12_pct_chg_median":0.0393}
]
cd /vercel/sandbox && python3 -c "
import json
recs = json.load(open('records.json'))
for r in recs:
r['permits_per_1000hh'] = r['total_units_permitted_t12'] / r['households'] * 1000
json.dump(recs, open('records.json','w'), indent=1)
print(len(recs))
"
cd /vercel/sandbox && python3 skills/multi-entity-analysis/scripts/cross_check.py \
--check composite \
--components est_value_median_natl_pctile,est_value_median_t12_pct_chg,population_growth_t12_pct_chg,job_growth_1_year,net_pct_natl_pctile,tradeout_new_lease_pct_avg,permits_per_1000hh \
--weights -0.25,-0.15,0.15,0.15,0.10,0.10,-0.10 \
records.json > composite_out.json
python3 -c "
import json
d = json.load(open('composite_out.json'))
print(d['status'])
for row in d['ranked'][:12]:
print(row['entity'], round(row['score'],1))
"
cd /vercel/sandbox && python3 skills/multi-entity-analysis/scripts/cross_check.py \
--check composite \
--components est_value_median_natl_pctile,est_value_median_t12_pct_chg,population_growth_t12_pct_chg,job_growth_1_year,net_pct_natl_pctile,tradeout_new_lease_pct_avg,permits_per_1000hh \
--weights="-0.25,-0.15,0.15,0.15,0.10,0.10,-0.10" \
records.json > composite_out.json
python3 -c "
import json
d = json.load(open('composite_out.json'))
print(d.get('status'))
if 'ranked' in d:
for row in d['ranked'][:15]:
print(row['entity'], round(row['score'],1))
else:
print(d)
"
cd /vercel/sandbox && python3 -c "
import json
d = json.load(open('composite_out.json'))
for row in d['ranked']:
print(row['entity'], round(row['score'],1))
"
cd /vercel/sandbox && python3 -c "
import json
d = json.load(open('composite_out.json'))
for row in d['ranked'][:8]:
print(row['entity'], round(row['score'],1), {k: round(v,2) for k,v in row['contributions'].items()})
"
cd /vercel/sandbox && for chk in \ "--check extremum --field job_growth_1_year --direction max --claim 'Topeka, KS'" \ "--check extremum --field tradeout_new_lease_pct_avg --direction max --claim 'Cedar Rapids, IA'" \ "--check extremum --field est_value_median_natl_pctile --direction min --claim 'Peoria, IL'" \ "--check extremum --field net_pct_natl_pctile --direction max --claim 'Wichita, KS'" \ ; do python3 skills/multi-entity-analysis/scripts/cross_check.py $chk records.json done
cd /vercel/sandbox && python3 skills/multi-entity-analysis/scripts/cross_check.py --check extremum --field job_growth_1_year --direction max --claim "Topeka, KS" records.json python3 skills/multi-entity-analysis/scripts/cross_check.py --check extremum --field tradeout_new_lease_pct_avg --direction max --claim "Cedar Rapids, IA" records.json python3 skills/multi-entity-analysis/scripts/cross_check.py --check extremum --field est_value_median_natl_pctile --direction min --claim "Peoria, IL" records.json python3 skills/multi-entity-analysis/scripts/cross_check.py --check extremum --field net_pct_natl_pctile --direction max --claim "Wichita, KS" records.json
Early-cycle Midwest: Topeka, Cedar Rapids, Wichita, and Springfield IL lead a cluster of secondary metros where jobs and migration are turning up while home prices haven't caught up
Screening all 36 Midwest metros with population over 100k on a composite of still-depressed pricing (home value percentile nationally, trailing 12-month price change) against rising demand (job growth, population growth, net migration, and rent tradeout momentum — a leading indicator of absorption), a clear tier separates from the pack. These aren't Rust Belt legacy-decline stories; they're metros where demand fundamentals have already turned but valuation hasn't caught up yet — the textbook early-recovery setup.
| Metro | Composite Score | Home Value Percentile | Home Value 12mo Change % | Job Growth (1yr) % | Population Growth (T12) % | Net Migration Percentile | Rent Tradeout % |
|---|---|---|---|---|---|---|---|
| Topeka, KS | 77.91 | 30 | +3.8% | +5.7% | +1.2% | 89 | +9.3% |
| Cedar Rapids, IA | 69.8 | 41 | +3.9% | +1.9% | +1.5% | 57 | +15.8% |
| Wichita, KS | 67.3 | 39 | +0.7% | +1.9% | +1.3% | 91 | +6.4% |
| Springfield, IL | 65.7 | 27 | +5.2% | +2.3% | +1.4% | 29 | +8.8% |
| Fort Wayne, IN | 61.6 | 49 | +1.9% | +3.5% | +1.2% | 48 | +6.1% |
| Peoria, IL | 61.0 | 19 | +5.7% | +1.6% | +1.3% | 31 | +5.8% |
| Toledo, OH | 60.4 | 30 | +1.5% | +0.5% | +1.2% | 19 | +4.8% |
| Dayton, OH | 56.8 | 42 | +4.0% | +2.5% | +1.2% | 26 | +7.4% |
| Springfield, MO | 56.8 | 56 | +3.3% | +1.5% | +1.4% | 80 | +3.7% |
| Evansville, IN | 55.3 | 42 | +2.1% | +1.9% | +1.2% | 35 | +1.1% |
The pattern: Kansas capital and secondary Kansas/Illinois/Indiana markets dominate — Topeka's 5.7% one-year job growth is the highest in the Midwest pool , and it's paired with home values still sitting at just the 30th national percentile. Wichita's net migration ranks in the 91st percentile nationally — the strongest inbound pull of any Midwest metro — while its home values sit at the 39th percentile, barely moved over the past year (+0.7%). Cedar Rapids posts the highest rent tradeout in the region at +15.8% 3, a strong signal new leases are pricing well above expiring ones — demand outrunning what asking rents captured a year ago — while home values remain at the 41st percentile.
Peoria and Springfield IL are the most "distressed-but-turning" names on the list: both sit below the 30th percentile on home values nationally (Peoria's 19th percentile is the lowest in the entire Midwest pool ), yet both are seeing 5%+ trailing home-value appreciation and positive job and population growth — early re-pricing already underway from a genuinely cheap base.
What breaks the thesis and where to watch: Chicago, Milwaukee, Madison, and Ann Arbor sit at the bottom of this ranking — not because they're weak markets, but because they've already re-priced (Madison and Ann Arbor both sit at the 86th national value percentile) while demand growth has cooled relative to peers, particularly weak net migration in Ann Arbor (14th percentile) and Chicago (15th percentile). These are late-cycle or fully-priced Midwest names, the mirror image of what the question is asking for.
The trade-off in the top tier: Topeka, Wichita, and Fort Wayne carry heavier tenant-quality and single-employer risk than Columbus or Indianapolis, and none of them show the deep liquidity of a Minneapolis or Chicago. This is a thesis for value-add or ground-floor entry with a longer hold, not a liquid trade — the size of these markets means thin transaction volume and real execution risk on exit.
Weights and guardrails: Equal split across the two theses — 40% pricing-depressed (25% national value percentile, 15% trailing 12-month price change), 50% rising-demand (15% population growth, 15% job growth, 10% net migration, 10% rent tradeout momentum), with a 10% model-added supply guardrail (permits per 1,000 households, penalizing markets building ahead of the recovery). Pool: 36 Midwest metros (IL, IN, IA, KS, MI, MN, MO, ND, NE, OH, SD, WI) with population 100k+, resolved from Census-place-to-market mapping. Every superlative above was checked programmatically against this record set.
Happy to go deeper on any one of these markets — comps, supply pipeline, or a full acquisition screen — or widen the pool below 100k population if you want to catch smaller college towns and secondary Iowa/Nebraska/Dakotas metros that didn't clear this cut.
That's the ranked read. Want me to run the acquisition/comp screen on Topeka or Wichita specifically, or pull sales comps to size entry pricing in one of these?
This is a read-only snapshot of a RealAI analysis.