2023年7月20日 星期四

【Python交易程式開發現場54】接收商品報價(2) | 將訂閱商品資訊存入記憶體

結論:

1. 用dict建dataframe時, 要設index

df = pd.DataFrame(dictRepStock, index=[0])

2. 於pandas加一筆data要用concat, 

df_RepStock = pd.concat([df_RepStock, df], axis=0) 


1.檢查接收到的商品報價之資料型態: 結果為Tuple



def twTuple_2_Str(twTuple):
    strTuple=[str(t) for t in twTuple]
    return ','.join(strTuple)


2. tuple要先轉成list





  1. ref: Pandas常見基本操作: 

Create Empty dataframe:

# import pandas library as pd
import pandas as pd
 
df = pd.DataFrame()
 
print(df)
  1. 3. 客製化Pandas DataFrame的資料索引及欄位名稱,可以分別利用index及columns屬性(Attribute)來達成,如下範例:

    1. import pandas as pd
    2.  
    3.  
    4. grades = {
    5. "name": ["Mike", "Sherry", "Cindy", "John"],
    6. "math": [80, 75, 93, 86],
    7. "chinese": [63, 90, 85, 70]
    8. }
    9.  
    10. df = pd.DataFrame(grades)
    11. df.index = ["s1", "s2", "s3", "s4"] #自訂索引值
    12. df.columns = ["student_name", "math_score", "chinese_score"] #自訂欄位名稱
    13. print(df)

  2. 4. append():新增一筆或一列的資料,透過傳入字典(Dictionary)來指定各欄位的值,並且會回傳一個新的Pandas DataFrame資料集,如下範例:

  3. new_df = df.append({
  4. "name": "Henry",
  5. "math": 60,
  6. "chinese": 62
  7. }, ignore_index=True)

    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 = {'name':pStock.bstrStockName, 'close': str(pStock.nClose/math.pow(10,pStock.sDecimal))}
        import pandas as pd
        global df_RepStock
        df_RepStock = df_RepStock.append(dictRepStock)


    d:\tw-skcom-python-43\all\call_twMain.py:519: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
    df_RepStock = df_RepStock.append(dictRepStock)

    # 使用 concat 合併 axis=0 為直向合併 
    res = pd.concat([df1,df2,df3],axis=0)

  1.     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 = {'name':pStock.bstrStockName, 'close': str(pStock.nClose/math.pow(10,pStock.sDecimal))}

            global df_RepStock
            df_RepStock = pd.concat([df_RepStock, dictRepStock], axis=0)
            #df_dictRepStock = df_dictRepStock.append(dictRepStock)
            pass

TypeError: cannot concatenate object of type '<class 'dict'>'; only Series and DataFrame objs are valid  

    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 = {'name':pStock.bstrStockName, 'close': str(pStock.nClose/math.pow(10,pStock.sDecimal))}
        df = pd.DataFrame(dictRepStock)
        global df_RepStock
        df_RepStock = pd.concat([df_RepStock, df], axis=0)
        #df_dictRepStock = df_dictRepStock.append(dictRepStock)
        pass




File "d:\tw-skcom-python-43\all\.venv\lib\site-packages\pandas\core\internals\construction.py", line 119, in arrays_to_mgr
index = _extract_index(arrays)
File "d:\tw-skcom-python-43\all\.venv\lib\site-packages\pandas\core\internals\construction.py", line 657, in _extract_index
raise ValueError("If using all scalar values, you must pass an index")
ValueError: If using all scalar values, you must pass an index



https://blog.csdn.net/weixin_39750084/article/details/81429037

    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 = {'name':pStock.bstrStockName, '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)
        #df_dictRepStock = df_dictRepStock.append(dictRepStock)
        pass
  1. 成功解決問題

  2. 5. 修改Pandas DataFrame資料

    利用Pandas DataFrame的at[]及iat[]取得所要修改的單一值後,來進行資料內容的修改,如下範例:

    1. import pandas as pd
    2.  
    3.  
    4. grades = {
    5. "name": ["Mike", "Sherry", "Cindy", "John"],
    6. "math": [80, 75, 93, 86],
    7. "chinese": [63, 90, 85, 70]
    8. }
    9.  
    10. df = pd.DataFrame(grades)
    11.  
    12. print("原來的df")
    13. print(df)
    14.  
    15. print("=================================")
    16.  
    17. df.at[1, "math"] = 100 #修改索引值為1的math欄位資料
    18. df.iat[1, 0] = "Larry" #修改索引值為1的第一個欄位資料
    19. print("修改後的df")
    20. print(df)


  1. 5. pandas, 用list加新資料, 新增一行(新增一資料欄)

  2. 在 Pandas 中 [] 運算子方法新增新列
  3. 在 Pandas 中 df.insert() 方法可新增新列
  4. 在 Pandas 中 df.assign() 方法可新增新列
  5. 在 Pandas 中 df.loc() 方法新增新列

    1. import pandas as pd
      data = [
          ['Ali',
           'Azmat',
           '30'],
          ['Sharukh',
           'Khan',
           '40'],
          ['Linus',
           'Torvalds',
           '70']
      ]
      df = pd.DataFrame(data,columns=['First','Last','Age'])
      print(df)
      

      輸出:

           First      Last Age
      0      Ali     Azmat  30
      1  Sharukh      Khan  40
      2    Linus  Torvalds  70
      df = df.assign(city = ['Lahore','Dehli','New York'],
      score = [20,30,40])
      df.loc[:,'city'] = ['Lahore','Dehli','New York']
      df.insert(3,"city",['Lahore','Dehli','New York'],True)
      city = ['Lahore','Dehli','New York']
      df['city'] = city














沒有留言:

張貼留言

prog-0318

test test1 Written with StackEdit .