这种情况下,最好的解决办法是先仔细想想业务需求是什么,根据实际情况可以用pandas搭建一个小型模型,一旦搭建完毕,你每天上班时就可以愉快地运行Python脚本,转身去喝杯咖啡,几分钟后心满意足地回来,发现所有的繁琐操作已经搞定了,生活是这么美好、、、
首先让我们一起制作一些假数据,我这里接下来生成一些有关订单的假数据,当然,到了文章的最后可能你会发现我们的模型并不是完美适用于这个类型,你会在生活中根据自己需要来调整,但是至少基础的思路已经有啦!
先建立一个fake_product的字典,keys是产品,value是单价,这里我们用一个在网上随便找到的商品名称的csv数据集,它只有一列ProductNames,product_names.csv和最后的代码都会放在github上,如果大家感兴趣可以下载~
这里我们可以看到,数据集主要包括的就是一些产品的名字,而且没有重复值,我们现在把他们导出至一个字典,并随机给每个产品任意的价格(在20至100之间),因为这里我们要随机生成一些假数据,所以让我们引用random这个包
{'TrailChef Deluxe Cook Set': 62,
'TrailChef Double Flame': 78,
'Star Dome': 58,
'Star Gazer 2': 73,
'Hibernator Lite': 56,
'Hibernator Extreme': 99,
'Hibernator Camp Cot': 33,
'Firefly Lite': 27,
'Firefly Extreme': 30,
'EverGlow Single': 44,
'EverGlow Butane': 33,
'Husky Rope 50': 59,
'Husky Rope 60': 81,
'Husky Rope 100': 71,
'Husky Rope 200': 81,
'Granite Climbing Helmet': 86,
'Husky Harness': 76,
'Husky Harness Extreme': 73,
'Granite Signal Mirror': 67,
'Granite Carabiner': 63,
'Granite Belay': 49,
'Granite Pulley': 48,
'Firefly Climbing Lamp': 47,
'Firefly Charger': 60,
'Firefly Rechargeable Battery': 52,
'Granite Chalk Bag': 22,
'Granite Ice': 71,
'Granite Hammer': 50,
'Granite Shovel': 41,
'Granite Grip': 74,
'Granite Axe': 68,
'Granite Extreme': 74,
'Mountain Man Extreme': 87,
'Polar Sun': 82,
'Polar Ice': 47,
'Edge Extreme': 53,
'Bear Survival Edge': 81,
'Glacier GPS Extreme': 48,
'BugShield Extreme': 87,
'Sun Shelter Stick': 42,
'Compact Relief Kit': 46,
'Aloe Relief': 24,
'Infinity': 73,
'TX': 43,
'Legend': 100,
'Kodiak': 44,
'Capri': 31,
'Cat Eye': 62,
'Dante': 71,
'Fairway': 77,
'Inferno': 59,
'Maximus': 38,
'Trendi': 35,
'Zone': 87,
'Max Gizmo': 67,
'Pocket Gizmo': 73,
'Ranger Vision': 73,
'Trail Master': 96,
'Hailstorm Steel Irons': 79,
'Hailstorm Titanium Irons': 31,
'Lady Hailstorm Steel Irons': 91,
'Lady Hailstorm Titanium Irons': 99,
'Hailstorm Titanium Woods Set': 74,
'Hailstorm Steel Woods Set': 30,
'Lady Hailstorm Titanium Woods Set': 99,
'Lady Hailstorm Steel Woods Set': 84,
'Course Pro Putter': 64,
'Blue Steel Putter': 26,
'Blue Steel Max Putter': 96,
'Course Pro Golf and Tee Set': 90,
'Course Pro Umbrella': 20,
'Course Pro Golf Bag': 66,
'Course Pro Gloves': 61,
'TrailChef Canteen': 60,
'TrailChef Kitchen Kit': 53,
'TrailChef Cup': 88,
'TrailChef Cook Set': 27,
'TrailChef Single Flame': 45,
'TrailChef Kettle': 70,
'TrailChef Utensils': 88,
'Star Gazer 6': 42,
'Star Peg': 28,
'Hibernator': 47,
'Hibernator Self - Inflating Mat': 66,
'Hibernator Pad': 89,
'Hibernator Pillow': 84,
'Canyon Mule Climber Backpack': 82,
'Canyon Mule Weekender Backpack': 92,
'Canyon Mule Journey Backpack': 82,
'Canyon Mule Cooler': 23,
'Canyon Mule Carryall': 56,
'Firefly Mapreader': 77,
'Firefly 2': 76,
'Firefly 4': 75,
'Firefly Multi-light': 91,
'EverGlow Double': 34,
'EverGlow Lamp': 28,
'Mountain Man Analog': 39,
'Mountain Man Digital': 85,
'Mountain Man Deluxe': 84,
'Mountain Man Combination': 40,
'Venue': 56,
'Lux': 44,
'Polar Sports': 20,
'Polar Wave': 62,
'Bella': 45,
'Hawk Eye': 42,
'Seeker 35': 81,
'Seeker 50': 90,
'Opera Vision': 98,
'Glacier Basic': 63,
'Glacier GPS': 66,
'Trail Scout': 32,
'BugShield Spray': 34,
'BugShield Lotion Lite': 90,
'BugShield Lotion': 84,
'Sun Blocker': 88,
'Sun Shelter 15': 45,
'Sun Shelter 30': 100,
'Sun Shield': 62,
'Deluxe Family Relief Kit': 43,
'Calamine Relief': 82,
'Insect Bite Relief': 72,
'Star Lite': 32,
'Star Gazer 3': 95,
'Single Edge': 87,
'Double Edge': 20,
'Bear Edge': 80,
'Glacier Deluxe': 82,
'BugShield Natural': 83,
'TrailChef Water Bag': 99,
'Canyon Mule Extreme Backpack': 58,
'EverGlow Kerosene': 78,
'Sam': 67,
'Polar Extreme': 34,
'Seeker Extreme': 43,
'Seeker Mini': 26,
'Flicker Lantern': 44,
'Trail Star': 47,
'Zodiak': 31,
'Sky Pilot': 58,
'Retro': 99,
'Astro Pilot': 99,
'Auto Pilot': 20}
这里我们看到生成了一个有144个item组成,key为产品名称,value及单价的fake_product字典,接下来为了省事,我简单地创建了一个方法get_fake_data可以让我们最终得到一个填充好的假数据集合,返回的也是字典
def get_fake_data(id_range_start,id_range_end,random_quantity_range=50):
Id=[]
Quantity = []
Product_name=[]
Unit_price=[]
Total_price=[]
for i in range(id_range_start,id_range_end):
random_quantity = random.randint(1,random_quantity_range)
name, price = random.choice(list(fake_product.items()))
Id.append("A00"+str(i))
Quantity.append(random_quantity)
Product_name.append(name)
Unit_price.append(price)
Total_price.append(price*random_quantity)
result = {
'Product_ID':Id,
'Product_Name':Product_name,
'Quantity':Quantity,
'Unit_price':Unit_price,
'Total_price':Total_price
}
return result
dict_keys(['Product_ID', 'Product_Name', 'Quantity', 'Unit_price', 'Total_price'])
我们可以利用pandas自带的from_dict方法把dict转化为Dataframe,这里我们分别用刚刚生成的fake_data来模拟1月的库存和2月的库存情况,我们可以把fake_data分成两组,A001-A00140一组,A008-A00144一组,这样就完美的模拟了实际情况。
因为大多数的商品名称不会改变(8~140的部分),但是从一月到二月,因为各种原因我们减少了7个商品种类的库存(1-7),又增加了4个种类的库存(141-144),我们这里验证一致性的公式就是:
stock.set_index(stock['Product_ID'],inplace=True)
stock.drop('Product_ID',axis=1,inplace=True)
stock.head()
接下来的操作很简单,用我们上篇文章提到的merge函数,这里merge的公有列为索引Product_ID,Product_Name,使用的是outer merge
check_corehence = stock_jan.merge(stock_fev,on=merge_keys,how='outer',suffixes=("_jan","_fev"))
check_corehence.head(10)