Python Pandas时序数据处理完整攻略
什么是时序数据
时序数据是时间上有序的数据集合,包括时间序列和面板数据。
时间序列是一个固定时间范围内的数据序列,通常由时间戳(时间点的标签)和对应的数据值组成。
面板数据是时间序列数据集合,可以理解为多维时间序列。
Pandas时序数据模块
Pandas是Python的一个数据分析库,其提供了丰富的数据处理模块,包括时序数据处理模块,用于处理时间序列和面板数据。其中最重要的模块是pandas.Series和pandas.DataFrame,分别用于处理1D和2D结构的数据集合。
Pandas时序数据处理流程
- 数据读取与处理
Pandas提供了多种数据读取方法,包括读取本地文件、读取远程文件、读取数据库表等。
首先需要加载需要的模块:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
有了模块后,读取本地文件可以使用pd.read_csv方法,如下:
df = pd.read_csv('example.csv')
- 数据预处理
首先需要对数据进行预处理,包括缺失值处理、重复值处理、异常值处理等。
处理缺失值需要使用pandas.DataFrame.interpolate方法,其主要思路是用一定的方式插值填充缺失值。
处理重复值需要使用pandas.DataFrame.drop_duplicates方法,其主要思路是删除重复的行。
处理异常值需要使用pandas.DataFrame.clip方法,其主要思路是对于超出一定范围的数据进行截断或赋值。
- 数据分析与可视化
对于处理好的数据,需要对其进行分析和可视化,以探索数据规律。
处理时间序列数据需要使用pandas.Series方法,其中主要包括时间序列的索引和切片、时间序列的聚合、时间序列的移动等。
使用子图展示多种图形可以使用plt.subplot方法,其中包括折线图、柱状图、饼图、散点图等。
示例1
下面我们看一个简单的时序数据处理示例,假设我们有一份包含日期和销售量的数据文件example.csv,需要统计每月的销售量和每月销售的品类。
首先读入数据文件:
df = pd.read_csv('example.csv')
然后设置日期为DataFrame的索引:
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
接着按月统计销售量:
sales_month = df.resample('M').sum()
按月统计销售品类:
df['month'] = df.index.month
df.groupby([df.index.year, df.index.month, 'category']).sum()
然后我们可以通过子图展示每月销售量的折线图和饼图:
fig, axs = plt.subplots(1, 2, figsize=(10, 5))
sales_month.plot(ax=axs[0])
df.groupby([df.index.year, df.index.month, 'category']).sum()['sales'].plot(ax=axs[1], kind='pie')
plt.show()
示例2
我们再来看一个较为复杂的时序数据处理示例。
假设我们有一份包含多个球员每天的得分、篮板、助攻等数据的文件example.csv,以及一个球员的个人信息文件player.csv,需要统计球员每月、每季度、每年的平均得分、篮板、助攻,并且按照年龄段进行划分,展示总得分和各项得分的折线图。
首先读入数据文件:
df = pd.read_csv('example.csv')
player_df = pd.read_csv('player.csv')
然后对于example.csv文件进行预处理:
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
df.dropna(subset=['points', 'rebounds', 'assists'], inplace=True)
df = df.clip(lower=0)
接着计算月、季度、年平均值:
df_month = df.resample('M').mean()
df_quarter = df.resample('Q').mean()
df_year = df.resample('Y').mean()
计算年龄段:
player_df['age_range'] = pd.cut(player_df['age'], bins=[18, 25, 30, 35, 40, 50], labels=['18-25', '25-30', '30-35', '35-40', '40+'])
整合数据:
df_all = pd.merge(df_month, player_df, how='left', on='id')
df_all = pd.merge(df_all, df_quarter, how='left', on='id', suffixes=['_month', '_quarter'])
df_all = pd.merge(df_all, df_year, how='left', on='id', suffixes=['_quarter', '_year'])
接着按照年龄段进行数据切分和统计:
df_all['points_sum'] = df_all.groupby('age_range')['points_month'].cumsum()
df_all['points_quarter_sum'] = df_all.groupby('age_range')['points_quarter'].cumsum()
df_all['points_year_sum'] = df_all.groupby('age_range')['points_year'].cumsum()
df_all['rebounds_sum'] = df_all.groupby('age_range')['rebounds_month'].cumsum()
df_all['rebounds_quarter_sum'] = df_all.groupby('age_range')['rebounds_quarter'].cumsum()
df_all['rebounds_year_sum'] = df_all.groupby('age_range')['rebounds_year'].cumsum()
df_all['assists_sum'] = df_all.groupby('age_range')['assists_month'].cumsum()
df_all['assists_quarter_sum'] = df_all.groupby('age_range')['assists_quarter'].cumsum()
df_all['assists_year_sum'] = df_all.groupby('age_range')['assists_year'].cumsum()
最后进行可视化:
fig, axs = plt.subplots(1, 2, figsize=(10, 5))
df_all.groupby(['age_range', df_all.index]).sum()['points_sum'].unstack().plot(ax=axs[0])
df_all.groupby(['age_range', df_all.index]).sum()[['points_sum', 'rebounds_sum', 'assists_sum']].plot(ax=axs[1])
plt.show()
以上是一个完整的Pandas时序数据处理攻略,通过两个不同场景的示例,展示了数据读取、数据预处理、数据分析与可视化的整个流程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python Pandas时序数据处理 - Python技术站