python_pandas库
pandas简介
概述
Pandas 是 Pythonopen in new window 的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。Pandas 的目标是成为 Python 数据分析实践与实战的必备高级工具,其长远目标是成为最强大、最灵活、可以支持任何语言的开源数据分析工具。
适用数据类型:
- 与 SQL 或 Excel 表类似的,含异构列的表格数据;
- 有序和无序(非固定频率)的时间序列数据;
- 带行列标签的矩阵数据,包括同构或异构型数据;
- 任意其它形式的观测、统计数据集, 数据转入 Pandas 数据结构时不必事先标记。
环境安装
pip install numpy==1.21.6 -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple pandas
数据结构
Pandas是python第三方库,提供高性能易用数据类型和分析工具。Pandas基于NumPy实现,常与NumPy和Matplotlib一同使用。
Pandas 的主要数据结构是Series(一维数据)与 DataFrame(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例
pandas主要数据结构:
维数 | 名称 | 描述 |
---|---|---|
1 | Series | 带标签的一维同构数组,一维数据,一行或一列 |
2 | DataFrame | 带标签的,大小可变的,二维异构表格二维数据,整个表格,多行多列; |
Pandas 数据结构就像是低维数据的容器。比如,DataFrame 是 Series 的容器,Series 则是标量的容器。使用这种方式,可以在容器中以字典的形式插入或删除对象。
df.columns—列,字段 df.index—行索引
Series
Series是一种类似于一维数组的对象,它是由一组数据(不同数据类型),以及一组与之相关的数据标签(即索 )组成.
创建数据
-
使用数据列表产生最简单的Series
def ser(): # 使用列表/元组数据产生series数据 data = pd.Series([1, "aa", "Hello World"]) # 打印索引序列 print(data.index) # 打印数据列表 print(data.values)
-
创建自带索引的数据
def ser2():
# 在数据列表后面增家index配置,自定义索引
data = pd.Series([1, "aa", "Hello World"], index=["青蛙", "蛤蟆", "牛蛙"])
print(data)
-
使用字典创建Series
def ser3(): # 使用字典创建Series对象 data = pd.Series({"大象": "象牙山", "老虎": "泰哥", "狗熊": "光头强"}) print(data)
访问数据
通过索引访问
def ser3():
# 使用字典创建Series对象
data = pd.Series({"大象": "象牙山", "老虎": "泰哥", "狗熊": "光头强"})
# 访问一个值
print(data["大象"])
# 访问多个值,返回Series
print(data[["大象", "狗熊"]])
DataFrame
创建/访问
"""
@File : 表格读取.py
@Author : hqyj_cl
@Date : 2023/11/16
"""
import pandas as pd
weather = pd.read_excel('./excel/weather.xlsx')
# 访问前几行
print(weather.head(3))
# 访问后几行
print(weather.tail(3))
# 查看序列
print(weather.index)
# 查看数据
print(weather.values)
# 列行访问
print(weather['weather_id'][0])
# loc访问 loc[行][列]
print(weather.loc[0]['weather_id'])
# iloc范文,纯索引访问 iloc[行][列]
print(weather.iloc[0][0])
print(weather.iloc[0][1])
# 控制填充
print(weather.fillna(0))
# 判断是否为空
print(weather.isnull())
print(weather.notnull())
# 排序 ascending=False 降序排列,默认为True,升序排列
print(weather.sort_values('heat',ascending=False)) # 根据列排序
print(weather.sort_index())
但是最常用创建DataFrame的方式是读取文件数据;
特性
Pandas 所有数据结构的值都是可变的,但数据结构的大小并非都是可变的,比如,Series 的长度不可改变,但 DataFrame 里就可以插入列。Pandas 里,绝大多数方法都不改变原始的输入数据,而是复制数据,生成新的对象。 一般来说,原始输入数据不变更稳妥。
pandas使用
pandas数据读取/存储
pandas需要先读取表格类型得数据,然后才能进行分析
数据类型 | 说明 | pandas读取方法 |
---|---|---|
csv,tsv,txt | 使用逗号,分割的纯文本文件 | pd.read_csv |
excel | 表格 | pd_read_excel |
mysql | 关系型数据库 | pd.read_sql |
读取csv文件数据
read_csv()方法:
filepath_or_buffer
:要读取的CSV文件的路径或URL。
sep
:指定字段之间的分隔符,默认为逗号(‘,’)。
header
:指定哪一行应该作为列名,默认为0,表示使用第一行作为列名。如果设置为None,则不使用列名。
index_col
:指定哪一列作为索引列。默认为None,表示不使用索引列。
usecols
:指定要读取的特定列,可以是列名列表或列索引列表。
dtype
:指定每列的数据类型。可以是字典,将列名映射到数据类型,或者是一个数据类型,将所有列都设置为相同的数据类型。
skiprows
:跳过指定行数的行。
nrows
:仅读取指定行数的行。
def read():
#读取文件内部数据
data = pd.read_csv('ss.csv')
print(data)
# head()方法获取前面几排数据,如果没有参数则默认10行
print(data.head())
# 获取数据的行数,列数(2282, 12),也就是数据形状
print(data.shape)
# 获取数据列名
print(data.columns)
# 获取每行数据索引
print(data.index)
# 获取每列的数据类型
print(data.dtypes)
读取excel表格数据
def readExcel():
data = pd.read_excel('ss.xlsx', 'Sheet1')
print(data)
# 获取前几排数据
print(data.head())
# 获取数据的行数,列数(2282, 12),也就是数据形状
print(data.shape)
# 获取数据列名
print(data.columns)
# 获取每行数据索引
print(data.index)
# 获取每列的数据类型
print(data.dtypes)
读取数据库数据
def read_sql():
# 获取数据库连接
con = pymysql.connect(host="localhost", port=3306, user="root", password="root", db="finance")
# 通过sql语句读取数据库数据
data = pd.read_sql("select * from `user`", con=con)
print(data)
数据存储
import pandas as pd
from sqlalchemy import create_engine
# pandas文件类型:excel文件,csv文件,sql文件
import pymysql
data = {"序号": [1, 2, 3, 4, 5], "姓名": ["张三", "李四", "张学友", "郭富城", "刘德华"]}
# 使用字典创建一个二维数组,此时的数据会发现会多出一列索引列
data = pd.DataFrame(data)
# print(type(data), data)
# 设置索引列(将序号列设置成索引列)
data = data.set_index("序号")
print(data)
# 存储到文件中
data.to_csv("./csv/startName.csv")
data.to_excel("./excel/startName.xlsx")
# to_sql()方法需要使用SQLAlchemy的数据库连接对象作为参数。
engine = create_engine('mysql+pymysql://root:root@localhost:3306/finance')
# name:数据库名称,con:数据库连接 if_exists:是否创建之后的处理, index:是否将索引作为序列
data.to_sql(name="start_name", con=engine, if_exists='replace', index=True)
查询数据
pandas查询数据的结果分三种类型他,也类似于我们数据库查询数据的结果,分别为 单个值,Series数据,dataFrame数据
loc方法
pandas的loc
是用于通过标签索引选取数据的方法。它主要用于定位和访问DataFrame或Series中的特定行和列。
df.loc[row_label, column_label]
row_label
:可以是单个标签、标签列表或布尔条件,用于选择行。column_label
:可以是单个标签、标签列表或布尔条件,用于选择列。- 使用:表示所有行或者列
使用单个lable值查询数据
行和列都可以传入单个值实现精确匹配
# 得到单个值
print(financeData.loc[600000, "最低价"])
使用值列表查询数据
# 得到给列表行的Series数据
print(financeData.loc[[600000, 600004, 600006], "开盘价"])
print(financeData.loc[600000, ["开盘价", "收盘价", "成交额"]])
# 得到给定区间的dataFrame数据
print(financeData.loc[[600000, 600012], ["最高价", "最低价"]])
使用值区间查询数据
# 得到给定行index区间的单列数据数据
print(financeData.loc[600000:600054, "开盘价"])
# 给定行index区间的多列数据
print(financeData.loc[600000:600012, ["开盘价", "收盘价"]])
# 给定列index区间数据
print(financeData.loc[600012, "股票名称":"收盘价"])
# 行列按index区间获取数据
print(financeData.loc[600012:600026, "股票名称":"收盘价"])
使用条件表达式查询数据
# 筛选开盘价数据这一列大于1000的数据,列为全部
print(df.loc[df["开盘价"] > 1000, :])
# 打印条件的数据
print(df["开盘价"] > 10)
# 多个条件,使用小括号将每个条件圈起来,通过&符号进行连接
print(df.loc[(df["开盘价"] > 500) & (df["成交量"] > 200000), :])
使用函数查询数据
pandas添加数据
赋值添加
def tianjia():
df = pd.read_csv("ss.csv")
# 新增列"涨跌价格",涨跌价格由收盘价-开盘价得来
df.loc[:, "涨跌价格"] = df["收盘价"] - df["开盘价"]
# 输出这几个价格
print(df.loc[:, ["开盘价", "收盘价", "涨跌额", "涨跌价格"]])
apply函数
pandas库中的apply函数是一种基于某个函数对DataFrame或Series中的数据进行逐行或逐列操作的方法。
使用方法为:df.apply(func,axis=…),其中,func是应用到每行或每列上的函数,axis表示在哪个维度(0表示列,1表示行)上执行该函数。如果是Series类型,则省略axis参数。
def tianjia():
df = pd.read_csv("ss.csv")
# 新增列"涨跌价格",涨跌价格由收盘价-开盘价得来
df.loc[:, "涨跌价格"] = df["收盘价"] - df["开盘价"]
# pandas中的apply方法是一种数据变换技术,它可以对DataFrame或Series对象的行或列进行元素级的函数应用。
# apply方法能够接受一个函数作为输入,并将该函数应用到指定的行或列上,然后返回一个新的DataFrame或Series对象。
df.loc[:, "股票走势"] = df.apply(fun1, axis=1)
# 输出这几个价格
print(df.loc[:, ["开盘价", "收盘价", "涨跌额", "涨跌价格","股票走势"]])
# 对某列的值进行计数,例:对股票走势这一列进行计数
print(df["股票走势"].value_counts())
def fun1(x):
if x["收盘价"] - x["开盘价"] > 0:
return "涨"
elif x["收盘价"] - x["开盘价"] < 0:
return "跌"
else:
return '不变'
assign方法
使用assign方法可以添加多个列
def assignTest1():
df = pd.read_csv("ss.csv")
# 同时多列数据进行添加
df = df.assign(
股票走势=df["开盘价"] - df["收盘价"],
涨跌价格=df["收盘价"] - df["开盘价"]
)
print(df.head())
按条件进行分组分别赋值
# 按条件进行分组分别赋值
def fuzhi():
df = pd.read_csv("ss.csv")
# 先赋值一列空值
df["走势"] = ""
# 根据数据关系对数据进行赋值
df.loc[df["收盘价"] >= df["开盘价"], "走势"] = "盈利"
df.loc[df["收盘价"] < df["开盘价"], "走势"] = "亏损"
print(df.loc[0:5, ["股票编号", "股票名称", "走势"]])
pandas数据统计
汇总类统计 唯一去重和按值计数
def huan():
df = pd.read_csv("ss.csv")
df = df.loc[:, ["股票名称", '开盘价', "收盘价", "最高价"]]
df["价格变化"] = df["收盘价"] - df["开盘价"]
print(df.head(5))
# 全局统计 含最小值 最大值 平均值等数据
print(df.describe())
# 唯一去重
print(df["价格变化"].unique())
# 按值计数
print(df["价格变化"].value_counts())
相关系数和协方差
在pandas中,可以使用corr()
函数计算相关系数,使用cov()
函数计算协方差。这些函数可应用于DataFrame或Series对象。
def xiangguan():
df = pd.read_csv("ss.csv")
df = df.loc[:, ["股票名称", "涨跌额", "成交量"]]
print(df.head(10))
# corr(): 用于计算两个或多个变量之间的相关性。默认情况下,它计算列与列之间的相关性,并返回一个相关系数矩阵。
# corr(method='pearson'): 设置方法参数来指定计算相关系数的方法。常见的相关系数方法包括Pearson相关系数(默认)、Spearman秩相关系数和
# KendallTau相关系数。
print(df.corr())
# 协方差(Covariance):cov(): 用于计算两个或多个变量之间的协方差。默认情况下,它计算列与列之间的协方差,并返回一个协方差矩阵。
print(df.cov())
pandas添加列警告
def aaa():
df = pd.read_csv("ss.csv")
# 先通过loc获取某几行数据,在添加"走势"列,此时会报警告SettingWithCopyWarning
# 原因:这个数据是通过条件获取到的子数据,并不是copy的原数据,所以不能在这儿更改列信息
# df.loc[df["开盘价"] > 200]["走势"] = df["收盘价"] - df["开盘价"]
# 解决方法1:
# df.loc[df["开盘价"] > 200, "走势"] = df["收盘价"] - df["开盘价"]
# 解决方法2:
data = df.loc[df["开盘价"] > 200].copy()
data["走势"] = df["收盘价"] - df["开盘价"]
print(data)
归根结底就是:pandas不允许先筛选子dataFrame在进行修改写入.
pandas数据排序
series排序
# series排序
def seriesSort():
df = pd.read_csv("ss.csv")
# 获取Series数据
data = df["开盘价"]
# 对Series进行排序 ascending:排序方式:默认true为升序排序 False为降序排序 inplace为是否改变原数据Series
print(data.sort_values(ascending=False, inplace=False))
print(data)
dataFrame排序
-
单列排序
def dataFrameSort(): df = pd.read_csv("ss.csv") # 对dataFrame进行排序:by:通过什么进行排序,可以是字符串或者列表(字符串) # ascending:bool或者list数据,升序还是降序,如果是多列对应着by的数据 inplace为是否改变原数据的dataFrame # 单列排序 print(df.sort_values(by="开盘价", ascending=False, inplace=False)) # 按照开盘价降序排列 print(df.sort_values(by="涨跌额", ascending=True, inplace=False)) # 按照涨跌额升序排列
-
多列排序
def dataFrameSort2(): df = pd.read_csv("ss.csv") # 对dataFrame进行排序:by:通过什么进行排序,可以是字符串或者列表(字符串) # ascending:bool或者list数据,升序还是降序,如果是多列对应着by的数据 inplace为是否改变原数据的dataFrame # 多列排序 print(df.sort_values(by=["开盘价", "涨跌额"], ascending=[True, False], inplace=False))
pandas数据可视化
将数据可视化的意义在于可以直观的看到数据之间的关系.将繁琐的数据展示到图表上.常用图表由柱形图,折线图,扇形图,箱型图,散点图等
安装:pip install matplotlib
参数列表
折线图
import matplotlib.pyplot as plt
import pandas as pd
# 设置字体
# plt.rcParams['font.sans-serif']=['SimHei']
# 读取表格内容
wd = pd.read_excel('./excel/weather.xlsx')
# 截取某些列
wd1 = wd.loc[:, ['area', 'heat', 'humidity']]
# 排序
print(wd1.sort_values("heat", ascending=False))
# 折线图配置
plt.plot(wd['area'], wd['heat'], label='温度')
# 标题设置
plt.title("温度折线图")
# 设置x,y轴标题
plt.xlabel("地区")
plt.ylabel("温度")
# 设置x轴字体斜体
plt.xticks(wd["area"], rotation=45)
# 设置y轴负数
plt.ylim([-5, 5])
# 图例/图表展示
plt.legend()
plt.show()
柱形图
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 设置字体
# plt.rcParams['font.sans-serif']=['SimHei']
# 读取表格内容
wd = pd.read_excel('./excel/weather.xlsx')
# 截取某些列
wd1 = wd.loc[:, ['area', 'heat', 'humidity']]
# 排序
print(wd1.sort_values("heat", ascending=False))
# 柱形图配置
# x:x轴数据 height:y轴数据 width:宽度 color:颜色
plt.bar(x=wd1["area"], height=wd1["heat"], color="red", width=0.4,label="温度")
# 相邻柱状图g
plt.bar(x=np.arange(len(wd1["area"])) + 0.4, height=wd1["humidity"], color="blue", width=0.4,label="相对湿度")
# 标题设置
plt.title("温度柱形图图")
# 设置x轴字体斜体
plt.xticks(wd["area"], rotation=45)
# 图例/图表展示
plt.legend()
plt.show()