[英]Pandas rolling changing index to "on" column in 1.4.2?
我已经滚动了自己的代码,让我可以根据时间偏移找到数据帧的所有窗口,这样我以后就可以将函数应用于整个数据帧(与 pandas 中的 vanilla .rolling() 函数相比,它在单个列上运行一次。)我从另一个问题的有用答案中获得灵感。
该解决方案在我的一个环境(使用 pandas 1.3.0 的十六进制笔记本)中按预期工作,但在另一个环境中不起作用(使用 pandas 1.4.2 的 pycharm)。
编辑将我的 pycharm 版本回滚到 1.3.0 后,它按预期工作,所以它要么是在 1.3.0 和 1.4.2 之间引入的东西,要么是我机器上的安装损坏。
关键代码是:
def perform_rolling(df: pd.DataFrame, my_windows: list[tuple]):
group_id = df[grouping_field_name].unique()[0]
dfc = df.reset_index(drop=True)
dfc.drop([grouping_field_name], inplace=True, axis=1)
dfc.rolling(time_offset, on=time_field_name).apply(assign_windows, kwargs={'my_df': dfc, 'my_windows': my_windows, 'group_id': group_id})
作为参考,assign_windows 函数是:
def assign_windows(ser: pd.Series, my_df: pd.DataFrame, my_windows: list[tuple], group_id):
my_uids = list(my_df.loc[ser.index, 'uid'].values)
# Python's rolling implementation will execute assign_windows() on each column, so we
# restrict action to a single column to avoid duplicating windows.
if -1 in ser.values:
my_windows.append((group_id, my_uids))
return 1 # This is a dummy return because pd.DataFrame.rolling expects numerical return values.
这一切都发生在一个包含 my_windows 列表的闭包中,该列表返回给调用代码。
问题是在我的一个环境中,发送到assign_windows()
的系列已将其索引更改回time_field_name
列,因此my_df.loc[ser.index, 'uid'].values
换行符,因为 my_df 被索引到默认范围索引。
在我的其他环境中,一切都按预期工作,进入assign_windows()
的系列仍然具有应用.rolling()
时的相同索引。
对于防止 pandas 将序列重新索引到on
参数的任何帮助,我们将不胜感激。
事实证明,这是 Pandas 中的一个错误/未记录的更改。 在 rolling().apply() 版本 1.4.1 中添加了强制重新索引的代码:
def apply_func(values, begin, end, min_periods, raw=raw):
if not raw:
# GH 45912
values = Series(values, index=self._on)
return window_func(values, begin, end, min_periods)
我已经打开了一个问题,希望他们能找到一个不同的解决方案来解决引发这种变化的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.