// ===================================================== // offeredge-districts.txt // District-level market data for OfferEdge // Data as of: 2026-03-06 // // UPDATE FREQUENCY: // TEMPERATURE_DATA — monthly (from absorption processor) // DISTRICT_STATS — monthly (from absorption processor) // DISTRICTS — only when adding/removing districts // // NOTE: All declarations use var (not const) to allow // loading as a separate script file alongside // offeredge-neighborhoods.txt and offeredge-logic.txt // ===================================================== // ===================================================== // TEMPERATURE_DATA // Derived from Months Inventory using thresholds: // < 0.75 mo → 🔥🔥🔥 Sellers Commanding Premium (hot) // 0.75-1.5 → 🔥🔥 Strong Seller Momentum (warm) // 1.5-2.0 → 🔥 Seller Leaning (seller-leaning) // 2.0-3.0 → ⚖️ Balanced (balanced) // 3.0-4.5 → ❄️ Buyer Leaning (buyer-leaning) // > 4.5 → ❄️❄️ Buyers Have Momentum (cool) // ===================================================== var TEMPERATURE_DATA = { "Avon Grove": { emoji: "🔥🔥", label: "Strong Seller Momentum", cssClass: "warm" }, "Chester-Upland": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, "Chichester": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, "Coatesville Area": { emoji: "🔥", label: "Seller Leaning", cssClass: "seller-leaning" }, "County: Chester": { emoji: "🔥", label: "Seller Leaning", cssClass: "seller-leaning" }, "County: Delaware": { emoji: "🔥🔥", label: "Strong Seller Momentum", cssClass: "warm" }, "County: Montgomery": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, "County: New Castle DE": { emoji: "🔥🔥", label: "Strong Seller Momentum", cssClass: "warm" }, "County: Philadelphia": { emoji: "❄️", label: "Buyer Leaning", cssClass: "buyer-leaning" }, "Downingtown Area": { emoji: "🔥", label: "Seller Leaning", cssClass: "seller-leaning" }, "Garnet Valley": { emoji: "🔥", label: "Seller Leaning", cssClass: "seller-leaning" }, "Great Valley": { emoji: "🔥", label: "Seller Leaning", cssClass: "seller-leaning" }, "Haverford Township": { emoji: "🔥🔥", label: "Strong Seller Momentum", cssClass: "warm" }, "Interboro": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, "Kennett Consolidated": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, "Lower Merion": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, "Marple Newtown": { emoji: "🔥🔥", label: "Strong Seller Momentum", cssClass: "warm" }, "Methacton": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, "Octorara Area": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, "Owen J Roberts": { emoji: "🔥", label: "Seller Leaning", cssClass: "seller-leaning" }, "Oxford Area": { emoji: "❄️", label: "Buyer Leaning", cssClass: "buyer-leaning" }, "Penn-Delco": { emoji: "🔥", label: "Seller Leaning", cssClass: "seller-leaning" }, "Perkiomen Valley": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, "Phoenixville Area": { emoji: "🔥🔥", label: "Strong Seller Momentum", cssClass: "warm" }, "Radnor Township": { emoji: "🔥🔥", label: "Strong Seller Momentum", cssClass: "warm" }, "Ridley": { emoji: "🔥🔥", label: "Strong Seller Momentum", cssClass: "warm" }, "Rose Tree Media": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, "Southeast Delco": { emoji: "❄️", label: "Buyer Leaning", cssClass: "buyer-leaning" }, "Springfield": { emoji: "🔥🔥🔥",label: "Sellers Commanding Premium", cssClass: "hot" }, "Spring-Ford Area": { emoji: "🔥", label: "Seller Leaning", cssClass: "seller-leaning" }, "Tredyffrin-Easttown": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, "Twin Valley": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, "Unionville-Chadds Ford": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, "Upper Darby": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, "Wallingford-Swarthmore": { emoji: "🔥", label: "Seller Leaning", cssClass: "seller-leaning" }, "West Chester Area": { emoji: "🔥🔥", label: "Strong Seller Momentum", cssClass: "warm" }, "William Penn": { emoji: "❄️", label: "Buyer Leaning", cssClass: "buyer-leaning" }, "Red Clay Consolidated": { emoji: "🔥🔥", label: "Strong Seller Momentum", cssClass: "warm" }, "Brandywine": { emoji: "🔥🔥", label: "Strong Seller Momentum", cssClass: "warm" }, "Christina": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, "Colonial": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, "Appoquinimink": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, "Smyrna": { emoji: "⚖️", label: "Balanced", cssClass: "balanced" }, }; // ===================================================== // DISTRICT_STATS // Monthly market metrics per district // Source: Absorption_Rate_Main.xlsx, run 2026-03-06 // // Fields: // monthsOfInventory — current MI // avgDOM — closed DOM avg (resale only, 90-day) // listToSoldPct — list-to-sold ratio x 100 // marketEnvironment — derived from MI // closedDOM_median — median closed DOM (resale only) // closedDOM_sd — standard deviation of closed DOM // domThresh_68 — mean + 1 SD (68% of sold homes went faster) // domThresh_95 — mean + 2 SD (95% of sold homes went faster) // ucDOM_median — median days to UC (leading indicator) // ucDOM_avg — avg days to UC // activeDOM_median — median active listing DOM // activeDOM_avg — avg active listing DOM // dataAsOf — date of processor run // ===================================================== var DISTRICT_STATS = {"avon_grove":{"avgDOM":41,"closedDOM_median":17,"closedDOM_sd":55,"domThresh_68":97,"domThresh_95":152,"dataAsOf":"2026-04-10"},"brandywine":{"avgDOM":27,"closedDOM_median":10,"closedDOM_sd":33,"domThresh_68":59,"domThresh_95":92,"dataAsOf":"2026-04-10"},"chester_upland":{"avgDOM":57,"closedDOM_median":29,"closedDOM_sd":74,"domThresh_68":132,"domThresh_95":206,"dataAsOf":"2026-04-10"},"chichester":{"avgDOM":46,"closedDOM_median":17,"closedDOM_sd":61,"domThresh_68":108,"domThresh_95":169,"dataAsOf":"2026-04-10"},"christina":{"avgDOM":32,"closedDOM_median":13,"closedDOM_sd":42,"domThresh_68":74,"domThresh_95":117,"dataAsOf":"2026-04-10"},"coatesville":{"avgDOM":24,"closedDOM_median":10,"closedDOM_sd":29,"domThresh_68":53,"domThresh_95":83,"dataAsOf":"2026-04-10"},"colonial":{"avgDOM":39,"closedDOM_median":13,"closedDOM_sd":56,"domThresh_68":95,"domThresh_95":151,"dataAsOf":"2026-04-10"},"downingtown":{"avgDOM":33,"closedDOM_median":8,"closedDOM_sd":57,"domThresh_68":89,"domThresh_95":146,"dataAsOf":"2026-04-10"},"garnet_valley":{"avgDOM":24,"closedDOM_median":8,"closedDOM_sd":34,"domThresh_68":58,"domThresh_95":91,"dataAsOf":"2026-04-10"},"great_valley":{"avgDOM":32,"closedDOM_median":10,"closedDOM_sd":47,"domThresh_68":80,"domThresh_95":127,"dataAsOf":"2026-04-10"},"haverford_township":{"avgDOM":21,"closedDOM_median":6,"closedDOM_sd":34,"domThresh_68":56,"domThresh_95":90,"dataAsOf":"2026-04-10"},"interboro":{"avgDOM":49,"closedDOM_median":21,"closedDOM_sd":58,"domThresh_68":107,"domThresh_95":165,"dataAsOf":"2026-04-10"},"kennett_consolidated":{"avgDOM":32,"closedDOM_median":14,"closedDOM_sd":35,"domThresh_68":67,"domThresh_95":102,"dataAsOf":"2026-04-10"},"lower_merion":{"avgDOM":35,"closedDOM_median":8,"closedDOM_sd":53,"domThresh_68":88,"domThresh_95":141,"dataAsOf":"2026-04-10"},"marple_newtown":{"avgDOM":36,"closedDOM_median":16,"closedDOM_sd":42,"domThresh_68":77,"domThresh_95":119,"dataAsOf":"2026-04-10"},"methacton":{"avgDOM":22,"closedDOM_median":6,"closedDOM_sd":35,"domThresh_68":57,"domThresh_95":91,"dataAsOf":"2026-04-10"},"octorara":{"avgDOM":37,"closedDOM_median":18,"closedDOM_sd":52,"domThresh_68":90,"domThresh_95":142,"dataAsOf":"2026-04-10"},"owen_j_roberts":{"avgDOM":31,"closedDOM_median":15,"closedDOM_sd":35,"domThresh_68":66,"domThresh_95":102,"dataAsOf":"2026-04-10"},"oxford":{"avgDOM":36,"closedDOM_median":13,"closedDOM_sd":68,"domThresh_68":104,"domThresh_95":173,"dataAsOf":"2026-04-10"},"penn_delco":{"avgDOM":32,"closedDOM_median":8,"closedDOM_sd":45,"domThresh_68":77,"domThresh_95":123,"dataAsOf":"2026-04-10"},"perkiomen_valley":{"avgDOM":42,"closedDOM_median":12,"closedDOM_sd":78,"domThresh_68":120,"domThresh_95":198,"dataAsOf":"2026-04-10"},"phoenixville":{"avgDOM":27,"closedDOM_median":7,"closedDOM_sd":38,"domThresh_68":65,"domThresh_95":103,"dataAsOf":"2026-04-10"},"radnor_township":{"avgDOM":41,"closedDOM_median":10,"closedDOM_sd":69,"domThresh_68":110,"domThresh_95":180,"dataAsOf":"2026-04-10"},"red_clay_consolidated":{"avgDOM":31,"closedDOM_median":10,"closedDOM_sd":43,"domThresh_68":74,"domThresh_95":117,"dataAsOf":"2026-04-10"},"ridley":{"avgDOM":39,"closedDOM_median":14,"closedDOM_sd":49,"domThresh_68":88,"domThresh_95":137,"dataAsOf":"2026-04-10"},"rose_tree_media":{"avgDOM":27,"closedDOM_median":8,"closedDOM_sd":34,"domThresh_68":60,"domThresh_95":94,"dataAsOf":"2026-04-10"},"southeast_delco":{"avgDOM":45,"closedDOM_median":23,"closedDOM_sd":62,"domThresh_68":106,"domThresh_95":168,"dataAsOf":"2026-04-10"},"spring_ford":{"avgDOM":31,"closedDOM_median":11,"closedDOM_sd":40,"domThresh_68":71,"domThresh_95":111,"dataAsOf":"2026-04-10"},"springfield":{"avgDOM":24,"closedDOM_median":6,"closedDOM_sd":37,"domThresh_68":61,"domThresh_95":98,"dataAsOf":"2026-04-10"},"tredyfferin_easttown":{"avgDOM":17,"closedDOM_median":6,"closedDOM_sd":26,"domThresh_68":43,"domThresh_95":70,"dataAsOf":"2026-04-10"},"twin_valley":{"avgDOM":46,"closedDOM_median":29,"closedDOM_sd":43,"domThresh_68":90,"domThresh_95":133,"dataAsOf":"2026-04-10"},"unionville_chadds_ford":{"avgDOM":58,"closedDOM_median":27,"closedDOM_sd":73,"domThresh_68":131,"domThresh_95":204,"dataAsOf":"2026-04-10"},"upper_darby":{"avgDOM":34,"closedDOM_median":16,"closedDOM_sd":39,"domThresh_68":73,"domThresh_95":112,"dataAsOf":"2026-04-10"},"wallingford_swarthmore":{"avgDOM":50,"closedDOM_median":20,"closedDOM_sd":63,"domThresh_68":113,"domThresh_95":176,"dataAsOf":"2026-04-10"},"west_chester":{"avgDOM":27,"closedDOM_median":7,"closedDOM_sd":39,"domThresh_68":66,"domThresh_95":104,"dataAsOf":"2026-04-10"},"william_penn":{"avgDOM":52,"closedDOM_median":26,"closedDOM_sd":64,"domThresh_68":116,"domThresh_95":180,"dataAsOf":"2026-04-10"}}; // ===================================================== // DISTRICTS // Static district definitions // typicalDOM updated to closedDOM_median from processor // Update only when adding or removing districts // ===================================================== var DISTRICTS = { // CHESTER COUNTY, PA garnet_valley: { code: "GAR", name: "Garnet Valley", county: "Delaware", state: "PA", typicalDOM: 11, marketPressure: "tight", priceFlexibility: 30, typicalAdjustment: 62000, medianPriceRange: [560000, 685000], seasonalSensitivity: "medium" }, kennett_consolidated: { code: "KEN", name: "Kennett Consolidated", county: "Chester", state: "PA", typicalDOM: 12, marketPressure: "balanced", priceFlexibility: 35, typicalAdjustment: 62000, medianPriceRange: [525000, 645000], seasonalSensitivity: "medium" }, west_chester: { code: "WCA", name: "West Chester Area", county: "Chester", state: "PA", typicalDOM: 15, marketPressure: "tight", priceFlexibility: 25, typicalAdjustment: 30000, medianPriceRange: [605000, 740000], seasonalSensitivity: "high" }, unionville_chadds_ford: { code: "UCF", name: "Unionville-Chadds Ford", county: "Chester", state: "PA", typicalDOM: 27, marketPressure: "balanced", priceFlexibility: 36, typicalAdjustment: 57000, medianPriceRange: [690000, 850000], seasonalSensitivity: "medium" }, avon_grove: { code: "AVG", name: "Avon Grove", county: "Chester", state: "PA", typicalDOM: 19, marketPressure: "tight", priceFlexibility: 35, typicalAdjustment: 31000, medianPriceRange: [485000, 595000], seasonalSensitivity: "medium" }, downingtown: { code: "DTA", name: "Downingtown Area", county: "Chester", state: "PA", typicalDOM: 12, marketPressure: "tight", priceFlexibility: 21, typicalAdjustment: 45000, medianPriceRange: [505000, 620000], seasonalSensitivity: "high" }, coatesville: { code: "CVA", name: "Coatesville Area", county: "Chester", state: "PA", typicalDOM: 14, marketPressure: "tight", priceFlexibility: 24, typicalAdjustment: 14000, medianPriceRange: [320000, 395000], seasonalSensitivity: "medium" }, great_valley: { code: "GRV", name: "Great Valley", county: "Chester", state: "PA", typicalDOM: 19, marketPressure: "balanced", priceFlexibility: 52, typicalAdjustment: 53000, medianPriceRange: [600000, 740000], seasonalSensitivity: "high" }, tredyffrin_easttown: { code: "TRE", name: "Tredyffrin-Easttown", county: "Chester", state: "PA", typicalDOM: 11, marketPressure: "balanced", priceFlexibility: 26, typicalAdjustment: 81000, medianPriceRange: [720000, 890000], seasonalSensitivity: "high" }, owen_j_roberts: { code: "OJR", name: "Owen J Roberts", county: "Chester", state: "PA", typicalDOM: 18, marketPressure: "balanced", priceFlexibility: 35, typicalAdjustment: 50000, medianPriceRange: [480000, 590000], seasonalSensitivity: "medium" }, phoenixville: { code: "PHO", name: "Phoenixville Area", county: "Chester", state: "PA", typicalDOM: 16, marketPressure: "tight", priceFlexibility: 56, typicalAdjustment: 29000, medianPriceRange: [400000, 495000], seasonalSensitivity: "high" }, oxford: { code: "OXF", name: "Oxford Area", county: "Chester", state: "PA", typicalDOM: 12, marketPressure: "loose", priceFlexibility: 22, typicalAdjustment: 23000, medianPriceRange: [420000, 520000], seasonalSensitivity: "low" }, octorara: { code: "OCT", name: "Octorara Area", county: "Chester", state: "PA", typicalDOM: 12, marketPressure: "balanced", priceFlexibility: 35, typicalAdjustment: 27000, medianPriceRange: [380000, 465000], seasonalSensitivity: "medium" }, twin_valley: { code: "TWV", name: "Twin Valley", county: "Chester", state: "PA", typicalDOM: 25, marketPressure: "balanced", priceFlexibility: 67, typicalAdjustment: 29000, medianPriceRange: [410000, 510000], seasonalSensitivity: "medium" }, // DELAWARE COUNTY, PA penn_delco: { code: "PDL", name: "Penn-Delco", county: "Delaware", state: "PA", typicalDOM: 13, marketPressure: "tight", priceFlexibility: 32, typicalAdjustment: 24000, medianPriceRange: [265000, 325000], seasonalSensitivity: "medium" }, chichester: { code: "CHI", name: "Chichester", county: "Delaware", state: "PA", typicalDOM: 25, marketPressure: "balanced", priceFlexibility: 40, typicalAdjustment: 21000, medianPriceRange: [255000, 315000], seasonalSensitivity: "medium" }, ridley: { code: "RID", name: "Ridley", county: "Delaware", state: "PA", typicalDOM: 19, marketPressure: "tight", priceFlexibility: 54, typicalAdjustment: 13000, medianPriceRange: [290000, 360000], seasonalSensitivity: "medium" }, rose_tree_media: { code: "RTM", name: "Rose Tree Media", county: "Delaware", state: "PA", typicalDOM: 15, marketPressure: "balanced", priceFlexibility: 31, typicalAdjustment: 163000, medianPriceRange: [585000, 720000], seasonalSensitivity: "high" }, springfield: { code: "SPR", name: "Springfield", county: "Delaware", state: "PA", typicalDOM: 8, marketPressure: "tight", priceFlexibility: 56, typicalAdjustment: 35000, medianPriceRange: [430000, 530000], seasonalSensitivity: "high" }, upper_darby: { code: "UPD", name: "Upper Darby", county: "Delaware", state: "PA", typicalDOM: 25, marketPressure: "balanced", priceFlexibility: 42, typicalAdjustment: 16000, medianPriceRange: [230000, 290000], seasonalSensitivity: "medium" }, wallingford_swarthmore: { code: "WAL", name: "Wallingford-Swarthmore", county: "Delaware", state: "PA", typicalDOM: 20, marketPressure: "balanced", priceFlexibility: 42, typicalAdjustment: 29000, medianPriceRange: [495000, 610000], seasonalSensitivity: "medium" }, marple_newtown: { code: "MAR", name: "Marple Newtown", county: "Delaware", state: "PA", typicalDOM: 13, marketPressure: "tight", priceFlexibility: 25, typicalAdjustment: 34000, medianPriceRange: [590000, 725000], seasonalSensitivity: "high" }, haverford_township: { code: "HAV", name: "Haverford Township", county: "Delaware", state: "PA", typicalDOM: 9, marketPressure: "tight", priceFlexibility: 29, typicalAdjustment: 37000, medianPriceRange: [485000, 600000], seasonalSensitivity: "high" }, radnor_township: { code: "RAD", name: "Radnor Township", county: "Delaware", state: "PA", typicalDOM: 10, marketPressure: "tight", priceFlexibility: 41, typicalAdjustment: 169000, medianPriceRange: [1045000, 1285000], seasonalSensitivity: "high" }, interboro: { code: "INT", name: "Interboro", county: "Delaware", state: "PA", typicalDOM: 25, marketPressure: "balanced", priceFlexibility: 36, typicalAdjustment: 11000, medianPriceRange: [220000, 275000], seasonalSensitivity: "medium" }, southeast_delco: { code: "SED", name: "Southeast Delco", county: "Delaware", state: "PA", typicalDOM: 25, marketPressure: "balanced", priceFlexibility: 58, typicalAdjustment: 22000, medianPriceRange: [205000, 260000], seasonalSensitivity: "medium" }, chester_upland: { code: "CHU", name: "Chester-Upland", county: "Delaware", state: "PA", typicalDOM: 30, marketPressure: "loose", priceFlexibility: 27, typicalAdjustment: 18000, medianPriceRange: [135000, 170000], seasonalSensitivity: "low" }, william_penn: { code: "WPE", name: "William Penn", county: "Delaware", state: "PA", typicalDOM: 30, marketPressure: "loose", priceFlexibility: 39, typicalAdjustment: 18000, medianPriceRange: [190000, 235000], seasonalSensitivity: "medium" }, // MONTGOMERY COUNTY, PA spring_ford: { code: "SPG", name: "Spring-Ford Area", county: "Montgomery", state: "PA", typicalDOM: 11, marketPressure: "tight", priceFlexibility: 46, typicalAdjustment: 36000, medianPriceRange: [420000, 520000], seasonalSensitivity: "medium" }, lower_merion: { code: "LOW", name: "Lower Merion", county: "Montgomery", state: "PA", typicalDOM: 11, marketPressure: "balanced", priceFlexibility: 44, typicalAdjustment: 57000, medianPriceRange: [755000, 930000], seasonalSensitivity: "high" }, methacton: { code: "MET", name: "Methacton", county: "Montgomery", state: "PA", typicalDOM: 25, marketPressure: "balanced", priceFlexibility: 44, typicalAdjustment: 218000, medianPriceRange: [520000, 635000], seasonalSensitivity: "high" }, perkiomen_valley: { code: "PER", name: "Perkiomen Valley", county: "Montgomery", state: "PA", typicalDOM: 25, marketPressure: "balanced", priceFlexibility: 45, typicalAdjustment: 43000, medianPriceRange: [605000, 745000], seasonalSensitivity: "medium" }, // NEW CASTLE COUNTY, DE red_clay_consolidated: { code: "RCC", name: "Red Clay Consolidated", county: "New Castle", state: "DE", typicalDOM: 11, marketPressure: "tight", priceFlexibility: 41, typicalAdjustment: 30000, medianPriceRange: [320000, 395000], seasonalSensitivity: "medium" }, brandywine: { code: "BRW", name: "Brandywine", county: "New Castle", state: "DE", typicalDOM: 10, marketPressure: "tight", priceFlexibility: 29, typicalAdjustment: 17000, medianPriceRange: [365000, 450000], seasonalSensitivity: "medium" }, christina: { code: "CHR", name: "Christina", county: "New Castle", state: "DE", typicalDOM: 28, marketPressure: "balanced", priceFlexibility: 35, typicalAdjustment: 18000, medianPriceRange: [315000, 385000], seasonalSensitivity: "medium" }, colonial: { code: "COL", name: "Colonial", county: "New Castle", state: "DE", typicalDOM: 28, marketPressure: "balanced", priceFlexibility: 51, typicalAdjustment: 27000, medianPriceRange: [370000, 460000], seasonalSensitivity: "medium" }, appoquinimink: { code: "APP", name: "Appoquinimink", county: "New Castle", state: "DE", typicalDOM: 30, marketPressure: "loose", priceFlexibility: 28, typicalAdjustment: 40000, medianPriceRange: [530000, 655000], seasonalSensitivity: "medium" }, smyrna: { code: "SMY", name: "Smyrna", county: "New Castle", state: "DE", typicalDOM: 35, marketPressure: "loose", priceFlexibility: 64, typicalAdjustment: 52000, medianPriceRange: [610000, 750000], seasonalSensitivity: "low" }, };