建築樓層大規模能量預測代碼筆記

建築樓層大規模能量預測代碼筆記

記錄的都是一些python的寫法問題,歸結於自己太菜了,python如此強大的功能,很多都沒看到過

from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import KFold
sklearn是大家共同開發維護的一個非常方便的機器學習庫,得到大家的認可,功能十分強大,還是得慢慢的去了解並使用它啊

關於LabelEncoder
sklearn的preprocessing包主要是用於數據預處理的。
preprocessing中的LabelEncoder用於將標籤進行標準化,它可以將標籤分配爲0-n_classes-1之間的編碼
後面再說本次代碼用到的地方

train_df = pd.read_csv('xxx.csv')
train_df = train_df.query('not (building_id <= 104 & meter ==0 & timestamp <="2016-05-20")')
利用pandas讀取csv文件,返回的爲dataFrame對象,可以調用head(),describe(),info()等各種方法來查看數據的一些情況
後面一句代碼可以記住,有點類似於數據庫語句的感覺,通過query()將數據塊中符合要求的取出。
還有一種表達就是   train_df[train_df.column2 > train_df.colume4]類似於這種表達方式。
 	time_format = "%Y-%m-%d %H:%M:%S"
    start_date = datetime.datetime.strptime(weather_df['timestamp'].min(),time_format)
    end_date = datetime.datetime.strptime(weather_df['timestamp'].max(),time_format)
    total_hours = int(((end_date - start_date).total_seconds() + 3600) / 3600)
    hours_list = [(end_date - datetime.timedelta(hours=x)).strftime(time_format) for x in range(total_hours)]

這裏又是一個盲區,因爲訓練數據中的timestamp列下的數據都是字符串,所以我們需要把他們轉換成標準時間類型,這裏就用到strptime()
Python格式化日期時間的函數爲datetime.datetime.strftime();由字符串轉爲日期型的函數爲:datetime.datetime.strptime(),兩個函數都涉及日期時間的格式化字符串,列舉如下:

ebay中時間格式爲‘Sep-21-09 16:34’
則通過下面代碼將這個字符串轉換成datetime

c = datetime.datetime.strptime(‘Sep-21-09 16:34’,’%b-%d-%y %H:%M’);
c
datetime.datetime(2009, 9, 21, 16, 34)
又如:datetime轉換成字符串
datetime.datetime.now().strftime(’%b-%d-%y %H:%M:%S’);
‘Sep-22-09 16:48:08’

大致可以理解了,strptime()函數,第一個參數爲要轉換的字符串,第二個參數是準備要轉換成的time格式。
然後代碼接下來計算了一下數據最早時間和最晚時間的時間差,這裏再羅列出datatime.seconds()和datatime.total_seconds()之間的區別

其實seconds獲取的是僅僅是時間差的秒數,忽略微秒數,忽略天數。
total_seconds()是獲取兩個時間之間的總差。

import datetime
t1 = datetime.datetime.strptime(“2017-9-06 10:30:00”, “%Y-%m-%d %H:%M:%S”)
t2 =datetime.datetime.strptime(“2017-9-06 12:30:00”, “%Y-%m-%d %H:%M:%S”)
interval_time = (t2 - t1).seconds
輸入的結果:7200
total_interval_time =(t2 - t1).total_seconds()
輸出結果是: 7200.0
print interval_time
print total_interval_time

換一個方式
t1 = datetime.datetime.strptime(“2017-9-06 10:30:00”, “%Y-%m-%d %H:%M:%S”)
t2 = >datetime.datetime.strptime(“2017-9-08 12:30:00”, “%Y-%m-%d %H:%M:%S”)
interval_time = (t2 - t1).seconds
輸入的結果:7200
total_interval_time = (t2 - t1).total_seconds()
輸出結果是:180000.0
print interval_time
print total_interval_time
td = (t2 - t1) print((td.microseconds + (td.seconds + td.days * 24 * 3600) * >106) /106)

所以根據實際情況還是選擇datatime.total_seconds()

#datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])
td = datetime.timedelta(6, 5, 1, 800, 12, 3) 
print td      # 6 days, 3:12:05.800001
print td.seconds      # 11525 忽略微秒和天
print td.total_seconds()     # 529925.800001

numpy中setdiff1d(ar1,ar2,assume_unique=Flase)
1.功能:找到2個數組中集合元素的差異。

2.返回值:在ar1中但不在ar2中的已排序的唯一值。

3.參數:

ar1:array_like 輸入數組。
ar2:array_like 輸入比較數組。
assume_unique:bool。如果爲True,則假定輸入數組是唯一的,即可以加快計算速度。 默認值爲False。

np.concat
concatenate((a1, a2, …), axis=0)
數組拼接函數
參數:
a1,a2……爲要拼接的數組
axis爲在哪個維度上進行拼接,默認爲0

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
np.concatenate((a, b), axis=0)
array([[1, 2],
[3, 4],
[5, 6]])
np.concatenate((a, b.T), axis=1)
array([[1, 2, 5],
[3, 4, 6]])
傳入的數組必須具有相同的形狀,這裏的相同的形狀可以滿足在拼接方向axis軸上數組間的形狀一致即可.
np.concatenate((a, b), axis=1)會報錯

代碼中用到的是pandas中的concat方法,用於將數據進行融合,有點類似於上面的numpy
這裏貼上別人對於pandas 數據合併方法的記錄鏈接
https://blog.csdn.net/stevenkwong/article/details/52528616 講的很詳細

前面說到了特徵工程中的LabelEncoder,LabelEncoder是用來對分類型特徵值進行編碼,即對不連續的數值或文本進行編碼。其中包含以下常用方法:

fit(y) :fit可看做一本空字典,y可看作要塞到字典中的詞。
fit_transform(y):相當於先進行fit再進行transform,即把y塞到字典中去以後再進行transform得到索引值。
inverse_transform(y):根據索引值y獲得原始數據。
transform(y) :將y轉變成索引值。

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit([1, 2, 2, 6])
LabelEncoder()
le.classes_
array([1, 2, 6])
le.transform([1, 1, 2, 6])
array([0, 0, 1, 2]…)
le.inverse_transform([0, 0, 1, 2])
array([1, 1, 2, 6])

le = preprocessing.LabelEncoder()
le.fit([“paris”, “paris”, “tokyo”, “amsterdam”])
LabelEncoder()
list(le.classes_)
[‘amsterdam’, ‘paris’, ‘tokyo’]
le.transform([“tokyo”, “tokyo”, “paris”])
array([2, 2, 1]…)
list(le.inverse_transform([2, 2, 1]))
[‘tokyo’, ‘tokyo’, ‘paris’]

le = LabelEncoder()
df["primary_use"] = le.fit_transform(df["primary_use"])
代碼中將primary_use這一列進行了編碼,原來建築的基本用途大概有一個教育使用、娛樂使用、辦公使用等等,LabelEncoder先將他們進行fit即插入操作,然後再轉換爲索引值,這樣就可以用於訓練數據了。
train_df = train_df.merge(buildinf_df,left_on='building_id',right_on='building_id',how='left')
train_df = train_df.merge(weather_df,how='left',left_on=['site_id','timestamp'],right_on=['site_id','timestamp'])
del weather_df
gc.collect()

這裏介紹了一個dadaframe比較重要的功能,可以將幾個dataframe進行可選擇的合併操作,這對於數據量較大而且特徵維度很多的數據來說是必要的,把他們分開存儲,但是當訓練數據時還是要合併在一起。
merge的參數

on:列名,join用來對齊的那一列的名字,用到這個參數的時候一定要保證左表和右表用來對齊的那一列都有相同的列名。

left_on:左表對齊的列,可以是列名,也可以是和dataframe同樣長度的arrays。

right_on:右表對齊的列,可以是列名,也可以是和dataframe同樣長度的arrays。

left_index/ right_index: 如果是True的haunted以index作爲對齊的key

how:數據融合的方法
* inner的話就是兩個dataframe公共部分
* outer的話就是兩個dataframe的所有部分
* left的話就是保留左邊dataframe的部分
* right的話就是保留右邊dataframe的部分
* 未指定how的時候默認爲left

sort:根據dataframe合併的keys按字典順序排序,默認是,如果置false可以提高表現。

暫時先記錄這麼多,也從中認識到numpy和pandas以及sklearn這幾個包的強大以及自己對於他們的陌生,還是得多學習啊,多實踐啊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章