事件通用版本的时间序列规范化

2024-03-29 12:31:12 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题只是我已经发布的一个问题的一般版本,Time series normalization by event

假设我有一个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: 0  , 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  | NA  | 500 | 0 | 500 | 500 | NA  | NA  |
product_4  | NA  | NA  | NA  | 0 | 200 | 200 | 300 | 300 |

使用pandas for python有什么方法可以轻松做到这一点吗?我相信很多数据科学的人在某个时候也做过类似的事情。如果不是的话,我真的很感激熊猫人能在将来为类似的东西添加一些功能!同时,对如何进行这项工作有什么建议吗


Tags: 版本eventdatabytime产品时间事件
1条回答
网友
1楼 · 发布于 2024-03-29 12:31:12

在这个限制性案例的答案的基础上:https://stackoverflow.com/a/33723633/1853020

我修改了函数以引入左右限制:

def sync(arr):
    shift_l = np.where(arr.values == 0)[0][0]
    shift_r = np.where(arr.values == 0)[0][-1]
    if shift_l == shift_r:
        return pd.Series(arr.values, np.arange(-shift_l , len(arr.values) - shift_l))
    else:
        arr2 = np.delete(arr.values, [x for x in range(shift_l, shift_r)])
        return pd.Series(arr2, np.arange(-shift_l, len(arr2) - shift_l))

然后将其应用于由数据dict创建的熊猫数据帧:

pd.DataFrame(data_dict).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  NaN  500   0  500  500  NaN  NaN
product_4  NaN  NaN  NaN   0  200  200  300  300

相关问题 更多 >