Untitled

mail@pastecode.io avatar
unknown
python
2 years ago
2.7 kB
6
Indexable
def valuation(reqArea, area, price):
    final_area = []
    final_price = []
    house_list = {}
    for i in range(len(area)):
        if area[i] not in house_list:
            house_list[area[i]] = [price[i]]
        else:
            house_list[area[i]].append(price[i])
    
    for i in range(len(area)):
        price_i = price[i]
        area_i = area[i]
        compList = house_list[area_i].copy()
        compList.remove(price_i)
        
        mean_price = statistics.mean(compList) if compList else float('nan')
        std = statistics.pstdev(compList) if compList else float('nan')
        
        diff = abs(price_i - mean_price)
        if diff > 3 * std:
            continue
        
        final_area.append(area_i)
        final_price.append(price_i)
    
    if not final_area:
        ans = round(1000 * reqArea)
        return max(1000, min(ans, 1000000))
    
    if len(final_area) == 1:
        ans = round(final_price[0])
        return max(1000, min(ans, 1000000))
    
    if reqArea in final_area:
        indices = [i for i, a in enumerate(final_area) if a == reqArea]
        mean_price = sum([final_price[i] for i in indices]) / len(indices)
        ans = round(mean_price)
        return max(1000, min(ans, 1000000))
    
    smaller_area = None
    larger_area = None
    for a in final_area:
        if a < reqArea and (smaller_area is None or a > smaller_area):
            smaller_area = a
        if a > reqArea and (larger_area is None or a < larger_area):
            larger_area = a
    
    if smaller_area is not None and larger_area is not None:
        smaller_indices = [i for i, a in enumerate(final_area) if a == smaller_area]
        larger_indices = [i for i, a in enumerate(final_area) if a == larger_area]
        smaller_mean_price = sum([final_price[i] for i in smaller_indices]) / len(smaller_indices)
        larger_mean_price = sum([final_price[i] for i in larger_indices]) / len(larger_indices)
        
        interpolated_price = smaller_mean_price + ((larger_mean_price - smaller_mean_price) / (larger_area - smaller_area)) * (reqArea - smaller_area)
        ans = round(interpolated_price)
        return max(1000, min(ans, 1000000))
    
    if smaller_area is not None and larger_area is None:
        largest_areas = sorted(set(final_area), reverse=True)[:2]
        mean_prices = [np.mean([p for a, p in zip(final_area, final_price) if a == area_i]) for area_i in largest_areas]
        
        extrapolated_price = mean_prices[1] + (reqArea - largest_areas[1]) * (mean_prices[1] - mean_prices[0]) / (largest_areas[1] - largest_areas[0])
        ans = round(extrapolated_price)
        return max(1000, min(ans, 1000000))