I picked up the book Python for Data Analysis as I've been seeing it mentioned in quite a few places. And so far, it's great. A very good high level overview of using Pandas. No, not the cute kind of pandas. I'm talking about the Python library for data analysis. Derp.

Anyhow, I decided to dive in and see what I could find out about my neighbors. Chapter 9 of the book goes into analyzing the 2012 Federal Election Commission Database so I loaded it up:

>>> import pandas as pd
>>> fec = pd.read_csv('P00000001-ALL.csv')

Looking into the data, there is some garbage rows. I grabbed all the Culver City zip codes (well, the zip codes I care about) at least:

>>> zips = fec.contbr_zip.unique()
>>> mask = np.array([str(x).startswith('90232') for x in zips])
>>> fec[fec.contbr_zip.isin(zips[mask])].contbr_city.value_counts()
CULVER CITY     241
CUILVER CITY      2
SANTA MONICA      1

I don't know if these come from bad data from the contributor or from the FEC so I'm just going to include everything based on zip code.

>>> culver = fec[fec.contbr_zip.isin(zips[mask])]
>>> culver.contb_receipt_amt.sum()
58341.0

Fifty-eight grand! Nice going Culver City!

Now let's see who got the money:

>>> culver.pivot_table('contb_receipt_amt', rows='cand_nm', aggfunc=sum)
cand_nm
Huntsman, Jon                      4500
Obama, Barack                     50381
Paul, Ron                           500
Roemer, Charles E. 'Buddy' III      110
Romney, Mitt                       2850

That's kind of interesting...Huntsman got more money from the 90232 than Romney.

Now, let's check out the occupations that contributed the most:

>>> culver.pivot_table('contb_receipt_amt', rows='contbr_occupation',
... aggfunc=sum).order(ascending=False).head(10)
contbr_occupation
RETIRED                               7272.0
ACCOUNT MANAGER                       5000.0
VICE PRESIDENT, INTERNET MARKETING    4000.0
PROFESSOR                             2800.5
PRESIDENT & C.E.O.                    2500.0
GALLERY OWNER                         2500.0
BOOKKEEPER                            2500.0
HOMEMAKER                             1971.0
INTERIOR DESIGNER                     1500.0
WRITER                                1410.0

Retirees going large. That's kind of interesting. Let's look at that.

>>> culver[culver.contbr_occupation == 'RETIRED'].pivot_table(
... 'contb_receipt_amt', rows='cand_nm', aggfunc=sum)
cand_nm
Obama, Barack                     7162
Roemer, Charles E. 'Buddy' III      10
Romney, Mitt                       100

Maybe I misunderstand our local retirees (at least the ones I've met) but this was surprising to me. I really expected Romney to come out on top.

I think that's enough peeking into my neighbors contributions habits for one night. I have to say Pandas makes this sort of thing really easy. I've only scratched the surface here. There's lots more that one can do (mathematically speaking) with Panads. Python for Data Analysis gives you a really good introduction to Pandas and then the webiste fills in the gaps.

Python for Data Analysis and Panads get two thumbs up from me. Thanks to O'Reilly and Wes McKinney.