从for循环的输出创建数据帧

时间:2021-07-01 10:47:11

标签: python pandas for-loop

我有一个脚本可以从 excel 文件中提取数据框。 我想以这样一种方式运行 for 循环,即循环输出的最后一个值保存在单独的数据帧中。

如何实现?

# Import libraries & activate
from nsepy.history import get_history
from pynse import *
import datetime as dt
import pandas as pd
import xlwings as xw

nse = Nse()

wb = xw.Book("Marketwatch.xlsm")
ws = wb.sheets("Sectoral Data")
_Indices = ws.range("AM1").expand().options(pd.DataFrame).value.reset_index()
_stocks = ws.range("AM21").expand().options(pd.DataFrame).value.reset_index()

for i in _Indices["Symbol"]:
    en = dt.date.today()
    st = en - dt.timedelta(days=700)
    i = (
        nse.get_hist(i, from_date=st, to_date=en)
        .drop(["Open", "High", "Low", "SharesTraded"], axis=1)
        .reset_index()
    )
    i.insert(1, "Symbol", i)
    i["5dma"] = i["Close"].rolling(window=5).mean()
    i["13dma"] = i["Close"].rolling(window=13).mean()
    i["20dma"] = i["Close"].rolling(window=20).mean()
    i["50dma"] = i["Close"].rolling(window=50).mean()
    i["100dma"] = i["Close"].rolling(window=5).mean()
    i["200dma"] = i["Close"].rolling(window=5).mean()
    i["5drtn"] = (i["Close"] - i["Close"].shift(4)) * 100 / i["Close"].shift(4)
    i["10drtn"] = (i["Close"] - i["Close"].shift(9)) * 100 / i["Close"].shift(9)
    i["1mortn"] = (i["Close"] - i["Close"].shift(29)) * 100 / i["Close"].shift(29)
    i["3mortn"] = (i["Close"] - i["Close"].shift(89)) * 100 / i["Close"].shift(89)
    i["6mortn"] = (i["Close"] - i["Close"].shift(179)) * 100 / i["Close"].shift(179)
    i["1yrtn"] = (i["Close"] - i["Close"].shift(364)) * 100 / i["Close"].shift(364)
    print(i.tail(1))

1 个答案:

答案 0 :(得分:0)

通过添加一个空数据框并将 for 循环的输出附加到循环外创建的数据框,能够解决该问题。 最终代码在这里

# Import libraries & activate
from nsepy.history import get_history
from pynse import *
import datetime as dt
import pandas as pd
import xlwings as xw

nse = Nse()

wb = xw.Book("Marketwatch.xlsm")
ws = wb.sheets("Sectoral Data")
_Indices = ws.range("AJ1").expand().options(pd.DataFrame).value.reset_index()
_stocks = ws.range("AJ21").expand().options(pd.DataFrame).value.reset_index()

data = pd.DataFrame()
for i in _Indices["Symbol"]:
    en = dt.date.today()
    st = en - dt.timedelta(days=700)
    df = nse.get_hist(i, from_date=st, to_date=en).drop(["Open", "High", "Low", "SharesTraded"], axis=1)
    df.insert(0, "Symbol", i)
    df["5dma"] = df["Close"].rolling(window=5).mean()
    df["13dma"] = df["Close"].rolling(window=13).mean()
    df["20dma"] = df["Close"].rolling(window=20).mean()
    df["50dma"] = df["Close"].rolling(window=50).mean()
    df["100dma"] = df["Close"].rolling(window=100).mean()
    df["200dma"] = df["Close"].rolling(window=200).mean()
    df["5drtn"] = (df["Close"] - df["Close"].shift(4)) * 100 / df["Close"].shift(4)
    df["10drtn"] = (df["Close"] - df["Close"].shift(9)) * 100 / df["Close"].shift(9)
    df["1mortn"] = (df["Close"] - df["Close"].shift(29)) * 100 / df["Close"].shift(29)
    df["3mortn"] = (df["Close"] - df["Close"].shift(89)) * 100 / df["Close"].shift(89)
    df["6mortn"] = (df["Close"] - df["Close"].shift(179)) * 100 / df["Close"].shift(179)
    df["1yrtn"] = (df["Close"] - df["Close"].shift(364)) * 100 / df["Close"].shift(364)
    data = data.append(df.tail(1),  ignore_index=True)

print(data)