使用Python和yfinance库获取SPY股票数据并导入MySQL数据库

之前我在面试的时候遇到这样一个问题,这里可以分享给大家,也算困扰了我许久的一个问题,当时知识面不够广泛,不知道怎么用爬虫去爬取股票数据,我当时想过通过抓包或者模拟的方式去实现,后来搞了好几天都没能找到数据,后面发现yfinance库确实很好解决了问题。 

请编写一个简洁的Python脚本,使用yfinance库获取SPY在2023年的全部数据,并将其导入mysql数据库。同时,请计算每个月的最高和最低股价,以及这些价格对应的日期。

在这篇文章中,我们将通过一个简单的Python脚本,展示如何使用yfinance库获取SPY在2023年的全部股票数据,并将其导入MySQL数据库。同时,我们还将计算每个月的最高和最低股价,以及这些价格对应的日期。

一 准备工作

        首先安装yfinancepymysqlpandas库。如果没有安装,可以通过以下命令安装

pip install yfinance pymysql pandas

二 获取SPY股票数据

        使用yfinance库下载SPY在2023年的股票数据。

data = yf.download('SPY', start='2023-01-01', end='2023-12-31')

三 提取和处理数据

        提取HighLow列,并添加一个新列月份,用于存储每个月的数据。

data = data[['High', 'Low']]
data['月份'] = data.index.month

四 计算每月的最高和最低股价

        使用groupbyagg函数计算每个月的最高和最低股价,以及对应的日期。

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("数据库连接已关闭")

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

饼车轮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值