计算稍微不同步的数据的相关性

数据挖掘 Python 熊猫 数据清理 相关性
2022-02-20 08:46:29

我正在尝试对来自特殊眼镜的一些数据进行一些分析,这些数据跟踪一些事情,包括瞳孔大小和凝视速度。我想计算两个不同人的两副眼镜之间的相关性。目前我无法使用df.correlate(),因为时间戳不相同,因此数据看起来像这样:

index | ts | r_person | l_person
-----------------------
0     | 23 | 3.0      | NAN
1     | 25 | NAN      | 3.2
2     | 28 | 3.1      | NAN
3     | 32 | 3.0      | NAN

我想知道是否还有任何方法可以直接计算相关性。

目前我正在考虑用上下数据点的平均值填充 NAN 值。例如第 2 行列r_person将变为3.05.

这将不像看起来那么微不足道,因为即使在开始时它并不总是一个数据点 R 一个数据点 L 并且在清理数据之后它变得不那么重要了。换句话说,正如您在示例中看到的那样,多个 NAN 值可能会出现在同一列中。我仍然可以通过分散平均值来解决这个问题。如果它们足够接近,我的第二种技术将尝试将这些值合并在一起。请记住,数据是在 50hz 下收集的。

我的问题是,是否有人有更快或更好的方法来对齐数据而不会丢失或更改太多?

2个回答

目前我正在考虑用上下数据点的平均值填充 NAN 值。例如第 2 行列 r_person 将变为3.05.

这里的问题是丢失的数据点不一定与时间戳相关联,该时间戳是上下时间戳的平均值。如果是这样,您建议的过程将等效于线性插值,即在丢失时间戳之前和之后的点之间画一条线,并使用该线为丢失的观察构建局部预测。这才是你实际应该做的。

例如在上面的例子中,你试图插入的点的线是r_person(ts)=3.0+.15(ts23), 所以r_person(25)=3.04(我认为......现在在我的脑海中这样做)。

您可以将时间点收集到半开间隔中,例如,[20,25),[25,30),[30,35),并关联 和 的平均观测一个包含更多数据点的示例:r_personl_person

import numpy as np
import pandas as pd

df = pd.DataFrame([[0, 23, 3.0, np.nan],
                   [1, 24, 2.9, np.nan],
                   [2, 25, np.nan, 3.2],
                   [3, 27, 3.0, np.nan],
                   [4, 27, np.nan, 3.3],
                   [5, 28, 3.1, np.nan],
                   [6, 29, np.nan, 3.2],
                   [7, 32, 3.0, np.nan]],
                  columns=['index', 'tx', 'r_person', 'l_person'])

bin_min = df['tx'].min() // 5 * 5
bin_max = (df['tx'].max() // 5 + 1) * 5
bins = range(bin_min, bin_max + 1, 5)

df['tx_bins'] = pd.cut(df['tx'], bins)
df_binned = df[['tx_bins', 'r_person', 'l_person']].groupby('tx_bins').mean()

这产生

>>> df_binned
          r_person  l_person
tx_bins                     
(20, 25]      2.95      3.20
(25, 30]      3.05      3.25
(30, 35]      3.00       NaN