отображение значений из групповой в Dataframe в Python - PullRequest
0 голосов
/ 04 апреля 2019

Я работаю на

https://www.kaggle.com/c/competitive-data-science-final-project

и я хочу написать собственный скалер. Для этого я хочу создать новый столбец, который будет означать среднюю выручку на основе shop_id и квартала года. этим значением я намерен масштабировать данные о доходах. Так что эта тема о получении значений из ряда groupby в фрейм данных .

групповая серия:

all_sales.groupby(by=["year","quarter","shop_id"]).revenue.mean()
// ..........................................
// : year : quarter : shop_id :             :
// :......:.........:.........:.............:
// : 2013 :       1 :       0 :  673.366136 :
// :      :         :       1 :  570.307679 :
// :      :         :       2 : 1060.903808 :
// :      :         :       3 :  742.238854 :
// :      :         :       4 :  793.700453 :
// :      :         :       5 :  634.066920 :
// :......:.........:.........:.............:

Я хотел отобразить его, я искал другие решения, но я нашел только решения, в которых значение фиксировано - например, если бы я хотел отобразить среднее значение для shop_id 54, я бы просто использовал apply (...). я думал об использовании лямбда, карта, applymap

вот набор данных - начальная фаза:

+---------+------------+----------------+---------+---------+------------+--------------+-----------+-----------+------------------+-----------------+---------+---------+------+---------+-------+
|         |    date    | date_block_num | shop_id | item_id | item_price | item_cnt_day | latitude  | longitude | item_category_id | category_number | weekday | revenue | year | quarter | Q_avg |
+---------+------------+----------------+---------+---------+------------+--------------+-----------+-----------+------------------+-----------------+---------+---------+------+---------+-------+
| 2580899 | 2013-01-01 |              0 |      28 |   10832 |      399.0 |          1.0 | 55.604232 | 37.491973 |               40 |               4 |       1 |   399.0 | 2013 |       1 |     0 |
|  835894 | 2013-01-01 |              0 |      41 |   12750 |      119.0 |          1.0 | 47.289983 | 39.847001 |               40 |               4 |       1 |   119.0 | 2013 |       1 |     0 |
|  519245 | 2013-01-01 |              0 |      28 |    1249 |      299.0 |          1.0 | 55.604232 | 37.491973 |               55 |              12 |       1 |   299.0 | 2013 |       1 |     0 |
| 2578875 | 2013-01-01 |              0 |      42 |   10555 |      199.0 |          1.0 | 59.932022 | 30.359193 |               55 |              12 |       1 |   199.0 | 2013 |       1 |     0 |
|  303337 | 2013-01-01 |              0 |       7 |    3325 |     1199.0 |          1.0 | 51.696833 | 39.273076 |               30 |              14 |       1 |  1199.0 | 2013 |       1 |     0 |
| 2508902 | 2013-01-01 |              0 |      27 |   12623 |      649.0 |          1.0 | 55.658314 | 37.845215 |               37 |               4 |       1 |   649.0 | 2013 |       1 |     0 |
|  330640 | 2013-01-01 |              0 |      19 |   17707 |      899.0 |          1.0 | 51.737952 | 36.192223 |               19 |               8 |       1 |   899.0 | 2013 |       1 |     0 |
|  316521 | 2013-01-01 |              0 |       7 |    3693 |      299.5 |          1.0 | 51.696833 | 39.273076 |               21 |               8 |       1 |   299.5 | 2013 |       1 |     0 |
|  835868 | 2013-01-01 |              0 |      15 |   12750 |      119.0 |          1.0 | 54.516081 | 36.246664 |               40 |               4 |       1 |   119.0 | 2013 |       1 |     0 |
|   60981 | 2013-01-01 |              0 |      28 |    5272 |      598.5 |          1.0 | 55.604232 | 37.491973 |               30 |              14 |       1 |   598.5 | 2013 |       1 |     0 |
+---------+------------+----------------+---------+---------+------------+--------------+-----------+-----------+------------------+-----------------+---------+---------+------+---------+-------+
  1. слишком медленно, но должно работать;
avg=[]
for i in range(len(all_sales)):
    shopid=all_sales.shop_id.iloc[i]
    year=all_sales.year.iloc[i]
    quarter=all_sales.quarter.iloc[i]
    avg.append(all_sales.groupby(by=["year","quarter","shop_id"]).revenue.mean().loc[year].loc[quarter].loc[shopid])
    print(i)
all_sales.Q_avg=avg
  1. быстрее, но не сохраняет значения в Q_Avg:
all_sales["Q_avg"]=0
for year in [2013,2014,2015]:
    for quar in [1,2,3,4]:
        for shopid in all_sales[(all_sales.year==year)&(all_sales.quarter==quar)].shop_id.unique():
            all_sales[(all_sales.year==year)&(all_sales.quarter==quar)&(all_sales.shop_id==shopid)].Q_avg=all_sales.groupby(by=["year","quarter","shop_id"]).revenue.mean().loc[year].loc[quar].loc[shopid]

Цель (в Q_avg):


// ...............................................................................................................................................................................................................
// :         :    date    : date_block_num : shop_id : item_id : item_price : item_cnt_day : latitude  : longitude : item_category_id : category_number : weekday : revenue : year : quarter :       Q_avg       :
// :.........:............:................:.........:.........:............:..............:...........:...........:..................:.................:.........:.........:......:.........:...................:
// : 2580899 : 2013-01-01 :              0 :      28 :   10832 :      399.0 :          1.0 : 55.604232 : 37.491973 :               40 :               4 :       1 :   399.0 : 2013 :       1 : 846.1797826935596 :
// :  835894 : 2013-01-01 :              0 :      41 :   12750 :      119.0 :          1.0 : 47.289983 : 39.847001 :               40 :               4 :       1 :   119.0 : 2013 :       1 : 992.6000783392107 :
// :  519245 : 2013-01-01 :              0 :      28 :    1249 :      299.0 :          1.0 : 55.604232 : 37.491973 :               55 :              12 :       1 :   299.0 : 2013 :       1 : 846.1797826935596 :
// : 2578875 : 2013-01-01 :              0 :      42 :   10555 :      199.0 :          1.0 : 59.932022 : 30.359193 :               55 :              12 :       1 :   199.0 : 2013 :       1 : 980.5774001136369 :
// :  303337 : 2013-01-01 :              0 :       7 :    3325 :     1199.0 :          1.0 : 51.696833 : 39.273076 :               30 :              14 :       1 :  1199.0 : 2013 :       1 : 868.1195129284332 :
// :.........:............:................:.........:.........:............:..............:...........:...........:..................:.................:.........:.........:......:.........:...................:


Мой код слишком медленный, и я ищу более быстрое решение, которое работает. Поэтому я ожидаю, что последний столбец Q_avg будет заполнен значениями из groupby (на основе года, квартала, shop_id)

...