零基础Python用户求助:通过Python提取BLS数据至Excel并获取美国MSA历年就业数据
零基础Python用户求助:通过Python提取BLS数据至Excel并获取美国MSA历年就业数据
嗨,作为完全没接触过编程和数据科学的新手,你遇到的这种“不知道怎么精准提问AI”的情况太常见了!别着急,我给你准备了一套保姆级的Python脚本,专门用来抓取美国劳工统计局(BLS)的官方数据——这是获取MSA就业数据最权威的渠道,而且完全免费。
先理清楚我们要做的事
我们的目标是:
- 抓取过去10年(比如2014-2023年)美国每个MSA的年底总就业人数
- 计算每个MSA每年的新增就业岗位数(当年总就业 - 上年总就业)
- 把所有数据整理成结构清晰的Excel文件,方便你计算就业变化率
第一步:安装必备工具
打开你的命令提示符(Windows)或终端(Mac/Linux),输入下面的命令安装需要的Python库:
pip install pandas requests openpyxl
pandas:帮我们整理和处理数据requests:用来调用BLS的API获取数据openpyxl:用来生成Excel文件
第二步:获取BLS API密钥(可选但强烈推荐)
BLS的API对无密钥请求有次数限制(每天最多25次),注册一个免费密钥可以提升到每天1000次。你只需要去BLS的开发者页面注册就能拿到,过程超简单,填个邮箱就行。
第三步:完整脚本(带详细注释)
把下面的代码复制到你的Python编辑器(比如VS Code、PyCharm,甚至自带的IDLE都行),然后根据你的需求修改几个参数:
import pandas as pd import requests # ---------------------- 你需要修改的参数 ---------------------- API_KEY = "你的BLS密钥" # 没有的话可以留空,写成API_KEY = "" TARGET_MSA_CODES = ["35620", "16980"] # 这里替换成你需要的MSA代码,比如纽约是"35620" START_YEAR = 2014 # 起始年份(过去10年的话就是当前年份减10) END_YEAR = 2023 # 结束年份(一般填去年,因为当前年的数据可能不全) OUTPUT_EXCEL_PATH = "msa就业数据.xlsx" # 导出的Excel文件名 # ----------------------------------------------------------- # 初始化一个空的DataFrame用来存所有数据 final_data = pd.DataFrame() # 循环处理每个MSA for msa_code in TARGET_MSA_CODES: # 构造API请求参数:SMU+MSA代码+固定后缀对应总就业人数序列 payload = { "seriesid": [f"SMU{msa_code}0000000000001"], "startyear": START_YEAR, "endyear": END_YEAR, "registrationkey": API_KEY } # 发送请求到BLS API response = requests.post("https://api.bls.gov/publicAPI/v2/timeseries/data/", json=payload) data = response.json() # 检查请求是否成功 if data["status"] != "REQUEST_SUCCEEDED": print(f"获取MSA {msa_code} 数据失败:{data['message']}") continue # 提取就业数据和MSA名称 series_data = data["Results"]["series"][0]["data"] msa_name = data["Results"]["series"][0]["seriesTitle"].split(" - ")[0] # 从标题里提取MSA名称 # 整理数据成DataFrame msa_df = pd.DataFrame(series_data) # 只保留年底的数据(BLS数据是月度的,我们取12月的记录) msa_df = msa_df[msa_df["period"] == "M12"] # 转换年份和就业人数为数值类型 msa_df["year"] = msa_df["year"].astype(int) msa_df["total_employed"] = msa_df["value"].astype(int) # 计算新增就业岗位数(当年总就业 - 上年总就业) msa_df["new_jobs"] = msa_df["total_employed"].diff().fillna(0).astype(int) # 添加MSA名称和代码列,方便识别 msa_df["msa_name"] = msa_name msa_df["msa_code"] = msa_code # 整理列的顺序,让数据更易读 msa_df = msa_df[["msa_name", "msa_code", "year", "total_employed", "new_jobs"]] # 把当前MSA的数据合并到总数据里 final_data = pd.concat([final_data, msa_df], ignore_index=True) # 把数据导出到Excel final_data.to_excel(OUTPUT_EXCEL_PATH, index=False, engine="openpyxl") print(f"数据已成功导出到 {OUTPUT_EXCEL_PATH}!")
第四步:怎么获取MSA代码?
你可以在BLS的区域数据查询页面搜索你需要的MSA名称(比如"New York-Newark-Jersey City"),找到对应的5位代码——注意脚本里需要的是去掉开头"SMU"的部分,比如纽约的完整系列ID是"SMU356200000000001",那我们取中间的"35620"放到TARGET_MSA_CODES里就行。
一些实用提示
- 如果需要批量获取所有MSA的数据,你可以先把所有MSA的代码整理成一个列表,替换掉
TARGET_MSA_CODES就行 - 如果你不需要某个MSA的数据,直接从列表里删掉对应的代码即可
- 如果请求失败,先检查你的API密钥是否正确,或者网络连接有没有问题
- Excel文件里的
new_jobs列就是当年新增的岗位数,你可以直接用公式计算(new_jobs / 上年total_employed) * 100得到就业变化率
备注:内容来源于stack exchange,提问作者ap91phl
相关产品推荐
相关产品推荐

