Python 数据透视表中的滚动中间带
我试图将滚动中值作为数据帧上的聚合函数进行计算。以下是一些示例数据:Python 数据透视表中的滚动中间带,python,pandas,dataframe,numpy,median,Python,Pandas,Dataframe,Numpy,Median,我试图将滚动中值作为数据帧上的聚合函数进行计算。以下是一些示例数据: import pandas as pd import numpy as np d = {'date': ['2020-01-01','2020-02-01','2020-03-01','2020-01-01','2020-02-01','2020-02-01','2020-03-01','2020-02-01','2020-03-01','2020-03-01','2020-03-01','2020-03-01','2020
import pandas as pd
import numpy as np
d = {'date': ['2020-01-01','2020-02-01','2020-03-01','2020-01-01','2020-02-01','2020-02-01','2020-03-01','2020-02-01','2020-03-01','2020-03-01','2020-03-01','2020-03-01','2020-03-01'],
'count': [1,1,1,2,2,3,3,3,4,3,3,3,1],
'type': ['type1','type2','type3','type1','type3','type1','type2','type2','type2','type3','type1','type2','type1'],
'salary':[1000,2000,3000,10000,15000,30000,100000,50000,25000,10000,25000,30000,40000]}
df: pd.DataFrame = pd.DataFrame(data=d)
df_pvt: pd.DataFrame = df.pivot_table(index='date',
columns='type',
aggfunc={'salary': np.median})
df_pvt.head(5)
我想使用pandasrolling(2).median()函数对工资执行滚动中值
如何将这种类型的窗口函数插入到数据透视表的聚合函数中
我的目标是按日期聚合大量数字数据,并获取可变长度的滚动中值,并在生成的透视表中报告。我不完全确定如何将此函数插入到aggfunc
或类似程序中
预期输出以升序按日期排序,并获取与这两个月相关的所有观察值,然后找到中值
对于类型1,我们有:
date count type salary
0 2020-01-01 1 type1 1000
3 2020-01-01 2 type1 10000
5 2020-02-01 3 type1 30000
10 2020-03-01 3 type1 25000
12 2020-03-01 1 type1 40000
因此,对于类型1,滚动(2)的预期输出为:
salary
type type1
date
2020-01-01 NaN
2020-02-01 10000.0
2020-03-01 30000.0
逻辑是这样的,在前两个月的滚动窗口中,我们将有数据点100010000和30000,并产生10000的中位数
对于2020-03-01,滚动2将包括30000、25000、40000,因此中值结果应为30000。不确定是否可以直接使用参数aggfunc
完成。所以一个解决方法是创建一个双精度的数据,日期列移动一个月。请注意,此方法实际上无法扩展到更大的滚动窗口。可以,但最终可能会有太多的数据
# first convert to datetime
df['date'] = pd.to_datetime(df['date'])
# append the data shifted of a month to df and perform the pivot_table
res = (
df
.append(df.assign(date=lambda x: x['date']+pd.DateOffset(months=1)))
.pivot_table(index='date',columns='type',
aggfunc={'salary': np.median})
.reindex(df['date'].unique()) # to avoid an extra month
)
print(res)
salary
type type1 type2 type3
date
2020-01-01 5500.0 NaN NaN
2020-02-01 10000.0 26000.0 15000.0
2020-03-01 30000.0 30000.0 10000.0
对于第一次约会,如果您想像滚动窗口那样获得nan
,那么您可以在之后执行res.loc[res.index.min()]=np.nan
也许有一种更简单但不太花哨的方法。你可以试试1。获取日期的所有不同值,2。然后为每个日期筛选匹配日期为3的薪资。计算中位数和4。制作一个包含中间值的列表,添加到pandas表中。@Ben.T更新了答案,提供了更多细节,并更新了数据,使之更简单。这是一个有趣的方法。我将尝试一下,看看它是如何工作的。