0

Me gustaría saber cómo puedo poner los valores resultantes de mis bucles en el archivo externo en forma de columnas.

Tal vez podria ayudar de algo una breve explicacion muy especifica de lo que me gustaria obtener, tengo una grupo de particulas que caen sobre la superficie de la tierra al rededor de un punto (0.0) cada una de ellas con sus respectivos pesos y me gustaria saber la suma de los pesos de las particulas que caen dentro de anillos de radio interno Ri y externo Rj (el radio externo del primer anillo viene a ser el radio interno del anillo que le sigue)

 #Insert the radio values
 #For example Ri_0=-20
 #For example Rj_max=4000
 #For example Bin=40

 data=pd.read_csv("photons.txt", header=0, delim_whitespace=True)

 df=pd.DataFrame(data)`

 Ri_0=input("Insertar el valor minimo del radio interno: ") 

 Rj_max=input("Ensertar el valor del radio externo maximo: ") 

 Bin= input("Insertar el salto: ")     

 R_internals=range(Ri_0,Rj_max+1,Bin)
 Ri=list(R_internals)
 Rj=[]
 R=[]

 for m in Ri:
     R_externals=m+Bin
     Rj.append(R_externals)

 for d,f in zip(Ri,Rj):
     R_average=(d+f)/2
     R.append(R_average) 

 import zipfile

 #Bucles
 count=0

 #El problema esta en este bucle.

 for i,j in zip(Ri,Rj):
     for r in df["radio"]:
         if r >= i and r <= j:
             d=df[df['radio']==r]['ParWeight'].iloc[0]
             count=count+d

Tengo un problema al añadir la suma de los pesos de las particulas que caen dentro del anillo de radio interno R1 y externo R2 y luego añadirlo a un archivo externo en forma de columna de datos y a su costado el valor de R respectivo que viene a ser el promedio de Ri y Rj, me aparece error sistematico porque me suma el valor de los pesos de todas las particulas y no las separa por pesos de particulas por anillo, adjunto el archivo "photons.txt"

Link: https://drive.google.com/file/d/1YM0U3UN4p1OGvbiajZakMWtQSmyZoCkN/view

Muchas gracias, espero pueden ayudarme

1 Answers1

0

Te los suma todos porque todas la iteraciones incrementen el mismo cout. Dicha variable debe reiniciarse para cada anillo.

No obstante, dado que usas Pandas, deberías aprovechar la capacidad de cálculo y de vectorización que ofrece junto a NumPy y no recurrir a ciclos (recorres todo el set de datos por cada anillo) de no ser imprescindible.

Si he entendido bien el problema, actualmente tus anillos se solapan dado que el intervalo es cerrado por ambos extremos, no se si por algo debe ser realmente así, pero lo lógico es que sea abierto por uno de los lados. Si fuer así, es muy simple de llevar a cabo usando pandas.cut:

import pandas as pd


df = pd.read_csv("photons.txt", header=0, delim_whitespace=True)

radio_interno = int(input("Insertar el valor minimo del radio interno: "))
radio_externo = int(input("Ensertar el valor del radio externo maximo: "))
bin = int(input("Insertar el salto: "))

bins = pd.interval_range(start=radio_interno, end=radio_externo, freq=bin)
mean = df.groupby(pd.cut(df.radio, bins=bins))["ParWeight"].mean()
res = pd.DataFrame(
    {"radio_interno": bins.left, 
     "radio_externo": bins.right, 
     "peso_medio": mean.values}
     )

res.to_csv("pesos_medios.txt", sep="\t", index=False)
Insertar el valor minimo del radio interno: 1000
Ensertar el valor del radio externo maximo: 4500
Insertar el salto: 500

>>> res
   radio_interno  radio_externo   peso_medio
0           1000           1500  8336.168886
1           1500           2000  3328.479277
2           2000           2500  1492.160000
3           2500           3000  3335.581829
4           3000           3500   161.792250
5           3500           4000  4018.210000
6           4000           4500   229.587285

El código es para Python 3, Python 2 está actualmente en EOL, no va a recibir más actualizaciones ni correcciones de bug y la mayoría de paquetes de terceros (incluido Pandas) han dejado o van a dejar de dar soporte para dicha rama. Si tienes una razón de peso para seguir usándolo, solo hay que cambiar las líneas de los inputs por:

radio_interno = int(raw_input("Insertar el valor minimo del radio interno: "))
radio_externo = int(raw_input("Ensertar el valor del radio externo maximo: "))
bin = int(raw_input("Insertar el salto: "))

No se debe usar input para entradas de usuario en Python 2, es un error común creer que se usa para entradas de enteros, pero eso no es cierto:

FJSevilla
  • 55,603
  • 7
  • 35
  • 58
  • El codigo me fue de gran ayuda, pero ahora el resultado final me muestra en el archivo output "pesos_medios.txt" el valor de los weights dividido por el numero de particulas que cayeron en dicho anillo, quisiera el valor de la suma mas no el promedio, por este metodo podria yo obtener solo el valor de la suma?, Me referia al promedio del los radios internos y externos de cada anillo – Bryan Ortiz Jun 06 '20 at 19:24
  • Si, solo en vez de `mean()` aplica `sum`, es decir: `suma = df.groupby(pd.cut(df.radio, bins=bins))["ParWeight"].sum()` y luego `res = pd.DataFrame( {"radio_interno": bins.left, "radio_externo": bins.right, "peso_total": suma.values} )` – FJSevilla Jun 06 '20 at 20:09
  • Tengo una ultima duda, quiero agregar todos los valores de la siguiente lista R al archivo "pesos_medios.txt" en una columna con `header = "radio"` y que este al costado de la tercera columna, este es mi codigo: `data1=pd.read_csv("pesos_medios.txt",header=0,delim_whitespace=True)-- df1=pd.DataFrame(data1) -- R=[ ] -- for i,j in zip(df1["radio_interno"], df1["radio_externo"]): Ra=(i+j)/2 R.append(Ra)` ### cada "--" significa un salto de linea+, la parte`Ra=(i+j)/2` y la parte ` R.append(Ra)` esta dentro del bucle `for` una debajo de la otra – Bryan Ortiz Jun 07 '20 at 00:33