У меня есть некоторые шумные данные, из которых я хочу найти максимум второй производной. Я пытаюсь сравнить: использование скользящего среднего для сглаживания данных, а затем сделать вторую производную; с помощью метода, найденного в этом ответе: Градиент в шумных данных, python .
Однако результаты, полученные от сплайнов SciPy, очень плохие. Как изменить параметры, чтобы получить лучший результат?
Пример со скользящим средним и np.gradient
Пример с использованием метода scipy spline
Я сделал колаб со всей программой здесь: https://github.com/leoUninova/for-stack-excahgne/blob/master/Derivative_fit.ipynb
Это глава моего набора данных
VG absID Name
1520 -2.00 1.264000e-11 20-10-300-350-0.00032-2e-05
1521 -1.95 1.246200e-11 20-10-300-350-0.00032-2e-05
1522 -1.90 9.462000e-12 20-10-300-350-0.00032-2e-05
1523 -1.85 1.198000e-11 20-10-300-350-0.00032-2e-05
1524 -1.80 1.201800e-11 20-10-300-350-0.00032-2e-05
Вот код
#@title derivative plot functions
#importing packages
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import splrep, splev
#plot functions
def plotvtlin(data):
'''Derivative calculated using rolling to smooth the curve
and then numpy.gradient twice.
'''
if data.empty:
print ('passed empty dataframe for stab')
return ('end') #exiting the loop
data.drop_duplicates(subset='VG', keep='first', inplace=True) #https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop_duplicates.html
ID_roll = data.absID.rolling(window=5).mean()
#derivatives
grad_roll=np.gradient(ID_roll, data.VG)
grad_roll2=np.gradient(grad_roll, data.VG)
#VG value where second derivative is max
VT=data.VG.iloc[np.nanargmax(grad_roll2)]
fig, ax = plt.subplots(figsize=(6, 4))
ax2 = ax.twinx()
ax.plot((data.VG),(data.absID))
ax.axvline(VT)
ax2.plot(data.VG, grad_roll2, linestyle='--', color='red')
plt.show()
def univariatefunction (data, K, S):
'''Gradient for noisy data using spline method
https://stackoverflow.com/questions/15862066/gradient-in-noisy-data-python
'''
x=np.array(data.VG)
noisy_data=np.array(data.absID)
fig, ax = plt.subplots(figsize=(6, 4))
ax2 = ax.twinx()
f = splrep(x,noisy_data,k=5,s=3)
ax.plot(x, noisy_data, label="noisy data")
ax2.plot(x, splev(x,f,der=2), label="2nd derivative", linestyle='--', color='red')
plt.hlines(0,0,2)
plt.legend(loc=0)
plt.show()
#@title derivative plots main
#load the data
url='https://raw.githubusercontent.com/leoUninova/for-stack-excahgne/master/one.csv'
df1=pd.read_csv(url)
df1 = df1[df1.Curve == 'Transfer stab']
#make dataset smaller so it's easier to plot
names=list(df1.Name.unique()[:10])
df1 = df1[df1['Name'].isin(names)]
for i, name in enumerate (names):
df2=df1.loc[df1.Name==name]
plotvtlin(df2)
univariatefunction (df2, K=3, S=5)