1、json包
在python中使用json解析数据的时候,需要导入包的类型,使用json包解析json数据。
python
import json
student_json='{"age":22,"clazz":"文科六班","gender":"女","id":"1500100001","name":"施笑槐"}'
#将一个json文件装换成python中的对象,返回的是python中的字典:
student_obj=json.loads(student_json)
print(student_obj)
#转换成一个字典,通过key来获取对应的value的值
print(student_obj["name"])
info={"age":22,"clazz":"文科六班","gender":"女","id":"1500100001","name":"施笑槐"}
#将python中的对象转换成json字符串,使用到的函数是dumps,ensure_ascii=False可以指定他的编码的方式
print(json.dumps(info,ensure_ascii=False))
2、pip命令的使用:
在python中下载第三方包需要执行的命令是:
python
pip install 第三方包的名称
"""
更新pip版本的命令:
python.exe -m pip install --upgrade pip
查看pip的命令:
python语言是u用pip管理第三方包
按照第三方包
pip install pandas
修改源方式
1、临时修改
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
2、永久修改源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install matplotlib
清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
豆瓣:http://pypi.douban.com/simple/
"""
3、在python中连接数据的包:pymysql
python
# 安装的命令:
"""
使用python连接mysql
"""
# pip install pymysql
import pymysql
# 连接数据库:
connect = pymysql.connect(
host="master",
port=3306,
user="root",
password="123456",
database="bigdata25")
#2、创建一个游标
curses=connect.cursor()
#3、编写sql
curses.execute("select id,student,course,score from students")
#4、获取查询的所有的数据,输出的是一个元组:
stu = curses.fetchall()
print(stu)
#5、循环打印数据:
for stus in stu:
print(stus[1])
#6、向数据库中插入数据:
curses.execute("insert into TableA values (4,'lisi','310111XXXXX5',19930501,'中国')")
#提交事务:
connect.commit()
#关闭连接:
connect.close()
python
# 需求:将学生表中的数据写入到mysql中:
import pymysql
import json
# 1、读取数据:
file = open("D:\code\pythonProject\pythonProject\数据\students.json", mode="r", encoding="utf_8")
file1 = file.readlines()
# 2、使用函数推导式:
stu1 = [stu.strip() for stu in file1]
# 返回的数据类型是json格式的数据,所以需要对数据进行解析,需要导入json函数,返回的是一个列表:
info = [json.loads(stu2) for stu2 in stu1]
#测试,显示的是有数据
info1=[info2["id"] for info2 in info]
print(info1)
# 与MySQL建立连接
connect = pymysql.connect(
host="master",
port=3306,
user="root",
password="123456",
database="bigdata25"
)
# 创建游标
cursor = connect.cursor()
# 编写sql语句:
# 首先创建一张学生表
"""
此时需要注意的是如果表已经创建好,或者存在,此时在运行就会被报错,所以在创建表的时候需要加上if not exists
"""
#创建表:
cursor.execute("""
create table if not exists stu(
id varchar(20),
name varchar(20),
age int,
clazz varchar(20),
gender varchar(20)
)
""")
# 将数据循环写入放到
for stu3 in info:
id = stu3["id"]
name = stu3["name"]
gender = stu3["gender"]
clazz = stu3["clazz"]
age = stu3["age"]
#数据提取也是成功的:
print(id,name,gender,clazz,age)
#执行sql语句:
cursor.execute(f" insert into stu values('{id}','{name}',{age},'{clazz}','{gender}')")
# 手动提交事务:
connect.commit()
# 关闭连接:
connect.close()
# 这里使用的是open,需要手动关闭连接
file.close()
4、pyspark
python
from pyspark.sql import SparkSession
# 创建sparksession环境
spark = SparkSession.builder.master("local").appName("spark").getOrCreate()
# 读取数据:
stu = spark.read.format("json").load("D:\code\pythonProject\pythonProject\data\students.json")
# 统计班级的人数:
clazz_num = stu.groupBy("clazz").count()
stu.show()
# 保存数据:
clazz_num.write.format("csv").save("D:\code\pythonProject\pythonProject\data\clazz_num")
5、numpy:在数据分析中经常使用到的包,主要是用来科学计算的,numpy是一种专门用于矩阵计算的,科学计算的开源的python,主要是将python变成一种免费的更强大的matlab系统。
python
# 下载:pip install numpy
import numpy as np
from numpy import random
# 创建一个多维矩阵
array = np.array([[1, 2, 3], [4, 5, 6]])
print(array)
print(type(array))
# 矩阵的转至:
print(array.T)
# 1、向左反转:
print("向左翻转{}".format(np.fliplr(array)))
# 2、向右反转:
print("向右反转{}".format(np.fliplr(array)))
# 类型转换:
# 创建一个字符串矩阵:
array1 = np.array([["1", "2", "3"], ["4", "5", "6"]])
array2 = array1.astype("float_")
print(array1)
print(array2)
# 创建一个一维数组:
array3 = np.array([1, 2, 3, 4, 5])
# 使用切片取出里面的一些值:
array4 = array3[::2]
print(array4)
# 根据索引取出数据:需要注意的是索引的下标都是从0开始计算的:
# 一维数组:
array5 = np.array([1, 2, 3, 4, 5])
print("一维数组使用索引取出数据是:{}".format(array5[0]))
# 多维数组:使用二维数组举例:
array6 = np.array([[1, 2, 3], [4, 5, 6]])
print(array6)
print("二维数组使用索引取出数据是:{}".format(array6[0][0]))
# 在numpy中的切片:
# 第一种:取所有行的某一列
print("numpy中切片中取出数据:{}".format(array6[:, 1]))
# 第二种,前面控制的是行数,后面控制的列数:
"""
原理:可以将前后都看一个列表,前面的控制的是行数,后面控制的列数
"""
print("numpy第一行中的第一个到最后一个数字:{}".format(array6[0, 1::]))
# 布尔值索引:
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
print(arr % 2 == 1)
# 需求:取出里面的奇数
arr = arr[arr % 2 == 1]
print(arr)
# 还可以代入公式计算
array7 = np.array([1, 2, 3, 4])
y = 2 * array7 + 1
print("代入公式计算后的结果是{}".format(y))
# 重构:重新改变它的形状,使用函数reshape
array8 = np.array([1, 2, 3, 4])
# 打印出该数组的结构
print(array8.shape)
# 重构,装化成一个2*2结构的数组
print(array8.reshape((2, 2)))
# numpy中的拼接:
# 分成横轴拼接、纵轴拼接
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
# 1、横轴拼接:存放在一个数组中
print("numpy中横向拼接{}".format(np.vstack((arr1, arr2))))
# 2、纵轴拼接:
print("numpy中纵向拼接{}".format(np.hstack((arr1, arr2))))
# 对位运算:对应位置计算:
arr3 = np.array([[1, 2, 3], [4, 5, 6]])
arr4 = np.array([[1, 2, 3], [10, 20, 30]])
print(arr3 + arr4)
print(arr3 - arr4)
print(arr3 * arr4)
print(arr3 // arr4)
print(arr3 / arr4)
print(arr3 % arr4)
# 矩阵相乘,使用到的函数是dot
arr5 = np.array([[1, 2, 3], [4, 5, 6]])
arr6 = arr5.T
print(arr5.dot(arr6))
# 自然对数的使用:
arr5 = np.array([[1, 2, 3], [4, 5, 6]])
print("自然对数使用{}".format(np.log10(arr5)))
# 差分,计算相邻两个数之间的差值:diff
array9 = np.array([1, 2, 3, 4, 2, 2, 11, 3, 4])
print("指定两个数之间的差分{}".format(np.diff(array9)))
# 一个有方向的差分:
#按照纵轴方向计算差分,参数axis就默认是0,按照横轴方向计算差分,参数默认是1
array10 = np.array([[1, 2, 3], [4, 5, 6]])
print(np.diff(array10,axis=0))
array9 = np.array([1, 2, 3, 4, 2, 2, 11, 3, 4])
#求出最大值:
print(np.amax(array9))
print(np.amin(array9))
print(np.mean(array9))
"""
1、amin:求出最小值
2、amax:求出最大值
3、percentile:返回中位数
4、median:返回中位数
5、average:返回平均值,可以设定权重,计算权重平均
6、mean:返回平均值
7、std:返回的是计算标准差
8、var:计算方差
9、exp:计算指数
"""
#生成标准正态分布的矩阵:
array11 = np.random.normal(size=(10,10))
print(array11)
"""
1、生成二项分布的,产生5个服从二项分布B(5,0.5)的样本:random.binomial(n=5,p=0.5,size=5)
2、均匀分布:产生5个服从均匀分布U[-1,1]的样本:random.unform(-1,1,5)
"""
6、pandas:属于一种小数据的数据处理,兼备numpy的高性能数组计算,类似于spark计算系统,处理数量是有限的。
python
# series是一种类似于一维数组的对象,有数据以及与之相关的数据标签组成,代表的是一个序列,相当于一列
# 可以通过字典字典构建对象series对象,series对象的索引也是可以修改的
import pandas as pd
import matplotlib.pyplot as plt
# 需要指定两个参数:分别是数据和索引
series = pd.Series(data=[1, 2, 3, 4, 5], index=[0, 1, 2, 3, 4])
print(series)
# 可以通过行号取出俩面的数字:
print(series[0])
# 构建一个dataframe:就是一个数据的一张表:
users = {"name": ["李四", "王五", "张三"], "age": [23, 24, 26]}
# 构建一个dataframe
user_df = pd.DataFrame(users)
print(user_df)
# 取数据:1、可以根据行名取出数据:
user_name = user_df["name"]
print(user_name)
# 布尔值索引:
print(user_df["age"] > 19)
# 删除列,是对原先的基础上进行操作的。
del user_df["age"]
# 使用pandas读取数据:
# read_csv:默认数据中的第一行作为列名,所以需要通过names指定对应的类名:
student = pd.read_csv("D:\code\pythonProject\pythonProject\data\students.txt",
# 指定分隔符 sep = ",",
names=["id", "name", "age", "sex", "clazz"],
encoding="utf-8")
print(student)
# 统计班级的人数
num = student.groupby("clazz")["id"].count()
# 取出前十和后十
print(student.head(10))
print(student.tail(10))
# 对数据进行过滤:
print(student[student["sex"] == "男"])
# 统计男生和女生的个数:使用函数value_count,进行分组求和
# student["sex"].value_counts().plot.pie()
"""
bar 表示的是柱状图
pie 表示的是饼状图
"""
# plt.show()
print("pandas语法的基本使用" + "****")
"""
1、pandas的语法的使用:
"""
# 1、选择字段进行处理:
student["age"] = student["age"] + 100
print(student)
# 2、选择表中多个字段:
print(student[["id", "name"]])
# 3、布尔值索引,也就是数据清洗的功能:
print(student[student["clazz"] == "文科一班"])
# 4、选择某一行数据:
print(student.loc[0])
# 5、分组聚合:求出每个班级的平均成绩:
student.groupby("clazz")["age"].mean()
# 统计每个班的人数:
stu = student["clazz"].value_counts().plot.bar()
# 设置文中的字体为微软雅黑
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
# plt.show()
# 6、表关联:
# 使用pandas读取数据:
print("使用pandas读取分数表中的数据")
score = pd.read_csv("../data/score.txt",
sep=',',
names=["id", "cid", "score"],
encoding="utf-8")
# 关联学生表和分数表:
stu_merge = pd.merge(student, score, on="id")
print(stu_merge)
# 此时在计算学生的总成绩,先进行分组,然后可以找出对应的字段进行操作
# 此时需要重置表的索引:重新将原先的列名再次设置成列名:
sum_score = stu_merge.groupby(["id", "name", "age"])["score"].sum().reset_index()
print(sum_score)
# 求出每个班级的平均分:
mean_score = stu_merge.groupby(["id", "name"])["score"].mean()
print(mean_score)
# 使用pandas将数据存储到文件中
"""
1、to_csv:指定需要存储的路径
2、header,不指定写入文件中就包含标题,4如果不想要包含表头,就需要将header设置成None
3、sep是指定分隔符
"""
sum_score.to_csv("../data/sum_score.txt", header=None, sep=",")
# 使用pandas进行词频统计
lines = pd.read_csv("../data/words.txt", names=["line"], encoding="utf-8",sep="\t")
"""
1、str:表示的是使用字符串处理列
2、split:表示的是使用逗号进行切分列
3、expand:表示的将split返回的结果转换成多列
4、stack:表示的是将多列装换成多行
5、value_counts():表示的是统计单词的数量
"""
word_count = lines["line"].str.split(",",expand=True).stack().value_counts().plot.bar()
#设置图标的标题:
plt.title("word的数量表:")
plt.ylabel("单词的数量")
plt.xlabel("单词的种类")
plt.show()
print(word_count)
7、notebook
python
#pip install notebook
#启动notebook命令: jupyter-notebook
"""
在使用vscode的方式进行编写代码,需要将代码的后缀改成ipynb
"""
8、数据可视化:
1、matplotlib:
python
# matplaotlib
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
# 创建一个figure的图层
# fig, ax = plt.subplots()
# 通过x与y轴确定坐标:
# ax.plot([1, 2, 3, 4], [1, 2, 4, 3])
# plt.show()
# 直接进行画图:
# plt.plot([1, 2, 3], [1, 2, 3])
# plt.show()
# 随机生成数据,数据的范围是在0-2之间:
x = np.linspace(0, 2, 100)
# 创建一个画布:
fig, ax = plt.subplots()
ax.plot(x, x, label="linear") # 指定x轴与y轴的大小,label:指定线条的名称
ax.plot(x, x ** 2, label="quadratic")
ax.plot(x, x ** 3, label="cubic")
ax.set_xlabel(' x label') # 设置横坐标的名称
ax.set_ylabel('y label') # 设置轴坐标的名称
ax.set_title("simple plot") # 设置画布的名称
ax.legend() # 设置图标
plt.plot(x, np.sin(x), label="sinx")
plt.legend()
plt.show()
2、seaborn:
python
import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
"""
卸载python中已经安装的表:
pip uninstall 包的名称
"""
# 使用色啊born绘制散点图:
x = np.linspace(0, 100, 100)
y = x ** 2
sns.jointplot(x=x, y=y)
x1 = np.linspace(0, 100, 100)
y1 = x ** 4
line = pd.DataFrame(
{
"x": x1,
"y": y1
}
)
sns.jointplot(x="x", y="y", data=line)
plt.show()
# 箱线图:判断数据是否存在离群值:boxplot
ages = [1, 2, 4, 5, 100, 29, 10]
sns.boxplot(x=ages)
plt.show()
# 直方图:
# 生成一个标准的正态分布图:
x2 = np.random.normal(size=10000)
sns.histplot(x=x2)
plt.show()
#壮壮图:
#sns.countplot(x=x2,data="students")
#核密度图
x3 = np.random.normal(size=10000)
sns.kdeplot(x=x3,fill=True,color="b")
plt.title("这是和密度图")
#设置他的语言的格式:微软黑体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.show()
#小提琴图:
sns.violinplot(x=ages)
plt.title("这是小提琴图")
plt.show()
#点对图:
x1 = np.linspace(0, 1, 100)
y1 = x ** 4
line = pd.DataFrame(
{
"x": x1,
"y": y1
}
)
sns.palplot(line)
plt.title("这是点对图")
plt.show()
#饼图:plot.pie()
"""
画图的工具:
matplotlib
seaborn
pyecharts(百度提供的一个画图工具)
"""
from pyecharts.charts import Bar
bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
# render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件
# 也可以传入路径参数,如 bar.render("mycharts.html")
bar.render()