<jupyter_start><jupyter_text>Importar Datos Modelo<jupyter_code>libro="modelo.xlsx"
datos=pd.read_excel(libro,sheet_name='<NAME>')
x=datos[["Ubicación","Factor Sección Característica","Tipo Pavimento","Área (m2)","NOMENCLATURA","EDAD PAVIMENTO","PCI","DELTA PCI","CARGA ACUMULADA RUEDA SIMPLE","CARGA ACUMULADA RUEDA DOBLE","CARGA ACUMULADA RUEDA DOBLE TANDEM","CORREGIR EDAD-TRANSITO"]]
y=datos[["PCI OBJETIVO"]]
df=pd.DataFrame(x)
x=df.fillna("S-M") # No se emplea  
x.head()
#plt.scatter(y_test,pr.predict(X_test))
fig, ax_0 = plt.subplots()
ax_0.scatter(x["EDAD PAVIMENTO"], x["PCI"], edgecolors=(0, 0, 0),label='')
#ax_0.plot([y_train.min(), y_train.max()], [0, 100], 'k--', lw=4)
ax_0.set_xlabel('Edad del Pavimento')
ax_0.set_ylabel('PCI')
plt.ylim(0,100)
ax_0.set_title('<NAME>')

plt.show()
#FILTRAR DATOS DE ANALISIS DEJANDO FUERA A DATOS RELACIONADOS CON LA PLATAFORMA (PAVIMENTOS DE HORMIGÓN MÁS DE 40 AÑOS DE SERVICIO)

x=datos[["Ubicación","Factor Sección Característica","Tipo Pavimento","Área (m2)","NOMENCLATURA","EDAD PAVIMENTO","PCI","DELTA PCI","CARGA ACUMULADA RUEDA SIMPLE","CARGA ACUMULADA RUEDA DOBLE","CARGA ACUMULADA RUEDA DOBLE TANDEM","CORREGIR EDAD-TRANSITO",'PCI OBJETIVO',"OPERACIONES EQUIVALENTES"]]
#mask=x['Ubicación']!='Plataforma'
mask2=x['OPERACIONES EQUIVALENTES']>=0
#mask3=x["DELTA PCI"]==0
x=x[mask2]
y=x['PCI OBJETIVO']
x=x.drop('PCI OBJETIVO',axis=1)
x.head(10)<jupyter_output><empty_output><jupyter_text>Datos de Entradas<jupyter_code>#TIPOS DE DATOS A ANALIZADOS
x.info()
#REVISAR SI HAY VALORES NULOS EN LOS DATOS ANALIZADOS
x.isna().sum().sort_values()
y.shape
#ANALIZAR DISTRIBUCIÓN DE DATOS DE SALIDA

fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(10, 10))
sns.distplot(
    y,
    hist    = False,
    rug     = True,
    color   = "blue",
    kde_kws = {'shade': True, 'linewidth': 1},
    ax      = axes[0]
)
axes[0].set_title("Distribución original", fontsize = 'medium')
axes[0].set_xlabel('precio', fontsize='small') 
axes[0].tick_params(labelsize = 6)

sns.distplot(
    np.sqrt(y),
    hist    = False,
    rug     = True,
    color   = "blue",
    kde_kws = {'shade': True, 'linewidth': 1},
    ax      = axes[1]
)
axes[1].set_title("Transformación raíz cuadrada", fontsize = 'medium')
axes[1].set_xlabel('sqrt(precio)', fontsize='small') 
axes[1].tick_params(labelsize = 6)

sns.distplot(
    np.log(y),
    hist    = False,
    rug     = True,
    color   = "blue",
    kde_kws = {'shade': True, 'linewidth': 1},
    ax      = axes[2]
)
axes[2].set_title("Transformación logarítmica", fontsize = 'medium')
axes[2].set_xlabel('log(precio)', fontsize='small') 
axes[2].tick_params(labelsize = 6)

fig.tight_layout()<jupyter_output><empty_output><jupyter_text>mejor ajuste regresión tipo betadistribuciones = ['cauchy', 'chi2', 'expon',  'exponpow', 'gamma',                  'norm', 'powerlaw', 'beta', 'logistic']fitter = Fitter(y, distributions=distribuciones)fitter.fit()fitter.summary(Nbest=10, plot=False).sort_values('sumsquare_error')<jupyter_code># Variables numéricas
# ==============================================================================
x.select_dtypes(include=['float64', 'int64']).describe()
# Gráfico de distribución para cada variable numérica
# ==============================================================================
# Ajustar número de subplots en función del número de columnas
fig, axes = plt.subplots(nrows=3, ncols=3, figsize=(15, 8))
axes = axes.flat
columnas_numeric = x.select_dtypes(include=['float64', 'int64']).columns
#columnas_numeric = columnas_numeric.drop('')

for i, colum in enumerate(columnas_numeric):
    sns.histplot(
        data    = x,
        x       = colum,
        stat    = "count",
        kde     = True,
        color   = (list(plt.rcParams['axes.prop_cycle'])*2)[i]["color"],
        line_kws= {'linewidth': 2},
        alpha   = 0.3,
        ax      = axes[i]
    )
    axes[i].set_title(colum, fontsize = 7, fontweight = "bold")
    axes[i].tick_params(labelsize = 6)
    axes[i].set_xlabel("")
    
    
fig.tight_layout()
plt.subplots_adjust(top = 0.9)
fig.suptitle('Distribución variables numéricas', fontsize = 10, fontweight = "bold");<jupyter_output><empty_output><jupyter_text>La variable corregir EDAD-Tránsito debe ser dejada fuera del analisis dado que posee tan solo un valor numérico. Inicialmente fue creada para identificar los pavimentos de más de 40 años de edad y con valores de PCI sobre 80, por otro lado el modelo creado para predecir el tránsito acumulado fue creado a partir del año 2000 no prediciendo para años anteriores.La variable delta PCI preferentemente es 0, para mejorar el modelo pudiesen crearse variables ficcticias para representar bien el fenomeno de intervención de los pavimentos. Generando una especie de balanceo de clases tal como ocurre en problemas de clasificación.<jupyter_code>x
#Eliminar la variable CORREGIR EDAD-TRANSITO.
# Gráfico de distribución para cada variable numérica
# ==============================================================================
# Ajustar número de subplots en función del número de columnas
fig, axes = plt.subplots(nrows=3, ncols=3, figsize=(15, 8))
axes = axes.flat

columnas_numeric = x.select_dtypes(include=['float64', 'int64']).columns
columnas_numeric = columnas_numeric.drop('CORREGIR EDAD-TRANSITO')
for i, colum in enumerate(columnas_numeric):
    sns.regplot(
        x           = x[colum],
        y           = y,
        color       = "gray",
        marker      = '.',
        scatter_kws = {"alpha":0.4},
        line_kws    = {"color":"r","alpha":0.7},
        ax          = axes[i],
        #ci=None
    )
    axes[i].set_title(f"PCI OBJETIVO vs {colum}", fontsize = 7, fontweight = "bold")
    #axes[i].ticklabel_format(style='sci', scilimits=(-4,4), axis='both')
    axes[i].yaxis.set_major_formatter(ticker.EngFormatter())
    axes[i].xaxis.set_major_formatter(ticker.EngFormatter())
    axes[i].tick_params(labelsize = 6)
    axes[i].set_xlabel("")
    axes[i].set_ylabel("")

# Se eliminan los axes vacíos
for i in [8]:
    fig.delaxes(axes[i])
    
fig.tight_layout()
plt.subplots_adjust(top=0.9)
fig.suptitle('Correlación con precio', fontsize = 10, fontweight = "bold");





# Correlación entre columnas numéricas
# ==============================================================================

def tidy_corr_matrix(corr_mat):
    '''
    Función para convertir una matrix de correlación de pandas en formato tidy
    '''
    corr_mat = corr_mat.stack().reset_index()
    corr_mat.columns = ['variable_1','variable_2','r']
    corr_mat = corr_mat.loc[corr_mat['variable_1'] != corr_mat['variable_2'], :]
    corr_mat['abs_r'] = np.abs(corr_mat['r'])
    corr_mat = corr_mat.sort_values('abs_r', ascending=False)
    
    return(corr_mat)

x1=x.drop(['CARGA ACUMULADA RUEDA DOBLE', 'CARGA ACUMULADA RUEDA SIMPLE','CARGA ACUMULADA RUEDA DOBLE TANDEM','CORREGIR EDAD-TRANSITO'], axis=1)
x11=x1
corr_matrix1 = x1.select_dtypes(include=['float64', 'int64']).corr(method='pearson')
tidy_corr_matrix(corr_matrix1).head(10)

# Heatmap matriz de correlaciones
# ==============================================================================
fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(10, 10))

sns.heatmap(
    corr_matrix1,
    annot     = True,
    cbar      = True,
    annot_kws = {"size": 10},
    vmin      = -1,
    vmax      = 1,
    center    = 0,
    cmap      = sns.diverging_palette(20, 220, n=200),
    square    = True,
    ax        = ax
)
ax.set_xticklabels(
    ax.get_xticklabels(),
    rotation = 45,
    horizontalalignment = 'right',
)

ax.tick_params(labelsize = 10)
#DESCRIPCION VARIABLES CUALITATIVAS

# Variables cualitativas (tipo object)
# ==============================================================================
#x=x.drop('Tipo Pavimento',axis=1)
x.select_dtypes(include=['object']).describe()
# Gráfico para cada variable cualitativa
# ==============================================================================
# Ajustar número de subplots en función del número de columnas
fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(8, 6))
axes = axes.flat
columnas_object = x.select_dtypes(include=['object']).columns

for i, colum in enumerate(columnas_object):
    x[colum].value_counts().plot.barh(ax = axes[i])
    axes[i].set_title(colum, fontsize = 9, fontweight = "bold")
    axes[i].tick_params(labelsize = 9)
    axes[i].set_xlabel("")


fig.tight_layout()
plt.subplots_adjust(top=0.9)
fig.suptitle('Distribución variables cualitativas',
             fontsize = 12, fontweight = "bold");<jupyter_output><empty_output><jupyter_text>PREPROCESAMIENTO DE DATOS<jupyter_code>X_train1, X_test1, y_train1, y_test1 = train_test_split(
                                        x1,
                                        y,
                                        train_size   = 0.8,
                                        random_state = 43,
                                        shuffle      = True
                                    )
print("Partición de entrenamento")
print("-----------------------")
print(y_train1.describe())


print("Partición de test")
print("-----------------------")
print(y_test1.describe())


# Pipe: preprocesado

numeric_cols = X_train1.select_dtypes(include=['float64', 'int64']).columns.to_list()
cat_cols = X_train1.select_dtypes(include=['object', 'category']).columns.to_list()


preprocessor = ColumnTransformer(
                   [('scale', StandardScaler(), numeric_cols),
                    ('onehot', OneHotEncoder(drop='first'), cat_cols)],
                remainder='passthrough')

X_train1 = preprocessor.fit_transform(X_train1)
X_test1  = preprocessor.transform(X_test1)<jupyter_output><empty_output><jupyter_text>FEATURE SELECTION: SELECTKBEST<jupyter_code># Convertir el output en dataframe y añadir el nombre de las columnas
#==============================================================================
encoded_cat = preprocessor.named_transformers_['onehot'].get_feature_names(cat_cols)
labels = np.concatenate([numeric_cols, encoded_cat])
#datos_train_prep = preprocessor.transform(X_train1)
datos_train_prep = pd.DataFrame(X_train1, columns=labels)
datos_test_prep=pd.DataFrame(X_test1,columns=labels)
datos_train_prep.columns<jupyter_output><empty_output><jupyter_text>FEATURE SELECTION: SELECTKBEST<jupyter_code>from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_regression, mutual_info_regression

# Aplicando el algoritmo univariante de prueba F.
k = 9  # número de atributos a seleccionar
#columnas = list(X_train1.columns.values)
seleccionadas = SelectKBest(mutual_info_regression, k=k).fit(datos_train_prep, y_train1)
selected_features_df = pd.DataFrame({'Feature':list(datos_train_prep.columns),
                                     'Scores MI':seleccionadas.scores_})
selected_features_df.sort_values(by='Scores MI', ascending=False)

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_regression, mutual_info_regression

# Aplicando el algoritmo univariante de prueba F.
k = 9  # número de atributos a seleccionar
columnas = list(datos_train_prep.columns.values)
seleccionadas = SelectKBest(f_regression, k=k).fit(datos_train_prep, y_train1)
selected_features_df = pd.DataFrame({'Feature':list(datos_train_prep.columns),
                                     'Scores f':seleccionadas.scores_})
selected_features_df.sort_values(by='Scores f', ascending=False)<jupyter_output><empty_output><jupyter_text>X_indices = np.arange(datos_train_prep.shape[-1])scores = -np.log10(seleccionadas.pvalues_)scores /= scores.max()plt.bar(X_indices - .45, scores, width=.2,        label=r'Univariate score ($-Log(p_{value})$)')<jupyter_code>from sklearn.feature_selection import RFECV
from sklearn.metrics import r2_score
from sklearn.ensemble import RandomForestRegressor

rfc = RandomForestRegressor(random_state=101)
rfecv = RFECV(estimator=rfc, step=1, cv=10, scoring='r2')
rfecv.fit(datos_train_prep, y_train1)



print('Optimal number of features: {}'.format(rfecv.n_features_))
plt.figure(figsize=(10, 7))
plt.title('Recursive Feature Elimination with Cross-Validation', fontsize=18, fontweight='bold', pad=20)
plt.xlabel('Number of features selected', fontsize=14, labelpad=20)
plt.ylabel('% R^2', fontsize=14, labelpad=20)
plt.plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_, color='#303F9F', linewidth=3)

plt.show()
print(np.where(rfecv.support_ == False)[0])

datos_train_prep.drop(datos_train_prep.columns[np.where(rfecv.support_ == False)[0]], axis=1, inplace=True)

sobrevivientes=datos_train_prep.columns
datos_test_prep=datos_test_prep[sobrevivientes]
dset = pd.DataFrame()
dset['attr'] = datos_train_prep.columns
dset['importance'] = rfecv.estimator_.feature_importances_

dset = dset.sort_values(by='importance', ascending=False)


plt.figure(figsize=(8, 6))
plt.barh(y=dset['attr'], width=dset['importance'], color='#1976D2')
plt.title('RFECV - Feature Importances', fontsize=20, fontweight='bold', pad=20)
plt.xlabel('Importance', fontsize=14, labelpad=20)
plt.show()
X_train1=datos_train_prep
X_test1=datos_test_prep
#Grid de hiperparámetros


param_grid1={'hidden_layer_sizes':[(10,),(10,10),(10,10,10),(50,)],
            'activation': ['relu'],
            'alpha': [5,50,100,500],
            'learning_rate': ['constant'],
            'solver': ['adam']}
                
#scoring = {'neg_mean_absolute_error': 'neg_mean_absolute_error', 'neg_root_mean_squared_error': 'mean_squared_error'}



# Búsqueda por validación cruzada

grid1 = GridSearchCV(
        estimator  = MLPRegressor() ,
        param_grid = param_grid1,
        n_jobs=-1,
        cv         = 5,                      #RepeatedKFold(n_splits = 3, n_repeats = 5), 
        verbose    = 0,
        return_train_score = True
       )



_=grid1.fit(X=X_train1, y=y_train1)

results=grid1.cv_results_
results.keys()
# Resultados del grid
# ==============================================================================
resultados = pd.DataFrame(grid1.cv_results_)
resultados.filter(regex = '(param.*|mean_t|std_t)')\
    .drop(columns = 'params')\
    .sort_values('mean_test_score', ascending = False)

# Mejores hiperparámetros
# ==============================================================================
print("-----------------------------------")
print("Mejores hiperparámetros encontrados")
print("-----------------------------------")
print(grid1.best_params_, ":", grid1.best_score_, grid1.scoring)
best_params = grid1.best_params_
best_mlp1 = MLPRegressor(hidden_layer_sizes = best_params["hidden_layer_sizes"], 
                        activation =best_params["activation"],
                        solver=best_params["solver"], 
                        alpha=500,
                        learning_rate=best_params["learning_rate"],
                        max_iter= 10000,
                        n_iter_no_change = 1000,
                        early_stopping=True,
                        random_state=43
                       )
# Grafico de ajuste del árbol de decisión
from sklearn.metrics import r2_score
from time import time
tiempo_inicial=time()
train_prec =  []
eval_prec = []
alpha1 = [5,50,500,1000]

# Entrenar con arboles de distinta profundidad
for deep in alpha1:
    model = MLPRegressor(hidden_layer_sizes = best_params["hidden_layer_sizes"], 
                        activation =best_params["activation"],
                        solver=best_params["solver"], 
                        alpha=deep,
                        learning_rate=best_params["learning_rate"],
                        max_iter= 10000,
                        n_iter_no_change = 1000,
                        early_stopping=True,
                        random_state=43
                       )
    model.fit(X_train1, y_train1)
    train_prec.append(model.score(X_train1, y_train1))
    eval_prec.append(model.score(X_test1, y_test1))
tiempo_final=time()
print(tiempo_final-tiempo_inicial)



# graficar los resultados.

sns.set(rc={'figure.figsize':(12,9)})

df1 = pd.DataFrame({'alpha':alpha1,
                   'precision':train_prec,
                   'datos':'entrenamiento'})

df2 = pd.DataFrame({'alpha':alpha1,
                   'precision':eval_prec,
                   'datos':'evaluacion'})

df_graph = pd.concat([df1,df2])

sns.lineplot(data=df_graph,
             x='alpha',
             y='precision',
             hue='datos',
             palette="Set1")


best_mlp1 = MLPRegressor(hidden_layer_sizes = best_params["hidden_layer_sizes"], 
                        activation =best_params["activation"],
                        solver=best_params["solver"], 
                        alpha=500,#best_params["alpha"],#500,
                        learning_rate=best_params["learning_rate"],
                        max_iter= 10000,
                        n_iter_no_change = 1000,
                        early_stopping=True,
                        random_state=42
                       )

best_mlp1.fit(X_train1,y_train1)
predicciones=best_mlp1.predict(X_test1)


#plt.scatter(y_test,pr.predict(X_test))
fig, (ax1,ax2) = plt.subplots(2, figsize=(5, 5))

ax1.scatter(y_train1, best_mlp1.predict(X_train1), edgecolors=(0, 0, 0),label='')
ax1.plot([y_train1.min(), y_train1.max()], [y_train1.min(), y_train1.max()], 'k--', lw=4)
#ax1.set_xlabel('PCI Medido')
ax1.set_ylabel('PCI Predicho')

ax1.set_title('Datos de Entrenamiento')


ax2.scatter(y_train1, best_mlp1.predict(X_train1)-y_train1, edgecolors=(0, 0, 0),label='')
ax2.plot([y_train1.min(), y_train1.max()], [0, 0], 'k--', lw=4)
ax2.set_xlabel('PCI Medido')
ax2.set_ylabel('PCI Residuos del Modelo')
plt.ylim(-8, 8)
#ax2.set_title('Datos de Entrenamiento')
#ax1.plt.text(80,95,'$R^2$=0.9694')
plt.show()
from sklearn.metrics import r2_score
print("r2",r2_score(y_train1,best_mlp1.predict(X_train1)))
print("MSE",mean_squared_error(y_train1,best_mlp1.predict(X_train1)))


#plt.scatter(y_test,pr.predict(X_test))
fig, (ax1,ax2) = plt.subplots(2, figsize=(5, 5))


ax1.scatter(y_test1, best_mlp1.predict(X_test1), edgecolors=(0, 0, 0),label='')
ax1.plot([y_test1.min(), y_test1.max()], [y_test1.min(), y_test1.max()], 'k--', lw=4)
#ax1.set_xlabel('PCI Medido')
ax1.set_ylabel('PCI Predicho')
ax1.set_title('Datos de Prueba')
#plt.text(80,95,'$R^2$=0.943')

#plt.scatter(y_test,pr.predict(X_test))

ax2.scatter(y_test1, best_mlp1.predict(X_test1)-y_test1, edgecolors=(0, 0, 0),label='')
ax2.plot([y_test1.min(), y_test1.max()], [0, 0], 'k--', lw=4)
ax2.set_xlabel('PCI Medido')
ax2.set_ylabel('Residuos del modelo')
plt.ylim(-7, 7)
#ax1.set_title('Datos de Prueba')
plt.show()
print("r2",r2_score(y_test1,best_mlp1.predict(X_test1)))
print("MSE",mean_squared_error(y_test1,best_mlp1.predict(X_test1)))<jupyter_output><empty_output><jupyter_text>ANALISIS DE DATOS<jupyter_code>libro="modelo.xlsx"
datos2=pd.read_excel(libro,sheet_name='Pruebas')
datos_pro=datos2[["Ubicación","Factor Sección Característica","Tipo Pavimento","Área (m2)","NOMENCLATURA","EDAD PAVIMENTO","PCI","DELTA PCI","CARGA ACUMULADA RUEDA SIMPLE","CARGA ACUMULADA RUEDA DOBLE","CARGA ACUMULADA RUEDA DOBLE TANDEM","OPERACIONES EQUIVALENTES","CORREGIR EDAD-TRANSITO",'PCI OBJETIVO']]
datos_pro.head(10)
x_proyecto=datos_pro.drop(['CARGA ACUMULADA RUEDA DOBLE', 'CARGA ACUMULADA RUEDA SIMPLE','CARGA ACUMULADA RUEDA DOBLE TANDEM','CORREGIR EDAD-TRANSITO','PCI OBJETIVO'], axis=1)
x_proyecto['PCI']
x_construccion=datos2['Año Construcción']
x_seccion=datos2['Sección Característica']
x_seccion

d_PR= ["PI-1", "PI-2","PI-3","PI-4","PI-5","PI-6","PI-7","PI-8","PI-9","PI-10","RA-1","RA-2","DE-1","DD-1","DC-1","DB-1"]

x_proyecto=datos_pro.drop(['CARGA ACUMULADA RUEDA DOBLE', 'CARGA ACUMULADA RUEDA SIMPLE','CARGA ACUMULADA RUEDA DOBLE TANDEM','CORREGIR EDAD-TRANSITO','PCI OBJETIVO'], axis=1)

proyecciones = pd.DataFrame([])
proyecciones1 = x_proyecto#pd.DataFrame([])
PCI_t=x_proyecto['PCI']
Edad_p=x_proyecto['EDAD PAVIMENTO']
#Operaciones_eq=x_proyecto['EDAD Pavimento']



for j in range(1,11):
    #x_proyecto['PCI']=PCI_t
    #x_proyecto['EDAD PAVIMENTO']=Edad_p
    x1_proyecto = preprocessor.transform(x_proyecto)
    x1_proyecto = pd.DataFrame(x1_proyecto, columns=labels)
    x1_proyecto=x1_proyecto[sobrevivientes]
    predicciones=best_mlp1.predict(x1_proyecto)
    x_proyecto['PCI']=predicciones
    x_proyecto['EDAD PAVIMENTO']+=1
    opera=33.2613921169767*(((2013+j)**2)-((x_construccion)**2))-132975.883038438*(x_proyecto['EDAD PAVIMENTO'])
    x_proyecto['OPERACIONES EQUIVALENTES']=opera
    #33.2613921169767*(((AJ2)^2)-((M2)^2))-132975.883038438*(AJ2-M2)
    #print(predicciones)
    #print(x_proyecto['EDAD PAVIMENTO'])
    #PCI_t=predicciones
    #Edad_p+=1
    #proyecciones=proyecciones.append({'Ubicación':x_proyecto['Ubicación'],
    #                                  'Factor Sección Característica':x_proyecto['Factor Sección Característica'],
    #                                  'Tipo Pavimento':x_proyecto['Tipo Pavimento'],
    #                                  'Área (m2)':x_proyecto['Área (m2)'],
    #                                  'NOMENCLATURA':x_proyecto['NOMENCLATURA'],
    #                                  'EDAD PAVIMENTO':x_proyecto['EDAD PAVIMENTO'],
    #                                  'PCI':x_proyecto['PCI'],
    #                                  'DELTA PCI':x_proyecto['DELTA PCI'],
    #                                  'OPERACIONES EQUIVALENTES':x_proyecto['OPERACIONES EQUIVALENTES'],
    #                                  'Sección Característica': x_seccion
    #                                 },ignore_index=True)
    if 2013+j==2015:
        x_proyecto['DELTA PCI'][0]=4  #PI-1
        x_proyecto['DELTA PCI'][1]=10 #PI-2
    elif 2013+j==2016:
        #ACTUALES
        x_proyecto['DELTA PCI'][10]=1  #RA-1
        x_proyecto['DELTA PCI'][12]=5  #DE-1
        x_proyecto['DELTA PCI'][14]=3  #DC-1
        x_proyecto['DELTA PCI'][15]=1  #DB-1
        #PASADOS
        x_proyecto['DELTA PCI'][0]=0   #PI-1
        x_proyecto['DELTA PCI'][1]=0   #PI-2
    elif 2013+j==2017:
        x_proyecto['DELTA PCI'][15]=1  #DB-1
        #PASADOS
        x_proyecto['DELTA PCI'][10]=0  #RA-1
        x_proyecto['DELTA PCI'][12]=0  #DE-1
        x_proyecto['DELTA PCI'][14]=0  #DC-1
        x_proyecto['DELTA PCI'][15]=0  #DB-1
    elif 2013+j==2018:
        x_proyecto['DELTA PCI'][2]=2   #PI-3
        x_proyecto['DELTA PCI'][0]=3   #PI-3
         #PASADOS
        x_proyecto['DELTA PCI'][15]=0  #DB-1
    else:
        x_proyecto['DELTA PCI']=0
    x_proyecto1=x_proyecto
    x_proyecto1['Sección Característica']=x_seccion
    x_proyecto1['Año']=2013+j
    proyecciones1= pd.concat([proyecciones1,x_proyecto1], axis=0)
    
    
mask1=proyecciones1['Ubicación']=='Pista'
#mask2=proyecciones1['Factor Sección Característica']=='Sector central de pista'
mask3=proyecciones1['Año']==2016
mask4=proyecciones1['Área (m2)']==1760
proyecciones1[mask1&mask3&mask4].head(10)


xgra=datos[["Ubicación",'Sección Característica','AÑO EVALUACIÓN',"Factor Sección Característica","Tipo Pavimento","Área (m2)","NOMENCLATURA","EDAD PAVIMENTO","PCI","DELTA PCI","CARGA ACUMULADA RUEDA SIMPLE","CARGA ACUMULADA RUEDA DOBLE","CARGA ACUMULADA RUEDA DOBLE TANDEM","OPERACIONES EQUIVALENTES","CORREGIR EDAD-TRANSITO"]]
x_medido=xgra[['Sección Característica','AÑO EVALUACIÓN','PCI']]
x_medido = x_medido.rename(columns={"AÑO EVALUACIÓN": "Año"})
x_medido['Dato']="Medido"
x_proyectado=proyecciones1[['Sección Característica','Año','PCI']]
x_proyectado['Dato']="Predicho"
frames = [x_medido, x_proyectado]
datos_analisis = pd.concat(frames)


fil=datos_analisis['Sección Característica'].isin(d_PR)
datos_analisis=datos_analisis[fil]
import seaborn as sns
sns.set_theme(style="ticks")
##sns.catplot(x="Año", y="PCI",col="Sección Característica", data=proyecciones1,ax=ax)
#sns.relplot(data=proyecciones1, x="Año", y="PCI",col="Sección Característica",ax=ax1)
#sns.relplot(data=xgra, x="AÑO EVALUACIÓN", y="PCI",col="Sección Característica",ax=ax1)

sns.catplot(x="Año", y="PCI",col="Sección Característica", hue="Dato",data=datos_analisis,kind='strip',col_wrap=2,margin_titles=True)
plt.ylim(0, 101)
#ax.legend(['alpha', 'beta'], facecolor='w')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.17725118483412322, 'fraction_numerical': 0.03033175355450237, 'mean_word_length': 4.032351721277478, 'pattern_counts': {'":': 6, '<': 39, '<?xml version=': 0, '>': 40, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 20, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '296879', 'license': 'MIT', 'n_tokens_mistral': 9607, 'n_tokens_neox': 8989, 'n_words': 1422, 'path': 'Red Neuronal 09-12-2020.V2.ipynb', 'repo_name': 'andresmontecinos12/PMS_AP_AM', 'size': '24281'}