Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据透视表中的滚动中间带_Python_Pandas_Dataframe_Numpy_Median - Fatal编程技术网

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)
我想使用pandas
rolling(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更新了答案,提供了更多细节,并更新了数据,使之更简单。这是一个有趣的方法。我将尝试一下,看看它是如何工作的。