Snehalgupta2003code PDF
Snehalgupta2003code PDF
df = pd.read_csv(r"C:\Users\sneha\Downloads\Data_Doyen_Rules_Dataset\blinkit_dataset.c
print([Link]())
[5 rows x 25 columns]
In [4]: df
Out[4]: product_id product_name category brand price discount_pct final_price
Tata Organic
0 1 Grocery Tata 199.78 25
Grocery 300
Dettol Fresh
3 4 Household Dettol 627.17 0
Household 771
Minute Maid
Minute
4 5 Daily Beverages 101.69 15
Maid
Beverages 264
Minute Maid
Minute
12995 12996 Classic Beverages 219.17 15
Maid
Beverages 396
FreshFarm
Fruits &
12996 12997 Organic Fruits FreshFarm 348.21 5
Vegetables
225
FreshFarm
Fruits &
12997 12998 Original Fruits FreshFarm 178.86 10
Vegetables
349
Lizol Lite
12998 12999 Household Lizol 435.70 5
Household 792
Dettol Organic
12999 13000 Household Dettol 230.42 0
Household 987
print(result)
category total_products \
0 Bakery 1713
1 Beverages 1561
2 Dairy 1662
3 Fruits & Vegetables 1588
4 Grocery 1700
5 Household 1560
6 Personal Care 1620
7 Snacks 1596
product_names
0 [Britannia Organic Bakery 192, Britannia Premi...
1 [Minute Maid Daily Beverages 264, Coca-Cola Or...
2 [Mother Dairy Lite Dairy 275, Mother Dairy Lit...
3 [FreshFarm Original Fruits 804, DailyGreens Li...
4 [Tata Organic Grocery 300, Aashirvaad Fresh Gr...
5 [Dettol Fresh Household 771, Surf Excel Classi...
6 [P&G Classic Personal 439, Nivea Family Pack P...
7 [Britannia Premium Snacks 284, ITC Premium Sna...
category total_products \
0 Bakery 1713
4 Grocery 1700
2 Dairy 1662
6 Personal Care 1620
7 Snacks 1596
3 Fruits & Vegetables 1588
1 Beverages 1561
5 Household 1560
product_names
0 [Britannia Organic Bakery 192, Britannia Premi...
4 [Tata Organic Grocery 300, Aashirvaad Fresh Gr...
2 [Mother Dairy Lite Dairy 275, Mother Dairy Lit...
6 [P&G Classic Personal 439, Nivea Family Pack P...
7 [Britannia Premium Snacks 284, ITC Premium Sna...
3 [FreshFarm Original Fruits 804, DailyGreens Li...
1 [Minute Maid Daily Beverages 264, Coca-Cola Or...
5 [Dettol Fresh Household 771, Surf Excel Classi...
print(pivot)
packaging_type Bottle Box Can Jar Packet Pouch
category
Bakery 282 285 264 291 300 291
Beverages 267 269 244 261 261 259
Dairy 282 249 285 275 285 286
Fruits & Vegetables 275 267 280 248 246 272
Grocery 283 282 308 270 295 262
Household 264 278 255 250 249 264
Personal Care 277 276 275 252 262 278
Snacks 312 257 254 268 259 246
print(result)
category unique_product_types \
0 Bakery 1645
1 Beverages 1530
2 Dairy 1625
3 Fruits & Vegetables 1517
4 Grocery 1659
5 Household 1519
6 Personal Care 1572
7 Snacks 1550
product_names
0 [BakeHouse Classic Bakery 122, BakeHouse Class...
1 [Coca-Cola Classic Beverages 120, Coca-Cola Cl...
2 [Aavin Classic Dairy 111, Aavin Classic Dairy ...
3 [DailyGreens Classic Fruits 117, DailyGreens C...
4 [Aashirvaad Classic Grocery 148, Aashirvaad Cl...
5 [Dettol Classic Household 106, Dettol Classic ...
6 [Dove Classic Personal 107, Dove Classic Perso...
7 [Britannia Classic Snacks 100, Britannia Class...
Britannia
13 14 Family Pack Bakery Britannia 493.11 0
Bakery 876
Tata Lite
14 15 Grocery Tata 63.34 20
Grocery 795
Fortune
21 22 Organic Grocery Fortune 471.42 25
Grocery 168
Amul Classic
23 24 Dairy Amul 69.42 10
Dairy 954
DailyGreens
Fruits &
12977 12978 Classic Fruits DailyGreens 324.20 15
Vegetables
242
Pepsi Family
12978 12979 Pack Beverages Beverages Pepsi 300.32 5
388
Minute Maid
Minute
12993 12994 Fresh Beverages 46.33 10
Maid
Beverages 309
delayed
seller_orders = [Link]("seller").size().reset_index(name="order_count")
print(seller_orders)
print(delayed_count)
seller delay_count
0 DailyNeeds 457
4 SellerB 451
2 QuickStores 438
3 SellerA 432
5 UrbanSeller 418
1 LocalMart 409
delayed_low_rating
city avg_rating_city
0 Ahmedabad 4.182662
1 Bengaluru 4.188773
2 Chennai 4.181941
3 Delhi 4.210055
4 Hyderabad 4.212140
5 Jaipur 4.195469
6 Kolkata 4.200964
7 Lucknow 4.171515
8 Mumbai 4.232987
9 Pune 4.192437
seller avg_rating_seller
0 DailyNeeds 4.200767
1 LocalMart 4.197818
2 QuickStores 4.186965
3 SellerA 4.194620
4 SellerB 4.197149
5 UrbanSeller 4.204394
90 rows × 4 columns
Lucknow 17
Chennai 12
Jaipur 12
Pune 11
Bengaluru 8
Mumbai 7
Delhi 7
Ahmedabad 6
Kolkata 6
Hyderabad 4
Name: city, dtype: int64
LocalMart 20
SellerB 17
QuickStores 15
DailyNeeds 15
SellerA 15
UrbanSeller 8
Name: seller, dtype: int64
In [19]: df = pd.read_csv(r"C:\Users\sneha\Downloads\Data_Doyen_Rules_Dataset\blinkit_dataset.c
avg_delivery = df["delivery_time_min"].mean()
slow_orders = df[df["delivery_time_min"] > avg_delivery][["city", "seller", "delivery_
print(slow_orders)
In [20]: avg_delivery
Out[20]: 27.55876923076923
# count by city
slow_city_count = slow_orders["city"].value_counts()
print("Sellers causing delays:")
print(slow_seller_count)
In [22]: df = pd.read_csv(r"C:\Users\sneha\Downloads\Data_Doyen_Rules_Dataset\blinkit_dataset.c
low_shelf = df[df['shelf_life_days'] <= 30].copy()
low_shelf.loc[:, 'expected_sales'] = (
low_shelf['demand_index'] + low_shelf['sold_quantity']
)
low_shelf.loc[:, 'estimated_waste'] = (
(low_shelf['stock'] - low_shelf['expected_sales']).clip(lower=0)
)
In [23]: low_shelf
Out[23]: product_id product_name category brand price discount_pct final_price
Britannia
6 7 Organic Bakery Bakery Britannia 390.21 0
192
Britannia
7 8 Premium Bakery Britannia 370.21 10
Bakery 931
Britannia
13 14 Family Pack Bakery Britannia 493.11 0
Bakery 876
Gowardhan Lite
12985 12986 Dairy Gowardhan 237.93 0
Dairy 154
Modern
12989 12990 Premium Bakery Modern 312.06 5
Bakery 148
FreshFarm
Fruits &
12996 12997 Organic Fruits FreshFarm 348.21 5
Vegetables
225
FreshFarm
Fruits &
12997 12998 Original Fruits FreshFarm 178.86 10
Vegetables
349
In [ ]:
dates = [
"26-06-2024", "24-08-2024", "5/3/2028", "24-09-2027",
"2/7/2025", "13-02-2026", "15-06-2024", "29-11-2024",
"29-07-2025", "26-09-2025", "22-05-2027", "11/3/2026", "2/4/2026"
]
def parse_mixed_date(d):
if "-" in d:
# Treat as DD-MM-YYYY
return pd.to_datetime(d, dayfirst=True)
elif "/" in d:
# Treat as MM/DD/YYYY
return pd.to_datetime(d, dayfirst=True)
else:
# Fallback
return [Link](d)
original parsed
0 26-06-2024 2024-06-26
1 24-08-2024 2024-08-24
2 5/3/2028 2028-03-05
3 24-09-2027 2027-09-24
4 2/7/2025 2025-07-02
5 13-02-2026 2026-02-13
6 15-06-2024 2024-06-15
7 29-11-2024 2024-11-29
8 29-07-2025 2025-07-29
9 26-09-2025 2025-09-26
10 22-05-2027 2027-05-22
11 11/3/2026 2026-03-11
12 2/4/2026 2026-04-02
df = pd.read_csv(r"C:\Users\sneha\Downloads\Data_Doyen_Rules_Dataset\blinkit_dataset.c
import pandas as pd
from dateutil import parser
def parse_mixed_date(d):
if [Link](d):
return [Link]
d = str(d).strip()
if "-" in d:
df['parsed_date_added'] = df['date_added'].apply(parse_mixed_date)
df['parsed_expiry_date'] = df['expiry_date'].apply(parse_mixed_date)
df.to_excel(r"C:\Users\sneha\Downloads\Data_Doyen_Rules_Dataset\blinkit_dataset_parsed
index=False)
df = pd.read_csv(r"C:\Users\sneha\Downloads\Data_Doyen_Rules_Dataset\[Link]"
df['is_organic'] = df['is_organic'].astype(int)
df['parsed_date_added'] = (
pd.to_datetime(df['parsed_date_added'], errors='coerce', dayfirst=True)
)
df['parsed_expiry_date'] = (
pd.to_datetime(df['parsed_expiry_date'], errors='coerce', dayfirst=True)
)
df = [Link](subset=['sold_quantity'])
cat_cols = [
'product_name', 'category', 'brand', 'city', 'seller',
'packaging_type', 'offer_type', 'delivery_status'
]
encoders = {}
for col in cat_cols:
le = LabelEncoder()
df[col] = le.fit_transform(df[col].astype(str))
encoders[col] = le
target = 'sold_quantity'
features = [
'price', 'discount_pct', 'final_price',
'rating', 'num_reviews',
'delivery_time_min', 'stock',
'profit_margin_pct', 'is_organic',
'weight_g', 'shelf_life_days', 'reorder_level',
'demand_index', 'days_to_expiry'
] + cat_cols
imputer = SimpleImputer(strategy='median')
X = [Link](imputer.fit_transform(df[features]), columns=features)
y = df[target]
model = RandomForestRegressor(
n_estimators=300,
random_state=42,
max_depth=12,
n_jobs=-1
)
[Link](X_train, y_train)
preds = [Link](X_test)
print("MAE:", mean_absolute_error(y_test, preds))
print("R2:", r2_score(y_test, preds))
future_df = [Link]()
future_imputed = [Link](
[Link](future_df[features]),
columns=features
)
future_predictions = [Link](future_imputed)
future_df['predicted_future_sales'] = future_predictions
MAE: 35.07946955475486
R2: 0.8829500693406349
product_name predicted_future_sales
0 12091 257.939636
1 9324 55.956802
2 9917 540.056363
3 4046 58.563122
4 8275 37.954470
... ... ...
12995 8223 267.534961
12996 5546 81.110589
12997 5657 89.961828
12998 8056 65.662178
12999 4154 70.437965
product_name
0 301.419059
1 299.104814
2 50.920152
3 50.760529
4 180.135363
...
12612 41.064057
12613 191.409058
12614 160.126479
12615 71.814627
12616 477.367399
Name: predicted_future_sales, Length: 12617, dtype: float64
print(future_df[['decoded_product_name', 'predicted_future_sales']])
decoded_product_name predicted_future_sales
0 Tata Organic Grocery 300 257.939636
1 Mother Dairy Lite Dairy 275 55.956802
2 P&G Classic Personal 439 540.056363
3 Dettol Fresh Household 771 58.563122
4 Minute Maid Daily Beverages 264 37.954470
... ... ...
12995 Minute Maid Classic Beverages 396 267.534961
12996 FreshFarm Organic Fruits 225 81.110589
12997 FreshFarm Original Fruits 349 89.961828
12998 Lizol Lite Household 792 65.662178
12999 Dettol Organic Household 987 70.437965
future_df['expected_sales_before_expiry'] = future_df['predicted_future_sales']
PATH =r"C:\Users\sneha\Downloads\Data_Doyen_Rules_Dataset\[Link]"
df = pd.read_csv(PATH)
total_orders = len(df)
total_sellers = df['seller'].nunique()
total_cities = df['city'].nunique()
total_skus = df['product_id'].nunique()
seller_delay_counts = delayed['seller'].value_counts()
top5_seller_delays = seller_delay_counts.head(5).sum()
pct_delays_top5_sellers = 100 * top5_seller_delays / len(delayed)
city_delay_counts = delayed['city'].value_counts()
top3_city_delays = city_delay_counts.head(3).sum()
pct_delays_top3_cities = 100 * top3_city_delays / len(delayed)
avg_delivery = df['delivery_time_min'].mean()
orders_above_avg = df[df['delivery_time_min'] > avg_delivery]
pct_above_avg = 100 * len(orders_above_avg) / total_orders
mae = None
r2 = None
pct_skus_pred_exceed_stock = None
if 'sold_quantity' in [Link] and df['sold_quantity'].notnull().sum() > 10:
use_cols = ['price','discount_pct','final_price','rating','num_reviews',
'delivery_time_min','stock','profit_margin_pct','is_organic',
'weight_g','shelf_life_days','reorder_level','demand_index']
X_all = [Link](df_model[use_cols])
all_preds = [Link](X_all)
df_model['predicted_future_sales'] = all_preds
compare = df_model.groupby('product_id').agg(stock=('stock','first'),
predicted=('predicted_future_sales'
exceed_count = (compare['predicted'] > compare['stock']).sum()
pct_skus_pred_exceed_stock = 100 * exceed_count / len(compare) if len(compare
lines = []
[Link](f"{pct_delays_top5_sellers:.1f}% of all delays come from top 5 sellers (
[Link](f"{pct_delays_top3_cities:.1f}% of delays are concentrated in top 3 citie
[Link](f"Average delivery time = {avg_delivery:.1f} min; {pct_above_avg:.1f
[Link](f"Perishables (shelf<=30d) estimated waste = {total_est_waste:.0f}
[Link](f"{pct_lowrating_top4_sellers:.1f}% of low-rated products come from top 4
if mae is not None:
[Link](f"Model MAE = {mae:.2f} units, R2 = {r2:.2f}.")
if pct_skus_pred_exceed_stock is not None:
[Link](f"{pct_skus_pred_exceed_stock:.1f}% of SKUs predicted demand exceed c
for L in lines:
print(L)
summary = {
'total_orders': total_orders,
'total_sellers': total_sellers,
'total_cities': total_cities,
'total_skus': total_skus,
'delayed_count': len(delayed),
'top5_seller_delays': top5_seller_delays,
'pct_delays_top5_sellers': pct_delays_top5_sellers,
'top3_city_delays': top3_city_delays,
'pct_delays_top3_cities': pct_delays_top3_cities,
'avg_delivery_min': avg_delivery,
'pct_above_avg_delivery': pct_above_avg,
'perish_stock': total_perish_stock,
'est_waste_perish': total_est_waste,
'pct_waste_perish': pct_waste_perish,
'pct_lowrating_top4_sellers': pct_lowrating_top4_sellers,
'mae': mae,
'r2': r2,
'pct_skus_pred_exceed_stock': pct_skus_pred_exceed_stock
}
[Link]([summary]).to_csv("blinkit_slide_summary.csv", index=False)
print("\nSaved blinkit_slide_summary.csv with metrics.")
84.3% of all delays come from top 5 sellers (2196 delayed orders).
41.8% of delays are concentrated in top 3 cities (1088 delayed orders).
Average delivery time = 27.6 min; 49.7% of orders exceed this.
Perishables (shelf<=30d) estimated waste = 98233 units (18.0% of perish stock).
74.4% of low-rated products come from top 4 sellers.
Model MAE = 35.31 units, R2 = 0.88.
52.3% of SKUs predicted demand exceed current stock (risking stockouts).
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]: