【问题标题】:Pandas time series operationsPandas 时间序列操作
【发布时间】:2013-03-28 19:52:47
【问题描述】:

我是熊猫新手。我有一个时间序列数据。如何轻松完成以下操作?

我有一个称为输入的二维矩阵。每行有 5 个元素。有很多行(数千)

input[t,:] = [f1, f2, f3, f4, f5]

(1) 我需要计算样本之间的相对差异。

rel[t,:] = ( input[t,:]-input[t-1,:] ) / input[t-1,:]

(2)我需要创建一个大小为80的滑动窗口。

win[t,:] = [rel[t,:],rel[t-1,:],...,rel[t-79,:]]

我如何在 Pandas 或任何其他框架(例如 scikit.timeseries)中做到这一点。

【问题讨论】:

    标签: python scipy pandas time-series


    【解决方案1】:

    你可以用普通的 numpy 来做这两个,虽然 pandas 可能会有一些特定的功能使它更容易。但是:

    rel = np.diff(input) / input[:-1]
    

    from numpy.lib.stride_tricks import as_strided
    win = as_strided(rel, shape=(rel.shape[0]-79, 80), strides=rel.strides*2)
    

    会做的。


    如果输入多于一行,你仍然可以像上面那样做:

    rel = np.diff(input, axis=1) / input[:, :-1]
    win = as_strided(rel, shape=(rel.shape[0], rel.shape[1]-79, 80),
                     strides=rel.strides + rel.strides[1:])
    

    尽管您可能想玩弄“形状”并匹配strides 以获得您所追求的确切窗口形状。

    【讨论】:

    • 如果输入有k 尺寸怎么办?
    • @siamii 您希望如何计算相对差异或对 k 维数据加窗?当然可以,但是你需要明确你想要做什么。
    • 我的意思是输入有 k 列。因此,每行有 k 个元素,而不是每行 1 个元素。每行代表一个时间步。我的数据是二维矩阵。我更新了问题
    • 谢谢,但我想我解释得不够清楚。你原来的答案很好,就是每个元素都有 k 个特征。我需要计算时间步长之间的差异和窗口。我认为您的后续答案是水平计算特征之间的差异,而不是垂直计算时间步长之间的差异。正确的?可能您在原始答案中需要更改的只是shape=(rel.shape[0]-79, 80*k),但我不确定。
    【解决方案2】:
    猜你喜欢
    • 2017-06-14
    • 2016-04-04
    • 1970-01-01
    • 2020-04-12
    • 2022-11-22
    • 2015-09-14
    • 2012-09-25
    相关资源
    最近更新 更多