# -*- coding = utf-8 -*-
# @Time : 2022/7/5 09:22
# @Author : lxw_pro
# @File : Pandas 参数axis-10.py
# @Software : PyCharm
# Pandas的axis参数
'''
axis=0或index:
如果是单行操作,指的是某一行
如果是聚合操作,指的是跨行cross rows
axis=1或columns:
如果是单行操作,指的是某一列
如果是聚合操作,指的是跨列cross columns
【也就是哪个axis变,哪个axis就动,其余的保持不动】
'''
import pandas as pd
import numpy as np
df = pd.DataFrame(
np.arange(12).reshape(4, 3),
columns=['A', 'B', 'C']
)
print(df)
# 1-单列drop, 就是删除某一列
print(df.drop("A", axis=1)) # 代表删除A列
# 2-单列drop,就是删除某一行
print(df.drop(1, axis=0)) # 代表删除1行
# 3-按axis=0或index执行mean聚合操作
print(df.mean(axis=0))
# 4-按axis=1或columns执行mean聚合操作
print(df.mean(axis=1))
def get_sum_val(x):
return x['A']+x['B']+x['C']
df["sum_val"] = df.apply(get_sum_val, axis=1)
print(df)
# Pandas 索引index
'''
index的用途总结:
更方便的数据查询
使用index可获得性能提升
自动的数据对齐功能
更多更强大的数据结构支持
'''
import pandas as pd
lxw = pd.read_csv('nba.csv')
print(lxw.head())
print(lxw.count())
# 使用index查询数据
lxw.set_index("Name", inplace=True, drop=False)
print(lxw.index)
# 使用columns的condition查询方法
print(lxw.loc[lxw['Weight'] == 220.0].head())
# 2-使用index会提升查询功能
'''
如果index是唯一的,Pandas会使用哈希表优化,查询性能为O(1)
如果index不是唯一的,但是有序,Pandas会使用二分查找算法,查询性能为O(logN)
如果index完全是随机的,那么每次查询都要扫描全表,查询性能为O(N)
'''
# 完全随机的顺序查询
# 将数据随机打散
from sklearn.utils import shuffle
df_shuffle = shuffle(lxw)
print(df_shuffle.head())
# 索引是否是递增的
print(df_shuffle.index.is_monotonic_increasing) # 输出 False
# 将index排序后的查询
df_sorted = df_shuffle.sort_index()
print(df_sorted.head())
# 索引是否为递增
print(df_sorted.index.is_monotonic_increasing) # 输出 False
print(df_sorted.index.is_unique) # 输出 False
s1
# 使用index能自动对齐数据【包括Series、DataFrame】
s1 = pd.Series([1, 2, 3], index=list('abc'))
print(s1)
s2
s2 = pd.Series([2, 3, 4], index=list('bcd'))
print(s2)
s1和s1相加
print(s1+s2)
# 使用index更多更强大的数据结构支持
'''
很多强大的索引数据结构:
Categoricallndex 基于分类数据的index,提高性能
Multilndex 多维索引,用于groupby多维聚合后结果等
Datatimelndex 时间类型索引,强大的日期和时间的方法支持
'''
# SciPy 插值
'''
在数学的数值分析领域中,插值是一种通过已知的、离散的数据点,在范围内推求新数据点的过程或方法
SciPy 提供了 scipy.interpolate 模块来处理插值
'''
# 一维插值
# 一维数据的插值运算可以通过方法 interp1d() 完成
from scipy.interpolate import interp1d
import numpy as np
xw = np.arange(10)
yw = 2*xw+1
lxw = interp1d(xw, yw)
newarr = lxw(np.arange(2.0, 2.9, 0.2))
print(newarr) # 输出 [5. 5.4 5.8 6.2 6.6]
# 单变量插值
# 单变量插值使用 UnivariateSpline() 函数,该函数接受 xs 和 ys 并生成一个可调用函数,该函数可以用新的 xs 调用
from scipy.interpolate import UnivariateSpline
import numpy as np
xd = np.arange(10)
yd = xd**2+np.cos(xd)-1
lxw2 = UnivariateSpline(xd, yd)
newarr2 = lxw2(np.arange(2.0, 2.9, 0.2))
print(newarr2) # 输出 [2.41685864 3.21741879 4.11840978 5.11812233 6.21484715]
# 径向基函数插值
# 径向基函数是对应于固定参考点定义的函数
from scipy.interpolate import Rbf
xj = np.arange(10)
yj = xj**2+np.cos(xj)-1
lxw3 = Rbf(xj, yj)
newarr3 = lxw3(np.arange(2.0, 2.9, 0.2))
print(newarr3) # 输出 [2.58385316 3.22849074 3.99463461 4.88135567 5.88656925]
# Matplotlib 饼图
# 饼图是圆形图,将其分成多个切片以说明数值比例
from matplotlib import pyplot as plt
bc = ['Python', 'Java', 'C', 'MySQL']
cj = [91, 78, 82, 87]
colors = ['blue', 'gold', 'yellowgreen', 'red']
plt.pie(cj, labels=bc, colors=colors, autopct='%1.1f%%', shadow=True, startangle=90)
plt.axis('equal')
plt.show()
# Matplotlib 轴标签和标题
# 使用 xlabel() 和 ylabel() 方法来设置 x 轴和 y 轴的标签
# 可以使用 title() 方法来设置标题
import matplotlib.pyplot as plt
import numpy as np
sz1 = np.array([2, 5, 8, 9])
sz2 = np.array([6, 5, 2, 1])
plt.plot(sz1, sz2)
plt.title("lxw's sz")
plt.xlabel("sz1")
plt.ylabel("sz2")
plt.show()
# Matplotlib 网格线
# 可使用 pyplot 中的 grid() 方法来设置图表中的网格线。
'''
grid() 方法语法格式如下:
matplotlib.pyplot.grid(b=None, which='major', axis='both', )
参数说明:
b:可选,默认为 None,可以设置布尔值,true 为显示网格线,false 为不显示,如果设置 **kwargs 参数,则值为 true。
which:可选,可选值有 'major'、'minor' 和 'both',默认为 'major',表示应用更改的网格线。
axis:可选,设置显示哪个方向的网格线,可以是取 'both'(默认),'x' 或 'y',分别表示两个方向,x 轴方向或 y 轴方向。
**kwargs:可选,设置网格样式,可以是 color='r', linestyle='-' 和 linewidth=2,分别表示网格线的颜色,样式和宽度。
'''
# 添加一个简单的网格线
import matplotlib.pyplot as plt
import numpy as np
x = np.array([1, 4, 7, 9])
y = np.array([2, 9, 3, 8])
plt.title("lxw's grid")
plt.xlabel('x')
plt.ylabel('y')
plt.plot(x, y)
plt.grid()
plt.show()
# 设置在y轴方向显示网格线
plt.plot(x, y)
plt.grid(axis='x')
plt.show()
# 添加一个简单的网格线,并设置网格线的样式
import matplotlib.pyplot as plt
import numpy as np
a = np.array([2, 9, 4, 8])
b = np.array([3, 1, 9, 6])
plt.title("lxw's grid text")
plt.xlabel('a')
plt.ylabel('b')
plt.plot(a, b)
plt.grid(color='b', linestyle='--', linewidth=0.6)
plt.show()
所有的真理都要经过三个阶段:首先,受到嘲笑;然后,遭到激烈反对;最后,被理所当然地接受。