python - 将数据帧拆分为较小的数据帧并在子集上运行循环
问题描述
我已经使用 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']
,但只生成一个数据帧。
任何帮助深表感谢。
解决方案
你正在循环,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.
推荐阅读
- json - 错误:未处理的异常:类型'_InternalLinkedHashMap
' 不是 Flutter 中类型 'int' 的子类型 - php - 为什么我准备好的声明,谁的?计数和数组值看起来正确似乎无法实际插入到表中?
- javascript - 迭代对象文字以填充列表
- ios - 调用断开功能后,Socket io不连接。即连接->断开->连接将不起作用iOS swift
- optimization - 用于列生成的 Google OR 示例
- java - 或 Java For 循环中的条件
- django - 安装 django-heroku 时出错错误:找不到 pg_config 可执行文件
- python - 熊猫适用于未知列
- c# - 为什么 C# Thread.Join 在第一次等待时返回
- python - 有没有一种方法可以检查 img 标签的 src 是否包含用于使用 BS4 进行抓取的特定字符串