时间序列分析与数据可视化:Python 实战指南
时间序列分析
在时间序列分析中,有多种方法可以处理数据。一种方法是使用
cut
函数,根据员工入职年份创建等宽区间并分组。
cuts = pd.cut(employee.index.year, bins=5, precision=0)
cuts.categories.values
通过上述代码,我们可以得到员工入职年份的分组区间。
另外,
merge_asof
函数可以帮助我们解决一些时间相关的问题,例如找出犯罪率比当前低 20% 的最后时间。以下是具体操作步骤:
1.
读取并处理数据
:
crime_sort = pd.read_hdf('data/crime.h5', 'crime') \
.set_index('REPORTED_DATE') \
.sort_index()
- 找到最后完整月份的数据 :
crime_sort.index.max()
由于 2017 年 9 月的数据不完整,我们将其从数据集中删除:
crime_sort = crime_sort[:'2017-8']
crime_sort.index.max()
- 统计每月犯罪和交通事故数量 :
all_data = crime_sort.groupby([pd.Grouper(freq='M'),
'OFFENSE_CATEGORY_ID']).size()
all_data.head()
- 重置索引 :
all_data = all_data.sort_values().reset_index(name='Total')
all_data.head()
- 获取当前月份的犯罪计数并设置目标 :
goal = all_data[all_data['REPORTED_DATE'] == '2017-8-31'] \
.reset_index(drop=True)
goal['Total_Goal'] = goal['Total'].mul(.8).astype(int)
goal.head()
-
使用
merge_asof函数查找满足条件的最后时间 :
pd.merge_asof(goal, all_data, left_on='Total_Goal',
right_on='Total', by='OFFENSE_CATEGORY_ID',
suffixes=('_Current', '_Last'))
除了上述方法,还可以使用
Period
类型来处理时间序列数据。
Period
类型可以表示精确的时间段,例如 2012 - 05 表示 2012 年 5 月整月。
ad_period = crime_sort.groupby([lambda x: x.to_period('M'),
'OFFENSE_CATEGORY_ID']).size()
ad_period = ad_period.sort_values() \
.reset_index(name='Total') \
.rename(columns={'level_0':'REPORTED_DATE'})
ad_period.head()
通过验证可以发现,使用
Period
类型处理后的数据与之前的
all_data
在部分列上是等价的。后续步骤可以使用类似的代码进行操作。
数据可视化
数据可视化在探索性数据分析、演示和应用中都起着关键作用。Python 中有多个可视化库,如
matplotlib
、
pandas
和
seaborn
。
matplotlib
是 Python 中主要的数据可视化库,它始于 21 世纪初,旨在模仿 Matlab 的绘图功能。它功能强大,但对于初学者来说不太友好。
pandas
和
seaborn
都依赖于
matplotlib
进行实际绘图。
pandas
使数据可视化变得简单,通常只需调用一次
plot
方法即可绘制所需图形。
seaborn
可以轻松创建漂亮的图形,并支持创建许多
matplotlib
和
pandas
直接无法提供的新类型图形。
下面是
matplotlib
的一些基础操作,以对象导向的方式为例:
1.
导入
pyplot
模块
:
import matplotlib.pyplot as plt
-
创建
Figure和Axes对象 :
fig, ax = plt.subplots(nrows=1, ncols=1)
- 验证对象类型 :
type(fig)
type(ax)
-
调整
Figure大小 :
fig.get_size_inches()
fig.set_size_inches(14, 4)
-
查看
Figure的Axes对象 :
fig.axes
fig.axes[0] is ax
-
设置
Figure和Axes的背景颜色 :
fig.set_facecolor('.9')
ax.set_facecolor('.7')
-
查看
Axes的子对象 :
ax_children = ax.get_children()
ax_children
-
调整
spines和axis的属性 :
spines = ax.spines
spine_left = spines['left']
spine_left.set_position(('outward', -100))
spine_left.set_linewidth(5)
spine_bottom = spines['bottom']
spine_bottom.set_visible(False)
ax.xaxis.grid(True, which='major', linewidth=2,
color='black', linestyle='--')
ax.xaxis.set_ticks([.2, .4, .55, .93])
ax.xaxis.set_label_text('X Axis', family='Verdana',
fontsize=15)
ax.set_ylabel('Y Axis', family='Calibri', fontsize=20)
ax.set_yticks([.1, .9])
ax.set_yticklabels(['point 1', 'point 9'], rotation=45)
以下是操作步骤的流程图:
graph TD;
A[读取数据] --> B[处理数据];
B --> C[统计数量];
C --> D[重置索引];
D --> E[设置目标];
E --> F[使用merge_asof查找结果];
G[导入pyplot] --> H[创建Figure和Axes];
H --> I[验证对象类型];
I --> J[调整Figure大小];
J --> K[查看Axes对象];
K --> L[设置背景颜色];
L --> M[查看子对象];
M --> N[调整spines和axis属性];
通过上述操作,我们可以更好地处理时间序列数据并进行数据可视化。在实际应用中,可以根据具体需求选择合适的方法和库。
时间序列分析与数据可视化:Python 实战指南
时间序列分析与可视化的深入理解
在时间序列分析中,我们之前介绍了通过
cut
函数对员工入职年份分组以及使用
merge_asof
函数查找犯罪率降低情况的方法。这里我们进一步探讨其原理和应用场景。
cut
函数的使用,本质上是对连续的数值数据进行离散化处理。在员工入职年份的例子中,我们将年份划分为 5 个等宽区间,这样可以更清晰地观察不同时间段入职员工的相关数据特征。这种分组方式在分析具有时间顺序的数据时非常有用,例如分析不同时间段内的销售数据、用户注册数据等。
而
merge_asof
函数则在处理时间序列中的比较问题时发挥了重要作用。它可以帮助我们找到满足特定条件的最后时间点,如犯罪率比当前低 20% 的时间。这在金融分析中可以用于查找股票价格低于某个阈值的最后时间,在气象分析中可以用于查找气温低于某个值的最后日期等。
对于使用
Period
类型处理时间序列数据,它提供了一种更精确表示时间段的方式。与直接使用日期分组相比,
Period
类型可以更方便地处理特定时间段的数据,如每月、每季度等。以下是一个简单的对比表格:
| 处理方式 | 优点 | 缺点 | 适用场景 |
| — | — | — | — |
| 日期分组(
Grouper
) | 简单直接,易于理解 | 对于复杂时间段处理不够灵活 | 常规的按日期统计数据 |
|
Period
类型 | 精确表示时间段,处理灵活 | 需要一定的学习成本 | 对时间段有精确要求的分析 |
数据可视化的进一步探讨
在数据可视化方面,我们已经了解了
matplotlib
的基础操作。下面我们来详细分析
pandas
和
seaborn
的特点和应用。
pandas
的可视化功能基于
matplotlib
,它简化了绘图过程。例如,对于一个包含多个列的
DataFrame
,我们可以直接使用
plot
方法绘制折线图、柱状图等。以下是一个简单的示例:
import pandas as pd
import numpy as np
data = pd.DataFrame(np.random.randn(100, 4), columns=['A', 'B', 'C', 'D'])
data.plot()
上述代码中,我们创建了一个包含 100 行 4 列的随机数据
DataFrame
,然后直接调用
plot
方法绘制折线图。
pandas
会自动处理数据的索引和列名,使得绘图变得非常简单。
seaborn
则更侧重于创建美观且具有统计意义的图形。它支持多种类型的图形,如箱线图、散点图矩阵等。以下是一个使用
seaborn
绘制箱线图的示例:
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
sns.boxplot(x="day", y="total_bill", data=tips)
plt.show()
在这个示例中,我们使用
seaborn
加载了一个经典的数据集
tips
,然后绘制了按天分组的总账单的箱线图。
seaborn
会自动根据数据的特征进行颜色和样式的设置,使得图形更加美观和易于解读。
另外,
seaborn
和
pandas
在数据格式上有不同的要求。
seaborn
更适合处理长格式(tidy)的数据,而
pandas
更适合处理宽格式(aggregated)的数据。以下是一个简单的对比列表:
-
seaborn
:
- 数据格式:长格式,每列代表一个变量,每行代表一个观测值。
- 优点:易于创建复杂的统计图形,支持多种类型的图形。
- 适用场景:探索性数据分析、统计报告。
-
pandas
:
- 数据格式:宽格式,每列代表一个变量,每行代表一个样本。
- 优点:简单易用,适合快速绘制基本图形。
- 适用场景:日常数据查看、简单可视化。
总结与展望
通过对时间序列分析和数据可视化的学习,我们掌握了多种处理和展示数据的方法。在时间序列分析中,我们学会了使用
cut
函数进行数据分组、
merge_asof
函数进行时间比较以及
Period
类型处理时间段。在数据可视化方面,我们了解了
matplotlib
的基础操作,以及
pandas
和
seaborn
的特点和应用。
在实际应用中,我们可以根据具体需求选择合适的方法和工具。对于时间序列分析,要根据数据的特点和分析目的选择合适的处理方式;对于数据可视化,要根据数据格式和展示需求选择合适的库。
未来,随着数据量的不断增加和数据分析需求的不断提高,时间序列分析和数据可视化的技术也将不断发展。我们可以期待更多高效、易用的工具和方法出现,帮助我们更好地理解和利用数据。同时,结合机器学习和深度学习技术,时间序列分析和数据可视化也将在更多领域发挥重要作用。
以下是一个总结的流程图,展示了整个时间序列分析和数据可视化的流程:
graph LR;
A[时间序列数据] --> B[数据处理(cut、merge_asof、Period)];
B --> C[数据分析(统计、比较等)];
C --> D[数据可视化(matplotlib、pandas、seaborn)];
E[其他数据] --> D;
D --> F[结果展示与应用];
通过这个流程图,我们可以清晰地看到从数据到结果展示的整个过程。在实际应用中,我们可以根据具体情况对每个步骤进行调整和优化,以达到更好的分析和展示效果。
超级会员免费看
1061

被折叠的 条评论
为什么被折叠?



