【玩转pandas系列】pandas加载数据,分箱操作和时间序列,绘制图形

news2024/12/26 11:34:24

知识目录

  • 前言
  • 一、加载数据
    • 1 - 加载CSV文件
    • 2 - 加载Excel文件
    • 3 - 加载数据库数据
  • 二、分箱
    • 1 - 等宽分箱
    • 2 - 等频分箱
  • 三、时间序列
    • 1 - Timestamp和Period的创建
    • 2 - 索引和切片
    • 3 - 属性和移动
    • 4 - 频率转换
    • 5 - 数据聚合
  • 四、pandas绘制图形
    • 1 - 折线图
    • 2 - 柱状图
    • 3 - 直方图
    • 4 - 饼图
    • 5 - 散点图
    • 6 - 箱型图
    • 7 - 面积图
  • 结语

前言

一、加载数据

以前我们在练习的时候,基本上使用的是我们模拟出来的数据,但是在真实业务场景中,数据一般是已经存在的,少数需要使用爬虫技术获取。已经存在的数据,一般有CSV格式,Excel格式和数据库中存储的数据

下面,我们就针对 pandas 如何加载和存储这些格式的数据进行一个简单介绍。

Tips⭐️:存储数据到文件是 dataframe 对象调用,读取文件是 pandas 调用。

1 - 加载CSV文件

CSV(逗号分隔值)文件可以方便地在不同的操作系统、软件和平台之间传输和读取,因此常被用于数据存储和数据交换。

例如,网站的用户注册数据、市场调研数据等都可以以CSV文件的形式进行存储和传输。

  • 存储到CSV文件
df.to_csv(path_or_buf=None,
    sep=',',
    columns=None,
    header=True,
    index=True
    )
参数含义
path_or_buf存储路径和文件名
sep分隔符,默认为逗号
columns要存储的列,如果不指定则存储全部列
header是否保留列名
index是否保留行索引

下面是代码示例:

# 导入模块
import numpy as np
import pandas as pd

# 创建要存储到csv文件的dataframe对象
data = np.random.randint(0,100,(5,3))
df = pd.DataFrame(data,columns=['Python','Java','BigData'])

# 存入到当前目录下的07.csv文件中
df.to_csv(path_or_buf='./07.csv',sep=',',header=True,index=False)
  • 读取CSV文件
pd.read_csv(
    filepath_or_buffer: Union[str, pathlib.Path, IO[~AnyStr]],
    sep=',',
    header='infer',
    names=None,
    index_col=None,
    usecols=None,
)
参数作用
filepath_or_buffer文件路径和文件名,或IO对象
sep分隔符,默认是逗号
header默认=0,表示使用第一行作为列名
names列表类型,在没有指定header的情况下,如果指定了names,那么将names作为列名
index_col指定某列作为行索引
usecols只读取某些列,默认读取全部

下面是代码示例:

# 读取当前路径下的07.csv的Java列
pd.read_csv(filepath_or_buffer='./07.csv',sep=',',header=0,usecols=['Java'])

2 - 加载Excel文件

对于不懂编程的人来说(比如会计、文员等和计算机专业性不太相关的职业),excel 文件是他们用的比较多的数据文件存储格式。

  • 存储到Excel文件
df.to_excel(
    excel_writer,
    sheet_name='Sheet1',
    columns=None,
    header=True,
    index=True,
)
参数含义
excel_writer文件路径和文件名
sheet_name写入excel时当前 sheet 页的名字
columns要写入的属性列
header将 df 对象哪一行作为列名
index是否保留行索引

代码示例:

df.to_excel('./07.xlsx',sheet_name='Program Language',index=False)
  • 读取Excel文件
pd.read_excel(
    io,
    sheet_name=0,
    header=0,
    names=None,
    index_col=None,
    usecols=None,

参数和读取CSV文件的参数含义是类似的,这里不再解释啦 ~

3 - 加载数据库数据

加载数据库数据,是涉及到许多后端存储数据的业务场景,这里以 MySQL 数据举例。

加载MySQL数据库数据首先要安装两个包(pymysqlsqlalchemy

pip install pymysql -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install sqlalchemy -i https://pypi.tuna.tsinghua.edu.cn/simple
  • 存储到MySQL
df.to_sql(
    name,
    con,
    schema=None,
    if_exists='fail',
    index=True,
)
参数含义
name指定要存储的表名
con连接对象
schema数据库引擎,不指定则使用数据库类型的默认引擎,如MySQL使用 innoDB
if_exists表已存在时的操作,有{'fail', 'replace', 'append'}三种取值,分别表示报错,替换,追加
index是否写入行索引

代码示例:

# 导入创建数据库连接的引擎
from sqlalchemy import create_engine

# 获取连接对象
conn = create_engine("mysql+pymysql://root:123456!!!!@localhost:3306/pytest")

# 保存到MySQL数据库
df.to_sql(name='program_language',con=conn,if_exists='append',index=False)

注意:在创建连接对象的字符串中,只需要修改数据库账号和密码(root:123456!!!!IP端口)即可。

  • 从MySQL读取
pd.read_sql(
    sql,
    con,
    index_col=None,
    coerce_float=True,
    parse_dates=None
)
参数含义
sqlSQL命令字符串
con连接sql数据库的engine,一般可以用SQLalchemy或者pymysql之类的包建立
index_col选择某一列作为index
coerce_float非常有用,将数字形式的字符串直接以float型读入
parse_dates将某一列日期型字符串转换为datetime型数据

代码示例:

sql = 'SELECT Python FROM program_language;'
pd.read_sql(sql,conn)

二、分箱

分箱操作是指将连续数据离散化(通俗得讲,就是将数据分到几个区间上,比如有1-100的100个数,分为0-25,25-50,50-75,75-100,这就是分箱操作)。常见的分箱方法有等宽法和等频法。

等宽法:离散化后的每个区间的差值相等。

这样的缺点是可能会不同区间包含的元素数量相差较大。

等频法:离散化后的每个区间内包含的元素数量相等。

这样的缺点是可能会将相同的元素划分到不同的区间里。

1 - 等宽分箱

通过 pandas 的 cut() 函数实现等宽分箱。

# 待分箱数据
year = [1992, 1983, 1922, 1932, 1973]   
# 指定箱子的分界点
bins = [1900,  1950,  2000]   

# 分箱操作
result = pd.cut(year, bins) 
# 结果显示的是每个数据在哪个区间内
print(result) 

# 对不同箱子中的数进行计数
print(pd.value_counts(result))   

# labels参数为False时,返回结果中用不同的整数作为箱子的标签
result2 = pd.cut(year, bins,labels=False)
# 输出结果中的数字对应着不同的箱子
print(result2)
# 对不同箱子中的数进行计数
print(pd.value_counts(result2))   

# 给箱子指定标签
group_names = [ '50_before', '50_after']
result3 = pd.cut(year, bins, labels=group_names)
print(pd.value_counts(result3))

2 - 等频分箱

利用 pandas 中的 qcut 函数进行等频分箱,分箱后每个箱子的数据量一样。

# 待分箱数据
year2 = [1992, 1983, 1922, 1932, 1973, 1999, 1993, 1995]   
# 参数q指定所分箱子的数量   
result4 = pd.qcut(year2,q=4)   
# 从输出结果可以看到每个箱子中的数据量时相同的
print(result4)

print(pd.value_counts(result4))  

三、时间序列

在进行时间序列相关的数据分析时,时间序列处理是自然而然的事情,pandas 提供了许多用于处理时间序列的方法。注意:本文仅简单介绍 pandas 处理时间序列的相关方法,欲知更多请结合其他资料。


在介绍时间序列之前,需要先介绍两个概念:时间戳 pd.Timestamp 和时间段 pd.Period

时间戳:Timestamp 是最基本的时间序列数据,用于把数值与时点关联在一起。 pandas对象通过时间戳调用时点数据。

时间段:Period 表示的时间段更直观,还可以用日期时间格式的字符串进行推断。

时间戳和时间段都可以与整数做加减运算,以 freq 指定的参数为单位。

1 - Timestamp和Period的创建

# 创建时间戳
ts1 = pd.Timestamp('2023-8-5')
# 创建时间段
pd1 = pd.Period('2023-8-5',freq='M') 
# 创建时间戳范围(periods表示数据量,freq 表示精确到年/月/日)
ts2 = pd.date_range('2022-02-7',periods=4,freq='M')
# 创建时间段范围
pd2 = pd.period_range('2023-8-5',periods=4,freq='M')
display(ts1,ts2,pd1,pd2)

# 时间戳索引
index = pd.date_range('2023-8-5',periods=4,freq='D')
s = pd.Series(np.random.randint(0,10,4),index=index)
s

此外,还有一些和时间戳相关的转换。pd.to_datetime:字符串或时间戳转时间格式,pd.DateOffset:运算时间差。

# 字符串转日期
pd.to_datetime(['2023-8-4','2023/8/4','08/04/2023','2023.8.4'])
# 时间戳转日期
pd.to_datetime([1233123123],unit='ms')
# 计算时间差
ts = pd.Timestamp('2023-8-5')
ts + pd.DateOffset(hours=1,days=-1)

2 - 索引和切片

时间戳的索引和切片,和数组索引和切片类似,都是使用中括号。

# 首先创建时间戳对象
index = pd.date_range('2023-8-5',periods=100,freq='D')
ts = pd.Series(range(len(index)),index)
# 索引
ts['2023-8-12'] # 取一天
ts['2023-8'] # 取8月整个月
ts['2023'] # 取一年
ts[pd.Timestamp('2023-8-20')] # 时间戳索引
# 切片
ts['2023-8-7':'2023-8-20']
ts[pd.Timestamp('2023-8-10'):pd.Timestamp('2023-8-20')] # 时间戳切片
ts[pd.date_range('2023-8-10',periods=4,freq='D')]

3 - 属性和移动

# 属性
ts.index # 索引
ts.index.year # 年份
ts.index.month # 月份
ts.index.dayofweek # 星期
# shift方法
index = pd.date_range('2023-1-20',periods=365,freq='D')
ts = pd.Series(np.random.randint(0,100,len(index)),index)
ts.shift() # 向下移动1位
ts.shift(2) # 向下移动两位
ts.shift(-2) # 向上移动两位

4 - 频率转换

频率转化是改变日期间隔的操作。

# 频率转换
# 由天变为星期,由少变多,去掉了一些数据
ts.asfreq(pd.tseries.offsets.Week())
# 由天变小时,多了一些空数据
ts.asfreq(pd.tseries.offsets.Hour())
# 使用 fill_value 填充
ts.asfreq(pd.tseries.offsets.Hour(),fill_value=0)

5 - 数据聚合

# 首先查看 ts
ts
# 将两天的日期合并,数据相加
ts.resample('2D').sum()
# 将两周的日期合并,数据相加
ts.resample('2W').sum()
d = {
    'price':np.random.randint(0,50,8),
    'score':range(10,90,10),
    'week':pd.date_range('2023-8-5',periods=8,freq='w')
}
df = pd.DataFrame(d)
df
# 对week列按月汇总
df.resample('M',on='week').sum()
# 按照月汇总,price求平均值,score求和
df.resample('M',on='week').agg({'price':np.mean,'score':np.sum})

在这里插入图片描述

四、pandas绘制图形

pandas 是数据处理的利器,其实它还可以基于 matplotlib快速绘制简单的图形,如果是复杂的图形,需要使用 matplotlib 或其他库。pandas通过 plot() 函数绘制各种图形。

因为 pandas 绘制图形是基于 matplotlib 的,因此要导入 matplotlib 包。

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

pandas绘制图形的写法有两种,是等价的写法,其中 pd 指的是 Series 对象或者 DataFrame 对象。

下面介绍这两种写法

pd.plot.图象类型()
pd.plot(kind = '图象类型')

举个例子

df = pd.DataFrame(np.random.randint(0,100,(4,2)),columns=list('AB'))
df.plot(kind = 'line')
# =====等价于=====
df.plot.line()
# =====都表示绘制折线图,饼图、直方图等都是这样=====

1 - 折线图

下面展示 Series 绘图

data = np.random.randint(0,50,20)
s = pd.Series(data=data)
# 等价于 s.plot(),s.plot(kind='line'),kind默认等于line,所以可以省略
s.plot.line() 

因为是随机产生的数据,你们画出来的折线图和我的可能会不一样。

下面是 DataFrame 绘图

data = np.random.randint(0,50,(4,3))
df = pd.DataFrame(data=data,index=list('ABCD'),columns=['Chinese','Math','English'])
df.T.plot(kind='line') # 转置后绘制折线图

2 - 柱状图

Series 绘制柱状图

data = np.random.randint(0,100,5)
s = pd.Series(data=data,index=['Chinese','Math','English','history','computer'])
s.plot(kind='bar')


DataFrame 绘制柱状图

data = np.random.randint(0,50,(4,3))
df = pd.DataFrame(data=data,index=list('ABCD'),columns=['Chinese','Math','English'])
df.plot(kind='bar') 


堆叠柱状图

df.plot(kind = 'bar',stacked = True)

# 条形图
df.plot(kind='barh')
# ====== df.plot.barh()

3 - 直方图

data = np.random.randint(0,50,(4,3))
df = pd.DataFrame(data=data,index=list('ABCD'),columns=['Chinese','Math','Englist'])
df.plot(kind='hist',density=True) 

4 - 饼图

data = np.random.randint(0,50,(4,3))
df = pd.DataFrame(data=data,index=list('ABCD'),columns=['Chinese','Math','Englist'])
df['Chinese'].plot(kind='pie',autopct='%.1f%%')

如果要对 dataframe 对象绘制饼图,需要加上 subplots=True 参数。

df.plot(kind='pie',autopct='%.2f%%',subplots=True) # 绘制子图

5 - 散点图

df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
df.plot.scatter(x='a', y='b')

6 - 箱型图

df.plot(kind='box')


图中数字处的含义:1处代表最大值,2处75%大,3处1/2大,4处25%大,5处是最小值。

7 - 面积图

df.plot.area(stacked=True)

每种颜色对应的区域面积即代表他们的大小。

结语

本文主要讲解了pandas加载数据,分箱操作以及时间序列,绘制各种图形。

⭐️如果有不懂的地方,欢迎大家和我一起探讨 ~

我是向阳花花花花,数据科学路上,与你同行 ⭐️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/857300.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Mysql】数据库基础与基本操作

🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风…

仓库出库入库都有哪些流程?详解仓库出入库管理规范

仓库出入库管理是指对仓库中物品的进出情况进行有效管理和跟踪,以确保库存的准确性、安全性和高效性。这是企业供应链管理的重要环节之一,涉及到物流、库存控制、订单处理和数据记录等方面。 阅读本文您将了解:一个完整的仓库出入库管理流程…

湘大 XTU OJ 1308 比赛 题解:循环结束的临界点+朴素模拟

一、链接 比赛 二、题目 题目描述 有n个人要进行比赛,比赛规则如下: 假设每轮比赛的人是m,取最大的k,k2^t且k≤m。这k个人每2人举行一场比赛,胜利者进入一下轮,失败者被淘汰。余下的m-k个人&#xff0…

GDB 里uint64位数据值

今天一来组长就让我查一个问题,说是我们的接口返回的数据需要赋值为-1,返回给上层调用。结果我一看代码,代码里就是写死了赋值 -1 的,但他说实际返回的好像不是 -1,所以只能让我gdb 跟踪一下了。本来想用 window 下的计…

将程序添加到右键菜单快速启动

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 效果如下 以 Windows Terminal 为例 打开注册表编辑器:按下 Win R 键,输入 regedit,然后按回车键打开注册表编辑器。 在注册表编辑器中导航到以下路径: HKE…

C++11实用技术(二)std::function和bind绑定器

C进阶系列目录 C operator关键字的使用(重载运算符、仿函数、类型转换操作符) C11实用技术(一)auto与decltype的使用 C11实用技术(二)std::function和bind绑定器 C11实用技术(三&#xff09…

2023年上半年软考高级信息系统项目管理师下午《案例分析》真题答案及解析

2023年上半年软考高级信息系统项目管理师下午《案例分析》真题答案及解析 试题一(25分) 阅读下列说明,回答问题1至问题4,将解答填入答题纸的对应栏内。 【说明】 为实现空气质量的精细化治理,某市规划了智慧环保项目。该项目涉及网格化监测…

工商银行福州分行开展"工行驿站盛夏关爱"主题活动

炎炎夏日,酷热难耐。为深入践行"金融为民、金融利民、金融惠民、金融安民"服务理念,进一步提升"工行驿站"服务口碑与社会形象,工商银行福州分行于2023年8月8日开展"工行驿站盛夏关爱"主题活动,聚焦…

[系统安全] 五十二.DataCon竞赛 (1)2020年Coremail钓鱼邮件识别及分类详解

您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系…

BabylonJS大场景优化案例

在本文中,我们将重点关注用于优化 Babylon.js 港口场景的优化和架构技术。 我们的场景总共有超过 600 个网格和 1,000,000 个顶点。 在我们的 2018 Macbook Pro 上的 Google Chrome 中,它始终以 45 FPS 的速度运行。 我们发现 Firefox 的帧速率约为 40 …

如何设计一个高性能/高并发/高可用/高可靠/可扩展的系统?

作者:阿秀 校招八股文学习网站:https://interviewguide.cn 这是阿秀的第「293」篇原创 小伙伴们大家好,我是阿秀。 面试者和求职者的关系就好像是矛与盾,一个拼命堆自己的防装,反伤刺甲、魔女斗篷都往身上穿&#xff1…

TCP 协议十大相关特性总结

目录 一、TCP特性 二、报文格式 TCP十大核心特性 1. 确认应答 2. 超时重传 3. 连接管理(三次握手,四次挥手) 三次握手 四次挥手 4. 滑动窗口 情况一:接收方的ACK丢失 情况二:发送方的数据包丢失 5. 流量控制 6. 拥塞控制 7. 延迟应答 8. 捎带应答 9. 字节流粘包问题 10. TCP的…

vue3+element-plus点击列表中的图片预览时,图片被表格覆盖

文章目录 问题解决 问题 视觉 点击图片进行预览&#xff0c;但还能继续选中其他的图片进行预览&#xff0c;鼠标放在表格上&#xff0c;那一行表格也会选中&#xff0c;如图所示第一行的效果。 代码 <el-table-column prop"id" label"ID" width"…

花样滑冰选手骨骼点动作识别

2023 CCF BDCI 基于飞桨实现花样滑冰选手骨骼点动作识别 16名方案以及总结 比赛任务 花样滑冰与其他运动项目相比&#xff0c;其动作类型的区分难度更大&#xff0c;这对识别任务来说是极大的挑战。对于花样滑冰动作识别任务&#xff0c;主要难点如下&#xff1a; (1) 花样滑…

10款数据可视化工具,同行公认的好BI

都说内行看门道&#xff0c;一款BI数据可视化工具好不好&#xff0c;同行心里比谁都清楚。那么&#xff0c;能够得到同行一致认可的BI数据可视化工具有哪些&#xff0c;各自又有着怎样的特色优势&#xff1f;接下来就来简单地总结下。 1、Tableau 这是一款普及率很高的数据可…

vscode格式化文档

vscode格式化文档后&#xff0c;换行比较短&#xff0c;看着难受&#xff0c;如下图&#xff1a; 解决方法&#xff1a;在vscode左下角找到设置 并搜索settings.json文件&#xff0c;粘贴如下代码&#xff0c;在格式化文档就会以设置的宽度换行 {// vscode默认启用了根据文…

代码随想录算法训练营day27 | 39. 组合总和,40. 组合总和 II,131. 分割回文串

目录 39. 组合总和 40. 组合总和 II 131. 分割回文串 39. 组合总和 难度&#xff1a;medium 类型&#xff1a;回溯 思路&#xff1a; 这道题的特点是&#xff0c;组合没有元素个数要求&#xff0c;数组无重复元素&#xff0c;每个元素可以无限选取。 组合没有元素个数要求…

linux环形缓冲区kfifo实践1

本次实验使用的kfifo相关宏 struct __kfifo {unsigned int in;unsigned int out;unsigned int mask;unsigned int esize;void *data;}; /** define compatibility "struct kfifo" for dynamic allocated fifos*/ struct kfifo __STRUCT_KFIFO_PTR(unsigned char, …

5.Eclipse的Ctrl+F快捷键搜索面板全功能详解

Eclipse的CtrlF快捷键详解 1.搜索/替换方向 Forward&#xff1a;向前 Backward&#xff1a;向后 2.范围&#xff1a;Scope All&#xff1a;全部&#xff08;当前文件&#xff09; Selected lines&#xff1a;选中的几行 3.选项&#xff1a;Options Case sensiti…

护眼灯作用大吗?2023这样的护眼台灯对孩子眼睛好

可以肯定的是&#xff0c;护眼灯一般可以达到护眼的效果。 看书和写字时&#xff0c;光线应适度&#xff0c;不宜过强或过暗&#xff0c;护眼灯光线较柔和&#xff0c;通常并不刺眼&#xff0c;眼球容易适应&#xff0c;可以防止光线过强或过暗导致的用眼疲劳。如果平时生活中…