与熊猫的时间序列相关性

Dav*_*ide 3 python correlation pandas

我有一些Particulate Matter传感器和CSV,时间序列如下:

传感器A:

                     date           value
date                                     
2017-11-30 00:00:00  30/11/17 0.00     49
2017-11-30 00:02:00  30/11/17 0.02     51
2017-11-30 00:03:00  30/11/17 0.03     54
2017-11-30 00:05:00  30/11/17 0.05     57
2017-11-30 00:07:00  30/11/17 0.07     53
2017-11-30 00:08:00  30/11/17 0.08     55
2017-11-30 00:10:00  30/11/17 0.10     55
2017-11-30 00:12:00  30/11/17 0.12     58
2017-11-30 00:13:00  30/11/17 0.13     57
2017-11-30 00:15:00  30/11/17 0.15     58
....
2018-02-06 09:30:00    6/2/18 9.30     33
2018-02-06 09:32:00    6/2/18 9.32     31
2018-02-06 09:33:00    6/2/18 9.33     34
2018-02-06 09:35:00    6/2/18 9.35     32
2018-02-06 09:37:00    6/2/18 9.37     33
2018-02-06 09:38:00    6/2/18 9.38     30
Run Code Online (Sandbox Code Playgroud)

我将日期设置为索引:

df.index = pd.to_datetime(df['date'], format='%d/%m/%y %H.%M')
Run Code Online (Sandbox Code Playgroud)

我想在相似的时间窗口中关联来自同一传感器和来自不同传感器的数据之间的不同时间窗口.我希望知道在一天中的某些部分是否有相同的增加/减少行为.设置"日期索引"后,我能够从传感器A每天从上午9点到上午10点得到"所有PM值"

df.between_time('9:00','10:00')
Run Code Online (Sandbox Code Playgroud)

1)问题1:如何检查来自同一传感器但不同日期的相关性:我在两个DataFrame中从两天开始过滤数据9/10am,但并不总是在同一时刻完全采集.我可能有这样的情况:

01-01-2018 (df01 - I removed data column)
2018-01-01 09:05:00     11
2018-01-01 09:07:00     11
2018-01-01 09:09:00     10
....


02-01-2018 (df02)
2018-02-01 09:05:00     67
2018-02-01 09:07:00     68
2018-02-01 09:08:00     67
....
Run Code Online (Sandbox Code Playgroud)

我应该重命名数据列吗?我实际上关心的是,01/01/2018的第三个值将与第二个窗口的第三个值相关联.

df01.corr(df02)
Run Code Online (Sandbox Code Playgroud)

回报

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()
Run Code Online (Sandbox Code Playgroud)

2)问题2:不同传感器之间的关联在这种情况下,我有2个CVS文件,其PM值来自两个传感器.问题1我想关联他们的相同时间窗口.即使在这种情况下,我预计数据之间会有一些"休闲滞后",但是几分钟之间的误差很好,我想只检查"正确位置"的值.例:

Sensor A:
                         date           value
    date                                     
    2017-11-30 00:00:00  30/11/17 0.00     49
    2017-11-30 00:02:00  30/11/17 0.02     51
    2017-11-30 00:03:00  30/11/17 0.03     54
    2017-11-30 00:05:00  30/11/17 0.05     57

Sensor B:
                         date           value
    date                                     
    2017-11-30 00:00:00  30/11/17 0.00     1
    2017-11-30 00:02:00  30/11/17 0.02     40
    2017-11-30 00:04:00  30/11/17 0.03     11
    2017-11-30 00:05:00  30/11/17 0.05     57

AxB
                         date           valueA    valueB
    date                                     
    2017-11-30 00:00:00  30/11/17 0.00     49       1
    2017-11-30 00:02:00  30/11/17 0.02     51       40
    2017-11-30 00:03:00  30/11/17 0.03     54       11
    2017-11-30 00:05:00  30/11/17 0.05     57       57
Run Code Online (Sandbox Code Playgroud)

先感谢您

Pet*_*ler 6

我会尽力解决你的两个问题.这看起来像是一个作业pd.merge_asof(),它在最近匹配的键上合并,而不是仅在精确键上合并.

示例数据

df1
date            value
30/11/17 0.00   51
30/11/17 0.02   53
30/11/17 0.05   65
30/11/17 0.08   58

df2
date            value
30/11/17 0.01   61
30/11/17 0.02   63
30/11/17 0.04   65
30/11/17 0.07   68
Run Code Online (Sandbox Code Playgroud)

预处理

df1.date = pd.to_datetime(df1.date, format='%d/%m/%y %H.%M')
df2.date = pd.to_datetime(df2.date, format='%d/%m/%y %H.%M')
df1.set_index('date', inplace=True)
df2.set_index('date', inplace=True)

df1
                     value
date
2017-11-30 00:00:00     51
2017-11-30 00:02:00     53
2017-11-30 00:05:00     65
2017-11-30 00:08:00     58

df2
                     value
date
2017-11-30 00:01:00     61
2017-11-30 00:02:00     63
2017-11-30 00:04:00     65
2017-11-30 00:07:00     68
Run Code Online (Sandbox Code Playgroud)

在最近的索引匹配上合并DataFrame

merged = pd.merge_asof(df1, df2, left_index=True, right_index=True, direction='nearest')
merged
                         value_x  value_y
date
2017-11-30 00:00:00       51       61
2017-11-30 00:02:00       53       63
2017-11-30 00:05:00       65       65
2017-11-30 00:08:00       58       68
Run Code Online (Sandbox Code Playgroud)

相关性

请注意,df.corr()不接受数据作为参数,因此df1.corr(df2)不起作用.该corr方法计算您调用它的DataFrame中的列的成对相关性(docs).

merged.corr()
          value_x   value_y
value_x  1.000000  0.612873
value_y  0.612873  1.000000
Run Code Online (Sandbox Code Playgroud)

笔记

以上用法pd.merge_asof保持指数df1; 每一行都df1接收其最接近的匹配df2,并且替换,因此如果df2行数少于df1,则结果merge_asof将包含重复值df2.结果将具有相同的行数df1.

您提到您实际上只关心通过相对位置比较行,例如,将第3个值df1与第3个值进行比较df2.merge_asof您可以在使用时间索引获取感兴趣的时间段时忽略时间索引,而不是使用时间索引,并使用以下内容访问基础numpy数组df.values:

# Get a 2D array of shape (4, 1)
df1.values
array([[51],
       [53],
       [65],
       [58]])

# Get a 1D array of shape (4,)
df1.values.flatten()
array([51, 53, 65, 58])

# numpy correlation matrix
pd.np.corrcoef(df1.values.flatten(), df2.values.flatten())
array([[1.        , 0.61287265],
       [0.61287265, 1.        ]])
Run Code Online (Sandbox Code Playgroud)