下面的output
列是我试图计算的内容,而diffs
列是对求和以计算output
的差异的解释。
+------------+--------+-------------+
| date | output | diffs |
+------------+--------+-------------+
| 01/01/2000 | | |
| 10/01/2000 | 9 | [9] |
| 20/01/2000 | 29 | [10, 19] |
| 25/01/2000 | 44 | [5, 15, 24] |
+------------+--------+-------------+
我考虑过使用rolling
,然后根据当前窗口中的最后一条记录,在每个窗口中为diff创建一个新列,然后对其求和。然而,rolling
似乎没有能力在DataFrame的开头进行修复。我想我可以计算最短日期和最长日期之间的差异,并将其用作滚动期,但这似乎很难。
我也看过expanding
,但随着窗口的扩展,我看不到创建新diff的方法。
有没有一个非循环的,希望是可向量化的解决方案?
这是数据帧:
import pandas as pd
import numpy as np
df = pd.DataFrame(
{
'date': (
dt.datetime(2000, 1, 1), dt.datetime(2000, 1, 10),
dt.datetime(2000, 1, 20), dt.datetime(2000, 1, 25),
),
'output': (np.NaN, 9, 29, 44),
}
)
如果您正在寻找输出,请尝试:
datediff = df.date.diff()/pd.Timedelta('1D')
df['output'] = (datediff * np.arange(len(df))).cumsum()
输出:
date output
0 2000-01-01 NaN
1 2000-01-10 9.0
2 2000-01-20 29.0
3 2000-01-25 44.0
我把它交给你来搞清楚背后的逻辑。
使用numpy
广播而不循环:
i = df.date.dt.day.values
j = np.arange(len(df))
df['output'] = np.triu(np.where((j < j[:, None]), i, (i - i[:, None]))).sum(axis = 0)