2023年7月21日 星期五

【Python交易程式開發現場55】接收商品報價(3) | 將訂閱商品資訊存入pandas | 單一商品

 pandas內之商品報價更新 (Line 530)


【結論】
1. 產生空的dataframe: df_RepStock = pd.DataFrame()

2. 判断DataFrame是否为空: df.empty

3. 判断DataFrame中是否已有某商品:
x=df_RepStock.index[df_RepStock['id']=='TXO17100H3'].to_list()

4. 將某商品加入DataFrame中:
df_RepStock = pd.concat([df_RepStock, df], axis=0)

5.更改某商品在DataFrame中的值: 
df=df.set_index('id')
df.loc['id','close']=value


4.使用条件表达式进行查询
##查询上证指数收盘<3000点的,且成交额少于1000亿(amount单位为千元)的日子,显示全部的列
df.loc[(df['close'] < 3000) & (df['amount'] < 100000000),:]
https://zhuanlan.zhihu.com/p/138037895

df.loc['id','close']=value

https://blog.csdn.net/RPG_Zero/article/details/109190053


df.['name']==value


























用 pandas.DataFrame.index() 獲取行的索引

如果你想只查詢滿足作為引數傳遞的布林條件的 DataFrame 的匹配索引,pandas.DataFrame.index() 是最簡單的實現方式。

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randint(1,20,size=(20, 4)), columns=list('ABCD'))

print (df.index[df['B'] == 19].tolist())

用精確字串匹配獲取行的索引

print (df.index[(df['Name'] == 'blue')].tolist())
print ('\n')
print (df.loc[df['Name'] == 'blue'])
print ('\n')
print (df.loc[(df['Name'] == 'charlie') & (df['Type'] =='Raptors')])

https://www.delftstack.com/zh-tw/howto/python-pandas/pandas-get-index-of-row/











https://blog.csdn.net/weixin_43977640/article/details/109909787


    def OnNotifyQuoteLONG(self, sMarketNo, nStockidx):    #ctw # 3-【查詢】回報    
        pStock = sk.SKSTOCKLONG()
        m_nCode = skQ.SKQuoteLib_GetStockByIndexLONG(sMarketNo, nStockidx, pStock)
        strMsg = '代碼:',pStock.bstrStockNo,'--名稱:',pStock.bstrStockName,'--開盤價:',str(pStock.nOpen/math.pow(10,pStock.sDecimal)),'--最高:',\
            str(pStock.nHigh/math.pow(10,pStock.sDecimal)),'--最低:',\
            str(pStock.nLow/math.pow(10,pStock.sDecimal)),'--成交價:',str(pStock.nClose/math.pow(10,pStock.sDecimal))\
            ,'--總量:',str(pStock.nTQty)
               
        twStrMsg=twTuple_2_Str(strMsg)
        send.run(twStrMsg)  #發射Signal訊號

        dictRepStock = {'id':pStock.bstrStockNo, 'close': str(pStock.nClose/math.pow(10,pStock.sDecimal))}
        df = pd.DataFrame(dictRepStock, index=[0])
        global df_RepStock
        #df_RepStock = pd.concat([df_RepStock, df], axis=0)
        x=df_RepStock.index[df_RepStock['id']=='TXO17100H3'].to_list()
        print(df_RepStock)
        #df_dictRepStock = df_dictRepStock.append(dictRepStock)
        pass

    x=df_RepStock.index[df_RepStock['id']=='TXO17100H3'].to_list()

  File "d:\tw-skcom-python-43\all\.venv\lib\site-packages\pandas\core\frame.py", line 3805, in __getitem__    

    indexer = self.columns.get_loc(key)

  File "d:\tw-skcom-python-43\all\.venv\lib\site-packages\pandas\core\indexes\base.py", line 3802, in get_loc 

    raise KeyError(key) from err

KeyError: 'id'


















可以使用 df.empty 来判断一个Pandas DataFrame 是否为空。 如果DataFrame 为空,则返回True,否则返回False。 还可以使用 df.shape[0] 来判断DataFrame 中是否有行,如果有行,则返回True,否则返回False。


    def OnNotifyQuoteLONG(self, sMarketNo, nStockidx):    #ctw # 3-【查詢】回報    
        pStock = sk.SKSTOCKLONG()
        m_nCode = skQ.SKQuoteLib_GetStockByIndexLONG(sMarketNo, nStockidx, pStock)
        strMsg = '代碼:',pStock.bstrStockNo,'--名稱:',pStock.bstrStockName,'--開盤價:',str(pStock.nOpen/math.pow(10,pStock.sDecimal)),'--最高:',\
            str(pStock.nHigh/math.pow(10,pStock.sDecimal)),'--最低:',\
            str(pStock.nLow/math.pow(10,pStock.sDecimal)),'--成交價:',str(pStock.nClose/math.pow(10,pStock.sDecimal))\
            ,'--總量:',str(pStock.nTQty)
               
        twStrMsg=twTuple_2_Str(strMsg)
        send.run(twStrMsg)  #發射Signal訊號

        dictRepStock = {'id':pStock.bstrStockNo, 'close': str(pStock.nClose/math.pow(10,pStock.sDecimal))}
        df = pd.DataFrame(dictRepStock, index=[0])
        global df_RepStock

        if df_RepStock.empty:
            df_RepStock = pd.concat([df_RepStock, df], axis=0)
        else:    
            x=df_RepStock.index[df_RepStock['id']=='TXO17100H3'].to_list()

        print(df_RepStock)

成功解決問題

















5.更改某商品在DataFrame中的值:
df=df.set_index('id')
df.loc['id','close']=value









https://blog.csdn.net/RPG_Zero/article/details/109190053












File "d:\tw-skcom-python-43\all\call_twMain.py", line 534, in OnNotifyQuoteLONG

x=df_RepStock.index[df_RepStock['id']=='TXO17100H3'].to_list()

File "d:\tw-skcom-python-43\all\.venv\lib\site-packages\pandas\core\frame.py", line 3805, in __getitem__

indexer = self.columns.get_loc(key)

File "d:\tw-skcom-python-43\all\.venv\lib\site-packages\pandas\core\indexes\base.py", line 3802, in get_loc

raise KeyError(key) from err

KeyError: 'id'

        dictRepStock = {'id':pStock.bstrStockNo, 'close': str(pStock.nClose/math.pow(10,pStock.sDecimal))}
        df = pd.DataFrame(dictRepStock, index=[0])
        df = df.set_index('id')
       
        global df_RepStock

        if df_RepStock.empty:
            df_RepStock = pd.concat([df_RepStock, df], axis=0)
        else:    
            x=df_RepStock.index[df_RepStock['id']=='TXO17100H3'].to_list()

        print(df_RepStock)


Terminal:

--- 把信号绑定到槽函数 ---
1-登入
OnReplyMessage 回報正常 SKReplyLib_OnReplyMessage:Announcement callback.
登入成功
2-連線
3-查詢
           close
id
TXO17100H3   0.0

Debug Console 不認得:

df_RepStock['id']

'id'此時已成為index, 不能算是資料欄了..


5.更改某商品在DataFrame中的值:
df=df.set_index('id')
df.loc['id','close']=value








如何取出df中之close?


Debug Console:

df.loc["TXO17100H3","close"]

'170.0'

成功..

    def OnNotifyQuoteLONG(self, sMarketNo, nStockidx):    #ctw # 3-【查詢】回報    
        pStock = sk.SKSTOCKLONG()
        m_nCode = skQ.SKQuoteLib_GetStockByIndexLONG(sMarketNo, nStockidx, pStock)
        strMsg = '代碼:',pStock.bstrStockNo,'--名稱:',pStock.bstrStockName,'--開盤價:',str(pStock.nOpen/math.pow(10,pStock.sDecimal)),'--最高:',\
            str(pStock.nHigh/math.pow(10,pStock.sDecimal)),'--最低:',\
            str(pStock.nLow/math.pow(10,pStock.sDecimal)),'--成交價:',str(pStock.nClose/math.pow(10,pStock.sDecimal))\
            ,'--總量:',str(pStock.nTQty)
               
        twStrMsg=twTuple_2_Str(strMsg)
        send.run(twStrMsg)  #發射Signal訊號

        dictRepStock = {'id':pStock.bstrStockNo, 'close': str(pStock.nClose/math.pow(10,pStock.sDecimal))}
        df = pd.DataFrame(dictRepStock, index=[0])
        df = df.set_index('id')
       
        global df_RepStock

        if df_RepStock.empty:
            df_RepStock = pd.concat([df_RepStock, df], axis=0)
        else:    
            #x=df_RepStock.index[df_RepStock['id']=='TXO17100H3'].to_list()
            df_RepStock.loc['TXO17100H3', 'close'] = df.loc["TXO17100H3","close"]

        print(df_RepStock)

成功..






沒有留言:

張貼留言

prog-0318

test test1 Written with StackEdit .