0

我的文件夹中有几个从 Yahoo Finance 下载的 csv 文件(每个文件都有相同数量的同名列数和相同的行数),我试图一口气将它们读入 python。我尝试了 12 个文件。每个文件都有列Date, High, Low, Close, Adj Close, Volume.

我在网上搜索,我的代码如下:

csvs = [x for x in os.listdir('.') if x.endswith('.csv')]

fns = [os.path.splitext(os.path.basename(x))[0] for x in csvs]

d = {}

for i in range(len(fns)):
    d[fns[i]] = pd.read_csv(csvs[i])
print(d)

然后我得到d由 12 个数据框组成的数据框(每个都有列DateClose其他同名的列。
现在我正在努力解决如何从字典中提取每个数据框的“日期”和“关闭”d并作为新数据框加入(一列为Date12 列为Close,日期相同),并保持Close列名作为数据框的名称d

我尝试创建这样的列表

df_list = [d['AAPL'], d['AMD'], d['BIDU'], d['GOOGL'],d['MSFT'], d['NVDA'], d['NXPI'], d['QCOM'], d['SWKS'], d['TXN'], d['^IXIC'], d['^NDXT']]

然后像这样一步一步

aapl = df_list[0]
amd = df_list[1]
bidu = df_list[2]
googl = df_list[3]
msft = df_list[4]
nvda = df_list[5]
nxpi = df_list[6]
qcom = df_list[7]
swks = df_list[8]
txn = df_list[9]
ixic = df_list[10]
ndxt = df_list[11]

mydf = pd.concat([aapl[['Date', 'Close']], amd[['Close']]], axis = 1)
mydf = pd.concat([mydf, bidu[['Close']]], axis = 1)
mydf = pd.concat([mydf,googl[['Close']]], axis = 1)
mydf = pd.concat([mydf,msft[['Close']]], axis = 1)
mydf = pd.concat([mydf,nvda[['Close']]], axis = 1)
mydf = pd.concat([mydf,nxpi[['Close']]], axis = 1)
mydf = pd.concat([mydf,qcom[['Close']]], axis = 1)
mydf = pd.concat([mydf,swks[['Close']]], axis = 1)
mydf = pd.concat([mydf,txn[['Close']]], axis = 1)
mydf = pd.concat([mydf,ixic[['Close']]], axis = 1)
mydf = pd.concat([mydf,ndxt[['Close']]], axis = 1)

然后我得到了一列 asDate和 12 列 as的数据框Close,但列的标签都是Close.

我得到的数据框是这样的:

日期
2011-06-02 1 2 2 2 2 2 2 2 2 2 2 2
2011-06-03 1 2 2 2 2 2 2 2 2 2 2 2
2011-06-04 1 2 2 2 2 2 2 2 2 2 2 2
2011-06-05 1 2 2 2 2 2 2 2 2 2 2 2
... ... ... ... ... ... ... ... ... ... ... ... ...
2021-05-28 1 2 2 2 2 2 2 2 2 2 2 2

有 2515 行,数字 1/2 只是举例。

我想知道

  1. 如何更改列的标签,我的期望是这样的(对于 IXIC 和 NDXT,原始文件名是^IXICand ^NDXT):
日期 苹果 AMD 百度 谷歌 微软 英伟达 恩智浦 高通 SWKS 德克萨斯州 IXIC NDXT
2011-06-02 1 2 2 2 2 2 2 2 2 2 2 2
2011-06-03 1 2 2 2 2 2 2 2 2 2 2 2
2011-06-04 1 2 2 2 2 2 2 2 2 2 2 2
2011-06-05 1 2 2 2 2 2 2 2 2 2 2 2
... ... ... ... ... ... ... ... ... ... ... ... ...
2021-05-28 1 2 2 2 2 2 2 2 2 2 2 2
  1. 我怎样才能使代码更容易,这样我就不需要编写任何像“AAPL”这样的硬代码,因为我有数百个文件,而且像我所做的那样一步一步地创建这个简单的数据框会很糟糕。

我是 Python 新手,正在玩数据帧。希望我已经清楚地解释了我的问题,任何帮助将不胜感激。

4

1 回答 1

0

您应该一口气阅读这些文件并将它们拆开。一个示例代码(因为我没有你的输入文件)来勾画这个想法......

from glob import glob
import pandas as pd

def read_file(f):
    df = pd.read_csv(f)
    df['ticker'] = f.split('.')[0].strip('^')
    return df


df = pd.concat([read_file(f) for f in glob('*.csv')])
df = df.set_index(['Date','ticker'])[['Close']].unstack()

于 2021-07-06T02:05:01.970 回答