繁体   English   中英

使用不同的聚合函数重新采样数据帧

[英]Resample a dataframe with different aggregate functions

我有一个如下所示的数据框,它有一个“统计”列,其中包含每个 1 秒时间戳的不同统计值(平均、计数、最小值、最大值)。

时间戳 地点 服务 状态码 统计数据 价值
1656533176875 一个 s1 200 数数 5000
1656533176875 一个 s1 500 平均 3000
…… …… …… …… ... ...
1656533176878 s2 504 最大限度。 6000

现在,从这个数据框中,我必须对用户定义的时间间隔(比如 5 分钟的间隔)重新采样数据,然后聚合该间隔的值。 由于这些值代表不同的聚合,我需要为数据框的不同部分应用不同的聚合函数。 例如,如果我想对 5 分钟的数据重新采样,如果“统计”为“平均”,则需要应用平均值,如果“统计”为计数,则需要应用总和。 此外,分组必须按中心、服务和状态代码。 到目前为止,我已经编写了这段代码,但我无法得到想要的结果。

        #sample dataframe
        rng = pd.date_range('2022-06-01', periods=10, freq='T')
        np.random.seed(10)
        l = ['A', 'B', 'C', 'D']
        k = ['avg', 'max', 'min', 'count', 'median', 'std']
        m = ['s1', 's2', 's3']
        j = [200, 400, 404, 500]

        df = pd.DataFrame(
            {'date_time': rng,
             'location': random.choices(l, k=10),
             'service': random.choices(m, k=10),
             'status': random.choices(j, k=10),
             'stat': random.choices(k, k=10),
             'value': np.random.randint(100, 900, size=10)
             }
        )

        df.sort_values(by=df.columns.to_list())
        print(df)
        interval =5
        resampled_df = df.assign(
            n_count=np.where(df['stat'] == 'count'),
            n_median=np.where(df['stat'] == 'median'),
            n_max=np.where(df['stat'] == 'max'),
            n_min=np.where(df['stat'] == 'min'),
            n_avg=np.where(df['stat'] == 'avg'),
            n_std=np.where(df['stat'] == 'std'),
        ).groupby(['date_time', 'location', 'services', 'status_code', 'stat']) \
            .resample('{}min'.format(interval), on='date_time') \
            .value \
            .agg({'n_count': sum, 'n_avg': np.mean, 'n_max': max, 'n_min': min, 'n_std': np.std,
                  'n_median': np.median})

        print(resampled_df)

我收到错误 ValueError:值的长度 (1) 与索引的长度 (10) 不匹配。 预期结果是 5 分钟的重新采样数据,其汇总值取决于“统计”列。

我仍然不确定您的输出应该是什么样子,但这是一个尝试:

agg_dict = {'avg':'mean',
            'count':'count',
            'max':'max',
            'median':'median',
            'std':'std'}
interval = 2
df.pivot(['date_time', 'location', 'service', 'status'],
          'stat', 
          'value')\
  .reset_index(level=[1,2,3])\
  .rename_axis('date_time')\
  .groupby(['date_time', 'location', 'service', 'status']) \
            .resample(f'{interval}T')\
            .agg(agg_dict)\
            .reset_index(level=0, drop=True)\
            .stack()\
            .reset_index()

输出:

   location service  status           date_time    stat      0
0         B      s1     200 2022-06-01 00:00:00   count    0.0
1         B      s1     200 2022-06-01 00:00:00     max  482.0
2         B      s2     500 2022-06-01 00:00:00     avg  753.0
3         B      s2     500 2022-06-01 00:00:00   count    0.0
4         A      s2     200 2022-06-01 00:02:00   count    0.0
5         A      s2     200 2022-06-01 00:02:00  median  442.0
6         D      s3     200 2022-06-01 00:02:00   count    0.0
7         D      s3     200 2022-06-01 00:02:00     max  898.0
8         A      s1     500 2022-06-01 00:04:00   count    1.0
9         B      s2     500 2022-06-01 00:04:00   count    0.0
10        D      s1     404 2022-06-01 00:06:00   count    0.0
11        A      s3     200 2022-06-01 00:06:00   count    0.0
12        B      s1     500 2022-06-01 00:08:00   count    1.0
13        B      s3     404 2022-06-01 00:08:00   count    0.0
14        B      s3     404 2022-06-01 00:08:00     max  383.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM