本文轉自:http://blog.csdn.net/qq_27469517/article/details/53482563
整個第四章都是數據預處理。
4.1是數據清洗。就是處理無關數據,缺失或者異常數據等等。
具體看書,就不贅述了,還是上代碼實踐。
書上給的代碼是有問題的!
-
-
import pandas as pd
-
from scipy.interpolate import lagrange
-
-
inputfile = 'data/catering_sale.xls'
-
outputfile = 'tmp/sales.xls'
-
-
data = pd.read_excel(inputfile)
-
data[u'銷量'][(data[u'銷量'] < 400) | (data[u'銷量'] > 5000)] = None
-
-
-
-
def ployinterp_column(s, n, k=5):
-
y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))]
-
y = y[y.notnull()]
-
return lagrange(y.index, list(y))(n)
-
-
-
for i in data.columns:
-
for j in range(len(data)):
-
if (data[i].isnull())[j]:
-
data[i][j] = ployinterp_column(data[i], j)
-
-
data.to_excel(outputfile)
究其原因,應該是
-
data[u'銷量'][(data[u'銷量'] < 400) | (data[u'銷量'] > 5000)] = None
這句話有問題。
改正方法主要是 .loc 函數進行修改。
.loc 函數主要是選定指定列操作,參見 http://blog.csdn.net/chixujohnny/article/details/51095817
參考下面這個鏈接
http://blog.csdn.net/o1101574955/article/details/51627401
給出了修改版:
-
-
-
import pandas as pd
-
from scipy.interpolate import lagrange
-
-
inputfile = 'data/catering_sale.xls'
-
outputfile = 'tmp/sales.xls'
-
-
data = pd.read_excel(inputfile)
-
-
row_indexs = (data[u'銷量'] < 400) | (data[u'銷量'] > 5000)
-
data.loc[row_indexs,u'銷量'] = None
-
-
-
-
def ployinterp_column(s, n, k=5):
-
y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))]
-
y = y[y.notnull()]
-
return lagrange(y.index, list(y))(n)
-
-
-
for i in data.columns:
-
for j in range(len(data)):
-
if (data[i].isnull())[j]:
-
-
data.loc[j,i] = ployinterp_column(data[i], j)
-
data.to_excel(outputfile)
這時候我在 http://blog.csdn.net/aq_cainiao_aq/article/details/53257136 也看見一篇,我沒試過,可以參考。
def那段代碼應該要結合拉格朗日插值法具體看,現在簡單分析一下:
s爲列向量,n爲被插值的位置,k爲取前後的數據個數,默認爲5。
返回的拉格朗日函數有兩個值,y.index應該是插值位置,list(y) 就是結果吧。
可惜沒找到關於 lagrange 函數的說明,只能猜。
現在的問題是,日期全變成了 ######,想想怎麼修改呢?
其實日期是沒問題的,但是後面多了時分秒,太長了就變成了######。我不想要這個東西。
去百度搜索了很久,http://blog.csdn.net/dm_vincent/article/details/48696857 參考了一下這個,但是感覺沒看懂。
不過呢,插值算是處理好了。
===================================================================================================
4.3講的是數據變換
主要是數據的規範化處理,把數據轉換成“適當的”形式。
代碼就是狗屎,我自己補充了一下,給的代碼不僅沒有 print ,還tm少了一個 import,真的服了
-
-
-
import pandas as pd
-
import numpy as np
-
-
datafile = 'data/normalization_data.xls'
-
data = pd.read_excel(datafile, header = None)
-
-
print (data - data.min())/(data.max() - data.min())
-
print (data - data.mean())/data.std()
-
print data/10**np.ceil(np.log10(data.abs().max()))
就是如此。
==================================================================================================
4.3.3講的是連續屬性離散化。
但是這代碼都是什麼鬼???
-
-
-
import pandas as pd
-
-
datafile = 'data/discretization_data.xls'
-
data = pd.read_excel(datafile)
-
data = data[u'肝氣鬱結證型係數'].copy()
-
k = 4
-
-
d1 = pd.cut(data, k, labels = range(k))
-
-
-
-
w = [1.0*i/k for i in range(k+1)]
-
w = data.describe(percentiles = w)[4:4+k+1]
-
w[0] = w[0]*(1-1e-10)
-
d2 = pd.cut(data, w, labels = range(k))
-
-
from sklearn.cluster import KMeans
-
kmodel = KMeans(n_clusters = k, n_jobs = 4)
-
kmodel.fit(data.reshape((len(data), 1)))
-
c = pd.DataFrame(kmodel.cluster_centers_).sort(0)
-
w = pd.rolling_mean(c, 2).iloc[1:]
-
w = [0] + list(w[0]) + [data.max()]
-
d3 = pd.cut(data, w, labels = range(k))
-
-
def cluster_plot(d, k):
-
import matplotlib.pyplot as plt
-
plt.rcParams['font.sans-serif'] = ['SimHei']
-
plt.rcParams['axes.unicode_minus'] = False
-
-
plt.figure(figsize = (8, 3))
-
for j in range(0, k):
-
plt.plot(data[d==j], [j for i in d[d==j]], 'o')
-
-
plt.ylim(-0.5, k-0.5)
-
return plt
-
-
cluster_plot(d1, k).show()
-
-
cluster_plot(d2, k).show()
-
cluster_plot(d3, k).show()
運行無限報錯。回頭再來試試。
以下內容轉自http://blog.csdn.net/xuyaoqiaoyaoge/article/details/52678307
2.連續屬性離散化
首先是確定分成幾個區間,每個區間的範圍多大,然後是將每個區間用符號或者整數值來表示。
1.等寬法
相同寬度的區間
2.等頻法
將相同數量的記錄放入每個區間
3.基於聚類的方法
先聚類,用K-Means,然後對簇進行處理,每個簇一個標記。
總之,區間的數量自己決定。
import pandas as pd
datafile = 'E:/PythonMaterial/chapter4/demo/data/discretization_data.xls'
data = pd.read_excel(datafile)
data = data[u'肝氣鬱結證型係數'].copy()
k = 4
d1 = pd.cut(data, k, labels = range(k))
print pd.value_counts(d1)
d2=pd.qcut(data,4,labels = range(k))
print pd.value_counts(d2)
w=[0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1]
d3 = pd.qcut(data, w, labels = range(10))
print pd.value_counts(d3)
w=[0,0.1,0.5,0.9,1]
d4 = pd.qcut(data, w, labels = range(4))#labels是可以替換的,如:labels=['hao','zhong','yiban','huai']
print pd.value_counts(d4)
from sklearn.cluster import KMeans
kmodel = KMeans(n_clusters = k, n_jobs = 1)
kmodel.fit(data.reshape((len(data), 1)))
c = pd.DataFrame(kmodel.cluster_centers_).sort(0)
w = pd.rolling_mean(c, 2).iloc[1:]
w = [0] + list(w[0]) + [data.max()]
d3 = pd.cut(data, w, labels = range(k))
def cluster_plot(d, k):
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize = (8, 3))
for j in range(0, k):
plt.plot(data[d==j], [j for i in d[d==j]], 'o')
plt.ylim(-0.5, k-0.5)
return plt
cluster_plot(d1, k).show()
cluster_plot(d2, k).show()
cluster_plot(d3, k).show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
1 508
2 275
0 112
3 35
Name: 肝氣鬱結證型係數, dtype: int64
1 234
3 233
0 233
2 230
Name: 肝氣鬱結證型係數, dtype: int64
6 97
0 97
4 95
2 94
8 93
9 92
1 92
5 91
7 90
3 89
Name: 肝氣鬱結證型係數, dtype: int64
2 371
1 370
0 97
3 92
Name: 肝氣鬱結證型係數, dtype: int64
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26