Вставка значений из фрейма данных в другой фрейм данных, оба DF индексируются по датам

#pandas

#pandas

Вопрос:

У меня есть df1 :

                      GOOG  AAPL  XOM  IBM  _CASH
2011-01-13 16:00:00     0     0    0    0      0
2011-01-14 16:00:00     0     0    0    0      0
2011-01-18 16:00:00     0     0    0    0      0
2011-01-19 16:00:00     0     0    0    0      0
2011-01-20 16:00:00     0     0    0    0      0
...
  

и df2 :

     year  month  day symbol order_type  shares  trans_date
0   2011      1   13   AAPL       Sell    1500  2011-01-13
1   2011      1   13    IBM        Buy    4000  2011-01-13
2   2011      1   26   GOOG        Buy    1000  2011-01-26
3   2011      2    2    XOM       Sell    4000  2011-02-02
4   2011      2   10    XOM        Buy    4000  2011-02-10
5   2011      3    3   GOOG       Sell    1000  2011-03-03
6   2011      3    3    IBM       Sell    2200  2011-03-03
7   2011      6    3    IBM       Sell    3300  2011-06-03
8   2011      5    3    IBM        Buy    1500  2011-05-03
9   2011      6   10   AAPL        Buy    1200  2011-06-10
10  2011      8    1   GOOG        Buy      55  2011-08-01
11  2011      8    1   GOOG       Sell      55  2011-08-01
12  2011     12   20   AAPL       Sell    1200  2011-12-20
  

Я хочу вставить значение df2 ‘shares’ в соответствующую df1 строку даты и df1 соответствующий столбец символов. Знак значения ‘shares’ будет положительным для ‘buy’ ‘order_type’ и отрицательным для ‘Sell’

Например, для первой строки df2 значение -1500 будет вставлено в столбец ‘AAPL’ df1 , строка, сопоставленная по df2 ‘trans_date’ и df1 отметке времени.

Индексируются как df2 ‘trans_date’, так и df1 timestamp.

Я благодарен за вашу помощь.

Я сложил df1 и объединил с df2, используя это:

pd.merge(df_stacked_mx, df_orders, left_index=True, right_index=True, how=’inner’)

Я получил это:

  level_0             level_1  0  year  month  day symbol order_type  shares  
0  2011-01-13 16:00:00    GOOG  0  2011      1   13   AAPL       Sell    1500   
1  2011-01-13 16:00:00    AAPL  0  2011      1   13    IBM        Buy    4000   
2  2011-01-13 16:00:00     XOM  0  2011      1   26   GOOG        Buy    1000   
3  2011-01-13 16:00:00     IBM  0  2011      2    2    XOM       Sell    4000   
4  2011-01-13 16:00:00   _CASH  0  2011      2   10    XOM        Buy    4000   
5  2011-01-14 16:00:00    GOOG  0  2011      3    3   GOOG       Sell    1000   
6  2011-01-14 16:00:00    AAPL  0  2011      3    3    IBM       Sell    2200   
7  2011-01-14 16:00:00     XOM  0  2011      6    3    IBM       Sell    3300   
8  2011-01-14 16:00:00     IBM  0  2011      5    3    IBM        Buy    1500   
9  2011-01-14 16:00:00   _CASH  0  2011      6   10   AAPL        Buy    1200   
10 2011-01-18 16:00:00    GOOG  0  2011      8    1   GOOG        Buy      55   
11 2011-01-18 16:00:00    AAPL  0  2011      8    1   GOOG       Sell      55   
12 2011-01-18 16:00:00     XOM  0  2011     12   20   AAPL       Sell    1200   


            trans_date  
0  2011-01-13 16:00:00  
1  2011-01-13 16:00:00  
2  2011-01-26 16:00:00  
3  2011-02-02 16:00:00  
4  2011-02-10 16:00:00  
5  2011-03-03 16:00:00  
6  2011-03-03 16:00:00  
7  2011-06-03 16:00:00  
8  2011-05-03 16:00:00  
9  2011-06-10 16:00:00  
10 2011-08-01 16:00:00  
11 2011-08-01 16:00:00  
12 2011-12-20 16:00:00  
  

Я понятия не имею, куда идти дальше, и мне нужна помощь.

Нарисовал

Спасибо, Боб, за твой вклад в GitHub. Очень элегантно и без зацикливания. мне потребовалась бы целая вечность, чтобы добраться до ответа.

Есть одна проблема. Накопленное обновление df1 возвращает «Нет». Индексы не совпадают:

Мой стекированный df2 выглядит так:

 trans_date           symbol
2011-01-13 16:00:00  AAPL     -1500
                     IBM       4000
2011-01-26 16:00:00  GOOG      1000
2011-02-02 16:00:00  XOM      -4000
2011-02-10 16:00:00  XOM       4000
2011-03-03 16:00:00  GOOG     -1000
                     IBM      -2200
2011-05-03 16:00:00  IBM       1500
2011-06-03 16:00:00  IBM      -3300
2011-06-10 16:00:00  AAPL      1200
2011-08-01 16:00:00  GOOG         0
2011-12-20 16:00:00  AAPL     -1200
  

Yours is:

 trans_date  symbol
2011-01-13  AAPL     -1500
            IBM       4000
2011-01-26  GOOG      1000
2011-02-02  XOM      -4000
2011-02-10  XOM       4000
2011-03-03  GOOG     -1000
            IBM      -2200
2011-05-03  IBM       1500
2011-06-03  IBM      -3300
2011-06-10  AAPL      1200
2011-08-01  GOOG         0
2011-12-20  AAPL     -1200
Name: shares, dtype: int64
  

Обратите внимание, что у меня есть время в дате.

Но у моего df1 нет времени в дате:

                 GOOG  AAPL  XOM  IBM  _CASH
2011-01-13     0     0    0    0      0
2011-01-26     0     0    0    0      0
2011-02-02     0     0    0    0      0
2011-02-10     0     0    0    0      0
2011-03-03     0     0    0    0      0
2011-05-03     0     0    0    0      0
2011-06-03     0     0    0    0      0
2011-06-10     0     0    0    0      0
2011-08-01     0     0    0    0      0
2011-12-20     0     0    0    0      0
  

Это сбивает с толку. Если я создаю df, используя все временные метки между начальной и конечной датой, я получаю временные метки:

                    GOOG  AAPL  XOM  IBM  _CASH
2011-01-13 16:00:00     0     0    0    0      0
2011-01-14 16:00:00     0     0    0    0      0
2011-01-18 16:00:00     0     0    0    0      0
2011-01-19 16:00:00     0     0    0    0      0
2011-01-20 16:00:00     0     0    0    0      0
2011-01-21 16:00:00     0     0    0    0      0
2011-01-24 16:00:00     0     0    0    0      0
2011-01-25 16:00:00     0     0    0    0      0
2011-01-26 16:00:00     0     0    0    0      0
2011-01-27 16:00:00     0     0    0    0      0
2011-01-28 16:00:00     0     0    0    0      0
2011-01-31 16:00:00     0     0    0    0      0
2011-02-01 16:00:00     0     0    0    0      0
2011-02-02 16:00:00     0     0    0    0      0
2011-02-03 16:00:00     0     0    0    0      0
2011-02-04 16:00:00     0     0    0    0      0
2011-02-07 16:00:00     0     0    0    0      0
2011-02-08 16:00:00     0     0    0    0      0
2011-02-09 16:00:00     0     0    0    0      0
2011-02-10 16:00:00     0     0    0    0      0
2011-02-11 16:00:00     0     0    0    0      0
2011-02-14 16:00:00     0     0    0    0      0
2011-02-15 16:00:00     0     0    0    0      0
2011-02-16 16:00:00     0     0    0    0      0
2011-02-17 16:00:00     0     0    0    0      0
2011-02-18 16:00:00     0     0    0    0      0
2011-02-22 16:00:00     0     0    0    0      0
2011-02-23 16:00:00     0     0    0    0      0
2011-02-24 16:00:00     0     0    0    0      0
2011-02-25 16:00:00     0     0    0    0      0
                  ...   ...  ...  ...    ...
  

Однако, если я создам df только с датами в df2, компонент времени будет удален????:

Я нахожусь в аду даты и времени, Боб, как вы, вероятно, можете сказать.

Очевидное решение — сделать оба индекса в формате даты со временем, но я не знаю, как это сделать для файла df1. Также обратите внимание, что удаление компонента времени в индексе df2 не является вариантом. Этот df должен быть в конечном итоге объединен с большим df, который содержит все даты между началом / окончанием, то есть тот, который имеет время в дате.

Миллион благодарностей за ваши усилия от моего имени, Боб.

Комментарии:

1. Дрю, я бы, вероятно, использовал Pandas’ Stack() на df1 вот так df1.stack() , а затем объединил два фрейма. Это должно подвести вас довольно близко

2. Спасибо, Боб. Я попробую.

3. Похоже, что это не совсем правильно, потому что ваши индексы не выровнены. Каков результат df2.index ?

4. Кроме того, как вы собираетесь обрабатывать несколько строк для одного и того же дня и символа? например, GOOG имеет две строки для 8/1/11

5. Спасибо Бобу за быстрый ответ. Параметрами индекса для df2 являются «return pd.TimeSeries(index= dates, data= dates) RangeIndex(start= 0, stop = 13, step = 1)» . Чем больше я смотрю на это, я думаю, что единственный способ — выполнить итерацию по df2 и передать значения столбцов каждой строки в функцию, которая ищет совпадение даты в df1 и заменяет значения столбцов df1. a с соответствующей логикой для обработки транзакций типа «GOOG».