利用各類手段獲取數據,數據樣式不限制,但通常而言是形如 excel 或者 csv 這樣的表格格式。
數據採集: urllib , requests
數據解析: Xpath , BS4 , 正則表達式
數據持久化存儲: pd.to_csv , pd.to_excel , MySQL , Redispython
通常而言,數據分析和數據挖掘領域的處理的數據都是海量的數據,這樣的數據不免會出現問題。
數據預處理佔到數據挖掘工做的60%,這是最重要也是最核心的領域.
數據預處理分爲數據清洗、數據集成、數據變換和數據規約。正則表達式
數據清洗就是刪除無關數據、重複數據、平滑噪聲數據、處理缺失值和異常值。算法
有些信息暫時沒法獲取。例如在醫療數據庫中,並不是全部病人的全部臨牀檢驗結果都能在給定的時
間內獲得,就導致一部分屬性值空缺出來。又如在申請表數據中,對某些問題的反映依賴於對其餘
問題的回答。
有些信息是被遺漏的。多是由於輸入時認爲不重要、忘記填寫了或對數據理解錯誤而遺漏,也可
能是因爲數據採集設備的故障、存儲介質的故障、傳輸媒體的故障、一些人爲因素等緣由而丟失
了。有些對象的某個或某些屬性是不可用的。也就是說,對於這個對象來講,該屬性值是不存在的,如
一個未婚者的配偶姓名、一個兒童的固定收入情況等。
有些信息(被認爲)是不重要的。如一個屬性的取值與給定語境是無關的,或訓練數據庫的設計者
並不在意某個屬性的取值(稱爲 dont-care value )。
獲取這些信息的代價太大。
系統實時性能要求較高,即要求獲得這些信息前迅速作出判斷或決策。數據庫
數據集中不含缺失值的變量稱爲徹底變量,數據集中含有缺失值的變量稱爲不徹底變量。
從缺失的分佈來將缺失能夠分爲徹底隨機缺失,隨機缺失和徹底非隨機缺失。
徹底隨機缺失(missing completely at random, MCAR ):指的是數據的缺失是徹底隨機的,
不依賴於任何不徹底變量或徹底變量,不影響樣本的無偏性,如家庭地址缺失;
隨機缺失(missing at random,MAR):指的是數據的缺失不是徹底隨機的,即該類數據的缺失依
賴於其餘徹底變量,如財務數據缺失狀況與企業的大小有關;
非隨機缺失(missing not at random, MNAR ):指的是數據的缺失與不徹底變量自身的取值有關,
如高收入人羣不肯意提供家庭收入;
隨機缺失和非隨機缺失,直接刪除記錄是不合適的,隨機缺失能夠經過已知變量對缺失值進行估計,而
非隨機缺失的非隨機性尚未很好的解決辦法。網絡
我給你一組數據,若是要你作數據清洗,你會怎麼作?
數據存在 2 個問題:
典韋出現了 2 次
張飛的數學成績缺失
dom
對於各類類型數據的缺失,咱們到底要如何處理呢?如下是處理缺失值的四種方法:刪除記錄,數據填
補,和不處理。
刪除記錄
簡單粗暴
在樣本數據量十分大且缺失值很少的狀況下很是有效,但若是樣本量自己不大且缺失也很多,那麼
不建議使用"""
刪除缺失數據
"""
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())ide
對缺失值的插補大致可分爲兩種:替換缺失值,擬合缺失值,虛擬變量。替換是經過數據中非缺失數據
的類似性來填補,其核心思想是發現相同羣體的共同特徵,擬合是經過其餘特徵建模來填補,虛擬變量
是衍生的新變量代替缺失值。
均值插補。
對於定類數據:使用 衆數(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 實現)
拉格朗日插值法能夠找到一個多項式,其剛好在各個觀測的點取到觀測到的值。這樣的多項式稱爲
拉格朗日(插值)多項式。數學上來講,拉格朗日插值法能夠給出一個剛好穿過二維平面上若干個
已知點的多項式函數。
工具
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經常使用分類預測模型
聚類分析
羣體上的考究。
和分類不一樣,這裏全部的數據都是事先沒有類別的。
Keras這是非監督的學習算法。
原理:給定一組數據,根據數據自身距離或者類似度將其劃分爲若干組,原則爲組內距離最小而組
間距離最大。
經常使用聚類方法。
劃分方法(分裂):K-Means算法(K-平均)、 K-MEDOIDS 算法(K-中心點)、 CLARANS 算
法(基於選擇的算法)
層次分析方法:BIRCH算法(平均迭代規約和聚類)、CURE算法(表明點聚類)、
CHAMELEON算法(動態模型)
基於密度的方法: DBSCAN 算法(基於高密度鏈接區域)、 DENCLUE算法 (密度分佈函
數)、OPTICS算法(對象排序識別)
基於網格的方法:STING算法(統計信息網絡)、 CLIOUE 算法(聚類高維空間)、WAVE-
CLUSTER算法(小波變換)
基於模型的方法:統計學方法、神經網絡方法 - 經常使用聚類分析算法
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)
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')