如何声明和分配 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 分钟 运行
现在的问题是,
- 如何动态生成 df 列的名称作为
'SMA10' + 0915
并分配 SMA 值?
- 将 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)
我有一个 Stocks DataFrame,其列为 'SMA100915'
、'SMA500915'
等等...
df['SMA100915']
是一列,在 09:15 小时具有股票的简单移动平均值,同样,我正在收集不同列中的所有 SMA 以用于分析目的,使用 while
循环 df
.此循环计划从 09:15 小时
现在的问题是,
- 如何动态生成 df 列的名称作为
'SMA10' + 0915
并分配 SMA 值? - 将 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)