Python 发现非常高的多峰元素,剩下的低峰
我有一堆值存储在一个数组中,我需要找到最高峰。我尝试使用以下代码:Python 发现非常高的多峰元素,剩下的低峰,python,python-3.x,data-analysis,peak-detection,Python,Python 3.x,Data Analysis,Peak Detection,我有一堆值存储在一个数组中,我需要找到最高峰。我尝试使用以下代码: arr=["values"] n=len(arr) if arr == []: print (pos) Diff = [] for i in range(0,n-1): if arr[i]< arr[i+1]: Diff.append(1) elif arr[i] == arr[i+1]: Diff.append(0) if arr[i] > a
arr=["values"]
n=len(arr)
if arr == []:
print (pos)
Diff = []
for i in range(0,n-1):
if arr[i]< arr[i+1]:
Diff.append(1)
elif arr[i] == arr[i+1]:
Diff.append(0)
if arr[i] > arr[i+1]:
Diff.append(-1)
pos = []
peaks = []
j = 0
for i in range(0,n-2):
if Diff[i] == 1 and Diff[i+1] == -1:
pos.append(i+1)
peaks.append(arr[i+1])
if Diff[i] == 1 and Diff[i+1] == 0:
if Diff[i+1:] == [Diff[i+1]]:
break
j = i+1
while(Diff[j] == 0 and j < n-2):
j = j+1
if Diff[j] == -1:
pos.append(i+1)
peaks.append(arr[i+1])
print (pos)
print (peaks)
请提供帮助。首先,将字符串列表转换为numpy数组或熊猫系列:
将熊猫作为pd导入
s=pd.Series(A).aType(int)
其次,识别所有极值(例如分布的极值1%),然后通过连续值(峰值)最终获得最大值。我们可以很容易地识别具有以下特征的连续组:
从更多工具导入连续的组
grp_峰值=连续_组(s[s>=s分位数(.99)]。指数)
max_peaks=[s[grp].idxmax()表示grp_peaks中的grp]
打印(s[最大峰值])
输出:
372 6688
787 6688
1132 6686
1547 6690
1963 6690
2378 6686
2793 6695
dtype: int64
数据可视化:
导入matplotlib.pyplot作为plt
plt.图(figsize=(12,8))
plt.plt(s,marker='o')
#设置一条线,划定分布的极端1%值
plt.axhline(y=s.quantile(.99),color='r',linestyle='-->)
#确定每个峰值的最大值
plt.plt(s[max_peaks],color='r',marker='o',linestyle='None')
plt.show()
在不导入任何库的情况下再现上述结果的方法:
#将字符串列表转换为整数并获取相应的索引
A=列表(映射(int,A))
idx=范围(透镜(A))
#计算经验p值以获得峰值
pval=[1-和([i>=j表示A中的j])/(len(A)+1表示A中的i]
#确定极值(峰值)
stat_pval=[idx代表idx,枚举中的p(pval)如果p这里的峰值是什么?最大值?@Sophos-是的,数组中的这些值有不规则的变化。我需要找出该范围内的最大值。因为这些数据值是5000-8000。我最多需要最大值。那么您提供的示例数组的预期结果是什么?因此,基本上,它只是最大值,对吗!?因为您提到的值范围已经在发行版的顶部。@Sophos-预期值是6900-8000,这些最大值出现的次数超过2-3次谢谢,这很有效。有没有其他方法不使用库来获取最大值。是的,但它需要更多的代码,而且可能需要更少的代码同样有效。你不想使用任何库吗?不管怎样,我现在就离开这里。但稍后我可以提供一种只使用内置函数的方法…@GotCrasiness,有几种方法可以在不导入任何库的情况下复制此代码(尽管我强烈建议使用numpy)。我已经用一种可能的方法编辑了答案。希望能有所帮助!它对我很好(使用您的数据)。也许您需要采取一种逐步的方法来识别错误。很高兴提供帮助!祝您好运!
372 6688
787 6688
1132 6686
1547 6690
1963 6690
2378 6686
2793 6695
dtype: int64
[6688, 6688, 6686, 6690, 6690, 6686, 6695]
[(372, 6688),
(787, 6688),
(1132, 6686),
(1547, 6690),
(1963, 6690),
(2378, 6686),
(2793, 6695)]