『阿里大資料競賽』音樂流行趨勢預測_不斷更新

lin聰記發表於2016-05-14
# 本文使用的語言是 Python , 下面不再說明
# 本文禁止盈利性轉載



一、資料預處理

    1、讀取資料
    1.1 原始資料、測試資料與實際資料
    什麼叫原始資料?為什麼要保留一份原始資料?
    在讀取資料之前我們要先保留一份原始資料, 並且在隨後的處理的過程中不要對原始資料做任何操作。這樣做的目的是為了避免在之後的過程中, 我們對資料進行了錯誤的修改, 或者資料發生損毀等會破壞資料的情況後, 原始資料可以幫助我們快速恢復資料。
    什麼叫測試資料?為什麼要使用測試資料?
    測試資料既可以是原始資料的子集也可以是實際資料的子集, 由於大資料的資料量太大, 所以在測試我們的程式碼或驗證我們的思路的時候, 如果直接使用所有資料則會大量增加程式執行時間, 而使用測試資料的好處就是極大地縮短程式執行時間。
    什麼叫實際資料?為什麼要使用實際資料?
    實際資料即是我們要用來進行資料探勘的資料。
    
    1.2實際過程
    由於阿里提供的是 csv 檔案格式, 所以在通過 import pandas as pd 匯入 pandas 庫, 使用 pandas 庫的原因是由於資料太大, 而 pandas 庫在讀取大資料時速度非常快。實際過程中, 讀取完所有五百六十萬行資料僅僅不到一分鐘,讀取速度比我預想的要快得多。
    

    2、資料預處理

    2.1 為什麼要進行資料預處理?

    資料預處理就是在正式建模前, 將資料預先處理成方便建模的格式。 這是因為很多資料其實都是非結構化的, 而現在只能夠使用結構化的資料進行建模, 另外也是因為有很多資料的格式並不符合我們的要求, 例如該次阿里提供的資料中就是提供 unix 時間戳而並不是正常日期格式, 還有很多空值、缺失值、或將資料標準化等等情況的存在。

    2.2 實際過程

    由於阿里提供的資料本身已經是結構化的資料了, 所以資料處理主要是新增列名和將 unix 時間戳轉換成正常日期格式, 其中由於以前並沒有做過相關的轉換, 所以具體實現上耗費了較多的時間。

更新上面兩個步驟的原始碼:

# coding:utf-8

import pandas as pd
import time
import datetime

def get_fun_run_time(fun):
    """
    獲取某函式執行時間, 一是方便知道各函式執行時間, 二是為後期優化程式碼提高效能提供參考
    """
    def function(*args, **args2):
        start_time = time.time()
        f = fun(*args, **args2)
        end_time = time.time()
        print "花費時間為:", end_time - start_time
        return f
    return function

def time_stamp_to_date(value):
    """
    value: 傳入的值為時間戳(整形), 如1332888820
    將時間戳轉換為日期
    """
    # 經過 localtime 轉換後變成
    # time.struct_time(tm_year=2012, tm_mon=3, tm_mday=28, tm_hour=6, tm_min=53, tm_sec=40, tm_wday=2, \
    # tm_yday=88, tm_isdst= 0)
    # 最後再經過 strftime 函式轉換為正常日期格式
    return time.strftime("%Y-%m-%d %H", time.localtime(value))

@get_fun_run_time
def get_data(path):
    """
    獲取資料
    """
    data = pd.read_csv(path)
    return data

@get_fun_run_time
def data_processing(data, columns_name):
    """
    資料處理
    """
    # 新增列名
    data.columns = columns_name

    # 將 unix 時間戳轉換為正常日期格式:年-月-日-時
    data.gmt_create = data.gmt_create.apply(time_stamp_to_date)
    return data

@get_fun_run_time
def data_to_csv(data, path):
    """
    將處理好的資料儲存好, 下次可以直接使用這些資料
    """
    data.to_csv(path)

def data_main():

    # 讀取資料
    #user_path = r"C:\Users\Administrator\Desktop\ali\music\user_test_data_set.csv"    # 測試資料集路徑
    user_path = r"C:\Users\Administrator\Desktop\ali\music\mars_tianchi_user_actions.csv"     # 實際資料集路徑
    user_data = get_data(user_path)

    # 資料處理
    user_columns_name = ["user_id", "song_id", "gmt_create", "action_type", "Ds"]
    # user_id	String	使用者唯一標識
    # song_id	String	歌曲唯一標識
    # gmt_create	String	使用者播放時間(unix時間戳表示)精確到小時
    # action_type	String	行為型別:1,播放;2,下載,3,收藏
    # Ds	String	記錄收集日(分割槽)
    user_data_process = data_processing(user_data, user_columns_name)
    print user_data_process

    #newpath = r"C:\Users\Administrator\Desktop\ali\music\new_user_test_data_set.csv"    # 測試資料集路徑
    newpath = r"C:\Users\Administrator\Desktop\ali\music\new_mars_tianchi_user_actions.csv"     # 實際資料集路徑
    data_to_csv(user_data_process, newpath)

if __name__ == '__main__':
    data_main()





    3、建模

相關文章