【问题标题】:Splitting a dataframe into smaller ones and running loops over the subsets将数据帧拆分为较小的数据帧并在子集上运行循环
【发布时间】:2021-11-08 20:11:01
【问题描述】:

我已经使用 Python 包yfinance 为 500 家公司中的每一家下载了价值一年的标准普尔 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 部门将这个大型数据集分类为更小的数据集。为了做到这一点,我将元组GICSdataset 包含在dict 对象中(如建议的here,这样我就可以通过简单地输入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'],但只生成一个数据帧。

非常感谢任何帮助。

【问题讨论】:

    标签: python dataframe loops dictionary


    【解决方案1】:

    您正在循环 dataset_list.items(),但仅在 long_dataset 上执行 .pivot_table(每次迭代都相同)。

    试试:

    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.
    

    【讨论】:

    • 这是一个非常好的解决方案!但是,如果我必须再次遍历所有数据集怎么办?例如,如果我必须计算较小数据集中的相关性,我可以使用 运行循环,它会返回一个错误,因为变量“GICS”不再存在。有没有办法解决这个问题?
    • @ErnestEast 您在数据框data 中拥有的所有数据。例如,您可以使用data.groupby('GICS').corr()。或在 for 循环内:dataset.corr()
    • 是的,但是我需要计算相关性的数据包含在 final_dataset 中。如果我运行 data.groupby('GICS').corr() 我得到: 通信服务开放 1.0 非必需消费品开放 1.0 必需消费品开放 1.0 能源开放 1.0 金融开放 1.0 医疗保健开放 1.0 工业开放 1.0 信息技术开放 1.0 材料开放 1.0 Real Estate Open 1.0 Utilities Open 1.0 中的数据仍然是长格式,因此毫无意义。
    • 对不起,符号混乱,我不知道如何在 cmets 中插入代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2020-10-06
    • 1970-01-01
    • 2019-07-29
    • 1970-01-01
    • 2014-12-02
    相关资源
    最近更新 更多