import pandas as pd
import warnings
warnings.simplefilter('ignore')
# stock =pd.read_excel('/Users/xujingfei/Downloads/数据/北京/relation.xlsx')
stock =pd.read_excel('/Users/xujingfei/Downloads/temp/库存.xlsx')
# 处理顺序应该是center_sp_inventory 与relation 先进行映射。然后再进行groupby计算warehouse_sp_inventory
# cleaning
stock.fillna({'库存数量':0,'wms在途数量':0, 'wms验收中数量':0, 'wms发货预占库存':0},inplace=True)
# center_sp_inventory
center_sp_inventory = stock[(stock['仓库名称'].str.contains('中心仓'))&(stock['库存数量']>0)].drop([ '城市', '长宽高', '毛重', '毛重单位', '库存成本','条码','wms在途数量', 'wms验收中数量'],axis=1,inplace=False) \
.assign(temp=lambda x:x['库存数量']-x['wms发货预占库存'])
# 映射配属仓
relation = pd.read_excel('/Users/xujingfei/Downloads/temp/relation.xlsx',sheet_name='测试')
center_sp_inventory =pd.merge(center_sp_inventory,relation,left_on='仓库名称',right_on='中心仓',how='left').drop(['wms发货预占库存', '中心仓'],axis=1,inplace=False)
'''
['仓库名称', '城市', '标品名称', '长宽高', '毛重', '毛重单位', 'sp码', '库存数量', '库存成本', '货主',
'条码', '分类名称', '一级分类名称', 'wms在途数量', 'wms验收中数量', 'wms发货预占库存']
'''
# warehouse_sp_inventory
warehouse_sp_inventory = pd.merge(relation,stock,left_on='仓库名称',right_on='仓库名称',how='inner')
warehouse_sp_inventory =warehouse_sp_inventory.drop(['城市', '标品名称', '长宽高', '毛重', '毛重单位', '库存成本',
'货主', '条码', '分类名称', '一级分类名称'],axis=1,inplace=False).assign(zaitu=lambda x:x['库存数量']+x['wms在途数量']+x['wms验收中数量']-x['wms发货预占库存'])
warehouse_sp_inventory.reset_index(inplace=True,drop=True)
warehouse_sp_inventory.drop([ '库存数量', 'wms在途数量', 'wms验收中数量', 'wms发货预占库存'],axis=1,inplace=True)
warehouse_sp_inventory = warehouse_sp_inventory.groupby(by=['仓库名称', '中心仓', 'sp码']).agg({'zaitu':'sum'})
warehouse_sp_inventory.reset_index(inplace=True)
# 中心仓库存映射配属前置仓的库存
data = pd.merge(warehouse_sp_inventory,center_sp_inventory,left_on=['仓库名称','sp码'],right_on=['仓库名称_y','sp码'],how='right')
data.drop(['库存数量','中心仓'],axis=1,inplace=True)
# 库存分配临时需要
# data.to_excel('/Users/xujingfei/Downloads/data/test-code/库存502--.xlsx')
# 2.0
#记录第一次失败 修改成功数据类型为datetime64[D] ,创建dataframe的时候又修改回去了。
# date_column = pd.date_range(start='2022-04-20',periods=10,normalize=True).date # 加入date以后 返回一个numpy array 数组
# df =pd.DataFrame(columns=date_column,index=range(data.shape[0]))
# df = pd.concat([data,df],axis=1)
# # 并入销售数据
sale = pd.read_excel('/Users/xujingfei/Downloads/temp/销售.xlsx')
# 排除掉货主转换以及非销售发货
sale = sale[(~sale['关联单号'].str.contains('CIOSR'))&(sale['类型']=='销售发货')]
sale.reset_index(inplace=True)
# 以下为csv格式处理方式
# sale['创建时间'] = sale.apply(lambda x:pd.Timestamp.date(datetime.datetime.strptime(x['创建时间'],"%Y-%m-%dT%H:%M:%S.%f")),axis=1) # Series与Dataframe的apply参数不一样
# 以下因时间格式出现 不符合 格式化字符串 %Y-%m-%dT%H:%M:%S.%f
# sale['创建时间'] = sale.apply(lambda x: re.findall(r'(.+?)T',x['创建时间'])[0],axis=1) # Series与Dataframe的apply参数不一样
# 以下为excel格式
sale['创建时间'] = sale.apply(lambda x:pd.Timestamp.date(x['创建时间']),axis=1) # Series与Dataframe的apply参数不一样
# 对销售数据进行聚合
sale.drop(['index', '关联单号', '平台', '发货单号', '类型', '收货方', '商品', '出库单价',
'出库货值', '出库时间', '城市', '货主'],axis=1,inplace=True)
# groupby 以后要赋值给一个新的对象覆盖
sale = sale.groupby(['sp码', '创建时间', '仓库']).agg({'发货数量':'sum'})
#如何运用"sumifs" 排除2.0版本,使用 stack、unstack对dataframe重塑料。
## 2.0.1 对中心仓sp映射前置仓库存以后,再merge 单前置仓单sp的统计周期内的销售数据。(缺点:笛卡尔乘积会非常大,还有一个重大问题:单仓单品会有某些品没有销售记录
#两张表merge的时候没有日期填充。
# stock_sale_sp = pd.merge(data,sale,left_on=['仓库名称_y','sp码'],right_on=['仓库','sp码'],how='left')
# stock_sale_sp.to_excel('/Users/xujingfei/Downloads/data/test-code/data/分布.xlsx')
## 2.0.2
# 对销售数据直接进行unstack
sale = sale.unstack('创建时间',fill_value=0)
sale.reset_index(inplace=True)
## 2.0.2.1 对库存&销售数据拼接
stock_sale_sp = pd.merge(data,sale,left_on=['仓库名称_y','sp码'],right_on=['仓库','sp码'],how='left')
print(stock_sale_sp)
stock_sale_sp.to_excel('/Users/xujingfei/Downloads/temp/结果/6月sh.xlsx',index_label=False)