首页 > 解决方案 > 将数据帧拆分为较小的数据帧并在子集上运行循环

问题描述

我已经使用 Python 软件包下载了价值一年的标准普尔 500 股票数据yfinance,如下所示(确保只保留开盘价),为 500 家公司中的每家公司提供:

import pandas as pd
import yfinance as yf
import numpy as np
source=pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')
df = pd.DataFrame(source[0])
tickers_symbols=df['Symbol'].values.tolist()
GICS_sectors = df['GICS Sector'].values.tolist()
data = pd.DataFrame()
for t,s in zip(tickers_symbols, GICS_sectors):
    tmp = yf.download(t, period='1y', progress=False)
    tmp.reset_index(inplace=True)
    tmp['Ticker'] = t
    tmp['GICS'] = s
    data = data.append(tmp, ignore_index=True)
##KEEP ONLY OPENING PRICE##
data=data.drop(["Close", "High", "Low", "Adj Close", "Volume"], axis=1)

现在,我需要根据每个公司的 GICS 部门将这个大型数据集分类为较小的数据集。为了做到这一点,我将元组GICS和对象包含dataset在一个dict对象中(如此处建议那样,这样我就可以通过简单地键入来调用每个较小的数据集dataset_list['GICS sector']

dataset_list = dict(tuple(data.groupby('GICS')))
print(dataset_list)
##SPLIT DATASET BY GICS SECTOR AND REMOVE GICS COLUMN##
for sector, dataset in dataset_list.items():
    long_dataset=data.drop(columns='GICS', axis=1)

但是,我在后续步骤中遇到了麻烦。实际上,当我运行一个循环将每个数据集从长转换为宽并将其保存为 .csv 文件时,它正确创建了 11 个文件(与数据集一样多),但每个文件中的数据完全相同

##CONVERT EACH DATASET FROM LONG TO WIDE##
for sector, dataset in dataset_list.items():
    final_datasets=long_dataset.pivot_table(index="Date", columns="Ticker", values="Open")    
    final_datasets.to_csv(str(sector)+' DataFrame.csv', index=True, sep=',')  

我认为我写的循环有问题,但我不知道如何解决它。上面的每个循环都应该修改dataset_list对象中的所有数据集,即我应该能够检索一个数据帧final_datasets['GICS sector'],但只生成一个数据帧。

任何帮助深表感谢。

标签: pythondataframeloopsdictionary

解决方案


你正在循环,dataset_list.items()但只做.pivot_table一次long_dataset(每次迭代都是一样的)。

尝试:

import numpy as np
import pandas as pd
import yfinance as yf

source = pd.read_html(
    "https://en.wikipedia.org/wiki/List_of_S%26P_500_companies"
)
df = pd.DataFrame(source[0])
tickers_symbols = df["Symbol"].values.tolist()
GICS_sectors = df["GICS Sector"].values.tolist()
data = pd.DataFrame()
for t, s in zip(tickers_symbols, GICS_sectors):
    print(t, s)
    tmp = yf.download(
        t, period="2d", progress=False
    )  # <-- increase the period here
    tmp.reset_index(inplace=True)
    tmp["Ticker"] = t
    tmp["GICS"] = s
    data = data.append(tmp, ignore_index=True)

##KEEP ONLY OPENING PRICE##
data = data.drop(["Close", "High", "Low", "Adj Close", "Volume"], axis=1)

for sector, dataset in data.groupby("GICS"):
    final_dataset = dataset.pivot_table(
        index="Date", columns="Ticker", values="Open"
    )
    print(final_dataset)
    print()
    final_dataset.to_csv(
        f"{sector.replace(' ', '_')}_DataFrame.csv", index=True, sep=","
    )

创建许多 CSV 文件,例如:

-rw-r--r-- 1 root root  68 sep 13 16:49 Communication_Services_DataFrame.csv
-rw-r--r-- 1 root root  69 sep 13 16:49 Consumer_Discretionary_DataFrame.csv
-rw-r--r-- 1 root root 138 sep 13 16:49 Health_Care_DataFrame.csv
-rw-r--r-- 1 root root  68 sep 13 16:49 Industrials_DataFrame.csv
-rw-r--r-- 1 root root 126 sep 13 16:49 Information_Technology_DataFrame.csv
-rw-r--r-- 1 root root  55 sep 13 16:49 Utilities_DataFrame.csv

...and so on.

推荐阅读