學習打卡 Pandas第九章 時序資料

2021-10-07 15:02:28 字數 4716 閱讀 1451

【練習一】 現有乙份關於某超市牛奶銷售額的時間序列資料,請完成下列問題:

df = pd.read_csv(

'data/time_series_one.csv'

, parse_dates=

['日期'])

df.head(

)

df[

'日期'

].dt.dayofweek[df[

'銷售額'

].idxmax(

)]

(b)計算除去春節、國慶、五一節假日的月度銷售總額

holiday = pd.date_range(start=

'20170501'

, end=

'20170503'

) pd.date_range(start=

'20171001'

, end=

'20171007'))

pd.date_range(start=

'20180215'

, end=

'20180221'))

pd.date_range(start=

'20180501'

, end=

'20180503'))

pd.date_range(start=

'20181001'

, end=

'20181007'))

pd.date_range(start=

'20190204'

, end=

'20190224'))

pd.date_range(start=

'20190501'

, end=

'20190503'))

pd.date_range(start=

'20191001'

, end=

'20191007'))

result = df[

~df[

'日期'

].isin(holiday)

].set_index(

'日期'

).resample(

'ms').

sum(

)result.head(

)

(c)按季度計算週末(週六和週日)的銷量總額

result = df[df[

'日期'

].dt.dayofweek.isin([5

,6])

].set_index(

'日期'

).resample(

'qs').

sum(

)result.head(

)

(d)從最後一天開始算起,跳過週六和周一,以5天為乙個時間單位向前計算銷售總和

df_temp = df[

~df[

'日期'

].dt.dayofweek.isin([5

,6])

].set_index(

'日期'

).iloc[::

-1]l_temp,date_temp =

,[0]

*df_temp.shape[0]

for i in

range

(df_temp.shape[0]

//5):

l_temp.extend(

[i]*5)

l_temp.extend(

[df_temp.shape[0]

//5]*

(df_temp.shape[0]

-df_temp.shape[0]

//5*5

))date_temp = pd.series(

[i%5==0

for i in

range

(df_temp.shape[0]

)])df_temp[

'num'

]= l_temp

result = pd.dataframe(

, index=df_temp.reset_index(

)[date_temp]

['日期'])

.iloc[::

-1]result.head(

)

(e)假設現在發現資料有誤,所有同一周裡的周一與周五的銷售額記錄顛倒了,請計算2023年中每月第乙個周一的銷售額(如果該週沒有周一或周五的記錄就保持不動)

from datetime import datetime 

df_temp = df.copy(

)df_fri = df.shift(4)

[df.shift(4)

['日期'

].dt.dayofweek==1]

['銷售額'

]df_mon = df.shift(-4

)[df.shift(-4

)['日期'

].dt.dayofweek==5]

['銷售額'

]df_temp.loc[df_fri.index,

['銷售額']]

= df_fri

df_temp.loc[df_mon.index,

['銷售額']]

= df_mon

df_temp.loc[df_temp[df_temp[

'日期'

].dt.year==

2018][

'日期'][

df_temp[df_temp[

'日期'

].dt.year==

2018][

'日期'].

(lambda x:

true

if datetime.strptime(

str(x)

.split()[

0],'%y-%m-%d'

).weekday()==

0and

1<= datetime.strptime(

str(x)

.split()[

0],'%y-%m-%d'

).day <=

7else

false)]

.index,

:]

df = pd.read_csv(

'data/time_series_one.csv'

,index_col=

'日期'

,parse_dates=

['日期'])

df['銷售額'

].rolling(window=

50,min_periods=1)

.mean(

).head(

)

df[

'銷售額'

].rolling(window=

50,min_periods=1)

.max()

.head(

)

(b)現在有如下規則:若當天銷售額超過向前5天的均值,則記為1,否則記為0,請給出2023年相應的計算結果

def

f(x):if

len(x)==6

:return

1if x[-1

]>np.mean(x[:-

1])else

0else

:return

0result_b = df.loc[pd.date_range(start=

'20171227'

,end=

'20181231'),

:].rolling(

window=

6,min_periods=1)

.agg(f)[5

:].head(

)result_b.head(

)

def

f(x):if

len(x)==8

:return

1if x[-1

]>np.mean(x[:-

1][pd.series(

[false

if i in[5

,6]else

true

for i in x[:-

1].index.dayofweek]

,index=x[:-

1].index)])

else

0else

:return

0result_c = df.loc[pd.date_range(start=

'20171225'

,end=

'20181231'),

:].rolling(

window=

8,min_periods=1)

.agg(f)[7

:].head(

)result_c.head(

)

【問題一】 如何對date_range進行批量加幀操作或對某一時間段加大時間戳密度?

【問題二】 如何批量增加timestamp的精度?

【問題三】 對於超出處理時間的時間點,是否真的完全沒有處理方法?

【問題四】 給定一組非連續的日期,怎麼快速找出位於其最大日期和最小日期之間,且沒有出現在該組日期中的日期?

第九章(筆記)

轉移指令是可以修改ip,或同時修改cs和ip的指令 offset 是用於提取標號偏移位址的操作符 jmp在第2章裡說到時用於修改ip或同時修改cs和ip的轉移指令,這章裡單獨的jmp指令是乙個無條件的轉移指令 jmp short 標號 是實現段內短轉移 jmp near ptr 標號 是實現段內近轉...

第九章作業

班級 0401304 學號 2013211526 姓名 鄧小俊 2.身份驗證 依據使用者所提供的身份資訊,來進行登入驗證,可以再細分為使用者是否可以登入sql sever 使用者是否可以登入到指定的目標資料庫等。授權 已通過身份驗證的使用者,檢查其所被賦予的許可權,是否可以訪問或者執行目標的物件 3...

第九章 引用

引用擁有指標的所有功能,只是語法更加的簡單 1 引用就是別名,變數的另外乙個名字,變數和別名它們的位址是一樣的,操作別名就是操作變數 2 引用就是別名常量,一旦引用被初始化就不能再改變了 可以理解為指標常量,指向的值不能改變,能改變的只是它的該位址處的值 3 引用物件huamn mike human...