如何在 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_axis
和apply_over_axes
谢谢,感谢您的帮助。虽然它没有用,但我会尝试找到另一种方法。无论如何,感谢您的帮助以上是关于如何在 np.roll() 上使用函数,例如 DataFrame.rolling().apply(function) 或 dataframe.rolling().agg(function)?的主要内容,如果未能解决你的问题,请参考以下文章
在simulink中求导积分(不是对时间求导积分),例如dA(x)/dx