資料分析 | Numpy實戰(一) - 分析某單車騎行時間

鹹魚普拉思發表於2018-12-24

資料分析 | Numpy實戰(一) - 分析某單車騎行時間

關於資料科學的學習,鹹魚也進行了一段時間,但是光學不練是學一點忘一點,所以鹹魚找了一些某共享單車的資料進行一點簡單的資料分析。

思路整理

鹹魚也是第一次動手寫資料分析相關的程式碼,所以鹹魚上網找了一張大致的流程圖,且以此整理思路,分隔程式碼。

資料分析 | Numpy實戰(一) - 分析某單車騎行時間

在企業實際開發中各個步驟的程式碼不會像鹹魚下面的程式碼一樣各塊分隔的那麼清楚,肯定是相互交織且複雜的。

資料分析 | Numpy實戰(一) - 分析某單車騎行時間

實戰

分析目的

看標題就知道了,分析各季度共享單車的騎行時間。

資料收集

因為這次的資料來源自網路,所以先簡單看下資料的結構:

資料分析 | Numpy實戰(一) - 分析某單車騎行時間

可以看到資料有9個欄位:

"Duration (ms)","Start date","End date","Start station number","Start station","End station number","End station","Bike number","Member type"

按照我們的目標,我們只需要第一個欄位Duration(ms)

所以第一步先讀取已經下載好的資料之後在第二步資料清洗中取出需要的欄位:

# 資料收集
def data_collection():
    data_arr_list = []
    for data_filename in data_filenames:
        file = os.path.join(data_path, data_filename)
        data_arr = np.loadtxt(file,dtype=bytes,delimiter=',', skiprows=1).astype(str)
        data_arr_list.append(data_arr)
    return data_arr_list

這裡關於numpy的用法,可以參考之前的幾篇關於numpy的文章:

Data Science | Numpy基礎(一)

Data Science | Numpy基礎(二)

Data Science | 福利列表 | Numpy基礎(三)

資料清洗

因為資料是整理後匯出的資料所以不需要清洗缺失值等操作,我們直接取出需要的欄位,做一些處理即可。

這裡騎行時間單位為ms,所以需要轉化為min需要/1000/60。

# 資料清洗
def data_clean(data_arr_list):
    duration_min_list = []
    for data_arr in data_arr_list:
        data_arr = data_arr[:,0]
        duration_ms = np.core.defchararray.replace(data_arr,'"','')
        duration_min = duration_ms.astype('float') / 1000 / 60
        duration_min_list.append(duration_min)
    return duration_min_list
資料分析

計算平均值在numpy中提供了計算函式,直接呼叫即可。

# 資料分析
def mean_data(duration_min_list):
    duration_mean_list = []
    for duration_min in duration_min_list:
        duration_mean = np.mean(duration_min)
        duration_mean_list.append(duration_mean)
    return duration_mean_list
結果展示

這裡視覺化展示使用的是matplotlib.pyplot庫,鹹魚目前還沒有寫相關的入門文章,可以上網看下文件學習下簡單使用即可,之後會有系列文章寫視覺化的內容。

# 資料展示
def show_data(duration_mean_list):
    plt.figure()
    name_list = ['第一季度''第二季度''第三季度''第四季度']
    plt.bar(range(len(duration_mean_list)),duration_mean_list,tick_label = name_list)
    plt.show()

成果展示

資料分析 | Numpy實戰(一) - 分析某單車騎行時間

單單從上面的圖可以看到以炎熱的夏季和涼爽的秋季為主調的二三季度的騎行時間要高於春冬為主調的一四季度,以此判斷氣溫變化對人們使用的共享單車的影響。

一些踩過的坑

關於資料讀取(一)

在python中字串是有位元組字串和文字字串之分的,我們通常說的字串是指文字字串。而使用numpy的loadtxt函式讀取的字串預設是位元組字串,輸出的話字串前面會有個b,形如b’……’。通常是需要轉換的,如果不轉換將會出現問題。

資料收集部分如果不注意這一點,在資料清洗部分,欄位的格式就會因為Duration的值多了一個b轉化上就會報錯。

處理方式:

numpy.loadtxt讀入的字串總是bytes格式,總是在前面加了一個b
原因:np.loadtxt and np.genfromtxt operate in byte mode, which is the default string type in Python 2. But Python 3 uses unicode, and marks bytestrings with this b. numpy.loadtxt中也宣告瞭:Note that generators should return byte strings for Python 3k.解決:使用numpy.loadtxt從檔案讀取字串,最好使用這種方式np.loadtxt(filename, dtype=bytes).astype(str)

作者:Cameron
連結:
來源:知乎

關於資料讀取上的坑(二)

可以看到鹹魚在讀取資料的時候使用的是numpy.loadtxt,這樣的操作固然方便,但是代價就是記憶體直接爆掉,還好這次的資料才500M,所以不推薦大家使用我這個方法,之後會加以改進(如果我會的話)

這裡分享一段程式碼,來自慕課網bobby老師的實戰課,如何使用生成器讀取大文字檔案:

#500G, 特殊 一行
def myreadlines(f, newline):
  buf = ""
  while True:
    while newline in buf:
      pos = buf.index(newline)
      yield buf[:pos]
      buf = buf[pos + len(newline):]
    chunk = f.read(4096)

    if not chunk:
      #說明已經讀到了檔案結尾
      yield buf
      break
    buf += chunk

with open("input.txt"as f:
    for line in myreadlines(f, "{|}"):
        print (line)
關於matplotlib.pyplot使用上的坑

在視覺化的時候,柱狀圖的標識是中文,在顯示的時候直接顯示的是方塊,無法顯示中文。如下:

資料分析 | Numpy實戰(一) - 分析某單車騎行時間

處理方法:

解決方式一:修改配置檔案
(1)找到matplotlibrc檔案(搜尋一下就可以找到了)
(2)修改:font.serif和font.sans-serif,我的在205,206
font.serif: SimHei, Bitstream Vera Serif, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
font.sans-serif: SimHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif

解決方式二:在程式碼中修改
import matplotlib

指定預設字型
matplotlib.rcParams[‘font.sans-serif’] = [‘SimHei’]
matplotlib.rcParams[‘font.family’]=’sans-serif’

解決負號’-‘顯示為方塊的問題
matplotlib.rcParams[‘axes.unicode_minus’] = False
---------------------
來源:CSDN
原文:https://blog.csdn.net/weixin_40283480/article/details/81613008

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31556785/viewspace-2286242/,如需轉載,請註明出處,否則將追究法律責任。

相關文章