python學習之數據分析與數據挖掘

數據採集

利用各種手段獲取數據,數據樣式不限制,但一般而言是形如 excel 或者 csv 這樣的表格格式。
數據採集: urllib , requests
數據解析: Xpath , BS4 , 正則表達式
數據持久化存儲: pd.to_csv , pd.to_excel , MySQL , Redis

數據預處理

python學習之數據分析與數據挖掘
一般而言,數據分析和數據挖掘領域的處理的數據都是海量的數據,這樣的數據難免會出現問題。
數據預處理佔到數據挖掘工作的60%,這是最重要也是最核心的領域.
數據預處理分爲數據清洗、數據集成、數據變換和數據規約。

數據清洗

數據清洗就是刪除無關數據、重複數據、平滑噪聲數據、處理缺失值和異常值。

數據缺失的原因

有些信息暫時無法獲取。例如在醫療數據庫中,並非所有病人的所有臨牀檢驗結果都能在給定的時
間內得到,就致使一部分屬性值空缺出來。又如在申請表數據中,對某些問題的反映依賴於對其他
問題的回答。
有些信息是被遺漏的。可能是因爲輸入時認爲不重要、忘記填寫了或對數據理解錯誤而遺漏,也可
能是由於數據採集設備的故障、存儲介質的故障、傳輸媒體的故障、一些人爲因素等原因而丟失
了。有些對象的某個或某些屬性是不可用的。也就是說,對於這個對象來說,該屬性值是不存在的,如
一個未婚者的配偶姓名、一個兒童的固定收入狀況等。
有些信息(被認爲)是不重要的。如一個屬性的取值與給定語境是無關的,或訓練數據庫的設計者
並不在乎某個屬性的取值(稱爲 dont-care value )。
獲取這些信息的代價太大。
系統實時性能要求較高,即要求得到這些信息前迅速做出判斷或決策。

數據缺失的類型

數據集中不含缺失值的變量稱爲完全變量,數據集中含有缺失值的變量稱爲不完全變量。
從缺失的分佈來將缺失可以分爲完全隨機缺失,隨機缺失和完全非隨機缺失。
完全隨機缺失(missing completely at random, MCAR ):指的是數據的缺失是完全隨機的,
不依賴於任何不完全變量或完全變量,不影響樣本的無偏性,如家庭地址缺失;
隨機缺失(missing at random,MAR):指的是數據的缺失不是完全隨機的,即該類數據的缺失依
賴於其他完全變量,如財務數據缺失情況與企業的大小有關;
非隨機缺失(missing not at random, MNAR ):指的是數據的缺失與不完全變量自身的取值有關,
如高收入人羣不願意提供家庭收入;
隨機缺失和非隨機缺失,直接刪除記錄是不合適的,隨機缺失可以通過已知變量對缺失值進行估計,而
非隨機缺失的非隨機性還沒有很好的解決辦法。

清洗案例

我給你一組數據,如果要你做數據清洗,你會怎麼做?
數據存在 2 個問題:
典韋出現了 2 次
張飛的數學成績缺失
python學習之數據分析與數據挖掘

缺失值處理辦法

對於各種類型數據的缺失,我們到底要如何處理呢?以下是處理缺失值的四種方法:刪除記錄,數據填
補,和不處理。
刪除記錄
簡單粗暴
在樣本數據量十分大且缺失值不多的情況下非常有效,但如果樣本量本身不大且缺失也不少,那麼
不建議使用"""
刪除缺失數據
"""
import pandas as pd
import numpy as np
#創建一個帶有缺失值的DataFrame對象
df = pd.DataFrame(np.arange(12).reshape((3, 4)), index=['user1', 'user2',
'user3'], columns=['views', 'likes', 'transfers', 'saves'])
print("源數據: \n", df)
df.loc[:2, :1]= np.nan
print("缺失值數據: \n", df)
#刪除行,使用參數axis=0
print(df.dropna(axis=0))
#刪除列, 使用參數axis=1
print(df.dropna(axis=1))
#刪除數據表中含有空值的行
print(df.dropna())

數據填補

對缺失值的插補大體可分爲兩種:替換缺失值,擬合缺失值,虛擬變量。替換是通過數據中非缺失數據
的相似性來填補,其核心思想是發現相同羣體的共同特徵,擬合是通過其他特徵建模來填補,虛擬變量
是衍生的新變量代替缺失值。
均值插補。
對於定類數據:使用 衆數(mode)填補,比如一個學校的男生和女生的數量,男生500
人,女生50人,那麼對於其餘的缺失值我們會用人數較多的男生來填補。
對於定量(定比)數據:使用平均數(mean)或中位數(median)填補,比如一個
班級學生的身高特徵,對於一些同學缺失的身高值就可以使用全班同學身高的平均值或
中位數來填補。
"""
均值差補
"""
import numpy as np
import pandas as pd
df = pd.DataFrame(np.arange(12).reshape((4, 3)),
index=['user1', 'user2', 'user3', 'user4'],
columns=['price', 'count', 'info'])
df['price'][:1] = np.nan
df['price'][3] = 3
print("缺失值數據: \n", df)
#使用price均值對NA進行填充
df_mean = df['price'].fillna(df['price'].mean())
#使用price中位數對NA進行填充
df_median = df['price'].fillna(df['price'].median())
#使用price衆數對NA進行填充
df_mode = df['price'].fillna(df['price'].mode())
print("均值填充: \n", df_mean)
print("中位數填充: \n", df_median)print("衆數填充: \n", df_median)

插值模型
拉格朗日插值法( scipy 實現)
拉格朗日插值法可以找到一個多項式,其恰好在各個觀測的點取到觀測到的值。這樣的多項式稱爲
拉格朗日(插值)多項式。數學上來說,拉格朗日插值法可以給出一個恰好穿過二維平面上若干個
已知點的多項式函數。
python學習之數據分析與數據挖掘
python學習之數據分析與數據挖掘

from scipy.interpolate  import lagrange
x = [3, 6, 9]
y = [10, 8, 4]
lagrange(x,y)
#poly1d([ -0.11111111,   0.33333333,
10.      
])
#如果U7>:*? (tyyyyyyyyyyyy(要進行插值操作,可以:
lagrange(x, y)(10)
# 2.222222

牛頓插值法( scipy 未實現)
牛頓插值法是曲線擬合插值法中的一種,適合採用所有的數據都精確的情況下。

數據集成

多數據源數據倉庫化。
實體識別
同名異義
異名同義
單位不統一
冗餘屬性識別
同一屬性多次出現
同一屬性命名不一致導致重複

數據變換

規範化處理數據,便於使用。
簡單函數變換
常用來將不具有正態分佈的數據變換成具有正態分佈的數據。
規範化
最小-最大規範化
零-均值規範化(使用最多)
小數定標規範化
連續屬性離散化
等寬法
等頻法
聚類
屬性構造
推導屬性
小波變換
新型數據分析工具

數據規約

降低錯誤數據對建模的影響,減少存儲成本
屬性規約
數值規約
直方圖
聚類
抽樣
參數迴歸

數據挖掘建模

根據挖掘目標和數據形式的不同,可以建立分類與預測、聚類分析、關聯規則、時序模式、偏差檢測等
模型。

分類與預測

如餐飲行業想知道哪些用戶會離我而去,哪些用戶可能成爲VIP。
常用的分類和預測算法:
python學習之數據分析與數據挖掘
python常用分類預測模型
python學習之數據分析與數據挖掘
聚類分析
羣體上的考究。
和分類不同,這裏所有的數據都是事先沒有類別的。
Keras這是非監督的學習算法。
原理:給定一組數據,根據數據自身距離或者相似度將其劃分爲若干組,原則爲組內距離最小而組
間距離最大。
常用聚類方法。
劃分方法(分裂):K-Means算法(K-平均)、 K-MEDOIDS 算法(K-中心點)、 CLARANS 算
法(基於選擇的算法)
層次分析方法:BIRCH算法(平均迭代規約和聚類)、CURE算法(代表點聚類)、
CHAMELEON算法(動態模型)
基於密度的方法: DBSCAN 算法(基於高密度連接區域)、 DENCLUE算法 (密度分佈函
數)、OPTICS算法(對象排序識別)
基於網格的方法:STING算法(統計信息網絡)、 CLIOUE 算法(聚類高維空間)、WAVE-
CLUSTER算法(小波變換)
基於模型的方法:統計學方法、神經網絡方法 - 常用聚類分析算法
python學習之數據分析與數據挖掘

刪除缺失值

import numpy as np
import  pandas as pd

def create_csv():
    """測試刪除缺失值的數據準備"""
    #創建一個帶有缺失值的DataFrame對象
    df = pd.DataFrame(np.arange(12).reshape((3, 4)),
                      index=['user1', 'user2', 'user3'],
                      columns=['views', 'likes', 'transfers', 'saves'])
    #第一行前2列, np.nan缺失值
    df.iloc[:1, :2] = np.nan
    #將數據存儲到csv文件中
    df.to_csv('doc/data-clean.csv')

def drop_null_data():
    # 返回市DataFrame對象
    df = pd.read_csv('doc/data-clean.csv')
    #df1 = df.dropna()       # 默認情況下,將有缺失值的一行信息或者多行信息刪除
    df1 = df.dropna(axis=1)   # axis=1, 刪除有缺失值的一列或者多列(不建議使用)
    print(df1)
if __name__ == '__main__':
    drop_null_data()

缺失值的填充

import numpy as np
import pandas as pd

#生成DataFrame數據(一般是從文件加載出來的)
df = pd.DataFrame(np.arange(12).reshape(4, 3),
                  index=['user1', 'user2', 'user3', 'user4'],
                  columns=['price', 'count', 'info']
                  )

#df.price獲取price這一列信息。 iloc通過索引進行定位
"""
       price  count  info
user1    NaN      1     2
user2    3.0      4     5
user3    6.0      7     8
user4    NaN     10    11
"""
df.price.iloc[0] = np.nan
df.price.iloc[3] = 3

print("源數據: \n", df)

#使用均值填充
price_mean = df.price.mean()        # 獲取價格這一列的均值
df_mean = df['price'].fillna(price_mean)

#使用中位數填充
price_median = df.price.median()
df_median = df['price'].fillna(price_median)
print(df_median)

#衆數填充
price_mode = df['price'].mode()  # 衆數返回的是Series對象, 所以需要獲取對應的索引
df_mode = df['price'].fillna(price_mode[0])
print(df_mode)

stock.py

from datetime import date

import matplotlib.pyplot as plt
import seaborn as sns
import tushare as ts

#正常顯示畫圖時出現的中文和負號
"""
Linux/Mac: 
    1. 尋找顯示中文的字體庫 fc-list :lang=zh
    2. 實例化字體對象
    my_font = font_manager.FontProperties(fname='字體庫的文件名")
    3. 指定中文字體時, 設置字體的屬性
    plt.title('中文標題', fontproperties=my_font)
"""

def draw_close(code):
    """
    1. 近一月股票收盤價走勢曲線
    2. 5日均線、10日均線以及20日均線
    3. 每日收盤價漲跌幅度  diff(差值)/pct_change(漲/跌幅百分比)
    :param code: 股票編碼
    :return:
    """
    #數據準備與樣式設置
    sns.set(style='whitegrid')
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    end = date.today()  # 日期對象
    start = date(end.year, end.month - 1, end.day)  # 日期對象
    end = str(end)
    start = str(start)
    #獲取code股票的過去一年的歷史數據
    df = ts.get_hist_data(code, start, end)

    print(df)
    #創建子圖
    ax1 = plt.subplot(3, 1, 1)
    #獲取收盤價df.close/df['close'], 繪製曲線圖
    #plt.plot(df.index, df.close)
    df['close'].plot(ax=ax1, color='orange', ls='-.', label='收盤價')
    df['open'].plot(ax=ax1, color='b', ls='-', label='開盤價')
    ax1.set_title("%s股票收盤價/收盤價走勢曲線" % (code))
    #loc指定圖例的顯示位置
    ax1.legend(loc='upper right')

    #創建子圖
    ax2 = plt.subplot(3, 1, 2)
    ax2.set_title("%s股票均線走勢曲線" % (code))
    df['ma5'].plot()
    df['ma10'].plot()
    df['ma20'].plot()
    ax2.legend(loc='upper right')

    #創建子圖
    ax3 = plt.subplot(3, 1, 3)
    ax3.set_title("%s股票每日漲跌幅度曲線" % (code))
    df['Daily Return'] = df['close'].pct_change()
    df['Daily Return'].plot(color='green')

    plt.show()

if __name__ == '__main__':
    draw_close('600848')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章