Получить процент значений из столбца в Panda, которые находятся в верхнем n%, например 25%, 50% и c или ниже n% - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть такой фрейм данных -

enter image description here

Мне нужны такие столбцы из таблицы -

enter image description here

Итак, итоговая таблица будет такой:

enter image description here

Как рассчитать эти столбцы.

У меня текущий код в django rest API -

@api_view(['GET','POST'])
def sale_prod(request):       
if request.method == 'GET':

    data = sales_products.objects.values()
    df = pd.DataFrame(data)
    df = df.groupby(['item_id','item_code'])['amount','quantity'].sum().reset_index()
    df.dropna(inplace=True)
    df['amount_per'] = (df.amount / df.amount.sum())*100          # revenue contribution
    df['quantity_per'] = (df.quantity / df.quantity.sum())*100    # unit sold contribution
    df = df.round({'quantity': 0, 'amount':2, 'amount_per':2, 'quantity_per':2})

    main_list = []
    for ind in df.index:

        dict1 = {}
        dict1['item_code'] = df['item_code'][ind]
        dict1['amount'] = df['amount'][ind]
        dict1['quantity'] = df['quantity'][ind]
        dict1['amount_per'] = df['amount_per'][ind]
        dict1['quantity_per'] = df['quantity_per'][ind]
        main_list.append(dict1)

    return Response(main_list)

Этот код дает мне вывод в виде фрейма данных -

enter image description here

сумма_пер = процентная доля товара по сумме

количество_пер = процентная доля товара по количеству

Пожалуйста, помогите мне узнать правильный ответ .

1 Ответ

1 голос
/ 13 апреля 2020

Вы ищете df.quantile и некоторые основы c математика.

Представление этих значений в таблице не имеет большого значения - это еще три столбца, умноженные на len(df) все данные одинаковы - поэтому я даю им простые выражения:

import pandas as pd
import random

# some data shuffling to see it works on unsorted data
random.seed(42)
data = [[f"product {i+1:3d}",i*10] for i in range(100)]
random.shuffle(data)

df = pd.DataFrame(data, columns=['name', 'price']) 

# calculate the quantile series
q25 = df.quantile(.25, numeric_only=True)
q50 = df.quantile(.5, numeric_only=True)
q75 = df.quantile(.75, numeric_only=True)

print (q25, q50, q75, sep="\n\n")

print( f"Bottom 25% of prices are below/equal to {q25.price} thats", end=" ") 
print( f"{len(df[df.price <= q25.price]) / (len(df) / 100)}% of all items")

print( f"Bottom 50% of prices are below/equal to {q50.price} thats", end=" ")
print( f"{len(df[df.price <= q50.price]) / (len(df) / 100)}% of all items")

print( f"Bottom 75% of prices are below/equal to {q75.price} thats", end= " ")
print( f"{len(df[df.price <= q75.price]) / (len(df)/ 100)}% of all items")

(Unshuffled) Dataframe выглядит как

           name  price
0   product   1      0
1   product   2     10
2   product   3     20 
..          ...    ...  
97  product  98    970
98  product  99    980
99  product 100    990

[100 rows x 2 columns]

Вывод:

price    247.5
Name: 0.25, dtype: float64

price    495.0
Name: 0.5, dtype: float64

price    742.5
Name: 0.75, dtype: float64

Bottom 25% of prices are below/equal to 247.5 thats 25.0% of all items
Bottom 50% of prices are below/equal to 495.0 thats 50.0% of all items
Bottom 75% of prices are below/equal to 742.5 thats 75.0% of all items
...