Я работаю с кривыми растяжения-деформации, которые изначально имеют линейный тренд, после чего тренд меняется от испытания к испытанию. Я пытаюсь найти точку, в которой данные отклоняются от этой первоначальной линейной тенденции - (выделено красной стрелкой на изображении).
import pandas as pd
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
df_input = pd.ExcelFile('data.xlsx')
sheet_names = df_input.sheet_names
dict_of_sheets = {}
for sheet in sheet_names:
dict_of_sheets['data' + sheet] = pd.read_excel(df_input, sheet_name=sheet)
for name,df in dict_of_sheets.items():
df['eff CP'] = df['CP'] - df['PP']
df['axial stress'] = df['eff CP'] + df['Sd']
def fit_func(x, a, b):
return a*x + b
fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(10, 8))
for i, (name, df) in enumerate(dict_of_sheets.items()):
row = i // 2
col = i % 2
y = df['axial stress']
x = df['Axial Strain']
max_y = y.max()
max_row = df.loc[df['axial stress'] == max_y]
max_x = max_row['Axial Strain'].values[0]
label_peak_og = 'Peak stress: {0:.1f} MPa'.format(max_y)
short_df = df[x< 0.15]
stress= short_df['axial stress']
strain = short_df['Axial Strain']
popt, pcov = curve_fit(fit_func, strain, stress)
extended_strain = np.linspace(0, 0.2, 100)
axs[row, col].plot(x, y,zorder=0, label='edited data')
axs[row, col].set_title(name)
axs[row, col].set_xlabel('Strain')
axs[row, col].set_ylabel('Stress')
axs[row, col].scatter(max_x, max_y, color = 'hotpink', marker='^', zorder=1, label=label_peak_og)
axs[row, col].plot(extended_strain, fit_func(extended_strain, *popt), '--', label='Fitted function',zorder=3,)
axs[row, col].legend()
plt.tight_layout()
plt.show()
Я попытался вычислить остатки между данными и подобранным линейным трендом, но поскольку линейный тренд основан на меньшем наборе данных, я не могу вычислить остатки с исходными данными, как массивы имеют разные размеры.
Я работаю с кривыми растяжения-деформации, которые изначально имеют линейный тренд, после чего тренд меняется от испытания к испытанию. Я пытаюсь найти точку, в которой данные отклоняются от этой первоначальной линейной тенденции - (выделено красной стрелкой на изображении).
Пока у меня есть этот код: [code]import pandas as pd import matplotlib.pyplot as plt from scipy.optimize import curve_fit
df_input = pd.ExcelFile('data.xlsx')
sheet_names = df_input.sheet_names dict_of_sheets = {} for sheet in sheet_names: dict_of_sheets['data' + sheet] = pd.read_excel(df_input, sheet_name=sheet)
for name,df in dict_of_sheets.items(): df['eff CP'] = df['CP'] - df['PP'] df['axial stress'] = df['eff CP'] + df['Sd']
plt.tight_layout() plt.show() [/code] Я попытался вычислить остатки между данными и подобранным линейным трендом, но поскольку линейный тренд основан на меньшем наборе данных, я не могу вычислить остатки с исходными данными, как массивы имеют разные размеры.