【问题标题】:Time series normalization by event按事件进行时间序列标准化
【发布时间】:2015-11-15 18:40:54
【问题描述】:

假设我有一个如下的python dict,对于每个产品,键是时间戳,值是该时间戳的产品价格。

data_dict = {
'product_1' : {1: 415, 2: 550, 3: 0,   4: 550, 5: 600},
'product_2' : {1: 400, 2: 300, 3: 300, 4: 0,   5: 300},
'product_3' : {1: 500, 2: 400, 3: 0,   4: 500, 5: 500},
'product_4' : {1: 0,   2: 200, 3: 200, 4: 300, 5: 300}
 }

在时间序列分析中,通过某个事件对多个时间序列进行重新归一化是很常见的,假设我们将事件视为产品空闲时的时间戳。我想得到一个这种结构的表

           | -3  | -2  | -1  | 0 | +1  | +2  | +3  | +4  |
---------------------------------------------------------
product_1  | NA  | 415 | 550 | 0 | 550 | 600 | NA  | NA  |
product_2  | 400 | 300 | 300 | 0 | 300 | NA  | NA  | NA  |
product_3  | NA  | 500 | 400 | 0 | 500 | 500 | NA  | NA  |
product_4  | NA  | NA  | NA  | 0 | 200 | 200 | 300 | 300 |

有没有什么方法可以使用 pandas for python 轻松做到这一点?我敢肯定,在某些时候,大量的数据科学人员不得不做类似的事情。如果没有,如果熊猫人将来可以为类似的东西添加一些功能,我将不胜感激!同时,有什么建议可以解决这个问题吗?

【问题讨论】:

    标签: python pandas time-series


    【解决方案1】:

    您可以使用.apply 方法,但如果您有很多列,这往往效率低下;

    所以从这个框架开始:

    >>> df
       product_1  product_2  product_3  product_4
    1        415        400        500          0
    2        550        300        400        200
    3          0        300          0        200
    4        550          0        500        300
    5        600        300        500        300
    

    您定义了一个同步函数,如下所示:

    >>> def sync(ts):
    ...     vals = ts.values
    ...     n, k = len(vals), np.where(vals == 0)[0][0]
    ...     return Series(vals, np.arange(-k, n - k))
    

    并按列应用:

    >>> df.apply(sync).T
                -3   -2   -1   0    1    2    3    4
    product_1  NaN  415  550   0  550  600  NaN  NaN
    product_2  400  300  300   0  300  NaN  NaN  NaN
    product_3  NaN  500  400   0  500  500  NaN  NaN
    product_4  NaN  NaN  NaN   0  200  200  300  300
    

    .T 用于转置。

    【讨论】:

    • 是的,我在这里给出了一个模拟示例,但我正在使用一个包含超过 8000 列和接近 300 行的数据框,并且行会不断增加。感谢您的输入!很有帮助。
    • 嘿,我对上面的模拟示例进行了更改,产品 3 在第 2 天和第 3 天免费。在预期的结构中,我希望 -1 反映非零值,与 +1 类似, 如图所示。你能帮我做同样的事情吗?
    • @harshal.c:这是一个非常不同的问题。通过更改您的问题来使答案无效并不完全是板球。
    • 对不起,我改变了问题,但我并没有使你的答案无效,好吧,我会把问题改回来,我只是意识到我不够笼统。不过还是谢谢。
    猜你喜欢
    • 2015-07-31
    • 2013-02-03
    • 2018-11-11
    • 2018-04-01
    • 2019-04-04
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    相关资源
    最近更新 更多