the csv
module#
The dataset we will be using consists of campaign finance violations by New York City political candidates, officially titled “Enforcement Actions Board Determinations and Penalties,” which can be found on NYC Open Data.
import csv
The CSV module allows you to import .csv
files into your python notebook. Then, you can use methods like reader()
to load up the data.
# print each row in the dataset
with open ('violations_sample.csv', 'r') as f:
data = csv.reader(f)
for row in data:
print(row)
['\ufeffElection Cycle ', 'Candidate', 'Board Meeting Date', 'Violation', 'Current Violation Name', 'Final Board Determination']
['2019A', 'Espinal, Rafael', '8/31/23', 'Failing to report transactions in daily pre-election disclosure statements', 'Failing to report transactions in daily pre-election disclosure statements', '$250 ']
['2019A', 'Espinal, Rafael', '8/31/23', 'Accepting over-the-limit contributions', 'Accepting over-the-limit contributions', '$5,050 ']
['2019A', 'Espinal, Rafael', '8/31/23', 'Accepting contributions from corporations and a limited liabilty company', 'Accepting contributions from corporations and a limited liabilty company', '$1,000 ']
['2019A', 'Blake, Michael', '8/31/23', 'Failing to document transactions', 'Failing to document transactions', '$100 ']
['2019A', 'Blake, Michael', '8/31/23', 'Failing to report transactions in daily pre-election disclosure statements', 'Failing to report transactions in daily pre-election disclosure statements', '$250 ']
['2019A', 'Blake, Michael', '9/1/23', 'Failing to demonstrate compliance with intermediary reporting and documentation requirements', 'Failing to demonstrate compliance with intermediary reporting and documentation requirements', 'VNP']
['2019A', 'Blake, Michael', '8/31/23', 'Failing to demonstrate that spending was in furtherance of the campaign', 'Failing to demonstrate that spending was in furtherance of the campaign', '$125 ']
['2019A', 'Blake, Michael', '8/31/23', 'Making impermissable post-election expenditures', 'Making impermissable post-election expenditures', '$1,184 ']
['2019', 'Borelli, Joseph', '7/17/23', 'Failing to disclose a merchant account', 'Failing to disclose a merchant account', '$100 ']
['2019', 'Borelli, Joseph', '7/17/23', 'Failing to provide bank and merchant account statements', 'Failing to provide bank and merchant account statements', '$650 ']
['2019', 'Borelli, Joseph', '7/17/23', 'Accepting a contribution from an unregistered political committee', 'Accepting a contribution from an unregistered political committee', '$275 ']
['2019A', 'Sheikh, Helal', '7/17/23', 'Failing to report transactions', 'Failing to report transactions', '$101 ']
['2019A', 'Sheikh, Helal', '7/17/23', 'Failing to respond to Draft Audit Report', 'Failing to respond to Draft Audit Report', '$500 ']
['2019B', 'Rose, Xamayla', '6/2/23', 'Failing to document transactions', 'Failing to document transactions', '$149 ']
['2019B', 'Rose, Xamayla', '6/2/23', 'Accepting over-the-limit contributions', 'Accepting over-the-limit contributions', '$375 ']
['2019B', 'Rose, Xamayla', '6/2/23', 'Accepting contributions from corporations, limited liability companies, or partnerships', 'Accepting contributions from corporations, limited liability companies, or partnerships', '$6,770 ']
['2019B', 'Rose, Xamayla', '6/2/23', 'Failing to demonstrate that spending was in furtherance of the campagin', 'Failing to demonstrate that spending was in furtherance of the campagin', 'VNP']
['2019B', 'Rose, Xamayla', '6/2/23', 'Making impermissable post-election expenditures', 'Making impermissable post-election expenditures', '$1,804 ']
['2019A', 'Walker, Latrice', '6/2/23', 'Failing to disclose a political committee', 'Failing to disclose a political committee', '$100 ']
# check our data type
type(data)
_csv.reader
type(row)
list
# how do we get items from a list?
# print the value for the second column (candidate)
# on each row of the dataset
with open ('violations_sample.csv', 'r') as f:
data = csv.reader(f)
for row in data:
print(row[1])
Candidate
Espinal, Rafael
Espinal, Rafael
Espinal, Rafael
Blake, Michael
Blake, Michael
Blake, Michael
Blake, Michael
Blake, Michael
Borelli, Joseph
Borelli, Joseph
Borelli, Joseph
Sheikh, Helal
Sheikh, Helal
Rose, Xamayla
Rose, Xamayla
Rose, Xamayla
Rose, Xamayla
Rose, Xamayla
Walker, Latrice
Let’s combine loops with logic. Print out all of the rows that contain the word “Eric” in the second column (Candidate
) in the dataset.
with open('violations.csv', 'r') as f:
data = csv.reader(f)
for row in data:
if "Eric" in row[1]:
print(row)
['2021T', 'Adams, Eric', '05/15/2023', 'Failing to respond and late response to requests for information or documentation', 'Failing to respond and late response to requests for information or documentation', '$14,400']
['2021T', 'Adams, Eric', '05/15/2023', 'Failing to properly wind down TIE activities', 'Failing to properly wind down TIE activities', '$200']
['2021T', 'Adams, Eric', '05/15/2023', 'Accepting prohibited donations', 'Accepting prohibited donations', '$5,000']
['2017', 'Ulrich, Eric', '07/15/2021', 'Failing to report transactions', 'Failing to report transactions', '$1,352']
['2017', 'Ulrich, Eric', '07/15/2021', 'Failing to demonstrate compliance with cash receipts reporting and documentation requirements', 'Failing to demonstrate compliance with cash receipts reporting and documentation requirements', '$75']
['2017', 'Ulrich, Eric', '07/15/2021', 'Failing to report transactions in daily pre-election disclosure statements', 'Failing to report transactions in daily pre-election disclosure statements', '$300']
['2017', 'Ulrich, Eric', '07/15/2021', 'Failing to document transactions', 'Failing to document transactions', '$300']
['2017', 'Ulrich, Eric', '07/15/2021', 'Accepting over-the-limit contributions', 'Accepting over-the-limit contributions', '$3,187']
['2017', 'Ulrich, Eric', '07/15/2021', 'Failing to demonstrate compliance with intermediary reporting and documentation requirements', 'Failing to demonstrate compliance with intermediary reporting and documentation requirements', '$100']
['2017', 'Ulrich, Eric', '07/15/2021', 'Failing to demonstrate that spending was in furtherance of the campaign', 'Failing to demonstrate that spending was in furtherance of the campaign', '$331']
['2017', 'Ulrich, Eric', '07/15/2021', 'Making impermissible post-election expenditures', 'Making impermissible post-election expenditures', '$1,261']
['2017', 'Ulrich, Eric', '07/15/2021', 'Exceeding the expenditure limit', 'Exceeding the expenditure limit', '$13,750']
['2013', 'Adams, Eric', '06/09/2016', 'Failing to provide merchant account statements', 'Failing to provide bank, credit card, and merchant account statements', '$500']
['2013', 'Adams, Eric', '06/09/2016', 'Failing to file daily pre-election disclosure statements', 'Failing to report/late reporting of transactions in daily pre-election disclosure statements', '$250']
['2013', 'Adams, Eric', '06/09/2016', 'Accepting an over-the-limit contribution', 'Accepting over-the-limit contributions', '$125']
['2013', 'Adams, Eric', '06/09/2016', 'Accepting a corporate contribution', 'Accepting contributions from corporations, limited liability companies, or partnerships', '$70']
['2013', 'Adams, Eric', '06/09/2016', 'Accepting two contributions from unregistered political committees', 'Accepting contributions from unregistered political committees', '$225']
['2013', 'Adams, Eric', '06/09/2016', 'Failing to demonstrate compliance with intermediary reporting and documentation requirements', 'Failing to demonstrate compliance with intermediary reporting and documentation requirements', 'VNP']
['2013', 'Adams, Eric', '06/09/2016', 'Failing to document transactions', 'Failing to document transactions', '$700']
['2013', 'Adams, Eric', '06/09/2016', 'Failing to demonstrate spending was in furtherance of the campaign', 'Failing to demonstrate that spending was in furtherance of the campaign', 'VNP']
['2009', 'Gioia, Eric', '07/25/2013', 'Accepting over-the-limit contributions', 'Accepting over-the-limit contributions', '$12,875']
['2009', 'Gioia, Eric', '07/25/2013', 'Accepting corporate contributions', 'Accepting contributions from corporations, limited liability companies, or partnerships', '$12,125']
['2009', 'Gioia, Eric', '07/25/2013', 'Accepting contributions from unregistered political committees', 'Accepting contributions from unregistered political committees', '$750']
['2009', 'Gioia, Eric', '07/25/2013', 'Accepting over-the-limit Doing Business contributions', 'Accepting over-the-limit Doing Business contributions', '$10,850']
['2009', 'Gioia, Eric', '07/25/2013', 'Filing a disclosure statement eight days late', 'Failing to file/filing late disclosure statements', 'VNP']
['2009', 'Gioia, Eric', '07/25/2013', 'Failing to file required daily pre-election disclosure statements', 'Failing to report/late reporting of transactions in daily pre-election disclosure statements', '200']
['2009', 'Gioia, Eric', '07/25/2013', 'Failing to provide bank statements', 'Failing to provide bank, credit card, and merchant account statements', '1500']
['2009', 'Gioia, Eric', '07/25/2013', 'Failing to report transactions', 'Failing to report transactions', '$1,974']
['2009', 'Gioia, Eric', '07/25/2013', 'Failing to accurately report credit card contributions, resulting in an 11.78% variance', 'Failing to demonstrate compliance with reporting requirements for receipts or disbursements', '$1,500']
['2009', 'Gioia, Eric', '07/25/2013', 'Failing to provide signed intermediary affirmation statements and failing to respond to questions regarding intermediaries', 'Failing to demonstrate compliance with intermediary reporting and documentation requirements', '$2,600']
['2009', 'Gioia, Eric', '07/25/2013', 'Exceeding the expenditure limit', 'Exceeding the expenditure limit', '$29,732']
['2009', 'Gioia, Eric', '07/25/2013', 'Making improper post-election expenditures', 'Making impermissible post-election expenditures', '$3,208']
['2009', 'Gioia, Eric', '07/25/2013', 'Failing to demonstrate that spending was in furtherance of the campaign', 'Failing to demonstrate that spending was in furtherance of the campaign', '$1,188']
['2009', 'Gioia, Eric', '07/25/2013', 'Failing to document transactions', 'Failing to document transactions', '$1,400']
['2009', 'Gioia, Eric', '07/25/2013', 'Failing to adequately document transactions', 'Failing to document transactions', '$2,500']
['2009', 'Ulrich, Eric A.', '11/18/2010', 'Repayment: unspent campaign funds (surplus)', 'Repayment: unspent campaign funds (surplus)', '$1,320']
['2009A', 'Ulrich, Eric A.', '08/12/2010', 'Repayment: unspent campaign funds (surplus)', 'Repayment: unspent campaign funds (surplus)', '$4,189']
['2005', 'Blackwell, Eric', '03/13/2008', 'Failing to report in-kind contributions', 'Failing to demonstrate compliance with reporting requirements for receipts or disbursements', '$150']
['2005', 'Blackwell, Eric', '03/13/2008', 'Failing to report in-kind contributions', 'Failing to demonstrate compliance with reporting requirements for receipts or disbursements', '$50']
['2005', 'Blackwell, Eric', '03/13/2008', 'Failing to report in-kind contributions', 'Failing to demonstrate compliance with reporting requirements for receipts or disbursements', '$50']
['2005', 'Blackwell, Eric', '03/13/2008', '225.72% monetary disbursements variance', 'Failing to demonstrate compliance with reporting requirements for receipts or disbursements', '$500']
['2005', 'Blackwell, Eric', '03/13/2008', '19.69% monetary receipts variance', 'Failing to demonstrate compliance with reporting requirements for receipts or disbursements', '$500']
['2005', 'Blackwell, Eric', '03/13/2008', '20% cash receipts variance', 'Failing to demonstrate compliance with reporting requirements for receipts or disbursements', 'VNP']
['2005', 'Blackwell, Eric', '03/13/2008', 'Fraud and misrepresentation', 'Material misrepresentation; fraud; submission of false or ficticious information', 'No violation']
['2005', 'Blackwell, Eric', '03/13/2008', 'Breach of certification', 'Breach of certification', 'No violation']
group challenge:#
Write a loop that prints out the Candidate’s name and Violation if that violation contains the word “contribution” in it. Use f-strings so that you can format the answer the following:
Name: [candidate name], Violation: [candidate violation]
Here’s the answer, but don’t look until you’ve spent at least 5 mintues working on it!
with open ('violations.csv', 'r') as f:
dict_reader = csv.reader(f)
for row in dict_reader:
violation = row[3]
if "contribution" in violation:
candidate = row[1]
print(f'Name: {candidate}, Violation: {violation}')
the end#
Congratulations on making it through the workshop! You are officially a beginner now.
In the next workshop, we build on these skills in the practice of web scraping and APIs. We will create a dataset that we will clean, process, and analyze in future sessions.