#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».