Compositacion

def fill_missing_intervals_all(assay_data, fill_value=-99):
    assay_data = assay_data.sort_values(by=['HOLE-ID', 'FROM']).reset_index(drop=True)
    filled_data = []
    for i in range(len(assay_data) - 1):
        current_row = assay_data.iloc[i]
        next_row = assay_data.iloc[i + 1]
        filled_data.append(current_row.to_dict())  # Convertir la fila en un dict
        if current_row['TO'] < next_row['FROM'] and current_row['HOLE-ID'] == next_row['HOLE-ID']:
            missing_interval = {'HOLE-ID': current_row['HOLE-ID'], 'FROM': current_row['TO'], 'TO': next_row['FROM']}
            for col in assay_data.columns:
                if col not in ['HOLE-ID', 'FROM', 'TO']:
                    missing_interval[col] = fill_value
            filled_data.append(missing_interval)
    filled_data.append(assay_data.iloc[-1].to_dict())
    filled_df = pd.DataFrame(filled_data).sort_values(by=['HOLE-ID', 'FROM', 'TO']).reset_index(drop=True)
    return filled_df
assay_data = pd.read_csv('ASSAY.TXT', delimiter=',')
filled_assay_data = fill_missing_intervals_all(assay_data)
filled_assay_data.to_csv('ASSAY-C.txt', sep=',', index=False)
print("El archivo ASSAY-C.txt ha sido generado correctamente y está ordenado por HOLE-ID, FROM y TO, separado por comas.")

# Cargar los datos
header_data = pd.read_csv('HEADER.txt', delimiter=',')
survey_data = pd.read_csv('SURVEY.txt', delimiter=',')
assay_data = pd.read_csv('ASSAY-C.TXT', delimiter=',')
def composite_sondaje(assay_data, composite_length=10):
    composite_data = []
    current_start = 0
    max_to = assay_data['TO'].max()
    if max_to % composite_length != 0:
        print(f"Advertencia: El último tramo no es múltiplo de {composite_length} y no se compositará.")
        max_to = max_to - (max_to % composite_length)  # Ajustar para no incluir el tramo final
    while current_start < max_to:
        current_end = current_start + composite_length
        subset = assay_data[(assay_data['FROM'] < current_end) & (assay_data['TO'] > current_start)]
        if not subset.empty:
            weighted_law = 0
            total_length = 0
            for index, row in subset.iterrows():
                overlap_from = max(current_start, row['FROM'])
                overlap_to = min(current_end, row['TO'])
                length = overlap_to - overlap_from
                weighted_law += length * row['CU']
                total_length += length
            composito_cu = weighted_law / total_length if total_length > 0 else None
            if composito_cu is not None and composito_cu < 0:
                composito_cu = -99
            composite_data.append({
                'HOLE-ID': assay_data['HOLE-ID'].iloc[0],
                'FROM': current_start,
                'TO': current_end,
                'CU': composito_cu
            })
        current_start = current_end
    return pd.DataFrame(composite_data)
all_composites = pd.DataFrame()
for hole_id in assay_data['HOLE-ID'].unique():
    assay_sondaje = assay_data[assay_data['HOLE-ID'] == hole_id]
    composite_results = composite_sondaje(assay_sondaje)
    all_composites = pd.concat([all_composites, composite_results])
all_composites.to_csv('composite_results.csv', index=False)
print("El archivo CSV con los resultados de compositing ha sido generado.")
header_df = pd.read_csv("HEADER.txt")
survey_df = pd.read_csv("SURVEY.txt")
def calcular_nuevas_coordenadas(x1, y1, z1, distancia, azimut, dip):
    azimut_rad = np.radians(azimut)
    dip_rad = np.radians(dip)
    if azimut == 0 or azimut == 180:
        x2 = x1  
    elif azimut > 0 and azimut < 180:
        x2 = x1 + distancia * np.cos(dip_rad)
    else: 
        x2 = x1 - distancia * np.cos(dip_rad)
    if azimut == 90 or azimut == 270:
        y2 = y1  
    elif (azimut > 270 and azimut < 360) or (azimut > 0 and azimut < 90):
        y2 = y1 + distancia * np.cos(dip_rad)
    else: 
        y2 = y1 - distancia * np.cos(dip_rad)
    z2 = z1 + distancia * np.sin(dip_rad)
    return x2, y2, z2
def calcular_compositos_sondaje_sin_auxiliar(sondaje_id, collar, longitud, azimut, dip, interval=10):
    distancias, coords_x, coords_y, coords_z, tipo_composito = [], [], [], [], []
    primera_distancia = interval / 2
    distancias.append(primera_distancia)
    x2, y2, z2 = calcular_nuevas_coordenadas(collar[0], collar[1], collar[2], primera_distancia, azimut, dip)
    coords_x.append(x2)
    coords_y.append(y2)
    coords_z.append(z2)
    tipo_composito.append("Composito")
    collar = (x2, y2, z2)
    for i in range(int(primera_distancia), longitud, interval):
        if i + interval > longitud:
            break 
        x1, y1, z1 = collar
        x2, y2, z2 = calcular_nuevas_coordenadas(x1, y1, z1, interval, azimut, dip)
        distancia_actual = i + interval
        distancias.append(distancia_actual)
        coords_x.append(x2)
        coords_y.append(y2)
        coords_z.append(z2)
        tipo_composito.append("Composito")
        collar = (x2, y2, z2)
    return pd.DataFrame({
        'Sondaje': [sondaje_id] * len(distancias),
        'Distancia (m)': distancias,
        'X (m)': coords_x,
        'Y (m)': coords_y,
        'Z (m)': coords_z,
        'Tipo': tipo_composito
    })
def calcular_compositos_con_siguiente_tramo(collar, longitud, azimut, dip, interval=10, distancia_sobrante=0):
    distancias, coords_x, coords_y, coords_z, tipo_composito = [], [], [], [], []
    primera_distancia = interval - distancia_sobrante if distancia_sobrante > 0 else interval / 2
    distancias.append(primera_distancia)
    x2, y2, z2 = calcular_nuevas_coordenadas(collar[0], collar[1], collar[2], primera_distancia, azimut, dip)
    coords_x.append(x2)
    coords_y.append(y2)
    coords_z.append(z2)
    tipo_composito.append("Composito")
    collar = (x2, y2, z2)
    for i in range(int(primera_distancia), longitud, interval):
        if i + interval > longitud:
            break  
        x1, y1, z1 = collar
        x2, y2, z2 = calcular_nuevas_coordenadas(x1, y1, z1, interval, azimut, dip)
        distancias.append(i + interval)
        coords_x.append(x2)
        coords_y.append(y2)
        coords_z.append(z2)
        tipo_composito.append("Composito")
        collar = (x2, y2, z2)
    return pd.DataFrame({
        'Distancia (m)': distancias,
        'X (m)': coords_x,
        'Y (m)': coords_y,
        'Z (m)': coords_z,
        'Tipo': tipo_composito
    }), interval - (longitud % interval)
def procesar_sondajes():
    all_composites = pd.DataFrame() 
    for sondaje_id in header_df['HOLE-ID'].unique():
        print(f"Procesando sondaje {sondaje_id}...")
        header_row = header_df[header_df['HOLE-ID'] == sondaje_id]
        if header_row.empty:
            print(f"Advertencia: No se encontraron datos de collar para el sondaje {sondaje_id}.")
            continue
        collar = (header_row.iloc[0]['LOCATIONX'], header_row.iloc[0]['LOCATIONY'], header_row.iloc[0]['LOCATIONZ'])
        survey_rows = survey_df[survey_df['HOLE-ID'] == sondaje_id]
        if survey_rows.empty:
            print(f"Advertencia: No se encontraron datos de azimut o dip para el sondaje {sondaje_id}.")
            continue
        if len(survey_rows) == 1:
            # Sondaje de un solo tramo
            azimut = survey_rows.iloc[0]['AZIMUTH']
            dip = survey_rows.iloc[0]['DIP']
            longitud = header_row.iloc[0]['LENGTH']
            composites = calcular_compositos_sondaje_sin_auxiliar(sondaje_id, collar, longitud, azimut, dip)
        else:
            composites = pd.DataFrame()
            distancia_sobrante = 0  # Inicializar la distancia sobrante como 0
            for index, row in survey_rows.iterrows():
                from_depth = row["FROM"]
                to_depth = row["TO"]
                azimut = row["AZIMUTH"]
                dip = row["DIP"]
                longitud_tramo = to_depth - from_depth
                tramo_composites, distancia_sobrante = calcular_compositos_con_siguiente_tramo(
                    collar, longitud_tramo, azimut, dip, interval=10, distancia_sobrante=distancia_sobrante
                )
                composites = pd.concat([composites, tramo_composites], ignore_index=True)
                collar = tramo_composites.iloc[-1][["X (m)", "Y (m)", "Z (m)"]].values
            for index, row in survey_rows.iterrows():
                to_depth = row["TO"]
                if not composites[composites["Distancia (m)"] == to_depth].empty:
                    composites.loc[composites["Distancia (m)"] == to_depth, "Tipo"] = "Auxiliar"
        all_composites = pd.concat([all_composites, composites], ignore_index=True)
    all_composites.to_csv('composites_sondajes.csv', index=False)
    print("El archivo 'composites_sondajes.csv' ha sido generado con éxito.")
procesar_sondajes()
def graficar_compositos():
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    compositos_b_filtrados = all_composites[all_composites["Tipo"] == "Composito"]
    ax.scatter(compositos_b_filtrados['X (m)'], 
               compositos_b_filtrados['Y (m)'], 
               compositos_b_filtrados['Z (m)'], 
               c='blue', marker='o')
    ax.set_xlabel('X (m)')
    ax.set_ylabel('Y (m)')
    ax.set_zlabel('Z (m)')
    plt.show()
composite_results = pd.read_csv('composite_results.csv')
composites_sondajes = pd.read_csv('composites_sondajes.csv')
print("Columnas en composite_results:", composite_results.columns)
print("Columnas en composites_sondajes:", composites_sondajes.columns)
composite_results['Distancia_Promedio'] = (composite_results['FROM'] + composite_results['TO']) / 2
if 'Sondaje' in composites_sondajes.columns:
    composites_sondajes.rename(columns={'Sondaje': 'HOLE-ID'}, inplace=True)
if 'Distancia (m)' in composites_sondajes.columns:
    composites_sondajes.rename(columns={'Distancia (m)': 'Distancia_Promedio'}, inplace=True)
merged_data = pd.merge(composite_results, composites_sondajes, how='left', on=['HOLE-ID', 'Distancia_Promedio'])
merged_data_filtered = merged_data.drop(columns=['FROM', 'TO', 'Distancia_Promedio', 'Tipo'], errors='ignore')
output_file_path = 'Sondajes_Compositados_final.csv'
merged_data_filtered.to_csv(output_file_path, index=False)
print(f"El archivo final filtrado ha sido guardado en {output_file_path}")
octubre 2, 2024
top
Nube Minera © 2024