赞
踩
Year 列,表示年份
列January~December分别表示对应月份的 NINO1+2 区海平面温度 异常滑动平均值
我们首先要以Year为基准将多列的月份和异常平均值合并到成两列数据;
再将Month替换成数值字符串;
然后把Year和Month拼接成Date格式
取Date、Nino12为最终数据集,这个任务就完成了。
Month替换成数值字符串使用map对映射字典进行替换。map、apply、applymap号称Pandas数据处理三板斧,分别可以实现逐行、逐列和逐元素操作。
源代码:
import matplotlib.pyplot as pltimport pandas as pdimport itertoolsdef task1():# 读取文件
df_nino12 = pd.read_csv("nino12.long.anom.data.csv", sep=",")# 月份映射表
month_map = {"January": "01","February": "02","March": "03","April": "04","May": "05","June": "06","July": "07","August": "08","September": "09","October": "10","November": "11","December": "12"}# 逆向透视表, 对透视表概念不了解的 科普下 pivot_table
df_nino12 = df_nino12.melt(id_vars="Year", var_name="month", value_name="Nino12")# 使用map对映射字典进行替换
df_nino12["month"] = df_nino12["month"].map(month_map)# Date格式拼接
df_nino12["Date"] = df_nino12["Year"].map(str) + "-" + df_nino12["month"] + "-01"# 以Date进行排序,默认升序,降序可以使用ascending=False
df_nino12 = df_nino12.sort_values(by="Date")# 将"Date", "Nino12"两列输出到 nino12_dropnan.txt 文件
df_nino12[["Date", "Nino12"]].to_csv('nino12_dropnan.txt', sep=',', index=False)
【任务2】
重新读取新的数据集“nino12_dropnan.txt”,选择 Nino12 字段,统计最大 值 maxValue、最小值 minValue、平均值 meanValue。 解析:任务二是对pandas聚合操作的使用,pandas支持以下聚合操作。
count 计算分组中非NA值的数量
sum 计算非NA值的和
mean 计算非NA值的平均值
median 计算非NA值的算术中位数
std 计算非NA值标准差
var 计算非NA值标方差
min 获得非NA值的最小值
max 获得非NA值的最大值
prod 计算非NA值的积
first 获得第一个非NA值
last 获得最后一个非NA值
源代码:
import matplotlib.pyplot as pltimport pandas as pdimport itertoolsdef task2():
df = pd.read_csv("nino12_dropnan.txt", sep=",")print(df["Nino12"].min())print(df["Nino12"].max())print(df["Nino12"].mean())
【任务3】
重新读取文件“nino12_dropnan.txt”,利用第三步统计结果最大值 maxValue、最小值 minValue,利用 category = [minValue, -0.5, 0,0.5, maxValue] 和 labels = ['LaNinaTemp', 'Cold', 'Warm', 'NinoTemp']将 Nino12 进行离散化;
并将离散化结果作为一个新的列 Label 添加到原始数据集,并保存为“nino12_dropnan_result.csv”,从左到右三个列名分别为 Date、 Nino12、Label;
根据离散化结果画出饼状图,保存为“nino12_ pie.png”, 要求分辨率不低于 300dpi。
解析:
任务三是对pandas聚合操作的使用,pandas支持一下聚合操作
在进行数据的汇总和分析时我们经常需要对连续性的数据变量进行分段汇总。
cut函数就是用来把一组数据分割成离散的区间,题目中的min~-0.5归为LaNinaTemp,-0.5~0归为Cold,就是这么个意思。
使用matplotlib模块画图,matplotlib的使用看源代码的注释。
源代码:
import matplotlib.pyplot as pltimport pandas as pdimport itertoolsdef task3():
df = pd.read_csv("nino12_dropnan.txt", sep=",")
category = [df["Nino12"].min(), -0.5, 0, 0.5, df["Nino12"].max()]
lables = ['LaNinaTemp', 'Cold', 'Warm', 'NinoTemp']# 将 Nino12 进行离散化
df['Lable'] = pd.cut(df['Nino12'], category, labels=lables)
df[["Date", "Nino12", "Lable"]].to_csv('nino12_dropnan_result.csv', sep=',', index=False)# 创建一个画布
plt.figure()# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 声明标题
plt.title("厄尔尼诺现象离散化统计饼状图")# 将数据载入画布
df['Lable'].value_counts().plot.pie(
explode=(0, 0, 0.1, 0), # 将某一块分割出来,值越大分割出的间隙越大
autopct='%.2f', # 每块的占比
shadow=True, # 阴影设置
startangle=140, # 逆时针起始角度设置
figsize=(6, 7) # 画布比例)# 保存的文件名 分辨率
plt.savefig('nino12_pie.png', dpi=300)
plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。