首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >时间序列与大熊猫的相关性

时间序列与大熊猫的相关性
EN

Stack Overflow用户
提问于 2018-02-11 01:45:04
回答 1查看 14.6K关注 0票数 9

我有一些微粒传感器和带有时间序列的CSV,例如:

传感器A:

代码语言:javascript
复制
                     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

我将日期设置为索引:

代码语言:javascript
复制
df.index = pd.to_datetime(df['date'], format='%d/%m/%y %H.%M')

我想将来自同一传感器的数据和来自相同时间窗口中不同传感器的数据之间的不同时间窗口关联起来。我希望知道在一天中的某一段时间里,我是否有同样的增减行为。在设置“日期索引”之后,我可以从传感器A获得“每天上午9时至10时的所有PM值”。

代码语言:javascript
复制
df.between_time('9:00','10:00')

1) 问题1:如何检查同一传感器和不同时间的相关性,:我从两天的DataFrame中过滤了9/10天的数据,但并不总是在同一分钟内进行。我可能会遇到这样的情况:

代码语言:javascript
复制
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
....

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

代码语言:javascript
复制
df01.corr(df02)

返回

代码语言:javascript
复制
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

2) 问题2:不同传感器之间的相关性()--在本例中,我有两个来自两个传感器的带有PM值的CVS文件。作为Problem1,我想将相同时间的窗口与它们关联起来。即使在这种情况下,我也希望数据之间有一些“偶然的延迟”,但是分钟之间的错误是可以的,我只想检查‘在正确的位置’的值。示例:

代码语言:javascript
复制
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

提前谢谢你

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-11 03:03:27

我会试着一起回答你们的两个问题。这看起来像是pd.merge_asof()的一个工作,它在最近匹配的键上合并,而不是仅仅在精确的键上合并。

示例数据

代码语言:javascript
复制
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

预处理

代码语言:javascript
复制
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

根据最近的索引匹配合并DataFrames

代码语言:javascript
复制
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

相关性

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

代码语言:javascript
复制
merged.corr()
          value_x   value_y
value_x  1.000000  0.612873
value_y  0.612873  1.000000

备注

pd.merge_asof的上述用法保留了df1的索引;df1中的每一行在df2中接收到最接近的匹配,并进行替换,因此如果df2的行数比df1少,merge_asof的结果将包含来自df2的重复值。结果将具有与df1相同的行数。

您提到,您实际上只关心按相对位置比较行,例如,将df1的第3值与df2的第3值进行比较。当您使用时间索引获得感兴趣的时间段后,您可以不使用merge_asof,只需忽略时间索引,并使用df.values访问底层的numpy数组

代码语言:javascript
复制
# 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.        ]])
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48727450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档