import pandas as pd
import re
import os
import datetime
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

"""
Explanation: 目的：由會議室使用情況數據集，了解會議室的使用情況。問題：例：於某年某月的時候，會議室A有在使用的天數共有幾天？

匯入資料
檢查部分欄位是否有空值
將有空值欄位的橫列刪除
選出會議室為A的資料
由會議室日期，拓展出"會議開始日期"、"會議結束日期"和"會議天數"三個欄位
接著，將欄位"會議開始日期"和"會議結束日期"轉換成日期型別。轉為日期型別後，兩日期即可相減加一，得出會議天數
目標：建立 一資料表包含：活動名稱，活動日 兩個欄位。 最終我們將以此資料表來得出每個月有多少個活動天
以年和月做groupby，計算某年某月時，會議室共有幾天有在使用。並畫成長條圖
以上資料是離散的x,y,z形式，適合畫成熱圖(heatmap)。以下改把資料以Seaborn套件畫成熱圖
End of explanation
"""


!ls ../datasets

os.chdir('../datasets')

!ls *.csv

df=pd.DataFrame.from_csv("exhibition.csv",index_col=None)

df[:5]

np.sum(df['活動名稱']=='**********')

df.shape

"""
Explanation: <a id="01"/> 匯入資料
End of explanation
"""


df.isnull().sum()

df[df['會議室日期'].isnull()]

"""
Explanation: 此資料的"活動名稱"欄位已經完全加密，因此該欄位不具意義。
<a id="02"/> 檢查欄位是否有空值
End of explanation
"""


df=df.dropna(axis=0,how='any')

df.isnull().sum()

"""
Explanation: <a id="03"/>  將有空值欄位的橫列刪除
End of explanation
"""


df=df[df['會議室']=='A']

"""
Explanation: <a id="04"/>  選出會議室為A的資料
End of explanation
"""


df=df.reset_index(drop=True)

"""
Explanation: 將DataFrame的索引重新排序
End of explanation
"""


def datePeriodTrans(x):
    row=re.search('^(.*)/(.*/.*)-(.*)/(.*/.*)$',x).groups()
    return str(int(row[0])+1911)+'/'+row[1],str(int(row[2])+1911)+'/'+row[3]

type(df['會議室日期'])

timeSer=df['會議室日期'].apply(datePeriodTrans)

timeSer.head(3)

timeCols=pd.DataFrame(list(timeSer),columns=('會議開始日期','會議結束日期'))

timeCols.head(3)

df.shape

timeCols.shape

dfDatesAdded=pd.concat([df,timeCols],axis=1)

dfDatesAdded.head(3)

"""
Explanation: <a id="05"/>由會議室日期，拓展出"會議開始日期"、"會議結束日期"和"會議天數"三個欄位
End of explanation
"""


dfDatesAdded.dtypes

dfDatesAdded['會議開始日期'] = pd.to_datetime(dfDatesAdded['會議開始日期'],yearfirst=True)
dfDatesAdded['會議結束日期'] = pd.to_datetime(dfDatesAdded['會議結束日期'],yearfirst=True)

dfDatesAdded.dtypes

dfDatesAdded.loc[0,'會議開始日期']

dfDatesAdded.loc[0,'會議開始日期']-dfDatesAdded.loc[0,'會議結束日期']== datetime.timedelta(-2)

dfDatesAdded['會議天數'] = dfDatesAdded['會議結束日期']-dfDatesAdded['會議開始日期']+datetime.timedelta(1)

dfDatesAdded.head(10)

d=dfDatesAdded.loc[6,'會議天數']

d.days

times = pd.date_range(dfDatesAdded.loc[6,'會議開始日期'], periods=dfDatesAdded.loc[6,'會議天數'].days, freq='D')

times

list(times)

"""
Explanation: <a id="06"/>接著，將欄位"會議開始日期"和"會議結束日期"轉換成日期型別。轉為日期型別後，兩日期即可相減加一，得出會議天數
End of explanation
"""


def tgen(row):
    times=pd.date_range(row['會議開始日期'], periods=row['會議天數'].days, freq='D')
    row['dates']=times
    return row

dfDatesAdded=dfDatesAdded.apply(tgen,axis=1)

dfDatesAdded.head(3)

infoList=list(dfDatesAdded[['活動名稱','dates']].values)

infoList[:1]

mylist=[]
for row in infoList:
    for date in row[1]:
        mylist.append((row[0],date))

df=pd.DataFrame(mylist,columns=['title','date'])

df=df.sort_values(by='date')

df.shape

df.head(3)

df['year']=df.date.apply(lambda x:x.year)

df['month']=df.date.apply(lambda x:x.month)

df.head(3)

df.shape

"""
Explanation: <a id="07"/> 目標：建立 一資料表包含：活動名稱，活動日 兩個欄位。 最終我們將以此資料表來得出每個月有多少個活動天
End of explanation
"""


df=df.drop_duplicates('date')

df.shape

"""
Explanation: 同一天中，會議室A可以有不只一種活動，像是上午有活動xxx, 下午有活動yyy。但我們的目的只想統計該天是否有活動，而不在乎該天有多少活動。
為此，我們將同一日期的多餘活動移除：
End of explanation
"""


grouped=df[['title','year','month']].groupby(['year','month'])

cnt=grouped.count()

cnt.columns=['number of days with activities']

cnt.plot.bar(figsize=(15,5))

"""
Explanation: <a id="08"/>以年和月做groupby，計算某年某月時，會議室共有幾天有在使用。並畫成長條圖。
End of explanation
"""


cnt[:3]

cnt.T

cnt.T.stack()

dat=cnt.T.stack().loc['number of days with activities']

"""
Explanation: <a id="09"/>以上資料是離散的x,y,z形式，適合畫成熱圖(heatmap)。以下改把資料以Seaborn套件畫成熱圖
End of explanation
"""


sns.palplot(sns.cubehelix_palette(8, start=.5, rot=-.75))

s=sns.cubehelix_palette(8, start=.5, rot=-.75,as_cmap=True)

"""
Explanation: 建立含有色票序列的物件，等會以此色票序列畫熱圖：
End of explanation
"""


dat.T

fig,ax=plt.subplots(figsize=(10,10))
ax = sns.heatmap(dat.T,cmap=s,square=True,cbar_kws={"orientation": "horizontal"})

"""
Explanation: 將資料轉置，因為我們想要畫月份於x軸：
End of explanation
"""


dat.plot.bar(figsize=(12,5))

"""
Explanation: 亦或可將此資料重新以長條圖呈現，只是可能仍然沒有熱圖易懂：
End of explanation
"""


df=pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]])

df2=pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]])

%%time
for j in range(2000):
    df=df.append(df2)

lst1=[[1,2,3],[4,5,6],[7,8,9]]

lst2=[[1,2,3],[4,5,6],[7,8,9]]

%%time
for j in range(2000):
    for k in lst2:
        lst1.append(k)

#print(lst1)
df=pd.DataFrame(lst1)

"""
Explanation: 問： <font color='darkred'> 一個DataFrame附加(append)至另一個DataFrame</font>與<font color='darkred'>一個清單附加至另一個清單</font>，哪一個方式較快？
End of explanation
"""


