Python 熊猫数据集的导数

Python 熊猫数据集的导数,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个循环数据集(图和下面的数据),我试图取dy/dt的导数。我想要每个周期(上升)的导数,而不仅仅是像我在这里所做的每个点。部分问题在于样本的日期时间间隔不均匀。理想情况下,我想得到每个周期从最小到最大的斜率。这是一个理想的情况,我的整个数据集都有噪声,每个周期的斜率不一定与这个建模集相同 数据看起来是这样的 time,y 12/15/18 01:10 AM,130352.146180556 12/16/18 01:45 AM,130355.219097222 12/17/18 01:47

我有一个循环数据集(图和下面的数据),我试图取dy/dt的导数。我想要每个周期(上升)的导数,而不仅仅是像我在这里所做的每个点。部分问题在于样本的日期时间间隔不均匀。理想情况下,我想得到每个周期从最小到最大的斜率。这是一个理想的情况,我的整个数据集都有噪声,每个周期的斜率不一定与这个建模集相同

数据看起来是这样的

time,y
12/15/18 01:10 AM,130352.146180556
12/16/18 01:45 AM,130355.219097222
12/17/18 01:47 AM,130358.223263889
12/18/18 02:15 AM,130361.281701389
12/19/18 03:15 AM,130364.406597222
12/20/18 03:25 AM,130352.427430556
12/21/18 03:27 AM,130355.431597222
12/22/18 05:18 AM,130358.663541667
12/23/18 06:44 AM,130361.842430556
12/24/18 07:19 AM,130364.915243056
12/25/18 07:33 AM,130352.944409722
12/26/18 07:50 AM,130355.979826389
12/27/18 09:13 AM,130359.153472222
12/28/18 11:53 AM,130362.4871875
12/29/18 01:23 PM,130365.673263889
12/30/18 02:17 PM,130353.785763889
12/31/18 02:23 PM,130356.798263889
01/01/19 04:41 PM,130360.085763889
01/02/19 05:01 PM,130363.128125
这是我的密码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plot
from datetime import date, timedelta
import datetime

df=pd.read_csv('saw_data.csv') 
df['time']=pd.to_datetime(df['time'])
将日期时间设置为索引

df.set_index(df['time'], inplace=True) 
这里我试图找到每个数据点之间的时间间隔

df['Time_diff'] = pd.to_timedelta(df['time']-df['time'].shift()).dt.total_seconds().div(60)
#I believe units are minutes. For 'y' row 0 to 1, the diff is ~3 in about a day (86400 sec)
# so 3/86400 x 60 sec/min yields similar result to slope of 0.002 #/min.
“时间差”来自SO post:

假设这是导数

df['slope']=np.gradient(df['y'],1)/df['Time_diff']
以下是结果

print(df.head())

                                   time              y  Time_diff     slope
time                                                                       
2018-12-15 01:10:00 2018-12-15 01:10:00  130352.146181        NaN       NaN
2018-12-16 01:45:00 2018-12-16 01:45:00  130355.219097     1475.0  0.002060
2018-12-17 01:47:00 2018-12-17 01:47:00  130358.223264     1442.0  0.002102
2018-12-18 02:15:00 2018-12-18 02:15:00  130361.281701     1468.0  0.002106
2018-12-19 03:15:00 2018-12-19 03:15:00  130364.406597     1500.0 -0.002951
这是数据集图片


好的,下面的代码假设您只是使用经典的“尺和笔”方法来获得梯度(表示为“m”)——即y距离/x距离,从每个点之间的坐标差获得

下面的代码将为您提供正梯度(我假设这是您想要的)。如果需要负渐变(即直线朝相反方向倾斜),则需要稍微调整shift()方法

import pandas as pd
import numpy as np
import matplotlib.pyplot as plot
from datetime import date, timedelta
import datetime, time

df=pd.read_csv('saw_data.csv')
df['time']=pd.to_datetime(df['time'])
df.set_index(df['time'], inplace=True)

df['Time_diff'] = pd.to_timedelta(df['time']-df['time'].shift()).dt.total_seconds().div(60)
df['slope']=np.gradient(df['y'],1)/df['Time_diff']
#df['y_diff'] = pd.to_timedelta(df['y']-df['y'].shift()).dt.total_seconds().div(60)

df['time+1']=df['time'].shift()
df['y+1']=df['y'].shift()
df['y_diff'] = df['y'] - df['y+1']
df['m']= df['y_diff']/df['Time_diff']

你是说你想得到图中每一条线的梯度吗?是的,基本上。你可能在寻找梯度方面比我做得更好,我得到了类似的结果。我希望能找到每一个正的梯度,所以(ytop ybottom)/dt。这就是结果。你必须更清楚地解释你的问题,以获得更有成效的帮助。