({{}})

({{, ({{"Lezione 3"}, {Gestione dati con Mathematica: Import/Export}, {Crescenzio Gallo - Università di Foggia
crescenzio.gallo@unifg.it}})}})

Note:

Il materiale visualizzato durante questo seminario è disponibile per il download all'indirizzo http://www.crescenziogallo.it/unifg/seminario-mathematica-2014/

Il materiale utilizzato è tratto dai webinar pubblicati da Adalta e prodotti dal dott. Roberto Cavaliere (Mathematica Technical Sales Manager, r.cavaliere@adalta.it)

12-26 Giugno 2014

Agenda

Introduzione

Mathematica è un linguaggio di sviluppo

Differenti modi di eseguire Mathematica

Integrazione/interazione con altri ambienti

Possibili link

Import/Export di dati

Conclusioni

Introduzione: Mathematica è un linguaggio di sviluppo

Poichè siamo abituati ad usare Mathematica attraverso il front end capita spesso di pensare di non considerare la vera natura di Mathematica ossia quella di linguaggio di programmazione.
Già nel fare un semplice calcolo e renderlo parametrico e farlo computare al variare del parametro in effetti abbiamo sfruttato la capacità di programmazione del linguaggio Mathematica.

Expand[((((((z+1))^2)+1))^2)]

Manipulate[Expand[((((((z+1))^2)+1))^n)],{n,2,10,1}]

Nonostante Mathematica sia un linguaggio funzionale, di fatto mette a disposizione set di funzioni dedicati ai vari approcci di programmazione:

Functional Programming
Procedural Programming
Rule-Based Programming
Graph Programming
CUDA Programming

Dunque un’altra delle sua caratteristiche è che si presenta come un linguaggio pluriparadigmatico.

Introduzione: differenti modi di eseguire Mathematica

L’architettura interna di Mathematica consiste di due moduli separati:

L’interfaccia utente o front end: il modulo dedicato al dialogo con l’utente (interpretazioni delle linee di input e  rappresentazione degli output).

Il motore di calcolo o kernel, dedicato alle computazioni vere e proprie

I due moduli sono in collegamento attraverso il MathLink, una libreria in grado di far dialogare il kernel con diversi altri sistemi. Questa architettura consente l’impiego di Mathematica in moltissimi contesti differenti e secondo moltissime modalità.
Ad esempio si può usare il semplice kernel se bisogna fare solo calcoli e non si necessità di controllare “visivamente” l’esecuzione dei calcoli stessi.

Integrazione/interazione con altri ambienti: possibili link

L’architettura sopra descritta, ossia la separazione tra il front end ed il kernel ha consentito lo sviluppo di numerose altre interfacce per il kernel di Mathematica. Infatti il kernel si può integrare con linguaggio come il C C++, Fortran, Java, .NET ed altri (Systems Interfaces & Deployment).

Vediamo un’applicazione che utilizza Java per l'interfaccia utente ed il kernel di Mathematica per i calcoli: EquationTrekker

Integrazione/interazione con altri ambienti: Import/Export di dati

Mathematica consente di importare dati in diversi modi.

Formati standard riconosciuti in import (circa 170 formati)

Accesso ai database (MySQL, Oracle, ...)

Dati curati (FinancialData, WeatherData, CountryData, ...)

Integrazione/interazione con altri ambienti: Import/Export di dati

Alcune novità in Mathematica 8:

Geospatial Formats 
     ArcGRID, GPX, GRIB, KML/KMZ, NDK, SurferGrid, TLE

Graph Formats
     DIMACS, DOT, Graphlet, GraphML, GXL, LEDA, Pajek, TGF

Bioscience and chemistry formats 
     Affymetrix, BDF, CIF, EDF, NEXUS

Multimedia and graphics formats
     FLAC, MKV, QuickTime (export), VideoFrames

Miscellaneous formats »
     C, ICS, JSON, NASACDF, VTK, XLSX

$ImportFormats

$ExportFormats

Integrazione/interazione con altri ambienti: Import/Export di dati

Sintassi di base della Import

Import["file", format]:  importa dati dal file specificato restituendono la versione Mathematica

Import["file", {format, elements}]: importa dal file solo gli elementi specificati.

Import["http://url",…]: importa da un qualsiasi URL accessibile (anche se sono richieste credenziali di accesso)

La maggior parte dei casi si può omettere il formato del file e la Import sarà comunque in grado di identificare il formato automaticamente dal file stesso

Import["ExampleData/mri.pxr"]

Import["ExampleData/cities.xls"]

Se un determinato formato di dati è incluso nella lista $ImportFormats significa che Mathematica è in grado di gestire anche tutti i metadati associati a tale formato

Import["ExampleData/cities.xls","Elements"]

Import[ "http://exampledata.wolfram.com/ArcGRID.zip",{"ArcGRID", "Elements"}]

Questo esempio crea una tabella con tutti i metadati contenuti in un file DICOM utilizzato dalle apparecchiature di diagnostica per immagini

Grid[List@@@Import["ExampleData/head.dcm.gz","MetaInformation"],Alignment -> {Left,Baseline},Frame->All,Background->{{White,None},{{LightGray,LightBlue}}}]

Integrazione/interazione con altri ambienti: Import/Export di dati

Import è in grado di importare sia dal file system su cui è installato Mathematica sia da reti intranet/Internet, semplicemenete attraverso l’URL.

Questa è l’immagine dell’eruzione dell’Etna dell’Ottobre 2002 vista dal satellite Aqua

Import["http://earthobservatory.nasa.gov/images/imagerecords/2000/2903/Sicily_AMO_2002301_lrg.jpg",ImageSize->{600,Automatic}]

Import di un formato Graph (Pajek)

Import["http://vlado.fmf.uni-lj.si/pub/networks/data/bio/foodweb/Everglades.paj","Pajek"]

Import di un file JPG

Import["http://photojournal.jpl.nasa.gov/jpeg/PIA12708.jpg"]

Una molecola in formato PDB

Import["http://www.rcsb.org/pdb/download/downloadFile.do?fileFormat=pdb&compression=NO&structureId=1tf6","PDB",ImageSize-> Medium]

Integrazione/interazione con altri ambienti: Import/Export di dati

Vediamo qualche esempio di import di dati oltre che di immagini.

Importare direttamente da pagine HTML

Importiamo la pagina BLS web page

Import["http://www.bls.gov/web/laus/laumstrk.htm"]

Ovviamente risulta poco leggibile, ma se ci interessano i dati contenuti nella pagina possiamo scrivere qualche riga di codice che ci consente di estrarre i soli dati numerici che ci interessano e convertirli facilmente in una tabella Mathematica:

data=Import["http://www.bls.gov/web/laus/laumstrk.htm",{"Data"}]; (* importa la pagina html *)
data2=Cases[data,{_Integer,_String,_Real},Infinity];  (* Estraiamo i soli dati{rank, STATE, rate} *)
results=data2[[All,{2,3}]]; (* eliminiamo il rank *)
SortBy[results,First]; (* ordiniamo alfabeticamente *)
Grid[results,Alignment->Left,Frame->All,Background->LightYellow,BaseStyle->{"Menu"}] (* creiamo una tabella *)

Volendo possiamo anche aggiungere l’intestazione di colonna interattiva:

Grid[{{Grid[{{Button[Style["State",{Blue,"Link"}],results=SortBy[results,First],Appearance->None],Button[Style["Rate",{Blue,"Link"}],results=SortBy[results,Last],Appearance->None]}},Alignment->{{Left,Right}},ItemSize->11]},{Dynamic[Grid[results,Alignment->{{Left,Right}},Frame->All,ItemSize->14]]}},Frame->True,Background->LightYellow, BaseStyle->{"Panel"}]

Import dati finanziari.

Questo è un esempio di Import di dati dal sito http://finance.yahoo.com

facebook=Import["http://ichart.finance.yahoo.com/table.csv?s=FB&d=2&e=2&f=2014&g=d&a=4&b=18&c=2012&ignore=.csv"];

DateListPlot[Part[Rest[facebook],1;;100,{1,5}],Joined->True,ImageSize->Large]

$ExportFormats

file=Export["//tmp//facebook.xls",facebook]

SystemOpen[file]

Integrazione/interazione con altri ambienti: Import/Export di dati

Un ultimo esempio di import documenti: il riconoscimento del testo.

SetDirectory[NotebookDirectory[]]

img=Import["zerofill.jpg"]

TextRecognize[img]

Integrazione/interazione con altri ambienti: Import/Export di dati

Come esportare verso altri formati.

Ci sono due modi di esportare dati, immagini o documenti da Mathematica:

Save As (menu File o menu contestuale)

Export

Save As è più rapido ma non consente di personalizzare il risultato ai livelli consentiti da Export tramite le opzioni. Comunque anche SaveAs fornisce una serie di opzioni di base per il salvataggio dei file.

Integrazione/interazione con altri ambienti: Import/Export di dati

Export

gr=Plot3D[Cos[x y],{x,-3,3},{y,-3,3},ColorFunction->"BlueGreenYellow", Mesh->None,Boxed->False,Axes->False]

Export["Plot3D.jpg",gr,"ColorSpace"->"GrayLevel"]

Esportazione di una animazione

an=Manipulate[
Plot[{BesselJ[a,x],BesselJ[2a,x],BesselJ[3a,x],BesselJ[4a,x]},{x,0,10},Filling->Automatic,PlotRange->1,ImageSize->Large],{a,0,2}]

Export["BesselJCurves.avi",an];

SystemOpen["BesselJCurves.avi"]

Esportare dati articolati per mezzo di regole

gr=Import["http://mat.gsia.cmu.edu/COLOR/instances/homer.col","DIMACS"]

Esportiamo un file TAR compresso composto da due file

Export["test.tar",{"photo.png"->gr,"description.txt"->"Relationships of characters in Homer's Iliad."},{"Tar","Rules"}]

Integrazione/interazione con altri ambienti: Import/Export di dati

Una volta importati (o generati) i dati in Mathematica bisogna ancora prestare attenzione al modo in cui si intendono gestire ed eventualmente ulteriormente salvare. Facciamo un esempio di ottimizzazione dei tempi di lettura/scrittura di grandi data set.

dati=RandomInteger[{-10,10},{10^5}];

Uno dei formati molto diffusi è il “Comma Separated Value” (CSV). Questo formato è comodo perchè i file sono ASCII e dunque leggibili con qualsiasi editor come Notepad o simili. Lo svantaggio è che sono “pesanti” e rallentano i processi di import export.

AbsoluteTiming[Export["dati.csv",dati]]

FileInformation["dati.csv","ByteCount"]

AbsoluteTiming[t=Flatten[Import["dati.csv"]];]

Proviamo con il formato Binary

AbsoluteTiming[
BinaryWrite["dati",dati,"Integer16"];
Close["dati"]]

FileInformation["dati","ByteCount"]

AbsoluteTiming[
stream=OpenRead["dati",BinaryFormat->True];
tt=BinaryReadList["dati","Integer16"];
Close[stream]]

t===tt===dati

Un ulteriore vantaggio si ha se i dati in questione vengono frequentemente aggiornati con l’aggiunta di qualche riga.

new=RandomInteger[{-10,10},{10}];

AbsoluteTiming[Export["dati.csv",Join[Flatten[Import["dati.csv"]],new]];]

AbsoluteTiming[
stream=OpenAppend["dati",BinaryFormat->True];
BinaryWrite[stream,new,"Integer16"];
Close[stream]]

t=Flatten[Import["dati.csv"]];

AbsoluteTiming[
stream=OpenRead["dati",BinaryFormat->True];
tt=BinaryReadList["dati","Integer16"];
Close[stream]]

t===tt===Join[dati,new]

Integrazione/interazione con altri ambienti: Import/Export di dati

Un altro importantissimo aspetto legato alla gestione dei dati è quello dei database. Anche in questo caso Mathematica comprende la tecnologia necessaria per l’integrazione immediata ed altamente flessibile: Database Connectivity

(* Esempi *)

Import["ExampleData/buildings.mdb"]

Needs["DatabaseLink`"];
conn = OpenSQLConnection[ "publisher"];

<<DatabaseLink`DatabaseExamples`;
DatabaseExamplesBuild[]

Seleziono tutti i dati da una tabella:

SQLSelect[conn, "ROYSCHED"]

Seleziono solo determinate colonne:

Grid[SQLSelect[conn, "ROYSCHED", {"TITLE_ID", "ROYALTY"}]]

Unisco i dati da più tabelle:

SQLSelect[conn, {"TITLES","ROYSCHED"}, {{"TITLES", "TITLE"}, {"TITLES", "TITLE_ID"}, {"ROYSCHED", "ROYALTY"}}, SQLColumn[{"TITLES", "TITLE_ID"}] == SQLColumn[{"ROYSCHED", "TITLE_ID"}]]//Short[#,25]&

Seleziono i dati che soddisfano una condizione:

SQLSelect[conn, "ROYSCHED", {"TITLE_ID", "ROYALTY"}, .10< SQLColumn["ROYALTY"] < .15]

Seleziono i dati che soddisfano un pattern:

SQLSelect[conn, "ROYSCHED", {"TITLE_ID", "ROYALTY"},SQLStringMatchQ[SQLColumn["TITLE_ID"], "C%"]]

Seleziono i dati che soddisfano una lista:

SQLSelect[conn, "ROYSCHED", {"TITLE_ID", "ROYALTY"},SQLMemberQ[{.14, .16}, SQLColumn["ROYALTY"]]]

Chiudo la connessione al database di esempio:

CloseSQLConnection[conn]

Integrazione/interazione con altri ambienti: Import/Export di dati

GenomeData

Il cromosoma 22

GenomeData["Chromosome22Genes"]

Un particolare gene di questo cromosoma

GenomeData["C22CTA250D109"]

GenomeData["C22CTA250D109","SequenceLength"]

Trovare i 15 geni più corti nel genoma umano

Take[Sort[{GenomeData[#,"SequenceLength"],#}&/@GenomeData[]],15]

GenomeLookup permette di trovare la posizione di sequenze di DNA nel genoma umano:

GenomeLookup["CTCTCTAACTAAACT"]//TableForm

GenomeLookup["CTCTCTAACTAAACT","Count"]

AstronomicalData

La densità dei pianeti

Text[Grid[{AstronomicalData[#,"Name"],AstronomicalData[#,"Density"]}&/@AstronomicalData["Planet"],Frame->All,Background->LightYellow]]

Computa e visualizza la distribuzione dei pianeti minori a varie distanze dal sole:

asteroidCount=BinCounts[Sort@Cases[(AstronomicalData[#,"SemimajorAxis"]/149597870691)&/@Join[AstronomicalData["InnerMainBeltAsteroid"],AstronomicalData["MainBeltAsteroid"],AstronomicalData["OuterMainBeltAsteroid"]],x_?NumberQ],{2,3.5,.005}];

ListPlot[asteroidCount,Joined->True,Filling->0,Mesh->All,Ticks->{Table[{Rescale[x,{2,3.5},{0,301}],x},{x,2,3.5,.2}],Automatic}]

CountryData

I 20 paesi più grandi per estensione del territorio

Last/@Take[Reverse[Sort[{CountryData[#,"Area"],#}&/@CountryData[]]],20]

Text[Grid[Prepend[{CountryData[#,"Name"],CountryData[#,"Area"],CountryData[#,"Population"]}&/@Take[%,5],{"","area","population"}],Frame->All,Background->{None,{LightBlue,{LightYellow}}}]]

Tasso di alfabetizzazione in alcuni continenti (Africa, Europa e Asia):

Graphics[{EdgeForm[Gray],Catch[ColorData["Warm"][CountryData[#,"LiteracyFraction"]/._Missing:>Throw[White]]],CountryData[#,"SchematicPolygon"]}&/@CountryData["Africa"]]

Graphics[{EdgeForm[Gray],Catch[ColorData["Warm"][CountryData[#,"LiteracyFraction"]/._Missing:>Throw[White]]],CountryData[#,"SchematicPolygon"]}&/@CountryData["Europe"]]

Graphics[{EdgeForm[Gray],Catch[ColorData["Warm"][CountryData[#,"LiteracyFraction"]/._Missing:>Throw[White]]],CountryData[#,"SchematicPolygon"]}&/@CountryData["Asia"]]

Il grafico dei paesi confinanti in Europa:

GraphPlot[Flatten[Thread[#->CountryData[#,"BorderingCountries"]]&/@CountryData["Europe"]],VertexLabeling->True]

Una mappa con i nomi di tutte le nazioni:

Graphics[{LightGreen,EdgeForm[Gray],Tooltip[CountryData[#,"Polygon"],#]&/@CountryData[]}]

Alcuni dettagli tecnici.

Quando si installa Mathematica i contenuti della sorgenti “data collection” non vengono installati ma quando li si utilizza esplicitamente i dati vengono salvati in memoria locale per le eventuali computazioni successive (non l’intero database ma solo i dati esplicitamente richiesti). Per sapere dove si trovano questi file:

SystemOpen[FileNameJoin[{$UserBaseDirectory,"Paclets"}]]

In alcuni casi potrebbe succedere che i dati in cache sul proprio computer vengono danneggiati. In tali casi si può ricostruire l’archivio già presente nella propria cache:

RebuildPacletData[]

Se si vuole lavorare solo sui dati già in memoria cache si può disattivare l’aggiornamento automatico (ad esempio, se si sono caricati dei dati in memoria e poi si viaggia senza avere più accesso alla rete):

PacletManager`$AllowDataUpdates=False

Conclusioni: gli scenari analizzati

Mathematica come strumento stand-alone con i dati forniti internamente o importati/esportati da codice.

Mathematica integato con altri ambienti e sistemi con i possibili collegamenti creati grazie alla modularità dell’architettura front end / kernel.