我有一个日期-时间索引的数据帧(65列(为了清晰起见,只显示了9列)->传感器数量,x行->观察数(对于示例数据,我将其限制为700行,以说明我遇到的问题)。 演示csv: https://pastebin.com/mpSgJF94
swp_data = pd.read_csv(FILE_NAME, index_col=0, header=0, parse_dates=True, infer_datetime_format=True)
swp_data = swp_data.sort_index()
对于每一列,我需要找到值是列最大值的95%的点,并计算出从数据帧开始到95%的点,其中时间步长之间的差大于给定值(在本例中为0.2)。在
类似于在R中工作的东西(不是实际的代码,而是一个示例)
^{pr2}$它将95%的点作为循环的结束索引,并查看时间点之间的差异并返回一个索引值,其中差异大于等于0.2
在熊猫中,我计算了以下内容: 95%值
s95 = (swp_data.max() + (swp_data.max() * .05))
A1-24,-20.6260635, A1-18,-17.863923, A1-12,-11.605629, A2-24,-16.755144, A2-18,-17.6815275, A2-12,-16.369584, A3-24,-15.5030295
95%时间
s95_time = (swp_data >= (swp_data.max() + (swp_data.max() * .05))).idxmax()
A1-242011年2月10日1:30, A1-18,2011年3月10日6:20, A1-12,2011年2月10日17:20, A2-242011年3月10日6:10, A2-18,2011年3月10日1:30, A2-12,2011年2月10日17:10, A3-242011年2月10日1:30
到目前为止,我已经有了最大值和95%的值,以及一系列的时间戳,其中每个列都达到了它的95%点。 s95值:
我试图通过创建一个值为<;=95%point的布尔数据帧来屏蔽数据帧(试图复制R的which),并尝试了数据框。在哪里使用值>;=95%。mask和where都没有提供我需要的信息,因为当我开始记录时,有些传感器已经超过了max的95%(mask为这些值返回NaN),而where返回这些值,但不返回低于95%阈值的值。在
我要找的输出应该是
A1-24, A1-18, A1-12, A2-24, A2-18, A2-12, A3-24, A3-18, A3-12
BREAKING hh:mm, hh:mm, hh:mm, hh:mm, hh:mm, hh:mm, hh:mm, hh:mm, hh:mm
其中hh:mm等于从数据文件开始到断开值的时间。在
到目前为止,我在SE和google上发现的,让我困惑的是,我是否可以将dataframe的列按不同的值进行子集,并且很难弄清楚我要做的是什么叫做。在
编辑:@pratiek评论:
我要做的是找到一种方法,我可以在某种程度上自动化这个过程,这样使用95%的位置,我可以返回断点。我有大约200个csv文件,我正试图处理,并希望尽可能多的过滤使用95%和打破位置。在
据我所知,这是一个可能的解决办法。 注意,我在示例中将
swap_data
重命名为df
,并在您的问题中提供的csv示例文件上测试解决方案。在查找从启动到值达到列最大值的95%时的持续时间
如您所述,查找每个列达到最大值95%的第一个时间点:
注意使用}则是相同的。在
df.max() * 1.05
避免计算max
两次,而{然后通过减去第一个时间戳来计算从数据帧开始的持续时间
^{pr2}$这是从记录开始到
s95
点的每一列所花费的时间。 如果第一个记录值已经高于此点,则时间为0。在屏蔽数据帧以覆盖该时段
为此,您必须为每列计算一个
bool
掩码:创建一个数据帧,其中
DateTimeIndex
值与df
:pd.concat([pd.Series(df.index)] * df.columns.size, axis=1)
相同的列数。 这里df.index
必须转换为pd.Series
,然后重复以匹配列数df.columns.size
。用}将其转置,以便按列与数据帧进行比较。
< idx.values.T
创建掩码本身,其中values
得到idx
作为numpy.array
,并且{用
df.where(mask.values)
屏蔽数据帧,其中使用values
得到的掩码为numpy.array
。这是必需的,因为掩码与df
没有相同的标签。(可选)使用
仅保留至少一个值不是.dropna(how='all')
NaN
的行过滤每个时间点之间差异的屏蔽数据
如果我理解得很好的话,您需要在每个时间点之间的
difference > 0.2
上过滤数据,并且只针对选定的时间段。 我仍然有点不清楚,所以如果我误解了,请不要犹豫在评论中讨论。在这可以通过以下方式实现:
^{4}$但不幸的是,对于提供的数据集,没有与这些条件匹配的值。在
编辑:将结果可视化为
bool
数据帧(评论跟进)使用
df_masked.diff(1) > 0.2
可以非常简单地将结果可视化为带有索引和列的布尔数据框。 但是,可能会有很多不必要的行只包含False
,因此可以通过以下方式对其进行筛选:相关问题 更多 >
编程相关推荐