zoukankan      html  css  js  c++  java
  • 《Python for Data Science》笔记之着手于数据

    一、导入数据 

    1.1来自内存的数据

    将数据上传至内存,读取。

    1 with open("name.txt", 'r') as open_file:
    2     print('name.txt content:
    ' + open_file.read())

    流化读取

    1 with open("name.txt", 'r') as open_file:
    2     for observation in open_file:
    3         print('Reading Data: ' + observation)

    采样数据

    将部分的数据读取以备使用。

    规律性采样:

    1 n = 3
    2 with open("Colors.txt", 'r') as open_file:
    3     for j, observation in enumerate(open_file):
    4         if j % n==0:
    5             print('Reading Line: ' + str(j) + 
    6             ' Content: ' + observation)

    随机采样:

    1 from random import random
    2 sample_size = 0.25
    3 with open("Colors.txt", 'r') as open_file:
    4     for j, observation in enumerate(open_file):
    5         if random()<=sample_size:
    6             print('Reading Line: ' + str(j) + 
    7             ' Content: ' + observation)

    1.2使用pandas读取结构化数据

    文本数据:

    1 import pandas as pd
    2 color_table = pd.read_table("Colors.txt")
    3 print(color_table)

    CSV数据:

    1 import pandas as pd
    2 titanic = pd.read_csv("Titanic.csv")
    3 X = titanic[['age']]
    4 Y = titanic[['age']].values
    5 print(X)
    6 print(Y)

    Excel数据:

    1 import pandas as pd
    2 trig_values = pd.read_excel("Values.xls", 'Sheet1', index_col=None, na_values=None)
    3 print (trig_values)

    1.3读取非结构化数据(如图像,skimage)

    1 from skimage.io import imread
    2 from skimage.transform import resize 
    3 from matplotlib import pyplot as plt
    4 import matplotlib.cm as cm
    5 
    6 example_file = ("http://upload.wikimedia.org/" +
    7     "wikipedia/commons/7/7d/Dog_face.png")
    8 image = imread(example_file, as_grey=True)
    9 plt.imshow(image, cmap=cm.gray)

    输出图像尺寸:

    1 print("data type: %s, shape: %s" % 
    2       (type(image), image.shape))

    裁剪图像:

    1 image2 = image[5:70,0:70]
    2 plt.imshow(image2, cmap=cm.gray)

    压缩图像:

    1 image3 = resize(image2, (30, 30), mode='constant')
    2 plt.imshow(image3, cmap=cm.gray)
    3 print("data type: %s, shape: %s" % 
    4       (type(image3), image3.shape))

    因为图像数据是二维矩阵,扁平化以存储在数据中:

    1 image_row = image3.flatten()
    2 print("data type: %s, shape: %s" % 
    3       (type(image_row), image_row.shape))

    输出结果为:

    data type: <class 'numpy.ndarray'>, shape: (900,)

    也就是将原先30*30转化成900个元素的数组。

    1.4管理来自数据库中的数据

    1.5网页数据

    网页代码如下:

    <MyDataset>
        <Record>
            <Number>1</Number>
            <String>First</String>
            <Boolean>True</Boolean>
        </Record>
        <Record>
            <Number>2</Number>
            <String>Second</String>
            <Boolean>False</Boolean>
        </Record>
        <Record>
            <Number>3</Number>
            <String>Third</String>
            <Boolean>True</Boolean>
        </Record>
        <Record>
            <Number>4</Number>
            <String>Fourth</String>
            <Boolean>False</Boolean>
        </Record>
    </MyDataset>

    解析代码:

     1 from lxml import objectify
     2 import pandas as pd
     3 
     4 xml = objectify.parse(open('XMLData.xml'))
     5 root = xml.getroot()
     6 df = pd.DataFrame(columns=('Number', 'String', 'Boolean'))
     7 
     8 for i in range(0,4):
     9     obj = root.getchildren()[i].getchildren()
    10     row = dict(zip(['Number', 'String', 'Boolean'], 
    11                    [obj[0].text, obj[1].text, 
    12                     obj[2].text]))
    13     row_s = pd.Series(row)
    14     row_s.name = i
    15     df = df.append(row_s)
    16     
    17 print (df)

    运行结果:

      Number  String Boolean
    0      1   First    True
    1      2  Second   False
    2      3   Third    True
    3      4  Fourth   False

    二、整理数据

    用numpy(速度快)和pandas工作

    2.1了解数据

     去重,使用 pd.DataFrame.duplicated,重复的返回True

     1 from lxml import objectify
     2 import pandas as pd
     3 
     4 xml = objectify.parse(open('XMLData2.xml'))
     5 root = xml.getroot()
     6 df = pd.DataFrame(columns=('Number', 'String', 'Boolean'))
     7 
     8 for i in range(0,4):
     9     obj = root.getchildren()[i].getchildren()
    10     row = dict(zip(['Number', 'String', 'Boolean'], 
    11                    [obj[0].text, obj[1].text, 
    12                     obj[2].text]))
    13     row_s = pd.Series(row)
    14     row_s.name = i
    15     df = df.append(row_s)
    16     
    17 search = pd.DataFrame.duplicated(df)
    18 print (search[search==False])

    使用 print (df.drop_duplicates()) 直接打印出去重之后的结果。


    查看数据中潜在的问题,例如:

    • 重复变量
    • 数据错误
    • 丢失数据
    • 变量转换
    1 import pandas as pd
    2 
    3 df = pd.DataFrame({'A': [0,0,0,0,0,1,1],
    4                    'B': [1,2,3,5,4,2,5],
    5                    'C': [5,3,4,1,1,2,3]})
    6 
    7 a_group_desc = df.groupby('A').describe()
    8 print (a_group_desc)

    describe用于获取统计信息,可以直接看出数据集中是否有问题,返回结果如下:

    unstack()可以用于格式化结果,使其更美观

    用loc()指定标签获取元素:

    1 print (unstacked.loc[:,['count','mean']])

    2.2 创建分类变量

     1 import pandas as pd
     2 
     3 car_colors = pd.Series(['Blue', 'Red', 'Green'], dtype='category')
     4 car_data = pd.Series(
     5     pd.Categorical(['Yellow', 'Green', 'Red', 'Blue', 'Purple'],
     6                    categories=car_colors, ordered=False))
     7 find_entries = pd.isnull(car_data)
     8 
     9 print (car_colors)
    10 print (car_data)
    11 print (find_entries[find_entries == True]) 

    重命名层级:

     1 import pandas as pd
     2 
     3 car_colors = pd.Series(['Blue', 'Red', 'Green'], 
     4                        dtype='category')
     5 car_data = pd.Series(
     6     pd.Categorical(
     7         ['Blue', 'Green', 'Red', 'Blue', 'Red'],
     8         categories=car_colors, ordered=False))
     9 
    10 
    11 car_colors.cat.categories = ["Purple", "Yellow", "Mauve"]
    12 car_data.cat.categories = car_colors
    13 print (car_data)

    结果如下,就是直接根据位置进行替换。

    2.3 处理丢失值

    isnull():判断是否为空

    fillna():用一个值填充空值

    dropna():丢弃空值

    为丢失数据估值:

     1 import pandas as pd
     2 import numpy as np
     3 from sklearn.preprocessing import Imputer
     4 
     5 s = pd.Series([1, 2, 3, np.NaN, 5, 6, None])
     6 
     7 imp = Imputer(missing_values='NaN', 
     8               strategy='mean', axis=0)
     9 
    10 imp.fit(np.array([1, 2, 3, 4, 5, 6, 7]).reshape(1,-1))
    11 
    12 x = pd.Series(imp.transform(s.values.reshape(1,-1)).tolist()[0])
    13 
    14 print (x)

    2.4 剪切和变换数据

    1.切分,过滤,筛选数据

    2.排序和打乱

     1 import pandas as pd
     2 import numpy as np
     3 
     4 df = pd.DataFrame({'A': [2,1,2,3,3,5,4],
     5                    'B': [1,2,3,5,4,2,5],
     6                    'C': [5,3,4,1,1,2,3]})
     7 
     8 df = df.sort_index(by=['A', 'B'], ascending=[True, True])
     9 df = df.reset_index(drop=True)
    10 print (df)
    11 
    12 index = df.index.tolist()
    13 np.random.shuffle(index)
    14 df = df.ix[index]
    15 df = df.reset_index(drop=True)
    16 
    17 print (df)

    sort_index(by=['A', 'B'], ascending=[True, True])排序,以A,B作为索引,升序排列;

    调用reset_index(drop=True)显示结果,drop表示是否插入原索引,true表示不插入

    random.shuffle()创建新的索引顺序,然后按照这个新顺序应用于df

    
    

    结果为:

    3.聚合数据

     1 import pandas as pd
     2 
     3 df = pd.DataFrame({'Map': [0,0,0,1,1,2,2],
     4                    'Values': [1,2,3,5,4,2,5]})
     5 
     6 df['S'] = df.groupby('Map')['Values'].transform(np.sum)
     7 df['M'] = df.groupby('Map')['Values'].transform(np.mean)
     8 df['V'] = df.groupby('Map')['Values'].transform(np.var)
     9 
    10 print (df)

    结果为:

     三、数据整形

    3.1 使用网页中的数据 

    将xml中的数据进行整理,不仅仅是提取内容,还需要规范值的属性。

     1 from lxml import objectify
    2 import pandas as pd 3 from distutils import util 4 5 xml = objectify.parse(open('XMLData.xml')) 6 root = xml.getroot() 7 df = pd.DataFrame(columns=('Number', 'Boolean')) 8 9 for i in range(0,4): 10 obj = root.getchildren()[i].getchildren() 11 row = dict(zip(['Number', 'Boolean'], 12 [obj[0].pyval, 13 bool(util.strtobool(obj[2].text))])) 14 row_s = pd.Series(row) 15 row_s.name = obj[1].text 16 df = df.append(row_s) 17 18 print (type(df.ix['First']['Number'])) 19 print (type(df.ix['First']['Boolean'])) 20 print (df)

     输出结果为:

    使用XPATH可以更加方便地抽取数据:

    from lxml import objectify
    import pandas as pd
    from distutils import util
    
    xml = objectify.parse(open('XMLData.xml'))
    root = xml.getroot()
    #zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
    #map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。
    data = zip(map(int, root.xpath('Record/Number')), 
               map(bool, map(util.strtobool, 
                    map(str, root.xpath('Record/Boolean')))))
    
    df = pd.DataFrame(list(data), 
                      columns=('Number', 'Boolean'), 
                      index=list(map(str, 
                            root.xpath('Record/String'))))
    
    print (df)
    print (type(df.ix['First']['Number']))
    print (type(df.ix['First']['Boolean']))

    注意:DataFrame中的元素不能是迭代的,因此需要转化成list

    3.2 使用文本数据

    涉及自然语言处理。

  • 相关阅读:
    表单
    超链接
    图像
    表格
    排列清单控制标
    HTML基本结构
    如何快速查看网页源代码
    TOR的使用
    google搜索新姿势
    [NOIP2017]列队
  • 原文地址:https://www.cnblogs.com/luchenyao/p/10171132.html
Copyright © 2011-2022 走看看