Small nitpick: it might be better to build the DataFrame so that the order of the columns matches the order of the components -- that's currently lost in this dict comprehension