英文:
How can I add the columns different dataframes in a loop?
问题
我目前正在处理一个有趣的项目的财务数据,并希望以以下方式向现有数据框中添加列:我遍历一个指标名称列表,并为每个不同的指标进行API调用,将数据接收为CSV格式。然后,我希望将不包含时间列(因为每个指标的时间列相同)的列追加到包含价格数据的数据框中。到目前为止,我发现以下代码似乎存在问题,因为之前的代码可以正常工作。
inditest = ['SMA', 'EMA', 'WMA']
df = pd.DataFrame()
for i in inditest:
indicator_url = f"https://www.alphavantage.co/query?function={i}&symbol={SYMBOL}&interval=15min&time_period=60&series_type=close&datatype=csv&apikey={API_KEY}"
# 从API获取指标数据
data = requests.get(indicator_url)
with open(location + f"{i}_{SYMBOL}_base.csv", 'wb') as fi:
fi.write(data.content)
# 为指标数据创建列
idf = pd.read_csv(location + f"{i}_{SYMBOL}_base.csv")
idata = idf.iloc[:, 1:len(idf.columns)]
# 将指标列添加到现有数据框
df = pd.concat([df, idata], axis=1, join="inner")
我成功地从API中获取到数据,所以问题应该在于添加列的部分。为了简化,我创建了一个空数据框。在原始代码中,数据框在循环外部被定义,并且有2列。在我的情况下,SYMBOL变量是苹果公司(AAPL)的股票。提前感谢您的帮助!
英文:
I am currently working with financial data for a fun project and want to add columns to an existing dataframe in the following way: I loop through a list of indicator names and make an API call for each of the different indicators recieving the data as csv. I then want to take the columns without the time column (since it is the same for each indicator) and append them to a dataframe with price data. So far I found out that the following code seems to have the problem since the code before works as it should.
inditest = ['SMA', 'EMA', 'WMA']
df = pd.DataFrame()
for i in inditest:
indicator_url = f"https://www.alphavantage.co/query?function={i}&symbol={SYMBOL}&interval=15min&time_period=60&series_type=close&datatype=csv&apikey={API_KEY}"
# get indicator data from api
data = requests.get(indicator_url)
with open(location + f"{i}_{SYMBOL}_base.csv", 'wb') as fi:
fi.write(data.content)
# make columns for indicator data
idf = pd.read_csv(location + f"{i}_{SYMBOL}_base.csv")
idata = idf.iloc[:, 1:len(idf.columns)]
# add indicator columns to existing dataframe
df = pd.concat([df, idata], axis=1, join="inner")
I receive the data from the api just fine so it should be a problem with adding the columns.
To simplify I made an empty Dataframe. In the original df is defined outside of the loop and has 2 columns. SYMBOL variable in my case is AAPL for the apple stock.
Thanks in advance!
答案1
得分: 1
I'll provide the translation for the code portion:
from urllib.parse import urlencode
base_url = "https://www.alphavantage.co/query?"
# 所有你的URL请求都共享这些参数
base_params = {
"symbol": "MSFT", # 你需要的股票符号
"interval": "15min",
"time_period": 60,
"series_type": "close",
"datatype": "csv",
"apikey": "你的API密钥",
}
inditest = ["SMA", "EMA", "WMA"]
indicators = [
# `urlencode` 会构建 "symbol=AAPL&interval=15min&..." 字符串
# 我们只需要将其前缀设为 `base_url` 并添加 `function`。
# 我们也将 `time` 移到索引,以便稍后 `pd.concat` 可以对齐数据帧。
pd.read_csv(base_url + urlencode({**base_params, "function": i}), index_col="time")
for i in inditest
]
result = pd.concat(indicators, axis=1)
Please note that I've removed the HTML entities (") for double quotes to make the code more readable.
英文:
Two things:
- Move
timeto the index sopd.concatcan line up the series correctly. Do not assume that you will receive the same data or in the same order for all series. pd.read_csvcan read from a URL so no need to save it locally.
from urllib.parse import urlencode
base_url = "https://www.alphavantage.co/query?"
# All your URL requests share these parameters
base_params = {
"symbol": "MSFT", # whatever symbol you are after
"interval": "15min",
"time_period": 60,
"series_type": "close",
"datatype": "csv",
"apikey": "...",
}
inditest = ["SMA", "EMA", "WMA"]
indicators = [
# `urlencode` will build the "symbol=AAPL&interval=15min&..." string
# We only need to prefix it with the `base_url` and add `function`.
# We also move `time` to the index so `pd.concat` can later align the dataframes.
pd.read_csv(base_url + urlencode({**base_params, "function": i}), index_col="time")
for i in inditest
]
result = pd.concat(indicators, axis=1)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论