首页 > 解决方案 > 使用 pandas 有效计算剩余使用寿命

问题描述

我有一个 pandas 数据框,其中包含多行带有日期时间和传感器值的行。我的目标是添加一个列来计算传感器值下一次超过阈值的天数。

例如,对于数据 <2019-01-05 11:00:00, 200>, <2019-01-06 12:00:00, 250>, <2019-01-07 13:00:00, 300>对于 200 到 250 之间的阈值,我希望附加列看起来像 [1 天,0 天,0 天],对于 250 到 300 之间的阈值,我希望它看起来像 [2 天,1 天,0 天]。

我尝试使用 对数据帧进行二次采样df_sub = df[df[sensor_value] >= threshold],遍历两个数据帧并计算df_sub给定当前时间戳的下一个时间戳df。然而,这个解决方案似乎效率很低,我认为 pandas 可能有一些优化的方法来计算我需要的东西。

在下面的示例代码中,我尝试了上面描述的内容。

import pandas as pd
data = [{'time': '2019-01-05 11:00:00', 'sensor_value' : 200},
        {'time': '2019-01-05 14:37:52', 'sensor_value' : 220},
        {'time': '2019-01-05 17:55:12', 'sensor_value' : 235},
         {'time': '2019-01-06 12:00:00',  'sensor_value' : 250},
         {'time': '2019-01-07 13:00:00',  'sensor_value' : 300},
         {'time': '2019-01-08 14:00:00',  'sensor_value' : 250},
         {'time': '2019-01-09 15:00:00',  'sensor_value' : 320}]
df = pd.DataFrame(data)
df['time'] = pd.to_datetime(df['time'])

def calc_rul(df, threshold):
    # calculate all datetime where the threshold is exceeded
    df_sub = sorted(df[df['sensor_value'] >= threshold]['time'].tolist())

    # variable to store all days
    remaining_days = []
    for v1 in df['time'].tolist():
        for v2 in df_sub:

            # if the exceeding date is the first in future calculate the days difference
            if(v2 > v1):
                remaining_days.append((v2-v1).days)
                break
            elif(v2 == v1):
                remaining_days.append(0)
                break
    df['RUL'] = pd.Series(remaining_days) 

calc_rul(df, 300)

预期输出(上述样本的输出):

结果

标签: pythonpandas

解决方案


您可以使用“.loc”来过滤和迭代阈值,而不是拆分数据框:

df['RUL'] = '[2 days, 1 day, 0 days]'
for threshold in threshold_list:
    df.loc[df['sensor_value'] > <your_rule>,'RUL'] = '[1 day, 0 days, 0 days]'

这种技术避免了拆分数据帧。


推荐阅读