Я пытаюсь рассчитать скорость по значениям Time-Depth от скважины, но проблема в том, что слои земли не согласованы, и количество слоев может варьироваться от места к другим, поэтому мне нужно разделить данные на группы, которые я пытался добавить столбец с индексом для разделения, но это не сработает для больших данных и даже не точных
входных данных
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
enter image description here