Leetcode 解鎖 - Average Time of Process per Machine via Pandas

更新於 發佈於 閱讀時間約 11 分鐘
raw-image
題目概述

[問題連結]

這題想解的是:當我們手上有一份記錄了機器上 process 的開始與結束時間的表格,要怎麼計算「每台機器平均每個 process 花了多少秒」?

資料是 event log 的形式,也就是每筆記錄只說了 startend,而不是完整的一段處理區間。要先重組出每個 process 的起訖時間,才能進一步算處理時間。

這就像我們在分析操作 log、出貨記錄時,常遇到「只看到某一步驟的時間戳」的狀況,要自己補回整段活動時間。

Input 格式

表格名稱為 Activity,包含以下欄位:

raw-image


每台機器每個 process 都會對應兩筆記錄:一筆 start、一筆 end,沒有缺漏。

raw-image



Output 格式
raw-image


代表每台機器平均處理一個 process 所花的時間(end - start),四捨五入到小數後三位。


Pandas 解法 1

Step 1: 把 activity_type 的值 pivot 成欄位,取得 start 和 end 時間

Step 2: 計算每個 process 的處理時間

Step 3: 每台機器平均處理時間,保留三位小數

import pandas as pd

def get_average_time(activity: pd.DataFrame) -> pd.DataFrame:
#1
    df_pivot = pd.pivot(activity,index=['machine_id', 'process_id'],columns='activity_type',values='timestamp').reset_index()
#2
    df_pivot['processing_time'] = df_pivot['end'] - df_pivot['start']
#3
    result = df_pivot.groupby('machine_id')['processing_time'].mean().round(3).reset_index()

    return result


raw-image



Pandas 解法 2
反轉 timestamp 巧妙處理 start & end

這個方法用「符號反轉」的技巧,輕鬆對應 start / end,快速算出每個 process 的總花費時間。非常適合對 pivot_table 還不太熟的人。

Step 1: 把 start 的時間變成負數!為什麼?因為等下你直接把所有時間加總起來,就會是 end - start 的總和!

Step 2: 用 groupby + sum 把每台機器的:

  • 總處理時間(start是負的、end是正的,加總後剛好是處理時間)
  • 唯一 process 數量

Step 3: 最後每台機器的平均處理時間 = 總時間 / process 數量,記得保留三位小數


def get_average_time(activity: pd.DataFrame) -> pd.DataFrame:
#1
    filt = activity['activity_type'] == 'start'
    activity.loc[filt, 'timestamp'] = activity.loc[filt, 'timestamp'] * -1
#2
    activity_sum = activity.groupby(['machine_id', 'process_id'], as_index=False)['timestamp'].sum()

    result  = activity_sum.groupby(['machine_id'], as_index=False)['timestamp'].mean().round(3).rename(columns={'timestamp': 'processing_time'})



    return result
raw-image


Pandas 解法 2.1
極簡精煉版的「start 反號法」

使用apply + lambda 就可以在一行程式碼把 start 的時間變成負數

import pandas as pd
def get_average_time(activity: pd.DataFrame) -> pd.DataFrame:

    activity['timestamp'] = activity.apply(lambda x: x.timestamp*-1 if x.activity_type == 'start' else x.timestamp, axis=1)

    activity_sum = activity.groupby(['machine_id', 'process_id'], as_index=False)['timestamp'].sum()

    result  = activity_sum.groupby(['machine_id'], as_index=False)['timestamp'].mean().round(3).rename(columns={'timestamp': 'processing_time'})



    return result


Pandas 解法 3
直接「一筆 start 對一筆 end」,超直觀,最適合初學者理解。

Step 1: 分出 start / end 資料,先把 startend 資料拆開,就像在查 log 時先分類成「進場記錄」與「出場記錄」。

Step2: 將 end 的 timestamp 欄改名以便後續運算 (為了後續 merge 後不混淆,把 end 的時間戳重命名為 end_time。)

Step3: 依 machine_id + process_id 合併 start 和 end (用 machine_idprocess_id 把 start 跟 end 配對在一起,這樣每筆 row 就有完整的時間段。)

Step4: 計算處理時間(end - start)

Step5: 平均每台機器的處理時間(保留三位小數)

def get_average_time(activity: pd.DataFrame) -> pd.DataFrame:

    # 1
    df_start = activity[activity['activity_type'] == 'start'].reset_index(drop=True)
    df_end = activity[activity['activity_type'] == 'end'].reset_index(drop=True)

    # 2
    df_end = df_end.rename(columns={'timestamp': 'end_time'})

    # 3
    df_merged = df_start.merge(df_end[['machine_id', 'process_id', 'end_time']],on=['machine_id', 'process_id'],how='left')

    # 4
    df_merged['processing_time'] = df_merged['end_time'] - df_merged['timestamp']

    # 5
    result = df_merged.groupby('machine_id')['processing_time'].mean().round(3).reset_index()

    return result
raw-image


Pandas 解法 4
只靠 diff() 就搞定!

這個方法很像是「走位精準型」的技巧。不用 merge、不用 pivot,什麼都不用,只要記得 start 在前、end 在後,diff() 自然幫你算出處理時間。

Step 1: 依照 machine、process、時間排序,確保順序正確(先排序是為了讓 start 真的在 end 前面出現。否則 diff() 出來會是錯的。)

Step2: 用 groupby + diff 算出每個 process 的處理時間,用 diff(),就會在第二筆(end)自動產出處理時間。第一筆(start)會變成 NaN,後面我們會把它濾掉

Step3: 只取 end 的 row,因為 diff 後的處理時間會出現在 end 這一筆

Step4: 每台機器的平均處理時間(保留三位小數)

def get_average_time(activity: pd.DataFrame) -> pd.DataFrame:

    # 1
    activity = activity.sort_values(by=['machine_id', 'process_id', 'timestamp'])

    # 2
    activity['processing_time'] = activity.groupby(['machine_id', 'process_id'])['timestamp'].diff()

    # 3
    df_end = activity[activity['activity_type'] == 'end']

    # 4
    result = df_end.groupby('machine_id')['processing_time'].mean().round(3).reset_index()

    return result
raw-image





謝謝您花時間將此篇文章讀完,若覺得對您有幫助可以幫忙按個讚、分享來或是珍藏喔!也歡迎Follow我的ThreadsFB,持續追蹤生產力工具、商業分析、商業英文的實用範例,提升自己的職場力喔!



留言
avatar-img
留言分享你的想法!
avatar-img
DigNo Ape 數遊原人
51會員
134內容數
我們秉持著從原人進化的精神,不斷追求智慧的累積和工具的運用來提升生產力。我們相信,每一個成員都擁有無限的潛力,透過學習和實踐,不斷成長和進步。
你可能也想看
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
本文提供了一個關於模擬法演算法的問題,介紹了操作指令的格式及其解析。透過程式碼模擬每條指令,找出回到根目錄所需的操作次數。本文詳細說明瞭模擬法的複雜度分析,能夠幫助讀者更好地理解這個問題。
Thumbnail
本文提供了一個關於模擬法演算法的問題,介紹了操作指令的格式及其解析。透過程式碼模擬每條指令,找出回到根目錄所需的操作次數。本文詳細說明瞭模擬法的複雜度分析,能夠幫助讀者更好地理解這個問題。
Thumbnail
高中數學主題練習—平均數計算
Thumbnail
高中數學主題練習—平均數計算
Thumbnail
日前在LINE社群,有網友提出一個問題,要把資料進行分析,用日期來計算出將對應的資料。 原始資料,密密麻麻的數據,都看不清楚了 放大一點點 要把這些資料不同『料號』的各種『狀態』依據『日期』進行分析。 有興趣可以下載試著挑戰看看:檔案下載 作法有很多種,當然也可以用函數處
Thumbnail
日前在LINE社群,有網友提出一個問題,要把資料進行分析,用日期來計算出將對應的資料。 原始資料,密密麻麻的數據,都看不清楚了 放大一點點 要把這些資料不同『料號』的各種『狀態』依據『日期』進行分析。 有興趣可以下載試著挑戰看看:檔案下載 作法有很多種,當然也可以用函數處
Thumbnail
看文章教學之前,可以先下載檔案來試著自己做看看哦!!! 檔案下載 有網友提問,如何將所有的平日加班與假日加班時數合計到K欄,假日加班為了註明星期幾加班,前面分別會加上六、日當作前贅詞。 只不過是加總而已,讓我直接SUM看看好了!!! 答案好像怪怪的,怎麼只有平日的數據加總而已
Thumbnail
看文章教學之前,可以先下載檔案來試著自己做看看哦!!! 檔案下載 有網友提問,如何將所有的平日加班與假日加班時數合計到K欄,假日加班為了註明星期幾加班,前面分別會加上六、日當作前贅詞。 只不過是加總而已,讓我直接SUM看看好了!!! 答案好像怪怪的,怎麼只有平日的數據加總而已
Thumbnail
參加Leetcode的30 Days of Pandas挑戰,除了是學習的機會,更是練習熟悉pandas功能的機會。文章分享了挑戰簡介、題目描述、關鍵技術以及參加挑戰的心得。適合新手學習pandas,也可提升熟練度。
Thumbnail
參加Leetcode的30 Days of Pandas挑戰,除了是學習的機會,更是練習熟悉pandas功能的機會。文章分享了挑戰簡介、題目描述、關鍵技術以及參加挑戰的心得。適合新手學習pandas,也可提升熟練度。
Thumbnail
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。
Thumbnail
解決電腦上遇到的問題、證明正確性、探討效率 並且很著重溝通,說服別人你做的事是正確且有效率的。 內容: 計算模型、資料結構介紹、演算法介紹、時間複雜度介紹。
Thumbnail
Excel 是辦公室必備工具之一,但你知道如何快速將時間進行加總嗎?傳統方法是手動輸入公式,但如果時間數量多,就會非常耗時。今天,就來教你一個簡單的公式,讓你輕鬆將時間加總,讓你的工作效率大幅提升! 行政人員:可以用來計算工時、出貨時間、會議時間等,提高工作效率。
Thumbnail
Excel 是辦公室必備工具之一,但你知道如何快速將時間進行加總嗎?傳統方法是手動輸入公式,但如果時間數量多,就會非常耗時。今天,就來教你一個簡單的公式,讓你輕鬆將時間加總,讓你的工作效率大幅提升! 行政人員:可以用來計算工時、出貨時間、會議時間等,提高工作效率。
Thumbnail
如何計算某欄的平均數? 如何計算多個欄位的平均數? 如果想計算不同分組的平均數? 如何用Python計算某欄平均數 利用agg計算平均數 利用groupby建立分組,再用agg計算平均數
Thumbnail
如何計算某欄的平均數? 如何計算多個欄位的平均數? 如果想計算不同分組的平均數? 如何用Python計算某欄平均數 利用agg計算平均數 利用groupby建立分組,再用agg計算平均數
Thumbnail
專案分享-計算機 邏輯思維:首先,要建立幾個變數與函式,方便我們作業。接下來針對每一個函式進行解釋。 讓大家可以自己動手做一個簡易的計算機
Thumbnail
專案分享-計算機 邏輯思維:首先,要建立幾個變數與函式,方便我們作業。接下來針對每一個函式進行解釋。 讓大家可以自己動手做一個簡易的計算機
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News