日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据分析基础教程 ( 1 )

發布時間:2024/3/24 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据分析基础教程 ( 1 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 簡介
      • Numpy
      • Pandas
      • Matplotlib
      • Seaborn
      • SciPy
      • Scikit-Learn
    • Numpy 基礎教程
      • 安裝
      • numpy 的引用
      • 使用 ndarray 創建數組
      • 數組索引、切片、賦值
      • 基本的數組運算
      • 隨機數
    • Pandas 基礎教程
      • 安裝
      • Pandas 引用
      • Pandas 數據結構
        • Series
        • DataFrame
      • Pandas 輸出設置
      • Pandas 數據的讀取與寫入
      • DataFrame 排序
      • DataFrame 去重
      • Pandas 替換數據
      • 切片與篩選

簡介

Numpy

NumPy是Python的一種開源的數值計算擴展,可用來存儲和處理大 型矩陣,比Python自身的列表結構要高效得多。NumPy底層使用 BLAS 作為向量,各種運算的速度也得到大幅提升。它主要包括:

  • 強大的N維數組對象Array;

  • 比較成熟的(廣播)函數庫;

  • 用于整合C、C++和Fortran代碼的工具包;

  • 實用的線性代數、傅里葉變換和隨機數生成函數,使 NumPy 和 稀疏矩陣運算包SciPy的配合使用更加方便。 另外,NumPy中的數據類型在 Pandas、Scikit-Learn、StatsModels 等庫中被作為基本數據類型使用。

  • Pandas

    Python 之所以能成為強力的數據分析工具,和 Pandas 庫有很大的 關系。Pandas 的主要應用環境如下:

  • 數據的導入與導出;

  • 數據清理;

  • 數據挖掘與探索;

  • 為分析做數據處理與準備;

  • 結合Scikit-Learn、StatsModels進行分析。

  • 用得最多的Pandas對象是DataFrame,它是一個兩維數據 表結構,包含多行多列。

    相對于 R等統計軟件,Pandas借鑒了 R的數據結構,因此擁有了 R 的很多方便的數據操作特性;在語法設計上,Pandas比R和Stata更嚴謹 且更簡潔易用;基于Python自動管理內存的能力,以及在很多細節上的 優化(比如在數據操作過程中的數據復制和引用),Pandas擁有了更好 的管理和計算大數據的能力。

    Pandas的底層基于NumPy搭建,因此Pandas擁有了NumPy的全部優 點,比如Pandas定義的數據結構可以支持NumPy已經定義的計算,相當 于擁有了MATLAB的矩陣計算能力;NumPy原生的C接口也為擴展 Pandas的計算性能帶來了很大的方便。 對于金融用戶來講,Pandas提供了一系列適用于金融數據的高性能 時間序列與工具,例如Panel、時間Series等。

    Matplotlib

    Matplotlib是Python最著名的繪圖庫,提供了一整套和MATLAB相 似的命令API,十分適合進行交互式制圖。我們也可以很方便地將它作 為繪圖控件,嵌入GUI應用程序中Matplotlib 的文檔相當完備,而且在 Gallery 頁面中有上百幅縮略圖,打開后都有源程序。因此,如果需要繪制某種類型的圖,則只需在這個頁面中瀏覽、 復制、粘貼,就基本可以搞定。

    Seaborn

    Seaborn其實是在Matplotlib的基礎上進行了更高級的API封裝,從而 使作圖更容易。在大多數情況下使用 Seaborn 就能制作出非常有吸引力的圖,而使用Matplotlib就能制作出具有更多特色的圖。但是應該把Seaborn視為Matplotlib的補充,而不是替代物。

    Seaborn默認的淺灰色背景與白色網絡線的靈感來源于Matplotlib, 卻比Matplotlib的顏色更加柔和。我們發現,圖對于傳播信息很有用, 幾乎在所有情況下,人們喜歡圖更甚于表。

    SciPy

    SciPy 包含致力于解決科學計算中常見問題的各個工具箱。它的不 同子模塊相當于不同的應用,例如插值、積分、優化、圖像處理、特殊 函數等。SciPy可以與其他標準科學計算程序庫進行比較,比如GSL(GNU C或C++科學計算庫)或者 MATLAB 工具箱。SciPy 是Python 中科學計 算程序的核心包,用于有效地計算NumPy矩陣,讓NumPy和SciPy協同 工作。

    Scikit-Learn

    Scikit-Learn 是基于 Python 的機器學習模塊,基于 BSD 開源許可 證。Scikit-Learn 的基本功能主要被分為6部分:分類、回歸、聚類、數 據降維、模型選擇和數據預處理,具體可以參考官方網站上的文檔。

    對具體的機器學習問題的解決,通常可以分為三步:

  • 數據準備與預處理;

  • 模型選擇與訓練;

  • 模型驗證與參數調優。

  • Scikit-Learn 封裝了這 些步驟,使建模的過程更方便、簡單和快捷。

    Numpy 基礎教程

    安裝

    pip install numpy

    numpy 的引用

    import numpy as np

    使用 ndarray 創建數組

    NumPy 的主要對象是 ndarray,該對象是一個快速、靈活的大數據容器。在此需要注意,在ndarray與Python中內置的list、tuple并不相同。在Python中,元素的數據類型可以不同;而在ndarray中,所有元素的數據類型必須相同。

    data1 = [1,2,3,4] data2 = [5,6,7,8]arr1 = np.array(data1) arr1

    Output:

    array([1, 2, 3, 4])

    創建一個4×2數組4 \times 2 數組4×2

    arr2 = np.array([data1,data2]) arr2

    Output:

    array([[1, 2, 3, 4],[5, 6, 7, 8]])

    創建全0的數組

    np.zeros((3,3))

    Output:

    array([[0., 0., 0.],[0., 0., 0.],[0., 0., 0.]])

    創建全1的數組

    np.ones((3,3))

    Output:

    array([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]])

    創建1-10 且為 2 的等差數列

    np.arange(1,10,2)

    Output:

    array([1, 3, 5, 7, 9])

    創建1-10且長度為4的等差數列

    np.linspace(1,10,4)

    Output:

    array([ 1., 4., 7., 10.])

    數組索引、切片、賦值

    索引切片的操作類似于Python的內置函數list,只不過是從一維拓展到多維而已。首先,我們創建一個 3×33 \times 33×3 的 ndarray:

    arr2 = np.array([[1,2,3],[4,5,6],[7,8,9]]) arr2

    Output:

    array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])

    選取行

    arr2[1]

    Output:

    array([4, 5, 6])

    選取給定的行列值

    arr2[1,1]

    Output:

    5

    選取前幾行

    arr2[:2]

    Output:

    array([[1, 2, 3],[4, 5, 6]])

    選取前幾行與前幾列

    arr2[:2,:2]

    Output:

    array([[1, 2],[4, 5]])

    基本的數組運算

    ndarray 的一大特色就是可以將代碼向量化。所謂向量化,就是對 一個復雜的對象進行整體操作,而不是對其中的單個元素進行循環。NumPy 的大部分代碼都是由 C 語言編寫的,并且進行了高度優化,這 大大加快了計算速度。
    簡單的數學運算可以直接在ndarray上運行,例如:

    arr3 = np.array([[1,2,3],[4,5,6],[7,8,9]]) arr3

    Output:

    array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])

    矩陣的加法

    arr3 + arr3

    Output:

    array([[ 2, 4, 6],[ 8, 10, 12],[14, 16, 18]])

    矩陣中對應元素相乘

    arr3 * arr3

    Output:

    array([[ 1, 4, 9],[16, 25, 36],[49, 64, 81]])

    矩陣中每一個元素乘以系數

    arr3 * 2

    Output:

    array([[ 2, 4, 6],[ 8, 10, 12],[14, 16, 18]])

    矩陣中每一個元素進行冪運算

    arr3 ** 0.5

    Output:

    array([[1. , 1.41421356, 1.73205081],[2. , 2.23606798, 2.44948974],[2.64575131, 2.82842712, 3. ]])

    在 NumPy 中還有一些內置的數學函數,可以幫助我們快速地對數
    據進行統計計算,比如sum、max、mean、std等。

    求和:

    arr3.sum()

    Output:

    45

    求標準差:

    arr3.std()

    Output:

    2.581988897471611

    求最大值:

    arr3.max()

    Output:

    9

    基本的數組統計方法

    方法說明
    sum對數組的全部或者軸向數據求和
    mean算術平均數
    std var標準差,方差
    min max最大值和最小值
    argmin argmax最小元素和最大元素的索引
    cumsum cumprod所有元素累計求和 所有元素累計求積

    隨機數

    NumPy還可以用來生成偽隨機數,負責這一功能的是其子庫 numpy.random。

    首先,導入 numpy.random。為了更直觀地展示隨機數的生成過程,這里同時導入了Matplotlib,以將結果可視化:

    import numpy.random as npr import matplotlib.pyplot as plt %matplotlib inline

    例如,npr.rand函數可以用來生成 [0,1)[0,1)[01的隨機多維數組:

    npr.rand(3,2)

    Output:

    array([[0.45788024, 0.57343845],[0.2763168 , 0.68187916],[0.91109262, 0.40315501]])

    通過簡單的線性變換,即可將將隨機區間轉化為[2,4)[2,4)[2,4)

    npr.rand(3,2)*2+2

    Output:

    array([[3.06512178, 2.78121736],[3.06268945, 3.4561032 ],[3.08663582, 2.52355033]])

    下表展示了生成簡單隨機數的函數及其參數和描述。

    函數參數描述
    roundd0,d1生成半開區間[0,1)[0,1)[0,1)內的多維隨機數
    randnd0,d1生成來自正態分布的多個樣本
    randintlow,high,size生成半開區間[low,high)[low,high)[low,high)內的隨機樣本整數
    chiocea,size,raplace,p生成在給定的一維數組中的隨機樣本
    size = 1000 rn1 = npr.rand(size,2) rn2 = npr.randn(size) rn3 = npr.randint(0,10,size) rang = [0,10,20,30,40] rn4 = npr.choice(rang,size = size)fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows = 2, ncols = 2, figsize = (10, 10)) ax1.hist(rn1, bins = 25, stacked = True) ax1.set_title('rand') ax1.set_ylabel('frequency') ax1.grid(True) ax2.hist(rn2, bins = 25) ax2.set_title('randn') ax2.grid(True) ax3.hist(rn3, bins = 25) ax3.set_title('randint') ax3.set_ylabel('frequency') ax3.grid(True) ax4.hist(rn4, bins = 25) ax4.set_title('choice') ax4.grid(True)

    許多金融模型,例如 BSM 模型、跳躍擴散模型、平方根擴散模型等,都依賴于正態分布。我們可以通過生成相應的隨機數,來將原本連續的金融模型離散化,從而進行近似模擬。在npr.random模塊中內置了很多分布函數,具體內容可以查閱NumPy的文檔。
    作為例子,我們將如下分布的隨機數進行可視化。

  • n=100、P=0.3的二項分布。
  • 均值為10、標準差為2的正態分布。
  • 自由度為0.5的卡方分布。
  • λ為2的泊松分布。
  • rn5 = npr.binomial(100, 0.3, size) rn6 = npr.normal(10, 20, size) rn7 = npr.chisquare(0.5, size) rn8 = npr.poisson(2.0, size)fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows = 2, ncols = 2, figsize = (10, 10)) ax1.hist(rn5, bins = 25) ax1.set_title('binomial') ax1.set_ylabel('frequency') ax1.grid(True) ax2.hist(rn6, bins = 25) ax2.set_title('normal') ax2.grid(True) ax3.hist(rn7, bins = 25) ax3.set_title('chisquare') ax3.set_ylabel('frequency') ax3.grid(True) ax4.hist(rn8, bins = 25) ax4.set_title('poisson') ax4.grid(True)

    Pandas 基礎教程

    Pandas 是基于 NumPy 衍生出的一種工具,用于解決數據分析問 題,它納入了大量的庫和一些標準的數據模型,提供了可用于高效操作 大型數據集的工具,是使 Python 成為強大而高效的數據分析工具的重 要因素之一。

    安裝

    pip install dataframe

    Pandas 引用

    import pandas as pd

    Pandas 數據結構

    Pandas 的數據結構主要分為三種:Series(一維數組)、 DataFrame(二維的表格型數據結構)和Panel(三維數組)。

    Series

    Series指一維數組,與 NumPy中的一維 Array類似。Series、Array與 Python基本的數據結構List也很相近,其區別是:在List中的元素可以是 不同的數據類型,而在Array和Series中則只允許存儲相同的數據類型, 這樣可以更有效地使用內存,提高運算效率,Series增加了對應的標簽(label)以用于索引,可以包含0個或者多 個任意數據類型的實體。其中,標簽索引賦予了Series強大的存取元素 功能。除通過位置外,Series還允許通過索引標簽進行元素存取:

    obj = pd.Series([40,12,-3,25]) obj

    Output:

    0 40 1 12 2 -3 3 25 dtype: int64

    Series 的字符串表現形式為:索引在左邊,值在右邊。因為在建立 過程中沒有指定索引,所以Python會自動為我們加入一個0~n的整數索 引,我們可以通過數字獲取具體位置上的元素:

    obj[0]

    Output:

    40

    可以通過index與values獲取Series的索引與數據:

    obj.index # 獲取索引 obj.values

    Output:

    array([40, 12, -3, 25], dtype=int64)

    當然,也可以在Series建立時就指定索引:

    obj = pd.Series([40,12,-3,25],index = ['a','b','c','d']) obj

    Output:

    a 40 b 12 c -3 d 25 dtype: int64

    可以直接通過索引獲取數值:

    obj['c']

    Output:

    -3

    對于Series的各種計算,其結果也會保留index:

    obj[obj>15]

    Output:

    a 40 d 25 dtype: int64

    另外,Series可以被轉換為字典:

    obj.to_dict()

    Output:

    {'a': 40, 'b': 12, 'c': -3, 'd': 25}

    DataFrame

    DataFrame 指二維的表格型數據結構。在 DataFrame 有很多功能與 R 中的 data.frame類似,我們可以將DataFrame理解為Series的容器,也 就是說,在DataFrame中,多個Series共用了一個索引index。 在以字典或Series的字典的結構構建DataFrame時,最外面的字典對 應DataFrame的列,內嵌的字典及Series則是其中的每個值,例如:

    d = {'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['a','b','c','d'])} df = pd.DataFrame(d) df

    Output:

    onetwo
    a1.01
    b2.02
    c3.03
    dNaN4

    從字典的列表中構建 DataFrame 時,其中的每個字典代表的是每條 記錄(DataFrame中的一行),字典中每個值對應的是這條記錄的相關 屬性。同時可以看到,當由多個Series組成DataFrame時,Pandas會自動按 照index對齊數據,如果某個Series的index缺失,則Pandas會將其自動填 寫為np.nan。

    Pandas 輸出設置

    在 Pandas 中可以通過 set_option 設置 Pandas 的輸出格式,例如最 多顯示的行數、列數等:

    pd.set_option('display.max_rows',1000) # 顯示的最大列數 pd.set_option('display.max_columns',20) # 顯示的最大列數 pd.set_option('precision',7) # 顯示小數點后的位數 pd.set_option('large_repr','truncate')

    Pandas 數據的讀取與寫入

    Pandas可以方便地讀取本地文件如csv、txt、xlsx等,例如:

    a = pd.read_csv('closeprice.csv') a

    Output:

    Unnamed:0tickersecShortNametradeDateclosePrice
    001平安銀行2017/6/209.12
    112萬科A2017/6/2021.03
    224國農科技2017/6/2027.03
    335世紀星源2017/6/205.45
    446深振業A2017/6/208.87
    557全新好2017/6/2015.87

    我們可自行輸入pd.read_,使用代碼補全功能查看Pandas可以讀取的數據類型。

    同理,可以使用to_,將DataFrame輸出到文件中:

    DataFrame 排序

    data = pd.DataFrame({'group':['a','a','a','b','b','b','c','c','c'],'ounce':[4,3,12,6,7.5,8,3,5,6]}) data.sort_values(by=['group','ounce'],inplace=True)

    上述代碼的作用就是先按照group降序排列,當group相同時再按照 ounces升序排列。參數中的 inplace=True 直接將排序后的結果存在 data,即直接用排序好的數據覆蓋原始數據。

    DataFrame 去重

    在大多數時候,在數據中會有重復的數據,在做分析前需要進行去 重

    data = pd.DataFrame({'k1':['one']*3+['two']*4,'k2':[3,2,1,3,3,4,4]}) data

    Output:

    k1k2
    0one3
    1one2
    2one1
    3two3
    4two3
    5two4
    6two4
    data.drop_duplicates()

    Output:

    k1k2
    0one3
    1one2
    2one1
    3two3
    5two4

    在不加任何參數時,Pandas會將完全相同的行去重:

    data = pd.DataFrame({'k1':['one']*3+['two']*4,'k2':[3,2,1,3,3,4,4]}) data.drop_duplicates(subset=['k1'],keep='last')

    Output:

    k1k2
    2one1
    6two4

    當設置 subset為 k1時,只要 k1重復,Pandas就認為是重復的,可以 通過 keep參數確定需要保留哪個,一般在使用keep時先排序。 另外,如果需要查看重復的行,則可以進行如下操作:

    data = pd.DataFrame({'k1':['one']*3+['two']*4,'k2':[3,2,1,3,3,4,4]}) data[data.duplicated()]

    Output:

    k1k2
    4two3
    6two4

    Pandas 替換數據

    如果想批量替換數據中的指定數值,則可以使用 replace:

    import numpy as np a.replace(1,np.nan)

    Output:

    Unnamed:0tickersecShortNametradeDateclosePrice
    00.0NaN平安銀行2017/6/209.12
    1NaN2.0萬科A2017/6/2021.03
    22.04.0國農科技2017/6/2027.03
    33.05.0世紀星源2017/6/205.45
    44.06.0深振業A2017/6/208.87
    55.07.0全新好2017/6/2015.87

    如果想批量替換數據中的指定數值,則可以使用 replace:
    也可以重命名某些列:

    a.rename(columns={'Unnamed:0':'id'})

    Output:

    idtickersecShortNametradeDateclosePrice
    00.0NaN平安銀行2017/6/209.12
    1NaN2.0萬科A2017/6/2021.03
    22.04.0國農科技2017/6/2027.03
    33.05.0世紀星源2017/6/205.45
    44.06.0深振業A2017/6/208.87
    55.07.0全新好2017/6/2015.87

    切片與篩選

    DataFame 有三種切片方法,分別問 loc,iloc和ix (注意: == pandas的1.0.0版本開始,移除了Series.ix and DataFrame.ix 方法 ==)

    df.loc的第 1個參數是行標簽,第 2個參數為列標簽(為可選參數, 默認為所有列標簽),這兩個參數既可以是列表,也可以是單個字符。 如果這兩個參數都為列表,則返DataFrame,否則返回Series:

    a.loc[:,['ticker','closePrice']]

    Output:

    tickerclosePrice
    019.12
    1221.03
    2427.03
    355.45
    468.87
    5715.87

    a.loc中的 : 表示所有的行。

    df.loc的第 1個參數是行的位置,第 2個參數是列的位置(為可選參 數,默認為所有列標簽),這兩個參數既可以是列表,也可以是單個字符。如果兩個參數都是列表,則返回DataFrame,否則返回Series:

    a.iloc[:4,[1,4]]

    Output:

    tickerclosePrice
    019.12
    1221.03
    2427.03

    總結

    以上是生活随笔為你收集整理的数据分析基础教程 ( 1 )的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。