【问题标题】:How to declare and assign Python Dataframe 'column name' as variable of two strings?如何将 Python Dataframe 的“列名”声明和分配为两个字符串的变量?
【发布时间】:2021-09-16 05:55:47
【问题描述】:

我有一个包含 'SMA100915''SMA500915' 等列的股票数据框... df['SMA100915'] 是在 09:15 时具有股票简单移动平均值的列,同样我正在使用 df 上的 while 循环收集不同列中的所有 SMA 以进行分析。此循环计划从 09:15 开始每 15 分钟运行一次

现在的问题是,

  1. 如何动态生成 df 列的名称为 'SMA10' + 0915 并分配 SMA 值?
  2. 将 SMA 值分配给 df 中股票的每一行到 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
RELIANCE 2127 2129 2126.39

【问题讨论】:

  • 您尝试过的代码中的i 是什么?您是否已经在每一行上循环了一个循环?不清楚您想对第二部分问题做什么:2. Assign the SMA .... 请详细说明。

标签: python pandas dataframe dynamic while-loop


【解决方案1】:

您可以向DataFrame 添加一列,就像向字典添加键/值一样,即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

【讨论】:

    【解决方案2】:
    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)
    

    【讨论】:

      猜你喜欢
      • 2012-11-02
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 2018-08-12
      • 2016-01-06
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      相关资源
      最近更新 更多