Python 有没有办法根据点的直线对点进行聚类?
我试图从井口的时间-深度值计算速度,但问题是地球层不一致,层的数量可能因地点而异,因此我需要将数据分组 我试着添加一个索引为separate的列,但这对于大数据来说是行不通的,甚至是不准确的 输入数据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
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
你的问题到底是什么?你有一个代码,它可以工作(即,它返回所需的输出),但你想优化它,对吗?我的观点是:在输入数据中,我通过添加图层列手动分割点,我需要一些根据点的斜率自动分割点的东西。你的问题是什么?你有一个代码,它可以工作(即,它返回所需的输出),但你想优化它,对吗?我的观点是:在输入数据中,我通过添加图层列手动分割点,我需要一些根据点的坡度自动分割点的东西