Ejemplo n.º 1
0
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))
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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