目录
前言:
一、项目的概述
二、Mysql数据库
(1)导入数据
(2)数据库增删改查
三、java读取python脚本,并实现动态传参
(1)初期探索
(2)具体实例
a. 数据库的删除操作
b. 数据库的添加操作
四、其他细节的问题
总结
这次我在大学数据综合实践上做的一个项目,项目的具体内容我就不多说了。这里主要想把自己做的一部分工作写在CSDN上记录一下,同时如果能给其他人提供借鉴就更好了。
先简单说一下我这个项目,我做了一个广告点击率预测的项目。这个项目来源于2021 iFLYTEK A.I. 开发者大赛-广告点击率预估挑战赛,数据集为“广告点击率预估.csv”,其中包含 13 个特征字段,6 天的数据,共计 39 万多条。下面是对其特征字段的描述:
接着我们的要求有:
1. 对数据进行预处理
2. 数据可视化操作
3. 利用机器学习或深度学习方法预测
4. 使用Mysql存储数据集,实现数据的增删改查
5. 设计判断按钮,利用训练好的模型对数据库中查询到的数据进行预测并输出结果到设计好的界面上。该功能还需满足以下要求:预测结果除了展示在界面上外,还需提供保存功能,将其以文 件形式保存在本地磁盘上
这里我重点给大家说一下我做的相关工作和遇到的问题
在此之前,我还没有太多接触过数据库的相关知识,或者说比较浅显。所以要从头开始学习,对于下载和安装软件,这里不在赘述了。我使用的是Mysql benchwork和自带的控制台。
首先我们把我们的39万条数据,要怎么办捏?对!我们先建个表,大概是下面这样啦:我新建了一个名字为hym的数据库,在数据库中新建了一个名字为gg的表
值得注意的是:我建表时,要依据原始的csv文件来确定每个列变量时整数型(int)还是字符型(varchar(255)),建表时注意不要把这些搞错了,不然后期会报错。如果字符串很长,也记得注意给其分配的长度一定要大于它自身的长度,不然也会报错,比如varchar(255)
关于Mysql的各种数据类型可以看下面的文章!
MySQL中数据类型介绍 - myxlp - 博客园 (cnblogs.com)https://www.cnblogs.com/-xlp/p/8617760.html
接着如何把数据导入呢?这里有两种方法,如果你的数据很少,你可以直接使用软件内置的导入数据的功能,如下所示:
我们右键我们的表,有一个Table Date Import Wizard,我这种初中英语水平直接看懂,就是数据导入!我们选择我们的文件,导入即可(网上也有很多教程文章)。但是这个有一个非常严重的缺点!!!就是数据量太多的时候导入太慢啦,因为它是一条一条导入,如果你有上百万条数据,那结果可想而知(⌯꒪꒫꒪)੭
所以我们直接选择第二种方法,使用控制台命令进行导入,我们进入如下的控制台,输入我们的root密码:
接着我们只需输入很简单的几行指令就完全搞定啦~,但在此之前要记得先选择数据库哦。(老手都知道,写上来帮助一些啥也不懂的小白)
Load data infile 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/delete_new.csv' into table gg fields terminated by ',';
Load data infile是导入数据的指令,后面可以跟着很多参数。delete_new.csv是我处理过的数据集,’C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/ ’是我们放入数据集csv文件的地址,这样数据库才能识别到数据(对于我电脑是这样的),into table gg是指在我们创建的gg这个表上,terminated by ','代表他们的分隔符是用','分开的。
但是导入时仍要注意一些细节问题,比如说对于数据集中的空值,要提前进行处理或使用相关代码提前进行规范,不然录入数据的过程中会出现报错,不然重导好麻烦,本人比较懒,嘤嘤嘤(*∩ω∩)。
导入完成后,我们查看一下是否成功:
我们直接在workbench软件中可以直接查看前1000条!
什么??你说你想查看全部的数据?!◔ ‸◔?网上应该也有很多很多方法趴,但是不如直接去看csv文件,或者使用数据库指令进行查找操作!
接着我用python简单实现了一下数据库的增删改查,这里直接调用了python的库pymysql,下面的代码是数据库的连接操作,记得在连接前要打开你的数据库哦。
import pymysql
def Connection():
try:
db = pymysql.connect(host="localhost", user="root"
, password="自己的密码", database="自己的数据库")
print('数据库连接成功!')
except pymysql.Error as e:
print('数据库连接失败'+str(e))
finally:
db.close()
Connection()
对于增删改查,都用到了数据库的基本命令,我们这里简略的说一下,萌新有需求可以去网上搜!比如这个:python连接mysql数据库增删改查_Lazy_Goat的博客-CSDN博客。
1. 添加命令(增):使用insert语句,举个例子,比如针对我这个项目我要添加新的数据,就要把每个列变量都输入值进去(我这里省略了,只取了前三个变量),但大致格式是这样!
2. 删除命令(删):使用delete语句,下图是依据id号对数据进行删除。
3. 修改/更新命令(改):使用update语句,这个也是针对id号来对其他三个变量进行修改,我这里也只是写了一部分变量,当然根据需要可以自己添加。
4. 查找命令(查):使用find语句,下图依据id号进行数据查找,但是如果有模糊查询需求的可以自己去了解一下,我这里并没有去做。
本人python和C++用的非常多,对于java的使用真是少之又少૮₍ ˃ ⤙ ˂ ₎ა,所以这里是我花费时间最长的一个地方,因为基本上是从0开始,我在网上借鉴了大量的资料。发现读取python脚本也有几种方法,我这里重点说我探索的两个,下面的文章是一些方法的举例
(1条消息) java如何使用python库 - CSDN文库https://wenku.csdn.net/answer/20587f5dae09441a8acec27633ab7bb7#:~:text=java%E8%B0%83%E7%94%A8python%201%20%E4%BD%BF%E7%94%A8%20Java%20%E8%87%AA%E5%B8%A6%E7%9A%84%20Java%20Runtime%EF%BC%88java.lang.Runtime%EF%BC%89%E7%B1%BB%E7%9A%84%20exec,Java%20%E5%92%8C%20Python%20%E4%B9%8B%E9%97%B4%E5%88%9B%E5%BB%BA%E4%BA%92%E7%9B%B8%E8%B0%83%E7%94%A8%E7%9A%84%E9%80%9A%E9%81%93%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%9C%A8%20Java%20%E7%A8%8B%E5%BA%8F%E4%B8%AD%E8%B0%83%E7%94%A8%20Python%20%E7%A8%8B%E5%BA%8F%E3%80%82 我先尝试了一下Jython,但是又查阅得知,Jython已经很久不更新了,而且不支持python的第三方库,好了直接G了。我这个项目由于还要做机器学习!还有数据分析!有很多第三方库。
所以我们索性把目光转到最基本的方法,使用java自带的exec(),这位更是重量级,我搞它搞了两天,才搞好!可能这对很多大佬来说都是小儿科,但是对我这萌新小白来讲有点残忍了。我就疯狂去查资料,当然网上有很多思路,给了我很多借鉴,但适中没有解决我的需求。所以我苦思冥想,各种调试,终于成功!希望下面的内容可以帮助那些小白和对这方面有需求的友友! ✧*。 (ˊᗜˋ*) ✧*。 下面是我借鉴的一些文章,大家有需要也可以看看:
(1条消息) Java Runtime.getRuntime().exec()调用python含第三方库时无返回值_th3000的博客-CSDN博客https://blog.csdn.net/th3000/article/details/106955890?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-106955890-blog-104648277.235%5Ev28%5Epc_relevant_t0_download&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-106955890-blog-104648277.235%5Ev28%5Epc_relevant_t0_download&utm_relevant_index=2(1条消息) 在Java中动态传参调用Python脚本___Thorny的博客-CSDN博客https://blog.csdn.net/thorny_v/article/details/61417386
好!现在回归正题:
在封装好的py脚本的情况下,如果你不需要传入参数而只需要执行这个py文件的话,那么直接网上就可以获取得到很多写好的代码,比如还是下面这个文章,我觉得写的很好。里面也包含最基本的动态传参,但是没法解决我的这个问题。(1条消息) 在Java中动态传参调用Python脚本___Thorny的博客-CSDN博客https://blog.csdn.net/thorny_v/article/details/61417386
动态传参问题:
我又搜索了很多资料,知道了在python脚本文件中必须要引入sys模块,sys.argv[i]为脚本名。i从1开始,如果我们需要传入9个参数,就从1到9。下面文章是给我思路的文章
Python 获得命令行参数的方法 - 原心 - 博客园 (cnblogs.com)https://www.cnblogs.com/saiwa/articles/5253713.html
我们首先看一下比较基本的动态传参代码(java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class python {
public static void main(String[] args) {
// Python脚本文件路径
String pythonScriptPath = "你的python文件的路径";
// 参数传递给Python脚本的字符串
String arg1 = " ";
try {
// 构建命令行执行Python脚本的命令
String[] cmd = {"编译器的环境,如果你有虚拟环境的编译器,可以直接输入到python.exe", pythonScriptPath, arg1};
Process process = Runtime.getRuntime().exec(cmd);
// 获取Python脚本的输出流
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
// 读取Python脚本的输出
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
// 等待Python脚本执行完毕
process.waitFor();
// 获取Python脚本的返回值
int exitCode = process.exitValue();
System.out.println("Python脚本执行完毕,返回值:" + exitCode);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
上面的代码是一个比较基本的读取python脚本的代码,一些地方我都用注释标出来了,值得强调的是,其中string cmd[ ]中跟的参数:第一个是编译器环境,像我这种是建了虚拟环境的,第三方库都下载在其中,我就要把我的编译器地址进入到我创建的虚拟环境中,找到python.exe。第二个是python脚本文件的地址,第三个是跟着需要传入的参数。当然后面可以跟无限个参数,按你自己的需求来。
我根据以上代码,再结合自己的摸索和各种搜寻资料,终于研究出如何与数据库结合!下面我就拿出来和大家具体讲一下!(◍˃̶ᗜ˂̶◍)✩
先把它拿出来是因为这个相对其他比较简单,假如我们就是根据id号来对数据进行删除,我们先来看java的代码:
private void deleteData(String id) {
String sql = "DELETE FROM gg WHERE id=" + id; // SQL删除语句
String[] cmd = { "C:\\Users\\Lenovo\\AppData\\Local\\Continuum\\anaconda3\\envs\\tf2\\python.exe"
, "D:\\myeclipse workspace\\java418\\src\\student\\delete.py", sql }; // Python脚本文件和参数
try {
ProcessBuilder pb = new ProcessBuilder(cmd);
Process p = pb.start();
BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
// 显示删除结果
textArea.append(line + "\n");
}
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
这个sql就是我们要传入的id参数 ,对于前面的地址都是我的路径,大家改成自己的就可以,还有就是gg是我的数据表哦,你们要改成自己的。接下来我们看一下对应的py脚本文件:
import pymysql
import sys
# 从Java传递的第一个参数是SQL语句
sql = sys.argv[1] #!!!!!!!!!!!!!!!
# 数据库连接信息
host = "localhost"
user = "root"
password = "password"
database = "hym"
# 连接数据库
conn = pymysql.connect(host='localhost', user='root', password='自己的密码', db='自己的数据库')
cursor = conn.cursor()
# 执行SQL语句
try:
cursor.execute(sql)
conn.commit()
print("删除成功!")
except Exception as e:
conn.rollback()
print("删除失败 错误信息:", e)
# 关闭数据库连接
cursor.close()
conn.close()
注意!看到那个sys.argv[1]了吧,那个是很重要的!一定要有,这样id才会传进去
还有一个重要的问题,python中不要使用input()的函数去进行输入,input()函数在java动态传参这里没任何用,我们就直接赋予就好。
java代码:
// 调用Python脚本添加数据
String[] cmd = {"C:\\Users\\Lenovo\\AppData\\Local\\Continuum\\anaconda3\\envs\\tf2\\python.exe",
"D:\\myeclipse workspace\\java418\\src\\student\\add.py",
id, date, user_id, product, campaign_id, webpage_id, product_category_id,
user_group_id, gender, age_level, user_depth, var_1, isClick};
try {
Process process = Runtime.getRuntime().exec(cmd);
process.waitFor();
} catch (Exception ex) {
ex.printStackTrace();
}
python脚本代码:
import pymysql
import sys
# 从Java传递的参数是13个值:id,date,user_id,product,campaign_id,webpage_id,product_category_id,
# user_group_id,gender,age_level,user_depth,var_1,isClick
id = sys.argv[1]
date = sys.argv[2]
user_id = sys.argv[3]
product = sys.argv[4]
campaign_id = sys.argv[5]
webpage_id = sys.argv[6]
product_category_id = sys.argv[7]
user_group_id = sys.argv[8]
gender = sys.argv[9]
age_level = sys.argv[10]
user_depth = sys.argv[11]
var_1 = sys.argv[12]
isClick = sys.argv[13]
# 连接数据库
conn = pymysql.connect(host='localhost', user='root', password='自己的密码', db='自己的数据库')
cursor = conn.cursor()
# 执行插入操作
try:
sql = "INSERT INTO gg (id,date,user_id,product,campaign_id,webpage_id,product_category_id,user_group_id,gender,age_level,user_depth,var_1,isClick) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
val = (id,date,user_id,product,campaign_id,webpage_id,product_category_id,user_group_id,gender,age_level,user_depth,var_1,isClick)
cursor.execute(sql, val)
conn.commit()
print("数据插入成功!")
except Exception as e:
conn.rollback()
print("数据插入失败! 错误信息:", e)
cursor.close()
conn.close()
至于查找操作和更新操作,跟上面是类似的,无非就是数据库语句不同、传参数量不同,大家可以自己尝试一下,如果有需求可以私信我或者给我评论!
关于项目的其他方面,比如数据分析、机器学习方法、最终界面的搭建,这些我都有参与和修改,但是内容也有点多,就不在这里赘述了。如果有需求的友友也可以私聊我和我探讨。下面是一些项目的截图~
本次是我的一点学习心得体会,欢迎大家跟我沟通交流,我也是在不断学习中!有什么问题大家可以指出,一起进步一起加油。如果这篇文章对你有帮助或者你觉得写的很好,还是希望大家点个赞鼓励我一下哈哈哈哈哈哈,谢谢大家~