【发布时间】:2020-07-24 06:35:59
【问题描述】:
我有两个列表,一个是区域,一个是价格,它们大小相同。
例如: 面积 = [1500,2000,2000,1800,2000,1500,500] 价格 = [200,800,600,800,1000,750,200]
我需要返回每个独特区域的价格列表,不包括原始区域。
所以对于 1500,我需要返回的列表是:[750] 和 [200] 对于 2000,我需要返回的列表是 [600,1000]、[800,1000] 和 [800,600] 对于 1800 和 500,我需要返回的列表都是空列表 []。
然后目标是确定一个值是否是异常值,取决于价格的绝对值 - 均值(不包括价格本身)小于 5 * 总体标准差(计算不包括价格本身)
import statistics
area = [1500,2000,2000,1800,2000,1500,500]
price = [200,800,600,800,1000,750,200]
outlier_idx = []
for idx, val in enumerate(area):
comp_idx = [i for i, x in enumerate(area) if x == val]
comp_idx.remove(idx)
comp_price = [price[i] for i in comp_idx]
if len(comp_price)>2:
sigma = statistics.stdev(comp_price)
p_m = statistics.mean(comp_price)
if abs(price[idx]-p_m) > 5 * sigma:
outlier_idx.append(idx)
area = [i for j, i in enumerate(area) if j not in outlier_idx]
price = [i for j, i in enumerate(price) if j not in outlier_idx]
问题是这个计算占用了大量时间,而且我正在处理可能非常大的数组。
我对如何提高计算效率感到困惑。
我愿意使用 numpy、pandas 或任何其他常见的包。
另外,我已经在pandas中尝试过这个问题:
df['p-p_m'] = ''
df['sigma'] = ''
df['outlier'] = False
for name, group in df.groupby('area'):
if len(group)>1:
idx = list(group.index)
for i in range(len(idx)):
tmp_idx = idx.copy()
tmp_idx.pop(i)
df['p-p_m'][idx[i]] = abs(group.price[idx[i]] - group.price[tmp_idx].mean())
df['sigma'][idx[i]] = group.price[tmp_idx].std(ddof=0)
if df['p-p_m'][idx[i]] > 3*df['sigma'][idx[i]]:
df['outlier'][idx[i]] = True
谢谢。
【问题讨论】:
标签: python python-3.x pandas performance numpy