Untitled

 avatar
unknown
python
2 years ago
3.3 kB
6
Indexable
def valuation(reqArea, area, price):
    def removeOutliers(areaOut, priceOut):
        area_dict = {}
        duplicates = {}

        for a, p in zip(areaOut, priceOut):
            if a in area_dict:
                area_dict[a].append(p)
            else:
                area_dict[a] = [p]

        newArea = []
        newPrice = []

        for a, prices in area_dict.items():
            if len(prices) == 1:
                newArea.append(a)
                newPrice.append(prices[0])
            else:
                mean_price = sum(prices) / len(prices)
                std_price = np.std(prices)
                for p in prices:
                    if abs(p - mean_price) <= 3 * std_price:
                        newArea.append(a)
                        newPrice.append(p)
                    else:
                        if a in duplicates:
                            duplicates[a][0] += p
                            duplicates[a][1] += 1
                        else:
                            duplicates[a] = [p, 2]

        return newArea, newPrice, duplicates

    if reqArea in area:
        areasEqualed = [price[i] for i, a in enumerate(area) if a == reqArea]
        return int(sum(areasEqualed) / len(areasEqualed))

    uniques_Area = []
    uniques_Price = []
    nonUniques_Area = []
    nonUniques_Price = []

    for a, p in zip(area, price):
        if a not in uniques_Area and a not in nonUniques_Area:
            uniques_Area.append(a)
            uniques_Price.append(p)
        else:
            if a in uniques_Area:
                index = uniques_Area.index(a)
                nonUniques_Area.extend([a, a])
                nonUniques_Price.extend([p, uniques_Price[index]])
                uniques_Area.remove(a)
                uniques_Price.remove(uniques_Price[index])
            else:
                nonUniques_Area.append(a)
                nonUniques_Price.append(p)

    a, b, dp = removeOutliers(nonUniques_Area, nonUniques_Price)
    a += uniques_Area
    b += uniques_Price

    if min(a) < reqArea < max(a):
        y1 = max(i for i in a if i < reqArea)
        y2 = min(i for i in a if i > reqArea)
        y1_price = b[a.index(y1)]
        y2_price = b[a.index(y2)]

        if y1 in dp:
            dpVal = dp[y1]
            y1_price = (y1_price + dpVal[0]) / dpVal[1]

        if y2 in dp:
            dpVal = dp[y2]
            y2_price = (y2_price + dpVal[0]) / dpVal[1]

        ans = y1_price + ((y2_price - y1_price) * (reqArea - y1) / (y2 - y1))
        return int(round(ans))
    else:
        if max(a) < reqArea:
            y1 = max(a)
            y2 = max(i for i in a if i != y1)
            y1_price = b[a.index(y1)]
            y2_price = b[a.index(y2)]
        else:
            y1 = min(a)
            y2 = min(i for i in a if i != y1)
            y1_price = b[a.index(y1)]
            y2_price = b[a.index(y2)]

        if y1 in dp:
            dpVal = dp[y1]
            y1_price = (y1_price + dpVal[0]) / dpVal[1]

        if y2 in dp:
            dpVal = dp[y2]
            y2_price = (y2_price + dpVal[0]) / dpVal[1]

        ans = y2_price + (reqArea - y2) * ((y2_price - y1_price) / (y2 - y1))
        ans = min(max(ans, 1000), 1000000)
        return int(round(ans))
Editor is loading...