2017-01-21 13 views
2

У меня есть dataframe (df) с 10 столбцами. Индекс имеет много разных дат, однако есть несколько идентичных дат (и сортируется по дате). Кроме того, важными столбцами для этой проблемы являются df ['Weight'] и df ['Price'].Я просматриваю каждую отдельную дату в кадре данных Pandas и настраиваю один столбец (вес), основываясь на условии на другом столбце для каждой даты

Вот пример данных с 2-мя колонками только 1 значение индекса (1/21/2017), на самом деле есть несколько дат с несколькими весами и т.д.

  Weight Price 
1/21/2017 0.1  12 
1/21/2017 0.04 21 
1/21/2017 0.03 13 
1/21/2017 0.02 22 
1/21/2017 0.2  27 
1/21/2017 0.001 30 
1/21/2017 0.1  34 
1/21/2017 0.21 21 
1/21/2017 0.003 12 
1/21/2017 0.01 32 
1/21/2017 0.04 21 
1/21/2017 0.005 12 
1/21/2017 0.05 10 
1/21/2017 0.1  3 
1/21/2017 0.091 24 

Веса добавить до 1 для конкретного индекса, и это верно для каждой уникальной даты индекса.

Теперь я пытаюсь создать столбец df ['скорректированный вес "], который будет основываться на проценте ранга каждого значения цены за конкретную дату.

Цена, которая находится в середине 80% относительно других цен на определенную дату, df ['скорректированный вес] будет равна df [' Weight '].

Для нижних 10% цен на конкретную дату df ['Adjusted weight'] будет df ['Weight']/2.

Для лучших 10% Цены на любую дату, нам нужно настроить скорректированный вес так, чтобы новый DF [скорректированный вес '] для этой даты в настоящее время будет равным 1.

Это будет сделано путем деления все веса, где цена находится в топ-10% на дату текущей суммы веса 10% -ных цен, а затем умножается на это самим номером + сумма веса, которая была отрублена снизу 10 %, чтобы сделать его еще 1.

Вот выход я желаю:

  Weight Price Percent rank Adjusted Weight 
1/21/2017 0.1  12 0.142 0.1 
1/21/2017 0.04 21 0.428 0.04 
1/21/2017 0.03 13 0.357 0.03 
1/21/2017 0.02 22 0.642 0.02 
1/21/2017 0.2  27 0.785 0.2 
1/21/2017 0.001 30 0.857 0.001 
1/21/2017 0.1  34 1  **0.168181818** 
1/21/2017 0.21 21 0.428 0.21 
1/21/2017 0.003 12 0.142 0.003 
1/21/2017 0.01 32 0.928 **0.016818182** 
1/21/2017 0.04 21 0.428 0.04 
1/21/2017 0.005 12 0.142 0.005 
1/21/2017 0.05 10 0.071 **0.025** 
1/21/2017 0.1  3 0  **0.05** 
1/21/2017 0.091 24 0.714 0.091 

Я поставил ** вокруг ценностей, которые были изменены, и coincedentally имеются 2 значения в нижней 10% проц ранга и 2 значения в 10% топ ранг. Для нижних значений 2, его справедливого веса/2 и для верха 2 я написал эту формулу в excel, = E8/(E11 + E8) * (E11 + E8 + E15 + E14- (H15 + H14)), где та таблица охватывает от D1 до H16.

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

Я хотел бы, чтобы скорректированный вес был новым столбцом, который существует вместе с оригинальными весами. Кроме того, что-то, что будет работать с другими столбцами, а также цена будет отлично.

Спасибо всем за помощь и поддержку.

С наилучшими пожеланиями.

ответ

0
def adjust(df): 
    df = df.copy() 
    b, t = df.Price.quantile([.1, .9]) 
    ltb = df.Price.lt(b) 
    get = df.Price.ge(t) 
    bsum = df.Weight[ltb].sum() 
    tsum = df.Weight[get].sum() 
    df.loc[ltb, 'Weight'] /= 2 
    df.loc[get, 'Weight'] *= (bsum/2 + tsum)/tsum 
    return df 

df.groupby(level=0).apply(adjust).reset_index(0, drop=True) 

       Weight Price 
2017-01-21 0.100000  12 
2017-01-21 0.040000  21 
2017-01-21 0.030000  13 
2017-01-21 0.020000  22 
2017-01-21 0.200000  27 
2017-01-21 0.001000  30 
2017-01-21 0.168182  34 
2017-01-21 0.210000  21 
2017-01-21 0.003000  12 
2017-01-21 0.016818  32 
2017-01-21 0.040000  21 
2017-01-21 0.005000  12 
2017-01-21 0.025000  10 
2017-01-21 0.050000  3 
2017-01-21 0.091000  24 
+0

Спасибо. Я использовал этот код, но я хочу спросить, как я боролся, как бы добавить это как другой столбец, а не заменять мою существующую таблицу весов, а также попытаюсь использовать эту функцию для других столбцов, а также цену, но по какой-то причине значения выходите так же. Я очень ценю ваш ответ - – MysterioProgrammer91

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

  • Нет связанных вопросов^_^