查看原文
其他

可视化 | 使用groupby或resample按月份分组绘制高管违规量趋势图

大邓 大邓和他的Python
2024-09-09

在数据分析和处理中,经常需要按照月份对时间序列数据进行分组和聚合。今天以高管违规数据为例, 想根据这份数据绘制月度高管违规量趋势,需要按照月份对数据进行分组,可以使用resample或groupby。本文知识点

  1. resample实现
  2. groupby实现
  3. resample和groupby运算结果是什么数据类型


一、resample实现步骤

  1. 导入xlsx数据,数据集获取可点击跳转 实验数据集  |  上市公司高管违规数据(2008-2022)
  2. 使用set_index函数将'公告日期'列设置为索引,以便能够使用时间序列的功能。
  3. 使用resample函数并指定频率为'M'(表示按照月份)来对时间序列数据进行分组。使用了size函数获取每组的记录数
  4. 打印了分组结果df_resampled,其中每一行代表一个月份的总和。
import pandas as pd

df = pd.read_excel('上市公司高管违规-原始数据.xlsx')

df['公告日期'] = pd.to_datetime(df['公告日期'])
df.set_index('公告日期', inplace=True)
df.head()

# 将'date'列设置为索引
#df.set_index('公告日期', inplace=True)

# 按月份对时间序列数据进行分组
df_resampled = df.resample('M').size()
#df_resampled = df.resample('30D').size()

# 打印分组结果
print(df_resampled)

Run

    公告日期
    1997-01-31      1
    1997-02-28      0
    1997-03-31      0
    1997-04-30      0
    1997-05-31      0
                 ... 
    2022-08-31    453
    2022-09-30    479
    2022-10-31    216
    2022-11-30    525
    2022-12-31    343
    Freq: M, Length: 312, dtype: int64

import matplotlib.pyplot as plt
import matplotlib
import matplotlib_inline
matplotlib_inline.backend_inline.set_matplotlib_formats('png''svg')
import scienceplots
import platform
import numpy as np


plt.style.use(['science''no-latex''cjk-sc-font'])
system = platform.system()  # 获取操作系统类型

if system == 'Windows':
    font = {'family''SimHei'}
elif system == 'Darwin':
    font = {'family''Arial Unicode MS'}
else:
    font = {'family''sans-serif'}
matplotlib.rc('font', **font)  # 设置全局字体


plt.figure(figsize=(105))
plt.xlabel('日期')
plt.ylabel('月度违规量')
plt.title('月度上市公司高管违规量(1997-2022)')
df_resampled.plot()

二、groupby实现步骤

  1. 导入xlsx数据数据集获取可点击跳转 实验数据集 | 上市公司高管违规数据(2008-2022)
  2. 使用set_index函数将'公告日期'列设置为索引,以便能够使用时间序列的功能。
  3. 使用groupby函数并指定频率为'M'(表示按照月份)来对时间序列数据进行分组。使用了size函数获取每组的记录数
  4. 打印了分组结果df_resampled,其中每一行代表一个月份的总和。
import pandas as pd

df2 = pd.read_excel('上市公司高管违规-原始数据.xlsx')

df2['公告日期'] = pd.to_datetime(df2['公告日期'])

# 将'date'列设置为索引
df2.set_index('公告日期', inplace=True)

# 按月份对时间序列数据进行分组
df2_grouped = df2.groupby(pd.Grouper(freq='M')).size()

# 打印分组结果
print(df2_grouped)

Run

    公告日期
    1997-01-31      1
    1997-02-28      0
    1997-03-31      0
    1997-04-30      0
    1997-05-31      0
                 ... 
    2022-08-31    453
    2022-09-30    479
    2022-10-31    216
    2022-11-30    525
    2022-12-31    343
    Freq: M, Length: 312, dtype: int64

import matplotlib.pyplot as plt
import matplotlib
import matplotlib_inline
matplotlib_inline.backend_inline.set_matplotlib_formats('png''svg')
import scienceplots
import platform
import numpy as np


plt.style.use(['science''no-latex''cjk-sc-font'])
system = platform.system()  # 获取操作系统类型

if system == 'Windows':
    font = {'family''SimHei'}
elif system == 'Darwin':
    font = {'family''Arial Unicode MS'}
else:
    font = {'family''sans-serif'}
matplotlib.rc('font', **font)  # 设置全局字体


plt.figure(figsize=(105))
plt.xlabel('日期')
plt.ylabel('月度违规量')
plt.title('月度上市公司高管违规量(1997-2022)')
df2_grouped.plot()

三、深入理解

df2.resample('M')或df2.groupby(pd.Grouper(freq='M'))  返回的结果是什么类型的数据,有什么特点。

df2.resample('M')

Run

    <pandas.core.resample.DatetimeIndexResampler object at 0x7fece05fb160>

df2.groupby(pd.Grouper(freq='M')) 

Run

    <pandas.core.groupby.generic.DataFrameGroupBy object at 0x7fed31571df0>

只要遇到 < object at 0x7fece05fb160>,不知道这内部是什么。可以使用for循环拆解这个黑盒子

for x in df2.resample('M'):
    print(type(x), len(x))

Run

<class 'tuple'> 2
<class 'tuple'> 2
<class 'tuple'> 2
<class 'tuple'> 2
<class 'tuple'> 2
<class 'tuple'> 2
......

for x in df2.groupby(pd.Grouper(freq='M')):
    print(type(x), len(x))

Run

<class 'tuple'> 2
<class 'tuple'> 2
<class 'tuple'> 2
<class 'tuple'> 2
<class 'tuple'> 2
<class 'tuple'> 2
......

经过检查发现df2.resample('M')或df2.groupby(pd.Grouper(freq='M')) 内部都是由tuple组成的,而每个tuple又由「日期」和对应的「dataframe」组成。

for x in df2.resample('M'):
    print(type(x[0]), type(x[1]))

Run

<class 'pandas._libs.tslibs.timestamps.Timestamp'> <class 'pandas.core.frame.DataFrame'>
<class 'pandas._libs.tslibs.timestamps.Timestamp'> <class 'pandas.core.frame.DataFrame'>
<class 'pandas._libs.tslibs.timestamps.Timestamp'> <class 'pandas.core.frame.DataFrame'>
<class 'pandas._libs.tslibs.timestamps.Timestamp'> <class 'pandas.core.frame.DataFrame'>
<class 'pandas._libs.tslibs.timestamps.Timestamp'> <class 'pandas.core.frame.DataFrame'>
<class 'pandas._libs.tslibs.timestamps.Timestamp'> <class 'pandas.core.frame.DataFrame'>
......




精选内容

管理世界 | 使用文本分析词构建并测量 短视主义

管理世界 | 使用 经营讨论与分析 测量 企业数字化指标

管理世界 | 用正则表达式、文本向量化、线性回归算法从md&a数据中计算 「企业融资约束指标

管理世界 | 政府与市场心理因素的经济影响及其测度

文本分析 | 中国企业高管团队创新注意力(含代码)

金融研究 | 使用Python构建「关键审计事项信息含量」

PNAS | 14000+篇心理学顶刊论文可复现性调研(含代码)

网络爬虫 | 使用Python采集B站弹幕和评论数据

网络爬虫 | 使用Python披露采集 Up 主视频详情信息

B站 | "高铁互殴"视频词云图绘制

可视化 | 绘制《三体》人物关系网络图

可视化 | 99-21年地方政府报告关键词变化趋势

使用 Word2Vec 和 TF-IDF 计算五类企业文化

采购合同数据集 | 政府采购何以牵动企业创新

96G数据集 | 2亿条中国大陆企业工商注册信息

70G数据集 | 3571万条专利申请数据集(1985-2022年)

93G数据集 | 中国裁判文书网(2010~2021)

数据集 | 3.9G全国POI地点兴趣点数据集

数据集 | 「问询函」

实验数据 | 194城市楼市政策梳理(2010-2022)

数据集 | 07-21年上市公司「委托贷款公告」

单个csv文件体积大于电脑内存,怎么办?

继续滑动看下一个
大邓和他的Python
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存