#!/usr/bin/env python # coding: utf-8 # Astronomical data analysis using Python # ======= # # Lecture 8 # ----------------- # # # Python modules for numerical computing and visualisation # === # # * numpy + scipy # * matplotlib # * gnuplot.py, also sm and PGPLOT have interfaces # * Mathlink - interface to Mathematica # * sympy - Python module for symbolic computation # * MaYaVI - 3D visualisation using VTK # * pymat - Python Matlab interface # * pytave - Python GNU Octave interface # * Rpy - Python R interface # * SageMath: alternative to Magma, Maple, Mathematica, Matlab # SciPy - useful stuff that would bloat numpy http://scipy.org # === # # * constants: physical constants and conversion factors # * cluster: hierarchical clustering, vector quantization, K-means # * fftpack: Discrete Fourier Transform algorithms # * integrate: numerical integration and ODE solvers # * **interpolate**: interpolation and smoothing splines # * io: data input and output # * lib: Python wrappers to external libraries # * linalg: linear algebra routines # * **ndimage**: N dimensional image processing # * odr: Orthogonal distance regression # * **optimize**: optimization algorithms including linear programming # * signal: signal processing tools # # SciPy # # * sparse: sparse matrix and related algorithms # * spatial: KD-trees, nearest neighbors, distance functions # * special: special functions # * **stats**: statistical distributions and functions # # Via RPy, SciPy can interface to the statistical package R. # Curve fitting - scipy.optimize.curve_fit # === # # The algorithm uses the Levenberg-Marquardt algorithm through 'leastsq'. Additional keyword arguments are passed directly to that algorithm. Quick and easy way to fit an arbitary function to some x,y data. # # If you quickly want to fit a function to some datapoints, use this function. # # # Minimization - scipy.optimize.minimize # === # # Many different solvers available - Nelder-Mead, Powell, simulated annealing etc. # Scipy and Numpy documentation # === # # User Guides, Reference Guides and Developer guides are available at: http://docs.scipy.org # Also check the SciPy Cookbook # # https://scipy-cookbook.readthedocs.io/ # # This site hosts worked examples of common tasks. Some are # introductory in nature, while others are quite advanced. # # Some advanced books on Python # # * **Numerical Python** by Robert Johansson # * **Programming for Computations - Python** by Linge and Langtangen # * **Fluent Python** by Luciano Ramalho # * **Numerical Python in Astronomy and Astrophyics** by Schmidt and Volschow # * **Python for data analysis** by William McKinney # # As always, remember to get the most recent edition of these books. # A Few Years Ago ... a messy situation existed # ==================== # # Several independent developers were developing specific tools for Python... # # * PyFITS - enable use of Python to handle FITS files. # * PyWCS - enable World Coordinate System transformations # * atpy / asciitable - handle tables of all kinds # * Some cosmological calculators. # * Some coordinate transformation tools. # * and more... # # The problem: Different styles, repeated efforts, no coordination. # # The solution: **Astropy** - unite all efforts under one banner! # # Astropy www.astropy.org # # # https://www.astropy.org/astropy-tutorials/ - excellent resources to learn astropy. # # **Version 5 of astropy was released last week!** # # # Astropy core, coordinated and affiliated packages # # * **Core package** # * **Coordinated packages** -- e.g. astropy core, astroquery, photutils, specutils, ccdproc Total: 8 packages. # * **Affiliated packages** - aplpy, synphot, astroML, galpy etc. Depending on your interests, you will need to use one or more of these. Total: 44 packages # # The astronomy community across the world has realised the importance of this effort, and many developers are now funded to add functionality to the astropy ecosystem in many countries. # # What `astropy` contains # # # ## Data structures and transformations # # * Constants (`astropy.constants`) # * Units and Quantities (`astropy.units`) # * N-Dimensional Datasets (`astropy.nddata`) # * Data Tables (`astropy.table`) # * Time and Dates (`astropy.time`) # * Time Series (`astropy.timeseries`) # * Astronomical Coordinate Systems (`astropy.coordinates`) # * World Coordinate System (`astropy.wcs`) # * Models and Fitting (`astropy.modeling`) # * Uncertainties and Distributions (`astropy.uncertainty`) # # What `astropy` contains # # ## Files, I/O, and Communication # # * Unified File Read/Write Interface # * FITS File Handling (`astropy.io.fits`) # * ASCII Tables (`astropy.io.ascii` `astropy.table`) # * VOTable XML Handling (`astropy.io.votable`) # * Miscellaneous: HDF5, YAML, ASDF, Parquet, pickle (`astropy.io.misc`) # * SAMP (Simple Application Messaging Protocol) (`astropy.samp`) # # What `astropy` contains # # ## Computations and utilities # # * Cosmological Calculations (`astropy.cosmology`) # * Convolution and Filtering (`astropy.convolution`) # * Data Visualization (`astropy.visualization`) # * Astrostatistics Tools (`astropy.stats`) # # # # What will we cover in astropy? # =================== # # * Table management features. # * Handling FITS files, including datacubes. # * WCS operations. # * Cosmological Calculations. # Table Management in Python # ========= # # # is done via the "table" sub-module inside Astropy. # astropy.io.ascii vs. astropy.table # ----- # # * astropy.io.ascii is meant purely for reading and writing tables. # * Is a collection of "extensible" classes which can be extended to support newer formats. # # astropy.table # # * builds upon io.ascii using its functionality for reading / writing tables # * and adding its own powerful table operations. # # You won't need to read much about io.ascii unless your tables have some special outstanding features. # In Brief - The "Class" Concept # ------- # # We have discussed the concept of an "object" earlier. # # * Objects have well defined behavior. # * They have methods which help you perform supported operations on them. # * Where are all these rules defined? # # A "class" is crudely put, a definition which allows one to create objects. # # To create table objects, we will need a Table class. # # Let's Start # ----- # In[2]: # First we need the Table class to create table objects. # The warning that will be flashed has so far not affected # any functional features of Table class from astropy.table import Table # In[3]: # Next we need to create the Table object using a file. demo_table = Table.read("demo.txt", format = "ascii") # What if the table does not load? # ------- # # If you get errors when using read() method, it means that your file is formatted in a way that the standard parser is unable to understand the structure of your file. # # What to do? Understand the io.ascii.read() method in detail and supply the various options to Table.read(). # # eg. header_start = ";" or delimiter="|" , etc. # Displaying Tables. # ---- # In[4]: print (demo_table) # In[5]: demo_table.pprint() # Does exactly the same thing. # but you can supply options such as # max_lines, max_width, show_unit, show_name # In[6]: # In this example, we are suppressing column names from appearing. demo_table.pprint(show_name=False) # More Ways to Print Tables. # ---- # # Using an interactive table scrolling tool. # # demo_table.more() # # Or display it as a formatted table in a browser. # # demo_table.show_in_browser() # Quickly Check Basic Properties of Loaded Table # ---- # In[7]: print (len(demo_table)) # Number of rows. # In[8]: print (demo_table.colnames) # The names of the columns. # You can also print any meta information, if available. # # demo_table.meta # Accessing Columns of the Table # ----- # In[9]: print (demo_table["name"]) # one column # In[10]: print (demo_table["name", "mag_b"]) # more than one column # Accessing Rows in a Table # ---- # In[11]: print (demo_table[0]) # In[12]: lines = demo_table.pformat() # a list of strings, each string a row, includes header. print (lines[2]) # Individual Element Access # ----- # In[13]: demo_table["name"][0] # In[14]: demo_table[0]["name"] # also works the same as above. # Sub-sectioning Tables # --- # In[15]: subsection_col = demo_table["name","mag_b"] # by column. # In[16]: subsection_row = demo_table[2:5] # by rows. # In[17]: subsection_row2 = demo_table[ [1,5,3] ] # In[18]: subsection_both = demo_table["name", "mag_b"] [1:5] # Changing elements inside a Table # ---- # # * You know how to access columns, rows and individual elements. # * Using = sign, you can assign the selected col, row or element another value. # # So, # # demo_table["name"] = ... list of 10 names # demo_table["name"] = "SingleName" # # will both work. # In[19]: print (demo_table) # In[20]: demo_table["name"] = "X" print (demo_table) # Adding New Columns # ---- # In[21]: # Method 1 demo_table["NewColumn"] = range(len(demo_table)) print (demo_table) # In[22]: # Method 2, using Column Object from astropy.table import Column newcol = Column( data = range(len(demo_table)), name = "2ndNewColN") demo_table.add_column(newcol, index = 0) print (demo_table) # Removing Columns # --- # In[23]: demo_table.remove_columns(["NewColumn","2ndNewColN"]) print (demo_table) # For Rows # ---- # # Similar functions exist. Please read documentation for details. Or explore using iPython. # # demo_table.remove_row(5) # demo_table.remove_rows( [5,6]) # demo_table.remove_rows( slice(3,6) ) # Table Sorting # ----- # In[24]: demo_table = Table.read("demo.txt", format="ascii") print (demo_table) # In[25]: demo_table.sort(["name", "mag_b"]) # sort by name, then magb # In[26]: print (demo_table) # In[27]: demo_table.reverse() # Reverse existing table. Descending order! print (demo_table)