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

知识目录

  • 前言
  • 一、加载数据
    • 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加载数据,分箱操作以及时间序列,绘制各种图形。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp微信小程序 401时重复弹出登录弹框问题

APP.vue 登陆成功后,保存登陆信息 if (res.code 200) {uni.setStorageSync(loginResult, res)uni.setStorageSync(token, res.token);uni.setStorageSync(login,false);uni.navigateTo({url: "/pages/learning/learning"}) }退出登录 toLogout: func…

基于微信小程序的传染病酒店隔离平台设计与实现(Java+spring boot+MySQL+微信小程序)

获取源码或者论文请私信博主 演示视频: 基于微信小程序的传染病酒店隔离平台设计与实现(Javaspring bootMySQL微信小程序) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:…

Vue3 表单输入绑定简单应用

去官网学习→表单输入绑定 | Vue.js 运行示例&#xff1a; 代码&#xff1a;HelloWorld.vue <template><div class"hello"><h1>Vue 表单输入绑定</h1><input type"text" placeholder"输入框" v-model"msg"…

github pages 用法详解 发布自己的网站

github pages 基础用法 URL 规则 假设你的 github 帐号为 mygithub&#xff0c;需要发布的仓库名为 myrepo&#xff0c;那么 pages 的 URL 为&#xff1a; https://mygithub.github.io/myrepo 添加内容 用任意编辑器写好&#xff08;或者生成&#xff09;标准的网页内容&a…

/proc directory in linux

Its zero-length files are neither binary nor text, yet you can examine and display themUnder Linux, everything is managed as a file; even devices are accessed as files (in the /dev directory). Although you might think that “normal” files are either text …

由于目标计算机积极拒绝,无法连接。 Could not connect to Redis at 127.0.0.1:6379

项目在启动时候报出redis连接异常 然后查看是redis 连接被计算机拒绝 解决方法 打开redis安装文件夹 先打开redis-servce.exe挂着&#xff0c;再打开redis-cli.exe 也不会弹出被拒接的问题了。而且此方法不用每次都去cmd里输入命令。

nginx负载均衡(反向代理)

nginx负载均衡 负载均衡&#xff1a;由反向代理来实现。 nginx的七层代理和四层代理&#xff1a; 七层是最常用的反向代理方式&#xff0c;只能配置在nginx配置文件的http模块当中&#xff0c;而且配置方法名称&#xff1a;upstream模块&#xff0c;不能写在server模块中&#…

如何搭建个人的GPT网页服务

写在前面 在创建个人的 GPT网页之前&#xff0c;我登录了 Git 并尝试了一些开源项目&#xff0c;但是没有找到满足我个性化需求的设计。虽然许多收费的 GPT网页提供了一些免费额度&#xff0c;足够我使用&#xff0c;但是公司的安全策略会屏蔽这些网页。因此&#xff0c;我决定…

volatile,解决内存可见性引起的问题,wait和notify

补充&#xff1a;synchronized&#xff08;务必会读&#xff08;辛可肉耐子&#xff09;会写&#xff09;&#xff0c;要搭配一个对象的时候&#xff0c;不一定非要是访问的this成员 synchronized(锁对象&#xff09;{ 代码块} public synchronized static void func(){} 静态方…

木马免杀(篇一)基础知识学习

木马免杀&#xff08;篇一&#xff09;基础知识学习 ———— 简单的木马就是一个 exe 文件&#xff0c;比如今年hw流传的一张图&#xff1a;某可疑 exe 文件正在加载。当然木马还可能伪造成各式各样的文件&#xff0c;dll动态链接库文件、lnk快捷方式文件等&#xff0c;也可能…

.net core的Knife4jUI,让swagger更精致

要在 .NET Core 中使用 IGeekFan.AspNetCore.Knife4jUI&#xff0c;您可以按照以下步骤进行配置&#xff1a; 首先&#xff0c;安装 IGeekFan.AspNetCore.Knife4jUI NuGet 包。可以通过 Visual Studio 的 NuGet 包管理器或者 .NET CLI 进行安装。 在 Startup.cs 文件的 Config…

电脑数据怎么加密?电脑数据加密软件有哪些?

在生活和工作中&#xff0c;我们总离不开电脑&#xff0c;而电脑中那些重要的数据&#xff0c;需要我们加密保护。那么电脑数据该怎么加密呢&#xff1f;电脑数据加密软件又有哪些呢&#xff1f;下面我们就来了解一下吧。 电脑数据加密软件 一般来说&#xff0c;常见的电脑加密…

【从零学习python 】10.Python条件语句和if嵌套详解

文章目录 elif一、 elif的功能二、注意点if嵌套想一想&#xff1a; 一、if嵌套的格式二、if嵌套的应用为什么结果3和结果4相同&#xff1f;&#xff1f;&#xff1f; 猜拳游戏运行效果:参考代码: if补充内容三、自动类型转换进阶案例 elif 如果有这样一种情况&#xff1a;当条件…

Electron学习1 安装环境与第一个程序

Electron学习1 安装环境与第一个程序 一、 Electron 简介二、安装 nvm三、安装nodejs四、安装nrm五、安装electron1. npm 初始化2. 创建 package.json3. 安装electron4. 创建一个页面5. 创建文件main.js6. 创建预加载器文件 preload.js7. 启动程序 六、打包 一、 Electron 简介…

TS学习笔记

一、变量与常量 //1、类型 2、面向对象 //输出语句、 //变量 //声明变量 字母数字下划线 驼峰命名 let personname "李逍遥001"; var personname1 "李逍遥002"; personname "李逍遥003" document.write(personname " " pe…

希尔排序——C语言andPython

前言 步骤 代码 C语言 Python 总结 前言 希尔排序&#xff08;Shell Sort&#xff09;是一种改进的插入排序算法&#xff0c;它通过将数组分成多个子序列进行排序&#xff0c;逐步减小子序列的长度&#xff0c;最终完成整个数组的排序。希尔排序的核心思想是通过排序较远距…

【ChatGPT 指令大全】销售怎么借力ChatGPT提高效率

目录 销售演说 电话销售 产出潜在客户清单 销售领域计划 销售培训计划 总结 随着人工智能技术的不断进步&#xff0c;我们现在有机会利用ChatGPT这样的智能助手来改进我们的销售工作。在接下来的时间里&#xff0c;我将为大家介绍如何运用ChatGPT提高销售效率并取得更好的…

苹果电脑图像元数据编辑器:MetaImage for Mac

MetaImage for Mac是一款功能强大的照片元数据编辑器&#xff0c;它可以帮助用户编辑并管理照片的元数据信息&#xff0c;包括基本信息和扩展信息。用户可以根据需要进行批量处理&#xff0c;方便快捷地管理大量照片。 MetaImage for Mac还提供了多种导入和导出格式&#xff0…

多用户跨境电商商品库系统快速搭建(全开源)

搭建一个多用户跨境电商商品库系统需要以下步骤&#xff1a; 1. 确定系统需求&#xff1a;首先&#xff0c;需要明确系统的功能需求&#xff0c;包括商品管理、订单管理、用户管理、支付管理等。根据具体需求确定系统的功能和界面设计。 2. 确定技术栈&#xff1a;选择合适的…

超融合基础架构 (HCI) 监控

什么是超融合基础架构 &#xff08;HCI&#xff09; 超融合基础架构 &#xff08;HCI&#xff09; 是一种软件定义的基础架构技术&#xff0c;它将计算、虚拟化和网络功能全部整合到一个设备中。超融合基础架构 &#xff08;HCI&#xff09; 解决方案使用软件和 x86 服务器来取…