Получить данные в нужном формате - PullRequest
0 голосов
/ 22 октября 2018

Я немного новичок в Python, и у меня есть следующее требование.

Value         Date  Ticket  Source  Result
0.939531371 3/1/2018    T1  Source1  1
0.951619897 3/1/2018    T2  Source1  1
0.952681914 3/1/2018    T3  Source1  0
0.957009407 3/1/2018    T4  Source2  1
0.962669466 3/1/2018    T5  Source2  0 
0.963068552 3/1/2018    T6  Source3  1
0.963480195 3/1/2018    T7  Source4  1
0.951296258 3/2/2018    T11 Source5  1
0.962434762 3/2/2018    T12 Source5  1
0.950224149 3/2/2018    T13 Source5  1
0.961191873 3/2/2018    T14 Source5  1
0.952584896 3/2/2018    T15 Source5  0
0.962093595 3/2/2018    T16 Source5  1
0.975999737 3/2/2018    T17 Source5  1

Из этого фрейма данных я хотел сгенерировать приведенный ниже фрейм данных -

Date      Source1 Source2 Source3 Source4 Source5 Overall_Result
3/1/2018   0.93     0.95   0.96     0.96      0        0.7
3/2/2018     0        0      0        0      0.95      0.85

В расчетахздесь средневзвешенного значения -

Source1 - для данной даты и для данного источника нам нужно получить общее количество билетов.Для Source1 существует 3 записи (тикета) на данную дату (01.03.2017).Столбец «Значение» для этих билетов должен быть отсортирован в порядке возрастания.Затем, основываясь на количестве билетов, наибольший вес должен быть задан наименьшему «значению»

0.945=(0.939531370722655*3) +(0.951619897215127*2)+(1*0.952681914218488)/3+2+1

Столбец «Общий результат» рассчитывается как на указанную дату,

сколько было1, разделенные на общее количество билетов на эту дату. Дата - 01.03.2008 => 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 1 + 1/10 = 0,66

У меня естьогромное количество данных, для которых эти вычисления должны быть сделаны.Количество значений столбца источника также может быть огромным.В измененном фрейме данных я хочу это как столбец.Один из способов сделать это - написать логику в функции и вызывать каждую запись.Любые предложения или помощь приветствуются.Заранее спасибо.

Ответы [ 2 ]

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

Возможно, вы забыли использовать скобки при расчете средневзвешенного значения:

> 0.93=[(0.939531370722655*3) +(0.951619897215127*2)+(1*0.952681914218488)]/(3+2+1)

Также попробуйте использовать сводную таблицу на "Value" с пользовательской функцией агрегирования:

def func(series) : 
  s = series.sort_values().reset_index(drop=True).reset_index()
  return s.apply(lambda x : (len(s) - x["index"]) * x["Value"] /sum(np.arange(1, len(s) + 1)), axis=1).sum()

Вышеприведенная функция вычисляет средневзвешенное значение для ряда панд:

  • Сначала вы сортируете значения и сбрасываете индекс в порядке сортировки.
  • Затем вычисляете средневзвешенное значение.

Эта функция агрегации затем вызывается следующим образом:

df1 = df.pivot_table(index="Date", columns="Source", aggfunc={"values" : func})

, которая возвращает:

+----------+----------+----------+----------+---------+----------+
|          |  Value   |          |          |         |          |
+----------+----------+----------+----------+---------+----------+
| Source   | Source1  | Source2  | Source3  | Source4 | Source5  |
| Date     |          |          |          |         |          |
+----------+----------+----------+----------+---------+----------+
| 3/1/2018 | 0.945753 | 0.958896 | 0.963069 | 0.96348 | NaN      |
| 3/2/2018 | NaN      | NaN      | NaN      | NaN     | 0.955507 |
+----------+----------+----------+----------+---------+----------+

Затем для параметра Total_Result:

df2 = df.pivot_table(index="Date",  values="Result", aggfunc="mean")

Возвращает

+----------+----------+
|          |  Result  |
+----------+----------+
| Date     |          |
| 3/1/2018 | 0.714286 |
| 3/2/2018 | 0.857143 |
+----------+----------+

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

df1.columns = df1.columns.droplevel()
df2.columns = ["Overall_Result" ]
dfResult = pd.concat([df1, df2], axis=1)

т.е.

+----------+----------------+----------+----------+----------+---------+----------+
|          | Overall_Result | Source1  | Source2  | Source3  | Source4 | Source5  |
+----------+----------------+----------+----------+----------+---------+----------+
| Date     |                |          |          |          |         |          |
| 3/1/2018 |       0.714286 | 0.945753 | 0.958896 | 0.963069 | 0.96348 | NaN      |
| 3/2/2018 |       0.857143 | NaN      | NaN      | NaN      | NaN     | 0.955507 |
+----------+----------------+----------+----------+----------+---------+----------+
0 голосов
/ 22 октября 2018

Вы можете использовать pivot_table с пользовательской функцией агрегирования, чтобы получить первые столбцы.И groupby для добавления столбца «Результат».

import numpy as np
import pandas as pd

df2 = df.sort_values('Value').pivot_table(
        index='Date', 
        columns='Source',
        values='Value',
        aggfunc = lambda x: (x*np.arange(len(x), 0, -1)).sum()/np.arange(len(x), 0, -1).cumsum()[-1]).fillna(0)

df2['Result'] = df.groupby('Date').Result.apply(lambda x: x.sum()/np.size(x))

Вывод:

Source     Source1   Source2   Source3  Source4   Source5    Result
Date                                                               
3/1/2018  0.945753  0.958896  0.963069  0.96348  0.000000  0.714286
3/2/2018  0.000000  0.000000  0.000000  0.00000  0.955507  0.857143
...