我一直試圖建立一個3D pandas資料框架,其格式如下:
每個 "面板 "都是針對特定的股票,包括該股票在許多時間點的開盤價和收盤價。
每個 "面板 "是針對一只特定的股票,包括該股票在許多時間點上的開盤、收盤、低點和高點。 多個面板被放置在一起,形成3D資料框架(之前我想我會把這些稱為面板,但看起來面板已經被貶值了?
以下是我目前正在嘗試的內容:
for x in files:
dataloc = datalocation x
rawinputData.append(prepData(dataloc))
inputdata = pd.concat(rawinputData,keys=stockTicker)
其中preData是這樣的:
def prepData(dataloc)。
inputData = pd.read_csv(dataloc)
inputData.columns = ["OpenTime","Open","High","Low","Close"]
return inputData
我希望這能給我一種資料框架,我可以通過任何給定的維度拉出一個切片(例如,所有股票在所有時間的所有開盤價;所有股票在時間x的開盤價;股票x所有時間的所有價格;),但當我運行這種型別的操作時,我遇到了一個錯誤,我只有兩個維度:
print(inputdata.shape)
returns
(314631, 4)
我在這里做錯了什么?
uj5u.com熱心網友回復:
一個pandas DataFrame總是二維的,因為它有一個行索引和一個列索引,它們跨越了一個值表。然而,您可以通過使其中一個(或兩個)索引成為MultiIndex,將更高維度的資料表示為 DataFrame。
下面是一個有兩個 "面板 "的例子:
import pandas as pd
colnames = ['open'/span>, 'high'/span>, 'low'/span>, 'close'/span>]
dates = pd.Index(['2019-01-01'/span>, '2020-01-01'/span>, '2021-01-01'/span>] )
df1 = pd.DataFrame([[15, 20, 10, 11] 。
[21, 22, 20, 21] 。
[38, 40, 32, 37] ]。
index=dates, columns=colnames)
df2 = pd.DataFrame([[35, 40, 30, 35] 。
[45, 48, 43, 46] 。
[67, 70, 65, 66] ]。
index=dates, columns=colnames)
df = pd.concat([df1, df2], axis=1)
df.columns = pd.MultiIndex.from_product([['Daimler', 'Tesla'], colnames],
names=['stock', 'price'])
df
stock Daimler Tesla
價格 open high low close open high low close
2019-01-01 15 20 10 11 35 40 30 35
2020-01-01 21 22 20 21 45 48 43 46
2021-01-01 38 40 32 37 67 70 65 66
這確實可以實作你想要的切片功能,例如,要獲得所有的開盤價,你可以使用橫斷面方法:
df.xs('open', level='price', axis=1)
stock Daimler Tesla
2019-01-01 15 35
2020-0121 45
2021-01-01 38 67
為了給每只股票創建一個新的列,你可以在股票上進行回圈操作:
for stock in df.columns.level[0] 。
df[stock, 'range'] = df[stock, 'high'] - df[stock, 'low']
df = df.sort_index(axis=1)
df
股票 戴姆勒-特斯拉
價格 收盤高點 低點 開盤 范圍 收盤高點 低點 開盤 范圍2019-01-01 11 20 10 15 10 35 40 30 35 10
2020-01-01 21 22 20 21 2 46 48 43 45 5
2021-01-01 37 40 32 38 8 66 70 65 67 5
另一種可能更習慣的方法是根據庫存堆疊資料,即把MultiIndex從列中移到行中。然后你只需要分配一個新的列。例如,為了產生與上面相同的結果:
df = df.stack('stock')
df['range'] = df.high - df.low
df = df.unstack().swaplevel(axis=1) .sort_index(axis=1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/332429.html
標籤:
