很多同学初学 Pandas,上来就直奔 DataFrame,却忽略了Series 才是 Pandas 的基础单元。Series 代表一维带标签序列,不管是成绩统计、温度监测、股票行情、月度销量、时序销售额,所有一维数据处理都离不开它。

今天整理 5 套完整实战案例,覆盖随机生成、统计指标、布尔筛选、差分计算、收益率、滚动窗口、时序重采样、时间筛选等高频操作,全部可直接运行,适合新手练手。

前置导入

import pandas as pd
import numpy as np

案例 1:学生成绩统计

需求:生成 10 名学生数学成绩 (50~100),计算平均分、最高分、最低分,统计高于平均分人数 核心知识点:创建 Series、基础聚合统计、布尔索引筛选

# 创建成绩序列
values = np.random.randint(50,101,10)
indexes = [f"学生{i}" for i in range(1,11)]
scores = pd.Series(values, index=indexes)
print("学生成绩:")
print(scores)

# 基础统计
scores_mean = scores.mean()
print(f"\n平均分:{scores_mean:.2f}")
print(f"最高分:{scores.max()}")
print(f"最低分:{scores.min()}")

# 筛选高于平均分学生
above_mean = scores[scores > scores_mean]
print("\n高于平均分的学生:")
print(above_mean)
print(f"高于平均分人数:{len(above_mean)}")

技巧:series[条件]布尔索引是最高效的筛选方式,优先不要使用 np.where 迂回计数。

案例 2:城市一周气温分析

需求:筛选超 30℃天数、平均温度、温度排序、寻找相邻两天温差最大的时段 核心知识点:diff()相邻差值、绝对值、索引操作、排序

tempers = pd.Series([28,31,29,32,30,27,33],
                    index=['周一','周二','周三','周四','周五','周六','周日'])
print("一周气温:")
print(tempers)

print(f"\n温度超过30度天数:{tempers[tempers>30].count()}")
print(f"平均温度:{tempers.mean():.2f}")
print("\n温度从高到低排序:")
print(tempers.sort_values(ascending=False))

# 计算相邻两日温差绝对值
diff_abs = tempers.diff().abs()
max_diff_val = diff_abs.max()
# 温差最大当天
max_day = diff_abs.dropna().idxmax()
pos = tempers.index.get_loc(max_day)
prev_day = tempers.index[pos-1]
print(f"\n温度变化最大两天:{prev_day} → {max_day},温差:{max_diff_val}")

案例 3:股票连续交易日收盘价分析

需求:计算每日收益率、查找收益最高 / 最低日期、计算波动率(收益率标准差) 核心知识点:pct_change()收益率、idxmax/idxmin、时序索引

prices = pd.Series([102.3, 103.5, 105.1, 104.8, 106.2, 107.0, 106.5, 108.1,109.3, 110.2], 
                   index=pd.date_range('2023-01-01', periods=10))
print("股票收盘价序列:")
print(prices)

# 每日收益率
day_rate = prices.pct_change().dropna()
print("\n每日收益率:")
print(day_rate)

print(f"收益率最高日期:{day_rate.idxmax()}")
print(f"收益率最低日期:{day_rate.idxmin()}")
print(f"收益率波动率(标准差):{day_rate.std():.4f}")

金融常用小知识:pct_change()一步算出涨跌幅,波动率直接用收益率 std。

案例 4:12 个月产品销量时序分析

需求:季度平均销量、销量最高月份、月环比增长率、查找连续 3 个月增长月份 核心知识点:resample时序重采样、rolling滚动窗口

sales = pd.Series([120, 135, 145, 160, 155, 170, 180, 175, 190, 200, 210, 220],
                  index=pd.date_range('2022-01-01', periods=12, freq='MS'))
print("月度销量:")
print(sales)

# 按季度重采样求平均
print("\n季度平均销量:")
print(sales.resample('QS').mean())

print(f"\n销量最高月份:{sales.idxmax()},销量:{sales.max()}")

# 月环比增长率
month_growth = sales.pct_change()
print("\n月环比增长率:")
print(month_growth)

# 判断每月是否增长
is_grow = month_growth > 0
# 滚动窗口:连续3个月增长
consec_grow = is_grow.rolling(window=3).sum() == 3
target_months = sales[consec_grow].index
print("\n连续3个月增长的月份:")
print(list(target_months))

案例 5:商店逐小时销售额分析

需求:按日汇总销售额、区分营业 / 非营业时段销售额占比、找出销售额最高 3 小时 核心知识点:between_time时间筛选、nlargest取 TOPN、时间索引属性

hourly_sales = pd.Series(np.random.randint(0, 100, 24),
                         index=pd.date_range('2025-01-01', periods=24, freq='h'))
print("逐小时销售额:")
print(hourly_sales)

# 按天汇总总销售额
daily_total = hourly_sales.resample('D').sum()
print("\n每日总销售额:")
print(daily_total)

# 区分营业时间8:00-22:00
biz_sales = hourly_sales.between_time('08:00','22:00')
nobiz_sales = hourly_sales[~hourly_sales.index.isin(biz_sales.index)]
biz_sum = biz_sales.sum()
nobiz_sum = nobiz_sales.sum()
total_sum = hourly_sales.sum()

print(f"\n营业时间销售额:{biz_sum},占比:{biz_sum/total_sum:.2%}")
print(f"非营业时间销售额:{nobiz_sum},占比:{nobiz_sum/total_sum:.2%}")

# 销售额最高3个小时
top3_hour = hourly_sales.nlargest(3)
print("\n销售额最高3个时段:")
print(top3_hour)

学习总结(Series 核心常用方法清单)

  1. 基础统计:mean() max() min() count() std()
  2. 差值 / 涨跌幅:diff()pct_change()
  3. 筛选:布尔索引、nlargest()
  4. 时序处理:resample()重采样、between_time()时间区间过滤
  5. 滚动计算:rolling()移动窗口
  6. 极值索引:idxmax()idxmin()

练习建议

  1. 先单独运行每个案例,观察输出结果;
  2. 修改数值、随机种子、时间范围,自行改造需求;
  3. 熟练 Series 之后,再学习 DataFrame,理解 “多列就是多个 Series 组合”。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐