File size: 2,378 Bytes
fab9847
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""
GitHub Actions 用: 从 US Census Bureau 下载石油贸易数据
v3: 使用正确的 API endpoint
"""
import pandas as pd
import requests, os

OUTPUT = 'data/cloud'
os.makedirs(OUTPUT, exist_ok=True)

print("Fetching US Census trade data...")

trades = []

# Census International Trade API - 正确参数名
# Docs: https://api.census.gov/data/timeseries/intltrade/exports/hs.html
for flow, val_field in [('exports', 'ALL_VAL_MO'), ('imports', 'GEN_VAL_MO')]:
    url = f"https://api.census.gov/data/timeseries/intltrade/{flow}/hs"
    
    # 先查可用变量
    try:
        var_resp = requests.get(f"{url}/variables.json", timeout=10)
        if var_resp.status_code == 200:
            vars_data = var_resp.json()
            avail = list(vars_data.get('variables', {}).keys())[:10]
            print(f"  {flow} available vars: {avail}")
    except:
        pass

    # 尝试不同参数组合
    param_sets = [
        {'get': f'CTY_CODE,CTY_NAME,{val_field}', 'COMM_LVL': 'HS6', 'I_COMMODITY': '270900', 'time': 'from 2024-01'},
        {'get': f'CTY_CODE,CTY_NAME,{val_field}', 'COMM_LVL': 'HS4', 'I_COMMODITY': '2709', 'time': 'from 2024-01'},
        {'get': 'CTY_CODE,CTY_NAME,GEN_VAL_MO', 'COMM_LVL': 'HS2', 'I_COMMODITY': '27', 'time': 'from 2024-01'},
    ]
    
    for i, params in enumerate(param_sets):
        try:
            resp = requests.get(url, params=params, timeout=30)
            if resp.status_code == 200:
                data = resp.json()
                if len(data) > 1:
                    df = pd.DataFrame(data[1:], columns=data[0])
                    df['flow'] = flow
                    trades.append(df)
                    print(f"  ✓ {flow} attempt {i+1}: {len(df)} rows")
                    break
            else:
                if i == 0:  # only log first failure
                    print(f"  ✗ {flow} attempt {i+1}: HTTP {resp.status_code} - {resp.text[:100]}")
        except Exception as e:
            print(f"  ✗ {flow} attempt {i+1}: {str(e)[:50]}")

if trades:
    df_all = pd.concat(trades, ignore_index=True)
    outpath = os.path.join(OUTPUT, 'census_oil_trade.csv')
    df_all.to_csv(outpath, index=False)
    print(f"\n✓ Saved {len(df_all)} rows to {outpath}")
else:
    pd.DataFrame().to_csv(os.path.join(OUTPUT, 'census_oil_trade.csv'))
    print("\n⚠ No trade data, saved empty placeholder")