def EntrenarDemanda(BD, cantidad_particion, frecuencia, cp, cco, fecha): f = "where cod_centro_operativo=" + str(cco) + " and cod_producto=" + str( cp) + " group by cod_centro_operativo,cod_producto" sql_pedidos = "SELECT cod_centro_operativo,cod_producto FROM pedidos " + f + "" conn = my_conexion.getConnection(BD) Pedidos = pd.read_sql(sql_pedidos, conn) Resultado = pd.DataFrame() Resultado["cod_producto"] = range(0, len(Pedidos)) Resultado["cod_centro_operativo"] = range(0, len(Pedidos)) Resultado["cantidad_de_datos"] = range(0, len(Pedidos)) df = pd.DataFrame(columns=('centro_operativo', 'producto', 'cantidad_datos', 'mae_auto', 'mae_holt', 'mae_promedio')) for i in range(len(Pedidos)): cco = Pedidos['cod_centro_operativo'][i] cp = Pedidos['cod_producto'][i] VerficarDemanda(int(cco), int(cp), int(cantidad_particion), df, frecuencia, conn, fecha, BD) if (df['mae_auto'].values == 9999999999): if (df['mae_holt'].values == 9999999999): if (df['mae_promedio'].values == 9999999999): return "error" return df
def PredecirDemoraProveedor(BD,Cod_Producto,Cod_Centro_Operativo,fecha): try: dir_path = os.path.dirname(os.path.realpath("__file__")) nuevaruta = dir_path +'/ModelosEntrenados/' + BD + "/" filename = nuevaruta +'DemoraProveedor.pkl' loaded_model = pickle.load(open(filename,'rb')) conn = my_conexion.getConnection(BD) sql = "SELECT compra_precio_unitario,lead_time_teorico_compra FROM compras where cod_producto="+str(Cod_Producto)+" and cod_centro_operativo="+str(Cod_Centro_Operativo)+" order by fecha_orden_compra DESC Limit 1" datos=pd.read_sql(sql,conn) if len(datos) == 0: return 'Error Sin datos' compra_precio_unitario=str(datos['compra_precio_unitario'][0]) lead_time_teorico_compra=str(datos['lead_time_teorico_compra'][0]) fecha = datetime.strptime(fecha, "%Y-%m-%d") mes=fecha.month dia=fecha.day ano=fecha.year columnsTitles=[ 'cod_producto', 'cod_centro_operativo', 'compra_precio_unitario', 'lead_time_teorico_compra', 'dia_orden_compra', 'mes_orden_compra', 'ano_orden_compra', ] imput = pd.DataFrame(columns=columnsTitles) imput.loc[len(imput)]=[Cod_Producto,Cod_Centro_Operativo,compra_precio_unitario,lead_time_teorico_compra,dia,mes,ano] result = loaded_model.predict(imput.values) metricas=pd.read_csv(nuevaruta+'metricas_LeadTime.csv') if(metricas['MapePrediccion'][0]<metricas['MapeTeorico'][0]): lista = [ ["Prediccion",result[0]], ["Teorico",lead_time_teorico_compra], ["MapePrediccion",metricas['MapePrediccion'][0]], ["MapeLeadTime",metricas['MapeTeorico'][0]] ] else: lista = [ ["Teorico",lead_time_teorico_compra], ["Prediccion",result[0]], ["MapePrediccion",metricas['MapePrediccion'][0]], ["MapeLeadTime",metricas['MapeTeorico'][0]] ] return lista except Exception as e: print(str(e))
def forecastProm(cp, ccp, c, BD, fecha): conn = my_conexion.getConnection(BD) f = "where cod_centro_operativo=" + str(ccp) + " and cod_producto=" + str( cp ) + " AND fecha_pedido BETWEEN date_add('" + fecha + "', INTERVAL -15 DAY) AND '" + fecha + "'" sql = "select round(avg(pedido_cantidad)) as pedido_cantidad from pedidos " + f + "" promedio = pd.read_sql(sql, conn) forecast = pd.DataFrame() forecast["c"] = range(0, c) forecast["forecast"] = range(0, c) if (promedio['pedido_cantidad'].values[0] == None): forecast["forecast"] = 0 else: forecast["forecast"] = promedio['pedido_cantidad'].values[0] return (forecast["forecast"].values)
def PredecirDemanda(BD, Cod_Producto, Cod_Centro_Operativo, cantidad_a_predecir, fecha): dir_path = os.path.dirname(os.path.abspath("__file__")) nuevaruta = dir_path + '/ModelosEntrenados/' + BD + "/demanda/" try: metricas = pd.read_csv(nuevaruta + 'metricas_Demanda_' + str(Cod_Producto) + '_' + str(Cod_Centro_Operativo) + '.csv') except Exception as e: return "Error: " + str(e) op = np.argmin(metricas.iloc[:, 3:6].values) if (metricas.iloc[:, 3:6].values[0][2] == 9999999999): conn = my_conexion.getConnection(BD) f = "where cod_centro_operativo=" + str( Cod_Centro_Operativo) + " and cod_producto=" + str( Cod_Producto) + "" sql = "select round(avg(pedido_cantidad)) as pedido_cantidad from pedidos " + f + "" promedio = pd.read_sql(sql, conn) datos = pd.DataFrame() datos["valor"] = range(0, cantidad_a_predecir) datos["valor"] = round(promedio['pedido_cantidad'].values[0]) prediccion = datos["valor"].values else: if (op == 0): prediccion = forecastAuto(Cod_Producto, Cod_Centro_Operativo, cantidad_a_predecir, BD) if (op == 1): prediccion = forecastHol(Cod_Producto, Cod_Centro_Operativo, cantidad_a_predecir, BD) if (op == 2): prediccion = forecastProm(Cod_Producto, Cod_Centro_Operativo, cantidad_a_predecir, BD, fecha) return prediccion
def EntrenarDemoraProveedor(BD): dir_path = os.path.dirname(os.path.abspath("__file__")) nuevaruta = dir_path +'/ModelosEntrenados/' + BD + "/" if not os.path.exists(nuevaruta): os.makedirs(nuevaruta) conn = my_conexion.getConnection(BD) f="where lead_time_real_max_compra<>0 and lead_time_real_max_compra<100 and recepcion_max_fecha_real <>'1/01/1900'" sql_compras = "SELECT * FROM compras "+f+"" Compras=pd.read_sql(sql_compras,conn) if len(Compras) == 0: return 'Error Sin datos' Compras['fecha_orden_compra'] = pd.to_datetime(Compras['fecha_orden_compra']) Compras['dia_orden_compra']=Compras['fecha_orden_compra'].map(lambda x: x.strftime('%d')) Compras['mes_orden_compra']=Compras['fecha_orden_compra'].map(lambda x: x.strftime('%m')) Compras['ano_orden_compra']=Compras['fecha_orden_compra'].map(lambda x: x.strftime('%Y')) columnsTitles=[ 'cod_producto', 'cod_centro_operativo', 'compra_precio_unitario', 'lead_time_teorico_compra', 'dia_orden_compra', 'mes_orden_compra', 'ano_orden_compra', 'lead_time_real_max_compra'] Compras=Compras.reindex(columns=columnsTitles) train, test = train_test_split(Compras, test_size = 0.2) colsnames = Compras.columns.values.tolist() predictors = colsnames[0:len(colsnames)-1] target = colsnames[len(colsnames)-1] X = Compras[predictors] y = Compras[target] X_train = train[predictors] y_train = train[target] X_test = test[predictors] y_test = test[target] msg='' try: forest_metricas = RandomForestRegressor(criterion='mse',n_estimators=200,oob_score=True) forest_metricas.fit(X_train,y_train).score(X_test,y_test) forest_produccion = RandomForestRegressor(criterion='mse',n_estimators=200,oob_score=True) forest_produccion.fit(X,y) ltc=X_test['lead_time_teorico_compra'].values y_pred = forest_metricas.predict(X_test) p,t=testeo(y_test,y_pred,ltc) p=round(p,3)*100 t=round(t,3)*100 filename = nuevaruta +'DemoraProveedor.pkl' metricas = { 'MapePrediccion': [p], 'MapeTeorico': [t] } df = pd.DataFrame(metricas, columns= ['MapePrediccion','MapeTeorico']) df.to_csv(nuevaruta+'metricas_LeadTime.csv', index = False, header=True) pickle.dump(forest_produccion,open(filename,'wb')) msg=filename except: msg='Error' return msg