Dataquest笔记

作者: 信步云深处 | 来源:发表于2017-08-02 20:27 被阅读185次

    python中级

    class

    class Dataset:
            def __init__(self, data):
                self.header = data[0]
                self.data = data[1:]
    

    其中,init要加双下划线,所有成员函数要有self参数。

    try...except...

    try:
            int('')
    except [Exception as exc]:
            print("There was an error")
        [print(str(exc))]
    

    global标识

    global variable
    variable =  xxx
    

    正则表达式

    re模块

    import re
    "."         代表单个字符
    "^xxx"  以xxx开头
    "xxx$"  以xxx结尾
    “[abc]” abc均可
    "|"     或
    "{n}"       重复n次前一个re,例如年限:"[1-2][0-9]{3}"
    "{m,n}" m到n个前一个re
    “*”     0或多个RE, 尽量多ab* will match ‘a’, ‘ab’, or ‘a’ followed by any number of ‘b’s. 
    '+'     1或多个RE. ab+ will match ‘a’ followed by any non-zero number of ‘b’s; it will not match just ‘a’.
    '?'     0或1个RE
    
    re.search(regex, string)
    re.sub(regex, repl, string, count=0, flags=0)
    re.findall(pattern, string, flags=0)    例如:flags=re.IGNORECASE
    

    python编译器对于变量名称解析的规则

    LEGBE:local -> enclosing scope -> global -> build-ins -> throw an error

    时间模块

    # Unix 时间模块:1970年第一秒至今
    import time
    current_time = time.time()
    current_struct_time = time.gmtime(current_time)
    current_hour = current_struct_time.tm_hour
    # 以上
    tm_year: The year of the timestamp
    tm_mon: The month of the timestamp (1-12)
    tm_mday: The day in the month of the timestamp (1-31)
    tm_hour: The hour of the timestamp (0-23)
    tm_min: The minute of the timestamp (0-59)
    
    # UTC 时间
    import datetime
    current_datetime = datetime.datetime.now()
    current_year = current_datetime.year
    current_month = current_datetime.month
    # timedelta 模块,用以计算相对时间,使用方法如下:
    diff = datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
    datetime1 = datetime1 +/- diff
    
    # datetime输出时间
    datetime.strftime(“format”)
    例如:
    import datetime
    mystery_date_formatted_string = mystery_date.strftime("%I:%M%p on %A %B %d, %Y")
    print (mystery_date_formatted_string )
    

    strftime格式详见

    # 将字符串转为datetime对象
    march3 = datetime.datetime.strptime("Mar 03, 2010", "%b %d, %Y")
    # 将Unix时间转为datetime对象
    datetime.datetime.fromtimestamp(unix_timestamp)
    

    numpy

    核心数据类型是ndarray,即矩阵
    import numpy as np
    vector = np.array([5, 10, 15, 20])
    matrix = np.array([[5, 10, 15], [20, 25, 30], [35, 40, 45]])
    data = np.genfromtxt("world_alcohol.csv", delimiter=',')

    缺点:
    * 单一数据中的各个元素必须是同一种类型
    * 行列都只能用数字来索引

    pandas

    核心数据类型是dataframe,即二位的数据表。单个行列称之为series。
    import pandas as pd
    food_info = pd.read_csv("food_info.csv")
    food_info.head(5) #显示前五行
    column_names = food_info.columns # columns列名称,索引类型,如需转换可以用list()
    datatypes = food_info.dtypes # columns数据类型
    dimensions = food_info.shape

    行列选择

    hundredth_row = food_info.loc[99]
    hundredth_row = food_info.iloc[99]
    iloc和loc的区别:loc使用索引编号,可以使用真值list和名称进行索引,iloc只能使用数字。
    columns = food_info[[column_name1,column_name2,...]]
    

    Series计算

    由于Series的数据类型本质上是ndarray,因此可以直接使用numpy进行计算。

    使用索引

    dataframe.set_index(keys=‘column_name’, drop=False/True)
    将某列设置为索引之后,可以使用loc直接用列中的text数值进行和列名称索引一样的切片索引操作。
    

    Datacleaning

    • 仅取部分列
      columns_needed = ["DBN", "rr_s", "rr_t", "rr_p", "N_s", "N_t", "N_p", "saf_p_11", "com_p_11", "eng_p_11", "aca_p_11", "saf_t_11", "com_t_11"]

      以下两种表达所得结果相同

      survey = survey.loc[:, columns_needed]

      survey = survey[columns_needed]

    • 分别使用DataFrame和Series使用apply函数

      使用Series

      def pad_str(item):
      string = str(item)
      string = string.zfill(2)
      return string

      data['class_size']["padded_csd"] = data['class_size']["CSD"].apply(pad_str)
      data['class_size']["DBN"] = data['class_size']["padded_csd"] + data['class_size']["SCHOOL CODE"]

      def pad_str(column):
      if column.name == "CSD":
      for item in columns:
      string = str(item)
      item = string.zfill(2)
      return column

      data['class_size'] = data['class_size'].apply(pad_str, axis=1)
      data['class_size']["DBN"] = data['class_size']["padded_csd"] + data['class_size']["SCHOOL CODE"]

    pandas字符串转数字

    pandas.to_numeric(),一定要加参数errors="coerce"。这样遇到错误可以赋值为空。

    pandas做图

    import matplotlib.pyplot as plt
    DataFrame.plot.scatter(x='column name', y='column name')
    plt.show()
    

    pandas数据替换

    pandas.Series.map()使用词典进行数据替换
    yes_no = {"Yes": True,No": False}
    series = series.map(yes_no)

    pandas更改列名称

    pandas.DataFrame.rename(),使用方法和map类似

    pandas更改数据类型

    pandas.DataFrame.astype()

    命令行重命名文件

    mv file1 file2
    #当两个文件处于同一路径时即为重命名
    

    命令行定义变量

    OS=linux
    OPERATING_SYSTEM="linux"
    #变量等号两边一定不能有空格
    
    使用export可以定义环境变量
    export FOOD="Chicken and waffles"
    环境变量可以使用os包打印
    import os
    print(os.environ["FOOD"])
    

    从命令行执创建文件

    touch xxx
    

    echo流

    echo "This is all a dream..." > dream.txt
    echo "This is all a dream..." >> dream.txt
    以上,第一种覆盖原内容,第二种追加
    

    从命令行执行python脚本

    import sys
    if __name__ == "__main__":
        XXXX
        print(sys.argv[0])
        print("Welcome to a Python script")
    
    argv[0]为文件名,1之后为传入的参数
    

    source指令

    可以将批处理命令放在一个文件中,然后使用source命令加载并执行。

    pip指令

    pip freeze #查看当前安装包及其版本号
    

    grep及管道

    tail -n 10 logs.txt | grep "Error" #搜索最后10行中包含“Error”的行,文件头部可用head
    python rand.py | grep 9
    

    git

    git init
    git branch branch_name
    git checkout branch_name
    git fetch
    git add filename #添加到stage 
    git commit操作的是本地库,git push操作的是远程库。
    git commit是将本地修改过的文件提交到本地库中。
    git push是将本地库中的最新信息发送给远程库。
    git merge 
    

    使用API进行数据抓取

    import requests
    response = requests.get("url")
    json = response.json()
    
    json数据更改可以使用patch、put函数,删除使用requests.delete("url")
    

    使用beautifulsoup进行网页数据抓取

    from bs4 import BeautifulSoup
    # Initialize the parser, and pass in the content we grabbed earlier.
    parser = BeautifulSoup(content, 'html.parser')
    body = parser.body
    # Get a list of all occurrences of the body tag in the element.
    body = parser.find_all("body")
    
    # 使用CSS选择器
    parser.select("string")
    其中 ,string前缀的#代表id,.代表class
    

    SQLite

    SELECT [columns]
    FROM  [tables]
    WHERE [conditions]
    ORDER BY column1 [ASC or DESC][, column2 [ASC or DESC]]
    LIMIT [number of results]
    注意,limit应该在最后面
    
    除了选择操作,还有
    INSERT -- adds new data.
    UPDATE -- changes the values of some columns in existing data.
    DELETE -- removes existing data.
    
    INSERT INTO facts
    VALUES (262, "dq", "DataquestLand", 60000, 40000, 20000, 500000, 100, 50, 10, 20, "2016-02-25 12:00:00", "2016-02-25 12:00:00");
    
    UPDATE tableName
    SET column1=value1, column2=value2, ...
    WHERE column1=value3, column2=value4, ...
    
    DELETE FROM tableName
    WHERE column1=value1, column2=value2, ...;
    
    # 查看数据类型
    PRAGMA table_info(tableName);
    
    # 增加列
    ALTER TABLE tableName
    ADD columnName dataType;
    
    # 删除列
    ALTER TABLE tableName
    DROP COLUMN columnName;
    
    # 创建表
    CREATE TABLE dbName.tableName(
    column1 dataType1 PRIMARY KEY,
    column2 dataType2,
    column3 dataType3,
    ...
    如果有foreign key则
    foreign key(column3) reference table(column)
    );
    
    # 通过foreign key跨表查询
    SELECT [column1, column2, ...] from tableName1
    INNER JOIN tableName2
    ON tableName1.column3 == tableName2.column4;
    

    sqlite3包的使用

    连接和cursor的概念

    import sqlite3
    conn = sqlite3.connect("jobs.db")
    cursor = conn.cursor()
    query = "select Major,Major_category  from recent_grads;"
    cursor.execute(query)
    first_result = cursor.fetchone()
    five_results = cursor.fetchmany(5)
    all_results = cursor.fetchall()
    conn.close()
    

    SQLite和SQL支持的数据类型

    SQLite的数据类型中没有bool型,以整型代替。其支持的数据类型有:

    • NULL. 值是空值。
    • INTEGER. 值是有符号整数,根据值的大小以1,2,3,4,6 或8字节存储。
    • REAL. 值是浮点数,以8字节 IEEE 浮点数存储。
    • TEXT. 值是文本字符串,使用数据库编码(UTF-8, UTF-16BE 或 UTF-16LE)进行存储。
    • BLOB. 值是一个数据块,按它的输入原样存储。

    SQL支持的数据类型有:

    • bit 整型 bit 其值只能是0、1或空值。这种数据类型用于存储只有两种可能值的数据,如Yes 或No、True 或Fa lse 、On 或Off
    • int 整型 int -2147483648)到2147483 647之间的整数。占用4个字节
    • smallint 整型 -32768到32767之间的整数。占用2 字节空间
    • tinyint 整型 tinyint 0到255 之间的整数。占用1 个字节
    • numeric 精确数值型 numeric数据类型与decimal 型相同
    • decimal 精确数值型 decimal 数据类型能用来存储从-1038-1到1038-1的固定精度和范围的数值型数据。使用这种数据类型时,必须指定范围和精度。 范围是小数点左右所能存储的数字的总位数。精度是小数点右边存储的数字的位数
    • money 货币型 表示钱和货币值。存储从-9220亿到9220 亿之间的数据,精确到万分之一
    • smallmoney 货币型 存储从-214748.3648 到214748.3647 之间的数据,精确到万分之一
    • float 近似数值型,供浮点数使用。说浮点数是近似的,是因为在其范围内不是所有的数都能精确表示。浮点数可以是从-1.79E+308到1.79E+308 之间的任意数
    • real 近似数值型 表示数值在-3.40E+38到3.40E+38之间的浮点数
    • datetime 日期时间型 datetime数据类型用来表示日期和时间。精确到三百分之一秒或3.33毫秒
    • Smalldatetime 日期时间型 smalldatetime 表示从1900年1月1日到2079年6月6日间的日期和时间,精确到一分钟
    • cursor 特殊数据型 包含一个对游标的引用。这种数据类型用在存储过程中,而且创建表时不能用
    • timestamp 特殊数据型 用来创建一个数据库范围内的唯一数码。 一个表中只能有一个timestamp列。每次插入或修改一行时,timestamp列的值都会改变。尽管它的名字中有“time”, 但timestamp列不是人们可识别的日期。在一个数据库里,timestamp值是唯一的
    • Uniqueidentifier 特殊数据型,存储一个全局唯一标识符,即GUID。GUID确实是全局唯一的。这个数几乎没有机会在另一个系统中被重建。可以使用NEWID 函数或转换一个字符串为唯一标识符来初始化具有唯一标识符的列
    • char 字符型 存储指定长度的定长非统一编码型的数据。当定义一列为此类型时,你必须指定列长。当你总能知道要存储的数据的长度时,此数据类型很有用。例如,当你按邮政编码加4个字符格式来存储数据时,你知道总要用到10个字符。此数据类型的列宽最大为8000 个字符
    • varchar 字符型 同char类型一样,用来存储非统一编码型字符数据。与char 型不一样,此数据类型为变长。当定义一列为该数据类型时,你要指定该列的最大长度。 它与char数据类型最大的区别是,存储的长度不是列长,而是数据的长度
    • text 字符型 存储大量的非统一编码型字符数据
    • nchar 统一编码字符型 存储定长统一编码字符型数据。统一编码用双字节结构来存储每个字符,而不是用单字节(普通文本中的情况)。它允许大量的扩展字符。此数据类型能存储4000种字符,使用的字节空间上增加了一倍
    • nvarchar 统一编码字符型 用作变长的统一编码字符型数据。此数据类型能存储4000种字符,使用的字节空间增加了一倍
    • ntext 统一编码字符型 存储大量的统一编码字符型数据。这种数据类型能存储230 -1或将近10亿个字符,且使用的字节空间增加了一倍
    • binary 二进制数据类型 存储可达8000 字节长的定长的二进制数据。当输入表的内容接近相同的长度时,你应该使用这种数据类型
    • varbinary 二进制数据类型 数据类型用来存储可达8000 字节长的变长的二进制数据。当输入表的内容大小可变时,你应该使用这种数据类型
    • image 二进制数据类型 存储变长的二进制数据,最大可达231-1或大约20亿字节

    PostgreSQL数据库

    server-client模式的数据库。
    python库操作:
    import psycopg2
    conn = psycopg2.connect("dbname=dq user=dq ")
    cur = conn.cursor()
    cur.execute("command")
    print(cur)
    conn.close()

    命令行操作:
    启动:psql
    退出:\q
    创建数据库:CREATE DATABASE dbName;
    \l -- list all available databases.
    \dt -- list all tables in the current database.
    \du -- list users.
    连接到数据库:psql -d database

    # 用户及权限管理
    CREATE ROLE userName [WITH CREATEDB LOGIN PASSWORD 'password'];
    GRANT SELECT, INSERT, UPDATE, DELETE ON tableName TO    userName;
    REVOKE SELECT, INSERT, UPDATE, DELETE ON tableName FROM userName;
    
    CREATE ROLE userName WITH LOGIN PASSWORD 'password' SUPERUSER;
    

    安装 下载

    conda install psycopg2

    相关文章

      网友评论

        本文标题:Dataquest笔记

        本文链接:https://www.haomeiwen.com/subject/idiylxtx.html