【Python 小白到精通 | 课程笔记】第三章:数据处理就像侦探游戏(函数和包)

简介: 【Python 小白到精通 | 课程笔记】第三章:数据处理就像侦探游戏(函数和包)

写在前面


Al Studio课程地址:第三章:数据处理就像侦探游戏(函数和包)


第三章的学习,我突然就开始感觉到吃力了。课程视频只有 20 来分钟,倒用不了多久就能看完。但当更加仔细地去阅读 markdown 讲义和源代码的时候,真的很消耗精力。


这章主要学习了:


数据处理流程。碰到异常的数据,得思考它是如何产生的,同时可以寻找一些外部信息的帮助。

numpy

pandas:Series(列),Dataframe(表格)

Dataframe 的各种操作真的令我有些眼花缭乱了,好在我还是看完了,并在尝试修改源代码的过程中大致知道了它是怎么一回事儿。


划分学习内容

把看到的都记住显然是划不来的,本章内容较多,课程还对学习内容进行了分类,感觉这样挺好。



学到的一些操作(简单的罗列)

1、读取csv文件:


example_data = pd.read_csv('work/example.csv')

2、按序列号或索引名取记录:


print(titanic_data.iloc[0, 3])
print(titanic_data.loc[0, 'Age'])

3、显示基本信息,像 column 名,空数据个数,数据类型:


titanic_data.info()

4、有多条记录时可以只显示前几条:


.head()

5、填充数据:


fillna('')

6、对数据分类进行操作:


print(titanic_data.groupby(['Pclass'])['Fare'].mean())

7、可以在[]中用条件语句得到一组新的索引值


titanic_data[titanic_data.Fare == 0]

8、画饼、直方图(matplotlib)


consist(titanic_data, 'Age').plot.pie(title='Pclass distribution', colors=[ '#1E90FF','#00BFFF',  '#87CEFA'])
titanic_data['Age'].plot.hist(bins=30, title='Age distribution',color=['#00BFFF'])

9、可以直接对函数返回值按索引取一部分


population = titanic_data.count()['PassengerId']

10、扔掉含空数据的记录


titanic_data['Age'].dropna()

11、一张画布上布局多个图表 (直接拷贝的原代码,可供参考)


from matplotlib.gridspec import GridSpec # 用于定义图形布局
plt.figure(figsize= (5, 5))
the_grid = GridSpec(2,2)
plt.subplot(the_grid[0,0], aspect=1)
consist(titanic_data, 'Pclass').plot.pie(title='Pclass distribution', autopct='%.0f%%', colors=[ '#1E90FF','#00BFFF',  '#87CEFA'])
plt.subplot(the_grid[0,1], aspect=1)
consist(titanic_data, 'Sex').plot.pie(autopct='%.0f%%', title='Gender distribution', colors=[ '#FF82AB','#00BFFF'])
plt.subplot(the_grid[1,0])
titanic_data['Age'].plot.hist(bins=12, title='Age distribution',color=['#00BFFF'])
plt.subplot(the_grid[1,1])
titanic_data['Fare'].plot.hist(bins=12, title='Fare distribution',color=['#00BFFF'])

保留问题

1、看到.csv文件的一个特征是:“每条记录都有同样的字段序列。”


我没有读懂这句话的意思。

2、看到一句话:“要做任何计算时,还得数一数它的index,用循环将数取出,再计算。 来实在是有点繁复,哎呀我烦得不行。 “ (所以要用包)


但是,python自带的 list 中的数据,不也是可以用下标直接取出的吗?

课后作业


1、写出1960年GDP最高的国家:有一行是World不是国家


问题:Dataframe取索引,但列名含有空格

我最初的想法是,取索引时排除掉国家名为World的记录,想使用data[data.Country Name != 'World'],结果由于列名含有空格导致语法错误


image.png

那就改一下列名呗!


data2 = data
data2.columns = data2.columns.str.strip('Country ')
# print(data2.columns)
print(data2.Name)

这样语法问题就解决了。


#请写出1960年GDP最高的国家
data_no_World = data[data.Name != 'World']
max_id = data_no_World['1960'].idxmax()
max_name = data_no_World.iloc[max_id].Name
print(max_name)

输出


image.png

代码可以挤一挤写成这样:(但是阅读起来就非常困难了,不建议这样写)


#请写出1960年GDP最高的国家
name_max = data.iloc[data[data.Name != 'World']['1960'].idxmax()]['Name']
print(name_max)

但是我后来发现,这个表格中很多都是多国家组成的组织,可能也就不需要去考虑得到的最大GDP是不是一个国家的了。


最终代码:


name_max = data.iloc[data['1960'].idxmax()]['Name']
print(name_max)
# 输出:World

注意:Dataframe用来赋值返回的是一个引用

Dataframe 用来赋值返回的是引用,而不是建立的一个新的副本。


data2 = data
data2.columns = data2.columns.str.strip('Country ')
print(data2.columns)
print(data.columns)

image.png


2、求多个年份GDP前三的国家


写个函数用来求某一年GDP前三的国家,然后多次调用它。


函数逻辑:


先求GDP最大的国家,保存下名字

排除掉最大的国家后,找GDP最大的国家,保存下名字

重复上一步

返回:GDP前三国家名的列表

如何去掉一个国家?


进行了一些尝试但程序都还是没有跑起来,最后还是用了在索引中加判断进行筛选的方法。代码终于能跑了,不过还是尽量少写这样的垃圾代码😅。


最终代码:


#请写出1960、1979、1980、1990、2000、2010、2020年GDP前三的国家
def gdp_top3(year):
  # 代码可以再优化
    namesTop3 = []
    nameMax = data.iloc[data[year].idxmax()]['Name']
    namesTop3.append(nameMax)
    nameMax = data.iloc[data[year][data.Name != nameMax].idxmax()]['Name']
    namesTop3.append(nameMax)
    nameMax = data.iloc[data[year][data.Name != namesTop3[0]][data.Name != namesTop3[1]].idxmax()]['Name']
    namesTop3.append(nameMax)
    return namesTop3
years = [1960, 1979, 1980, 1990, 2000, 2010, 2020]
for i in years:
    top3Name = gdp_top3(str(i))
    print(i, ': ', top3Name)

算法效率


求一列数中值最大的三个,应该可以在一次遍历中完成。但是上面的代码每次求 top3 都遍历了三次,效率是比较低的。


3、选择几个你感兴趣的国家,画合适的图表示他们在60年间的GDP变化


可能需要用到的知识:


有多个国家,可能用到多张图在一张画布上的排版

描述GDP变化,可以试试刚学的直方图

需要在表格按行取出数据,并划分为国家名、GDP两部分

流程:


1、选择国家,不如就选前四个(方便,先学会操作再说)

问题1:‘list’ object has no attribute ‘plot’

用的下面代码的格式,前面的数据的类型是 list 列表。


titanic_data['Age'].plot.hist(bins=12, title='Age distribution',color=['#00BFFF'])

error:'list' object has no attribute 'plot',是需要 Dataframe 类型吗?那就用这个类型叭!


问题2:画直方图,发现x、y轴反了

画出直方图的横、纵轴反了。


ctGDP = data.iloc[0][2:]
ctName = data.iloc[0][0:1]
ctGDP.plot.hist(bins=60, title=ctName[0], color=['#00BFFF'])

image.png


猜测:可能不适合用直方图,不如试试折线图叭!


ctGDP = data.iloc[0][2:].tolist()
x = list(range(1960, 2021))
print(x, type(x))
plt.plot(x, ctGDP)

image.png


问题3:matplotlib绘图,坐标轴无法显示中文

matplotlib 绘图坐标轴无法显示中文,网上搜了一些方法,并没能成功解决。最常见的解决方法是插入以下代码:


import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']     # 显示中文

不知道是不是我使用的是 Al Studiou 的在线 notebook 的原因,运行这段代码会报错,大意应该是找不到SimHei这个字体。


image.png

那我只好暂时先用着英文的轴标签了。


最终代码与运行效果


#请选择几个你感兴趣的国家,画合适的图表示他们在60年间的GDP变化
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
plt.figure(figsize=(20, 3))
the_grid = GridSpec(1, 4)
x = list(range(1960, 2021))
where = [(0, 0), (0, 1), (0, 2), (0, 3)]
for i in range(4):
    ctGDP = data.iloc[i][2:].tolist()
    ctName = data.iloc[i][0:2].tolist()
    plt.subplot(the_grid[where[i]])
    plt.plot(x, ctGDP)
    plt.xlabel('years')
    plt.ylabel('GDP')
    plt.title(ctName[0])

image.png


4、自选问题:这60年间,GDP增长率最大的国家(或组织)是哪个?


需要用到:


取某个国家某年的GDP值

流程:


1、分别取 1960 和 2020 年国家的GDP

2、求出增长率

3、找增长率最大的国家

源代码与运行结果:


#请写出一个你自己感兴趣的问题,并进行探索
#问题:这60年间,GDP增长前三的国家(或组织)是哪些?
GDP1 = data['1960']
GDP2 = data['2020']
rise = GDP2 - GDP1
riseRate = rise / GDP1
index_max = riseRate.idxmax()
name_max = data.iloc[index_max]['Name']
print('这60年间GDP增长率最大的国家:', name_max)
print('GDP增长倍数:', riseRate[index_max])
print('1960年GDP:', GDP1[index_max])
print('2020年GDP:', GDP2[index_max])

感觉学到这里,一些操作慢慢地就熟练起来了。


经验总结


1、有时 debug 就一条思路走到了黑,为了解决一个问题,又引出个问题,问题套问题,最后都忘记了最初是要干什么。不要陷入了问题的网罗!

相关文章
|
25天前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
125 67
|
28天前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
19天前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
43 18
|
11天前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
40 8
|
20天前
|
Python
Python中的函数
Python中的函数
32 8
|
21天前
|
Python 容器
[oeasy]python048_用变量赋值_连等赋值_解包赋值_unpack_assignment _
本文介绍了Python中变量赋值的不同方式,包括使用字面量和另一个变量进行赋值。通过`id()`函数展示了变量在内存中的唯一地址,并探讨了变量、模块、函数及类类型的地址特性。文章还讲解了连等赋值和解包赋值的概念,以及如何查看已声明的变量。最后总结了所有对象(如变量、模块、函数、类)都有其类型且在内存中有唯一的引用地址,构成了Python系统的基石。
28 5
|
28天前
|
数据采集 存储 数据处理
Python中的多线程编程及其在数据处理中的应用
本文深入探讨了Python中多线程编程的概念、原理和实现方法,并详细介绍了其在数据处理领域的应用。通过对比单线程与多线程的性能差异,展示了多线程编程在提升程序运行效率方面的显著优势。文章还提供了实际案例,帮助读者更好地理解和掌握多线程编程技术。
|
27天前
|
监控 测试技术 数据库
Python中的装饰器:解锁函数增强的魔法####
本文深入探讨了Python语言中一个既强大又灵活的特性——装饰器(Decorator),它以一种优雅的方式实现了函数功能的扩展与增强。不同于传统的代码复用机制,装饰器通过高阶函数的形式,为开发者提供了在不修改原函数源代码的前提下,动态添加新功能的能力。我们将从装饰器的基本概念入手,逐步解析其工作原理,并通过一系列实例展示如何利用装饰器进行日志记录、性能测试、事务处理等常见任务,最终揭示装饰器在提升代码可读性、维护性和功能性方面的独特价值。 ####
|
7月前
|
存储 Python
如何使用Python实现“猜数字”游戏
本文介绍了使用Python实现“猜数字”游戏的过程。游戏规则是玩家在给定范围内猜一个由计算机随机生成的整数,猜对则获胜。代码中,首先导入random模块生成随机数,然后在循环中获取玩家输入并判断大小,提供猜小、猜大提示。通过增加猜测次数限制、难度选择、优化输入提示和图形化界面等方式可优化游戏。这篇文章旨在帮助初学者通过实际操作学习Python编程。
304 2
|
Python
Python实现猜数字游戏
Python实现猜数字游戏
150 0