сдвиг данных в питоне разными шагами - PullRequest
0 голосов
/ 02 июня 2018

Пожалуйста, поправьте меня, если я использую неправильный словарь.Я хочу сдвинуть свои данные разными шагами.Я нашел это, чтобы сместить на 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 . .

Как мне изменить код выше или как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

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))
0 голосов
/ 02 июня 2018

Что вы можете сделать, это определить переменную, называемую кумулятивной задержкой.Например, пусть window size = 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 для генерации новых столбцов,Обратите внимание, что цикл for следует начинать с 1, а не с нуля, потому что, если вы начнете его с нуля, вы по сути дублируете исходный столбец кадра данных

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
...