Как объявить и назначить фрейм данных Python «имя столбца» в качестве переменной из двух строк?

#python #pandas #dataframe #dynamic #while-loop

Вопрос:

У меня есть фрейм данных акций со столбцами as 'SMA100915' 'SMA500915' и так далее… df['SMA100915'] это столбец, имеющий простое скользящее среднее значение акций в 09:15, аналогично, я собираю все SMA в разных столбцах для целей анализа, используя while цикл df . Этот цикл планируется запускать каждые 15 минут с 09: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()

«символ» ‘SMA100915’ ‘SMA100930’ ‘SMA100945’
ИНФЫ 1562.97 1564 1565.65
опора 2127 2129 2126.39

Комментарии:

1. Что i в вашем проверенном коде ? У вас уже есть петля, зацикливающаяся на каждом ряду ? Неясно, что вы хотите сделать со 2-й частью вопросов: 2. Assign the SMA .... пожалуйста, уточните.

Ответ №1:

Вы можете добавить столбец в a 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)