与 pandas 的时间序列相关性
Time series correlation with pandas
我有一些具有时间序列的颗粒物传感器和 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
我将日期设置为索引:
df.index = pd.to_datetime(df['date'], format='%d/%m/%y %H.%M')
我想将来自同一传感器的数据与来自不同传感器的数据在相似时间 windows 之间的不同时间相关联 windows。我希望知道 day/days 的某些部分是否有相同的 increase/decrease 行为。
设置 "date index" 后,我可以得到 "All PM value from 9am to 10am everyday from sensor A"
df.between_time('9:00','10:00')
1) 问题 1:如何检查同一传感器但不同日期的相关性:我在两个 DataFrame 中过滤了两天上午 9 点/10 点的数据,但并非总是如此恰好在同一分钟拍摄。我可能会遇到这样的情况:
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/01/2018 的第三个值将与第二个 window.
的第三个值相关
df01.corr(df02)
returns
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()
2) 问题 2:不同传感器之间的关联 在这种情况下,我有 2 个 CVS 文件,其中包含来自两个传感器的 PM 值。作为问题 1,我想将它们的同一时间 windows 关联起来。
即使在这种情况下,我也希望数据之间有一些 "Casual lag",但分钟之间的错误很好,我只想检查值 'at right position'。示例:
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
提前致谢
我将尝试一起解决您的两个问题。这看起来像是 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
预处理
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
在最近的索引匹配上合并数据帧
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 中列的成对相关性 (docs)。
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
的第三个值与 df2
的第三个值进行比较。不用 merge_asof
,您可以在使用时间索引获取感兴趣的时间段后简单地忽略时间索引,并使用 df.values
:
访问底层的 numpy 数组
# 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. ]])
我有一些具有时间序列的颗粒物传感器和 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
我将日期设置为索引:
df.index = pd.to_datetime(df['date'], format='%d/%m/%y %H.%M')
我想将来自同一传感器的数据与来自不同传感器的数据在相似时间 windows 之间的不同时间相关联 windows。我希望知道 day/days 的某些部分是否有相同的 increase/decrease 行为。 设置 "date index" 后,我可以得到 "All PM value from 9am to 10am everyday from sensor A"
df.between_time('9:00','10:00')
1) 问题 1:如何检查同一传感器但不同日期的相关性:我在两个 DataFrame 中过滤了两天上午 9 点/10 点的数据,但并非总是如此恰好在同一分钟拍摄。我可能会遇到这样的情况:
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/01/2018 的第三个值将与第二个 window.
的第三个值相关df01.corr(df02)
returns
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()
2) 问题 2:不同传感器之间的关联 在这种情况下,我有 2 个 CVS 文件,其中包含来自两个传感器的 PM 值。作为问题 1,我想将它们的同一时间 windows 关联起来。 即使在这种情况下,我也希望数据之间有一些 "Casual lag",但分钟之间的错误很好,我只想检查值 'at right position'。示例:
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
提前致谢
我将尝试一起解决您的两个问题。这看起来像是 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
预处理
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
在最近的索引匹配上合并数据帧
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 中列的成对相关性 (docs)。
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
的第三个值与 df2
的第三个值进行比较。不用 merge_asof
,您可以在使用时间索引获取感兴趣的时间段后简单地忽略时间索引,并使用 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. ]])