我正在处理一个形成钟形(正态)分布的数据集.我试图在这个分发中找到三个具体的点:

  1. 曲线上升前的第一个极小点.
  2. 曲线的峰值(最大点).
  3. 当曲线在峰值之后下降时,第二个最小值.

挑战在于我的曲线尾部的"最小"点没有很好地定义(数据变平了),所以很难准确地识别这些点.我明白,对于第一个最小值,我可能需要找出曲线从哪里开始上升(其中一阶导数从负变为正),对于第二个最小值,在峰值之后,曲线从哪里开始下降(其中一阶导数从正变为负).

The following is the graph, and the data is: enter image description here

以下是我的数据在加载Pandas 后的简化 struct :

# ... (data loading code) ...
print(df.head())

Y轴值:

0    0.000006775275118
1    0.000002841071152
2    0.000002331050869
3    0.000002098089639
4    0.000001958793763
5    0.000001882957831
6    0.000001817511261
7    0.000001778793930
8    0.000001747600657
9    0.000001726581760
10   0.000001736836910
11   0.000001725393807
12   0.000001735801905
13   0.000001722637070
14   0.000001749210289
15   0.000001743336865
16   0.000001773540895
17   0.000001758737558
18   0.000001792945553
19   0.000001789850672
20   0.000001779160328
21   0.000001807576901
22   0.000001808267621
23   0.000001818196607
24   0.000001811775275
25   0.000001818907290
26   0.000001807848091
27   0.000001836718285
28   0.000001808366208
29   0.000001808187769
30   0.000001782767490
31   0.000001769246699
32   0.000001775707035
33   0.000001759920903
34   0.000001737253676
35   0.000001722037872
36   0.000001727249139
37   0.000001693093662
38   0.000001701267438
39   0.000001692311112
40   0.000001678170239
41   0.000001661488536
42   0.000001668086770
43   0.000001667761220
44   0.000001662043200
45   0.000001667680139
46   0.000001659051206
47   0.000001708371198
48   0.000001732222077
49   0.000001774399919
50   0.000001876523600
51   0.000002025685347
52   0.000002259535699
53   0.000002560415994
54   0.000003055340098
55   0.000003727916538
56   0.000004705124476
57   0.000005971950809
58   0.000007664882924
59   0.000009665827809
60   0.000012083860418
61   0.000014769510653
62   0.000017550004674
63   0.000020119588986
64   0.000022386885842
65   0.000024171012583
66   0.000025206126640
67   0.000025491871789
68   0.000024878712706
69   0.000023424992853
70   0.000021276252458
71   0.000018607410922
72   0.000015824313725
73   0.000012923828210
74   0.000010311275904
75   0.000008025889954
76   0.000006292151302
77   0.000004904108668
78   0.000003974381668
79   0.000003333372577
80   0.000002833383398
81   0.000002537387898
82   0.000002308652989
83   0.000002216008051
84   0.000002145439742
85   0.000002146526344
86   0.000002167240574
87   0.000002248661389
88   0.000002323548464
89   0.000002430060014
90   0.000002537689493
91   0.000002347846822
Name:  diff_current, dtype: float64

我目前正在使用来自SciPy的find_peaks函数来定位https://stackoverflow.com/a/56812929/10543310之后的峰值和最小值(通过反转y值).但我仍然不能只得到第一分钟、峰值和第二分钟的值.

有没有人能指导我如何辨别这三点?任何逻辑或代码方面的帮助都将不胜感激.

推荐答案

只需根据最大值的位置进行切片:

peak = data.argmax()
print(f'Maximum: {data[peak]} at {peak}')
print(f'Left minimum: {data[:peak].min()}')
print(f'Right minimum: {data[peak:].min()}')          
Maximum: 2.5491871789e-05 at 67
Left minimum: 1.659051206e-06
Right minimum: 2.145439742e-06

Python相关问答推荐

列表上值总和最多为K(以O(log n))的最大元素数

如何在Python中将returns.context. DeliverresContext与Deliverc函数一起使用?

输出中带有南的亚麻神经网络

管道冻结和管道卸载

为什么默认情况下所有Python类都是可调用的?

如何使用pytest来查看Python中是否存在class attribution属性?

OR—Tools CP SAT条件约束

将tdqm与cx.Oracle查询集成

SQLAlchemy Like ALL ORM analog

Python+线程\TrocessPoolExecutor

不允许访问非IPM文件夹

CommandeError:模块numba没有属性generated_jit''''

如何在Python中使用另一个数据框更改列值(列表)

处理具有多个独立头的CSV文件

ModuleNotFoundError:Python中没有名为google的模块''

如何提高Pandas DataFrame中随机列 Select 和分配的效率?

如何写一个polars birame到DuckDB

对于标准的原始类型注释,从键入`和`从www.example.com `?

PYTHON中的selenium不会打开 chromium URL

Pandas:使列中的列表大小与另一列中的列表大小相同