簡體   English   中英

推斷數據幀以計算 15 分鍾和 30 分鍾的平均值

[英]Extrapolating dataframes to calculate 15min and 30min averages

假設我有一個這樣的數據框(時間列有 3 個最小窗口並按 ID-A 和 ID-B 分組)-

ID-A  ID-B    time     sum   num
A       1   09:30:00    5     2
        1   09:33:00    8     2
        1   09:36:00    5     2
        2   09:36:00    10    3
        2   09:39:00    15    3
        2   09:42:00    2     3
B       1   09:30:00    10    2
        1   09:33:00    12    2
        1   09:36:00    5     2

我正在嘗試計算總和除以 num 的 15 分鍾和 30 分鍾平均值。 我的 df- 的可復制版本

import pandas as pd

data = {'time': ['09:30:00',
                 '09:33:00',
                 '09:36:00',
                 '09:36:00',
                 '09:39:00',
                 '09:42:00',
                 '09:30:00',
                 '09:33:00',
                 '09:36:00'],
         'sum': [5, 8, 5, 10, 15, 2, 10, 12, 5],
         'num': ['2', '2', '2', '3', '3', '3', '2', '2', '2']}
my_index = pd.MultiIndex.from_arrays([["A"]*6 + ["B"]*3, [1, 1, 1, 2, 2, 2, 1, 1, 1]], names=["ID-A", "ID-B"])
df = pd.DataFrame(data, index=my_index)

注意:- 對於 1 對 ID-A 和 ID-B,數字始終相同。

所需數據幀(按 ID-A 和 ID-B 分組)-

ID-A  ID-B    time     sum   num   15min   30min  
A       1   09:30:00    5     2     15      30  
            09:33:00    8     2     15      30  
            09:36:00    5     2     15      30  
        2   09:36:00    10    3     15      30  
            09:39:00    15    3     15      30  
            09:42:00    2     3     15      30  
B       1   09:30:00    10    2     22.5    45  
            09:33:00    12    2     22.5    45  
            09:36:00    5     2     22.5    45  

例如 - 對於 ID-A -> A 和 ID-B -> 1,總時間數據僅可用 9 分鍾。 所以我做了,(5+8+5)/9 = 18/9 = 2 1 分鍾。 它還必須除以 num,所以 2/2=1。 因此,對於 15 分鍾,將是 15 和 30 為 30 分鍾。 可能存在時間數據可用 15 或 30 分鍾的情況。 顯然,不需要外推,只需要進行正常計算。

我的方法 - 因為我需要的最大平均值是 30 分鍾,所以我想先將所有值外推到 30 分鍾,這樣我就不必關心是否存在所有值。 最終我只想要我的 df 中的 ID-A、ID-B、15min 和 30min 列,但這也可以。

看起來這行得通?

# cast 'num' to float
df['num'] = df['num'].astype(float)

def add_cols(grp):
    # divide sum by 3xnum of rows, and then divide by 'num'
    multiple = grp['sum'].sum() / (3*len(grp)) / grp.iloc[0, -1]
    return grp.assign(**{'15min': 15 * multiple, '30min': 30 * multiple})

df.groupby(['ID-A', 'ID-B']).apply(add_cols)

Output:

                       time   sum   num     15min   30min
ID-A ID-B                   
A   1   2022-09-18 09:30:00     5   2.0     15.0    30.0
1       2022-09-18 09:33:00     8   2.0     15.0    30.0
1       2022-09-18 09:36:00     5   2.0     15.0    30.0
2       2022-09-18 09:36:00     10  3.0     15.0    30.0
2       2022-09-18 09:39:00     15  3.0     15.0    30.0
2       2022-09-18 09:42:00     2   3.0     15.0    30.0
B   1   2022-09-18 09:30:00     10  2.0     22.5    45.0
1       2022-09-18 09:33:00     12  2.0     22.5    45.0
1       2022-09-18 09:36:00     5   2.0     22.5    45.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM