File size: 8,208 Bytes
61d29fc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
# FEC Campaign Finance Integration - Implementation Summary

## βœ… What Was Added

### 1. Pipeline Module
**File:** [`pipeline/create_campaigns_gold_tables.py`](../pipeline/create_campaigns_gold_tables.py)

Creates 4 campaign finance gold tables per state:
- `campaigns_candidates.parquet` - Federal candidates (House, Senate, President)
- `campaigns_committees.parquet` - PACs and campaign committees  
- `campaigns_contributions.parquet` - Individual contributions $200+
- `campaigns_nonprofit_donors.parquet` - Nonprofit leadership political giving analysis

**Key Features:**
- State-specific data extraction
- Links to nonprofits via employer matching
- Links to nonprofit officers via name matching
- Configurable contribution limits and cycle years

### 2. Example Demo Script
**File:** [`examples/demo_fec_integration.py`](../examples/demo_fec_integration.py)

Interactive demonstration of FEC API capabilities:
- Search for candidates in a state
- Find contributions from specific employers
- Track nonprofit leadership donations
- Create gold tables for integration

**Usage:**
```bash
# Basic demo
python examples/demo_fec_integration.py --state MA

# Search specific employer
python examples/demo_fec_integration.py --state MA --employer "Community Health"

# Create gold tables
python examples/demo_fec_integration.py --state MA --create-gold-tables
```

### 3. Comprehensive Documentation
**File:** [`website/docs/integrations/fec-campaign-finance.md`](../website/docs/integrations/fec-campaign-finance.md)

Complete integration guide including:
- API access setup (get free key from api.data.gov)
- Gold table schemas
- Use case examples
- Data model integration
- Advanced usage patterns
- Best practices

**Complements existing file:** [`website/docs/integrations/fec-political-contributions.md`](../website/docs/integrations/fec-political-contributions.md)

## πŸ”„ Integration with Existing Data Model

### Data Linkages

The FEC integration connects to existing gold tables:

```
campaigns_contributions.parquet
    β”œβ”€β–Ί contributor_employer  ───────► nonprofits_organizations.organization_name
    └─► contributor_name      ───────► contacts_nonprofit_officers.officer_name

campaigns_nonprofit_donors.parquet (Analysis Table)
    β”œβ”€β–Ί ein                   ───────► nonprofits_organizations.ein
    β”œβ”€β–Ί organization_name     ───────► nonprofits_organizations.organization_name
    └─► contributor_name      ───────► contacts_nonprofit_officers.officer_name

campaigns_candidates.parquet
    └─► state                 ───────► State-partitioned data structure

campaigns_committees.parquet
    └─► state                 ───────► State-partitioned data structure
```

### Use Cases Enabled

1. **Track Political Influence on Grant Awards**
   ```python
   # Load data
   contributions = pd.read_parquet('data/gold/states/MA/campaigns_contributions.parquet')
   grants = pd.read_parquet('data/gold/states/MA/grants_revenue_sources.parquet')
   
   # Analyze correlation between political giving and grant receipt
   ```

2. **Identify Politically Active Nonprofit Leaders**
   ```python
   # Load nonprofit donor analysis
   donors = pd.read_parquet('data/gold/states/MA/campaigns_nonprofit_donors.parquet')
   
   # See which nonprofit officers donate politically
   print(donors.groupby('organization_name')['contribution_amount'].sum())
   ```

3. **Map Donor Networks in Healthcare Policy**
   ```python
   # Find health sector political contributions
   health_contribs = contributions[
       contributions['contributor_employer'].str.contains('Health', case=False, na=False)
   ]
   ```

## πŸ“Š Directory Structure

```
data/gold/states/{STATE}/
β”œβ”€β”€ campaigns_candidates.parquet          ← NEW
β”œβ”€β”€ campaigns_committees.parquet          ← NEW  
β”œβ”€β”€ campaigns_contributions.parquet       ← NEW
β”œβ”€β”€ campaigns_nonprofit_donors.parquet    ← NEW (Analysis)
β”œβ”€β”€ nonprofits_organizations.parquet      (Links via employer)
β”œβ”€β”€ contacts_nonprofit_officers.parquet   (Links via name)
└── grants_revenue_sources.parquet        (Cross-reference)
```

## πŸš€ Quick Start

### 1. Get FEC API Key
Visit: https://api.data.gov/signup/
- Free tier: 1,000 requests/hour
- Instant activation

### 2. Set Environment Variable
```bash
echo 'FEC_API_KEY="your_key_here"' >> .env
```

### 3. Create Gold Tables
```bash
# Activate environment
source .venv/bin/activate

# Create campaign finance tables for Massachusetts
python pipeline/create_campaigns_gold_tables.py \
  --state MA \
  --cycle 2024 \
  --max-contributions 10000
```

### 4. Analyze Data
```python
import pandas as pd

# Load nonprofit donor analysis
donors = pd.read_parquet('data/gold/states/MA/campaigns_nonprofit_donors.parquet')

# Top nonprofit organizations by political giving
print(donors.groupby('organization_name').agg({
    'contribution_amount': 'sum',
    'contributor_name': 'count'
}).sort_values('contribution_amount', ascending=False).head(10))
```

## πŸ“– API Reference

### Main Classes

**`CampaignsGoldTableCreator`** - Pipeline for creating gold tables
- `create_campaigns_candidates(cycle)` - Extract candidate data
- `create_campaigns_committees(cycle)` - Extract committee data
- `create_campaigns_contributions(min_amount, max_records, cycle)` - Extract contributions
- `create_campaigns_nonprofit_donors(contributions_df)` - Analyze nonprofit leadership donations
- `create_all_campaigns_tables(cycle, min_contribution_amount, max_contributions)` - Run full pipeline

**`OpenFECAPI`** (from `discovery/fec_integration.py`) - API client
- `search_individual_contributions(...)` - Search contributions
- `search_candidates(...)` - Find candidates
- `search_committees(...)` - Find PACs/committees

## πŸ”— Related Files

### Existing Files (Enhanced)
- [`discovery/fec_integration.py`](../discovery/fec_integration.py) - FEC API client (already existed)
- [`website/docs/integrations/fec-political-contributions.md`](../website/docs/integrations/fec-political-contributions.md) - General integration guide (already existed)

### New Files (Created)
- [`pipeline/create_campaigns_gold_tables.py`](../pipeline/create_campaigns_gold_tables.py) - **NEW** - Gold table pipeline
- [`examples/demo_fec_integration.py`](../examples/demo_fec_integration.py) - **NEW** - Demo script
- [`website/docs/integrations/fec-campaign-finance.md`](../website/docs/integrations/fec-campaign-finance.md) - **NEW** - Technical guide

## 🎯 Future Enhancements

Potential additions to consider:

1. **Add to main orchestration script**
   - Update `scripts/create_all_gold_tables.py` to include campaigns pipeline

2. **Dashboard integration**
   - Add FEC visualizations to React app
   - Display political connections on nonprofit profiles
   - Show donor network graphs

3. **Automated analysis**
   - Scheduled updates (campaigns data updated daily by FEC)
   - Alerts for new major contributions
   - Influence score calculations

4. **Extended matching**
   - Fuzzy name matching for officers
   - Organization name normalization
   - Cross-reference with local officials data

## πŸ“ Documentation Links

- **Technical Guide:** [FEC Campaign Finance](../website/docs/integrations/fec-campaign-finance.md)
- **General Guide:** [FEC Political Contributions](../website/docs/integrations/fec-political-contributions.md)
- **Demo Script:** [examples/demo_fec_integration.py](../examples/demo_fec_integration.py)
- **API Client:** [discovery/fec_integration.py](../discovery/fec_integration.py)
- **Pipeline Module:** [pipeline/create_campaigns_gold_tables.py](../pipeline/create_campaigns_gold_tables.py)

## βœ… Checklist for Integration

- [x] Create pipeline module for gold table generation
- [x] Add example demo script
- [x] Write comprehensive documentation
- [ ] Add to main orchestration script (optional)
- [ ] Create React dashboard components (optional)
- [ ] Set up automated updates (optional)

---

**Implementation Date:** April 28, 2026
**Author:** GitHub Copilot
**License:** MIT (consistent with project)