如何声明和分配 Python Dataframe 'column name' 作为两个字符串的变量?

How to declare and assign Python Dataframe 'column name' as variable of two strings?

我有一个 Stocks DataFrame,其列为 'SMA100915''SMA500915' 等等... df['SMA100915'] 是一列,在 09:15 小时具有股票的简单移动平均值,同样,我正在收集不同列中的所有 SMA 以用于分析目的,使用 while 循环 df.此循环计划从 09:15 小时

起每 15 分钟 运行

现在的问题是,

  1. 如何动态生成 df 列的名称作为 'SMA10' + 0915 并分配 SMA 值?
  2. 将 df 中股票的每一行的 SMA 值分配给 df 中的每一列

x = datetime.now() #假设现在时间为 09:15

xtime = x.strftime(%H%M)

我尝试使用 globals()[df.loc[i, '''SMA10'+ xtime']] = 13.84

示例数据:

df()

'symbol' 'SMA100915' 'SMA100930' 'SMA100945'
INFY 1562.97 1564 1565.65
依赖 2127 2129 2126.39

您可以向 DataFrame 添加一列,就像向字典添加 key/value 一样,即 df["your_key"] = some_vals。您可以根据需要构建密钥。

一个问题是,您分配的值应该是单个值或具有与 DataFrame 行数相同的元素数的值序列。所以在你的情况下

In [30]: from datetime import datetime

In [31]: import pandas

In [32]: df = pandas.DataFrame({"symbol": ["INFY", "RELIANCE"], "SMA1010915": [1562.97, 2127], "SMA100930": [15464, 2129],
    ...: "SMA100945": [1565.65, 2126.39]})

In [33]: time_str = datetime.now().strftime('%H%M')

In [34]: df["SMA10" + time_str] = [2000, 3000] # List of length two since there are two rows

In [35]: df
Out[35]:
     symbol  SMA1010915  SMA100930  SMA100945  SMA100938
0      INFY     1562.97      15464    1565.65       2000
1  RELIANCE     2127.00       2129    2126.39       3000

In [36]: new_time_str = "1230"

In [40]: df["SMA10" + new_time_str] = 100 # If single value, all rows get this

In [41]: df
Out[41]:
     symbol  SMA1010915  SMA100930  SMA100945  SMA100938  SMA101230
0      INFY     1562.97      15464    1565.65       2000        100
1  RELIANCE     2127.00       2129    2126.39       3000        100

如果您想为单独的行分配值,您也可以这样做。我认为通过“符号”列索引您的 DataFrame 可能是最简单的,所以像

In [51]: by_symbol = df.set_index("symbol")
In [55]: by_symbol
Out[55]:
          SMA1010915  SMA100930  SMA100945
symbol
INFY         1562.97      15464    1565.65
RELIANCE     2127.00       2129    2126.39

In [56]: new_time_str = "1111"

In [57]: by_symbol.loc["INFY", "SMA10" + new_time_str] = 1234

In [58]: by_symbol
Out[58]:
          SMA1010915  SMA100930  SMA100945  SMA101111
symbol
INFY         1562.97      15464    1565.65     1234.0
RELIANCE     2127.00       2129    2126.39        NaN

请注意,您可以在不按符号索引的情况下执行此操作。在那种情况下,你只需做

In [59]: df.loc[0, "SMA10" + new_time_str] = 1234

In [60]: df
Out[60]:
     symbol  SMA1010915  SMA100930  SMA100945  SMA101111
0      INFY     1562.97      15464    1565.65     1234.0
1  RELIANCE     2127.00       2129    2126.39        NaN
import pandas as pd
from datetime import time 

#Initialize data
data = {'SYMBOL':['INFY', 'RELIANCE'],
        'SMA100915':'',
        'SMA100930':'',
        'SMA100945':''}

#Create Dataframe
df = pd.DataFrame(data)

def fillSMA(df, xtime)
    #extract time as 0915
    xtime = xtime.strftime('%H%M')
    
    df_len = len(df)
    i=0
    
    while i < df_len:
        
        #Assign SMA to each row of DF (for each symbol/stock)
        df.loc[i, 'SMA10'+ xtime] = 1546
        
    #End of While Loop
#End of fillSMA


starttime= time(hour=9, minute=15, second=0)
endtime = time(hour=15, minute=15, second=0)

while time.time() <= endtime:
    fillSMA(df, time.time())
    time.sleep(900)