gpt4 book ai didi

python - 从 Pandas 中的滚动窗口生成值组合

转载 作者:太空狗 更新时间:2023-10-30 01:04:33 25 4
gpt4 key购买 nike

对于我的数据框中的每一行,我需要创建 a 列的两个值的每个组合,从结束于该行的三天滑动窗口。我的数据框是这样的:

import pandas as pd    
df = pd.DataFrame({'a': [1, 2, 3, 4, 5]},
index=[pd.Timestamp('20180101'),
pd.Timestamp('20180102'),
pd.Timestamp('20180103'),
pd.Timestamp('20180105'),
pd.Timestamp('20180106')])

请注意,时间索引参差不齐(行之间的间隔不一致)。组合应该是:

row0: None
row1: [(1, 2)]
row2: [(1, 2), (1, 3), (2, 3)]
row4: [(3, 4)]
row5: [(4, 5)]

在没有窗口的情况下我可以很容易地做到这一点,只需使用itertools.combinations生成 a 列的两个元素的每个组合:

import itertools as it
combos = it.combinations(df['a'], 2)
for c in combos:
print(c)
# (1, 2)
# (1, 3)
# (1, 4)
# (1, 5)
# etc.

但我的应用程序需要窗口版。到目前为止我最好的选择是使用 df.rolling .我可以做一些简单的事情,比如在三天的窗口中总结元素,比如:

df.rolling('3d').sum()
# get [1, 3, 6, 7, 9] which we expect

但我似乎无法在滚动窗口上执行更复杂的操作(或从操作中返回比实数更复杂的类型)。


问题

如何使用 df.rolling 在我的滚动窗口上进行组合?还是有其他工具可以做到这一点?


尝试

到目前为止,我的想法是有一些方法可以使用 df.rollingdf.apply 以及 it.combinations 来生成我的数据框中每个窗口的迭代器,然后将该迭代器插入我的数据框中的新列。像这样的东西:

df.rolling('3d').apply(lambda x: it.combinations(x, 2))

它给出了一个TypeError:

TypeError: must be real number, not itertools.combinations

因为df.rolling.apply要求其参数返回单个实际值,而不是对象或列表。

我也试过直接在滚动窗口上使用it.combinations:

it.combinations(df.rolling('3d'), 2)

给出:

KeyError: 'Column not found: 0'

如果我明确选择 a 列:

it.combinations(df.rolling('3d')['a'], 2)

我得到:

Exception: Column(s) a already selected

那么有没有一种方法可以定义一个函数,我可以用 df.apply 调用它,将滚动窗口上的迭代器插入到数据帧每一行的新列中?我什至可以在传递给 apply 的函数中对当前行以外的行进行操作吗?

最佳答案

好吧,这是一个 hack,但它可能会有用。

我们要做的就是重用 df.rolling 的窗口工具。我们可以尝试查看代码的一些非公共(public)部分,但我们只是利用这样一个事实:我们可以在返回 float 之前强制在 apply 中调用函数:

In [28]: dummy = df.rolling("3d")["a"].apply((lambda x: print(x) or 0), raw=False)
2018-01-01 1.0
dtype: float64
2018-01-01 1.0
2018-01-02 2.0
dtype: float64
2018-01-01 1.0
2018-01-02 2.0
2018-01-03 3.0
dtype: float64
2018-01-03 3.0
2018-01-05 4.0
dtype: float64
2018-01-05 4.0
2018-01-06 5.0
dtype: float64

所以:

In [29]: roll_slices = []

In [30]: dummy = df.rolling("3d")["a"].apply((lambda x: roll_slices.append(list(combinations(x, 2))) or 0), raw=False)

In [31]: roll_slices
Out[31]:
[[],
[(1.0, 2.0)],
[(1.0, 2.0), (1.0, 3.0), (2.0, 3.0)],
[(3.0, 4.0)],
[(4.0, 5.0)]]

之后你就可以做你喜欢的事了。

关于python - 从 Pandas 中的滚动窗口生成值组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50824915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com