gpt4 book ai didi

python - 如何将不返回数值的函数应用于 Pandas 滚动窗口?

转载 作者:行者123 更新时间:2023-12-03 17:17:47 26 4
gpt4 key购买 nike

我有一个日期时间系列的 dtype:float64。我正在尝试将自定义函数应用于该系列的滚动窗口。我希望这个函数返回字符串。但是,这会生成 TypeError。为什么这会产生错误,有没有办法直接通过应用一个函数来使这个工作?
下面是一个例子:

import numpy as np
import pandas as pd

np.random.seed(1)
number_series = pd.Series(np.random.randint(low=1,high=100,size=100),index=[pd.date_range(start='2000-01-01',freq='W',periods=100)])
number_series = number_series.apply(lambda x: float(x))

def func(s):

if s[-1] > s[-2] > s[-3]:
return 'High'
elif s[-1] > s[-2]:
return 'Medium'
else:
return 'Low'

new_series = number_series.rolling(5).apply(func)
结果是以下错误:
TypeError: must be real number, not str
我目前采用的解决方法是修改 func 以将整数输出到一个系列,然后将另一个函数应用于该系列以生成新系列。按照下面的例子:
def func_float(s):

if s[-1] > s[-2] > s[-3]:
return 1
elif s[-1] > s[-2]:
return 2
else:
return 3

float_series = number_series.rolling(5).apply(func_float)

def func_text(s):

if s == 1:
return 'High'
elif s == 2:
return 'Medium'
else:
return 'Low'

new_series = float_series.apply(func_text)
这给出了生成错误的初始代码的预期结果:
new_series

2000-01-02 Low
2000-01-09 Low
2000-01-16 Low
2000-01-23 Low
2000-01-30 Medium
...
2001-10-28 Low
2001-11-04 Medium
2001-11-11 High
2001-11-18 High
2001-11-25 Low
Length: 100, dtype: object

最佳答案

请注意 apply Rolling object 的函数不同于apply Series object 的函数我同意你的看法,这有点令人困惑。在我的理解中,应用于滚动窗口的函数通常用于聚合数据(例如 sumcount 等)。
但是,您可以将滚动窗口转换为列表并将该函数应用于该列表(感谢 this discussion )。
所以我的方法是:

import numpy as np
import pandas as pd

np.random.seed(1)
number_series = pd.Series(np.random.randint(low=1,high=100,size=100),index=[pd.date_range(start='2000-01-01',freq='W',periods=100)])
number_series = number_series.apply(lambda x: float(x))

def func(s):
if len(s) > 2:
if s[-1] > s[-2] > s[-3]:
return 'High'
elif s[-1] > s[-2]:
return 'Medium'
else:
return 'Low'
else:
return ''

list = [func(window) for window in list(number_series.rolling(5))]
new_series = pd.Series(list, index=number_series.index)
另请注意 func需要以不同的方式处理第一项,否则索引将超出范围。

关于python - 如何将不返回数值的函数应用于 Pandas 滚动窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66342868/

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