2017-08-26 123 views
1

考慮以下Python程序:Python的熊貓移動平均滯

import pandas as pd 
import seaborn as sns 
import matplotlib.pyplot as plt 

data = [["2017-05-25 22:00:00", 5], 
["2017-05-25 22:05:00", 7], 
["2017-05-25 22:10:00", 9], 
["2017-05-25 22:15:00", 10], 
["2017-05-25 22:20:00", 15], 
["2017-05-25 22:25:00", 20], 
["2017-05-25 22:30:00", 25], 
["2017-05-25 22:35:00", 32]] 

df = pd.DataFrame(data) 
df.columns = ["date", "value"] 
df["date2"] = pd.to_datetime(df["date"],format="%Y-%m-%d %H:%M:%S") 

ts = pd.Series(df["value"].values, index=df["date2"]) 
mean_smoothed = ts.rolling(window=5).mean() 
exp_smoothed = ts.ewm(alpha=0.5).mean() 

h1 = ts.head(8) 
h2 = mean_smoothed.head(8) 
h3 = exp_smoothed.head(8) 
k = pd.concat([h1, h2, h3], join='outer', axis=1) 
k.columns = ["Actual", "Moving Average", "Exp Smoothing"] 
print(k) 

這將打印

     Actual Moving Average Exp Smoothing 
date2              
2017-05-25 22:00:00  5    NaN  5.000000 
2017-05-25 22:05:00  7    NaN  6.333333 
2017-05-25 22:10:00  9    NaN  7.857143 
2017-05-25 22:15:00  10    NaN  9.000000 
2017-05-25 22:20:00  15    9.2  12.096774 
2017-05-25 22:25:00  20   12.2  16.111111 
2017-05-25 22:30:00  25   15.8  20.590551 
2017-05-25 22:35:00  32   20.4  26.317647 

繪製的曲線圖

plt.figure(figsize=(16,5)) 
plt.plot(ts, label="Original") 
plt.plot(mean_smoothed, label="Moving Average") 
plt.plot(exp_smoothed, label="Exponentially Weighted Average") 
plt.legend() 
plt.show() 

graph

兩個移動平均(MA )和指數平滑(ES)引入滯後:在上面的例子MA中,需要5個值來預測第6個值是什麼。但是,如果您查看錶格,MA列中只有4個NaN值,第5個值已經是非NaN值(=第一個預測值)。

問題:如何在圖中繪製這些值,以便正確保留滯後?看ES,它實際上更明顯一點:ES應該從t = 2開始,但是開始但立即開始。

+2

看來你已經收到了兩個答案,將根據自己的喜好解決您的問題。如果任何建議的解決方案對您有用,請考慮查看[this](https://stackoverflow.com/help/someone-answers)。 – vestland

回答

0

您似乎誤解了移動平均線。對於MA(5),需要5個數據點來計算。一旦得到第5點,可以使用第1-5點計算第5點的平均值。所以你應該只有4個NaN。

如果你想改變你的數據,你可以嘗試:

df.shift(n) # n is an integer

無論是-1轉移的實際,或1

Here轉變一切的文檔吧。

0

插值應該可以解決這個問題。

import pandas as pd 
import seaborn as sns 
import matplotlib.pyplot as plt 

data = [["2017-05-25 22:00:00", 5], 
["2017-05-25 22:05:00", 7], 
["2017-05-25 22:10:00", 9], 
["2017-05-25 22:15:00", 10], 
["2017-05-25 22:20:00", 15], 
["2017-05-25 22:25:00", 20], 
["2017-05-25 22:30:00", 25], 
["2017-05-25 22:35:00", 32]] 

df = pd.DataFrame(data) 
df.columns = ["date", "value"] 
df["date2"] = pd.to_datetime(df["date"],format="%Y-%m-%d %H:%M:%S") 

ts = pd.Series(df["value"].values, index=df["date2"]) 
mean_smoothed = ts.rolling(window=5).mean() 
###### NEW ######### 
mean_smoothed[0]=ts[0] 
mean_smoothed.interpolate(inplace=True) 
#################### 
exp_smoothed = ts.ewm(alpha=0.5).mean() 

h1 = ts.head(8) 
h2 = mean_smoothed.head(8) 
h3 = exp_smoothed.head(8) 
k = pd.concat([h1, h2, h3], join='outer', axis=1) 
k.columns = ["Actual", "Moving Average", "Exp Smoothing"] 
print(k) 


plt.figure(figsize=(16,5)) 
plt.plot(ts, label="Original") 
plt.plot(mean_smoothed, label="Moving Average") 
plt.plot(exp_smoothed, label="Exponentially Weighted Average") 
plt.legend() 
plt.show() 

enter image description here