如何在大时间序列 DataFrame 上应用短时间序列线性回归

Posted

技术标签:

【中文标题】如何在大时间序列 DataFrame 上应用短时间序列线性回归【英文标题】:How to apply short time series linear regression over a large time series DataFrame 【发布时间】:2019-11-16 16:55:14 【问题描述】:

我有一个大型时间序列数据集,涵盖多年的每日费率。我正在尝试添加两个额外的列,其中包括 Y 截距和基于前 10 天费率的 x 或斜率系数。

在excel中,我使用linest函数来计算Y截距和x或斜率的系数。

我想在 Python 中复制它。

我已经为这个问题提供了一些示例代码。

import pandas as pd
import numpy as np
from datetime import datetime

date_rng = pd.date_range(start='7/1/2018', end='08/31/2018', freq='D')

df = pd.DataFrame(date_rng, columns=['date'])
df['data'] = np.random.randint(76, 100, size=(len(date_rng)))

df['datetime'] = pd.to_datetime(df['date'])
df = df.set_index('datetime')
df.drop(['date'], axis=1, inplace=True)

我希望看到以下结果

datetime    data    Slope   Intercept
1/07/2018   93  NaN NaN
2/07/2018   91  NaN NaN
3/07/2018   76  NaN NaN
5/07/2018   78  NaN NaN
6/07/2018   86  NaN NaN
7/07/2018   94  NaN NaN
8/07/2018   97  NaN NaN
9/07/2018   97  NaN NaN
10/07/2018  96  1.303030303 81.93333333
11/07/2018  82  1.175757576 81.53333333
12/07/2018  95  1.757575758 78.73333333
13/07/2018  95  1.290909091 83.2
14/07/2018  81  0.296969697 88.46666667
15/07/2018  84  -0.842424242    95.33333333
16/07/2018  77  -1.903030303    100.2666667
17/07/2018  78  -2.266666667    100.6666667

【问题讨论】:

查看df.rolling() 方法 【参考方案1】:

正如@alkasm 所建议的,您可以使用 Pandas 的 rolling 函数。在滚动窗口上,您可以apply Numpy's linalg.lstsq

A = np.vstack([ np.arange(10), np.ones(len(x))]).T

df['slope'] = df['data'].rolling(10).apply(lambda y: np.linalg.lstsq(A, y)[0][0])
df['intercept'] = df['data'].rolling(10).apply(lambda y: np.linalg.lstsq(A, y)[0][1])

要可视化结果,您可以使用 matplotlib

import matplotlib.pyplot as plt 

pd.plotting.register_matplotlib_converters()

plt.plot(df.index, df.data)
for i in range(0, len(df) - 10 , 10):
    m, c = df.iloc[10 + i][['slope', 'intercept']]
    plt.plot([df.index[0 + i], df.index[10 + i]], [c, c + 10 * m])

plt.show()

【讨论】:

谢谢马克西米利安·彼得斯。如果数据框有多个列,我将如何调整您的解决方案使其不仅仅使用 df['data'] ? 您可以创建多个slopeintercept 列,每一列对应一个感兴趣的列。

以上是关于如何在大时间序列 DataFrame 上应用短时间序列线性回归的主要内容,如果未能解决你的问题,请参考以下文章

Jupyter ipython 内核在大文件加载时死机

如何在 Python 中的 Spark Dataframe 上应用任何类型的地图转换

如何通过重复观察在大数据上拟合层次模型

在小数据集上使用 GridSearch 并在大数据集上应用结果是个好主意吗?

如何在大数据集上训练分词器?

如何在大表上优化这个 mysql 连接?