动手学数据分析(三)主要是对数据进行重构,其任务为使用不同函数进行数据合并,以及数据聚合与运算groupby的运用。重点掌握数据合并函数concat、merge和join的用法及区别;groupby机制。
第二章 数据准备
2.2 数据重构——数据合并
有三种常见的数据合并方法:
[En]
There are three common methods of data merging:
1、pandas.concat方法—— 轴向堆叠数据
根据轴方向的不同(axis参数),可以将堆叠分成横向堆叠和纵向堆叠,默认采用的是纵向堆叠方式。在堆叠数据时,默认采用的是外连接,(join参数设为outer)的方式。
用法: pd.concat( [df数据1, df数据2, …… ], axis = 0或1, join = 连接方式, keys = 表明数据来源 )
参数说明:
axis:需要合并链接的轴,0是行,1是列
join:连接的方式 inner,或者outer
keys:为了明确哪些数据来源于哪个变量
2、pandas.merge方法 ——主键合并数据
主键合并根据一个或多个键将不同的DaraFrame对象连接起来,大多数是将两个DataFrame对象中重叠的列作为合并的键。
用法: pandas.merge(left, right, how=’inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=(‘_x’, ‘_y’))
参数说明:
how:默认为inner,可设为inner/outer/left/right
on:根据某个字段进行连接,必须存在于两个DateFrame中(若未同时存在,则需要分别使用left_on和right_on来设置)
left_on:左连接,以DataFrame1中用作连接键的列
right_on:右连接,以DataFrame2中用作连接键的列
left_index:将DataFrame1行索引用作连接键
right_index:将DataFrame2行索引用作连接键
sort:根据连接键对合并后的数据进行排列,默认为True
suffixes:对两个数据集中出现的重复列,新数据集中加上后缀_x,_y进行区别
3、DataFrame.join方法 ——根据行索引合并数据
用法: DataFrame.join(other, on=None, how=’left’, lsuffix=”, rsuffix=”, sort=False)
参数说明:
other:【DataFrame,或者带有名字的Series,或者DataFrame的list】如果传递的是Series,那么其name属性应当是一个集合,并且该集合将会作为结果DataFrame的列名
on:【列名称,或者列名称的list/tuple,或者类似形状的数组】连接的列,默认使用索引连接
how:【{‘left’, ‘right’, ‘outer’, ‘inner’}, default:’left’】连接的方式,默认为左连接
lsuffix:【string】左DataFrame中重复列的后缀
rsuffix:【string】右DataFrame中重复列的后缀
sort:【boolean, default,False】按照字典顺序对结果在连接键上排序。如果为False,连接键的顺序取决于连接类型(关键字)。
这里顺便提一下DataFrame.append的用法(后续task中要用到)
用法: DataFrame.append(other, ignore_index=False, verify_integrity=False, sort=False)
参数说明:
other:【DataFrame,或者带有名字的Series,或者DataFrame的list】如果传递的是Series,那么其name属性应当是一个集合,并且该集合将会作为结果DataFrame的列名
on:【列名称,或者列名称的list/tuple,或者类似形状的数组】连接的列,默认使用索引连接
how:【{‘left’, ‘right’, ‘outer’, ‘inner’}, default:’left’】连接的方式,默认为左连接
lsuffix:【string】左DataFrame中重复列的后缀
rsuffix:【string】右DataFrame中重复列的后缀
sort:【boolean, default,False】按照字典顺序对结果在连接键上排序。如果为False,连接键的顺序取决于连接类型(关键字)。
介绍完数据合并的三种方法,开始完成本次的tasks。
#导入数据
lu=pd.read_csv('./data/train-left-up.csv')
ld=pd.read_csv('./data/train-left-down.csv')
rd=pd.read_csv('./data/train-right-down.csv')
ru=pd.read_csv('./data/train-right-up.csv')
Task1:将数据train-left-up.csv和train-right-up.csv 横向合并为一张表,并保存这张表为result_up。
#方法一 concat方法
result_up=pd.concat([lu,ru],axis =1)
#方法二 merge方法
result_up1=pd.merge(lu,ru,left_index=True,right_index=True)
#方法三 join方法
result_up2=lu.join(ru,lsuffix='_left',rsuffix='_right')
Task2:将train-left-down和train-right-down 横向合并为一张表,并保存这张表为result_down。然后将上边的result_up和result_down 纵向合并为result。
#方法一 concat方法
result_down=pd.concat([ld,rd],axis =1)
result=pd.concat([result_up,result_down],axis=0)
result
#方法二 merge方法+append方法
result_up1=pd.merge(ld,rd,left_index=True,right_index=True)
result1=result_up2.append(result_down2)
result1
#方法三 join方法+append方法
result_down2=ld.join(rd,lsuffix='_left',rsuffix='_right')
result2=result_up1.append(result_down1)
result1
【思考】对比merge、join以及concat的方法的不同以及相同。思考一下在task1和task2的情况下,为什么merge和join都要求使用DataFrame的append方法,如何只要求使用merge或者join可不可以完成task1和task2呢?
concat既可横向连接又可纵向连接;merge和join方法只能横向连接,所以在完成task2时需要使用append进行纵向连接。单独使用merge和join不能完成task2。
4、数据降维与升维
在pandas中Series和DataFrame类型数据之间可以切换。Series数据类型转换成DataFrame数据类型为升维;DataFrame数据类型转换成Series数据类型为降维。
stack:将数据的列”旋转”为行
可将DataFrame数据类型转换成Series数据类型unstack:将数据的行”旋转”为列
可将层次化索引的Series数据类型转换成DataFrame数据类型
2.3 数据重构——数据聚合运算
在数据集合运算中,主要是掌握groupby函数的用法。groupby 三个阶段”split-apply-combine”(拆分-应用-合并)。
第一阶段——split:按照某一原则(groupby字段)进行拆分,相同属性分为一组。pandas对象(无论是Series、DataFrame还是其他的)中的数据会根据你所提供的一个或多个键被拆分(split)为多组。拆分操作是在对象的特定轴上执行的。例如,DataFrame可以在其行(axis=0)或列(axis=1)上进行分组。其常用参数包括:
by,分组字段,可以是列名/series/字典/函数,常用为列名
axis,指定切分方向,默认为0,表示沿着行切分
as_index,是否将分组列名作为输出的索引,默认为True;当设置为False时相当于加了reset_index功能
sort,与SQL中groupby操作会默认执行排序一致,该groupby也可通过sort参数指定是否对输出结果按索引排序
如:df.groupby(‘列名’,as_index=False).mean()第二阶段——apply:对拆分后的各组执行相应的转换操作。将一个函数应用(apply)到各个分组并产生一个新值。常用的执行操作方式有4种:
直接添加聚合函数,但只能实现单个函数[En]
Add aggregate function directly, but can only achieve a single function
常用聚合函数包括:mean/sum/median/min/max/last/first等,最为简单直接的聚合方式
agg(或aggregate),执行更为丰富的聚合功能,常用列表、字典等形式作为参数。
如:df.groupby([‘列名1′,’列名2’]).agg(‘列名3’:[np.mean,min])transform,其与agg和apply的区别相当于SQL中窗口函数和分组聚合的区别:transform并不对数据进行聚合输出,而只是对每一行记录提供了相应聚合结果;而后两者则是聚合后的分组输出。
如:dfm=df.groupby([‘列名’]).transforms(np.mean)时间序列的groupby——resample
再次指出,groupby相当于是按照某一规则对数据进行分组聚合,当分组的规则是时间序列时,还存在另一种特殊的分组方式——重采样resample。groupby的4种转换操作自然也都适用于resample。
还可将groupby与resample链式使用,但仅可以是resample在groupby之后,反之则会报错。
如:df.groupby(‘列名’).resample(‘天数’).mean()第三阶段——combine:输出汇总转换后的各组结果。所有这些函数的执行结果会被合并(combine)到最终的结果对象中。
接下来开始本次数据聚合运算的tasks练习。
Task1:计算泰坦尼克号男性与女性的平均票价
avg_fare=df['Fare'].groupby(df['Sex']).mean()
avg_fare
Task2:统计泰坦尼克号中男女的存活人数
sex_sum_survived=df['Survived'].groupby(df['Sex']).sum()
sex_sum_survived
Task3:计算客舱不同等级的存活人数¶
pclass_sum_survived=df['Survived'].groupby(df['Pclass']).sum()
pclass_sum_survived
【 思考1】从数据分析的角度,上面三个任务统计结果可以得出哪些结论?
1、女性平均票价接近是男性平均票价的两倍。
2、女性存活人数占总存活人数的68.1%,男性存活人数占总存活人数的31.9%;其中女性存活率占全部女性的74.2%,男性存活率占全部男性为18.9%, 女性存活率远高于男性。
3、客舱等级1的存活人数最多,客舱等级3次之,客舱等级2最少;客舱等级1的存活率为62.96%,客舱等级2的存活率为47.29%,客舱等级3的存活率为24.25%,可以看出 客舱等级越高存活率越高 。【思考2】从任务二到任务三中,这些运算可以通过agg()函数来同时计算。并且可以使用rename函数修改列名。
df.groupby('Sex').agg({'Fare':np.mean,'Pclass':'count'}).rename(columns={'Fare':'mean_fare','Pclass':'count_pclass'})
Task4:统计在不同等级的票中的不同年龄的船票花费的平均值
#方法一
df.groupby(['Pclass','Age'])['Fare'].mean()
#方法二
df.groupby(['Pclass','Age']).agg({'Fare': np.mean})
Task5:将task2和task3的数据合并,并保存到sex_fare_survived.csv
#方法一 concat
sex_fare_survived1=pd.concat([avg_fare,sex_sum_survived],axis=1)
sex_fare_survived1
sex_fare_survived1.to_csv('sex_fare_survived1.csv')
#方法二 merge
sex_fare_survived2=pd.merge(avg_fare,sex_sum_survived,on='Sex')
sex_fare_survived2
sex_fare_survived2.to_csv('sex_fare_survived2.csv')
#不能用join方法,因为任务二和任务三得到的数据都是Series类型,只有DataFrame中才有join方法
Task6:得出不同年龄的总的存活人数,然后找出存活人数最多
年龄组,并最终计算最高存活率(幸存者人数/总幸存者人数)[En]
The age group, and finally calculate the highest survival rate (number of survivors / total number of survivors)
#step1 不同年龄的总的存活人数
age_survived=df['Survived'].groupby(df['Age']).sum()
age_survived
#step2 存活人数最多的年龄段
max_age_survived=age_survived[age_survived.values==age_survived.max()]
max_age_survived
#step3 总的存活人数
age_survived_sum=df['Survived'].sum()
age_survived_sum
#step4 计算存活人数最高的存活率
print("最大存活率:{}".format(max_age_survived.values/age_survived_sum))

【总结】动手学数据分析(三)还是在做数据准备工作。其两大任务为数据合并和数据聚合运算。通过本节学习,主要掌握了合并函数concat、merge和join的用法及区别;以及在pandas中groupby的灵活运用。(PS:希望下次任务能早点完成。)
Original: https://blog.csdn.net/weixin_48410013/article/details/125353731
Author: weixin_48410013
Title: Datawhale分组学习—动手学数据分析(三)
相关阅读
Title: django学习03-创建django项目
创建项目
项目的创建一般有两种方式,一种通过cmd命令行模式,另一种是通过ide创建。其中cmd创建方式如下:
命令行模式创建django项目
在搜索栏输入cmd,出现命令提示符后,点击 打开
或者 以管理员身份运行
都可以,不过以管理员身份运行貌似保险一点,或者更具有专业性

进入命令行模式后,如图所示:
[En]
After entering the command line mode, it is shown as follows:

输入命令 d:
使路径切换到D盘,使用 mkdir
函数创建一个新目录,因为写这个的时候我已经把项目完成的差不多了,所以这个目录就是做一个例子

打开D盘可以看到文件夹创建成功

然后使用
cd
函数,使路径切换到新创建的文件夹,随后输入指令:django-admin startproject 项目名
,这个指令的意思很明显,创建一个django类的项目
项目创建成功后,原本空荡荡的Djangoxiangmu文件夹应该多了些许文件,如下:


; 查看项目
我们可以用IDE打开才创建的项目看一看

找到项目文件夹所在,注意选的是刚才创建的
项目
名,然后点击🆗
打开后项目展示如下:

文件讲解
您可以看到,在成功创建项目后,会自动生成许多文件
[En]
You can see that many files are automatically generated after the project is created successfully

__init__.py
初始化文件,开始为空,在django项目中可以告诉Django用pymysql来代替默认的MySQLdb
import pymysql
#告诉Django用pymysql来代替默认的MySQLdb
pymysql.install_as_MySQLdb()
__init__
.py文件最常用的作用是标识一个文件夹是一个 python包。
__init__
.py文件的另一个作用是定义模糊导入时要导入的内容。
如果想对该文件有更多了解【点链接】
- asgi.py
用于启动异步通信服务,如在线聊天等异步通信功能。[En]
Used to start asynchronous communication services, such as online chat and other asynchronous communication functions.
- settings.py
项目的配置文件,通过settings可以看出这个文件夹有很大作用,基本功能有改变时区和语言等。 - urls.py
项目的路由设置文件,可以设置项目网站的具体URL内容。[En]
The routing settings file of the project, which can set the specific URL content of the project website.
- wsgi.py
全称为Python Web Server Gateway Interface
,即Python服务器网关接口
,是 Python应用与Web服务器之间的接口,用于Django项目在服务器上的部署和上线,一般不需要修改。 - manage.py
命令行工具
,内置多种方式与项目进行交互。在命令提示符窗口下,将路径切换到MyDjango项目并输入python manage.py help,可以查看该工具的指令信息。
查看manage.py
; 调试检查设置初设与运行
项目已创建,让我们运行并检查它。
[En]
The project has been created, let’s run it and check it.


点击网址

英文界面显示你已经成功创建一个django项目了,英文看着不舒服就换成中文。

再次双击该URL以查看语言是否已更改。
[En]
Double-click the URL again to see that the language has changed.

项目自动生成的文件(或者说应用什么的)在网站搭建上显然是不够用的,我们需要新建一个应用,在后续的学习中说不定会新建更多应用。
- 指令:
python manage.py startapp 应用名
将上述指令在终端(terminal)输入
进入终端只需要点击一下terminal就好
我以index01作新应用名,本来想用index的,后来出现错误显示是 'index' conflicts with the name of an existing Python module and cannot be used as an app name. Please try another name.
翻译过来就是:- *
“index”与现有Python模块的名称冲突,不能用作应用程序名称。请改名。
(我记得之前有用过这个单词做app名,不知道是不是这个原因。)
输入指令后没有返回参数。刷新左侧的项目列表。如果您键入正确,则应该是以下情况:
[En]
There are no return parameters after the instruction is entered. Refresh the list of items on the left. If you type correctly, it should be the following scenario:


当然,如果项目创建不止于此,还要在
settings.py
文件配置好(添加该应用)。首先,项目配置一般都在
settings.py
文件进行,该文件只在主应用(也就是一开始用命令行模式创建的项目)下存在,不能进行偏移。所以我们找到主应用下的该文件,找到
INSTALLED__APPS
,在包括的应用中添加我们新建的应用,引号是英文引号,后面的英文逗号可以加上,以免后续在添加新应用时忘记(注册的应用之间用英文逗号隔开)。
- 主路由配置文件中的路由分布
[En]
Route distribution in the primary routing profile*
在主应用中找到
urls.py
文件,添加子路由
随后在子应用中创建子路由文件urls.py
- 然后在子应用的尝试文件中配置view函数(先测试)
[En]
then, configure the view function in the attempt file of the sub-application (test it first)*
- 然后配置子路由文件
[En]
then configure the child routing file*
- 重新运行一下看看效果
好的,没问题。在浏览器中输入它。[En]
Oke, no problem. Enter it in the browser.
奥凯有点不对劲。我看了配置文件,又看了一遍。有一段时间,我认为这是主线的问题。我想定期写这篇文章。[En]
There is something wrong with Oke. I looked at the configuration file and looked at it again. For a time, I thought it was the problem of the main route. I wanted to write it regularly.
后来发现
我设置的路由路径是index
,输入网址却习惯性的写成了index01,将网址改正以后就好了(改正成index01) - 将文件迁移一下
- 执行指令
python manage.py migrate
- 创建一个超级管理员
首先用户名可以自己随便起,记得就好,电子邮件地址只要符合格式就好,输入密码时不会有显示,所以输入后敲回车就好,只不过需要二次确认,再次输入确认就好,最后在接下来的问题中输入 y
超级管理员就创建好了

进入后端查看一下:
输入网址
http://127.0.0.1:8000/admin
输入账号密码

创建成功:

- 小知识:
Python Web Server Gateway Interface,即Python Web服务器网关接口,实际上就是一种协议,我们的应用(Django、Flask)实现了WSGI,就可以配合实现了WSGI(uWSGI、gunicorn)的服务器工作了。
最后如果真有人照着我这个敲出问题了,试试 python manage.py migrate 这个命令,这东西我忘记在内容里添上去了
Original: https://blog.csdn.net/qq_52158380/article/details/121696014
Author: Bug码畜
Title: django学习03-创建django项目
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/297409/
转载文章受原作者版权保护。转载请注明原作者出处!