python - 使用 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)
预期输出(上述样本的输出):
解决方案
您可以使用“.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]'
这种技术避免了拆分数据帧。
推荐阅读
- scala - 使用 scala 动态访问 protobuf 字段名称
- c# - 在分组的列表中查找缺失的项目
- angular - 如何在 Angular 7 的 beforeEach Karma/Jasmine 测试中将服务注入自定义类?
- java - ModelMapper 不忽略空值
- javascript - 水平对齐 Chart.js y 轴
- php - PHP - 如何按键对多维数组进行排序?
- docker - 如何将 Analytics 添加到我现有的 wso2is?(WSO2 身份服务器)
- linux - 如何将迭代循环列表转换为字符串以在 Linux 中使用
- python - 如何用字典中的数字替换熊猫列中句子中的所有单词,然后对它们求和?
- php - 什么可以用来代替 window.location.replace 以避免页面重新加载?