Introduction to Data Science in Python

Nav Bar

  • Intro[1]
  • Week 1[2]
  • Week 2[3]
  • Week 3[4]
  • Week 4[5]
  • Reference[6]

  1. Introduction
    本课程来自于Coursera本校UMich的数据科学入门级课程,使用的教学工具是:
    python 3.0 ~ Jupiter Notebook ~ Stack Overflow
    我看看哪个说 斯塔克.哦.我服了 不是工具的

    image

    四周的quiz参考以及课程自带Ref传送门:Github
    其实我之前已经结束了Data Science Adv的相关课程,但学校课程使用了R和Python两种语言并且默认学生有比较好的基础(好吧是我基础比较薄弱),无论是在前期的各种数学模型和后面的Machine Learning Model学习中都没有静下心看看python基础语句和几个常用模型的架构。所以还是有点不爽地来填坑了。


  2. Week 1

    Screen Shot 2018-12-21 at 3.37.51 PM.png

    David Donoho 在"50 Years of Data Science"中把Data Analysis总结为六步:
    1、 Data Exploration and Preparation/数据选择/数据导入/数据分布探索
    2、 Data Representation and Transformation/数据图表化/数据预处理/面向输入类型进行必要的清理和格式标准化
    3、Computing with Data/将功能函数或搜索语句或算法作用于数据集
    4、Data Modeling/构建预测/评估模型
    5、Data Presentation and Visualization 可视化
    6、Science about Data Science 作者自别于芸芸DA的不二法门

    Python是亲人而非亲计算机的高级语言,动态翻译非编译因而无需像Java一样声明变量类型,通过Indent Space和End Marker来确定Loop/Function作用域而摒除了满屏的花括号。

    Python Function

    无返回值时无须写return,自带none返回值
    def f(a, b, c = none)的形式自适配于双参/三参而无需重载,但是设置初值的参数要放在参数表尾部

    Python Type

    Python的变量类型可以通过type(var)查询:str,int,float,NoneType(none),还有函数对象(function)等。

    Python Immutable Type: int, string, float, tuple
    Python Mutable Type: dict, list

    可变与不可变的机制本质来源于Python底层实现了对象和引用的分离。视频中虽然说str类型时 ‘lists of character’,但其实python中的string类型可以与java中的进行类比,同样的intern实现常量池的概念,同样的操作ref而非obj。那么既然str说到底就是char类型的list(好处在于各种slice方法实现起来无需另起炉灶),凭什么str类型千磨万击还坚劲而list却风中细柳任披拂呢?说到底就是因为python不提供对str类型中的list进行赋值的接口,如果你想作类似于list的str[n] = 'sth'的操作会报item assignment not supported的错误。而其他诸如replace()的方法只要不把新指向的引用复制给原引用,原引用及原引用指向的对象都不会改变。

    Tuple元组 tuple = (a, b)
    Lists列表 list = [a, b]
    Dictionary字典 Dic = {'1':a, '2':b}

    其次Python也支持类似于Java里的class自建类:

    class Person:
        ## no explicit constructor in need, if a must, use _init_ method
        ## python does not have any access identifier, so you can manipulate things in a class with full access
        department = "School of Information"
        def set_name(self, new_name):
              self.name = new_name
        def set_location(self, new_loc):
              self.location = new_loc
    

    接下来就是map:

    Screen Shot 2018-12-21 at 7.35.17 PM.png

    老生常谈的lambda:lambda a, b, c: a+b
    有点新意的list comprehension:

    def times_tables():
       lst = []
    for i in range(10):
       for j in range (10):
           lst.append(I*j)
    return lst
    
    times_tables() == [i*j for i in range(10) for j in range(10)]##return True
    

    Quiz Answers
    1. Python is an example of an Interpreted language
    This material was covered in the "Python Functions" lecture.
    2. Data Science is a Interdisciplinary, made up of all of the above
    This material was covered in the "Data Science" lecture.
    3. Data visualization is not a part of data science.False
    This material was covered in the "Data Science" lecture.
    4. Which bracketing style does Python use for tuples?( )
    This material was covered in the "Python Types and Sequences" lecture.
    5. In Python, strings are considered Mutable, and can be changed.False
    This material was covered in the "Python More on Strings" lecture.
    6. What is the result of the following code: ['a', 'b', 'c'] + [1, 2, 3]['a', 'b', 'c', 1, 2, 3]
    This material was covered in the "Python Types and Sequences" lecture.
    7. String slicing is A way to make a substring of a string in python
    This material was covered in the "Python More on Strings" lecture.
    8. When you create a lambda, what type is returned? E.g. type(lambda x: x+1) returns
    This material was covered in the "Advanced Python Lambda and List Comprehensions" lecture.
    9. The epoch refers to January 1, year 1970
    This material was covered in the "Python Dates and Times" lecture.
    10. This code, [x**2 for x in range(10)] , is an example of a List comprehension
    This material was covered in the "Advanced Python Lambda and List Comprehensions" lecture.
    11. Given a 6x6 NumPy array r, which of the following options would slice the shaded elements?

    image.png
    r.reshape(36)[::7]
    You could also use np.diag(r). This material was covered in "Advanced Python Demonstration: The Numerical Python Library (NumPy)"
    12. Given a 6x6 NumPy array r, which of the following options would slice the shaded elements?
    image.png
    r[2:4,2:4]
    This material was covered in "Advanced Python Demonstration: The Numerical Python Library (NumPy)"
    明天有空更新week 2的学习笔记,第一周内容跳过了有关date/time函数,感兴趣的可以自行查阅numpy/datetime/time module的cheatsheet

  3. Week 2
    第二周的内容集中于pandas module。虽然叫熊猫包也挺可爱的,但pandas其实是panel data,致力于优化multidimensional data set的数据结构及数据处理方面。视频中教授特别提到了stack overflow中的pandas社区,只需要发布问题时加上pandas的tag,该模组的开发团队将有很大可能亲自为你答疑解惑。(毕竟是有几百个contributor的团队)。

    Series

    Series在构成上类似于python自带的dictionary结构,Index可以类比于Keys。Pandas为其封装了很多方法,并且因为pandasnumpy library 内置包,其性能在涉及计算的时候相当优异。可以通过pd.Series()将原始类型list/dict转化为pd.Series。数字类型缺省值是np.NaN,可以用np.isnan()判存。
    查询series里item的方式可以使用iloc[1]/loc['one']两种方式。
    %%timeit -n 100可用于测试方法执行时长

    DataFrame

    Series是one-dimensional array-like的数据形式,那么pandas的核心DataFrame可以理解为two-dimensional series。

    Screen Shot 2018-12-22 at 2.10.55 PM.png

    df.T可用来转置dataframe

    通过type()我们可以看到dataframe是由series结构组成的二维数据结构。
    有多种方式可以从dataframe中选择部分数据:
    Screen Shot 2018-12-22 at 2.36.18 PM.png

    Screen Shot 2018-12-22 at 2.36.06 PM.png

    Screen Shot 2018-12-22 at 2.40.32 PM.png

    Screen Shot 2018-12-22 at 2.40.45 PM.png

    Screen Shot 2018-12-22 at 2.37.09 PM.png

    Screen Shot 2018-12-22 at 2.33.54 PM.png

    Screen Shot 2018-12-22 at 2.34.01 PM.png

    方便之余只需要注意自己需要的返回类型,以及chaining的方式是返回copy而非view即可。
    df.drop('rowName')用于删除行(不改变原数据集)
    del df['colName']用于删除列
    如果想更改列名

    col = df.columns[1]
    df.rename(columns={col:'Gold' + col[4:]}, inplace=True)
    

    df.reset_index()用于重置index
    df.set_index('colName')可以把某一列设置为index,设置前记得保存现有index为单独一列否则会失去这一信息
    df = df.set_index(['STNAME', 'CTYNAME']) set dual-index(也就是数据库里的组合键)
    Quiz Answer可以在github里找到。 ↩

  4. Week 3
    半夜秃头把第三周内容写完。
    本周第一个知识点,合并dataframe:

    Screen Shot 2018-12-23 at 1.36.14 AM.png

    这是一个维恩图,说到Venn大家第一个想到的肯定是我的薇恩天秀...好吧,merge合并的概念部分只需要大概了解对于集合set而言left union/right union/union/intersection这几个操作的概念就好了。
    使用Pandas里的merge函数能完成将两个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'), copy=True, indicator=False, validate=None)

    主要参数介绍:
    left:参与合并的左边的DataFrame(相当于SQL的join中的左表);
    right:参数合并的右边的DataFrame(相当于SQL的join中的右表);
    how:为合并的方式,分别为'inner','outer','left','right',默认为'inner'(相当于SQl中表连接的内连接、外链接、左链接和右连接,说白了就是:内连接是求交集;外连接是求并集;左连接是以左边的数据为准,查询出右边的数据;右连接则是反过来);
    on:两个DataFrame用户连接的列名,必须同时存在于两个DataFrame中,如果未指定则为两个表的交集作为连接键;
    left_on:左表用于连接的列(主要用户两个DataFrame不存在相同的列名时);`colName`
    right_on:右表用于连接的列;`colName`
    left_index:是否将左边的DataFrame的索引作为连接键;`boolean`
    right_index:是否将右边的DataFrame的索引作为连接键;`boolean`
    sort:根据连接键对合并的结果进行排序;
    suffixes:字符串的元组,用于追加于重叠列名的末尾,默认为(_x,_y)
    

    Pandas Idiom

    pandas社区创造了一个词pandorable即符合pandas规范/习惯的python语法。
    前文提到的Index Chaining正如提到的会返回一个副本,因此在某些情况下是有风险的。而
    这里要引出的是method chaining(虽然实现原理不一样,应用上其实可以类比Java里的stream API)。
    (df.where(df['SUMLEV']==50) .dropna() .set_index(['STNAME','CTYNAME']) .rename(columns={'ESTIMATESBASE2010': 'Estimates Base 2010'}))
    括号是为了使较长的单行内容被分配到多行后保证原本的可读性。
    接下来介绍的方法比较实用——df.apply()

    import numpy as np
    def min_max(row):
        data = row[['POPESTIMATE2010',
                    'POPESTIMATE2011',
                    'POPESTIMATE2012',
                    'POPESTIMATE2013',
                    'POPESTIMATE2014',
                    'POPESTIMATE2015']]
        row['max'] = np.max(data)
        row['min'] = np.min(data)
        return row
    df.apply(min_max, axis=1)
    

    以上代码先按列取出了sub dataframe,再对其按行求最大/最小值并命名新的两列附加在原dataframe上返回。再次需要特别提出的是Pandas保持了Numpy对关键字axis的用法,用法在Numpy库的词汇表当中有过解释:

    轴用来为超过一维的数组定义的属性,二维数据拥有两个轴:第0轴沿着行的垂直往下,第1轴沿着列的方向水平延伸。

    因此前面删除一列还可以这么写:
    df.drop('colName', axis = 1)意为按行水平方向搜索符合name的列并删除,不要被最后删除了纵向上的一列的结果所迷惑。

    groupby

    Screen Shot 2018-12-23 at 4.30.30 PM.png

    在我看来groupby()用起来还是需要一些经验累积的,你必须明确知道自己需要什么结果以及通过何种操作能够得到这样的结果。首先,在上图的官方文档中说明了groupby()返回的是GroupBy Object
    Screen Shot 2018-12-23 at 5.34.01 PM.png

    Screen Shot 2018-12-23 at 5.34.21 PM.png

    Screen Shot 2018-12-23 at 5.33.36 PM.png

    通过上面三幅图不难发现,groupby结果无法直接可视化,head()结果与原dataframe一致。那么难道是因为groupby失效了吗?
    其实不然,现在我们在group()后加上前面的apply函数:
    Screen Shot 2018-12-23 at 7.00.28 PM.png


    现在dataframe是按照所想要的分组显示的,而当按行求最大时会在比较时只保留数值型列,而在按列比较时因为是同类型之间比较,在图中因为Tpoon在unicode编码上大于Spoon所以被np.max()保留。
    Screen Shot 2018-12-23 at 7.07.30 PM.png

    而做完apply处理后(直接使用其他方法处理后应该也等效)返回的就是标准的dataframe/series。
    同样的 groupby也支持基于分类方法分组。
    分组完成后如果想对不同列进行操作可以使用agg()方法:
    Screen Shot 2018-12-23 at 8.30.57 PM.png

    这里需要注意的是agg()SeriesGroupBy/DataFrameGroupBy对象的效果有细微的不同:
    Screen Shot 2018-12-23 at 8.31.07 PM.png

    Screen Shot 2018-12-23 at 8.31.15 PM.png

    Screen Shot 2018-12-23 at 8.31.27 PM.png

    即对每列进行单独的操作还是对所有列进行相同操作的区别。特别一提,level=0意思是当存在多级索引时选择哪级索引进行分组。

    Scales

    数据的scales是数据清理时需要考虑的重要属性之一。


    Screen Shot 2018-12-24 at 1.33.45 AM.png

    期中nominal scale也就是categorical data。

    df = pd.DataFrame(['A+', 'A', 'A-', 'B+', 'B', 'B-', 'C+', 'C', 'C-', 'D+', 'D'], index=['excellent', 'excellent', 'excellent', 'good', 'good', 'good', 'ok', 'ok', 'ok', 'poor', 'poor'])
    df.rename(columns={0: 'Grades'}, inplace=True)
    grades = df['Grades'].astype('category', categories=['D', 'D+', 'C-', 'C', 'C+', 'B-', 'B', 'B+', 'A-', 'A', 'A+'], ordered=True)//转化为有序分类
    pd.cut(grades, 3, labels=['bad', 'normal', 'good'])//二次分类
    

    Pivot Table

    数据透视表(Pivot Tables)是为了特定的分析目的,将DataFrame数据聚合的一种方式。数据透视表伴随着大量的agg函数的使用,而且它自己也是一个DataFrame。


    Screen Shot 2018-12-24 at 2.05.34 AM.png

    Screen Shot 2018-12-24 at 2.05.47 AM.png

    由上图可见透视表就是取原数据中的三列构造出新的数据框图,通过设置aggfunc和margins可以实现对行进行再统计。
    照常跳过错综复杂的date模块。第三周的quiz答案也在GitHub 中可以找到。争取明天总结完第四周的内容。

  5. Week 4

    Distribution

    这周开篇讲的是概率论与数理统计的内容...想跳过。
    二项分布

    import pandas as pd
    import numpy as np
    np.random.binomial(1, 0.5) //0 or 1
    np.random.binomial(1000, 0.5)/1000 //approximately 0.5
    np.random.binomial(20, 0.5, 1000)// ndarray with size 1000
    

    标准高斯分布
    中心为零,零点两侧呈对称分布。
    Distribution central tendency:常用中位数/均值/众数表示,代表了该分布中主体观测值落在哪个区间。
    Variability of Distribution:常用标准差或者四分位差来表示。用于表示观测样本与均值的差异有多大。

    distribution = np.random.normal(0.75,size=1000)
    np.std(distribution)
    

    峰态kurtosis被用于表征概率密度分布曲线在平均值处峰值高低的特征数。直观看来,峰度反映了峰部的尖度。样本的峰度是和正态分布相比较而言统计量,如果峰度大于三,峰的形状比较尖,比正态分布峰要陡峭。反之亦然。而计算峰态时会通过减去三使正态分布的峰态为零,这样一来峰态的正负则意味着相对于正态分布而言该分布更加peaky/flat。
    偏度skewness被用来表现概率分布密度曲线相对于平均值不对称程度的特征数。直观看来就是密度函数曲线尾部的相对长度。

    卡方分布

    Screen Shot 2018-12-24 at 4.39.20 PM.png

    图中正态分布由于本身分布就是对称分布所以偏度很小,因此继续引入卡方分布。卡方分布只有一个参数——自由度。通过改变自由度可以发现卡方分布是个左偏分布。而随着自由度变大,偏度值越来越小。


    Screen Shot 2018-12-24 at 4.39.29 PM.png

    modality用于表征分布的有几个峰。
    第四周的作业综合了前面学到的大部分内容,并用做一个假设检验案例。相关答案在Github中。

  6. Reference
    Pandas Cheat Sheet
    Numpy Cheat Sheet
    Data Skeptic Internship
    Planet Python
    Pandas Toolkit Documentation ↩

你可能感兴趣的:(Introduction to Data Science in Python)