python: integer to roman

This function converts an integer to a roman numeral.

  1. def intToRoman(num):
  2. n = int(num)
  3. rv = ""
  4. for dec, rom in ((1000, 'M'), (900, 'CM', ),(500, 'D'), (400, 'CD'), (100, 'C'),(90, 'XC'),(50, 'L'), (40, 'XL'),(10, 'X'), (9, 'IX'), (5, 'V'),(4, 'IV'), (1, 'I') ):
  5. while (n >= dec):
  6. n -= dec;
  7. rv += rom;
  8. return rv
from GNU Enterprise

python: distance of points in .kmz

This code calculates distance in kilometers from points saved in .kmz file. Such files can be created by Google Earth.

  1. #!/usr/bin/env python
  2. # -*- coding: utf8 -*-
  3.  
  4. __version__ = '$Id: kmz2dist.py 609 2009-06-01 05:04:52Z mn $'
  5. # author: Michal Niklas
  6.  
  7. """
  8. Calculates distance in kilometers from points saved in .kmz file.
  9. Such files can be created by Google Earth
  10. look at:
  11. http://code.google.com/intl/pl-PL/apis/kml/documentation/kmlreference.html"""
  12.  
  13. import sys
  14. import zipfile
  15. import glob
  16. from xml.dom import minidom
  17. import distance
  18.  
  19. def get_distance(coordinates_str):
  20. """gets distance of one path from coordinates string in form of:
  21. 14.81363432237944,53.57016581501523,0 14.81411766813742,53.56923005549378,0 14.81880340335202,53.56879451890311 ...
  22. look at:
  23.  
  24. http://code.google.com/intl/pl-PL/apis/kml/documentation/kmlreference.html#coordinates
  25.  
  26. """
  27. sum_distance = 0.0
  28. arr = []
  29. coordinates = []
  30. if ' ' in coordinates_str:
  31. arr = coordinates_str.split(' ')
  32. if len(arr) > 1:
  33. for s in arr:
  34. if ',' in s:
  35. pt = s.split(',')
  36. pos_latt = (float(pt[0].strip()), 0, 0)
  37. pos_long = (float(pt[1].strip()), 0, 0)
  38. position = (pos_latt, pos_long)
  39. coordinates.append(position)
  40. if coordinates:
  41. for i in range(len(coordinates) - 1):
  42. start = coordinates[i]
  43. stop = coordinates[i + 1]
  44. sum_distance += distance.points2distance(start, stop)
  45. return sum_distance
  46.  
  47. def show_distance(fname):
  48. """calculates distance from points saved in doc.kml which is part of .kmz
  49. zip archive file"""
  50. path_cnt = 0
  51. zf = zipfile.ZipFile(fname, 'r')
  52. for fn in zf.namelist():
  53. if fn.endswith('.kml'):
  54. content = zf.read(fn)
  55. xmldoc = minidom.parseString(content)
  56. placemarks = xmldoc.getElementsByTagName('Placemark')
  57. for placemark in placemarks:
  58. name = placemark.getElementsByTagName('name')
  59. if name:
  60. name = name[0].firstChild.data.strip()
  61. coordinates = placemark.getElementsByTagName('coordinates')
  62. if coordinates:
  63. coordinates = coordinates[0].firstChild.data.strip()
  64. if coordinates:
  65. distance_km = get_distance(coordinates)
  66. if distance_km > 0.0:
  67. if path_cnt == 0:
  68. print 'n%s:' % (fname)
  69. path_cnt += 1
  70. print('t%st%5.2f' % (name, distance_km))
  71. return path_cnt
  72.  
  73. def main():
  74. """show .kmz file name and distance in kilometers"""
  75. fnames = glob.glob('*.kmz')
  76. if not fnames:
  77. print('No *.kmz files found')
  78. else:
  79. for fname in fnames:
  80. show_distance(fname)
  81.  
  82. if __name__ == '__main__':
  83. if '--version' in sys.argv:
  84. print(__version__)
  85. else:
  86. main()

by Michal Niklas on Thu, 28 May 2009 (MIT)

python: Find unique emails in a file

It return a list of email adresses found in a text file, maching according to the basic adress conversions.

  1. def grab_email(files = []):
  2. found = []
  3. if files != None:
  4. mailsrch = re.compile(r'[w-][w-.]+@[w-][w-.]+[a-zA-Z]{1,4}')
  5.  
  6. for file in files:
  7. for line in open(file,'r'):
  8. found.extend(mailsrch.findall(line))
  9.  
  10. # remove duplicate elements
  11. # borrowed from Tim Peters' algorithm on ASPN Cookbook
  12. u = {}
  13. for item in found:
  14. u[item] = 1
  15.  
  16. # return list of unique email addresses
  17. return u.keys()

python-OpenOffice: export text

By using the library ooopy we could export the text contents of an .odt file directly to a plain text file:

  1. from ooopy.OOoPy import OOoPy
  2. def as_text (node, out) :
  3. if node.text is not None :
  4. print >> out, node.text.encode ('utf-8'),
  5. for subnode in node :
  6. as_text (subnode, out)
  7. if node.tail is not None :
  8. print >> out, node.tail.encode ('utf-8'),
  9.  
  10. if __name__ == '__main__' :
  11. outfile = open ("out.txt", "w")
  12. o = OOoPy ("test.odt")
  13. e = o.read ('content.xml')
  14. as_text (e.getroot (), outfile)

python: read .por files (SPSS)

  1. DEL = '/'
  2. class PorReader(object):
  3. def __init__(self, file):
  4. if type(file) in (str, unicode): file = open(file)
  5. self.file = file
  6. self.pos = -1
  7. self.buffer = ""
  8. def consumeOne(self, skip=False):
  9. p = self.buffer.find(DEL, self.pos+1)
  10. output = ""
  11. while p == -1:
  12. if not skip: output += self.buffer[self.pos+1:]
  13. self.buffer = self.file.read(1024)
  14. self.pos = -1
  15. p = self.buffer.find(DEL, self.pos+1)
  16. if not self.buffer: break
  17. if not skip: output += self.buffer[self.pos+1:p]
  18. self.pos = p
  19. if not skip:
  20. output = output.replace("rn", "")
  21. return output
  22.  
  23. def consume(self, n=1):
  24. return [self.consumeOne() for i in range(n)]
  25.  
  26. def skip(self, n=1):
  27. for i in range(n):
  28. self.consumeOne(skip=True)
  29.  
  30. HEAD = 'SPSS for Microsoft Windows Release 15.04'
  31.  
  32. FLOAT, STR, INT = 0,1,2
  33.  
  34. class SPSSVariable(object):
  35. def __init__(self, name, label=None, numeric=True, decimals=0):
  36. self.name = name
  37. self.label = label
  38. self.numeric = numeric
  39. self.decimals = decimals
  40. self.valuelabels = None
  41. self.index = None
  42. def __str__(self):
  43. t = 'S'
  44. if self.numeric: t = 'I'
  45. if self.numeric and self.decimals: t = 'F'
  46. return "%s%s%s" % (self.name, (' "%s" ' % self.label if self.label else ''),t)
  47.  
  48. def splitstring(slen=None, s=None, reader=None):
  49. if slen is None:
  50. slen = reader.consume(2)
  51. if s is None: slen, s = slen
  52. if type(slen) == str: slen = readnum(slen)
  53. while slen > len(s):
  54. if reader:
  55. s += "/"+reader.consumeOne()
  56. else:
  57. raise Exception("!")
  58. keep = s[slen:]
  59. s = s[:slen]
  60. return s, keep
  61.  
  62. class SPSSFile(object):
  63. def __init__(self, file):
  64. self.variables = []
  65. self.vardict = {}
  66. self.data = []
  67. self.init(file)
  68. def addvar(self, var):
  69. var.index = len(self.variables)
  70. self.variables.append(var)
  71. self.vardict[var.name] = var
  72. def getvar(self, varname):
  73. return self.vardict[varname]
  74. def get(self, var, row):
  75. if type(var) in (str, unicode):
  76. var = self.vardict[var]
  77. return row[var.index]
  78. def init(self, file):
  79. r = PorReader(file)
  80. r.skip(5)
  81. h = r.consumeOne()
  82. if not h.startswith(HEAD): raise Exception("Cannot read .por")
  83. numvars = readnum(h[len(HEAD):])
  84. h = r.skip(1)
  85. keep = r.consumeOne()
  86. while True:
  87. action = keep[0]
  88. #print "ACTION: %s" % action
  89. if action == '7':
  90. data = r.consume(8)
  91. while data[-2][0] <> 'C': data += r.consume()
  92. decimals = readnum(data[4])
  93. numeric = keep[1:] == '0'
  94. name, dummy = splitstring(data[:2])
  95. labellen, label = data[-2:]
  96. label, keep = splitstring(labellen[1:], label, r)
  97. v = SPSSVariable(name, label, numeric, decimals)
  98. self.addvar(v)
  99. #print "ADDED VAR ", v, data, `keep`, labellen[1:]
  100. if action == 'D': # value labels
  101. numvars = readnum(keep[1:])
  102. varnames = []
  103. keep = r.consumeOne()
  104. for i in range(numvars):
  105. name, keep = splitstring(keep, r.consumeOne(), reader=r)
  106. varnames.append(name)
  107. numlabels = readnum(keep)
  108. keep = r.consumeOne()
  109. labels = {}
  110. numeric = self.getvar(varnames[0]).numeric
  111. for i in range(numlabels):
  112. if numeric:
  113. val = readnum(keep)
  114. name, keep = splitstring(reader=r)
  115. else:
  116. val, keep = splitstring(keep, r.consumeOne(), reader=r)
  117. name, keep = splitstring(keep, r.consumeOne(), reader=r)
  118. labels[val] = name
  119. #print "VALUE LABELS", varnames, labels
  120. for varname in varnames:
  121. self.getvar(varname).valuelabels = labels
  122. if action == 'F': # data
  123. keep = keep[1:]
  124. while True:
  125. row = []
  126. for var in self.variables:
  127. if not keep: keep = r.consumeOne()
  128. if keep.startswith("Z"):
  129. return
  130. if var.numeric:
  131. if keep.startswith("*."):
  132. row.append(None)
  133. keep = keep[2:]
  134. else:
  135. try:
  136. row.append(readnum(keep))
  137. except Exception, e:
  138. print row
  139. print "Exception on %s" % var
  140. raise e
  141. keep = ""
  142. else:
  143. slen = keep
  144. x, keep = splitstring(slen, r.consumeOne())
  145. row.append(x)
  146. self.data.append(tuple(row))
  147. if action == 'Z': # data
  148. print "Done!"
  149. return
  150.  
  151. def _codec(str_in, base_from=36, base_to=10):
  152. """
  153. Base36 Encoder/Decoder
  154. by Mike Crute (mcrute@gmail.com) on August 26, 2008
  155. This code has been placed in the public domain.
  156. """
  157. ASCII = { "0": 48, "9": 57, "A": 65, "Z": 90 }
  158. # There are 8 characters between 9 and A
  159. from_digits = [chr(x) for x in range(ASCII["0"], ASCII["9"] + 8 + base_from)
  160. if (x >= ASCII["0"] and x <= ASCII["9"]) or (x >= ASCII["A"] and x <= ASCII["Z"])][:base_from] to_digits = [chr(x) for x in range(ASCII["0"], ASCII["9"] + 8 + base_to) if (x >= ASCII["0"] and x <= ASCII["9"]) or (x >= ASCII["A"] and x <= ASCII["Z"])][:base_to] x = long(0) for digit in str(str_in).upper(): x = x * len(from_digits) + from_digits.index(digit) result = "" # This is going to assemble our number in reverse order # so we'll have to fix it before we return it while x > 0:
  161. result += to_digits[x % len(to_digits)]
  162. x /= len(to_digits)
  163. return result[::-1]
  164. def decode(s):
  165. while s.startswith("0"): s = s[1:]
  166. if not s: return 0
  167. try:
  168. return int(_codec(s, 30, 10))
  169. except ValueError, e:
  170. raise ValueError("Cannot decode %r: %s" % (s, e))
  171. def readnum(s):
  172. neg = s.startswith("-")
  173. if neg: s = s[1:]
  174. if "+" in s:
  175. num, exp = map(decode, s.split("+"))
  176. result = 30**exp
  177. elif "-" in s:
  178. num, exp = map(decode, s.split("-"))
  179. result = 1. / (30**exp)
  180. else:
  181. if "." in s:
  182. i, d = s.split(".")
  183. else:
  184. i, d = s, None
  185. result = decode(i)
  186. if d:
  187. for j, digit in enumerate(d):
  188. result += decode(digit) / 30.**(j+1)
  189. return result * (-1 if neg else 1)
  190.  
  191. if __name__ == '__main__':
  192. import sys
  193. fn = sys.argv[1]
  194. f = SPSSFile(fn)
  195. print len(f.variables), len(f.data)
The following code, reads .por files (SPSS)

python: show file size in Mb

The following code displays a string of the filesize of a file in Megabytes.
import os
def file_size_mb(filePath):
return float(os.path.getsize(filePath)) / (1024 * 1024)

print str(file_size_mb("file.txt")) + " MB"
The result would be:1.34 MB

python: word frequency

The following code, determines

  • the number of words in a text file
  • the number of unique words
  • and provides a list with unique words, shorted by frequency
  1. import re
  2. filename = 'phd.txt'
  3.  
  4. # create list of lower case words, s+ --> match any whitespace(s)
  5. word_list = re.split('s+', file(filename).read().lower())
  6. print 'Words in text:', len(word_list)
  7.  
  8. # create dictionary of word:frequency pairs
  9. freq_dic = {}
  10. # punctuation marks to be removed
  11. punctuation = re.compile(r'[.?!,":;]')
  12. for word in word_list:
  13. # remove punctuation marks
  14. word = punctuation.sub("", word)
  15. try:
  16. freq_dic[word] += 1
  17. except:
  18. freq_dic[word] = 1
  19.  
  20. print 'Unique words:', len(freq_dic)
  21.  
  22. # create list of (key, val) tuple pairs
  23. freq_list = [(val, key) for key, val in freq_dic.items()]
  24. # sort by key or word
  25. freq_list.sort(reverse=True)
  26. # display result
  27. for word, freq in freq_list:
  28. print word, freq
  29.  
  30. And the results would be:
  31.  
  32. Words in text: 81860
  33. Unique words: 8454
  34. 5195 the
  35. 4140 of
  36. 2350 and
  37. 1747 in
  38. 1670 to
  39. 1393 a
  40. 1136 for
  41. 835 this
  42. 756 is

Multi-Thread SQLite in python

  1. import sqlite3</code>
  2.  
  3. class datastore:
  4. def __init__(self,inFile):
  5. self.data_file = inFile
  6.  
  7. def connect(self):
  8. self.conn = sqlite3.connect(self.data_file)
  9. return self.conn.cursor()
  10.  
  11. def disconnect(self):
  12. self.cursor.close()
  13.  
  14. def free(self, cursor):
  15. cursor.close()
  16.  
  17. def write(self, query, values = ''):
  18. cursor = self.connect()
  19. if values != '':
  20. cursor.execute(query, values)
  21. else:
  22. cursor.execute(query)
  23. self.conn.commit()
  24. return cursor
  25.  
  26. def read(self, query, values = ''):
  27. cursor = self.connect()
  28. if values != '':
  29. cursor.execute(query, values)
  30. else:
  31. cursor.execute(query)
  32. return cursor
  33.  
  34. ####################################
  35. ########Then on each Thread call it:
  36. from datastore import *
  37.  
  38. manager=datastore("test.sqlite")
  39. manager.connect()
  40. sql="SELECT * FROM '%s'" % (table)
  41. cursor=manager.read(sql)
  42. for i in cursor:
  43. print i
Using multiple threads to read/write data from SQLite in python, could sometimes be a painful process. This is because SQLite drops errors whenever a Thread tries to access a “connection” created by other Thread. In order to solve this concurrency problem, I use the following code to enable multiple Threads to access the very same SQLite file for data-processing.

εξαγωγή – εισαγωγή λιστας με εγκατεστημένα πακέτα

packets Image
Μπορούμε να εξάγουμε μια λίστα με όλα τα επιλεγμένα πακέτα του συστήματος μας με την εντολή:
$ dpkg --get-selections | grep -v deinstall > paketa.txt
στην συνέχεια, αν θέλουμε να χρησιμοποιήσουμε την λίστα αυτή σε κάποιο άλλο μηχάνημα για να επιλεγούν προς εγκατάσταση αυτά τα πακέτα, τότε εκτελούμε την εντολή:
$ sudo dpkg --set-selections < paketa.txt
οπου paketa.txt είναι το αρχείο που σώσαμε την λίστα μας.

Αποθετήριο ελληνικών γεωγραφικών δεδομένων


Οι πιο πολλές χώρες στην Ευρωπαϊκή Ένωση αλλά και παγκοσμίως, έχουν ιστοσελίδες οι οποίες λειτουργούν ως αποθετήρια γεωγραφικών δεδομένων. Αυτά χρησιμοποιούνται για την διάθεση και παρουσίαση Γεωγραφικών δεδομένων σε διάφορα formats έτσι ώστε οι ενδιαφερόμενοι να μπορούν εύκολα να ψάξουν για δεδομένα που τους ενδιαφέρουν και να τα κατεβάσουν. Θα ήταν χρήσιμο στην κοινωνία της πληροφορίας να μπορούσε ο πολίτης να έχει πρόσβαση σε γεωγραφικά ψηφιακά δεδομένα ή έτοιμους θεματικούς χάρτες όπως:

  • διευθύνσεις υπηρεσιών
  • χάρτες απογραφών
  • οικολογικές περιοχές
  • τουριστικές περιοχές
  • οδικό δίκτυο
  • ταχυδρομικοί κώδικες
  • λιμάνια και αεροδρόμια
  • διοικητική διαστρωμάτωση χώρας (νομός, περιφέρεια)
  • μεταφορικό δίκτυο (τραίνα, μετρό, ακτοπλοϊκά)

Κάποια από αυτά τα δεδομένα πωλούνται ήδη στο εμπόριο και ίσως η ελεύθερη διάθεση τους να εμπεριέχει κίνδυνο για κάποιες εταιρίες καθώς δεν θα έχουν πια αξία τα προϊόντα που πουλάνε. Ωστόσο είναι αναμφισβήτητα δημόσια δεδομένα και μπορούν να χρησιμοποιηθούν για να κάνουν την καθημερινή μας ζωή πιο εύκολη μιας και βοηθάν στο να παραχθούν χρήσιμες εφαρμογές πληροφόρησης. Μήπως όμως ζητάω πολλά? Μόλις γύρισα στην ελληνική πραγματικότητα ύστερα από μια απουσία 5 ετών και δυσκολεύομαι να αντιληφθώ πως δεν υπάρχουν βήματα προς την ελεύθερη διάθεση της πληροφορίας του ελληνικού γεωγραφικού χώρου.

difference between dates with php

Αν θέλουμε να βρούμε την διαφορά μεταξύ δυο ημερομηνιών τότε δεν έχουμε παρά να ετοιμάσουμε:
function daysBetweenDates($dateStart,$dateEnd) {
// dateStart kai dateEnd se morfi 'YYYY-MM-DD'
$dateStartArray = explode("-",$dateStart);//kovoume se komatia tin arxiki date
$dateEndArray = explode("-",$dateEnd);//kovoume se komatia tin teliki date

//pairnoume ta epimerous komatia
$startYear = $dateStartArray[0];
$startMonth = $dateStartArray[1];
$startDay = $dateStartArray[2];

$endYear = $dateEndArray[0];
$endMonth = $dateEndArray[1];
$endDay = $dateEndArray[2];

//Metatrepoume se unix timestamp
$init_date = mktime(12,0,0,$startMonth,$startDay,$startYear);
$dest_date = mktime(12,0,0,$endMonth,$endDay,$endYear);

//Vriskoume tin diafora tous
$offset = $dest_date-$init_date;

//kai metrame posses meres exoun mesa tous
$days = floor($offset/60/60/24);
return $days;
}

και ύστερα, καλούμε είτε από την ίδια σελίδα, είτε από άλλη την μέθοδο μας:

echo daysBetweenDates("2009-05-10","2010-05-19");

Csv to XML with php

/**
* Metatrepoume ena CSV arxeio se XML
* kai to deixnoume stin selida mas.
*
* @param string $file
* @param string $container
* @param string $rows
* @return string
*/
function csv2xml($file, $container = 'data', $rows = 'row'){
$r = "<{$container}>n";
$row = 0;
$cols = 0;
$titles = array();

$handle = @fopen($file, 'r');//anoigoume to arxeio
if (!$handle) return $handle;//an anoixe to arxeio

while (($data = fgetcsv($handle, 1000, ',')) !== FALSE){
if ($row > 0) $r .= "t<{$rows}>n";
if (!$cols) $cols = count($data);
for ($i = 0; $i < $cols; $i++) {
if ($row == 0){
$titles[$i] = $data[$i];
continue;
}
$r .= "tt<{$titles[$i]}>";
$r .= $data[$i];
$r .= "n";
}
if ($row > 0) $r .= "tn";
$row++;
}
fclose($handle);
$r .= "";
return $r;
}
?>

και ύστερα, καλούμε είτε από την ίδια σελίδα, είτε από άλλη την μέθοδο μας:

$xml = csv2xml('data.csv');
echo $xml;
?>

Kernel Density Estimation στο R

Αποτέσμα
Η μέθοδος εκτίμησης πυρήνα είναι ένας τρόπος να υπολογίσουμε την πιθανότητα της πυκνότητας των παρατηρήσεων μας. Γραφικά μπορούμε δηλαδή να προεκτείνουμε τις παρατηρήσεις των δεδομένων μας και έτσι να γενικεύσουμε (οπτικά) για όλα τον πληθυσμό των παρατηρήσεων μας. Για να δούμε ένα παράδειγμα, κατεβάστε τα δεδομένα από εδώ και τρέξτε σε R:

area male female
area01 5 8
area02 12 4
area03 10 13
area04 9 11
area05 17 18
area06 3 16
area07 11 12
area08 18 15

#Διαβάζουμε τα δεδομένα μας απο το αρχειο .csv
jim <- read.csv(file="data.csv",head=TRUE,sep=",")
# Προετοιμάζουμε την png εικόνα μας
png(file="Grafima.png")
# Επιλέγουμε μόνο τις περιοχές οπυ έχουμε τιμές ("Omit None Available")
f=na.omit(jim$female)
m=na.omit(jim$male)
# Υπολογίζουμε τα density estimations
denf=density(f)
denm=density(m)
# Φτιάχνουμε μια συλλογή με τα χρώματα μας
xromata <- c("blue","red")
# Σχεδιάζουμε την Kernel Density των τιμών μας (males, females)
plot(den1,col=xromata[1],
xlab="number of individuals",
main="Kernel Density of Males/Females")
lines(den2,col=xromata[2])
# Βάζουμε και ένα υπόμνημα πάνω αριστερά, με ονόματα.
#Χρώματα παίρνει από την συλλογή που ετοιμάσαμε παραπάνω.
# και το είδος των γραμμών ειναι 1 και για τις δυο κατηγορίες μας.
legend("topleft",c("Male","Female"),col=xromata,,lty=1:1)
# Σχεδιάζουμε και τις τιμές μας στον οριζόντιο άξονα.
rug(c(m,f))
# Εξάγουμε την εικόνα μας που ειχαμε προετοιμάσει στην αρχή.
dev.off()

Διάγραμμα Radar με R

Μπορεί να χρησιμοποιηθεί σε σύγκριση μεταβλητών μεταξύ περιοχών. Κατεβάστε τα δεδομένα:data.csv
require(plotrix)

#eisagogi dedomenon apo to csv
jim <- read.csv(file="data.csv",head=TRUE,sep=",")
#megethos gramatoseiras
#par(ps=1)
#Sxediasi tou jim$male
radial.plot(jim$male,labels=jim$area,
rp.type="p",
main="Diagrama Radar",
radial.lim=c(0,20),
line.col="blue")

R στο Notepad++

Αν τρέχετε R  για τις στατιστικές σας αναλύσεις, τότε μπορείτε να κάνετε το Notepad++ έναν πολύ καλό R Editor για να γράφετε κώδικα. Το NppToR είναι ένα extension που παρέχει δυνατότητες ενσωμάτωσης R μέσα στο Noptepad++. Πιο αναλυτικά, προσφέρει:

  • syntax highlighting
  • code folding
  • auto-completion
  • Rgui style code passing between Notepad++ and the Rgui

σελίδα του NppToR και σελίδα του Notepad++