我正在尝试创建一个程序,该程序将选择大时间序列数据帧中的行,并仅返回斜率(row2-row1)/(Time2-Time1)>>的行=前两行的斜率(ROW1-ROW0)/(时间1-时间0)。我经历了一些非常繁重的循环操作,只是为了满足循环的程度。
Time A B C
1.731806 NA NA 6.715383
1.794554 NA 6.899219 6.952729
1.79434 6.689599 6.903747 6.860664
1.928432 6.962717 7.126891 7.115988
2.000463 7.226573 7.330078 7.362645
2.090469 7.444833 7.632159 7.575328
2.175347 7.709757 7.836567 7.663173
2.765631 8.904291 8.970686 8.894602
2.905104 9.018817 8.997333 8.97221
2.980718 8.796641 8.793764 8.637462
3.058576 9.050172 9.118444 9.174402
我希望有一个简单的矢量化方法,但我还想更进一步,我希望返回斜率(row3-row2)/(Time3-Time2)> =行之间前两个斜率的平均值([(row2-row1)/(Time2-Time1)] + [row1-row0)/(Time1-Time0)])/ 2或者只是(row2-row0)/(Time2-)时间0)。
数据框也非常大,所以我希望在很多列(A,B,C ...... Z)上迭代这个函数,这就是为什么我希望采用矢量化方法,我不在乎这一切都与整个行动的速度有关。
我非常感谢帮助解决问题的任何部分。它用于在非常大的数据集中省略进入固定相(当斜率下降时)的微生物生长数据。存在NA的FYI数据点是因为我创建了一个行条件来过滤掉微生物生长的滞后期。
非常感谢!!!
答案 0 :(得分:2)
让我们从计算斜率的数据帧开始:
slopes = df.iloc[:, 1:].diff().div(df.Time.diff(), axis=0)
这使用diff
或每行与前一行的差异,并将第一列除以第一列。
我们也可以计算三个时期的斜率。
three_period_slopes = df.iloc[:, 1:].diff(2).div(df.Time.diff(2), axis=0)
现在,您提到为每个列执行此操作,并且您希望它进行矢量化。因此,我们将计算您可以稍后用于切片的真值的数据帧。
gt_prior_slope = slopes >= slopes.shift()
gt_prior_2_slope_avg = slopes >= slopes.rolling(2).mean().shift()
gt_prior_3_period_slope = slopes >= three_period_slopes.shift()
我们像这样使用它们:
df.C[gt_prior_slope.C]
2 6.860664
4 7.362645
7 8.894602
10 9.174402
Name: C, dtype: float64