Я работаю на
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 |
+---------+------------+----------------+---------+---------+------------+--------------+-----------+-----------+------------------+-----------------+---------+---------+------+---------+-------+
- слишком медленно, но должно работать;
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
- быстрее, но не сохраняет значения в 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)