Изменение формы данных с помощью двухстрочных заголовков в pandas - PullRequest
1 голос
/ 04 февраля 2020

У меня есть следующий фрейм данных:

                    AAPL,Price AAPL,Volume  ...  GOOG,Ivol  GOOG,Shares
  Date                                                                
0 2019-12-25              21.5        1879            20.0         2010                             
1 2019-12-26              22.1        1887            19.9         2000                              
2 2019-12-27              23.0        1888            19.9         2045       
3 2019-12-30              22.3        1887            NaN          2050                                
4 2019-12-31              22.4        1900            20.1         1998       

Мне нужно будет запустить регрессии для каждой из этих функций акций, и мне нужно будет прикрепить набор специфических c манекенов. Поэтому моя цель состоит в том, чтобы изменить форму базы данных таким образом, чтобы у меня был двойной индекс, состоящий из даты на первом месте и названия акции на втором месте, то есть

Date        Stock  Price  Volume ... Ivol Shares
2019-12-25  AAPL    21.5    1879 ... 22.1   3121
...         ...    ...    ...    ... ...  ... 
2019-12-25  GOOG    45.8    NaN  ... 20.0   2000 
...
2019-12-25   VER     NaN    NaN  ...  NaN    NaN   
2019-12-26  AAPL   ...  
...                                           
2019-12-31   VER    42.4    1900 ... 50.1   1998 

Моя проблема в том, что я не знаю, как лечить имена столбцов, так как они являются строками типа «Stock1, Feature1», и, следовательно, я не знаю, как генерировать оценочный двойной индекс. Может кто-нибудь помочь? Обратите внимание, что функции одинаковы для каждой акции, т. Е. Список функций не меняется по акциям. Конечно, я открыт для различных типов решений с точки зрения изменения данных

1 Ответ

0 голосов
/ 04 февраля 2020

Вы можете изменить это с помощью pd.wide_to_long. Чтобы получить правильный формат, я сначала модифицирую столбцы Index, чтобы сделать 'AAPL,Price' -> 'Price,AAPL'.

df.columns = [','.join(x[::-1]) for x in df.columns.str.split(',')]
stubs = df.columns.str.split(',').str[0].unique().tolist()
#['Price', 'Volume', 'Ivol', 'Shares']    

df = df.reset_index('Date')  # Need it out of index
df = pd.wide_to_long(df, i='Date', j='Stock', stubnames=stubs, sep=',', suffix='.*')

#df, based on the 4 columns provided:

                  Price  Volume  Ivol  Shares
Date       Stock                             
2019-12-25 AAPL    21.5  1879.0   NaN     NaN
           GOOG     NaN     NaN  20.0  2010.0
2019-12-26 AAPL    22.1  1887.0   NaN     NaN
           GOOG     NaN     NaN  19.9  2000.0
2019-12-27 AAPL    23.0  1888.0   NaN     NaN
           GOOG     NaN     NaN  19.9  2045.0
2019-12-30 AAPL    22.3  1887.0   NaN     NaN
           GOOG     NaN     NaN   NaN  2050.0
2019-12-31 AAPL    22.4  1900.0   NaN     NaN
           GOOG     NaN     NaN  20.1  1998.0

Также, возможно, проще, вы можете создать столбцы MultiIndex, а затем stack

df.columns = pd.MultiIndex.from_tuples([tuple(x) for x in df.columns.str.split(',')])

df = df.stack(level=0) # Index level won't have a name.
...