首页 > 解决方案 > 将 Dataframe 分割成更小的 DatafFames

问题描述

我在 25Hrz 使用 12 小时传感器数据,我从 mongo db 查询到数据帧我试图从 12 小时中提取 1 分钟数据帧的列表或字典。

我使用 1 分钟的窗口和 10 秒的步幅/步长。目标是通过从 12 小时的数据中创建 1 分钟数据帧/样本的 al 列表或 dict 来构建数据集,将其转换为张量并馈送到深度学习模型。
数据帧的索引是日期时间和 4 列传感器值。以下是部分数据的样子:

                             A       B      C       D
2020-06-17 22:00:00.000  1.052  -0.147  0.836   0.623
2020-06-17 22:00:00.040  1.011  -0.147  0.820   0.574
2020-06-17 22:00:00.080  1.067  -0.131  0.868   0.607
2020-06-17 22:00:00.120  1.033  -0.163  0.820   0.607
2020-06-17 22:00:00.160  1.030  -0.147  0.820   0.607

下面是一个示例代码,类似于我如何提取 1 分钟数据的窗口。12 小时需要 5 分钟 - 这是很长的时间.. 在这种情况下如何减少运行时间的任何想法?

 step= 10*25
 w=60*25
 df # 12 hours df data
 sensor_dfs=[] 

 df_range = range(0, df.shape[0]-step, step)
 for a in df_range:
    sample = df.iloc[a:a+w]
    sensor_dfs.append(sample)
    
    

标签: pythonpandasdataframedeep-learning

解决方案


我创建了随机数据并在运行时进行了以下实验:

# 创建随机正态样本

 w= 60*25 # 1 minute window
 step=w # no overlap
 num_samples=50000
 data= np.random.normal(size=(num_samples,3))
 date_rng=pd.date_range(start="2020-07-09 00:00:00.000", 
 freq="40ms",periods=num_samples)
 data=pd.DataFrame(data, columns=["x","y","z"], index=date_rng)
 data.head()

                             x          y           z
2020-07-09 00:00:00.000 -1.062264   -0.008656   0.399642
2020-07-09 00:00:00.040 0.182398    -1.014290   -1.108719
2020-07-09 00:00:00.080 -0.489814   -0.020697   0.651120
2020-07-09 00:00:00.120 -0.776405   -0.596601   0.611516
2020-07-09 00:00:00.160 0.663900    0.149909    -0.552779

数字是 float64 类型

data.dtypes
x    float64
y    float64
z    float64
dtype: object

使用 for 循环

  minute_samples=[]
  for i in range(0,len(data)-w,step):
      minute_samples.append(data.iloc[i:i+w])     
  
 result:6.45 ms ± 256 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

使用列表理解

minute_samples=[data.iloc[i:i+w] for i in range(0,len(data)-w,step)]
result: 6.13 ms ± 181 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

使用带有列表理解的 Grouper

minute_samples=[df for i, df in data.groupby(pd.Grouper(freq="1T"))]
result:7.89 ms ± 382 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

将石斑鱼与 dict 一起使用

minute_samples=dict(tuple(data.groupby(pd.Grouper(freq="1T"))))
result: 7.41 ms ± 38 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

resample 也是这里的一个选项,但由于它在幕后使用 grouper,所以我认为它在运行时不会有所不同

似乎列表理解比其他的要好一些


推荐阅读