Python 有没有办法根据点的直线对点进行聚类?

Python 有没有办法根据点的直线对点进行聚类?,python,pandas,dataframe,data-science,Python,Pandas,Dataframe,Data Science,我试图从井口的时间-深度值计算速度,但问题是地球层不一致,层的数量可能因地点而异,因此我需要将数据分组 我试着添加一个索引为separate的列,但这对于大数据来说是行不通的,甚至是不准确的 输入数据 Depth_M Time_Msec Layer 0 0 0.0 0 1 3 5.0 0 2 6 10.5 0 3 9 13.0 1

我试图从井口的时间-深度值计算速度,但问题是地球层不一致,层的数量可能因地点而异,因此我需要将数据分组 我试着添加一个索引为separate的列,但这对于大数据来说是行不通的,甚至是不准确的

输入数据

    Depth_M  Time_Msec  Layer
0         0        0.0      0
1         3        5.0      0
2         6       10.5      0
3         9       13.0      1
4        12       16.5      1
5        15       20.5      1
6        20       24.0      2
7        25       26.0      2
8        30       28.5      2
9        35       31.5      2
10       40       34.0      2
我的尝试是:

import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import linregress

df = pd.read_csv('1HOLE.csv', sep=",")
gk = df.groupby('Layer')
fig = plt.figure(facecolor='#BAD7F2', edgecolor='#F2BAC9')
df_new = df[['Time_Msec', 'Depth_M']]

df["S1"] = (df.Depth_M.diff() / df.Time_Msec.diff())*1000
df["S2"] = (df.Depth_M.diff(2) / df.Time_Msec.diff(2))*1000
print(df)

for i, x in gk:
    slope, intercept, r_value, p_value, std_err = linregress(x.Time_Msec, x.Depth_M)
    Velocity = round((slope*1000), 2)
    print("Layer: %s | Velocity: %s" % (i, Velocity))
    plt.plot(x.Time_Msec, intercept + slope*x.Time_Msec, 'r--')
    plt.scatter(x.Time_Msec, x.Depth_M, color='b')

plt.ylim((df.Depth_M.min(), df.Depth_M.max()))
plt.xlim((df.Time_Msec.min(), df.Time_Msec.max()))
plt.gca().invert_yaxis()
plt.show()
我得到了结果

    Depth_M  Time_Msec  Layer           S1           S2
0         0        0.0      0          NaN          NaN
1         3        5.0      0   600.000000          NaN
2         6       10.5      0   545.454545   571.428571
3         9       13.0      1  1200.000000   750.000000
4        12       16.5      1   857.142857  1000.000000
5        15       20.5      1   750.000000   800.000000
6        20       24.0      2  1428.571429  1066.666667
7        25       26.0      2  2500.000000  1818.181818
8        30       28.5      2  2000.000000  2222.222222
9        35       31.5      2  1666.666667  1818.181818
10       40       34.0      2  2000.000000  1818.181818
Layer: 0 | Velocity: 571.0
Layer: 1 | Velocity: 798.82
Layer: 2 | Velocity: 1952.53

你的问题到底是什么?你有一个代码,它可以工作(即,它返回所需的输出),但你想优化它,对吗?我的观点是:在输入数据中,我通过添加图层列手动分割点,我需要一些根据点的斜率自动分割点的东西。你的问题是什么?你有一个代码,它可以工作(即,它返回所需的输出),但你想优化它,对吗?我的观点是:在输入数据中,我通过添加图层列手动分割点,我需要一些根据点的坡度自动分割点的东西