如何在 np.roll() 上使用函数,例如 DataFrame.rolling().apply(function) 或 dataframe.rolling().agg(function)?

Posted

技术标签:

【中文标题】如何在 np.roll() 上使用函数,例如 DataFrame.rolling().apply(function) 或 dataframe.rolling().agg(function)?【英文标题】:How to use a function onto np.roll() like DataFrame.rolling().apply(function) or dataframe.rolling().agg(function)? 【发布时间】:2021-12-04 13:52:23 【问题描述】:

我有下面的函数,想把它应用到一个 numpy.roll 上。我在互联网上搜索无济于事,*** 上的大多数 np.roll 解决方案都倾向于展示如何执行滚动功能,但这不是我想要的。

from sklearn.decomposition import PCA

df = pd.DataFrame("A": [1, 2, 3, 4, 5, 6, 7, 8], "B": [2, 3, 4, 5, 6, 7, 8, 9])
df_a = np.array(df)

def first_variance(X):
    pca = PCA(n_components=1)
    pca.fit(X)
    return pca.explained_variance_

np.roll(df_a, 10)

有没有办法像在 pandas df 上一样在这个滚动的 numpy 函数上使用函数?

编辑

对此的预期结果将是结果的时间序列数据框。请忽略数字相同的事实。实际上情况并非如此,只好拿出一些东西来用作演示。

         PCA 1 Expl Var PCA 2 Expl Var  PCA 3 Expl Var  PCA 4 Expl Var  PCA 5 Expl Var
2021-10-01  0.011044    0.004083    0.003389    0.002877    0.002368
2021-10-11  0.011044    0.004083    0.003389    0.002877    0.002368
2021-10-21  0.011044    0.004083    0.003389    0.002877    0.002368
2021-10-31  0.011044    0.004083    0.003389    0.002877    0.002368
2021-11-11  0.011044    0.004083    0.003389    0.002877    0.002368
2021-11-21  0.011044    0.004083    0.003389    0.002877    0.002368
2021-12-01  0.011044    0.004083    0.003389    0.002877    0.002368
2021-12-11  0.011044    0.004083    0.003389    0.002877    0.002368
2021-12-21  0.011044    0.004083    0.003389    0.002877    0.002368
2021-12-31  0.011044    0.004083    0.003389    0.002877    0.002368

我打算把数组变成一个df。当我尝试 df.rolling(3).apply(first_variance) 时,我得到了这个错误:

ValueError: Expected 2D array, got 1D array instead: array=[1. 2. 3.]. Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

所以我决定把它变成一个数组,然后在上面运行滚动函数,然后把数组变成一个df,看起来像上面的样子。

【问题讨论】:

您希望np.roll 做什么?这与df.rolling 完全不同。 我知道它不像 df.rolling,我想知道我是否可以将函数应用于每 10 个值的数组,就像使用 df.rolling(10) 的数据框每 10 行一样。应用(函数)。但我想将 np.roll() 应用于上述代码中的 first_variance(X) 函数。 np.roll` 返回一个新数组。它不会就地执行。 您的示例的预期输出是什么? @Michael Szczesny,我已经更新了代码以展示预期的输出。 【参考方案1】:

pd.rolling 的(几乎)numpy 等效项是 sliding_window_view

from numpy.lib.stride_tricks import sliding_window_view

WINDOWSIZE = 3

# Pandas version
pd_out = df.rolling(WINDOWSIZE).sum()

# Numpy version
np_out = sliding_window_view(df_a, (WINDOWSIZE, df_a.shape[1])).sum(axis=2).squeeze()

输出:

>>> pd_out
      A     B
0   NaN   NaN
1   NaN   NaN
2   6.0   9.0
3   9.0  12.0
4  12.0  15.0
5  15.0  18.0
6  18.0  21.0
7  21.0  24.0

>>> np_out
array([[ 6,  9],
       [ 9, 12],
       [12, 15],
       [15, 18],
       [18, 21],
       [21, 24]])

注意:请注意 numpy 版本缺少 nan,因此行数与原始数组不同。

sliding_window_view的详细信息:

>>> sliding_window_view(df_a, (WINDOWSIZE, df_a.shape[1]))
array([[[[1, 2],
         [2, 3],
         [3, 4]]],


       [[[2, 3],
         [3, 4],
         [4, 5]]],


       [[[3, 4],
         [4, 5],
         [5, 6]]],


       [[[4, 5],
         [5, 6],
         [6, 7]]],


       [[[5, 6],
         [6, 7],
         [7, 8]]],


       [[[6, 7],
         [7, 8],
         [8, 9]]]])

【讨论】:

感谢您的回复。如何将原始代码中的函数first_variance 应用到滚动窗口而不是sum(axis=2) 看看apply_along_axisapply_over_axes 谢谢,感谢您的帮助。虽然它没有用,但我会尝试找到另一种方法。无论如何,感谢您的帮助

以上是关于如何在 np.roll() 上使用函数,例如 DataFrame.rolling().apply(function) 或 dataframe.rolling().agg(function)?的主要内容,如果未能解决你的问题,请参考以下文章

在simulink中求导积分(不是对时间求导积分),例如dA(x)/dx

R语言条形图怎么画

在 PyCharm 中调试时如何避免步入内置函数?

犰狳 - 初始化矩阵并用值填充矩阵

单组学的多变量分析 2.稀疏偏最小二乘判别分析(sPLS-DA)

在用R语言编程中,界面上出现了“+”号,是啥意思?如何删除错误的输入,如何清屏?谢谢