【问题标题】:shifting data in python in different steps以不同的步骤在 python 中移动数据
【发布时间】:2018-06-02 17:37:36
【问题描述】:

如果我使用了错误的词汇,请纠正我。我想用不同的步骤转移我的数据。对于可变窗口大小,我发现这个移动了 1:

import pandas as pd
import numpy as np

a=np.random.rand(30)
series=pd.DataFrame(a)
window_size = 3
series_s = series.copy()
for i in range(window_size):
    series = pd.concat([series, series_s.shift(-(i+1))], axis = 1)

series.dropna(axis=0, inplace=True)

我正在像这样移动(点只是为了说明它会如何进行):

5 6  4    
6 4  3    
4 3  8    
3 8  9    
8 9  10    
9 10 .    
10 . .

我想要做的是转移,例如2:

5 4  8
6 3  9    
4 8 10   
3 9  .    
8 10 .    
9  . .    
10 . .

我必须如何更改上面的代码或如何做到这一点?

【问题讨论】:

    标签: python pandas function numpy shift


    【解决方案1】:

    shift 返回数据框的副本,它不会修改它,因此不需要创建副本。

    您可以通过使用列表推导进一步清理您的代码,并使用一些代数将每列移动两个而不是一个。

    x = np.random.randint(1, 10, 10)
    df = pd.DataFrame(x)
    dfs = [df.shift(-(2+2*i)) for i in range(3)]
    
    pd.concat([df, *dfs], axis=1)
    
       0    0    0    0
    0  3  1.0  3.0  8.0
    1  9  1.0  6.0  8.0
    2  1  3.0  8.0  1.0
    3  1  6.0  8.0  9.0
    4  3  8.0  1.0  NaN
    5  6  8.0  9.0  NaN
    6  8  1.0  NaN  NaN
    7  8  9.0  NaN  NaN
    8  1  NaN  NaN  NaN
    9  9  NaN  NaN  NaN
    

    这种方法确实为每列留下了相同的列标题,您可以使用以下方法修复:

    df_result.columns = range(len(df_result.columns))
    

    【讨论】:

      【解决方案2】:

      您可以做的是定义一个称为累积滞后的变量。 例如,让窗口大小 = n,lag_rate 为 2,原始列的延迟为零,第一列相对于原始列的延迟为 2,第二列相对于第一列的延迟为 4,并且第 n 列相对于第一列会有 2*n 的滞后

      为了可读性稍微修改你的代码:

      #set up the variables
      a=np.random.rand(30)
      df = pd.DataFrame()
      df['original'] = a
      window_size = 3
      lag_by_rate = 2 
      

      现在我将开始迭代 window_size 参数以生成新列。注意你应该从 1 而不是 0 开始 for 循环,因为如果你从 0 开始,你实际上复制了数据框的原始列

      for i in range(1, window_size):
          cum_lag = i * lag_by_rate
          col_name = 'lag_by_'+str(cum_lag)
          df[col_name] =  df.original.shift(-cum_lag)
      

      最后我使用 dropna 函数打印头部:

      df.dropna(axis=0, inplace=True)
      print(df.head())
      

      我的输出示例:

          original    lag_by_2    lag_by_4
      0   0.595142    0.625494    0.812595
      1   0.822615    0.582148    0.778157
      2   0.625494    0.812595    0.693790
      3   0.582148    0.778157    0.416109
      4   0.812595    0.693790    0.748151
      

      不管怎样,如果使用这种方法,您会大量丢失数据。如果 len(df)/window_size == lag_rate 的比率,则在删除 N/A 值后,您最终会在数据框中获得零行

      根据您在下面的评论,我替换了您在示例中提到的值,并且得到了相同的输出:

          original    lag_by_2    lag_by_4
      0   5           4.0         8.0
      1   6           3.0         9.0
      2   4           8.0         10.0
      

      【讨论】:

      • @我改变了我正在尝试做的事情,现在看起来有点不同。我的解释有误,请检查。我总是想滞后 2 而不是 4 或 6 之后等等。
      • 嗨,您总是希望相对于上一列滞后 2。这相当于第 w 列滞后 2*(w-1)。如果我替换您的 [5,6,4,3,8,9,10] 原始数组,我会得到您在问题中所需的输出
      • @thanks 是的,我很困惑。它按我的意愿工作。我现在将丢失数据,但这就是我想看看会发生什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      相关资源
      最近更新 更多