将长形面板数据重塑为宽幅叠加的时间序列。

问题描述 投票:0回答:1

我有表格中的面板数据。

+--------+----------+------------+----------+
|        | user_id  | order_date |  values  |
+--------+----------+------------+----------+
| 0      | 11039591 | 2017-01-01 | 3277.466 |
| 1      | 25717549 | 2017-01-01 | 587.553  |
| 2      | 13629086 | 2017-01-01 | 501.882  |
| 3      | 3022981  | 2017-01-01 | 1352.546 |
| 4      | 6084613  | 2017-01-01 | 441.151  |
| ...    | ...      | ...        | ...      |
| 186415 | 17955698 | 2020-05-01 | 146.868  |
| 186416 | 17384133 | 2020-05-01 | 191.461  |
| 186417 | 28593228 | 2020-05-01 | 207.201  |
| 186418 | 29065953 | 2020-05-01 | 430.401  |
| 186419 | 4470378  | 2020-05-01 | 87.086   |
+--------+----------+------------+----------+

作为Python中的Pandas DataFrame。

这段时期的覆盖程度在单个用户中很可能很低,也就是说,如果你把单个时间序列隔离开来,它们的长度都是不一样的。

我想把这些长格式的面板数据转换成宽格式,这样每一列都是一天,每一行都对应一个独特的用户。

+----------+------------+------------+------------+------------+------------+
|          | 2017-01-01 | 2017-01-02 | 2017-01-03 | 2017-01-04 | 2017-01-05 |
+----------+------------+------------+------------+------------+------------+
| 11039591 | 3277.466   | 6482.722   | NaN        | NaN        | NaN        |
| 25717549 | 587.553    | NaN        | NaN        | NaN        | NaN        |
| 13629086 | 501.882    | NaN        | NaN        | NaN        | NaN        |
|  3022981 | 1352.546   | NaN        | NaN        | 557.728    | NaN        |
|  6084613 | 441.151    | NaN        | NaN        | NaN        | NaN        |
+----------+------------+------------+------------+------------+------------+

我很难用unstackpivot或者其他Pandas的内置软件来实现这个功能 因为我一直在思考:

ValueError: Index contains duplicate entries, cannot reshape

由于重复的用户ID。

我目前的解决方案是使用一个循环来索引各个时间序列,并将它们连在一起,所以它不具有可扩展性--只有18万行,已经非常慢了。

def time_series_stacker(df):

  ts = list()

  for user in df['user_id'].unique():

    values = df.loc[df['user_id']==user].drop('user_id', axis=1).T.values

    instance = pd.DataFrame(
        values[1,:].reshape(1,-1), 
        index=[user],
        columns=values[0,:].astype('datetime64[ns]')
    )

    ts.append(instance)

  return pd.concat(ts, axis=0)

谁能帮我更有效地重塑这个方案?

python pandas time-series reshape data-manipulation
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.