数据分析学习笔记part_3

数据分析


 

Lesson 3 : 数据分析入门

数据分析过程

  • 数据分析过程概述

    1. 提问

      你要么获取一批数据,然后根据它提问,要么先提问,然后根据问题收集数据。在这两种情况下,好的问题可以帮助你将精力集中在数据的相关部分,并帮助你得出有洞察力的分析。

    2. 整理数据

      你通过三步来获得所需的数据:收集,评估,清理。你收集所需的数据来回答你的问题,评估你的数据来识别数据质量或结构中的任何问题,并通过修改、替换或删除数据来清理数据,以确保你的数据集具有最高质量和尽可能结构化。

    3. 执行EDA(探索性数据分析)

      你可以探索并扩充数据,以最大限度地发挥你的数据分析、可视化和模型构建的潜力。探索数据涉及在数据中查找模式,可视化数据中的关系,并对你正在使用的数据建立直觉。经过探索后,你可以删除异常值,并从数据中创建更好的特征,这称为特征工程。

    4. 得出结论(或甚至是做出预测)

      这一步通常使用机器学习或推理性统计来完成。

    5. 传达结果

      你通常需要证明你发现的见解及传达意义。或者,如果你的最终目标是构建系统,则通常需要分享构建的结果,解释你得出设计结论的方式,并报告该系统的性能。传达结果的方法有多种:报告、幻灯片、博客帖子、电子邮件、演示文稿,甚至对话。数据可视化总会给你呈现很大的价值。

 

数据分析一般步骤

  • 了解数据属性,如:数据标准单位、每个特征含义等。

  • 提问

  • 评估数据(数据样本数、行列数、是否有重复行,或重复数据、列的数据特征、缺失值特征、每个数据特征的非空唯一值的计数等)

    #查看数据列类型
    type(df_18['Greenhouse Gas Score'][1])
    #计算Series中数据非空唯一值的数量
    df_18['SmartWay'].nunique()
    #计算数据集中有缺失值的行数
    df_18.isnull().any(axis=1).sum() 
    #查看数据前五行
    df_18.head()
    #查看数据维度
    df_08.shape

     


  • 数据清理(清理列标签、过滤、丢空、去重、检查数据类型)

    #丢弃多余列,使用  .drop()函数
    df_08.drop(['Stnd', 'Underhood ID', 'FE Calc Appr', 'Unadj Cmb MPG'], axis=1, inplace=True)
    #重命名,使用 .rename()函数
    df_08 = df_08.rename(columns={'Sales Area': 'Cert Region'})
    #过滤,常用 .query()函数
    df_08 = df_08.query('cert_region == "CA"')
    #丢空 .drop()
    df_08.dropna(axis=0, inplace=True)
    #去重,使用 .duplicated()
    df_08.drop_duplicates(inplace=True)
    #检查数据类型
    #当我们在进行数据清理时,为方便后对数据进行可视化等操作,需要对数据类型进行相应转换,#如str - int, folat - int , str - datetime 等。

     


  • 可视化数据(常见的可视化page有Pandas , Numpy, matplotlib, seaborn等)

    #绘制直方图
    df_08['greenhouse_gas_score'].hist();
    #绘制散点图
    df_08.plot.scatter(x=['displ'], y=['cmb_mpg']);

     


  • 结论和可视化展示(根据可视化结果得出相关结论,不能出现因果关系,并且应提出此次分析的局限性,存在异常值,缺失值等)

合并类型

数据分析的编程 工作流

关于IPython

  • IPython 提供了我们在 Jupyter Notebook 中使用的交互式 Python 内核。事实上,我们可以在 Jupyter Notebook 之外,通过我们终端上的命令行界面使用 IPython。这对于快速修改、探索、实验,甚至是运行 Python 脚本来说都非常方便.

  • IPython 官方文档在此

  • IPython和Jupyter Notebook 工作原理在此

SQL聚合

SQL JOIN

数据库规范化

  • 在创建数据库时,一定要思考下将如何存储数据。这称为规范化,是大多数 SQL 的一个重要组成部分。如果你负责设置新的数据库,则需要详细了解数据库规范化

  • 数据库规范化需要考虑以下三个要点:

    1. 表格存储了逻辑分组的数据吗?

    2. 我能在一个位置进行更改,而不是在多个表格中对同一信息作出更改吗?

    3. 我能快速高效地访问和操纵数据吗

      这篇文章详细讲解了上述内容。

JOIN语句

  • JOIN 语句的整个目标是一次能够从多个表格中获取数据。

  • JOIN 使我们能够从多个表格中获取数据。是既简单,又很强大的功能。

    SELECT orders.*
    FROM orders
    JOIN accounts
    ON orders.account_id = accounts.id;

     

    ON 语句存储的是两个表格中相连的两列。

    • JOIN - 要添加的表格

    • ON - 数据提取条件

    • SELECT DISTINCT 使结果仅显示唯一的值

  • 主键*每个表格都存在主键,它是每行的值都唯一的列。通常,在大多数数据库中,主键是表格的第一列。

  • 外键是另一个表格中的主键。每个都与另一个表格的主键相关。

  • 主键 - 外键关联性

    1. region_id 是外键。

    2. region_id 与 id 相连 - 它是将这两个表格相连的主外键关系。

    3. Crow's foot(鱼尾纹) 表示 FK 实际上可以出现在 sales_reps 表格中的很多行中。

    4. 虽然这一行告诉我们 PK 显示在此表格中 id 每行仅出现一次。

别名

  • 当我们连接表格时,最好能为每个表格设置一个别名。你实际上在算术运算符部分见过类似的列名称别名。

    FROM tablename AS t1
    JOIN tablename2 AS t2
    #两者相同(省去 AS)
    FROM tablename t1
    JOIN tablename2 t2

     

    • 提示主键和外键存在一对一一对多关系。注意,传统数据库不允许出现多对多关系,因为这样很快就会破坏架构。这篇文章给出了很好的解释。

内连接

  • LEFT JOIN

    • 用于获取FROM中表格的所有行,即使他们不存在JOIN 语句中

  • RIGHT JOIN

    • 用于获取JOIN中表格的所有行,即使他们不存在FROM 语句中

  • 其他高级JOIN

    • UNION, UNION ALL, CROSS JOIN , SELF JOIN等

JOIN 和 过滤

  • 一个简单的规则:当数据库执行该查询时,它先执行连接和 ON 条件中的指令。将其看做构建新的结果集,然后使用 WHERE 条件来过滤该结果集。

  • 提示:在以下两种常见情况下,你可能会遇到 NULL

      1. 在执行 LEFT JOIN 或 RIGHT JOIN 时,NULL 经常会发生。你在上节课见到了,左侧表格中的某些行在做连接时与右侧表格中的行如果不匹配,这些行在结果集中就会包含一些 NULL 值。

      2. NULL 也可能是因为数据库中缺失数据。

NULL简介

  • NULL 是一种数据类型,表示 SQL 中没有数据。它们经常在聚合函数中被忽略了。

    • 注意NULL 与零不同,它们表示不存在数据的单元格。

      在 WHERE 条件中表示 NULL 时,我们写成 IS NULL 或 IS NOT NULL。我们不使用 =,因为 NULL 在 SQL 中不属于值。但是它是数据的一个属性。

 

COUNT

  • 计算表格行数

    SELECT COUNT(*)
    FROM accounts;

     

  • 注意:COUNT 不会考虑具有 NULL 值的行。因此,可以用来快速判断哪些行缺少数据。

SUM

  • 与 COUNT 不同,你只能针对数字列使用 SUM。但是,SUM 将忽略 NULL 值,其他聚合函数也是这样。

  • 提醒重要注意事项:聚合函数只能垂直聚合,即聚合列的值。如果你想对行进行计算,可以使用简单算术表达式

    练习

    1. 算出 orders 表格中的 poster_qty 纸张总订单量。

      SELECT SUM(poster_qty) AS total_poster_sales
      FROM orders;

       

    2. 每个订单的 price/standard_qty 纸张各不相同。我想得出 orders 表格中每个销售机会的这一比例。

    SELECT SUM(standard_amt_usd)/SUM(standard_qty) AS standard_price_per_unit
    FROM orders;

     

 

MIN, MAX

  • 注意,MIN 和 MAX 聚合函数也会忽略 NULL 值。

  • 提示:从功能上来说,MIN 和 MAX 与 COUNT 相似,它们都可以用在非数字列上。MIN 将返回最小的数字、最早的日期或按字母表排序的最之前的非数字值,具体取决于列类型。MAX 则正好相反,返回的是最大的数字、最近的日期,或与“Z”最接近(按字母表顺序排列)的非数字值。

AVG

  • 与其他软件类似,AVG 返回的是数据的平均值,即列中所有的值之和除以列中值的数量。该聚合函数同样会忽略分子和分母中的 NULL 值。

  • 如果你想将 NULL 当做零,则需要使用 SUM 和 COUNT。但是,如果 NULL 值真的只是代表单元格的未知值,那么这么做可能不太合适。

  • 提示注意,中值可能是更好的衡量方式,但是仅使用 SQL 非常棘手。

GROUP BY

  • GROUP BY 可以用来在数据子集中聚合数据。例如,不同客户、不同区域或不同销售代表分组。

  • SELECT 语句中的任何一列如果不在聚合函数中,则必须在 GROUP BY 条件中。

  • GROUP BY 始终在 WHERE 和 ORDER BY 之间。

  • ORDER BY 有点像电子表格软件中的 SORT

  • 提示:需要注意的是,SQL 在 LIMIT 条件之前评估聚合函数。如果不按任何列分组,则结果是 1 行,没有问题。如果按照某列分组,该列中存在大量的唯一值,超出了 LIMIT 上限,则系统会照常计算聚合结果,但是结果中会忽略某些行。

    • 你可以同时按照多列分组,正如此处所显示的那样。这样经常可以在大量不同的细分中更好地获得聚合结果。

    • ORDER BY 条件中列出的列顺序有区别。你是从左到右让列排序。

    • GROUP BY 条件中的列名称顺序并不重要,结果还是一样的。如果运行相同的查询并颠倒 GROUP BY 条件中列名称的顺序,可以看到结果是一样的。

    • 和 ORDER BY 一样,你可以在 GROUP BY条件中用数字替换列名称。仅当你对大量的列分组时,或者其他原因导致 GROUP BY 条件中的文字过长时,才建议这么做。

    • 提醒一下,针对 SELECT 选择出来的列,任何不在聚合函数中的列,必须出现在 GROUP BY 语句中。如果忘记了,可能会遇到错误。但是,即使查询可行,最后的结果可能也不会正确!

      #对于每个客户,确定他们在订单中购买的每种纸张的平均数额。结果应该有四列:客户名称一列,每种纸张类型的平均数额一列。
      SELECT a.name, AVG(o.standard_qty) avg_stand, AVG(gloss_qty) avg_gloss, AVG(poster_qty) avg_post
      FROM accounts a
      JOIN orders o
      ON a.id = o.account_id
      GROUP BY a.name;

       



      #确定在 web_events 表格中针对每个地区特定渠道的使用次数。最终表格应该有三列:区域名称、渠道和发生次数。按照最高的发生次数在最上面对表格排序。

      SELECT r.name, w.channel, COUNT(*) num_events
      FROM accounts a
      JOIN web_events w
      ON a.id = w.account_id
      JOIN sales_reps s
      ON s.id = a.sales_rep_id
      JOIN region r
      ON r.id = s.region_id
      GROUP BY r.name, w.channel
      ORDER BY num_events DESC;

       

       

DISTINCT

  • 仅返回特定列的唯一值的函数。

    #使用 DISTINCT 检查是否有任何客户与多个区域相关联?
    ​
    SELECT DISTINCT a.id, r.id, a.name, r.name
    FROM accounts a
    JOIN sales_reps s
    ON s.id = a.sales_rep_id
    JOIN region r
    ON r.id = s.region_id;
    #AND
    SELECT DISTINCT id, name
    FROM accounts;
    #(两个查询产生了相同的行数(351 行),因此我们知道每个客户仅与一个区域相关联。如果每个客户与多个区域相关联,则第一个查询返回的行数应该比第二个查询的多。)
    ​
    #有没有销售代表要处理多个客户?
    ​
    SELECT s.id, s.name, COUNT(*) num_accounts
    FROM accounts a
    JOIN sales_reps s
    ON s.id = a.sales_rep_id
    GROUP BY s.id, s.name
    ORDER BY num_accounts;
    #AND
    SELECT DISTINCT id, name
    FROM sales_reps;
    #(所有销售代表都要处理多个客户。销售代表处理的最少客户数量是 3 个。有 50 个销售代表,他们都有多个客户。在第二个查询中使用 DISTINCT 确保包含了第一个查询中的所有销售代表。)

     

HAVING

  • HAVING 是过滤被聚合的查询的 “整洁”方式,但是通常采用子查询的方式来实现。本质上,只要你想对通过聚合创建的查询中的元素执行 WHERE 条件,就需要使用 HAVING

    #有多少位销售代表需要管理超过 5 个客户?
    ​
    SELECT s.id, s.name, COUNT(*) num_accounts
    FROM accounts a
    JOIN sales_reps s
    ON s.id = a.sales_rep_id
    GROUP BY s.id, s.name
    HAVING COUNT(*) > 5
    ORDER BY num_accounts;
    ​
    #哪个客户使用 facebook 作为与消费者沟通的渠道超过 6 次?
    ​
    SELECT a.id, a.name, w.channel, COUNT(*) use_of_channel
    FROM accounts a
    JOIN web_events w
    ON a.id = w.account_id
    GROUP BY a.id, a.name, w.channel
    HAVING COUNT(*) > 6 AND w.channel = 'facebook'
    ORDER BY use_of_channel;

     

DATE 函数

  • 在 SQL 中,按照日期列分组通常不太实用,因为这些列可能包含小到一秒的交易数据。按照如此详细的级别保存信息即有好处,又存在不足之处,因为提供了非常准确的信息(好处),但是也让信息分组变得很难(不足之处)。

  • DATE_TRUNC

  • DATE_TRUNC 使你能够将日期截取到日期时间列的特定部分。常见的截取依据包括日期月份 和 年份这是一篇 MODE 发表的精彩博文,介绍了关于此函数的强大功能。

  • DATE_PART 可以用来获取日期的特定部分,但是注意获取 month 或 dow 意味着无法让年份按顺序排列。而是按照特定的部分分组,无论它们属于哪个年份。

  • 要了解其他日期函数,请参阅这篇文档。

    #Walmart 在哪一年的哪一个月在铜版纸上的消费最多?
    SELECT DATE_TRUNC('month', o.occurred_at) ord_date, SUM(o.gloss_amt_usd) tot_spent
    FROM orders o 
    JOIN accounts a
    ON a.id = o.account_id
    WHERE a.name = 'Walmart'
    GROUP BY 1
    ORDER BY 2 DESC
    LIMIT 1;
    ​

     

CASE语句

  • CASE 语句始终位于 SELECT 条件中。

  • CASE 必须包含以下几个部分:WHEN、THEN 和 END。ELSE 是可选组成部分,用来包含不符合上述任一 CASE 条件的情况。

  • 你可以在 WHEN 和 THEN 之间使用任何条件运算符编写任何条件语句(例如 WHERE),包括使用 AND 和 OR 连接多个条件语句。

  • 你可以再次包含多个 WHEN 语句以及 ELSE 语句,以便处理任何未处理的条件。

    #我们想要根据相关的消费量了解三组不同的客户。最高的一组是终身价值(所有订单的总销售额)大于 200,000 美元的客户。第二组是在 200,000 到 100,000 美元之间的客户。最低的一组是低于 under 100,000 美元的客户。请提供一个表格,其中包含与每个客户相关的级别。你应该提供客户的名称、所有订单的总销售额和级别。消费最高的客户列在最上面。
    ​
    SELECT a.name, SUM(total_amt_usd) total_spent, 
         CASE WHEN SUM(total_amt_usd) > 200000 THEN 'top'
         WHEN  SUM(total_amt_usd) > 100000 THEN 'middle'
         ELSE 'low' END AS customer_level
    FROM orders o
    JOIN accounts a
    ON o.account_id = a.id 
    GROUP BY a.name
    ORDER BY 2 DESC;
    ​
    #之前的问题没有考虑中间水平的销售代表或销售额。管理层决定也要看看这些数据。我们想要找出绩效很高的销售代表,也就是有超过 200 个订单或总销售额超过 750000 美元的销售代表。中间级别是指有超过 150 个订单或销售额超过 500000 美元的销售代表。创建一个包含以下列的表格:销售代表名称、总订单量、所有订单的总销售额,以及标为 top、middle 或 low 的列(取决于上述条件)。在最终表格中将销售额最高的销售代表列在最上面。
    ​
    SELECT s.name, COUNT(*), SUM(o.total_amt_usd) total_spent, 
         CASE WHEN COUNT(*) > 200 OR SUM(o.total_amt_usd) > 750000 THEN 'top'
         WHEN COUNT(*) > 150 OR SUM(o.total_amt_usd) > 500000 THEN 'middle'
         ELSE 'low' END AS sales_rep_level
    FROM orders o
    JOIN accounts a
    ON o.account_id = a.id 
    JOIN sales_reps s
    ON s.id = a.sales_rep_id
    GROUP BY s.name
    ORDER BY 3 DESC;
    ​

     

 

 

SQL子查询和临时表格

  • 每当我们需要使用现有表格创建新的表格,然后需要再次查询时,就表明我们需要使用某种子查询

  • 在使用子查询时,要让读者能够轻松地判断查询的哪个部分将一起执行。大部分人的做法是按照某种方式缩进子查询

  • 格式清晰的子查询

    • 此外,如果在子查询后面有 GROUP BYORDER BYWHEREHAVING 或任何其他语句,则按照外部查询的同一级别缩进

      SELECT *
      FROM (SELECT DATE_TRUNC('day',occurred_at) AS day,
                      channel, COUNT(*) as events
            FROM web_events 
            GROUP BY 1,2
            ORDER BY 3 DESC) sub;
      #对于购买标准纸张数量 (standard_qty) 最多的客户(在作为客户的整个时期内),有多少客户的购买总数依然更多?
      ​
      SELECT COUNT(*)
      FROM (SELECT a.name
      FROM orders o
      JOIN accounts a
      ON a.id = o.account_id
      GROUP BY 1
      HAVING SUM(o.total) > (SELECT total
      FROM (SELECT a.name act_name, SUM(o.standard_qty) tot_std, SUM(o.total) total
      FROM accounts a
      JOIN orders o
      ON o.account_id = a.id
      GROUP BY 1
      ORDER BY 2 DESC
      LIMIT 1) inner_tab)
      ) counter_tab;
      WITH

       

  • WITH 语句经常称为公用表表达式(简称 CTE)。虽然这些表达式和子查询的目的完全一样,但是实际更常用,因为对未来的读者来说,更容易看懂其中的逻辑。

    #提供每个区域拥有最高销售额 (total_amt_usd) 的销售代表的姓名。
    ​
    WITH t1 AS (
    SELECT s.name rep_name, r.name region_name, SUM(o.total_amt_usd) total_amt
    FROM sales_reps s
    JOIN accounts a
    ON a.sales_rep_id = s.id
    JOIN orders o
    ON o.account_id = a.id
    JOIN region r
    ON r.id = s.region_id
    GROUP BY 1,2
    ORDER BY 3 DESC),
    t2 AS (
    SELECT region_name, MAX(total_amt) total_amt
    FROM t1
    GROUP BY 1)
    SELECT t1.rep_name, t1.region_name, t1.total_amt
    FROM t1
    JOIN t2
    ON t1.region_name = t2.region_name AND t1.total_amt = t2.total_amt;
    ​
    #对于具有最高销售额 (total_amt_usd) 的区域,总共下了多少个订单?
    ​
    WITH t1 AS (
    SELECT r.name region_name, SUM(o.total_amt_usd) total_amt
    FROM sales_reps s
    JOIN accounts a
    ON a.sales_rep_id = s.id
    JOIN orders o
    ON o.account_id = a.id
    JOIN region r
    ON r.id = s.region_id
    GROUP BY r.name),
    t2 AS (
    SELECT MAX(total_amt)
    FROM t1)
    SELECT r.name, SUM(o.total) total_orders
    FROM sales_reps s
    JOIN accounts a
    ON a.sales_rep_id = s.id
    JOIN orders o
    ON o.account_id = a.id
    JOIN region r
    ON r.id = s.region_id
    GROUP BY r.name
    HAVING SUM(o.total_amt_usd) = (SELECT * FROM t2);

     

 

 

 

SQL数据清理

LEFT, RIGHT, LENGTH

  • LEFT 从起点(或左侧)开始,从特定列中的每行获取一定数量的字符。正如此处看到的,你可以使用 LEFT(phone_number, 3) 获取电话号码中的前三位。

 

RIGHT 从末尾(或右侧)开始,从特定列中的每行获取一定数量的字符。正如此处看到的,你可以使用 RIGHT(phone_number, 8) 获取电话号码的最后 8 位。

 

LENGTH 提供了特定列每行的字符数。这里,我们可以使用 LENGTH(phone_number) 得出每个电话号码的长度。

  #在 accounts 表格中,有一个列存储的是每个公司的网站。最后三个数字表示他们使用的是什么类型的网址。此处给出了扩展(和价格)列表。请获取这些扩展并得出 accounts 表格中每个网址类型的存在数量。
  SELECT RIGHT(website, 3) AS domain, COUNT(*) num_companies
  FROM accounts
  GROUP BY 1
  ORDER BY 2 DESC;

 


 

 

POSITION, STRPOS, LOWER, UPPER

  • POSITION 获取字符和列,并提供该字符在每行的索引。第一个位置的索引在 SQL 中是 1。如果你之前学习了其他编程语言,就会发现很多语言的索引是从 0 开始。这里,你发现可以使用 POSITION(',' IN city_state) 获取逗号的索引。

 

STRPOS 和 POSITION 提供的结果相同,但是语法不太一样,如下所示:STRPOS(city_state, ‘,’)

 

注意,POSITION 和 STRPOS 都区分大小写,因此查找 A 的位置与查找 a 的结果不同。

 

因此,如果你想获取某个字母的索引,但是不区分大小写,则需要使用 LOWER 或 UPPER 让所有字符变成小写或大写。

  #使用 accounts 表格创建一个名字和姓氏列,用于存储 primary_poc 的名字和姓氏。
  
  SELECT LEFT(primary_poc, STRPOS(primary_poc, ' ') -1 ) first_name, 
  RIGHT(primary_poc, LENGTH(primary_poc) - STRPOS(primary_poc, ' ')) last_name
  FROM accounts;
  

 


#现在创建一个包含 sales_rep 表格中每个销售代表姓名的列,同样,需要提供名字和姓氏列。
 
  SELECT LEFT(name, STRPOS(name, ' ') -1 ) first_name, 
         RIGHT(name, LENGTH(name) - STRPOS(name, ' ')) last_name
  FROM sales_reps;

 

 

 

CONCAT

    1. CONCAT

    2. Piping ||

  • 这两个工具都能将不同行的列组合到一起。将存储在不同列中的名字和姓氏组合到一起,形成全名:CONCAT(first_name, ' ', last_name),或者使用双竖线:first_name || ' ' || last_name

    #accounts 表格中的每个客户都想为每个 primary_poc 创建一个电子邮箱。邮箱应该是 primary_poc 的名字.primary_poc的姓氏@公司名称.com。
    ​
    WITH t1 AS (
     SELECT LEFT(primary_poc,     STRPOS(primary_poc, ' ') -1 ) first_name,  RIGHT(primary_poc, LENGTH(primary_poc) - STRPOS(primary_poc, ' ')) last_name, name
     FROM accounts)
    SELECT first_name, last_name, CONCAT(first_name, '.', last_name, '@', name, '.com')
    FROM t1;
    ​

     


    #我们还需要创建初始密码,在用户第一次登录时将更改。初始密码将是 primary_poc 的名字的第一个字母(小写),然后依次是名字的最后一个字母(小写)、姓氏的第一个字母(小写)、姓氏的最后一个字母(小写)、名字的字母数量、姓氏的字母数量,然后是合作的公司名称(全大写,没有空格)

    WITH t1 AS (
     SELECT LEFT(primary_poc,     STRPOS(primary_poc, ' ') -1 ) first_name,  RIGHT(primary_poc, LENGTH(primary_poc) - STRPOS(primary_poc, ' ')) last_name, name
     FROM accounts)
    SELECT first_name, last_name, CONCAT(first_name, '.', last_name, '@', name, '.com'), LEFT(LOWER(first_name), 1) || RIGHT(LOWER(first_name), 1) || LEFT(LOWER(last_name), 1) || RIGHT(LOWER(last_name), 1) || LENGTH(first_name) || LENGTH(last_name) || REPLACE(UPPER(name), ' ', '')
    FROM t1;

     


 

CAST

    1. TO_DATE

    2. CAST

    3. 使用 :: 进行转型

  • DATE_PART('month', TO_DATE(month, 'month')) 将月份名称改成了与该月相关的数字。

  • 可以使用 CAST 将字符串改为日期。CAST实际上可以用来更改各种列类型,CAST(date_column AS DATE) 将字符串改成日期。但是,可能还会对列的数据类型做出其他更改。。

    除了 CAST(date_column AS DATE)之外,还可以使用 date_column::DATE

  • Project : 探索数据集

        data_analysis_projects

注:学习笔记是在优达学城学习时,参考部分课程内容总结而成。

Project:探索TMDB电影数据集-项目心得:
项目描述:用Python以及Pandas包、Numpy包、matplotlib包、seaborn包等探索TMDB电影数据集。项目针对三个问题展开,对数据集进行探索性分析、数据清理、数据可视化,最终得出相应结论,并给出此次分析结果的局限性。
项目心得:通过前期的学习,进一步巩固了Python基本知识,加深对Numpy包、matplotlib包、seaborn包等的学习,对数据可视化有了初步的认识,对数据分析流程理解更深一步。

posted on 2018-10-21 22:39  python小白i  阅读(285)  评论(0)    收藏  举报

导航