Python基础语法(下)+ 数据可视化
- 一、函数
- (一)函数的定义
- (二)函数的调用和传参
- 二、文件操作
- (一)文件读取和写入
- (二)文件对象及方法
- (三)实例
- 三、模块的安装与导入
- (一)pip包管理
- (1)库的安装
- (2)库的导入
- (二)几个常用库的常用操作
- (1)数值计算库Numpy
- (2)绘图库Matplotlib
- (3)表格库Pandas
- 四、实战项目
- (一)使用二分法求解超越方程 ex = pi 的解
- (二)曲线拟合(数学建模)
一、函数
(一)函数的定义
- 函数代码块以 def 关键词开头后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定
义参数。- 函数的第一行语句可以选择性地使用文档字符串——用于存放函数说明
- 函数内容以冒号:起始,并且缩进,return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None.
(二)函数的调用和传参
def multiply(b,a=2): # 缺省值
return a * b
print(multiply(1))
def isprime(num):
"""
判断是否为质数
:param num:
:return:
"""
for i in range(2,num):
if num % i == 0:
return False
return True
print(isprime(6))
print(isprime(13))
二、文件操作
(一)文件读取和写入
打开一个文件
- Python open() 方法用于打开一个文件,并返回文件对象。
- 在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。
- 注: 使用 open()方法
一定要保证关闭文件对象
,即调用 close() 方法。- open()函数常用形式是接收两个参数:
文件名(file)和模式(mode)
。
(二)文件对象及方法
file 对象使用open函数来创建
(三)实例
(1)注:
- utf-8 编码方式将中英文编码进行了统一,如果不加且file_sample中有中文,会编码失败
- 为了防止忘记手动关文件,用
with as
:程序结束后,文件就自动释放掉了
## 1、文件的读取
# 法一:
file_sample = open(file="sample.txt",mode="r",encoding="utf-8")
content = file_sample.readlines()
for line in content:
print(content) # 不加循环,读出来是一行列表
file_sample.close()
# 法二:为了防止忘记手动关文件
with open(file="sample.txt",mode="r",encoding="utf-8") as file_sample:
content = file_sample.readlines()
for line in content:
print(content)
## 2、文件的写入
with open(file = "sample.txt",mode="w",encoding="ulf-8") as file_sample:
file_sample.write("大家好!")
(2)将100以内的质数都存到一个文件夹中,每行只能写10个数字
def isprime(num):
for i in range(2, num):
if num % i == 0:
return False
return True
with open(file="prime.txt",mode="w") as file:
count = 0
for num in range(2,100):
if isprime(num):
print(num)
count += 1
file.write(str(num) + ", ") # TypeError: write() argument must be str, not int
if count % 10 == 0:
file.write("\n")
三、模块的安装与导入
(一)pip包管理
(1)库的安装
通过 pip 来安装库
pip 是 Python 包管理工具,该工具提供了对 Python 包的查找、下载、安装、卸载的功能。
指令 | 含义 |
---|---|
pip --version | 查看当前pip的版本 |
pip install + 包名 | 安装包 |
pip uninstall + 包名 | 卸载包 |
pip list | 查看已经安装了哪些库 |
(2)库的导入
## 法一:
import numpy as np
a = 1
b = 2
print(np.add(a,b))
## 法二:
from numpy import add
a = 1
b = 2
print(add(a,b))
(二)几个常用库的常用操作
(1)数值计算库Numpy
指令:pip install numpy
import numpy as np
- 数组的创建(列表转为数组)
arr = np.array([1,2,3,4,5]) # 列表转为数组
print(arr)
print(type(arr)) # numpy.ndarray --> N-dimensional array
arr = np.array([[1,2,3],[2,3,4],[3,4,5],[4,5,6]])
print(arr)
print(type(arr)) # numpy.ndarray
print("数组形状",arr.shape) # (4, 3)四行三列
辨析:
(一)
. 后
区分:
1、(numpy.ndarray).属性
(Property、Field)/.内部变量
(Variable)
2、(numpy.ndarray).函数()
(Method、Function)
(二)函数(Function)和方法(Method)的区别:
与类和实例 无 绑定关系的function都属于 函数(function);
与类和实例 有 绑定关系的function都属于 方法(method)。
- 索引和切片
arr = np.array([[1,2,3],[2,3,4],[3,4,5],[4,5,6]])
print(arr[0])
print(arr[0:3])
print(arr[1][2])
- 基本运算:+ - * / 对应位置上的元素进行 加减乘除
print([1,2,3]+[4,5,6]) # 相当于列表拼接
print(np.array([1,2,3]) + np.array([4,5,6])) # 相当于向量相加
print(np.array([1,2,3]) * np.array([4,5,6]))
- 数组形状操作
arr = np.array([[1,2,3],[2,7,4],[99,4,5],[14,15,6]])
print(arr.shape)
new_arr = arr.reshape(2,6)
print(new_arr,"\n新数组的形状是",new_arr.shape)
new_arr_T = new_arr.transpose() # 转置
print(new_arr_T,"\n新数组转置后的形状是",new_arr_T.shape)
- 进阶使用(线性代数、统计学)
另:快捷键 ctrl+D 快速复制此行内容到下一行
arr = np.array([[1,2,3],[2,7,4],[99,4,5],[14,15,6]])
arr1 = np.array([1,2,3])
arr2 = np.array([4,5,6])
arr1_dot_arr2 = np.dot(arr1,arr2) # 数组的点乘
print(arr1_dot_arr2)
print("数组的平均值",arr.mean()) # 写法一:对象内部函数的使用
print("数组的平均值",np.mean(arr)) # 写法二:将对象作为参数传入
print("数组的最大值",arr.max())
print("数组的最小值",arr.min())
print("数组的标准差",arr.std())
print("数组的和",arr.sum())
print("数组的排序\n",np.sort(arr)) # sort 是 numpy的内部函数,不是 nd数组的内部函数
print("数组的排序\n",np.sort(arr.reshape(-1))) # -1 变成一行
# 筛选
print(arr > 10)
print(arr[arr > 10]) # 通过True、False数组筛选
print(arr[(arr > 5) & (arr < 10)]) # 不能用 and (前后都只有一个量才适用),前后多个量用 & (每一位上做 and 判断)
print(arr[(arr > 5) | (arr < 10)]) # | 按位或 等效于在每一位上进行 or
注:
1、and、or
只适用于 前后都只有一个量 的情况
2、&
按位与 等效于在 每一位上进行 and
3、|
按位或 等效于在 每一位上进行 or
4、sort 是 numpy的内部函数,不是 nd数组的内部函数,只能np.sort(arr),不能 arr.sort()
- 数据的保存与导入(.npy)
arr = np.array([[1,2,3],[2,7,4],[99,4,5],[14,15,6]])
np.save("arr",arr)
arr = np.load("arr.npy")
print(arr)
练习
用numpy创建一个4x4的随机数组,只保留10以内的数,并计算出所以元素的和
import numpy as np
np.random.seed(1) # 固定随机数(想让每次随机结果可复现)
print(np.random.rand()) # rand()返回0~1的随机浮点数
arr = np.random.randint(0,100,16).reshape(4,4) # randint(m,n,k)返回m~n的随机整数k个
print(arr)
print(arr[arr <= 10])
print(np.sum(arr[arr <= 10]))
(2)绘图库Matplotlib
指令:pip install matplotlib
参考网站:matplotlib.org(包含 图+示例代码)
import matplotlib.pyplot as plt # 只用到了绘图操作
import numpy as np # 数值操作需要用到
- 参数设置(直接复制在绘图语句最前面即可)
# plt默认的设置里面没有中文字体,中文显示不出来 --> 设置字体
from matplotlib.pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 减号和中文的折线又冲突了 --> 再改一下参数
mpl.rcParams['axes.unicode_minus'] = False
- 多个函数绘制到一个图中
# 模拟数据点
x = np.linspace(0,10,10) # 0~10取10个浮点数(10等分)
y = np.sin(x)
# 模拟通过数据点建模,找方程,求拟合参数 --> 平滑的拟合图像
x2 = np.linspace(0,10,100) # 0~10取100个浮点数(100等分)
y2 = np.sin(x2)
plt.xlabel("x")
plt.ylabel("y")
# 绘制到一个图中
plt.scatter(x,y,marker='*',c='r',label="数据点") # marker 点的样式
plt.plot(x2,y2,linestyle='--',label="拟合结果")
plt.legend() # 对各种图标进行标注,加此语句标签(label)才可显示出来
plt.show()
- 一个图中绘制多个函数
# fig(figure --> 整个窗口)、axes:列表(一套axis坐标轴 --> 子图)
# subplots()生成了窗口的句柄(智能指针),要通过句柄内的操作绘图
fig,axes = plt.subplots(1,2)
axes[0].scatter(x,y,marker='*',c='r',label="数据点")
axes[0].set_xlabel("x1") # 子图和图相关参数的设置函数不同
axes[0].set_ylabel("y")
axes[0].set_title("数据点")
axes[1].plot(x2,y2,linestyle='--',label="拟合效果")
axes[1].set_xlabel("x2")
axes[1].set_title("拟合结果")
fig.legend()
fig.show()
4. 直方图
x = [1,2,3]
y = [2,4,10]
plt.bar(x,y)
plt.show()
(3)表格库Pandas
指令:pip install pandas
import pandas as pd
以鸢尾花的数据为例:
- Python 中 Excel 的创建
pandas中的 DataFrame 数据类型 == pandas 提供的 excel表
data = {'样本号':[1,2,3],'萼片长(cm)':[8.9,2.1,4.5],'类型_num':[0,0,1]}
datadf = pd.DataFrame(data)
print(datadf)
-
读取Excel
openpyxl 为读取excel用的引擎,要先安装这个库
# 读取EXCEL函数
df = pd.read_excel("鸢尾花训练数据.xlsl",sheet_name="sheet1",engine="openpyxl")
print(type(df)) # <class 'pandas.core.frame.DataFrame'>
- 数据清洗(预处理)
-
拿基础信息
数据量非常大,用 Excel 打不开时,这一步很关键
print(df.head(5)) # df.head(n) 提取表格的前 n 行信息
print(df.info()) # 提取表格基本信息
缺失值的处理
print(df.head(10))
df = df.dropna() # 丢掉缺失值
print(df.head(10))
print(df.info())
df['类型_num'] = df['类型_num'].astype(float) # 更改数据类型
print(df.info())
变化1:
变化2
数据的选择和过滤
# <<<< 一种类的筛选 >>>>
# df['类型_num'] 提取列,df['类型_num'] == 1 返回真假
df_1 = df[df['类型_num'] == 1]
print(df_1.head())
print(df_1.info())
# <<<< 3σ 筛选 >>>>
lb = df['花瓣宽(cm)'].mean() - 3 * df['花瓣宽(cm)'].std() # lower bound 下界
ub = df['花瓣宽(cm)'].mean() + 3 * df['花瓣宽(cm)'].std() # upper bound 上界
selected_df = df[(df['花瓣宽(cm)'] >= lb) & (df['花瓣宽(cm)'] <= ub)]
print(selected_df.info())
练习
自己创建一个dataframe,包含:姓名、身高、体重、成绩。输出第一名的学生,计算平均分并输出低于60分的同学的名字
import numpy as np
import pandas as pd
data = {'姓名':["张三","李四","王五","老六","赵七"],