pandas - 移动平均的窗口函数

标签 pandas

我正在尝试在 pandas 中复制 SQL 的窗口函数。

SELECT avg(totalprice) OVER (
    PARTITION BY custkey
    ORDER BY orderdate
    RANGE BETWEEN interval '1' month PRECEDING AND CURRENT ROW)
FROM orders

我有这个数据框:

from io  import StringIO
import pandas as pd

myst="""cust_1,2020-10-10,100
cust_2,2020-10-10,15
cust_1,2020-10-15,200
cust_1,2020-10-16,240
cust_2,2020-12-20,25
cust_1,2020-12-25,140
cust_2,2021-01-01,5

"""
u_cols=['customer_id', 'date', 'price']

myf = StringIO(myst)
import pandas as pd
df = pd.read_csv(StringIO(myst), sep=',', names = u_cols)
df=df.sort_values(list(df.columns))

并且在计算限制为最近 1 个月的移动平均线之后,它将看起来像这样......

from io  import StringIO
import pandas as pd

myst="""cust_1,2020-10-10,100,100
cust_2,2020-10-10,15,15
cust_1,2020-10-15,200,150
cust_1,2020-10-16,240,180
cust_2,2020-12-20,25,25
cust_1,2020-12-25,140,140
cust_2,2021-01-01,5,15

"""
u_cols=['customer_id', 'date', 'price', 'my_average']

myf = StringIO(myst)
import pandas as pd
my_df = pd.read_csv(StringIO(myst), sep=',', names = u_cols)
my_df=my_df.sort_values(list(my_df.columns))

如图所示:

https://trino.io/assets/blog/window-features/running-average-range.svg

我试着写了一个这样的函数...

import numpy as np
def mylogic(myro):
    mylist = list()
    mydate = myro['date'][0]
    for i in range(len(myro)):            
        if myro['date'][i] > mydate:
            mylist.append(myro['price'][i])
            mydate = myro['date'][i]
    return np.mean(mylist)

但是返回了一个 key_error。

最佳答案

您可以使用 rolling最近30天的功能

df['date'] = pd.to_datetime(df['date'])    

df['my_average'] = (df.groupby('customer_id')
                      .apply(lambda d: d.rolling('30D', on='date')['price'].mean())
                      .reset_index(level=0, drop=True)
                      .astype(int)
                   )

输出:

  customer_id       date  price  my_average
0      cust_1 2020-10-10    100         100
2      cust_1 2020-10-15    200         150
3      cust_1 2020-10-16    240         180
5      cust_1 2020-12-25    140         140
1      cust_2 2020-10-10     15          15
4      cust_2 2020-12-20     25          25
6      cust_2 2021-01-01      5          15

关于pandas - 移动平均的窗口函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68268531/

相关文章:

python - 偏移量前滚后加上一个月偏移量后的 Pandas 超出纳秒时间戳

python - 如何返回不包括某些列的新数据框?

python - 使用 groupby 时,如何在 pandas 中使用一个函数聚合多个列?

python - 检查 Pandas 中是否存在所有 12 个月后,如何将月返回转换为年返回?

python - 使用 pandas read_gbq 将日期字符串传递到函数中无法识别

python - 如何在 Python 中安装和使用 scikit-learn

python - 如何修复左侧刻度? Matplotlib 和 Pandas

python - 如何删除3列以上具有相同值的行

python - Pandas数据布局问题

python - 根据可能不存在于所有值上的分隔符将 Pandas 列拆分为两个