Este es mi script favorito hasta ahora porque me ahorra un montón de tiempo al ingresar datos de importaciones a mi reporte. Automaticamente suma facturas, cuenta cajas, pesos, obtiene datos de guias aereas y bls y lo carga todo a mi reporte:
print 'Scanning invoices...'
import re, xlrd, os, os.path, openpyxl, pdfminer
#invoice variables
fob = 0
freight = 0
insurance = 0
total = 0
invoice = []
plNum = ''
invoiceFound = 'false'
#pl variables
writeFile = open("d:/pls.txt", "w")
cases =[]
gweight =[]
nweight=[]
volume = []
plFound = 'false'
#bl variables
blNumber = ''
containers = []
blCases =[]
blWeight =[]
blVolume =[]
blFound = 'false'
#first set the path
path= "d:/Loader/"
#look for invoices-------------------------------------------------------------------------------------------------------------------------------
#try:
for file in os.listdir(path):
match = re.search(r'.*\.[xlXL]\w+', file)
if match:
wb = xlrd.open_workbook(path+file)
sht = wb.sheet_by_index(0)
n = sht.nrows
#identifies invoice based on keyword placement
if "Huawei" in sht.cell_value(0,2) or "Huawei" in sht.cell_value(4, 2):
invoiceFound = 'true'
#Identifies the invoce template
if "Huawei" in sht.cell_value(0,2): #The old template
fob = fob + float(sht.cell_value((sht.nrows -4),13))
freight = freight + float(sht.cell_value((sht.nrows -3),13))
insurance = insurance + float(sht.cell_value((sht.nrows -2),13))
total = total + float(sht.cell_value(sht.nrows-1,13))
invoice.append(sht.cell_value(3,2)[11:])
plNum = sht.cell_value(7,2)[8:]
elif 'Huawei Device Co., Ltd.' in sht.cell_value(4,2): #Device template
cellContent = sht.cell_value(sht.nrows - 7, 8)
cellContent = cellContent.split()
for n in range(len(cellContent)):
if ',' in cellContent[n]:
cellContent[n] = cellContent[n].replace(',', '.')
fob = fob+float(cellContent[0])
freight = freight + float(cellContent[1])
insurance = insurance + float(cellContent[2])
total = total + float(cellContent[3])
invoice.append(sht.cell_value(8,7))
plNum = sht.cell_value(10,7)
else: #the new template
for row in range(n):
if "FOB" in sht.cell_value(row, 6):
fob = fob + float(sht.cell_value(row,7))
freight = freight + float(sht.cell_value(row+1, 7))
insurance = insurance + float(sht.cell_value(row+2, 7))
#sometimes there is a USD in the Total cell so we need to suppress it
if 'USD'in str(sht.cell_value(row+3,7)):
total = total + float(sht.cell_value(row+3,7)[3:])
else:
total = total + float(sht.cell_value(row+3,7))
invoice.append(sht.cell_value(8,7))
plNum = sht.cell_value(sht.nrows-2,2)
if invoiceFound == 'true':
print "FOB: %f, Flete: %f, seguro: %f, Total: %f" %(fob, freight, insurance, total)
else:
print 'No invoices found.'
print
#except:
#print 'There was a problem scanning invoices. No information could be retreived.'
#print
#look for PLs------------------------------------------------------------------------------------------------------------------------------------
print 'Scanning PLs...'
try:
for file in os.listdir(path):
match = re.search(r'.*\.[xlXL]\w+', file)
if match:
wb = xlrd.open_workbook(path+file)
sht = wb.sheet_by_index(0)
n = sht.nrows
for row in range(n):
if "Total:" in unicode(sht.cell_value(row,0)):
plFound = 'true'
writeFile.write(sht.cell_value(row, 0)+"\n")
writeFile.close()
if plFound == 'true':
summary = open("d:/pls.txt")
for line in summary:
matchTotalCases = re.search(r'Total:\d*CASES\s', line)
matchGrossWeight = re.search(r'gross\sweight\(KG\):\d*\.?\d*\s', line)
matchNetWeight = re.search(r'net\sweight\(KG\):\d*\.?\d*\s', line)
matchVolume = re.search(r'volume\(CBM\):\d*\.?\d*\s', line)
if matchTotalCases:
stringCases = matchTotalCases.group()
cases.append(int(stringCases[6:-6]))
if matchGrossWeight:
stringGrossWeigth = matchGrossWeight.group()
gweight.append(float(stringGrossWeigth[17:-1]))
if matchNetWeight:
stringNetWeight = matchNetWeight.group()
nweight.append(float(stringNetWeight[15:-1]))
if matchVolume:
stringVolume = matchVolume.group()
volume.append(float(stringVolume[12:-1]))
tcases = sum(cases)
tgweight = sum(gweight)
tnweight = sum(nweight)
tvolume = sum(volume)
print "Total cases: %i, gross weight: %f, net weight: %f, volume: %f" %(sum(cases), tgweight, tnweight, tvolume)
else:
print 'No Packing Lists Found.'
except:
print 'There was a problem scanning PLs. No information could be retreived.'
print
#look for BLS-----------------------------------------------------------------------------------------------------------------------
print
print 'Scanning BL Data...'
for file in os.listdir(path):
match = re.search(r'.*\.[pP][dD][fF]', file)
if match:
blFound= 'true'
os.system("C:/Python27/Scripts/pdf2txt.py -o d:/bls.txt "+path+file)
blFile = open("d:/bls.txt").read()
#identifies if its a bill of lading or air waybill:
if "BILL OF LADING" in blFile:
#ok it is a bl from Maersk or KN?
#now scans the file line by line looking for matches
blFile = open("d:/bls.txt")
for line in blFile:
mBlNumber = re.search(r'^\d{9}\n$',line)
mTotalCases = re.search(r'\d\s\s\d+\sC[aA]?[sS][eE]?', line) #sometimes it is written 'CASE' or 'CS'
mGrossWeight = re.search(r'\w\s\s\d+\.*\d*\sKGS', line)
mVolume = re.search(r'\w\s\s\d+\.*\d*\sCBM', line)
mContainers = re.search(r'[A-Z]{4}\d{7}', line)
if mBlNumber: blNumber = mBlNumber.group()[:-1]
if mTotalCases:
casePosition = mTotalCases.group().find('C') #finds the position of leter 'C' in order not to copy it.
blCases.append(int(mTotalCases.group()[3:casePosition]))
if mGrossWeight: blWeight.append(float(mGrossWeight.group()[3:-3]))
if mVolume: blVolume.append(float(mVolume.group()[3:-3]))
if mContainers: containers.append(line[:-13])
else:
#then if it is an airway bill
#is it from panalpina or dhl?
if "PANALPINA" in blFile:
blFile = open("d:/bls.txt")
for line in blFile:
mBlNumber = re.search(r'SZX\s\s\d{6}',line)
mTotalCases = re.search(r'TOTAL:\d+\s', line)
mGrossWeight = re.search(r'\d+\.?\d*K\s', line)
mVolume = re.search(r'VOLUME\s\s\s\s\d+\.?\d*\s', line)
if mBlNumber:
blNumber = mBlNumber.group()
blNumber = blNumber.replace(' ', '')
if mTotalCases: blCases.append(int(mTotalCases.group()[6:-1]))
if mGrossWeight: blWeight.append(float(mGrossWeight.group()[:-2]))
if mVolume: blVolume.append(float(mVolume.group()[10:-1]))
if blFound == 'true' and blNumber != '':
print "BL Number: %s, Total cases: %i, Total Gross Weight: %f, Total Volume: %f" %(blNumber, sum(blCases), sum(blWeight), sum(blVolume))
print 'Cointainers:'
for cont in containers:
print cont
else:
print 'BL/AWB not found!'
#look for discrepancies----------------------------------------------------------------------------------------------------------------------------
#if (cases - blCases != 0) or (gweight - blWeight!=0) or (volume - blVolume !=0):
if tcases != sum(blCases) or tgweight != sum(blWeight) or sum(volume)!= sum(blVolume):
print
print 'WARNING! Some discrepancies found between PLs and BL/AWB'
#create report loader--------------------------------------------------------------------------------------------------------------------------------
print
print 'Creating loader...'
try:
template = openpyxl.load_workbook("d:/loadTemplate.xlsx")
templateSheet = template.get_sheet_by_name("Sheet1")
templateSheet.cell(row=2, column=10).value = fob
templateSheet.cell(row=2, column=11).value = freight
templateSheet.cell(row=2, column=12).value = insurance
templateSheet.cell(row=2, column=13).value = total
templateSheet.cell(row=2, column=7).value = ""
for inv in invoice:
if templateSheet.cell(row=2, column=7).value == "":
templateSheet.cell(row=2, column=7).value = inv + " "
else:
templateSheet.cell(row=2, column=7).value = templateSheet.cell(row=2, column=7).value + inv + " "
templateSheet.cell(row=2, column=1).value = plNum
templateSheet.cell(row=2, column=14).value = tcases
templateSheet.cell(row=2, column=15).value = tgweight
templateSheet.cell(row=2, column=16).value = tvolume
templateSheet.cell(row=2, column=20).value = blNumber
templateSheet.cell(row=2, column=25).value = ''
for cont in containers:
if templateSheet.cell(row=2, column=25).value == '':
templateSheet.cell(row=2, column=25).value = cont + ' '
else:
templateSheet.cell(row=2, column=25).value = templateSheet.cell(row=2, column=25).value + cont + ' '
template.save("d:/loader.xlsx")
print
print 'Process complete.'
except:
print 'WARNING! There was a problem writing the loader. Maybe the file loader.xlsx is open?'
raw_input ()
Páginas
martes, 30 de septiembre de 2014
miércoles, 24 de septiembre de 2014
Python: Extraer datos de un archivo PDF usando PDFMiner
Lo primero logicamente es descargar e instalar la libreria PDFMiner
PDFMiner viene con una herramienta que se puede usar directamente en la linea de comados, hay que entrar a la carpeta que contiene el script pdf2txt.py, y ejecutarlo especificando primero el nombre del archivo de salida y luego el nombre del archivo pdf del que vamos a extraer, por ejemplo:
C:\Python27\Scripts>python pdf2txt.py -o d:/output.txt d:/BL.pdf
Esto crea un archivo de texto llamado output en el disco D:
Ahora si queremos utilizar este script dentro de otro script, se lo puede ejecutar usado os.system:
>>> import os
>>> os.system('C:\Python27\Scripts\pdf2txt.py -o d:/output.txt d:/BL.pdf')
Cabe recalcar que en este caso fue necesario especificar la ruta completa al script pdf2txt.py
PDFMiner viene con una herramienta que se puede usar directamente en la linea de comados, hay que entrar a la carpeta que contiene el script pdf2txt.py, y ejecutarlo especificando primero el nombre del archivo de salida y luego el nombre del archivo pdf del que vamos a extraer, por ejemplo:
C:\Python27\Scripts>python pdf2txt.py -o d:/output.txt d:/BL.pdf
Esto crea un archivo de texto llamado output en el disco D:
Ahora si queremos utilizar este script dentro de otro script, se lo puede ejecutar usado os.system:
>>> import os
>>> os.system('C:\Python27\Scripts\pdf2txt.py -o d:/output.txt d:/BL.pdf')
Cabe recalcar que en este caso fue necesario especificar la ruta completa al script pdf2txt.py
lunes, 15 de septiembre de 2014
R: Formas de eliminar los valores NA
R viene con un data set incluido, llamado airquality:
> airquality
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
7 23 299 8.6 65 5 7
8 19 99 13.8 59 5 8
9 8 19 20.1 61 5 9
10 NA 194 8.6 69 5 10
11 7 NA 6.9 74 5 11
12 16 256 9.7 69 5 12
13 11 290 9.2 66 5 13
14 14 274 10.9 68 5 14
15 18 65 13.2 58 5 15
16 14 334 11.5 64 5 16
17 34 307 12.0 66 5 17
18 6 78 18.4 57 5 18
19 30 322 11.5 68 5 19
20 11 44 9.7 62 5 20
21 1 8 9.7 59 5 21
22 11 320 16.6 73 5 22
23 4 25 9.7 61 5 23
24 32 92 12.0 61 5 24
25 NA 66 16.6 57 5 25
26 NA 266 14.9 58 5 26
27 NA NA 8.0 57 5 27
28 23 13 12.0 67 5 28
29 45 252 14.9 81 5 29
30 115 223 5.7 79 5 30
31 37 279 7.4 76 5 31
32 NA 286 8.6 78 6 1
33 NA 287 9.7 74 6 2
34 NA 242 16.1 67 6 3
35 NA 186 9.2 84 6 4
36 NA 220 8.6 85 6 5
37 NA 264 14.3 79 6 6
38 29 127 9.7 82 6 7
39 NA 273 6.9 87 6 8
40 71 291 13.8 90 6 9
41 39 323 11.5 87 6 10
42 NA 259 10.9 93 6 11
43 NA 250 9.2 92 6 12
44 23 148 8.0 82 6 13
45 NA 332 13.8 80 6 14
46 NA 322 11.5 79 6 15
47 21 191 14.9 77 6 16
48 37 284 20.7 72 6 17
49 20 37 9.2 65 6 18
50 12 120 11.5 73 6 19
51 13 137 10.3 76 6 20
52 NA 150 6.3 77 6 21
53 NA 59 1.7 76 6 22
54 NA 91 4.6 76 6 23
55 NA 250 6.3 76 6 24
56 NA 135 8.0 75 6 25
57 NA 127 8.0 78 6 26
58 NA 47 10.3 73 6 27
59 NA 98 11.5 80 6 28
60 NA 31 14.9 77 6 29
61 NA 138 8.0 83 6 30
62 135 269 4.1 84 7 1
63 49 248 9.2 85 7 2
64 32 236 9.2 81 7 3
65 NA 101 10.9 84 7 4
66 64 175 4.6 83 7 5
67 40 314 10.9 83 7 6
68 77 276 5.1 88 7 7
69 97 267 6.3 92 7 8
70 97 272 5.7 92 7 9
71 85 175 7.4 89 7 10
72 NA 139 8.6 82 7 11
73 10 264 14.3 73 7 12
74 27 175 14.9 81 7 13
75 NA 291 14.9 91 7 14
76 7 48 14.3 80 7 15
77 48 260 6.9 81 7 16
78 35 274 10.3 82 7 17
79 61 285 6.3 84 7 18
80 79 187 5.1 87 7 19
81 63 220 11.5 85 7 20
82 16 7 6.9 74 7 21
83 NA 258 9.7 81 7 22
84 NA 295 11.5 82 7 23
85 80 294 8.6 86 7 24
86 108 223 8.0 85 7 25
87 20 81 8.6 82 7 26
88 52 82 12.0 86 7 27
89 82 213 7.4 88 7 28
90 50 275 7.4 86 7 29
91 64 253 7.4 83 7 30
92 59 254 9.2 81 7 31
93 39 83 6.9 81 8 1
94 9 24 13.8 81 8 2
95 16 77 7.4 82 8 3
96 78 NA 6.9 86 8 4
97 35 NA 7.4 85 8 5
98 66 NA 4.6 87 8 6
99 122 255 4.0 89 8 7
100 89 229 10.3 90 8 8
101 110 207 8.0 90 8 9
102 NA 222 8.6 92 8 10
103 NA 137 11.5 86 8 11
104 44 192 11.5 86 8 12
105 28 273 11.5 82 8 13
106 65 157 9.7 80 8 14
107 NA 64 11.5 79 8 15
108 22 71 10.3 77 8 16
109 59 51 6.3 79 8 17
110 23 115 7.4 76 8 18
111 31 244 10.9 78 8 19
112 44 190 10.3 78 8 20
113 21 259 15.5 77 8 21
114 9 36 14.3 72 8 22
115 NA 255 12.6 75 8 23
116 45 212 9.7 79 8 24
117 168 238 3.4 81 8 25
118 73 215 8.0 86 8 26
119 NA 153 5.7 88 8 27
120 76 203 9.7 97 8 28
121 118 225 2.3 94 8 29
122 84 237 6.3 96 8 30
123 85 188 6.3 94 8 31
124 96 167 6.9 91 9 1
125 78 197 5.1 92 9 2
126 73 183 2.8 93 9 3
127 91 189 4.6 93 9 4
128 47 95 7.4 87 9 5
129 32 92 15.5 84 9 6
130 20 252 10.9 80 9 7
131 23 220 10.3 78 9 8
132 21 230 10.9 75 9 9
133 24 259 9.7 73 9 10
134 44 236 14.9 81 9 11
135 21 259 15.5 76 9 12
136 28 238 6.3 77 9 13
137 9 24 10.9 71 9 14
138 13 112 11.5 71 9 15
139 46 237 6.9 78 9 16
140 18 224 13.8 67 9 17
141 13 27 10.3 76 9 18
142 24 238 10.3 68 9 19
143 16 201 8.0 82 9 20
144 13 238 12.6 64 9 21
145 23 14 9.2 71 9 22
146 36 139 10.3 81 9 23
147 7 49 10.3 69 9 24
148 14 20 16.6 63 9 25
149 30 193 6.9 70 9 26
150 NA 145 13.2 77 9 27
151 14 191 14.3 75 9 28
152 18 131 8.0 76 9 29
153 20 223 11.5 68 9 30
Si quieres por ejemplo sacar la media de la variable "Ozone" te da error porque contiene valores NA:
> mean(airquality$ozone)
[1] NA
Warning message:
In mean.default(airquality$ozone) :
argument is not numeric or logical: returning NA
Las dos maneras mas sencillas para eliminar esos NAs son:
> complete = na.omit(airquality)
> complete = airquality[complete.cases(airquality), ]
Ambas producen un mismo resultado: Un data frame que no contiene ningun valor NA:
> complete
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
7 23 299 8.6 65 5 7
8 19 99 13.8 59 5 8
9 8 19 20.1 61 5 9
12 16 256 9.7 69 5 12
13 11 290 9.2 66 5 13
14 14 274 10.9 68 5 14
15 18 65 13.2 58 5 15
16 14 334 11.5 64 5 16
17 34 307 12.0 66 5 17
18 6 78 18.4 57 5 18
19 30 322 11.5 68 5 19
20 11 44 9.7 62 5 20
21 1 8 9.7 59 5 21
22 11 320 16.6 73 5 22
23 4 25 9.7 61 5 23
24 32 92 12.0 61 5 24
28 23 13 12.0 67 5 28
29 45 252 14.9 81 5 29
30 115 223 5.7 79 5 30
31 37 279 7.4 76 5 31
38 29 127 9.7 82 6 7
40 71 291 13.8 90 6 9
41 39 323 11.5 87 6 10
44 23 148 8.0 82 6 13
47 21 191 14.9 77 6 16
48 37 284 20.7 72 6 17
49 20 37 9.2 65 6 18
50 12 120 11.5 73 6 19
51 13 137 10.3 76 6 20
62 135 269 4.1 84 7 1
63 49 248 9.2 85 7 2
64 32 236 9.2 81 7 3
66 64 175 4.6 83 7 5
67 40 314 10.9 83 7 6
68 77 276 5.1 88 7 7
69 97 267 6.3 92 7 8
70 97 272 5.7 92 7 9
71 85 175 7.4 89 7 10
73 10 264 14.3 73 7 12
74 27 175 14.9 81 7 13
76 7 48 14.3 80 7 15
77 48 260 6.9 81 7 16
78 35 274 10.3 82 7 17
79 61 285 6.3 84 7 18
80 79 187 5.1 87 7 19
81 63 220 11.5 85 7 20
82 16 7 6.9 74 7 21
85 80 294 8.6 86 7 24
86 108 223 8.0 85 7 25
87 20 81 8.6 82 7 26
88 52 82 12.0 86 7 27
89 82 213 7.4 88 7 28
90 50 275 7.4 86 7 29
91 64 253 7.4 83 7 30
92 59 254 9.2 81 7 31
93 39 83 6.9 81 8 1
94 9 24 13.8 81 8 2
95 16 77 7.4 82 8 3
99 122 255 4.0 89 8 7
100 89 229 10.3 90 8 8
101 110 207 8.0 90 8 9
104 44 192 11.5 86 8 12
105 28 273 11.5 82 8 13
106 65 157 9.7 80 8 14
108 22 71 10.3 77 8 16
109 59 51 6.3 79 8 17
110 23 115 7.4 76 8 18
111 31 244 10.9 78 8 19
112 44 190 10.3 78 8 20
113 21 259 15.5 77 8 21
114 9 36 14.3 72 8 22
116 45 212 9.7 79 8 24
117 168 238 3.4 81 8 25
118 73 215 8.0 86 8 26
120 76 203 9.7 97 8 28
121 118 225 2.3 94 8 29
122 84 237 6.3 96 8 30
123 85 188 6.3 94 8 31
124 96 167 6.9 91 9 1
125 78 197 5.1 92 9 2
126 73 183 2.8 93 9 3
127 91 189 4.6 93 9 4
128 47 95 7.4 87 9 5
129 32 92 15.5 84 9 6
130 20 252 10.9 80 9 7
131 23 220 10.3 78 9 8
132 21 230 10.9 75 9 9
133 24 259 9.7 73 9 10
134 44 236 14.9 81 9 11
135 21 259 15.5 76 9 12
136 28 238 6.3 77 9 13
137 9 24 10.9 71 9 14
138 13 112 11.5 71 9 15
139 46 237 6.9 78 9 16
140 18 224 13.8 67 9 17
141 13 27 10.3 76 9 18
142 24 238 10.3 68 9 19
143 16 201 8.0 82 9 20
144 13 238 12.6 64 9 21
145 23 14 9.2 71 9 22
146 36 139 10.3 81 9 23
147 7 49 10.3 69 9 24
148 14 20 16.6 63 9 25
149 30 193 6.9 70 9 26
151 14 191 14.3 75 9 28
152 18 131 8.0 76 9 29
153 20 223 11.5 68 9 30
Ahora sí puedo sacar la media de "Ozone" en aquellas observaciones en que no existia ningun NA
> mean(complete$Ozone)
[1] 42.0991
Aunque hay una forma mas directa de sacar la media sin crear un data frame de valores completos. Se puede utilizar el data frame 'en bruto' solo espeficando que se deben omitir los valores NA al momento del calculo:
> mean(na.omit(airquality)$Ozone)
[1] 42.0991
Sin embargo hay observaciones que sí tienen valores en "Ozone" pero que quizas no tengan valores en otras variables, por lo que na.omit() y complete.cases() van a dear fuera a toda la fila.
Para calcular la media con todos los valores de Ozone, asi falten valores en otras variables, se realiza de la siguiente manera:
> mean(airquality$Ozone, na.rm = TRUE)
[1] 42.12931
> airquality
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
7 23 299 8.6 65 5 7
8 19 99 13.8 59 5 8
9 8 19 20.1 61 5 9
10 NA 194 8.6 69 5 10
11 7 NA 6.9 74 5 11
12 16 256 9.7 69 5 12
13 11 290 9.2 66 5 13
14 14 274 10.9 68 5 14
15 18 65 13.2 58 5 15
16 14 334 11.5 64 5 16
17 34 307 12.0 66 5 17
18 6 78 18.4 57 5 18
19 30 322 11.5 68 5 19
20 11 44 9.7 62 5 20
21 1 8 9.7 59 5 21
22 11 320 16.6 73 5 22
23 4 25 9.7 61 5 23
24 32 92 12.0 61 5 24
25 NA 66 16.6 57 5 25
26 NA 266 14.9 58 5 26
27 NA NA 8.0 57 5 27
28 23 13 12.0 67 5 28
29 45 252 14.9 81 5 29
30 115 223 5.7 79 5 30
31 37 279 7.4 76 5 31
32 NA 286 8.6 78 6 1
33 NA 287 9.7 74 6 2
34 NA 242 16.1 67 6 3
35 NA 186 9.2 84 6 4
36 NA 220 8.6 85 6 5
37 NA 264 14.3 79 6 6
38 29 127 9.7 82 6 7
39 NA 273 6.9 87 6 8
40 71 291 13.8 90 6 9
41 39 323 11.5 87 6 10
42 NA 259 10.9 93 6 11
43 NA 250 9.2 92 6 12
44 23 148 8.0 82 6 13
45 NA 332 13.8 80 6 14
46 NA 322 11.5 79 6 15
47 21 191 14.9 77 6 16
48 37 284 20.7 72 6 17
49 20 37 9.2 65 6 18
50 12 120 11.5 73 6 19
51 13 137 10.3 76 6 20
52 NA 150 6.3 77 6 21
53 NA 59 1.7 76 6 22
54 NA 91 4.6 76 6 23
55 NA 250 6.3 76 6 24
56 NA 135 8.0 75 6 25
57 NA 127 8.0 78 6 26
58 NA 47 10.3 73 6 27
59 NA 98 11.5 80 6 28
60 NA 31 14.9 77 6 29
61 NA 138 8.0 83 6 30
62 135 269 4.1 84 7 1
63 49 248 9.2 85 7 2
64 32 236 9.2 81 7 3
65 NA 101 10.9 84 7 4
66 64 175 4.6 83 7 5
67 40 314 10.9 83 7 6
68 77 276 5.1 88 7 7
69 97 267 6.3 92 7 8
70 97 272 5.7 92 7 9
71 85 175 7.4 89 7 10
72 NA 139 8.6 82 7 11
73 10 264 14.3 73 7 12
74 27 175 14.9 81 7 13
75 NA 291 14.9 91 7 14
76 7 48 14.3 80 7 15
77 48 260 6.9 81 7 16
78 35 274 10.3 82 7 17
79 61 285 6.3 84 7 18
80 79 187 5.1 87 7 19
81 63 220 11.5 85 7 20
82 16 7 6.9 74 7 21
83 NA 258 9.7 81 7 22
84 NA 295 11.5 82 7 23
85 80 294 8.6 86 7 24
86 108 223 8.0 85 7 25
87 20 81 8.6 82 7 26
88 52 82 12.0 86 7 27
89 82 213 7.4 88 7 28
90 50 275 7.4 86 7 29
91 64 253 7.4 83 7 30
92 59 254 9.2 81 7 31
93 39 83 6.9 81 8 1
94 9 24 13.8 81 8 2
95 16 77 7.4 82 8 3
96 78 NA 6.9 86 8 4
97 35 NA 7.4 85 8 5
98 66 NA 4.6 87 8 6
99 122 255 4.0 89 8 7
100 89 229 10.3 90 8 8
101 110 207 8.0 90 8 9
102 NA 222 8.6 92 8 10
103 NA 137 11.5 86 8 11
104 44 192 11.5 86 8 12
105 28 273 11.5 82 8 13
106 65 157 9.7 80 8 14
107 NA 64 11.5 79 8 15
108 22 71 10.3 77 8 16
109 59 51 6.3 79 8 17
110 23 115 7.4 76 8 18
111 31 244 10.9 78 8 19
112 44 190 10.3 78 8 20
113 21 259 15.5 77 8 21
114 9 36 14.3 72 8 22
115 NA 255 12.6 75 8 23
116 45 212 9.7 79 8 24
117 168 238 3.4 81 8 25
118 73 215 8.0 86 8 26
119 NA 153 5.7 88 8 27
120 76 203 9.7 97 8 28
121 118 225 2.3 94 8 29
122 84 237 6.3 96 8 30
123 85 188 6.3 94 8 31
124 96 167 6.9 91 9 1
125 78 197 5.1 92 9 2
126 73 183 2.8 93 9 3
127 91 189 4.6 93 9 4
128 47 95 7.4 87 9 5
129 32 92 15.5 84 9 6
130 20 252 10.9 80 9 7
131 23 220 10.3 78 9 8
132 21 230 10.9 75 9 9
133 24 259 9.7 73 9 10
134 44 236 14.9 81 9 11
135 21 259 15.5 76 9 12
136 28 238 6.3 77 9 13
137 9 24 10.9 71 9 14
138 13 112 11.5 71 9 15
139 46 237 6.9 78 9 16
140 18 224 13.8 67 9 17
141 13 27 10.3 76 9 18
142 24 238 10.3 68 9 19
143 16 201 8.0 82 9 20
144 13 238 12.6 64 9 21
145 23 14 9.2 71 9 22
146 36 139 10.3 81 9 23
147 7 49 10.3 69 9 24
148 14 20 16.6 63 9 25
149 30 193 6.9 70 9 26
150 NA 145 13.2 77 9 27
151 14 191 14.3 75 9 28
152 18 131 8.0 76 9 29
153 20 223 11.5 68 9 30
Si quieres por ejemplo sacar la media de la variable "Ozone" te da error porque contiene valores NA:
> mean(airquality$ozone)
[1] NA
Warning message:
In mean.default(airquality$ozone) :
argument is not numeric or logical: returning NA
Las dos maneras mas sencillas para eliminar esos NAs son:
> complete = na.omit(airquality)
> complete = airquality[complete.cases(airquality), ]
Ambas producen un mismo resultado: Un data frame que no contiene ningun valor NA:
> complete
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
7 23 299 8.6 65 5 7
8 19 99 13.8 59 5 8
9 8 19 20.1 61 5 9
12 16 256 9.7 69 5 12
13 11 290 9.2 66 5 13
14 14 274 10.9 68 5 14
15 18 65 13.2 58 5 15
16 14 334 11.5 64 5 16
17 34 307 12.0 66 5 17
18 6 78 18.4 57 5 18
19 30 322 11.5 68 5 19
20 11 44 9.7 62 5 20
21 1 8 9.7 59 5 21
22 11 320 16.6 73 5 22
23 4 25 9.7 61 5 23
24 32 92 12.0 61 5 24
28 23 13 12.0 67 5 28
29 45 252 14.9 81 5 29
30 115 223 5.7 79 5 30
31 37 279 7.4 76 5 31
38 29 127 9.7 82 6 7
40 71 291 13.8 90 6 9
41 39 323 11.5 87 6 10
44 23 148 8.0 82 6 13
47 21 191 14.9 77 6 16
48 37 284 20.7 72 6 17
49 20 37 9.2 65 6 18
50 12 120 11.5 73 6 19
51 13 137 10.3 76 6 20
62 135 269 4.1 84 7 1
63 49 248 9.2 85 7 2
64 32 236 9.2 81 7 3
66 64 175 4.6 83 7 5
67 40 314 10.9 83 7 6
68 77 276 5.1 88 7 7
69 97 267 6.3 92 7 8
70 97 272 5.7 92 7 9
71 85 175 7.4 89 7 10
73 10 264 14.3 73 7 12
74 27 175 14.9 81 7 13
76 7 48 14.3 80 7 15
77 48 260 6.9 81 7 16
78 35 274 10.3 82 7 17
79 61 285 6.3 84 7 18
80 79 187 5.1 87 7 19
81 63 220 11.5 85 7 20
82 16 7 6.9 74 7 21
85 80 294 8.6 86 7 24
86 108 223 8.0 85 7 25
87 20 81 8.6 82 7 26
88 52 82 12.0 86 7 27
89 82 213 7.4 88 7 28
90 50 275 7.4 86 7 29
91 64 253 7.4 83 7 30
92 59 254 9.2 81 7 31
93 39 83 6.9 81 8 1
94 9 24 13.8 81 8 2
95 16 77 7.4 82 8 3
99 122 255 4.0 89 8 7
100 89 229 10.3 90 8 8
101 110 207 8.0 90 8 9
104 44 192 11.5 86 8 12
105 28 273 11.5 82 8 13
106 65 157 9.7 80 8 14
108 22 71 10.3 77 8 16
109 59 51 6.3 79 8 17
110 23 115 7.4 76 8 18
111 31 244 10.9 78 8 19
112 44 190 10.3 78 8 20
113 21 259 15.5 77 8 21
114 9 36 14.3 72 8 22
116 45 212 9.7 79 8 24
117 168 238 3.4 81 8 25
118 73 215 8.0 86 8 26
120 76 203 9.7 97 8 28
121 118 225 2.3 94 8 29
122 84 237 6.3 96 8 30
123 85 188 6.3 94 8 31
124 96 167 6.9 91 9 1
125 78 197 5.1 92 9 2
126 73 183 2.8 93 9 3
127 91 189 4.6 93 9 4
128 47 95 7.4 87 9 5
129 32 92 15.5 84 9 6
130 20 252 10.9 80 9 7
131 23 220 10.3 78 9 8
132 21 230 10.9 75 9 9
133 24 259 9.7 73 9 10
134 44 236 14.9 81 9 11
135 21 259 15.5 76 9 12
136 28 238 6.3 77 9 13
137 9 24 10.9 71 9 14
138 13 112 11.5 71 9 15
139 46 237 6.9 78 9 16
140 18 224 13.8 67 9 17
141 13 27 10.3 76 9 18
142 24 238 10.3 68 9 19
143 16 201 8.0 82 9 20
144 13 238 12.6 64 9 21
145 23 14 9.2 71 9 22
146 36 139 10.3 81 9 23
147 7 49 10.3 69 9 24
148 14 20 16.6 63 9 25
149 30 193 6.9 70 9 26
151 14 191 14.3 75 9 28
152 18 131 8.0 76 9 29
153 20 223 11.5 68 9 30
Ahora sí puedo sacar la media de "Ozone" en aquellas observaciones en que no existia ningun NA
> mean(complete$Ozone)
[1] 42.0991
Aunque hay una forma mas directa de sacar la media sin crear un data frame de valores completos. Se puede utilizar el data frame 'en bruto' solo espeficando que se deben omitir los valores NA al momento del calculo:
> mean(na.omit(airquality)$Ozone)
[1] 42.0991
Sin embargo hay observaciones que sí tienen valores en "Ozone" pero que quizas no tengan valores en otras variables, por lo que na.omit() y complete.cases() van a dear fuera a toda la fila.
Para calcular la media con todos los valores de Ozone, asi falten valores en otras variables, se realiza de la siguiente manera:
> mean(airquality$Ozone, na.rm = TRUE)
[1] 42.12931
domingo, 14 de septiembre de 2014
R: Tercer proyecto de Coursera "Correlation"
El tercero consistía en una funcion para crean un listado con las correlaciones entre dos variables en cada archivo de un directorio, con un umbral de casos completos.
corr <- function(directory, threshold = 0) {
file_list = list.files(directory)
found = FALSE
for (file in file_list){
current_file = read.csv(paste(directory,"/", file, sep =""))
observed_cases = sum(complete.cases(current_file))
if (observed_cases >= threshold) {
found = TRUE
data_frame = na.omit(current_file)
if (!exists("cor_vector")){
cor_vector = cor(data_frame$sulfate, data_frame$nitrate)
}else{
temp_vector = cor(data_frame$sulfate, data_frame$nitrate)
cor_vector = c(cor_vector, temp_vector)
rm(temp_vector)
}
}
}
if(found==TRUE){cor_vector = cor_vector[-1]}
}
corr <- function(directory, threshold = 0) {
file_list = list.files(directory)
found = FALSE
for (file in file_list){
current_file = read.csv(paste(directory,"/", file, sep =""))
observed_cases = sum(complete.cases(current_file))
if (observed_cases >= threshold) {
found = TRUE
data_frame = na.omit(current_file)
if (!exists("cor_vector")){
cor_vector = cor(data_frame$sulfate, data_frame$nitrate)
}else{
temp_vector = cor(data_frame$sulfate, data_frame$nitrate)
cor_vector = c(cor_vector, temp_vector)
rm(temp_vector)
}
}
}
if(found==TRUE){cor_vector = cor_vector[-1]}
}
R: Segundo proyecto de Coursera 'Complete'
El segundo deber consistía en crea una función que genere un data frame indicando cuantas observaciones completas contiene cada archivo de un directorio:
complete = function(directory, iden=1:332){
file_list = list.files(directory)
for (file in file_list) {
x = read.csv(paste(directory,"/",file, sep =""))
if (x[1,4] %in% iden){
monitor = x[1,4]
complete_cases = sum(complete.cases(x))
if (!exists("data_frame")){
data_frame = data.frame(id=monitor, nobs = complete_cases)
} else {
temp_data_frame = data.frame(id=monitor, nobs = complete_cases)
data_frame = rbind(data_frame, temp_data_frame)
rm(temp_data_frame)
}
}
}
for (value in iden){
for (rows in seq(nrow(data_frame))){
if (data_frame[rows,1] == value){
if (!exists("monitor_frame")){
monitor_frame = subset(data_frame, id == value)
}else{
temp_monitor_frame = subset(data_frame, id==value)
monitor_frame = rbind(monitor_frame, temp_monitor_frame)
rm(temp_monitor_frame)
}
break
}
}
}
print(monitor_frame)
}
complete = function(directory, iden=1:332){
file_list = list.files(directory)
for (file in file_list) {
x = read.csv(paste(directory,"/",file, sep =""))
if (x[1,4] %in% iden){
monitor = x[1,4]
complete_cases = sum(complete.cases(x))
if (!exists("data_frame")){
data_frame = data.frame(id=monitor, nobs = complete_cases)
} else {
temp_data_frame = data.frame(id=monitor, nobs = complete_cases)
data_frame = rbind(data_frame, temp_data_frame)
rm(temp_data_frame)
}
}
}
for (value in iden){
for (rows in seq(nrow(data_frame))){
if (data_frame[rows,1] == value){
if (!exists("monitor_frame")){
monitor_frame = subset(data_frame, id == value)
}else{
temp_monitor_frame = subset(data_frame, id==value)
monitor_frame = rbind(monitor_frame, temp_monitor_frame)
rm(temp_monitor_frame)
}
break
}
}
}
print(monitor_frame)
}
R: Proyecto de Coursera 'Pollutantmean'
Este es el primer deber, así lo hice:
pollutantmean = function(directory, pollutant, id = 1:332){
file_list = list.files(directory)
for (file in file_list) {
if (!exists("data_frame")) {
data_frame = read.csv(paste(directory,"/", file, sep = ""), header= TRUE)
} else {
temp_data = read.csv(paste(directory,"/", file, sep=""), header = TRUE)
data_frame = rbind(data_frame, temp_data)
rm(temp_data)
}
}
good = complete.cases(data_frame)
complete_data_frame = data_frame[good, ]
monitor_filter = subset(complete_data_frame, ID %in% id)
mean(monitor_filter[, pollutant])
}
pollutantmean = function(directory, pollutant, id = 1:332){
file_list = list.files(directory)
for (file in file_list) {
if (!exists("data_frame")) {
data_frame = read.csv(paste(directory,"/", file, sep = ""), header= TRUE)
} else {
temp_data = read.csv(paste(directory,"/", file, sep=""), header = TRUE)
data_frame = rbind(data_frame, temp_data)
rm(temp_data)
}
}
good = complete.cases(data_frame)
complete_data_frame = data_frame[good, ]
monitor_filter = subset(complete_data_frame, ID %in% id)
mean(monitor_filter[, pollutant])
}
domingo, 7 de septiembre de 2014
Python: Crear un listado con cada letra de una palabra
>>> #primero creo la variable con la cadena de texto:
>>> ruben = "ruben dario torres macias"
>>> ruben
'ruben dario torres macias'
>>> #ahora remuevo los espacios
>>> ruben =ruben.replace(" ", "")
>>> ruben
'rubendariotorresmacias'
>>> #ahora creo una lista vacia donde almacenaré las letras:
... letras =[]
>>> #para leer cada letra hago un subset en cada posicion de la variable 'ruben'
... for l in range(0, len(ruben)):
... letras.append(ruben[l])
...
>>> letras
['r', 'u', 'b', 'e', 'n', 'd', 'a', 'r', 'i', 'o', 't', 'o', 'r', 'r', 'e', 's', 'm', 'a', 'c', 'i', 'a', 's']
>>> ruben = "ruben dario torres macias"
>>> ruben
'ruben dario torres macias'
>>> #ahora remuevo los espacios
>>> ruben =ruben.replace(" ", "")
>>> ruben
'rubendariotorresmacias'
>>> #ahora creo una lista vacia donde almacenaré las letras:
... letras =[]
>>> #para leer cada letra hago un subset en cada posicion de la variable 'ruben'
... for l in range(0, len(ruben)):
... letras.append(ruben[l])
...
>>> letras
['r', 'u', 'b', 'e', 'n', 'd', 'a', 'r', 'i', 'o', 't', 'o', 'r', 'r', 'e', 's', 'm', 'a', 'c', 'i', 'a', 's']
martes, 2 de septiembre de 2014
Python: Como contar el numero de veces que un elemento aparece en una lista. Funcion collections.Counter()
Tengo un listado como por ejemplo:
1
2
3
4
4
5
6
6
7
8
9
9
10
11
12
12
12
13
14
14
15
15
15
Deseo contar cuantas veces se ha repetido cada numero:
Mi archivo se llama dictionary.txt, pimero creo una lista:
>>> lista = [item for item in open('dictionary.txt').readlines()]
>>> lista
['1\n', '2\n', '3\n', '4\n', '4\n', '5\n', '6\n', '6\n', '7\n', '8\n', '9\n', '9
\n', '10\n', '11\n', '12\n', '12\n', '12\n', '13\n', '14\n', '14\n', '15\n', '15
\n', '15']
Sin embargo al final de cada lista me aparece un simbolo de final de linea, el cual elimino de la siguiente manera:
>>> for item in lista:
... if '\n'in item:
... lista[lista.index(item)]=item.replace('\n', '')
...
>>> lista
['1', '2', '3', '4', '4', '5', '6', '6', '7', '8', '9', '9', '10', '11', '12', '
12', '12', '13', '14', '14', '15', '15', '15']
Ahora lo maravilloso, en el modulo collections existe una funcion llamada Counter, que crea un diccionario con los elementos de una lista y cuenta el numero de ocurrencias:
>>> diccionario= collections.Counter(lista)
>>>
>>> diccionario
Counter({'12': 3, '15': 3, '14': 2, '4': 2, '6': 2, '9': 2, '11': 1, '10': 1, '1
3': 1, '1': 1, '3': 1, '2': 1, '5': 1, '7': 1, '8': 1})
Si no te gusta que al comienzo aparezca la palabra Counter, pues conviertelo a diccionario con la funcion dict()
>>> diccionario = dict(diccionario)
>>> diccionario
{'11': 1, '10': 1, '13': 1, '12': 3, '15': 3, '14': 2, '1': 1, '3': 1, '2': 1, '
5': 1, '4': 2, '7': 1, '6': 2, '9': 2, '8': 1}
>>>
1
2
3
4
4
5
6
6
7
8
9
9
10
11
12
12
12
13
14
14
15
15
15
Deseo contar cuantas veces se ha repetido cada numero:
Mi archivo se llama dictionary.txt, pimero creo una lista:
>>> lista = [item for item in open('dictionary.txt').readlines()]
>>> lista
['1\n', '2\n', '3\n', '4\n', '4\n', '5\n', '6\n', '6\n', '7\n', '8\n', '9\n', '9
\n', '10\n', '11\n', '12\n', '12\n', '12\n', '13\n', '14\n', '14\n', '15\n', '15
\n', '15']
Sin embargo al final de cada lista me aparece un simbolo de final de linea, el cual elimino de la siguiente manera:
>>> for item in lista:
... if '\n'in item:
... lista[lista.index(item)]=item.replace('\n', '')
...
>>> lista
['1', '2', '3', '4', '4', '5', '6', '6', '7', '8', '9', '9', '10', '11', '12', '
12', '12', '13', '14', '14', '15', '15', '15']
Ahora lo maravilloso, en el modulo collections existe una funcion llamada Counter, que crea un diccionario con los elementos de una lista y cuenta el numero de ocurrencias:
>>> diccionario= collections.Counter(lista)
>>>
>>> diccionario
Counter({'12': 3, '15': 3, '14': 2, '4': 2, '6': 2, '9': 2, '11': 1, '10': 1, '1
3': 1, '1': 1, '3': 1, '2': 1, '5': 1, '7': 1, '8': 1})
Si no te gusta que al comienzo aparezca la palabra Counter, pues conviertelo a diccionario con la funcion dict()
>>> diccionario = dict(diccionario)
>>> diccionario
{'11': 1, '10': 1, '13': 1, '12': 3, '15': 3, '14': 2, '1': 1, '3': 1, '2': 1, '
5': 1, '4': 2, '7': 1, '6': 2, '9': 2, '8': 1}
>>>
Suscribirse a:
Entradas (Atom)