lat
50.63757782
50.6375742
50.6375742
50.6374077762
50.63757782
50.6374077762
50.63757782
50.63757782
我用这些纬度值绘制了一个图,并注意到图中有一个突然的峰值(离群值)。我想用最后三个值的中值替换每个后期值,这样我就可以看到一个有意义的结果
输出可能是lat lat_med
50.63757782 50.63757782
50.6375742 50.6375742
50.6375742 50.6375742
50.63740778 50.6375742
50.63757782 50.6375742
50.63740778 50.6375742
50.63757782 50.6375742
50.63757782 50.6375742
我有数千个这样的后期值,需要使用for循环来解决这个问题。我知道下面的代码有错误,因为我是python的初学者,我很感谢你的帮助来解决这个问题。
for i in range(0,len(df['lat'])):
df['lat_med'][i]=numpy.median(numpy.array(df['lat'][i],df['lat'][i-2]))
我刚刚意识到三个点的中位数计算不符合我的目的,我需要考虑五个值。有没有一种方法可以改变中位数函数,让我想改变多少就改变多少。谢谢你的帮助
def median(a, b, c):
if a > b and a > c:
return b if b > c else c
if a < b and a < c:
return b if b < c else c
return a
从第二个元素到最后一个元素,保存上一个元素和下一个元素的中值。注意,第一个和最后一个元素保持原样。
试试这个:
lat = [50.63757782, 50.6375742, 50.6375742, 50.6374077762, 50.63757782, 50.6374077762, 50.63757782, 50.63757782]
# returns median value out of the three values
def median(a, b, c):
if a > b and a > c:
return b if b > c else c
if a < b and a < c:
return b if b < c else c
return a
# add the first element
filtered = [lat[0]]
for i in range(1, len(lat) - 1):
filtered += [median(lat[i - 1], lat[i], lat[i + 1])]
# add the last element
filtered += [lat[-1]]
print(filtered)
你所做的是一个非常基本的中值过滤器
您似乎正在使用pandas
' Dataframe
结构,所以:
import pandas as pd
import numpy as np
df = pd.DataFrame({'lat' : [50.63757782,
50.6375742,
50.6375742,
50.6374077762,
50.63757782,
50.6374077762,
50.63757782,
50.63757782]})
def replace_values_with_medians(array):
last = array.shape[0]-2
index = 0
result = np.zeros(last)
while index < last:
result[index] = np.median(array[index:index+3])
index += 1
return result
lat_med_df = pd.DataFrame({'lat_med':replace_values_with_medians(df['lat'])})
df = pd.concat([df,lat_med_df], axis = 1)
del lat_med_df
结果:
>>> df
lat lat_med
0 50.637578 50.637574
1 50.637574 50.637574
2 50.637574 50.637574
3 50.637408 50.637408
4 50.637578 50.637578
5 50.637408 50.637578
6 50.637578 NaN
7 50.637578 NaN