分享

数据科学入门笔记:Python数据处理

 flyk0tcfb46p9f 2018-04-03

获取数据

在线的大量数据存储在文本文件中,尤其是在政府网站上,而且通常只是从网站下载文件。例如,让我们获取我们可以在这里找到的所有主要联盟棒球统计数据库。在页面上,我们可以看到数据有多种格式。三种最常见的格式是csv,xml和json。

我下载了名为“ 2016 - 逗号分隔版 ?- 2017年2月26日更新”的csv数据。在查看文件AllstarFull.csv时,前两行是:

playerID,yearID,gameNum,gameID,teamID,lgID,GP,startingPos

gomezle01,1933,0,ALS193307060,NYA,AL ,, 1

在csv格式中,我们通常有一系列的行,每行对应一个条目。条目以逗号分隔。文件顶部的标题行对应于标识符,例如玩家ID,yearID ......如果我们查看第一个玩家的条目,我们可以按照相同的顺序查看相应的数据。如果数据丢失,我们只会看到两个逗号,因为没有空格。

在xml文档的情况下,我们最终得到了与html非常相似的东西。我们可以打开一个文档元素,并打开一系列表格。该表具有与上述值相对应的许多孩子。如果数据丢失,该字段在末尾以斜线打开(例如:

  • 使用复杂查询提取数据很简单。

  • 它的规模很好

  • 它确保所有数据的格式一致

  • 事实上,为年龄大于50岁,体重<>

    拥有数十万或数百万条目的数据库并不罕见。由于所有信息都理想地存储在一个位置,因此可以通过可扩展的方式更新,删除和向数据库添加新数据。

    最后,关系数据库总是有一个模式。模式是一个蓝图,告诉数据库我们计划如何存储数据。例如,人的年龄不能是一个弦,而其他人的年龄是一个整数。此外,架构表示,对于给定的表,每个单独的行或条目将具有与相同值相对应的完全相同数量的列,并且每个列的值将以相同方式格式化。

    查询

    我们如何从关系数据库获取数据?通常使用结构查询语言(SQL)从关系数据库中检索数据。如果我们想要选择所有(*)的数据,查询将是:

    SELECT * FROM database_name;

    我们可以通过在SQL命令结尾添加限制20来限制行数。

    SELECT * FROM database_name LIMIT 20;

    我们也可以要求提供具体的专栏,如姓名和年龄。

    SELECT name,age FROM database_name LIMIT 20;

    让我们将这个查询写入一个python文件,并将数据存储在“database_solution”中。

    import pandas as pd

    import pandasql

    database_name = pd.read_csv(filename)

    q = '''

    SELECT name, age FROM database_name LIMIT 20;

    #Execute your SQL command against the pandas frame

    database_solution = pandasql.sqldf(q, locals())

    我们也可以执行更复杂的查询。以下查询选择与冰岛国家相对应的所有数据。

    SELECT * FROM database_name WHERE country =“Iceland”;

    SQL中存在一些诸如group和aggregate之类的函数。一个集合函数需要一些值,通常是数字,并对它们进行数学运算。例如sum()是一个聚合函数。

    每个地区数据库中登记的年龄超过50岁的人总数是多少?以下查询首先选择每个区域登记了多少名男性和女性。由于我们使用的是聚合函数,因此我们需要包含一个GROUP BY,以及我们的非聚合字段,在这种情况下是区域和性别。最后,我们希望限制50岁以上的男性和女性。因此,我们在表名之后加入where子句,WHERE age> 50。

    SELECT gender, district, sum(database_generated)

    FROM database_name

    WHERE age > 50

    GROUP BY gender, district

    API(应用程序编程接口)

    我们现在知道如何从文件或数据库中获取数据,但是有些网站中的网站如Twitter的数据呢?通过搜索或爬行网站获取所有数据可能会变得复杂。幸运的是,许多公司允许用户和开发人员通过API以简单的机器可读格式直接访问数据。有几种不同类型的API,但最常见的类型之一,以及Twitter使用的类型是代表性状态转移或REST API。

    现在让我们在一个使用json和request库的简单python程序中实现它。

    import json

    import requests

    url = 'http://ws./2.0/?method=album.getinfo&api_key=YOUR_API_KEY&=Cher&album=Believe&format=json'

    data = json.loads(requests.get(url).text)

    首先我们指定一个URL,就像我们之前看到的 函数requests.get()将从.txt中的url中获取数据。查看json对象,我们会发现字符串格式很难处理,但是json库允许与json数据进行非常简单的交互,这要归功于json.load()函数。现在json数据被转换成Python字典。

    完整性检查数据

    现在我们已经获得了我们的数据,无论是非正式平面文件续集如关系数据库还是API,我们都需要在进行任何分析之前进行健全性检查数据。完整性检查使我们能够确定数据是否有意义。Pandas DataFrames确实有一个有用的方法,叫做describe(),我们不会过分注意细节,只是做一些简单的理智检查。

    import pandas as pd

    baseball_data = pd.read_csv('Master.csv')

    print (baseball_data.describe())

    >>>birthYear birthMonth birthDay deathYear deathMonth

    count 18973 18803 18656 9441 9440

    mean 1931 6 15 1964 6

    std 41 3 8 31 3

    min 1820 1 1 1872 1

    25% 1895 4 8 1942 3

    50% 1937 7 16 1967 6

    75% 1969 10 23 1990 10

    max 1996 12 31 2017 12

    deathDay weight height

    count 9439 18251 18320

    mean 15 186 72

    std 8 21 2

    min 1 65 43

    25% 8 170 71

    50% 15 185 72

    75% 23 200 74

    max 31 320 83

    函数describe()返回一个数据框。对于每个数字列,我们都可以看到计数,平均值,标准偏差,平均值。我们可以做一些快速检查,以确保有数据通常有意义,如月份在1到12之间,天数在1到3之间。有没有异常值?查看最小值和最大值是否大于与第25或第75百分点相对应的值...

    你可能会注意到的一件事是,每列的计数是不同的。这表明我们可能有一堆缺失的值。值可能会丢失的原因很多,例如收集数据失败,数据丢失,无响应值。缺失值可能会使您的发现无效,因此设计数据收集方法非常重要。可以使用不同的方法来减轻这些缺失值对我们分析的影响。

    存在两种方法,部分删除和插补。部分删除正是它听起来的样子,将我们用于分析的数据集限制为我们可用的数据。我们可以使用的一种方法称为Listwise Deletion。在我们执行Listwise Deletion的情况下,即使存在一些有用的值,我们也会从所有分析中排除特定的数据点。

    当我们没有太多的数据时,我们使用插补,或者删除我们缺失的值会影响我们样本的代表性。仅仅因为缺少值而抛出一堆条目会严重影响我们试图执行的任何分析的统计效力。在这种情况下,对我们的数据中的缺失值进行智能猜测(如逼近)可能是有意义的。例如,我们可以用所有其他值的平均值替代所有缺失值,或使用线性回归来估计缺失值。但是,插补会在数据集中引入偏见和不准确性。这是一个非常棘手的问题,新技术不断发展。存在更复杂和可靠的方法。

    在下面的代码中,我们计算“权重”数组的平均值,并通过将它们设置为平均权重来计算“权重”列中的任何缺失值。

    import pandas

    import numpy

    baseball = pandas.read_csv(filename)

    baseball['weight'] = baseball['weight'].fillna(numpy.mean(baseball['weight']))

      本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
      转藏 分享 献花(0

      0条评论

      发表

      请遵守用户 评论公约

      类似文章 更多