如何使用压缩时间序列数据集高效工作?

时间:2018-03-26 14:24:27

标签: apache-spark time-series bigdata

第一部分是对我正在使用的数据格式以及几行代码的非常快速的介绍,以便创建一个非常类似于我必须使用的原始数据的伪数据集。

创建数据:

我的数据集采用以下形式:

import numpy as np
import pandas as pd

# Create the data set

np.random.seed(42)

records = list()
for i in range(5):
    for j in range(10):        
        for k in range(1000):
            t = np.random.randint(pd.Timestamp('2000-01-01').value, pd.Timestamp('2018-01-01').value)
            if np.random.rand() > .95: continue
            records.append( (i, j, np.random.rand(), pd.Timestamp(t)) )

df = pd.DataFrame.from_records(records)
df.columns =['a_id', 'b_id', 'value', 'time']

生成压缩数据集:

       a_id  b_id     value                          time
0         0     0  0.156019 2007-09-28 15:12:24.260596807
1         0     0  0.601115 2015-09-08 01:59:18.043399626
2         0     0  0.969910 2012-01-10 07:51:29.662492802
3         0     0  0.181825 2011-08-28 19:58:33.281289629
...     ...   ...       ...                           ...
47533     4     9  0.470582 2011-02-17 16:42:19.278101199
47534     4     9  0.186855 2000-07-19 08:19:16.652565603
47535     4     9  0.437264 2017-10-18 22:34:45.942782747

数据:

columnd a_idb_id可以理解为时间序列的私钥。换句话说,通过创建如下所示的数据透视表,可以获得(a_id, b_id) equals (0, 0)的整个单个时间序列:

pd.pivot_table(df.set_index(['a_id', 'b_id']).loc[0, 0], 
               columns=['time'], values=['value']).T \
    .rename(columns={'value': 'Series ID: (0,0)'})

将给出

                               Series ID: (0,0)
timestamp                                      
2000-01-03 11:37:27.821467132          0.522510
2000-01-04 20:04:25.320102707          0.598357
2000-01-16 08:11:41.275535866          0.146963
2000-01-23 00:26:48.847330863          0.840872
2000-01-23 06:53:48.530748946          0.492625
2000-01-23 08:08:58.594737501          0.637430
2000-01-29 18:12:31.061804272          0.046852
...                                         ...

在PySpark中,我可以通过运行:

来加载这些数据
sql = SQLContext(sc)

df_data = sql.read.option("header", "true").schema(schema) \
             .csv(os.path.join(DATA_DIR, '*/data.csv'))

使用架构:

root
 |-- a_id: integer (nullable = true)
 |-- b_id: integer (nullable = true)
 |-- value: double (nullable = true)
 |-- time: timestamp (nullable = true)

问题:

我在这里遇到的问题是我不知道如何转换这个数据s.t.我可以更轻松地使用它 - 比如如何在此DataFrame中提取嵌入的时间序列?

例如,想象一下我必须计算所有可用时间序列的相关性。这里的第一个问题是我不知道如何以压缩格式重新采样每个时间序列,以便正确对齐它们以计算相关系数。

这里最大的问题可能就是决议。由于数据持续了数年,我无法简单地在纳秒上重新采样数据或将时间序列加入其时间戳。

我更有可能在几小时内重新采样数据并加入时间序列。但即便如此,我很可能在不必要地占用存储空间之间有很多None值。

所以......我非常乐于接受建议。我知道这个问题并不完全在这里讨论,但是现在找了几天后,找不到任何示例代码或如何处理数据格式的建议,就像我在这里得到的那样我希望有人在所以至少把我拉向了正确的方向。

感谢您的帮助,如果我能提供更多详细信息,请告诉我们。

0 个答案:

没有答案