Python 在Panadas中使用不同度量(倾斜)每小时聚合数据
我有一个从传感器数据中获取的大型数据表,如下所示:Python 在Panadas中使用不同度量(倾斜)每小时聚合数据,python,pandas,dataframe,scipy,signal-processing,Python,Pandas,Dataframe,Scipy,Signal Processing,我有一个从传感器数据中获取的大型数据表,如下所示: Code A1 A2 A3 ... AB40 Time 2000-01-01 00:00:10.730 NaN 1 NaN NaN 2010-01-01 00:00:12.730 1 2 3 NaN 有一段时间,没有与设备关闭时间相关的可用数据。我想每一小时聚合一次数据。 我使
Code A1 A2 A3 ... AB40
Time
2000-01-01 00:00:10.730 NaN 1 NaN NaN
2010-01-01 00:00:12.730 1 2 3 NaN
有一段时间,没有与设备关闭时间相关的可用数据。我想每一小时聚合一次数据。
我使用了以下代码:
telemetry_mean=pd.pivot_table(Telemetry, index='Time').resample('1H').mean().dropna(how='all')
telemetry_mean=pd.pivot_table(Telemetry, index='Time').resample('1H').std().dropna(how='all')
# renaming the columns
telemetry_mean.columns = [i + 'mean_5T' for i in list(telemetry_mean)]
telemetry_std.columns = [i + 'Std_5T' for i in list(telemetry_std)]
telemetry_feat = pd.concat([ telemetry_mean, telemetry_std]
基于给定的时间窗口,我不能使用相同的方法来获得信号的倾斜度量或峰度度量,我得到了不同的结构:
telemetry_Skew=pd.pivot_table(Telemetry, index='Time').resample('1H').skew().dropna(how='all')
输出
Code
A1 0.762252
A2 0.021107
A3 -1.035745
A4 0.578501
我错过了什么
我还想知道是否有更优雅的方法可以在一次数据引用中计算所有这些统计指标(由于数据量大)。例如,对于每个统计数据,我可以使用'telemetry\u Skew=pd.pivot\u table(遥测,index='Time')。重采样('1H')。Skew()。dropna(how='all')来表示,std和。。。在一次数据引用中
如果有人能帮我,我将不胜感激
谢谢
更新
我正在寻找的输出是这种格式
A1 A2 ........ AB40
Time mean std skew mean std skew
2000-01-01 00:00:00.00 1 2 0 2 1 9
.
.
.
2010-01-01 00:01:00.00 1 2 3 1 0 1
我随机填写了平均值,std,skew作为描述你可以试试这样的方法。 听起来简单多了,但我不确定它是否适合你的需要
# setting the time as index
df = df.set_index('Time')
# grouping by hour
grouped = df.groupby(df.index.hour)
# computing various stats
grouped = grouped.agg(['std', 'mean', 'skew']).transpose().unstack()
# cosmetics dropping a useless column level
grouped.columns = grouped.columns.droplevel()
grouped
# std mean skew
# A1 NaN 1.0 NaN
# A2 0.707107 1.5 NaN
# A3 NaN 3.0 NaN
# AB40 NaN NaN NaN
可供替代的
从pandas 0.20开始,您可以直接在数据帧上使用agg
来计算各种统计数据。见详情。
这应该是值得考虑的,因为你正试图做什么
df.agg(['std', 'mean', 'skew']).transpose()
# std mean skew
# A1 NaN 1.0 NaN
# A2 0.707107 1.5 NaN
# A3 NaN 3.0 NaN
# AB40 NaN NaN NaN
谢谢罗曼的评论。当我试图使用df=df.set_index('Time')
时,我得到了keyrerror:'Time'。打印数据表时会显示时间,但我不能将其称为列。我认为这与多索引有关,但不确定如何解决。您好,我认为您是对的,这是因为DataFrame
行或列的形状。但仅仅用字符串表示很难确定它的确切形状。如果已经设置了索引,则可能不需要设置索引。我在我的回答中提出了一个你可以考虑的备选方案,非常感谢你帮我解决这个问题。你的评论非常有帮助,我试图修改你提供的内容,并使用grouped=df.groupby(df.index.hour)grouped=grouped.agg(['std','mean','skew'])
我得到了最接近我想要的东西。唯一的问题是我丢失了时间列的格式,它变成了数字索引'01 2 3 4'。有没有办法保留我拥有的时间和日期的原始格式?我更新了我的问题,以便更好地解释我正在寻找的格式