Tämä on Janne Aukian blogi.
Fiilistelen arkea, taidetta ja tekniikkaa.

Kuutio

Kultainen 90-luku

21.10.2007 klo 15:29

Laitettiin joskus levyt järjestykseen ja samalla Exceliin. Tein silloin skriptin Pythonilla, joka haki Mechanize-kirjaston avulla (ks. Mechanize Kuutiossa) Gracenoten ja FreeDB:n kannoista levyjen julkaisuvuodet. Nyt kun Exceliin piti taas tehdä päivityksiä, plottasin levyjen julkaisuvuodet R:llä siten, että kuvasta näkee, milloin Annin levyt, mun levyt ja yhteiset levyt on julkaistu.

Molempien aktiivisin musiikkikiinnostus näyttäisi olevan aika samoissa vuosissa 90-luvun lopussa. Mutta sehän johtuu tietysti siitä, että silloin julkaistiin kaikki parhaat levyt!

Koodia levyn tietojen hakemiseen FreeDB:stä:

import mechanize, re
freedburl = "http://www.freedb.org/freedb_search.php"
def getSongYear(artist, discName):
  br = mechanize.Browser()
  br.set_handle_robots(False)
  response = br.open(freedburl)
  br.select_form(None, None, 0);
  br.form.controls[0].value = artist+" "+discName
  response2 = br.submit()
  listContent = response2.read()
  output = re.compile('(<tr><td><b> <a href=\")([^\"]+)(\">)([^<]+)(</a>)').findall(listContent)
  
  if(len(output)==0 or len(output[0])<2):
    return -1
  
  response3 = None
  i = 0
  running = True
  while running:
    item = output[i]
    matches = re.compile(discName).findall(item[3])
    if (not len(matches) == 0):
      #print "Disc name: "+item[3]
      response3 = br.open(item[1])
      running = False
    if i==len(output)-1:
      response3 = br.open(output[0][1])
      running = False
    i = i+1
  
  discContent = response3.read()
  output2 = re.compile('(YEAR: )([^<]+)').findall(discContent)
  
  if (len(output2)==0 or len(output2[0])<2):
    output2 = re.compile('(year: )([^<]+)').findall(discContent)
    
  if (len(output2)==0 or len(output2[0])<2):
    return -3
    
  return output2[0][1]
myfile = open('levyarkisto.csv', 'rU')
print "Start disc output:"
# Print out and number each line
count = 0
while 1:
  lineStr = myfile.readline()
  if not(lineStr): break
  count=count+1
  if count<4:continue
  
  origLine = lineStr.rstrip()
  currLine = origLine.split(';')
  artist = currLine[0]
  discName = currLine[1]
  # korjaa siten, että hakee erikseen artist ja disc name
  # niin tulee luotettavampi levyvastine
  print origLine+";"+str(getSongYear(artist, discName))
myfile.close()
 

Levyn tietojen plottaaminen R:llä:

require("vcd");
d <- read.table("export-21-10-2007.csv", col.names=c("Artist", "Disc", "Owner", "Year"), sep=";", header=FALSE, quote=NULL)
# based on multplot-method from plottrix-library:
colList = rainbow_hcl(3, start=30, end=280, c = 50, l = 80);
x=list(d[d$Owner=="Anni",]$Year, d[d$Owner=="Janne",]$Year, d[d$Owner=="Yhteinen",]$Year);
allhist <- hist(unlist(x), breaks = c(1948,seq(1964,2008,2)), plot = FALSE)
combhist <- t(sapply(x, function(z) hist(z, breaks = allhist$breaks, plot = FALSE)$counts))
bs = allhist$breaks;
bso = c(bs[2:length(bs)],"");
totlab = paste(bs,substr(bso,3,4),sep="-");
totlab = totlab[1:(length(totlab)-1)];
par(mar=c(3,5,3,1),lty=0);
barplot(combhist, main="Levyt vuosien mukaan", beside = TRUE, horiz=TRUE, names = totlab, col= colList, las=1, cex.names=0.8, legend.text=c("Anni","Janne","Yhteinen"));
 

Dippa verkossa

5.10.2007 klo 22:52

Laitoin dipan nettiin, se löytyy täältä.

good buys on software pirodr! 666