2017-02-11 7 views
1

Я пытаюсь объединить два блока данных MultiIndex'ed. Мой код ниже. Проблема, как вы можете видеть на выходе, заключается в том, что индекс DATE повторяется, тогда как я хотел бы, чтобы все значения (OPEN_INT, PX_LAST) были на одном и том же индексе даты ... любые идеи? Я пробовал как append, так и concat, но оба дают мне подобные результаты.Python Pandas - проблема с несколькими индексами Dataframes

 if df.empty: 
      df = bbg_historicaldata(t, f, startDate, endDate) 
      print(df)    
      datesArray = list(df.index) 
      tArray = [t for i in range(len(datesArray))] 
      arrays = [tArray, datesArray] 
      tuples = list(zip(*arrays)) 
      index = pd.MultiIndex.from_tuples(tuples, names=['TICKER', 'DATE'])      
      df = pd.DataFrame({f : df[f].values}, index=index) 
    else: 
     temp = bbg_historicaldata(t,f,startDate,endDate) 
      print(temp) 
      datesArray = list(temp.index) 
      tArray = [t for i in range(len(datesArray))] 
      arrays = [tArray, datesArray] 
      tuples = list(zip(*arrays)) 
      index = pd.MultiIndex.from_tuples(tuples, names=['TICKER', 'DATE']) 


      temp = pd.DataFrame({f : temp[f].values}, index=index) 

      #df = df.append(temp, ignore_index = True) 
      df = pd.concat([df, temp], axis = 1).sortlevel() 

По существу, не нужны никакие NaN!

     PX_LAST OPEN_INT PX_LAST OPEN_INT PX_LAST \ 
TICKER  DATE               
EDH8 COMDTY 2017-02-01 98.365 1008044.0  NaN  NaN  NaN 
      2017-02-02 98.370 1009994.0  NaN  NaN  NaN 
      2017-02-03 98.360 1019181.0  NaN  NaN  NaN 
      2017-02-06 98.405 1023863.0  NaN  NaN  NaN 
      2017-02-07 98.410 1024609.0  NaN  NaN  NaN 
      2017-02-08 98.435 1046258.0  NaN  NaN  NaN 
      2017-02-09 98.395 1050291.0  NaN  NaN  NaN 
EDM8 COMDTY 2017-02-01  NaN  NaN 98.245 726739.0  NaN 
      2017-02-02  NaN  NaN 98.250 715081.0  NaN 
      2017-02-03  NaN  NaN 98.235 723936.0  NaN 
      2017-02-06  NaN  NaN 98.285 729324.0  NaN 
      2017-02-07  NaN  NaN 98.295 728673.0  NaN 
      2017-02-08  NaN  NaN 98.325 728520.0  NaN 
      2017-02-09  NaN  NaN 98.280 741840.0  NaN 
EDU8 COMDTY 2017-02-01  NaN  NaN  NaN  NaN 98.130 
      2017-02-02  NaN  NaN  NaN  NaN 98.135 
      2017-02-03  NaN  NaN  NaN  NaN 98.120 
      2017-02-06  NaN  NaN  NaN  NaN 98.180 
      2017-02-07  NaN  NaN  NaN  NaN 98.190 
      2017-02-08  NaN  NaN  NaN  NaN 98.225 
      2017-02-09  NaN  NaN  NaN  NaN 98.175 

EDIT: Doing Axis = 0, дает следующее :. Я хотел бы, чтобы свернуть дублированные даты (то есть, каждый индекс даты, чтобы иметь уникальные значения, не дублируются дней или пренебрежимо малых)

      OPEN_INT PX_LAST 
TICKER  DATE       
EDH8 COMDTY 2017-02-01  NaN 98.365 
      2017-02-01 1008044.0  NaN 
      2017-02-02  NaN 98.370 
      2017-02-02 1009994.0  NaN 
      2017-02-03  NaN 98.360 
      2017-02-03 1019181.0  NaN 
      2017-02-06  NaN 98.405 
      2017-02-06 1023863.0  NaN 
      2017-02-07  NaN 98.410 
      2017-02-07 1024609.0  NaN 
      2017-02-08  NaN 98.435 
      2017-02-08 1046258.0  NaN 
      2017-02-09  NaN 98.395 
      2017-02-09 1050291.0  NaN 
EDM8 COMDTY 2017-02-01  NaN 98.245 
      2017-02-01 726739.0  NaN 
      2017-02-02  NaN 98.250 
      2017-02-02 715081.0  NaN 
      2017-02-03  NaN 98.235 
      2017-02-03 723936.0  NaN 
      2017-02-06  NaN 98.285 
      2017-02-06 729324.0  NaN 
      2017-02-07  NaN 98.295 
      2017-02-07 728673.0  NaN 
      2017-02-08  NaN 98.325 
      2017-02-08 728520.0  NaN 
      2017-02-09  NaN 98.280 
      2017-02-09 741840.0  NaN 

Здесь входные данные печатные. Я добавил печать (df) и печать (темп) выше. Все они - данные с DATE в качестве индекса. Индекс TICKER исходит из переменной «F» из цикла «для F в полях:»

  PX_LAST 
DATE    
2017-02-01 98.365 
2017-02-02 98.370 
2017-02-03 98.360 
2017-02-06 98.405 
2017-02-07 98.410 
2017-02-08 98.435 
2017-02-09 98.395 
      OPEN_INT 
DATE     
2017-02-01 1008044.0 
2017-02-02 1009994.0 
2017-02-03 1019181.0 
2017-02-06 1023863.0 
2017-02-07 1024609.0 
2017-02-08 1046258.0 
2017-02-09 1050291.0 
      PX_LAST 
DATE    
2017-02-01 98.245 
2017-02-02 98.250 
2017-02-03 98.235 
2017-02-06 98.285 
2017-02-07 98.295 
2017-02-08 98.325 
2017-02-09 98.280 
      OPEN_INT 
DATE     
2017-02-01 726739.0 
2017-02-02 715081.0 
2017-02-03 723936.0 
2017-02-06 729324.0 
2017-02-07 728673.0 
2017-02-08 728520.0 
2017-02-09 741840.0 
      PX_LAST 
DATE    
2017-02-01 98.130 
2017-02-02 98.135 
2017-02-03 98.120 
2017-02-06 98.180 
2017-02-07 98.190 
2017-02-08 98.225 
2017-02-09 98.175 
      OPEN_INT 
DATE     
2017-02-01 584448.0 
2017-02-02 574246.0 
2017-02-03 581897.0 
2017-02-06 585169.0 
2017-02-07 590248.0 
2017-02-08 598478.0 
2017-02-09 595884.0 
+1

Значения индекса «TICKER» отличаются. Вы хотите игнорировать/понижать этот уровень индекса? Каков желаемый результат? – unutbu

+0

Так что в основном я надеюсь иметь мультииндексированный dataframe. Первый индекс - TICKER. Следующий индекс - это дата.Затем следуют столбцы PX_LAST и OPEN_INT. – keynesiancross

+0

Для каждого тикера будут данные временных рядов, но все тикеры собираются использовать одни и те же столбцы. – keynesiancross

ответ

2

Ваша логика немного трудно следовать (это трудно понять, почему иногда вы получаете различные столбцы с вашего вызов данных, например). AFAICT, действительно, вы просто хотите сделать join среди всех фреймов с тем же тикером (если вы установите индекс в TICKER, DATE) или merge, если TICKER и DATE являются столбцами, а затем объединяют результаты этих. Он пытается сделать их как в один шаг, который вызывает проблему.

В качестве альтернативы мы можем просто контактировать все это, а затем поворачиваться, что я и сделаю здесь, потому что это легче показать.

(В качестве альтернативы многократное конкатенирование в цикле может быть проблемой производительности, поскольку каждый раз необходимо копировать много данных и, как правило, следует избегать - собрать коллекцию того, что вы хотите сначала соединить, и затем применить это)


если предположить, что каждый из ваших кадров начинает выглядеть как следующий (где столбец может отличаться.):

In [532]: df 
Out[532]: 
      PX_LAST 
DATE    
2017-02-01 98.365 
2017-02-02 98.370 
2017-02-03 98.360 
2017-02-06 98.405 
2017-02-07 98.410 
2017-02-08 98.435 
2017-02-09 98.395 

то вместо того, что вы делаете сейчас я d просто добавьте тикер к фрейму и сбросьте индекс :

In [549]: df = df.assign(TICKER=t).reset_index() #TICKER variable = t 
Out[549]: 
     DATE PX_LAST  TICKER 
0 2017-02-01 98.365 EDH8 COMDTY 
1 2017-02-02 98.370 EDH8 COMDTY 
2 2017-02-03 98.360 EDH8 COMDTY 
3 2017-02-06 98.405 EDH8 COMDTY 
4 2017-02-07 98.410 EDH8 COMDTY 
5 2017-02-08 98.435 EDH8 COMDTY 
6 2017-02-09 98.395 EDH8 COMDTY 

Для того, чтобы конкатенация больше памяти людей, давайте расплавить это:

In [579]: pd.melt(df, id_vars=["TICKER", "DATE"]) 
Out[579]: 
     TICKER  DATE variable value 
0 EDH8 COMDTY 2017-02-01 PX_LAST 98.365 
1 EDH8 COMDTY 2017-02-02 PX_LAST 98.370 
2 EDH8 COMDTY 2017-02-03 PX_LAST 98.360 
3 EDH8 COMDTY 2017-02-06 PX_LAST 98.405 
4 EDH8 COMDTY 2017-02-07 PX_LAST 98.410 
5 EDH8 COMDTY 2017-02-08 PX_LAST 98.435 
6 EDH8 COMDTY 2017-02-09 PX_LAST 98.395 

и добавить это в список dfs. Теперь частичные кадры будут объединены хорошо, потому что все они имеют одни и те же столбцы, и мы можем повернуть, чтобы получить наш желаемый результат:

In [589]: pd.concat(dfs).pivot_table(index=["TICKER", "DATE"], columns="variable", values="value") 
Out[589]: 
variable     OPEN_INT PX_LAST 
TICKER  DATE       
EDH8 COMDTY 2017-02-01 1008044.0 98.365 
      2017-02-02 1009994.0 98.370 
      2017-02-03 1019181.0 98.360 
      2017-02-06 1023863.0 98.405 
[...] 

Это позволяет избежать все эти промежуточных пренебрежимо малыми. Так как подход concatenation + pivot будет работать, даже если вы не расплавитесь, сначала я не делал таяния, но, с другой стороны, наличие этих промежуточных NaN - это плохая идея, хотя это работает, потому что требования промежуточной памяти могут вырасти до быть запретительным.

+0

ты легенда, спасибо DSM! Из любопытства, почему наличие большого количества столбцов меняет способ обращения к этой проблеме? – keynesiancross

+0

@keynesiancross: чем больше столбцов (или строк, если на то пошло), тем больше вашего промежуточного предварительно отформатированного фреймворка является только NaN. Это означает, что вы можете иметь * огромный * промежуточный кадр в памяти, хотя окончательная версия будет во много раз меньше. Фактически, я на самом деле собираюсь переключить порядок моих рекомендаций, чтобы не приводить кого-либо еще по этому пути. – DSM

+0

Это имеет смысл - спасибо за помощь DSM. – keynesiancross

Смежные вопросы