python - 将 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)
解决方案
我创建了随机数据并在运行时进行了以下实验:
# 创建随机正态样本
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,所以我认为它在运行时不会有所不同
似乎列表理解比其他的要好一些
推荐阅读
- selenium - 如何单击引用不同元素的按钮?
- powershell - 计算对象的属性
- javascript - Javascript S3 GET桶(列表对象)格式化?
- spring - api响应中的值为空
- mysql - 错误代码:1064。无法将数据插入数据库
- python - 条件数据帧移位
- java - Apache KafkaMetric 值方法已弃用,如何改用 metricValue?
- asp.net - Html.EditorFor 如何使文本框在页面加载时处于活动状态
- optimization - Kotlin - 如果不为空,则使用修改后的 Obj 道具覆盖 Obj 道具
- python - 拆分和重新连接列表