Python Pandas:从数据框中查找导数

4

我的数据框长这样:

                     date     time   sym        ask0        ask1        ask2  
0     2017-08-21 07:00:00 07:00:00   7YR  100.812500  100.828125  100.843750   
1     2017-08-21 07:00:15 07:00:15   7YR  100.812500  100.828125  100.843750   
2     2017-08-21 07:00:30 07:00:30   7YR  100.812500  100.828125  100.843750   
3     2017-08-21 07:00:45 07:00:45   7YR  100.812500  100.828125  100.843750   
4     2017-08-21 07:01:00 07:01:00   7YR  100.812500  100.828125  100.843750   
5     2017-08-21 07:01:15 07:01:15   7YR  100.812500  100.828125  100.843750   
6     2017-08-21 07:01:30 07:01:30   7YR  100.812500  100.828125  100.843750   
7     2017-08-21 07:01:45 07:01:45   7YR  100.812500  100.828125  100.843750   
8     2017-08-21 07:02:00 07:02:00   7YR  100.812500  100.828125  100.843750   
9     2017-08-21 07:02:15 07:02:15   7YR  100.812500  100.828125  100.843750   
10    2017-08-21 07:02:30 07:02:30   7YR  100.812500  100.828125  100.843750   
11    2017-08-21 07:02:45 07:02:45   7YR  100.828125  100.843750  100.859375   
12    2017-08-21 07:03:00 07:03:00   7YR  100.812500  100.828125  100.843750   
13    2017-08-21 07:03:15 07:03:15   7YR  100.828125  100.843750  100.859375   
14    2017-08-21 07:03:30 07:03:30   7YR  100.828125  100.843750  100.859375   
15    2017-08-21 07:03:45 07:03:45   7YR  100.828125  100.843750  100.859375   
16    2017-08-21 07:04:00 07:04:00   7YR  100.828125  100.843750  100.859375   
17    2017-08-21 07:04:15 07:04:15   7YR  100.828125  100.843750  100.859375   
18    2017-08-21 07:04:30 07:04:30   7YR  100.828125  100.843750  100.859375   
19    2017-08-21 07:04:45 07:04:45   7YR  100.828125  100.843750  100.859375   
20    2017-08-21 07:05:00 07:05:00   7YR  100.828125  100.843750  100.859375   
21    2017-08-21 07:05:15 07:05:15   7YR  100.828125  100.843750  100.859375   
22    2017-08-21 07:05:30 07:05:30   7YR  100.828125  100.843750  100.859375 

我想计算导数:

d = d(ask0)/dt

其中 dt = 2 分钟。

例如,

t = 2017-08-21 07:04:30 07:04:30    ask@t=100.828125 
t-1 =  2017-08-21 07:04:30 07:02:30  ask@t-1=100.812500
dask/dt = (100.828125-100.812500)/2 = 0.0078125

我知道可以通过迭代数据框中的每一行来完成此操作。但我想知道是否有Pandas函数可以完成这项工作。

d['ask0'] = d['ask0']/dt? - DJK
我认为你想要 d.ask0.diff() / dt - cs95
那样行不通... d = y2-y1 / dt 我需要一种获取 y1 的方法 - Chris Johnson
但我需要与2分钟前的差异。d.ask0.diff() / dt将计算前一行中的差异。 - Chris Johnson
4个回答

3

第一步是确保date是一个datetime

df.date = pd.to_datetime(df.date)

解决方案

df.set_index('date').ask0.rolling('121s').apply(lambda x: x[-1] - x[0]) / 2

date
2017-08-21 07:00:00    0.000000
2017-08-21 07:00:15    0.000000
2017-08-21 07:00:30    0.000000
2017-08-21 07:00:45    0.000000
2017-08-21 07:01:00    0.000000
2017-08-21 07:01:15    0.000000
2017-08-21 07:01:30    0.000000
2017-08-21 07:01:45    0.000000
2017-08-21 07:02:00    0.000000
2017-08-21 07:02:15    0.000000
2017-08-21 07:02:30    0.000000
2017-08-21 07:02:45    0.007812
2017-08-21 07:03:00    0.000000
2017-08-21 07:03:15    0.007812
2017-08-21 07:03:30    0.007812
2017-08-21 07:03:45    0.007812
2017-08-21 07:04:00    0.007812
2017-08-21 07:04:15    0.007812
2017-08-21 07:04:30    0.007812
2017-08-21 07:04:45    0.000000
2017-08-21 07:05:00    0.007812
2017-08-21 07:05:15    0.000000
2017-08-21 07:05:30    0.000000
Name: ask0, dtype: float64

2

首先,确保日期是一个datetime Series: df.date = to_datetime(df.date)。使用df.set_index('date')将该系列设置为数据框的索引。然后使用15秒步长重新采样数据框并进行插值:

resampled = d.resample('15s').interpolate()

现在所有的行都处于相同的时间距离,两分钟前的行是向后移动了8个位置的行。
resampled['deriv'] = (resampled['ask0'] - resampled['ask0'].shift(8))/2

可能会。这取决于原始数据集。 - DYZ
ValueError: cannot reindex from a duplicate axis - Chris Johnson
但是你是否将日期时间列设置为索引? - DYZ
现在我正在使用一个For循环... 但是执行时间几乎为10分钟,针对12,000行... - Chris Johnson
@DYZ 是的,日期时间列是索引。 - Chris Johnson

1
如果您的数据是每15秒为一个时间序列,您可以执行以下操作:
d['deriv'] = (d['ask0'] - d['ask0'].shift(8))/2

接近了,但那仍然不起作用,因为它并不总是在同一天。如果有一种方法可以用“datetime”而不是行数来表示.shift()就好了。 - Chris Johnson

0
你可以创建先前的时间戳,并将df与自身合并。
大致如此(这里针对你发布的示例中的read_clipboard()进行调整):
import pandas as pd
data = pd.read_clipboard()
data.reset_index(inplace=True)

data['combined_date'] =pd.to_datetime(data.level_1+' '+data.date)
data['prev_dt'] = data.combined_date - pd.to_timedelta(2,'m')
new_data = data.merge(data,left_on='prev_dt', right_on='combined_date')[['combined_date_x', 'comm'bined_date_y', 'ask0_x', 'ask0_y']]
new_data['deriv'] = (new_data.ask0_x - new_data.ask0_y)/2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接