#python #pandas
Вопрос:
Я пытаюсь преобразовать серию панд, как:
Дата | Ценность |
---|---|
2020-01-01 | -1175 |
2020-01-02 | -475 |
2020-01-03 | 1945 |
2020-01-06 | -1295 |
2020-01-07 | -835 |
2020-01-08 | -785 |
2020-01-09 | 895 |
2020-01-10 | -665 |
в фрейм данных панд, такой как:
Дата | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
2020-01-01 | -1175 | -475 | 1945 | -1295 | -665 |
2020-01-02 | -475 | 1945 | -1295 | -835 | -785 |
2020-01-03 | 1945 | -1295 | -835 | -785 | 895 |
2020-01-06 | -1295 | -835 | -785 | 895 | -665 |
Каждые 5 (или n) строк ряда образуют одну строку в кадре данных.
Пример данных вместе с моим текущим (уродливым, но рабочим) кодом выглядит следующим образом:
import pandas as pd
srs = pd.Series(index=pd.DatetimeIndex(pd.date_range(start="2020-01-01",end="2020-1-10",freq="B")),
data=[-1175,-475,1945,-1295,-835,-785,895,-665])
n = 5
df = pd.concat({i: srs.shift(-i) for i in range(n)}, axis=1).dropna()
df = df[range(n)]
df.index = df.index.droplevel(level=0)
Мне было интересно, есть ли лучший/аккуратный/приятный способ сделать это?
Комментарии:
1.
pd.concat([s.shift(-n) for n in range(5)],axis=1).iloc[:4]
Ответ №1:
Попробуйте с sliding_window_view
помощью from numpy
:
n = 5
v = np.lib.stride_tricks.sliding_window_view(srs.values, n)
df = pd.DataFrame(v, index=srs.index[:v.shape[0]])
df
:
0 1 2 3 4
2020-01-01 -1175 -475 1945 -1295 -835
2020-01-02 -475 1945 -1295 -835 -785
2020-01-03 1945 -1295 -835 -785 895
2020-01-06 -1295 -835 -785 895 -665
Полный Рабочий Пример:
import numpy as np
import pandas as pd
srs = pd.Series(index=pd.DatetimeIndex(
pd.date_range(start="2020-01-01", end="2020-1-10", freq="B")
), data=[-1175, -475, 1945, -1295, -835, -785, 895, -665])
n = 5
v = np.lib.stride_tricks.sliding_window_view(srs.values, n)
df = pd.DataFrame(v, index=srs.index[:v.shape[0]])
print(df)
Комментарии:
1. Очень круто! Я совершенно не подозревал о его существовании! Спасибо!
2. Да. Это хорошая идея. И очень полезно в этом случае.