PostgreSQL_数据下载并保存(psycopg2)
目录
前置:
1 数据下载
1.1 多个股票多个交易日
1.2 一个交易日所有股票
2 数据保存,使用python中的psycopg2包
2.1 在PyCharm中创建新项目,并安装包
2.2 代码-多个股票多个交易日
2.3 代码-一个交易日所有股票
2.4 在 pgAdmin4 中查看数据存储是否正确
1)t_daily
编辑 2) t_stock_daily
前置:
本博文是一个系列。在本人“数据库专栏”-》“PostgreSQL_”开头的博文。
1 数据下载
本实例的数据都下载自优矿,具体如何下载可自行上优矿官网,这里不赘述。
下载后的csv文件如下:
1.1 多个股票多个交易日
这些是沪深两市 2023-07-11 到 2025- 02-12 所有股票日数据

1.2 一个交易日所有股票

2 数据保存,使用python中的psycopg2包
2.1 在PyCharm中创建新项目,并安装包
pip install psycopg2、pip install pandas
2.2 代码-多个股票多个交易日
import psycopg2
import os
import pandas as pd
from datetime import datetimedef connect_db():try:conn = psycopg2.connect(database='db_stock',user='postgres',password='写你自己的密码',host='127.0.0.1',port=5432)except Exception as e:print(f'connection failed。{e}')else:return connpass# 批量插入数据
def many_day_insert(data_dir:str):'''1 纵向数据1.1 查询 ticker,把新股筛出来1.2 新股,用 insert; 非新股,用 update,array_cat2 横向数据2.1 按日期分组,直接 insert:param date_dir::return:'''file_list = os.listdir(data_dir)col_list = ['secID','tradeDate','openPrice','highestPrice','lowestPrice','closePrice','turnoverVol','turnoverValue','dealAmount','turnoverRate','negMarketValue','marketValue','chgPct','PE','PE1','PB','isOpen','vwap']df = Nonefor file_one in file_list:file_path = data_dir + file_onedf00 = pd.read_csv(file_path,encoding='utf-8')df00 = df00.loc[:,col_list].copy()if df is None:df = df00else:df = pd.concat([df,df00])df['ticker'] = df['secID'].str.slice(0,6)ticker_list = df['ticker'].to_list()ticker_list = list(set(ticker_list))ticker_list_str = '\',\''.join(ticker_list)ticker_list_str = '\''+ticker_list_str+'\''# sql 判断 t_stock_daily 是否为空表sql_vertical_null_str = f"select count(*) from t_stock_daily;"# sql 查询 tickersql_vertical_q_str = f"select ticker from t_stock_daily where ticker not in ({ticker_list_str});"sql_vertical_i_str = '''insert into t_stock_daily(ticker,tradeDate,openPrice,highestPrice,lowestPrice,closePrice,turnoverVol,turnoverValue,dealAmount,turnoverRate,negMarketValue,marketValue,chgPct,PE,PE1,PB,isOpen,vwap) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);'''sql_vertical_u_str = '''update t_stock_daily set tradeDate=array_cat(tradeDate,%s),openPrice=array_cat(openPrice,%s),highestPrice=array_cat(highestPrice,%s),lowestPrice=array_cat(lowestPrice,%s),closePrice=array_cat(closePrice,%s),turnoverVol=array_cat(turnoverVol,%s),turnoverValue=array_cat(turnoverValue,%s),dealAmount=array_cat(dealAmount,%s),turnoverRate=array_cat(turnoverRate,%s),negMarketValue=array_cat(negMarketValue,%s),marketValue=array_cat(marketValue,%s),chgPct=array_cat(chgPct,%s),PE=array_cat(PE,%s),PE1=array_cat(PE1,%s),PB=array_cat(PB,%s),isOpen=array_cat(isOpen,%s),vwap=array_cat(vwap,%s) where ticker=%s;'''sql_horizonal_i_str = '''insert into t_daily(tradeDate,tradeDateOj,ticker,openPrice,highestPrice,lowestPrice,closePrice,turnoverVol,turnoverValue,dealAmount,turnoverRate,negMarketValue,marketValue,chgPct,PE,PE1,PB,isOpen,vwap) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);'''conn = connect_db()cur = conn.cursor()cur.execute(sql_vertical_null_str)res0 = cur.fetchone()if res0[0] == 0:new_ticker_list = ticker_listelse:cur.execute(sql_vertical_q_str)res = cur.fetchall()new_ticker_list = []if res is not None:for one_node in res:new_ticker_list.append(one_node[0])v_i_list = []v_u_list = []h_i_list = []df_group_v = df.groupby(by='ticker')for ticker,group in df_group_v:if ticker in new_ticker_list:one_node = (ticker,group['tradeDate'].to_list(),group['openPrice'].to_list(),group['highestPrice'].to_list(),group['lowestPrice'].to_list(),group['closePrice'].to_list(),group['turnoverVol'].to_list(),group['turnoverValue'].to_list(),group['dealAmount'].to_list(),group['turnoverRate'].to_list(),group['negMarketValue'].to_list(),group['marketValue'].to_list(),group['chgPct'].to_list(),group['PE'].to_list(),group['PE1'].to_list(),group['PB'].to_list(),group['isOpen'].to_list(),group['vwap'].to_list())v_i_list.append(one_node)passelse:one_node = (group['tradeDate'].to_list(),group['openPrice'].to_list(),group['highestPrice'].to_list(),group['lowestPrice'].to_list(),group['closePrice'].to_list(),group['turnoverVol'].to_list(),group['turnoverValue'].to_list(),group['dealAmount'].to_list(),group['turnoverRate'].to_list(),group['negMarketValue'].to_list(),group['marketValue'].to_list(),group['chgPct'].to_list(),group['PE'].to_list(),group['PE1'].to_list(),group['PB'].to_list(),group['isOpen'].to_list(),group['vwap'].to_list(),ticker)v_u_list.append(one_node)passpassdf_group_h = df.groupby(by='tradeDate')for date_str,group in df_group_h:one_node = (date_str,datetime.strptime(date_str,'%Y-%m-%d'),group['ticker'].to_list(),group['openPrice'].to_list(),group['highestPrice'].to_list(),group['lowestPrice'].to_list(),group['closePrice'].to_list(),group['turnoverVol'].to_list(),group['turnoverValue'].to_list(),group['dealAmount'].to_list(),group['turnoverRate'].to_list(),group['negMarketValue'].to_list(),group['marketValue'].to_list(),group['chgPct'].to_list(),group['PE'].to_list(),group['PE1'].to_list(),group['PB'].to_list(),group['isOpen'].to_list(),group['vwap'].to_list())h_i_list.append(one_node)passtry:cur.executemany(sql_vertical_i_str,v_i_list)cur.executemany(sql_vertical_u_str,v_u_list)cur.executemany(sql_horizonal_i_str,h_i_list)conn.commit()passexcept Exception as e:print(f'error: {e}')conn.rollback()finally:cur.close()conn.close()passif __name__ == '__main__':many_day_insert(r'E:/temp005/')pass
2.3 代码-一个交易日所有股票
def one_day_insert(file_path:str):'''1 纵向数据1.1 新股,insert1.2 非新股,update, array_append2 横向数据2.1 直接 insert 一条数据:param file_path::return:'''df = pd.read_csv(file_path,encoding='utf-8')col_list = ['secID', 'tradeDate', 'openPrice', 'highestPrice', 'lowestPrice', 'closePrice', 'turnoverVol','turnoverValue', 'dealAmount', 'turnoverRate', 'negMarketValue', 'marketValue', 'chgPct', 'PE', 'PE1','PB', 'isOpen', 'vwap']df = df.loc[:,col_list].copy()df['ticker'] = df['secID'].str.slice(0,6)ticker_list = df['ticker'].to_list()ticker_list = list(set(ticker_list))ticker_list_str = '\',\''.join(ticker_list)ticker_list_str = '\'' + ticker_list_str + '\''# sql 判断 t_stock_daily 是否为空表sql_vertical_null_str = f"select count(*) from t_stock_daily;"# sql 查询 tickersql_vertical_q_str = f"select ticker from t_stock_daily where ticker not in ({ticker_list_str});"sql_vertical_i_str = '''insert into t_stock_daily(ticker,tradeDate,openPrice,highestPrice,lowestPrice,closePrice,turnoverVol,turnoverValue,dealAmount,turnoverRate,negMarketValue,marketValue,chgPct,PE,PE1,PB,isOpen,vwap) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);'''sql_vertical_u_str = '''update t_stock_daily set tradeDate=array_append(tradeDate,%s),openPrice=array_append(openPrice,%s),highestPrice=array_append(highestPrice,%s),lowestPrice=array_append(lowestPrice,%s),closePrice=array_append(closePrice,%s),turnoverVol=array_append(turnoverVol,%s),turnoverValue=array_append(turnoverValue,%s),dealAmount=array_append(dealAmount,%s),turnoverRate=array_append(turnoverRate,%s),negMarketValue=array_append(negMarketValue,%s),marketValue=array_append(marketValue,%s),chgPct=array_append(chgPct,%s),PE=array_append(PE,%s),PE1=array_append(PE1,%s),PB=array_append(PB,%s),isOpen=array_append(isOpen,%s),vwap=array_append(vwap,%s) where ticker=%s;'''sql_horizonal_i_str = '''insert into t_daily(tradeDate,tradeDateOj,ticker,openPrice,highestPrice,lowestPrice,closePrice,turnoverVol,turnoverValue,dealAmount,turnoverRate,negMarketValue,marketValue,chgPct,PE,PE1,PB,isOpen,vwap) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);'''conn = connect_db()cur = conn.cursor()cur.execute(sql_vertical_null_str)res0 = cur.fetchone()if res0[0] == 0:new_ticker_list = ticker_listelse:cur.execute(sql_vertical_q_str)res = cur.fetchall()new_ticker_list = []if res is not None:for one_node in res:new_ticker_list.append(one_node[0])v_i_list = []v_u_list = []h_one = Nonefor i,row in df.iterrows():if row['ticker'] in new_ticker_list:one_node = (row['ticker'],[row['tradeDate']],[row['openPrice']],[row['highestPrice']],[row['lowestPrice']],[row['closePrice']],[row['turnoverVol']],[row['turnoverValue']],[row['dealAmount']],[row['turnoverRate']],[row['negMarketValue']],[row['marketValue']],[row['chgPct']],[row['PE']],[row['PE1']],[row['PB']],[row['isOpen']],[row['vwap']])v_i_list.append(one_node)passelse:one_node = (row['tradeDate'],row['openPrice'],row['highestPrice'],row['lowestPrice'],row['closePrice'],row['turnoverVol'],row['turnoverValue'],row['dealAmount'],row['turnoverRate'],row['negMarketValue'],row['marketValue'],row['chgPct'],row['PE'],row['PE1'],row['PB'],row['isOpen'],row['vwap'],row['ticker'])v_u_list.append(one_node)passpassdate_str = df['tradeDate'][0]h_one = (date_str,datetime.strptime(date_str,'%Y-%m-%d'),df['ticker'].to_list(),df['openPrice'].to_list(),df['highestPrice'].to_list(),df['lowestPrice'].to_list(),df['closePrice'].to_list(),df['turnoverVol'].to_list(),df['turnoverValue'].to_list(),df['dealAmount'].to_list(),df['turnoverRate'].to_list(),df['negMarketValue'].to_list(),df['marketValue'].to_list(),df['chgPct'].to_list(),df['PE'].to_list(),df['PE1'].to_list(),df['PB'].to_list(),df['isOpen'].to_list(),df['vwap'].to_list())try:cur.executemany(sql_vertical_i_str,v_i_list)cur.executemany(sql_vertical_u_str,v_u_list)cur.execute(sql_horizonal_i_str,h_one)conn.commit()passexcept Exception as e:print(f'error: {e}')conn.rollback()finally:cur.close()conn.close()pass
2.4 在 pgAdmin4 中查看数据存储是否正确
上面的操作 存储的是 2023年7月11日 到 2025年2月13日 数据
1)t_daily
查询 t_daily 中最小日期和最大日期
select max(tradeDateOj) from t_daily;
select min(tradeDateOj) from t_daily;
2) t_stock_daily
查看某一股票的第一条数据和最后一条数据
select tradeDate[1],openPrice[1],highestPrice[1],lowestPrice[1],closePrice[1],turnoverVol[1],turnoverValue[1],dealAmount[1],turnoverRate[1],negMarketValue[1],marketValue[1],chgPct[1],PE[1],PE1[1],PB[1],isOpen[1],vwap[1] from t_stock_daily where ticker='000001';
select tradeDate[array_length(tradeDate,1)],openPrice[array_length(openPrice,1)],highestPrice[array_length(highestPrice,1)],lowestPrice[array_length(lowestPrice,1)],closePrice[array_length(closePrice,1)],turnoverVol[array_length(turnoverVol,1)],turnoverValue[array_length(turnoverValue,1)],dealAmount[array_length(dealAmount,1)],turnoverRate[array_length(turnoverRate,1)],negMarketValue[array_length(negMarketValue,1)],marketValue[array_length(marketValue,1)],chgPct[array_length(chgPct,1)],PE[array_length(PE,1)],PE1[array_length(PE1,1)],PB[array_length(PB,1)],isOpen[array_length(isOpen,1)],vwap[array_length(vwap,1)] from t_stock_daily where ticker='000001';

相关文章:
PostgreSQL_数据下载并保存(psycopg2)
目录 前置: 1 数据下载 1.1 多个股票多个交易日 1.2 一个交易日所有股票 2 数据保存,使用python中的psycopg2包 2.1 在PyCharm中创建新项目,并安装包 2.2 代码-多个股票多个交易日 2.3 代码-一个交易日所有股票 2.4 在 pgAdmin4 中…...
启明星辰春招面试题
《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...
边缘计算革命:重构软件架构的范式与未来
摘要 边缘计算通过将算力下沉至网络边缘,正在颠覆传统中心化软件架构的设计逻辑。本文系统分析了边缘计算对软件架构的范式革新,包括分布式分层架构、实时资源调度、安全防护体系等技术变革,并结合工业物联网、智慧医疗等场景案例,…...
【读点论文】Chain Replication for Supporting High Throughput and Availability
在分布式系统中,强一致性往往和高可用、高吞吐是矛盾的。比如传统的关系型数据库,其保证了强一致性,但往往牺牲了可用性和吞吐量。而像 NoSQL 数据库,虽然其吞吐量、和扩展性很高,但往往只支持最终一致性,无…...
Servlet、Servlet的5个接口方法、生命周期、以及模拟实现 HttpServlet 来写接口的基本原理
DAY15.1 Java核心基础 Servlet Servlet是一个接口,是java的基础,java之所以编写web的程序,接收请求并响应,就是因为Sevlet接口 Java 类实现了Servlet接口的时候就可以接收并响应请求,成为web服务器 Web服务器就是接…...
深入了解 C# 中的 LINQ:功能、语法与应用解析
1. 什么是 LINQ? LINQ(Language Integrated Query,语言集成查询)是 C# 和其他 .NET 语言中的一种强大的查询功能,它允许开发者在语言中直接执行查询操作。LINQ 使得开发者可以使用 C# 语法(或 VB.NET&…...
贝叶斯公式的一个直观解释
E E E:抓到娃娃 H H H:坐地铁 H ˉ \bar H Hˉ:坐公交 P ( E ) P ( H ) P ( E ∣ H ) P ( H ‾ ) P ( E ∣ H ‾ ) P({E}) P({H}) P({E} \mid {H}) {P}(\overline{{H}}) {P}({E} \mid \overline{{H}}) P(E)P(H)P(E∣H)P(H)P(E∣H) P (…...
Java 大视界 -- Java 大数据分布式计算中的通信优化与网络拓扑设计(145)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
reconstruct_3d_object_model_for_matching例子
文章目录 1.获取om3文件2.准备可视化3.准备3D可视化4.读取3D模型5.显示成对注册结果16.显示成对注册结果27.联合注册模型8.处理图像8.1子采样8.2 图像计算与平滑8.3 三角测量 9.基于表面做3D匹配10.评估模型准确度10.1 在场景中找到模型10.2 计算模型和场景之间的距离 11.立体系…...
【JavaWeb学习Day27】
Tlias前端 员工管理 条件分页查询: 页面布局 搜索栏: <!-- 搜索栏 --><div class"container"><el-form :inline"true" :model"searchEmp" class"demo-form-inline"><el-form-item label…...
Webrtc编译官方示例实现视频通话
Webrtc编译官方示例实现视频通话 前言 webrtc官网demo中给了一个供我们学习和应用webrtc的一个很好的例子:peerconnection,这期我们就来编译和运行下这个程序看看视频通话的效果以。 1、打开源码工程 继上期源码编译完成后,我们使用vs打开…...
编程语言选择分析:C#、Rust、Go 与 TypeScript 编译器优化
编程语言选择分析:C#、Rust、Go 与 TypeScript 编译器优化 在讨论编程语言的选择时,特别是针对微软的 C# 和 Rust,以及谷歌的 Go 语言,以及微软试图通过 Go 来拯救 TypeScript 编译器的问题,我们可以从多个角度来分析和…...
信息学奥赛一本通 1610:玩具装箱 | 洛谷 P3195 [HNOI2008] 玩具装箱
【题目链接】 ybt 1610:玩具装箱 洛谷 P3195 [HNOI2008] 玩具装箱 【题目考点】 1. 动态规划:斜率优化动规 斜率优化动规模板题:信息学奥赛一本通 1607:【 例 2】任务安排 2 | 洛谷 P10979 任务安排 2 【解题思路】 玩具长度…...
数仓工具—Hive语法之不同纬度聚合
不同纬度聚合 提到不同纬度聚合,大家想到的肯定是grouping sets,或者是cube和rollup 其实这些我们之前都讲过,可以看看之前的文章 数仓工具—Hive语法之cube和rollup 数仓工具—Hive语法之grouping sets 但是我们今天遇到的问题是,使用的工具不支持grouping sets,既然…...
领码科技:在低代码技术浪潮中的分享与探索
前言: 25年的职业生涯,赋予了我深厚的技术积累与实践经验。从武汉大学的工测系毕业,到央企副总工的职位,我始终站在IT浪潮的最前沿。然而,离开企业后,我并未停止前行的脚步。从2024年11月起,我选…...
大数据学习(80)-数仓分层
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
刘强东突然发声:不该用算法压榨最底层兄弟!东哥,真正的人民企业家
今天忙了一天,很累,准备睡觉的时候,看到网上盛传的刘强东的朋友圈,东哥又在朋友圈发文了。 说实话,看完之后,感动,真的感动。 尤其是当我看到这两句话的时候。 1、我们所学的知识、商业模式、技…...
Java 记忆链表,LinkedList 的升级版
文章目录 记忆链表 MemoryLinkedList实战源代码 众所周知,ArrayList 和 LinkedList 是 Java 集合中两个基本的数据结构,对应数据结构理论中的数组和链表。但在这两个数据结构,开发者们通常使用 ArrayList,而不使用 LinkedList。JD…...
【构建CV图像识别系统】从传统方法到深度学习
目录 1. 图像的基本概念1.1 像素与色彩1.2 过滤与卷积 2. 图像分类与检测3. 图像特征的提取3.1 全局特征3.2 局部特征3.2.1 边缘(Edge)3.2.2 角点(Corner)3.2.3 SIFT 特征 4. 传统方法与深度学习在图像识别中的应用4.1 基于传统方…...
.net core集成MQTT服务端
程序作为MQTT的服务端,也是WebApi 接口地址,在Web页面中MQTTJS用的是Websocker协议,在Winfrom中用MQTT协议。导致程序需要启动两个端口。直接上代码 创建服务 引用包:MQTTnet,MQTTnet.AspNetCore,这包最新…...
poetry安装与使用
文章目录 安装方法创建虚拟环境其他常用命令从 poetry.lock 中安装第三方依赖包 安装方法 安装命令(全局安装,不要在虚拟环境中安装,方便后面创建环境使用) pip install poetry修改虚拟环境路径(首次使用poetry时执行&…...
UVM config机制及uvm_resource_pool
目录 1. uvm_config_db 类源码 1.1 set 1.2 get 2. uvm_resource_pool 2.1 uvm_resource_pool::set 2.2 uvm_resource 3. usage 4. 小结 uvm提供一种uvm_config_db机制使得在仿真中通过变量设置来修改环境,使环境更加灵活。本文主要介绍uvm_config_db#(type)::get/set…...
JAVA学习*接口
接口 在生活中我们常听说USB接口,那接口是什么呢? 在Java中,接口相当于多个类的一种公共规范,是一种引用数据类型。 定义接口 public interface IUSB {public static final String SIZE "small";public abstract vo…...
Day11 动态规划入门
动态规划 就是 : 给定一个问题,我们把它拆成一个个子问题,直到子问题可以直接解决。然后把子问题的答案保存起来,以减少重复计算。再根据子问题答案反推,得出原问题解的一种方法. 记忆化搜索 暴力dfs 记录答案 动态规划入门思…...
WPF UI元素保存为图像文件
WPF UI元素保存为图像文件 实现功能示例代码使用示例关键代码说明WPF UI元素保存为图像文件 实现功能 将WPF界面元素(如控件、布局容器)的当前视觉内容保存为图像文件适用场景:截取控件的实时显示内容(如图表、界面快照);将动态生成的UI元素导出为图片用于分享、存档或打…...
指令型样本或偏好型样本有什么区别和联系
两者都是基于给定文本生成的训练样本,但侧重点和用途不同: 指令型样本(Instruction-based samples) 结构:通常是一个简单的指令和对应的回答,例如一对“问题-答案”或“指令-回答”。…...
neo4j-如何让外部设备访问wsl中的neo4j
WSL 运行在一个虚拟网络环境中,它的 IP 只能被宿主 Windows 访问,外部设备无法直接访问 WSL 的端口。你需要在 Windows 上转发端口,让外部设备可以访问 Windows 并映射到 WSL。 1. 获取 WSL 的 IP 地址 在 WSL 中运行以下命令获取其 IP 地址…...
Python实验:读写文本文件并添加行号
[实验目的] 熟练掌握内置函数open()的用法;熟练运用内置函数len()、max()、和enumerate();熟练运用字符串的strip()、ljust()和其它方法;熟练运用列表推导式。 [实验和内容] 1.编写一个程序demo.py,要求运行该程序后࿰…...
IDEA导入jar包后提示无法解析jar包中的类,比如无法解析符号 ‘log4j‘
IDEA导入jar包后提示无法解析jar包中的类 问题描述解决方法 问题描述 IDEA导入jar包的Maven坐标后,使用jar中的类比如log4j,仍然提示比如无法解析符号 log4j。 解决方法 在添加了依赖和配置文件后,确保刷新你的IDE项目和任何缓存ÿ…...
抖音用户视频批量下载工具开发全解析
一、逆向工程原理剖析 1.1 抖音Web端防护体系 抖音采用五层防御机制保护数据接口: graph LRA[浏览器指纹检测] --> B[请求参数签名]B --> C[Cookie动态验证]C --> D[请求频率限制]D --> E[IP信誉评级] 1.2 核心参数解密 参数名称作用原理生成方式有效期x-bogu…...
