<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【硬核干貨】數(shù)據(jù)分析哪家強(qiáng)?選Pandas還是選SQL

          共 6648字,需瀏覽 14分鐘

           ·

          2022-07-13 02:47


          又是新的一周,今天小編打算來(lái)講一下PandasSQL之間語(yǔ)法的差異,相信對(duì)于不少數(shù)據(jù)分析師而言,無(wú)論是Pandas模塊還是SQL,都是日常學(xué)習(xí)工作當(dāng)中用的非常多的工具,當(dāng)然我們也可以在Pandas模塊當(dāng)中來(lái)調(diào)用SQL語(yǔ)句,通過調(diào)用read_sql()方法

          建立數(shù)據(jù)庫(kù)

          首先我們通過SQL語(yǔ)句在新建一個(gè)數(shù)據(jù)庫(kù),基本的語(yǔ)法相信大家肯定都清楚,

          CREATE TABLE 表名 (
            字段名稱 數(shù)據(jù)類型 ...
          )

          那么我們來(lái)看一下具體的代碼

          import pandas as pd
          import sqlite3
          connector = sqlite3.connect('public.db')
          my_cursor = connector.cursor()
          my_cursor.executescript("""
          CREATE TABLE sweets_types
          (
              id integer NOT NULL,
              name character varying NOT NULL,
              PRIMARY KEY (id)
          );
          ...篇幅有限,詳細(xì)參考源碼...
          "
          "")

          同時(shí)我們也往這些新建的表格當(dāng)中插入數(shù)據(jù),代碼如下

          my_cursor.executescript("""
          INSERT INTO sweets_types(name) VALUES
              ('waffles'),
              ('candy'),
              ('marmalade'),
              ('cookies'),
              ('chocolate');
          ...篇幅有限,詳細(xì)參考源碼...
          "
          "")

          我們可以通過下面的代碼來(lái)查看新建的表格,并且轉(zhuǎn)換成DataFrame格式的數(shù)據(jù)集,代碼如下

          df_sweets = pd.read_sql("SELECT * FROM sweets;", connector)

          output

          我們總共新建了5個(gè)數(shù)據(jù)集,主要是涉及到了甜品、甜品的種類以及加工和倉(cāng)儲(chǔ)的數(shù)據(jù),而例如甜品的數(shù)據(jù)集當(dāng)中主要包括的有甜品的重量、糖分的含量、生產(chǎn)的日期和過期的時(shí)間、成本等數(shù)據(jù),以及
          df_manufacturers = pd.read_sql("SELECT * FROM manufacturers", connector)

          output

          加工的數(shù)據(jù)集當(dāng)中則涉及到了工廠的主要負(fù)責(zé)人和聯(lián)系方式,而倉(cāng)儲(chǔ)的數(shù)據(jù)集當(dāng)中則涉及到了倉(cāng)儲(chǔ)的詳細(xì)地址、城市所在地等等

          df_storehouses = pd.read_sql("SELECT * FROM storehouses", connector)

          output

          還有甜品的種類數(shù)據(jù)集,

          df_sweets_types = pd.read_sql("SELECT * FROM sweets_types;", connector)

          output

          數(shù)據(jù)篩查

          簡(jiǎn)單條件的篩選

          接下來(lái)我們來(lái)做一些數(shù)據(jù)篩查,例如篩選出甜品當(dāng)中重量等于300的甜品名稱,在Pandas模塊中的代碼是這個(gè)樣子的

          # 轉(zhuǎn)換數(shù)據(jù)類型
          df_sweets['weight'] = pd.to_numeric(df_sweets['weight'])
          # 輸出結(jié)果
          df_sweets[df_sweets.weight == 300].name

          output

          1      Mikus
          6     Soucus
          11     Macus
          Name: name, dtype: object

          當(dāng)然我們還可以通過pandas當(dāng)中的read_sql()方法來(lái)調(diào)用SQL語(yǔ)句

          pd.read_sql("SELECT name FROM sweets WHERE weight = '300'", connector)

          output

          我們?cè)賮?lái)看一個(gè)相類似的案例,篩選出成本等于100的甜品名稱,代碼如下

          # Pandas
          df_sweets['cost'] = pd.to_numeric(df_sweets['cost'])
          df_sweets[df_sweets.cost == 100].name

          # SQL
          pd.read_sql("SELECT name FROM sweets WHERE cost = '100'", connector)

          output

          Milty

          針對(duì)文本型的數(shù)據(jù),我們也可以進(jìn)一步來(lái)篩選出我們想要的數(shù)據(jù),代碼如下

          # Pandas
          df_sweets[df_sweets.name.str.startswith('M')].name

          # SQL
          pd.read_sql("SELECT name FROM sweets WHERE name LIKE 'M%'", connector)

          output

          Milty
          Mikus
          Mivi
          Mi
          Misa
          Maltik
          Macus

          當(dāng)然在SQL語(yǔ)句當(dāng)中的通配符,%表示匹配任意數(shù)量的字母,而_表示匹配任意一個(gè)字母,具體的區(qū)別如下

          # SQL
          pd.read_sql("SELECT name FROM sweets WHERE name LIKE 'M%'", connector)

          output

          pd.read_sql("SELECT name FROM sweets WHERE name LIKE 'M_'", connector)

          output

          復(fù)雜條件的篩選

          下面我們來(lái)看一下多個(gè)條件的數(shù)據(jù)篩選,例如我們想要重量等于300并且成本價(jià)控制在150的甜品名稱,代碼如下

          # Pandas
          df_sweets[(df_sweets.cost == 150) & (df_sweets.weight == 300)].name

          # SQL
          pd.read_sql("SELECT name FROM sweets WHERE cost = '150' AND weight = '300'", connector)

          output

          Mikus

          或者是篩選出成本價(jià)控制在200-300之間的甜品名稱,代碼如下

          # Pandas
          df_sweets[df_sweets['cost'].between(200, 300)].name

          # SQL
          pd.read_sql("SELECT name FROM sweets WHERE cost BETWEEN '200' AND '300'", connector)

          output

          要是涉及到排序的問題,在SQL當(dāng)中使用的是ORDER BY語(yǔ)句,代碼如下

          # SQL
          pd.read_sql("SELECT name FROM sweets ORDER BY id DESC", connector)

          output

          而在Pandas模塊當(dāng)中調(diào)用的則是sort_values()方法,代碼如下

          # Pandas
          df_sweets.sort_values(by='id', ascending=False).name

          output

          11     Macus
          10    Maltik
          9        Sor
          8         Co
          7     Soviet
          6     Soucus
          5     Soltic
          4       Misa
          3         Mi
          2       Mivi
          1      Mikus
          0      Milty
          Name: name, dtype: object

          篩選出成本價(jià)最高的甜品名稱,在Pandas模塊當(dāng)中的代碼是這個(gè)樣子的

          df_sweets[df_sweets.cost == df_sweets.cost.max()].name

          output

          11    Macus
          Name: name, dtype: object

          而在SQL語(yǔ)句當(dāng)中的代碼,我們需要首先篩選出成本最高的是哪個(gè)甜品,然后再進(jìn)行進(jìn)一步的處理,代碼如下

          pd.read_sql("SELECT name FROM sweets WHERE cost = (SELECT MAX(cost) FROM sweets)", connector)

          我們想要看一下是倉(cāng)儲(chǔ)的城市具體是有哪幾個(gè),在Pandas模塊當(dāng)中的代碼是這個(gè)樣子的,通過調(diào)用unique()方法

          df_storehouses['city'].unique()

          output

          array(['Moscow''Saint-petersburg''Yekaterinburg'], dtype=object)

          而在SQL語(yǔ)句當(dāng)中則對(duì)應(yīng)的是DISTINCT關(guān)鍵字

          pd.read_sql("SELECT DISTINCT city FROM storehouses", connector)

          數(shù)據(jù)分組統(tǒng)計(jì)

          Pandas模塊當(dāng)中分組統(tǒng)計(jì)一般調(diào)用的都是groupby()方法,然后后面再添加一個(gè)統(tǒng)計(jì)函數(shù),例如是求分均值的mean()方法,或者是求和的sum()方法等等,例如我們想要查找出在不止一個(gè)城市生產(chǎn)加工甜品的名稱,代碼如下

          df_manufacturers.groupby('name').name.count()[df_manufacturers.groupby('name').name.count() > 1]

          output

          name
          Mishan    2
          Name: name, dtype: int64

          而在SQL語(yǔ)句當(dāng)中的分組也是GROUP BY,后面要是還有其他條件的話,用的是HAVING關(guān)鍵字,代碼如下

          pd.read_sql("""
          SELECT name, COUNT(name) as 'name_count' FROM manufacturers
          GROUP BY name HAVING COUNT(name) > 1
          "
          "", connector)

          數(shù)據(jù)合并

          當(dāng)兩個(gè)數(shù)據(jù)集或者是多個(gè)數(shù)據(jù)集需要進(jìn)行合并的時(shí)候,在Pandas模塊當(dāng)中,我們可以調(diào)用merge()方法,例如我們將df_sweets數(shù)據(jù)集和df_sweets_types兩數(shù)據(jù)集進(jìn)行合并,其中df_sweets當(dāng)中的sweets_types_id是該表的外鍵

          df_sweets.head()

          output

          df_sweets_types.head()

          output

          具體數(shù)據(jù)合并的代碼如下所示

          df_sweets_1 = df_sweets.merge(df_sweets_types, left_on='sweets_types_id', right_on='id')

          output

          我們?cè)龠M(jìn)一步的篩選出巧克力口味的甜品,代碼如下

          df_sweets_1.query('name_y == "chocolate"').name_x

          output

          10    Misa
          11     Sor
          Name: name_x, dtype: object

          SQL語(yǔ)句則顯得比較簡(jiǎn)單了,代碼如下

          # SQL
          pd.read_sql("""
          SELECT sweets.name FROM sweets
          JOIN sweets_types ON sweets.sweets_types_id = sweets_types.id
          WHERE sweets_types.name = 'chocolate';
          "
          "", connector)

          output

          數(shù)據(jù)集的結(jié)構(gòu)

          我們來(lái)查看一下數(shù)據(jù)集的結(jié)構(gòu),在Pandas模塊當(dāng)中直接查看shape屬性即可,代碼如下

          df_sweets.shape

          output

          (12, 10)

          而在SQL語(yǔ)句當(dāng)中,則是

          pd.read_sql("SELECT count(*) FROM sweets;", connector)

          output


          往期精彩回顧





          瀏覽 65
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩天天在线 | 青娱乐超碰在线 | 蜜乳一区二区 | 欧美性爱福利视频 | 亚洲无码免费在线观看 |