0%

每周导学-第五周-阶段总结&项目二优化

Don’t let yesterday take up too much of today.

Hi,同学们,本周是P2阶段的最后一周了,我们用了两周时间学习了数据类型、控制流以及脚本编写等Python基础内容,还学习了Python做数据分析两个关键的第三方包——NumPy和Pandas,接下来用了一周的时间挑战项目二,相信大家经过了高强度的学习+实战化项目,对Python及Pandas一定有了更深刻更扎实的了解,那么,本周呢我们的针对P2的知识点进行总结回顾,对项目二进行修缮拓展,为下一阶段打好基础!

时间 学习重点 对应课程
第1周 Python基础内容 数据类型和运算符、控制流、函数、脚本编写
第2周 Python数据处理内容 Numpy & Pandas - 第一、二部分
第3周 完成项目 项目:探索美国共享单车数据
第4周 项目修改与通过 修改项目、查缺补漏、休息调整

对于非小白同学来说 ,本阶段内容不是很难,希望你们能在三周内完成并通过项目;

对于小白来说,本阶段可能是个挑战,请一定要保持自信,请一定要坚持学习和总结,如果遇到任何课程问题请参照如下顺序进行解决:

饭要一口一口吃,路要一步一步走,大家不要被任务吓到,跟着导学一步一步来,肯定没问题哒!那我们开始吧!

注:本着按需知情原则,所涉及的知识点都是在数据分析过程中必须的、常用的,而不是最全面的,想要更丰富,那就需要你们课下再进一步的学习和探索!

本周目标

  • 顺利通过项目二,自行总结P2阶段的知识点。

学习计划

时间 学习资源 学习内容
周二 微信群 - 每周导学 预览每周导学
周三、周四 Udacity - Classroom 项目二
周五 微信/Classin - 1V1 课程难点
周六 Classin - 优达日 本周学习总结、答疑
周日 笔记本 总结沉淀
周一 自主学习 查漏补缺

阶段总结

在本阶段,我们学习了:

  • Python的数据类型和运算符
  • Python的循环、判断语句
  • 如何自定义Python函数
  • NumPy&Pandas的基本操作

除此之外,你还掌握了一些软件的操作:

  • Python IDE的使用(Spyder/Atom)
  • Jupyter Notebook的使用
  • Python拓展包的安装部署

不知不觉间,你还锻炼了一些软技能:

  • 编程思维(把复杂的问题分解;把新问题变成老问题;凝练解决问题的核心;算法最优解)
  • 自主学习能力(效率更高,方法更优,持续时间更长)
  • 独立解决问题的能力
  • 更积极、更自信

经过这一个月的学习,大家收获颇丰。除了硬技能之外,更重要的是软技能的锻炼,不论你从事何种工作,甚至是在生活中,编程思维和自主学习能力都会让你尝到甜头,所以请继续加油吧!

知识要点

第二周必学知识点:

  • Python数据类型和运算符

    可以先自行回想一下,python的数据类型有哪些?运算符有哪些?在这一个月的练习和项目中,他们的用途都有哪些?自己在这一章节有没有薄弱点?

  • 控制流

    重点要熟练掌握:一个条件语句和两个循环语句的用法,两个循环语句的区别,break与continue的用法,再就是enumerate函数的用法。

  • 函数

    函数的定义及变量的作用域是要熟练掌握的,lambda的话,了解就好。

第三周必学知识点:

  • Pandas数据结构

    对于Pandas中两大最重要的数据类型:Series(一维)和DataFrame(二维),熟悉他们的结构和特点,这是你用python Pandas做数据分析的基础。

  • Pandas数据操作

    本阶段主要是对Pandas中数据的基本操作进行了讲解,在P3阶段会有更多的操作技巧及练习等着大家!

  • Pandas自定义函数的调用

    常用的是apply,但两者的区别要搞清楚

  • Pandas常用数据筛选函数

    这个的话,本章涉及不多,可以等到P3学完一起总结,按照数据分析的流程,把各个阶段常用的函数做个用法列举,效果更好。

项目优化

虽然收到了项目二的通关邮件,但是你对自己的代码或者项目的完成度满意吗?大家在Uda学习,也是为生活所迫,想求上进,那既然是求上进,就别上到90%就放松下来,做就做到100%,一定要对自己负责,所以大家通关后,我会拉大家到【代码互评】的微信群,大家分享代码、分享思路,交流心得,相互挑刺,想想就觉得很棒!所以说,大家讨论完之后,这个板块还会再进行更新~

废话不多说,那么,我先来抛砖引玉,给大家简单展示下我认为的一些可以尝试去改进的地方:

get_filters()函数

  • 用户输入错误时提示再次输入;

    1
    2
    3
    4
    if ... in ...:
    ...
    else:
    print('提示:')
  • 兼容大小写,只要用户输入了正确数据,即可进行响应,比如说用户想要筛选城市chicago的数据,但是不小心输成了Chicago,也能进行正确响应。

    1
    city = city_input.lower()
  • 利用循环和函数简化重复性代码

    比如说,最开始我写的代码是:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    def get_filters():
    print('Hello! Let\'s explore some US bikeshare data!')

    #定义列表
    city_list = ['chicago','new york city','washington']
    month_list = ['all','january','february','march','april','may','june']
    day_list = ['all','monday','tuesday','wednesday','thursday','friday','saturday','sunday']

    while True:
    city = input('Q1/3:which city do you want to analyst?(chicago,new york city or washington)\n')
    if city in city_list:
    break
    else:
    print('please ensure your input is one of the examples!')

    while True:
    month = input('Q2/3:which month do you want to analyst?(all,january, february, ... , june)\n')
    if month in month_list:
    break
    else:
    print('please ensure your input is one of the examples!')

    while True:
    day = input('Q3/3:which day do you want to analyst?(all, monday, tuesday, ... sunday)\n')
    if day in day_list:
    break
    else:
    print('please ensure your input is one of the examples!')

    print('-'*40)
    return (city, month, day)

    如上,对于city、month和day三个变量来说,代码是重复的,只是变量不同输出的话术不同而已,那么就可以将这三个变量和话术对应成某个函数的参数,然后通过调用这个函数,就可以简化重复的代码。

    这个函数大概可以是这样:

    1
    2
    3
    4
    5
    6
    def phrase_input(input_prompt,err_prompt,option_list):

    user_input = input(input_prompt)
    while user_input not in option_list:
    user_input = input(err_prompt)
    return (user_input)

    改善后的代码如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    def phrase_input(input_prompt,err_prompt,option_list,get_value):

    user_input = input(input_prompt)
    while get_value(user_input) not in option_list:
    user_input = input(err_prompt)
    return (user_input.title())

    def get_filters():
    print('Hello! Let\'s explore some US bikeshare data!')

    #定义列表
    city_list = ['chicago','new york city','washington']
    month_list = ['all','january','february','march','april','may','june']
    day_list = ['all','monday','tuesday','wednesday','thursday','friday','saturday','sunday']

    #定义话术
    city_prompt = 'Q1/3:which city do you want to analyst?(Chicago,New York city or Washington)\n'
    month_prompt = 'Q2/3:which month do you want to analyst?(All,January, February, ... , June)\n'
    day_prompt = 'Q3/3:which day do you want to analyst?(All, Monday, Tuesday, ... Sunday)\n'
    err_prompt = 'Please ensure your input is one of the examples above. Please input it again:\n'

    #定义get_value函数,取输入的小写值
    get_value = lambda x: x.lower()

    #调用函数
    city = phrase_input(city_prompt,err_prompt,city_list,get_value)
    month = phrase_input(month_prompt,err_prompt,month_list,get_value)
    day = phrase_input(day_prompt,err_prompt,day_list,get_value)

    print('-'*40)
    print('Your input is : \n')
    print(city, month, day)

trip_duration_stats()函数

这个函数最大的问题就是,输出不够人性化,因为计算得来的时间计算值是xxx秒,而我们平时生活中,对于大于60s的时间更偏向于说xxx分,或者xxx小时xxx天。所以这里,为了优化输出,需要我们定义一个时间转换函数,把计算结果,更人性化地呈现。

最终代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import math
import pandas as pd
import time

def changeTime(allTime):

#定义一天、一小时、一分钟的秒数
day = 24*60*60
hour = 60*60
min = 60

#小于60s时,利用math.ceil函数向上取整
if allTime <60:
return ("%d sec(s)"%math.ceil(allTime))

#利用divmod函数,获取模和余数的元组,将模作为 天,将余数继续进行函数
elif allTime > day:
days = divmod(allTime,day)
return ("%d day(s), %s"%(int(days[0]),changeTime(days[1])))

#跟上面同理
elif allTime > hour:
hours = divmod(allTime,hour)
return ('%d hour(s), %s'%(int(hours[0]),changeTime(hours[1])))


else:
mins = divmod(allTime,min)
return ("%d min(s), %d sec(s)"%(int(mins[0]),math.ceil(mins[1])))

def trip_duration_stats(df):

print('\nCalculating Trip Duration...\n')
start_time = time.time()

total_duration = df['Trip Duration'].sum()

mean_duration = df['Trip Duration'].mean()

#利用format进行格式化输出,调用changeTime函数
print('The total travel time is around {} .'.format(changeTime(total_duration)))
print('The mean of travel time is around {} .'.format(changeTime(mean_duration)))

print("\nThis took %s seconds." % (time.time() - start_time))
print('-'*40)

出现的一些不熟悉的代码/函数详解可以戳:

ceil

利用%和format进行输出格式化

devmod

user_stats()函数

这个函数面临的问题是由于数据集导致的,因为在Washington的数据缺失了性别和出生年份列,所以本函数在调用Washington数据的时候会报错,那这里就需要try和except登场进行异常处理了。

这里的相关知识可以参考第二周导学

其他待优化的问题

比如说,你还想对数据中的哪些问题感兴趣,可以自定函数进行展示;

或者,你的代码并不符合PEP8的标准,可以参考第二周导学,进行查证。

最后

经过如上的过程,大家也能了解到代码都不是一蹴而就的,而是随着你项目的深入不断进行修改调试的过程,这和你的学习一样,是一个不断试错,螺旋上升的过程。所以说,不要怕不会,更不要怕做错,不要丢了信心和耐心,把不会的掌握,把问题解决,这才是你应该做的,大家加油!!!