2020年數據分析必知必會(八):使用pandas查詢數據和統計分析的應用(短小但強大)

2021-03-02 AI科技與算法編程

認認真真系統學習數據分析

本文繼續學習Python數據分析知識,前期的知識點可點擊以下藍色字體連結進行回看複習:

數據分析開篇:一個簡單的應用(2019/11/04)

2020年數據分析必知必會(一):NumPy數組

2020年數據分析必知必會(二):NumPy摘要----文章末尾附Python

2020年數據分析必知必會(三):數組的形狀和屬性(有福利贈予)

數據分析必知必必會(四):數組的轉換,視圖,拷貝,索引和廣播(這裡的「廣播」是一個數組的應用:數據處理舊手機鈴聲)

2020年數據分析必知必會(五):統計和線性代數(使用Numpy與Scipy實現)

2020年數據分析必知必會(六):離散式複製的創建(以北京最近的豬肉價格為例子)

2020年數據分析必知必會(七):pandas入門與數據結構基礎

廢話不多說,直接上乾貨

....

正文開始

1、pandas如何查詢數據?

從前面的學習我們已經知道,pandas的DataFrame數據結構類似於關係資料庫類型,那麼查詢方式也就如出一轍了。

數據的背景(你也可選擇其他數據作為例子):太陽黑子

下面以一個眾所周知的太陽黑子爆發數據為例子,如圖(來源百度)

太陽的光球表面有時會出現一些暗的區域,它是磁場聚集的地方,這就是太陽黑子。


獲取太陽黑子數據:

太陽黑子數據網站:https://www.quandl.com/data/SIDC/SUNSPOTS_13-Total-Sunspot-Numbers-13-Month

網站每天使用權限:每天使用Python下載該網站的數據最多調用50次。

Python下載黑子數據需要的模塊命令:(win+r+cmd)

pip install Quandl 或 python -m pip install Quandl

這裡的Quandl的API接口是免費的,因此為了方便python公司將Quandl作為模塊導入黑子爆發的數據。注意:使用次數超過需要註冊。

(1)、下載數據:2018至2019年間13個月的太陽黑子總數

(下載速度慢,請耐心等待)

>>> import quandl>>> sunspots = quandl.get("SIDC/SUNSPOTS_13")#2019年的數據SIDC/SUNSPOTS_13             #2018"SIDC/SUNSPOTS_A">>> sunspots            13-Month Smoothed Total Sunspot Number  ...  Definitive/Provisional IndicatorDate                                                ...1749-01-31                                     NaN  ...                               1.01749-02-28                                     NaN  ...                               1.01749-03-31                                     NaN  ...                               1.01749-04-30                                     NaN  ...                               1.01749-05-31                                     NaN  ...                               1.0...                                            ...  ...                               ...2019-06-30                                     NaN  ...                               0.02019-07-31                                     NaN  ...                               0.02019-08-31                                     NaN  ...                               0.02019-09-30                                     NaN  ...                               0.02019-10-31                                     NaN  ...                               0.0
[3250 rows x 4 columns]

順便也下了2017至2018的,主要是覺得上述數據有NaN空值

>>> import quandl>>> sunspots = quandl.get("SIDC/SUNSPOTS_A")>>> sunspots            Yearly Mean Total Sunspot Number  Yearly Mean Standard Deviation  Number of Observations  Definitive/Provisional IndicatorDate1700-12-31                               8.3                             NaN                     NaN                               1.01701-12-31                              18.3                             NaN                     NaN                               1.01702-12-31                              26.7                             NaN                     NaN                               1.01703-12-31                              38.3                             NaN                     NaN                               1.01704-12-31                              60.0                             NaN                     NaN                               1.0...                                      ...                             ...                     ...                               ...2014-12-31                             113.3                             8.0                  5273.0                               1.02015-12-31                              69.8                             6.4                  8903.0                               1.02016-12-31                              39.8                             3.9                  9940.0                               1.02017-12-31                              21.7                             2.5                 11444.0                               1.02018-12-31                               7.0                             1.1                 12611.0                               1.0
[319 rows x 4 columns]

(2)、指定導出數據的開頭和結尾最後的幾行數據

方法:

使用函數head(n)和tail(n)分別下載數據的前n行和後n行,其中n為你要下載的行數。

假設參數n=4,那麼就有:

import quandlsunspots = quandl.get("SIDC/SUNSPOTS_A")#2019年的數據SIDC/SUNSPOTS_13             #2018"SIDC/SUNSPOTS_A"print(sunspots)print("前四行數據為:",sunspots.head(4))print("後四行數據為:",sunspots.tail(4))

執行結果:

>> print("前四行數據為:",sunspots.head(4))前四行數據為:Yearly Mean Total Sunspot Number  Yearly Mean Standard Deviation  Number of Observations  Definitive/Provisional IndicatorDate1700-12-31                               8.3                             NaN                     NaN                               1.01701-12-31                              18.3                             NaN                     NaN                               1.01702-12-31                              26.7                             NaN                     NaN                               1.01703-12-31                              38.3                             NaN                     NaN                               1.0>>> print("後四行數據為:",sunspots.tail(4))後四行數據為:Yearly Mean Total Sunspot Number  Yearly Mean Standard Deviation  Number of Observations  Definitive/Provisional IndicatorDate2015-12-31                              69.8                             6.4                  8903.0                               1.02016-12-31                              39.8                             3.9                  9940.0                               1.02017-12-31                              21.7                             2.5                 11444.0                               1.02018-12-31                               7.0                             1.1                 12611.0                               1.0>>>

(3)、查詢最近2018年最後一天的太陽黑子的數據

(注意:只能查一個數據,而且是每月最後一天)

last_data = sunspots.index[-1]print("最近數據:",sunspots.loc[last_data])

執行結果:

>>> last_data = sunspots.index[-1]>>> print("最近數據:",sunspots.loc[last_data])最近數據: Yearly Mean Total Sunspot Number        7.0Yearly Mean Standard Deviation          1.1Number of Observations              12611.0Definitive/Provisional Indicator        1.0Name: 2018-12-31 00:00:00, dtype: float64

(4)、查詢指定日期範圍內的數據

(切記:按照年月日格式來查,且數據結果不包括範圍的區間的端點值)

假設我想查2008年8月8日到2018年1月1日中最後一月最後一天的數據,日期格式為

代碼如下:

print("查找指定的日期數據",sunspots["20080808":"20180101"])

執行結果:(可以看到都是12月31日)

>>> print("查找指定的日期數據",sunspots["20080808":"20180101"])查找指定的日期數據             Yearly Mean Total Sunspot Number  Yearly Mean Standard Deviation  Number of Observations  Definitive/Provisional IndicatorDate2008-12-31                               4.2                             2.5                  6644.0                               1.02009-12-31                               4.8                             2.5                  6465.0                               1.02010-12-31                              24.9                             3.4                  6328.0                               1.02011-12-31                              80.8                             6.7                  6077.0                               1.02012-12-31                              84.5                             6.7                  5753.0                               1.02013-12-31                              94.0                             6.9                  5347.0                               1.02014-12-31                             113.3                             8.0                  5273.0                               1.02015-12-31                              69.8                             6.4                  8903.0                               1.02016-12-31                              39.8                             3.9                  9940.0                               1.02017-12-31                              21.7                             2.5                 11444.0                               1.0

(5)、指定索引來查詢

print("指定索引查詢",sunspots.iloc[[2,1,0,-1,-2]])

執行結果:

>>> print("指定索引查詢",sunspots.iloc[[2,1,0,-1,-2]])指定索引查詢             Yearly Mean Total Sunspot Number  Yearly Mean Standard Deviation  Number of Observations  Definitive/Provisional IndicatorDate1702-12-31                              26.7                             NaN                     NaN                               1.01701-12-31                              18.3                             NaN                     NaN                               1.01700-12-31                               8.3                             NaN                     NaN                               1.02018-12-31                               7.0                             1.1                 12611.0                               1.02017-12-31                              21.7                             2.5                 11444.0                               1.0>>>

如果按照順序,也可這麼來輸出:

>>> print("指定索引查詢",sunspots.iloc[[-2,-1,0,1,2]])指定索引查詢             Yearly Mean Total Sunspot Number  Yearly Mean Standard Deviation  Number of Observations  Definitive/Provisional IndicatorDate2017-12-31                              21.7                             2.5                 11444.0                               1.02018-12-31                               7.0                             1.1                 12611.0                               1.01700-12-31                               8.3                             NaN                     NaN                               1.01701-12-31                              18.3                             NaN                     NaN                               1.01702-12-31                              26.7                             NaN                     NaN                               1.0>>>

(6)、查詢指定變量值

換句話說就是查詢指定行和列對應位置的數值,類似矩陣或數組中查詢指定行列位置的元素。

print("查詢第3行第4列元素", sunspots.iloc[2, 3])print("查詢第2行第1列元素", sunspots.iat[1, 0])

執行結果:

>>> print("查詢第3行第4列元素", sunspots.iloc[2, 3])查詢第3行第4列元素 1.0>>> print("查詢第2行第1列元素", sunspots.iat[1, 0])查詢第2行第1列元素 18.3

(7)、查詢布爾型變量

這裡需要使用平均值函數:mean()

下面查詢各個大於平均值的數值

print("Boolean selection",sunspots[sunspots > sunspots.mean()])

執行結果:

>>> print("Boolean selection",sunspots[sunspots > sunspots.mean()])Boolean selection             Yearly Mean Total Sunspot Number  Yearly Mean Standard Deviation  Number of Observations  Definitive/Provisional IndicatorDate1700-12-31                               NaN                             NaN                     NaN                               NaN1701-12-31                               NaN                             NaN                     NaN                               NaN1702-12-31                               NaN                             NaN                     NaN                               NaN1703-12-31                               NaN                             NaN                     NaN                               NaN1704-12-31                               NaN                             NaN                     NaN                               NaN...                                      ...                             ...                     ...                               ...2014-12-31                             113.3                             8.0                  5273.0                               NaN2015-12-31                               NaN                             NaN                  8903.0                               NaN2016-12-31                               NaN                             NaN                  9940.0                               NaN2017-12-31                               NaN                             NaN                 11444.0                               NaN2018-12-31                               NaN                             NaN                 12611.0                               NaN
[319 rows x 4 columns]

2、利用pandas的DataFrmae進行統計計算

為了方便,這裡先給出統計函數的一些描述:


idxmin 最小值的索引值

idxmax 最大值的索引值

describe 一次性 多種維度統計

count 非NA值的數量

min 最小值

max 最大值

argmin 最小值的索引位置

argmax 最大值的索引位置

sum 總和

mean 平均數

median 算術中位數

mad 根據平均值計算平均絕對離差

var 樣本值的方差

std 樣本值的標準差

skew 樣本值的偏度(三階矩陣)

kurt 樣本值的峰度(四階矩陣)

cumsum 樣本值的累積和

cummin、cummax 樣本值的最大值、最小值

cumprod 樣本值的累計積

diff 計算一階差分

pct_change 計算百分數變化


下面舉出幾個例子說明上述用途,其他類似去使用,代碼如下:

import quandl#統計計算# Data from http:# PyPi url https:sunspots = quandl.get("SIDC/SUNSPOTS_A")print("Describe", sunspots.describe())print("非NAN數值的數量Non NaN observations",sunspots.count())print("平均絕對標準差MAD", sunspots.mad())print("中位數Median", sunspots.median())print("Min", sunspots.min())print("Max", sunspots.max())print("眾數Mode", sunspots.mode())print("離散度的標準差Standard Deviation", sunspots.std())print("方差Variance", sunspots.var())print("偏態係數Skewness", sunspots.skew())print("峰態係數Kurtosis", sunspots.kurt())

執行結果:

>>> import quandl>>> ... ... ...>>> sunspots = quandl.get("SIDC/SUNSPOTS_A")>>> print("Describe", sunspots.describe())Describe        Yearly Mean Total Sunspot Number  Yearly Mean Standard Deviation  Number of Observations  Definitive/Provisional Indicatorcount                        319.000000                      201.000000              201.000000                             319.0mean                          78.970533                        7.947761             1572.751244                               1.0std                           62.019871                        3.840522             2667.888556                               0.0min                            0.000000                        1.100000              150.000000                               1.025%                           24.800000                        4.700000              365.000000                               1.050%                           65.800000                        7.600000              365.000000                               1.075%                          115.750000                       10.400000              366.000000                               1.0max                          269.300000                       19.100000            12611.000000                               1.0>>> print("非NAN數值的數量Non NaN observations",sunspots.count())非NAN數值的數量Non NaN observations Yearly Mean Total Sunspot Number    319Yearly Mean Standard Deviation      201Number of Observations              201Definitive/Provisional Indicator    319dtype: int64>>> print("平均絕對標準差MAD", sunspots.mad())平均絕對標準差MAD Yearly Mean Total Sunspot Number      50.954279Yearly Mean Standard Deviation         3.155848Number of Observations              1990.750773Definitive/Provisional Indicator       0.000000dtype: float64>>> print("中位數Median", sunspots.median())中位數Median Yearly Mean Total Sunspot Number     65.8Yearly Mean Standard Deviation        7.6Number of Observations              365.0Definitive/Provisional Indicator      1.0dtype: float64>>> print("Min", sunspots.min())Min Yearly Mean Total Sunspot Number      0.0Yearly Mean Standard Deviation        1.1Number of Observations              150.0Definitive/Provisional Indicator      1.0dtype: float64>>> print("Max", sunspots.max())Max Yearly Mean Total Sunspot Number      269.3Yearly Mean Standard Deviation         19.1Number of Observations              12611.0Definitive/Provisional Indicator        1.0dtype: float64>>> print("眾數Mode", sunspots.mode())眾數Mode    Yearly Mean Total Sunspot Number  Yearly Mean Standard Deviation  Number of Observations  Definitive/Provisional Indicator0                              18.3                             9.2                   365.0                               1.0>>> print("離散度的標準差Standard Deviation", sunspots.std())離散度的標準差Standard Deviation Yearly Mean Total Sunspot Number      62.019871Yearly Mean Standard Deviation         3.840522Number of Observations              2667.888556Definitive/Provisional Indicator       0.000000dtype: float64>>> print("方差Variance", sunspots.var())方差Variance Yearly Mean Total Sunspot Number    3.846464e+03Yearly Mean Standard Deviation      1.474961e+01Number of Observations              7.117629e+06Definitive/Provisional Indicator    0.000000e+00dtype: float64>>> print("偏態係數Skewness", sunspots.skew())偏態係數Skewness Yearly Mean Total Sunspot Number    0.810785Yearly Mean Standard Deviation      0.546692Number of Observations              1.972382Definitive/Provisional Indicator    0.000000dtype: float64>>> print("峰態係數Kurtosis", sunspots.kurt())峰態係數Kurtosis Yearly Mean Total Sunspot Number   -0.127610Yearly Mean Standard Deviation     -0.252353Number of Observations              2.728810Definitive/Provisional Indicator    0.000000dtype: float64

下期預告:如何聚合數據?

認認真真系統學習數據分析


相關焦點

  • 強大的matlab數據科學擬合庫cftool——直接導入數據進行擬合
    介紹的引用來源:百度一、安裝cftoolcftool(Curve Fitting Toolbox™)工具箱主要是針對數據擬合的。使用起來特別的強大,尤其對於數據的處理超級方便,可以直接對於數據擬合,並且可以預設各種的擬合方案。這裡注意的是非線性的也可以進行擬合,例如:冪律,高斯等等。
  • Python數據分析之pandas數據讀寫
    引言我們現在已經基本熟悉了pandas庫以及它所提供的用於數據分析的基礎功能,也知道了DataFrame和Series是這個庫的核心,數據處理、計算和分析都是圍繞他們展開的。本節將學習pandas從多種存儲媒介(比如文件和資料庫)讀取數據的工具,還將學到直接將不同的數據結構寫入不同格式文件的方法,而無需過多考慮所使用的技術。本節的主要內容為pandas的多種I/O API函數,它們為大多數常用格式的數據作為DataFrame對象進行讀寫提供了很大便利。
  • Python數據分析:pandas讀取和寫入數據
    我的公眾號是關於自己在數據分析/挖掘學習過程中的一些技術和總結分享,文章會持續更新......繼續深入學習pandas相關操作,數據讀取寫入、分組、合併,轉換等等。前面一篇文章裡已經寫了關於描述性統計以及常用的基本操作。接下來的一段時間裡,我將陸續地去掌握並輸出。這篇文章是關於數據讀取與寫入的知識點。
  • 【數據分析】Pandas
    其他常用方法                ✦ ✦ ✦ ✦ ✦ ✦1、簡介pandas是一個強大的Python數據分析的工具包,它是基於Numpy構建的,正因pandas的出現,讓Python語言也成為使用最廣泛而且強大的數據分析環境之一。
  • pandas | 使用pandas進行數據處理——DataFrame篇
    從文件讀取pandas另外一個非常強大的功能就是可以從各種格式的文件當中讀取數據創建DataFrame,比如像是常用的excel、csv,甚至是資料庫也可以因為我們做機器學習或者是參加kaggle當中的一些比賽的時候,往往數據都是現成的,以文件的形式給我們使用,需要我們自己創建數據的情況很少。如果是在實際的工作場景,雖然數據不會存在文件當中,但是也會有一個源頭,一般是會存儲在一些大數據平臺當中,模型從這些平臺當中獲取訓練數據。
  • 《pandas數據讀取》
    ,需要使用不同的函數讀取,pandas內置了10餘種數據源讀取函數和對應的數據寫入函數,常見的數據源有3種,分別是資料庫數據,文本文件(包含一般文本文件和CSV文件)和Excel文件,掌握這三種數據源讀取方法,便能夠完成80%左右的數據讀取工作。
  • 使用pandas分析1976年至2010年的美國大選的投票數據
    既然我們正在熱烈討論2020年的大選,我想分析一下之前的美國總統大選是個好主意。數據集包含了從1976年到2020年的選舉。我會從不同的角度來處理這些數據,試圖了解人們是如何投票的。我將使用pandas庫進行數據分析和可視化,因此這也是使用pandas的函數和方法的良好實踐。讓我們從導入庫並將數據集讀入一個Pandas dataframe開始。
  • 使用Pandas數據處理與分析
    前言:這是關於個人關於對pandas可以進行的數據處理和數據分析的見解的初版,其中肯定不乏一些錯誤之處,希望大家能多多指正。方便理解數據和為後續處理分析打下基礎。典型應用場景是,針對同一個主鍵存在兩張包含不同欄位的表,現在我們想把他們整合到一張表裡。在此典型情況下,結果集的行數並沒有增加,列數則為兩個元數據的列數和減去連接鍵的數量。
  • 使用Pandas進行數據處理
    數據處理的三個階段為:數據準備、數據轉換和數據聚合。數據準備開始處理數據工作之前,需要先行準備好數據,把數據組裝成便於用pandas庫的各種工具處理的數據結構。數據可能是來自不同的數據源,有著不同的格式,但是即使獲取到數據,把它們歸併為一個DataFrame後,你還需要做進一步處理,才能把數據準備好。在本節中,你將會學到把數據轉換為統一的數據結構所需的各種操作。對於存儲在pandas對象中的各種數據,其組裝方法有如下幾種:1.合併——pandas.merge( )函數根據一個或多個鍵連接多行。
  • 用Python做數據分析:Pandas常用數據查詢語法
    在使用Pandas之前,大多數數據分析師已經掌握了Excel和SQL,並且在剛上手Pandas時會經常習慣性想到「老辦法」。"
  • 想學數據分析卻不知道看什麼書,為你推薦精選書單
    《誰說菜鳥不會數據分析》推薦理由:基於通用的Excel工具,在8個章節中,分別講解數據分析必知必會的知識、數據處理技巧、數據展現的技術、通過專業化的視角來提升圖表之美、數據分析報告的撰寫技能以及持續的修煉。讀者完全可以把這本書當小說來閱讀,跟隨主人公小白,在Mr.林的指點下輕鬆掌握數據分析的技能,提升職場競爭能力。
  • 數據分析必知必會(四):數組的轉換、視圖、拷貝、索引和廣播(這裡的「廣播」是一個數組的應用:數據處理舊手機鈴聲)
    (由於原圖有露點,這裡的截圖僅作參考和學習分析,請客觀公正嚴肅對待這一張60多歲的老奶奶的圖片)(這張照片目前已被學術界:美國圖像處理研究所下架,現在使用的是梯子和其他圖片)本文繼續學習Python數據分析知識,前期的知識點可點擊下面藍色字體連結進行回看複習:數據分析開篇:一個簡單的應用(2019/11/04)2020年數據分析必知必會(一):NumPy數組2020
  • Excel數據統計分析技巧
    Excel課程模塊(技巧)Excel數據規範與應用技巧Excel表格框架與區域的轉化Excel表格框架的特點Excel表格框架操作應用技巧快速提升效率之—自定義工具欄Excel經典工具按鈕的使用Excel課程第二模塊(專業報表設計與美化)精美而專業的報表製作裝備
  • 提高數據分析能力,你不得不看的33本書|推薦收藏
    今天DataHunter數獵哥就為大家推薦一份相對完整的入門學習體系的數據分析書單。2020年,不妨從這裡開始,給自己定下一個小小的目標,開始好好學習吧! 一、數據分析入門1.《誰說菜鳥不會數據分析》推薦理由:基於通用的Excel工具,在8個章節中,分別講解數據分析必知必會的知識、數據處理技巧、數據展現的技術、通過專業化的視角來提升圖表之美、數據分析報告的撰寫技能以及持續的修煉。讀者完全可以把這本書當小說來閱讀,跟隨主人公小白,在Mr.林的指點下輕鬆掌握數據分析的技能,提升職場競爭能力。
  • 如何使用Pandas-Profiling進行探索性數據分析
    當開始一個新的機器學習項目時,獲得機器學習數據集之後的第一步就是要了解它。我們可以通過執行探索性數據分析(EDA)來實現這一點。這包括找出每個變量的數據類型、目標變量的分布、每個預測變量的不同值的數量、數據集中是否有重複值或缺失值等。進行EDA探索機器學習數據集的過程往往是非常耗時的。什麼是Pandas-Profiling?
  • 1000+位資深牛人推薦的數據分析書
    書籍簡介:《誰說菜鳥不會數據分析》基於通用的Excel工具,在8個章節中,分別講解數據分析必知必會的知識、數據處理技巧、數據展現的技術、通過專業化的視角來提升圖表之美、數據分析報告的撰寫技能以及持續的修煉。
  • 機場運行數據統計分析與運用
    數據統計分析是指採用適當的統計方法,對收集的數據資料進行匯總、提煉、分析和研究,探索對象內在規律。數據統計分析是改善企業管理、提高精細化管理水平的有效手段,是企業經營決策的重要依據。  我國民航運輸業目前處於快速增長時期,企業管理粗放,對於生產經營過程有關數據信息的收集、分析和研究重視程度不夠,企業的經營管理和決策多依賴於經驗判斷。
  • Python做數據分析-簡潔、易讀、強大
    在數據分析和交互、探索性計算以及數據可視化等方面,相對於R、MATLAB、SAS、Stata等工具,Python都有其優勢。近年來,由於Python庫的不斷發展(如pandas),使其在數據挖掘領域嶄露頭角。結合其在通用編程方面的強大實力,我們完全可以只使用Python這一種語言去構建以數據為中心的應用程式。
  • python數據分析之pandas常用命令整理
    pandas 是基於NumPy 的一種工具,該工具是為了解決數據分析任務而創建的。Pandas 納入了大量庫和一些標準的數據模型,提供了高效地操作大型數據集所需的工具。pandas提供了大量能使我們快速便捷地處理數據的函數和方法。你很快就會發現,它是使Python成為強大而高效的數據分析環境的重要因素之一。
  • python數據分析萬字乾貨!一個數據集全方位解讀pandas
    說到python與數據分析,那肯定少不了pandas的身影,本文希望通過分析經典的NBA數據集來系統的全方位講解pandas包,建議搭配IDE一遍敲一邊讀哦。話不多說,開始吧!>對列進行操作指定數據類型數據清洗數據可視化pandas的安裝建議直接安裝anaconda,會預置安裝好所有數據分析相關的包,當然也可以使用pip安裝。