Поворот временных рядов в панель… питон

1

У меня есть блок данных с временными рядами по 25 портфелям (ME1_BM1, ME1_BM2 и т.д.), Наблюдаемый ежемесячно с 1932-02-29 по 2018-07-31. Первые четыре наблюдения выглядят так:

                 ME1_BM1     ME1_BM2  ...
Date
1932-02-29       2.11875     1.28388
1932-03-31       2.18567     1.24275
...

Столбец Date установлен как индекс. Мне нужно подготовить данные для чего-то другого, поэтому мне нужно преобразовать данные в следующее:

ME1_BM1    1932-02-29    2.11875
           1932-03-31    2.18567
           ...
ME1_BM2    1932-02-29    1.28388
           1932-03-31    1.24275
           ...

Не могу заставить его работать. Я попытался сфотографировать фреймворк данных, но затем я получаю индекс Date и индекс как вторую "переменную". Я не получил нигде с pivot, поскольку мне нужно было указать слишком много переменных...

Кто-нибудь знает, как это сделать, пожалуйста?

С уважением, Йеспер.

  • 0
    Я думаю, что панель не очень хорошая идея, потому что она устарела
  • 0
    Привет - да, я написал «панель», чтобы указать общую структуру данных, которые мне нужны, а не обязательно функциональность панды. Мне нужно в конечном итоге с данными в конце.
Показать ещё 1 комментарий
Теги:
dataframe
time-series
panel

2 ответа

0
Лучший ответ

Я думаю, вам нужно unstack для Series с MultiIndex:

s = df.unstack()
print (s)
         Date      
ME1_BM1  1932-02-29    2.11875
         1932-03-31    2.18567
ME1_BM2  1932-02-29    1.28388
         1932-03-31    1.24275
dtype: float64

Если хотите 3 столбца DataFrame добавьте reset_index:

df1 = df.unstack().reset_index()
df1.columns = ['portfolio','date','val']
print (df1)
  portfolio        date      val
0   ME1_BM1  1932-02-29  2.11875
1   ME1_BM1  1932-03-31  2.18567
2   ME1_BM2  1932-02-29  1.28388
3   ME1_BM2  1932-03-31  1.24275
0

Хотя предыдущий ответ более изящный, вы можете сделать следующее:

df = df.reset_index() # so date is not index anymore

Расплавьте портфели:

df2 = pd.melt(df, id_vars=["Date"], value_vars=['ME1_BM1','ME1_BM2'])

Применить groupby:

df2.groupby(["variable", "Date"])["value"].max()

Очевидно, вы можете изменить имена столбцов, чтобы они выглядели немного более аккуратными.

Также вы можете просто собрать все свои столбцы с помощью df.columns

удалите дату, а затем вам не нужно вводить слишком много.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню