数据帧间隔选择性能

时间:2018-10-18 11:30:36

标签: python performance dataframe

我有一个具有以下结构的数据框。 (system_time是索引)

+---------------------+------+------+------+
| System_Time(index)  | var1 | var2 | var3 |
+---------------------+------+------+------+
| 2017-03-28 04:24:00 |    4 |    1 |    2 |
| 2017-03-28 04:32:00 |    5 |    4 |  453 |
| 2017-03-28 04:40:00 |    6 |   21 |    2 |
| 2017-03-28 04:48:00 |    2 |    9 |    5 |
| 2017-03-28 04:56:00 |    5 |    1 |    1 |
| 2017-03-28 05:04:00 |    1 |    2 |    2 |
| 2017-03-28 05:12:00 |    8 |    5 |    2 |
+---------------------+------+------+------+

我的目标是循环选择时间。示例:我想要获取介于2017-03-28 04:24:00和2017-03-28 04:24:00之间的所有行。

当前,我使用dataset.loc[start_date:end_date](可完成这项工作。)

然后,我将时间增加8分钟(开始日期和结束日期)以获取下一个选择。 (开始日期和结束日期之间的54分钟一致间隔)

对于每个选择,我将每一列的总和,均值或第一位作为单行(简单的数据框函数)。之后,我执行插入查询以将其存储在数据库中。

问题:

大约有1500万条记录,用这种方法处理大约需要8个小时。

有什么想法可以改善性能吗?

1 个答案:

答案 0 :(得分:0)

在Data Science SO论坛上似乎有一个similar problem described

遵循那里的建议(关键是:使用rolling函数):

df["System time"] = pd.to_datetime(df["System time"]) # Convert column type to be datetime
indexed_df = df.set_index(["System time"])           # Create a datetime index
indexed_df = dataset.loc[start_date:end_date]
indexed_df.rolling('480s')                             # Create rolling windows of 8m length
indexed_df.rolling('480s').mean()                      # Then apply functions to rolling windows (here: mean but you can use any lambda as in groupby)