代码之家  ›  专栏  ›  技术社区  ›  ScalaBoy

如何使用滑动窗口重塑数据帧以获得三维阵列?

  •  1
  • ScalaBoy  · 技术社区  · 6 年前

    我需要重塑我的数据框架 df :

    flights = {
                'flight_stage':   [1, 0, 1, 1, 0, 0, 1],
                'scheduled_hour': [16,16,17,17,17,18,18],
                'delay_category': [1, 0, 2, 2, 1, 0, 2]
            }
    
    columns = ['flight_stage', 'scheduled_hour', 'delay_category']
    
    df = pd.DataFrame(flights, columns=columns)
    

    我想得到下面的三维阵列 X

    [
      [[1,16],[0,16],[1,17]],
      [[0,16],[1,17],[1,17]],
      [[1,17],[1,17],[0,17]],
      [[1,17],[0,17],[0,18]],
      [[0,17],[0,18],[1,18]]
    ]
    

    和一维阵列 y :

    [
      3,
      4,
      5,
      3,
      3
    ]
    

    基本上,原始数据帧 df 应使用1的滑动窗口(最后3个条目)重塑形状,以便获得 十、 . 价值观 应该是 delay_category 在所有3个条目中。

    我怎么做?

    reshape

    3 回复  |  直到 6 年前
        1
  •  1
  •   Dani Mesejo    6 年前

    你可以做:

    import pprint
    import pandas as pd
    
    flights = {
                'flight_stage':   [1, 0, 1, 1, 0, 0, 1],
                'scheduled_hour': [16,16,17,17,17,18,18],
                'delay_category': [1, 0, 2, 2, 1, 0, 2]
            }
    
    columns = ['flight_stage', 'scheduled_hour', 'delay_category']
    
    df = pd.DataFrame(flights, columns=columns)
    X = [df.iloc[i:i+3, [0, 1]].values.tolist() for i in range(len(df) - (3 - 1))]
    y = df.delay_category.rolling(3).sum().dropna()
    
    pprint.pprint(X)
    pprint.pprint(y)
    

    输出

    [[[1, 16], [0, 16], [1, 17]],
     [[0, 16], [1, 17], [1, 17]],
     [[1, 17], [1, 17], [0, 17]],
     [[1, 17], [0, 17], [0, 18]],
     [[0, 17], [0, 18], [1, 18]]]
    2    3.0
    3    4.0
    4    5.0
    5    3.0
    6    3.0
    Name: delay_category, dtype: float64
    

    如果需要,您可以转换 X 非常容易地创建一个numpy数组。

        2
  •  1
  •   busybear Danny Boy150    6 年前

    y , rolling 这个方法在这里很有效。像这样的方法应该会奏效:

    arr = df[['flight_stage', 'scheduled_hour']].values
    
    win_size = 3
    X = np.stack([arr[n:n+win_size, :] for n in range(len(arr) - win_size + 1)])
    
    y = df['delay_category'].rolling(3, ).sum()
    
        3
  •  1
  •   yatu Sayali Sonawane    6 年前

    numpy 并将阵列的切片堆叠在一起:

    w = 3
    cols = 2
    rows = x.shape[0] - window + 1
    x = df.values
    X = np.hstack((x[:-2,:2], x[1:-1,:2], x[2:,:2])).reshape((rows,w,cols))
    
    print(X)
    array([[[ 1, 16],
            [ 0, 16],
            [ 1, 17]],
    
           [[ 0, 16],
            [ 1, 17],
            [ 1, 17]],
    
           [[ 1, 17],
            [ 1, 17],
            [ 0, 17]],
    
           [[ 1, 17],
            [ 0, 17],
            [ 0, 18]],
    
           [[ 0, 17],
            [ 0, 18],
            [ 1, 18]]], dtype=int64)
    
    print(y)
    y = np.vstack((x[:-2,-1], x[1:-1,-1], x[2:,-1])).sum(axis=0)
    
        array([3, 4, 5, 3, 3], dtype=int64)
    

    一些时间比较:

    def daniel(df):
        columns = ['flight_stage', 'scheduled_hour', 'delay_category']
        X = [df.iloc[i:i+3, [0, 1]].values.tolist() for i in range(len(df) - (3 - 1))]
        y = df.delay_category.rolling(3).sum().dropna()
    
    def busybear(df):
        arr = df[['flight_stage', 'scheduled_hour']].values
        win_size = 3
        X = np.stack([arr[n:n+win_size, :] for n in range(len(arr) - win_size + 1)])
        y = df['delay_category'].rolling(3, ).sum()
    
    def yatu(df):
        x = df.values
        w = 3
        cols = 2
        rows = x.shape[0] - window + 1
        X = np.hstack((x[:-2,:2], x[1:-1,:2], x[2:,:2])).reshape((rows,w,cols))
        y = np.vstack((x[:-2,-1], x[1:-1,-1], x[2:,-1])).sum(axis=0)
    
    %timeit daniel(df)
    # 2.75 ms ± 389 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    %timeit yatu(df)
    # 26.3 µs ± 2.37 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
    
    %timeit busybear(df)
    # 929 µs ± 179 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)