Python - Pandas: ордера на покупку и продажу разбиты на несколько строк, я хочу объединить их обратно в 1 строку.Так что 1 заказ = 1 строка - PullRequest
0 голосов
/ 11 октября 2018

Это ордера на покупку и продажу, все в размере 0,02.Но они были разбиты на меньшее количество частей, и поэтому каждый заказ теперь занимает более одного ряда.Я хочу объединить строки, принадлежащие к одному и тому же порядку.

Столбец «Время» имеет уникальную метку времени для каждого заказа.Итак, глядя на это, мы можем видеть 4 порядка

Порядок 1 - это строки 3, 4
Порядок 2 - это строки 5, 6, 7
Порядок 3 - это строки 8, 9
Порядок 4 - это строки 10, 11, 12

Исходный фрейм данных:

| 1| Time      | Market    | Type  | Price    | Amount  | Total     | Fee      | Acc     |
| 2|-----------|-----------|-------|----------|---------|-----------|----------|---------|
| 3| 17:59:31  | Market 1  | Buy   | 1207.55  | 0.0198  | 13.07451  | 0.00989  | MXG 36  |
| 4| 17:59:31  | Market 1  | Buy   | 1207.20  | 0.0002  | 0.013086  | 0.00005  | MXG 36  |
| 5| 15:42:12  | Market 1  | Sell  | 1146.78  | 0.0100  | 3.073645  | 0.00232  | MXG 36  |
| 6| 15:42:12  | Market 1  | Sell  | 1147.44  | 0.0058  | 8.005802  | 0.00746  | MXG 36  |
| 7| 15:42:12  | Market 1  | Sell  | 1147.91  | 0.0042  | 2.000000  | 0.00993  | MXG 36  |
| 8| 12:05:45  | Market 1  | Buy   | 1355.20  | 0.0077  | 7.433008  | 0.00050  | MXG 36  |
| 9| 12:05:45  | Market 1  | Buy   | 1355.00  | 0.0123  | 5.833023  | 0.00755  | MXG 36  |
|10| 10:22:17  | Market 1  | Sell  | 1002.07  | 0.0010  | 0.373225  | 0.00238  | MXG 36  |
|11| 10:22:17  | Market 1  | Sell  | 1001.35  | 0.0055  | 10.00000  | 0.00003  | MXG 36  |
|12| 10:22:17  | Market 1  | Sell  | 1001.20  | 0.0135  | 3.001038  | 0.00330  | MXG 36  |

Желаемый конечный результат:

| 1| Time      | Market    | Type  | Price     | Amount  | Total     | Fee      | Acc     |
| 2|-----------|-----------|-------|-----------|---------|-----------|----------|---------|
| 3| 17:59:31  | Market 1  | Buy   | avg price | 0.0200  | 13.087596 | 0.01039  | MXG 36  |
| 4| 15:42:12  | Market 1  | Sell  | avg price | 0.0200  | 13.079447 | 0.01971  | MXG 36  |
| 5| 12:05:45  | Market 1  | Buy   | avg price | 0.0200  | 13.266031 | 0.00805  | MXG 36  |
| 6| 10:22:17  | Market 1  | Sell  | avg price | 0.0200  | 13.374263 | 0.00598  | MXG 36  |

Итак, что было сделано здесь, примерноследующее:

  • Столбец «Цена»: Мы можем просто игнорировать.В идеале я хочу найти средневзвешенную цену на основе столбца «Сумма», но для простоты давайте пока проигнорируем это.
  • Столбец «Тип»: необходимо, чтобы правильное значение придерживалось правильного значенияorder.
  • Столбцы 'Market' и 'Acc': имеют одинаковое значение в каждой строке, поэтому просто нужно стать 1 строкой вместо 2-3 строк.
  • The Amount,Столбцы 'Total' и 'Fee': должны быть суммой, сложив их вместе

Самое близкое, что я получил, это:

df.pivot_table(index= 'Time', values = ['Amount', 'Total', 'Fee'], aggfunc = 'sum')

| 1|           | Amount  | Total     | Fee       |
| 2| Time      |         |           |           |
| 3|-----------|---------|-----------|-----------|
| 4| 17:59:31  | 0.0200  | 'correct' | 'correct' |
| 5| 15:42:12  | 0.0200  | 'correct' | 'correct' |
| 6| 12:05:45  | 0.0200  | 'correct' | 'correct' |
| 7| 10:22:17  | 0.0200  | 'correct' | 'correct' |

"Правильные" ячейки просточтобы сэкономить немного времени (создание таблиц было достаточно трудоемким: P).Но они показывают желаемые результаты.Но все остальные столбцы отсутствуют, в том числе столбец «Тип», в котором были данные «купить» или «продать», которые необходимо было привязать к каждому заказу.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

IIUC, я бы использовал groupby со словарем в agg, например:

d_agg = {'Market':'first'
        ,'Type':'first'
        ,'Price':'mean'
        ,'Amount':'sum'
        ,'Total':'sum'
        ,'Fee':'sum'
        ,'Acc':'first'}
df.groupby('Time', sort=False)['Market','Type','Price','Amount','Total','Fee','Acc']\
  .agg(d_agg).reset_index()

Вывод:

          Time       Market     Type        Price  Amount      Total      Fee        Acc
0   17:59:31     Market 1     Buy     1207.375000    0.02  13.087596  0.00994   MXG 36  
1   15:42:12     Market 1     Sell    1147.376667    0.02  13.079447  0.01971   MXG 36  
2   12:05:45     Market 1     Buy     1355.100000    0.02  13.266031  0.00805   MXG 36  
3   10:22:17     Market 1     Sell    1001.540000    0.02  13.374263  0.00571   MXG 36  

И вы можете использовать pivot_table ссловарь, чтобы определить, как сделать агрегации, как это:

d_agg = {'Price':'mean'
        ,'Amount':'sum'
        ,'Total':'sum'
        ,'Fee':'sum'}

df.pivot_table(index=['Time','Market','Type','Acc'], 
               values = ['Amount', 'Total', 'Fee','Price'], 
               aggfunc = d_agg)\
  .reset_index()

Вывод:

          Time       Market     Type        Acc  Amount      Fee        Price      Total
0   10:22:17     Market 1     Sell     MXG 36      0.02  0.00571  1001.540000  13.374263
1   12:05:45     Market 1     Buy      MXG 36      0.02  0.00805  1355.100000  13.266031
2   15:42:12     Market 1     Sell     MXG 36      0.02  0.01971  1147.376667  13.079447
3   17:59:31     Market 1     Buy      MXG 36      0.02  0.00994  1207.375000  13.087596
0 голосов
/ 12 октября 2018

Попробуйте объединить результат сводной таблицы на начальном фрейме данных:

df = pd.merge(df, 
     df.pivot_table(index= 'Time', 
                    values = ['Amount', 'Total', 'Fee'], 
                    aggfunc = 'sum'), 
     how = 'outer')

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...