Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 发现非常高的多峰元素,剩下的低峰_Python_Python 3.x_Data Analysis_Peak Detection - Fatal编程技术网

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)]