之前我在面试的时候遇到这样一个问题,这里可以分享给大家,也算困扰了我许久的一个问题,当时知识面不够广泛,不知道怎么用爬虫去爬取股票数据,我当时想过通过抓包或者模拟的方式去实现,后来搞了好几天都没能找到数据,后面发现yfinance库确实很好解决了问题。
请编写一个简洁的Python脚本,使用yfinance库获取SPY在2023年的全部数据,并将其导入mysql数据库。同时,请计算每个月的最高和最低股价,以及这些价格对应的日期。
在这篇文章中,我们将通过一个简单的Python脚本,展示如何使用yfinance
库获取SPY在2023年的全部股票数据,并将其导入MySQL数据库。同时,我们还将计算每个月的最高和最低股价,以及这些价格对应的日期。
一 准备工作
首先安装yfinance
、pymysql
和pandas
库。如果没有安装,可以通过以下命令安装
pip install yfinance pymysql pandas
二 获取SPY股票数据
使用yfinance
库下载SPY在2023年的股票数据。
data = yf.download('SPY', start='2023-01-01', end='2023-12-31')
三 提取和处理数据
提取High
和Low
列,并添加一个新列月份
,用于存储每个月的数据。
data = data[['High', 'Low']]
data['月份'] = data.index.month
四 计算每月的最高和最低股价
使用groupby
和agg
函数计算每个月的最高和最低股价,以及对应的日期。
monthly_summary = data.groupby('月份').agg(
月度最高股价=('High', 'max'),
月度最低股价=('Low', 'min'),
最高股价日期=('High', lambda x: x.idxmax().strftime('%Y-%m-%d')),
最低股价日期=('Low', lambda x: x.idxmin().strftime('%Y-%m-%d'))
).reset_index()
五 连接MySQL数据库
配置数据库连接参数,并尝试连接到MySQL数据库。
这里我是用vscode工具去连接数据库的,如果不知道怎么连接的话我简单讲一下:
(1)下载MySQL,然后创建新数据库,记得记住你的密码,一般可以简单设为1234(我一般这样),比较好记;
(2)如下图所示,我们需要去vscode的扩展中把MySQL扩展下载了;
(3) 在vscode中连接你的数据库(注:MySQL先开启然后输入正确的密码登陆先)
这里简单讲一下怎么连接数据库,相信CSDN有很多博主也很详细地讲怎么连接数据库了,我这里为了保证连贯性简单讲一下,在连接成功后,在代码中连接数据库
db_config = {
'user': 'root',
'password': '密码',
'host': '端口号',
'port': 3306,
'database': '你的数据库名称'
}
conn = None
try:
conn = pymysql.connect(**db_config)
if conn.open:
print("成功连接到数据库")
六 创建表并插入数据
在文件夹下新建一个文件(1.sql)主要创建table,也可以按照我下面来写
然后继续在原来的代码中创建一个SQL插入语句,并将每月的股价数据插入到数据库中。
CREATE TABLE IF NOT EXISTS spy_monthly_prices (
id INT AUTO_INCREMENT PRIMARY KEY,
月份 INT NOT NULL,
月度最高股价 FLOAT NOT NULL,
月度最低股价 FLOAT NOT NULL,
最高股价日期 DATE NOT NULL,
最低股价日期 DATE NOT NULL
);
下面是原来的代码基础上进行增加:
cursor = conn.cursor()
for index, row in monthly_summary.iterrows():
insert_query = '''
INSERT INTO spy_monthly_prices (月份, 月度最高股价, 月度最低股价, 最高股价日期, 最低股价日期)
VALUES (%s, %s, %s, %s, %s);
'''
cursor.execute(insert_query, (row['月份'], row['月度最高股价'], row['月度最低股价'], row['最高股价日期'], row['最低股价日期']))
conn.commit()
print("数据已成功插入数据库")
七 异常处理和关闭数据库连接
处理可能发生的数据库连接错误,并在最后关闭数据库连接。
except Error as e:
print(f"连接错误: {e}")
finally:
if conn:
conn.close()
print("数据库连接已关闭")
总结
通过上述步骤,能够从yfinance
获取了SPY在2023年的股票数据,并计算了每个月的最高和最低股价及其对应的日期。然后将这些数据导入到了MySQL数据库中。这个过程不仅展示了如何使用Python进行数据获取和处理,还涉及到了数据库的基本操作,对于金融数据分析和数据库管理都是一个很好的实践。
全部代码
数据库创建部分
CREATE TABLE IF NOT EXISTS spy_monthly_prices (
id INT AUTO_INCREMENT PRIMARY KEY,
月份 INT NOT NULL,
月度最高股价 FLOAT NOT NULL,
月度最低股价 FLOAT NOT NULL,
最高股价日期 DATE NOT NULL,
最低股价日期 DATE NOT NULL
);
运行程序
import yfinance as yf
import pymysql
from pymysql import Error
import pandas as pd
# 获取 SPY 在 2023 年的股票数据
data = yf.download('SPY', start='2023-01-01', end='2023-12-31')
# 提取SPY的相关数据
data = data[['High', 'Low']]
# 访问多级索引的列名
data['月份'] = data.index.month
# 使用 'High' 和 'Low' 访问数据
monthly_summary = data.groupby('月份').agg(
月度最高股价=(('High', 'SPY'), 'max'),
月度最低股价=(('Low', 'SPY'), 'min'),
最高股价日期=(('High', 'SPY'), lambda x: x.idxmax().strftime('%Y-%m-%d')),
最低股价日期=(('Low', 'SPY'), lambda x: x.idxmin().strftime('%Y-%m-%d'))
).reset_index()
# 打印每个月的最高、最低股价及对应日期
print(monthly_summary)
# MySQL 连接配置
db_config = {
'user': 'root',
'password': '密码',
'host': '端口号',
'port': 3306,
'database': '数据库名称'
}
conn = None
# 连接到 MySQL 数据库
try:
conn = pymysql.connect(**db_config)
if conn.open:
print("成功连接到数据库")
cursor = conn.cursor()
# 插入数据到数据库
for index, row in monthly_summary.iterrows():
insert_query = '''
INSERT INTO spy_monthly_prices (月份, 月度最高股价, 月度最低股价, 最高股价日期, 最低股价日期)
VALUES (%s, %s, %s, %s, %s);
'''
cursor.execute(insert_query, (row['月份'], row['月度最高股价'], row['月度最低股价'], row['最高股价日期'], row['最低股价日期']))
conn.commit()
print("数据已成功插入数据库")
except Error as e:
print(f"连接错误: {e}")
finally:
if conn:
conn.close()
print("数据库连接已关闭")