Python 中具有非常高维度的一对多时间序列相关性

One-to-many time series correlation in Python with very high dimensions

我的数据库包含 100 万个在我网站的搜索框中键入的唯一字词。

它目前包含两列:“搜索词”(用户请求)和“量”(给定月份内对搜索词的请求数)。该数据库在过去 10 年中按月划分为多个表。平均数量为每月 18 个。如果没有任何用户请求,一些搜索会丢失一些月份分区。

我希望能够使用 python.

分析任何单个术语以快速识别其前 n 个最有意义的相关术语

由于其大小,生成整个相关矩阵会浪费内存和 CPU。

哪种数据帧结构和函数最适合 python 中的这种一对多比较?并且此功能是否需要执行任何去趋势操作?

您可以每个月构建完整的相关矩阵,或者可能不完整,但只采用 few-to-all 方法列出有趣的术语。这样您就可以将统计数据保存在文件中。

如果您选择按需获取 one-to-all 相关性,您至少可以构建一个用作缓存的 DataFrame,方法是在每次计算一项的相关性时存储结果。

为了计算一个项与所有其他项的相关性,您可以使用 DataFrame.corrwith:

假设你有以下 df:

import string

terms_list = [''.join((a, b, c))
            for a in string.ascii_lowercase[:25]
            for b in string.ascii_lowercase[:20]
            for c in string.ascii_lowercase[:20]]
np.random.seed(1)
df = pd.Series(
    np.random.choice(list(np.arange(10, 26)) + [np.nan], int(120e4)),
    index = pd.MultiIndex.from_product([terms_list, range(120)],
        names=['term', 'month'])
    )
df = df.dropna().unstack()
pivot_term = terms_list[0]

打印(df)

aaa    15.0  21.0  22.0  18.0  19.0  21.0  15.0  ...   NaN  15.0  23.0  11.0  20.0  10.0  17.0
aab    10.0  24.0  23.0  21.0  16.0  23.0  25.0  ...   NaN  15.0  12.0  11.0  21.0  15.0  19.0
aac    21.0  11.0  10.0  17.0  10.0  12.0  13.0  ...  10.0  10.0  25.0  14.0  20.0  22.0  15.0
aad     NaN  10.0  21.0  22.0  21.0  13.0  22.0  ...  11.0  17.0  12.0  14.0  15.0  17.0  22.0
aae    23.0  10.0  17.0  25.0  19.0  11.0  11.0  ...  10.0  25.0  18.0  16.0  10.0  16.0  11.0
...     ...   ...   ...   ...   ...   ...   ...  ...   ...   ...   ...   ...   ...   ...   ...
ytp    24.0  18.0  16.0  23.0   NaN  19.0  18.0  ...  20.0  15.0  21.0  11.0  14.0  18.0  19.0
ytq    22.0  11.0  17.0  24.0  12.0  20.0  17.0  ...  16.0   NaN  13.0  13.0  18.0  22.0  15.0
ytr    22.0  19.0  20.0  11.0  10.0  20.0  14.0  ...  24.0  21.0   NaN  19.0  10.0  24.0  22.0
yts    22.0   NaN  22.0  17.0  14.0  14.0  25.0  ...  14.0  22.0   NaN  23.0  14.0  25.0  10.0
ytt    17.0  16.0  15.0  21.0  11.0  19.0  16.0  ...  10.0  19.0  19.0  13.0  21.0  18.0  16.0

[10000 rows x 120 columns]

代码

t1 = time()
max_periods = 120
df = df.iloc[:, -max_periods:]
### get correlations
corr = df.drop(pivot_term, axis=0).corrwith(df.loc[pivot_term], axis=1)
t1 = time() - t1
print(corr)
print(t1)

输出

term
aab    0.045972
aac    0.064941
aad   -0.057009
aae   -0.187645
aaf   -0.075473
         ...
ytp    0.103756
ytq   -0.054769
ytr   -0.115004
yts    0.123223
ytt    0.230628
Length: 9999, dtype: float64
9.76

在这里您可以使用 corr.nlargestcorr.nsmallest 过滤有趣的术语。

PS

您可能还想查看仍符合每月最大交易量的较小数据类型,例如 np.int16