【问题标题】:For loop only showing last value instead of them all | CryptocurrencyFor 循环只显示最后一个值而不是全部 |加密货币
【发布时间】:2021-09-15 23:38:04
【问题描述】:

我正在尝试制作一个加密扫描仪,但我遇到了一个问题。我制作了一个包含一些加密货币的小 csv 文件,如下所示:

BTC-USD
ETH-USD
ADA-USD
BNB-USD

现在我想遍历这个 csv 文件并将所有值放入 df 的函数中。现在的问题是它只插入文件的最后一个值并给出该硬币的图形。我尝试如下:

with open('symbols.csv') as f:
    symbols = f.read().splitlines()
    for symbol in symbols:
        df = yf.download(symbol, start='2020-01-01')

我觉得它正在做它的工作,因为我得到以下输出:

[*********************100%***********************]  1 of 1 completed
[*********************100%***********************]  1 of 1 completed
[*********************100%***********************]  1 of 1 completed
[*********************100%***********************]  1 of 1 completed

现在我想从所有硬币中获取 4 个图表,而不仅仅是 csv 文件中的最后一个硬币。谁能帮我解决这个问题?提前致谢!

注意:其余代码正在运行并提供正确的值,现在唯一缺少的是从不同硬币获取输出的循环。

我的整个代码是:

import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd


with open('symbols.csv') as f:
    symbols = f.read().splitlines()
    for symbol in symbols:
        df = yf.download(symbol, start='2020-01-01')

# df = yf.download('ADA-USD', start='2021-01-01')

df['SMA'] = df.Close.rolling(window=20).mean()
df['stddev'] = df.Close.rolling(window=20).std()
df['Upper'] = df.SMA + 2* df.stddev
df['Lower'] = df.SMA - 2* df.stddev
df['Buy_Signal'] = np.where(df.Lower > df.Close, True, False)
df['Sell_Signal'] = np.where(df.Upper < df.Close, True, False)

buys = []
sells = []
open_pos = False

for i in range(len(df)):
    if df.Lower[i] > df.Close[i]:
        if open_pos == False:
            buys.append(i)
            open_pos = True
    elif df.Upper[i] < df.Close[i]:
        if open_pos:
            sells.append(i)
            open_pos = False

print('zoveel buys:', buys)
print('zoveel sells:', sells)

# print(df.dropna())

plt.figure(figsize=(12, 6))
# plt.scatter(df.index[df.Buy_Signal], df[df.Buy_Signal].Close, marker = '^', color ='g')
# plt.scatter(df.index[df.Sell_Signal], df[df.Sell_Signal].Close, marker = '^', color ='r')
plt.scatter(df.iloc[buys].index, df.iloc[buys].Close, marker = '^', color ='g')
plt.scatter(df.iloc[sells].index, df.iloc[sells].Close, marker = '^', color ='r')

plt.plot(df[['Close', 'SMA', 'Upper', 'Lower']])
plt.fill_between(df.index, df.Upper, df.Lower, color='grey', alpha=0.3)
plt.legend(['Close', 'SMA', 'Upper', 'Lower'])
plt.show()

merged = pd.concat([df.iloc[buys].Close, df.iloc[sells].Close], axis=1)
merged.columns = ['Buys', 'Sells']
print(merged)
# #
totalprofit = merged.shift(-1).Sells - merged.Buys
print(totalprofit)

relprofits = (merged.shift(-1).Sells - merged.Buys) / merged.Buys
print(relprofits.mean())

【问题讨论】:

    标签: python csv cryptocurrency


    【解决方案1】:

    在这一行

    df = yf.download(symbol, start='2020-01-01')
    

    您正在将下载结果分配给数据框。但是,每次您创建一个新的数据框而不是添加到它时。

    因此,您要么需要在循环中通过调用 df 上的函数来使用 df 做任何你想做的事情,例如 do_something(df) 或者您可以将其存储在一些 dfs = []dfs.append(df) 中,然后您会将每个数据帧存储在一个数据帧数组中。

    【讨论】:

    • 谢谢!我将所有内容都放在同一个 for 循环中,现在它确实可以工作了!我试图制作 dfs 列表并附加所有 df 但这并没有真正奏效,因为我必须进行很多更改。我还没有使用 python 的经验,所以我可能错了。就像我尝试将所有 df 更改为 dfs 但它给出了各种错误。
    • 不客气!意识到数据帧,即df 来自 pandas 包。它们的语法有时与标准 python 完全不同。这有时会让人非常困惑!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 2022-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多