[英]Is there a Pandas function to create a 7-day moving average from a time-series?
[英]Pandas create time series from day counts
我有一個數據框架,其中包含許多天的時間序列數據,這些數據是全天定期采樣的網站點擊總數。 在每個新的一天,計數重置為零。 因此,在第一天結束時,點擊次數已達到9次。 然后在第2天,計數再次從0開始,並在一天結束時達到8次點擊...等等
day value time
------------------------
1 0 00:45:00
1 5 02:15:00
1 8 06:55:00
1 9 13:10:00
2 0 00:10:00
2 1 01:00:00
2 7 05:15:00
2 8 11:45:00
3 0 03:00:00
3 4 07:30:00
3 7 15:30:00
我想將各個天匯總在一起,以形成所有天數的累積時間序列。
day value time
------------------------
1 0 00:45:00
1 5 02:15:00
1 8 06:55:00
1 9 13:10:00
2 9 00:10:00
2 10 01:00:00
2 16 05:15:00
2 17 11:45:00
3 17 03:00:00
3 21 07:30:00
3 24 15:30:00
熊貓有辦法有效地做到這一點嗎? 非常感謝你的幫助。
您實際上是在問連續的組(而不是標准的groupby,它忽略了同一組中的項目是否在相鄰),所以我認為您需要使用diff:
In [11]: df['day'].diff().astype(bool)
0 True
1 False
2 False
3 False
4 True
5 False
6 False
7 True
8 False
9 False
Name: day, dtype: bool
注意:NaN會轉換為True! 如果可以保證每個組都是非空的並且每次都增加,則astype(bool)
並不是嚴格必需的。
然后,您可以將其乘以相應的(最后一個)值:
In [12]: previous = (df.day.diff() * df['value'].shift())
In [13]: previous
Out[13]:
0 NaN
1 0
2 0
3 0
4 9
5 0
6 0
7 8
8 0
9 0
dtype: float64
我可能只是將第一個值設置為0(可以將fillna(0)
用作fillna(0)
):
In [14]: previous.iloc[0] = 0
現在,加上這個總和即可得到您想要的結果:
In [15]: df['value'] + previous.cumsum()
Out[15]:
0 0
1 5
2 8
3 9
4 10
5 16
6 17
7 17
8 21
9 24
dtype: float64
我會那樣做
import pandas as pd
df=pd.DataFrame({'day':[1, 1, 1, 1, 2, 2, 2 , 3, 3, 3],\
'value':[0 ,5 ,8 ,9 ,1 ,7 ,8 ,0 ,4 ,7]})
# Evaluate the offset to add
dd=df.groupby('day').max().cumsum()
df.set_index('day',inplace=True)
# Creation of offset dataframe
dd.index += 1
# Delete the last row
dd=dd[0:-1]
# Evaluate the first row
dd=dd.append(pd.DataFrame({'value':[0]},index=[df.index[0]]))
# Perform the addition
df = df.add(dd)
導致
value
1 0
1 5
1 8
1 9
2 10
2 16
2 17
3 17
3 21
3 24
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.