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