def findValuation(reqArea, area, price):
from collections import defaultdict
from statistics import mean, stdev
# Step 1: Remove outliers
prices = defaultdict(list)
for a, p in zip(area, price):
prices[a].append(p)
# remove outliers
for a, p_list in prices.items():
if len(p_list) > 1:
avg = mean(p_list)
sd = stdev(p_list)
prices[a] = [p for p in p_list if abs(p - avg) <= 3 * sd]
# Step 2: Valuation of the candidate house
if not prices:
return 1000
all_areas = sorted(prices.keys())
if reqArea in all_areas:
return round(mean(prices[reqArea]))
if reqArea < all_areas[0]:
x1, y1 = all_areas[0], mean(prices[all_areas[0]])
x2, y2 = all_areas[1], mean(prices[all_areas[1]])
elif reqArea > all_areas[-1]:
x1, y1 = all_areas[-2], mean(prices[all_areas[-2]])
x2, y2 = all_areas[-1], mean(prices[all_areas[-1]])
else:
for i in range(len(all_areas) - 1):
if all_areas[i] <= reqArea <= all_areas[i + 1]:
x1, y1 = all_areas[i], mean(prices[all_areas[i]])
x2, y2 = all_areas[i + 1], mean(prices[all_areas[i + 1]])
break
# Interpolate or extrapolate the price
y = y1 + (reqArea - x1) * (y2 - y1) / (x2 - x1)
y = max(1000, min(y, 10**6))
return round(y)