所以我必須對資料幀內的一組行執行滾動視窗。問題是,當我執行顯示所有 NaN 值full_df = full_df.rolling(window=5).mean()的輸出時full_df.head(2000)。有誰知道為什么會這樣?我必須對此進行時間序列練習。
這是資料集:
uj5u.com熱心網友回復:
首先,你的回圈for i in full_df沒有按照你的想法去做;您不是在每一行中運行滾動平均值,而是在整個資料幀上一遍又一遍地運行它,沿列求平均值。
如果我們只是按照您實施的方式進行一次滾動平均:
full_df = full_df.rolling(window=5).mean()
print(full_df)
0 1 2 3 ... 1255 1256 1257 1258
A NaN NaN NaN NaN ... NaN NaN NaN NaN
AAL NaN NaN NaN NaN ... NaN NaN NaN NaN
AAP NaN NaN NaN NaN ... NaN NaN NaN NaN
AAPL NaN NaN NaN NaN ... NaN NaN NaN NaN
ABBV 48.56684 48.37228 47.95056 48.07312 ... 102.590 98.768 101.212 100.510
... ... ... ... ... ... ... ... ... ...
XYL 45.58400 45.60000 45.74000 45.96200 ... 64.504 61.854 61.596 61.036
YUM 51.14200 51.01800 51.17400 51.28400 ... 66.902 64.420 63.914 63.668
ZBH 48.59000 48.49200 48.57000 48.75000 ... 75.154 73.112 72.704 72.436
ZION 44.84400 44.76600 44.89400 45.08200 ... 73.972 71.734 71.516 71.580
ZTS 45.08600 45.02600 45.27400 45.39200 ... 83.002 80.224 80.000 80.116
[505 rows x 1259 columns]
前四行都是NaN因為沒有為少于 5 行定義滾動平均值。
如果我們再做一次(總共做兩次):
full_df = full_df.rolling(window=5).mean()
print(full_df.head(9))
0 1 2 ... 1256 1257 1258
A NaN NaN NaN ... NaN NaN NaN
AAL NaN NaN NaN ... NaN NaN NaN
AAP NaN NaN NaN ... NaN NaN NaN
AAPL NaN NaN NaN ... NaN NaN NaN
ABBV NaN NaN NaN ... NaN NaN NaN
ABC NaN NaN NaN ... NaN NaN NaN
ABT NaN NaN NaN ... NaN NaN NaN
ACN NaN NaN NaN ... NaN NaN NaN
ADBE 49.619072 49.471424 49.192048 ... 108.3420 110.4848 110.4976
您可以看到前 8 行都是NaN從第四行向下延伸到滾動平均值的第八行。給定資料框的大小(505 行),如果您運行滾動均值 127 次,則整個df將被NaN值消耗,而您的for回圈執行的次數甚至比這更多,這就是為什么您df被NaN值填充的原因。
另外,請注意,您對不同的股票代碼進行平均,這是沒有意義的。我相信你想要做的是平均行,而不是在這種情況下你只需要做的列
full_df = full_df.rolling(axis = 'columns', window=5).mean()
print(full_df)
0 1 2 3 4 5 ... 1253 1254 1255 1256 1257 1258
A NaN NaN NaN NaN 44.72600 44.1600 ... 73.926 73.720 73.006 71.744 70.836 69.762
AAL NaN NaN NaN NaN 14.42600 14.3760 ... 53.142 53.308 53.114 52.530 52.248 51.664
AAP NaN NaN NaN NaN 78.74000 78.7600 ... 120.742 120.016 118.074 115.468 114.054 112.642
AAPL NaN NaN NaN NaN 67.32592 66.9025 ... 168.996 168.330 166.128 163.834 163.046 161.468
ABBV NaN NaN NaN NaN 35.87200 36.1380 ... 116.384 117.992 116.384 113.824 112.888 113.168
... ... ... ... ... ... ... ... ... ... ... ... ... ...
XYL NaN NaN NaN NaN 27.84600 28.0840 ... 73.278 73.598 73.848 73.698 73.350 73.256
YUM NaN NaN NaN NaN 64.58000 64.3180 ... 85.504 85.168 84.454 83.118 82.316 81.424
ZBH NaN NaN NaN NaN 75.85600 75.8660 ... 126.284 126.974 126.886 126.044 125.316 124.048
ZION NaN NaN NaN NaN 24.44200 24.4820 ... 53.838 54.230 54.256 53.748 53.466 53.464
ZTS NaN NaN NaN NaN 33.37400 33.5600 ... 78.720 78.434 77.772 76.702 75.686 75.112
同樣,您的前四列不在此處管理。
為了糾正這一點,我們再添加一個術語:
full_df = full_df.rolling(axis = 'columns', window=5, min_periods = 1).mean()
print(full_df)
0 1 2 3 4 5 ... 1253 1254 1255 1256 1257 1258
A 45.0800 44.8400 44.766667 44.7625 44.72600 44.1600 ... 73.926 73.720 73.006 71.744 70.836 69.762
AAL 14.7500 14.6050 14.493333 14.5350 14.42600 14.3760 ... 53.142 53.308 53.114 52.530 52.248 51.664
AAP 78.9000 78.6450 78.630000 78.7150 78.74000 78.7600 ... 120.742 120.016 118.074 115.468 114.054 112.642
AAPL 67.8542 68.2078 67.752800 67.4935 67.32592 66.9025 ... 168.996 168.330 166.128 163.834 163.046 161.468
ABBV 36.2500 36.0500 35.840000 35.6975 35.87200 36.1380 ... 116.384 117.992 116.384 113.824 112.888 113.168
... ... ... ... ... ... ... ... ... ... ... ... ... ...
XYL 27.0900 27.2750 27.500000 27.6900 27.84600 28.0840 ... 73.278 73.598 73.848 73.698 73.350 73.256
YUM 65.3000 64.9250 64.866667 64.7525 64.58000 64.3180 ... 85.504 85.168 84.454 83.118 82.316 81.424
ZBH 75.8500 75.7500 75.646667 75.7350 75.85600 75.8660 ... 126.284 126.974 126.886 126.044 125.316 124.048
ZION 24.1400 24.1750 24.280000 24.3950 24.44200 24.4820 ... 53.838 54.230 54.256 53.748 53.466 53.464
ZTS 33.0500 33.1550 33.350000 33.4000 33.37400 33.5600 ... 78.720 78.434 77.772 76.702 75.686 75.112
在上述資料幀中的第一列只是在時間的價值0,二是倍,平均0和1,第三是平均的時間0,1和2等視窗大小繼續增長,直到你得到你的價值window=5,此時視窗會隨著您的滾動平均值移動。請注意,如果您愿意,您也可以將滾動平均值居中,而不是使用尾隨視窗。您可以在此處查看檔案。
uj5u.com熱心網友回復:
我不太確定你要做什么。您能否更詳細地解釋一下,您的操作目標是什么?我假設您嘗試在每個資產上建立一個 5 天間隔的移動(滾動)平均值,并計算每個間隔的平均價格。
但首先,讓我回答為什么您會看到所有 NaN:您在下面的代碼中所做的是,您只是一遍又一遍地執行相同的操作,而其結果始終是 NaN。也就是說,因為您對 dict 做了一些奇怪的事情,并且第一行都有 NaN,所以平均值也將是 NaN。并且由于您full_df通過此計算的結果覆寫了變數,因此您的資料框僅顯示 NaN。
for i in full_df:
full_df = full_df.rolling(window=5).mean()
讓我更詳細地解釋一下。您(可能)試圖迭代資料幀(使用 5 天的視窗)并計算平均值。該函式full_df.rolling(window=5).mean()已經做到了這一點,輸出是一個新的資料幀,每個視窗在整個資料幀上的平均值full_df。通過在回圈中運行這個函式,沒有額外的索引,你只是在整個資料幀上一遍又一遍地運行相同的函式。
也許這會讓你得到你想要的:
import pandas as pd
df = pd.read_csv("all_stocks_5yr.csv", index_col=[0,6])
means = df.rolling(window=5).mean()
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/366692.html
