You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pd.Series更新图表线条时触发.str访问器类型错误求助

问题:图表线条.update方法报错:Can only use .str accessor with string values!

我尝试用.update方法更新图表线条对象,已确认pd.Series格式符合文档要求,但始终无法正常运行。终端输出:

Received avg_series_high: 2024-03-05 3693.797625 dtype: float64

随后触发错误:

Error occurred in update_chart_lines: Can only use .str accessor with string values!

此前使用pandas从未遇到该错误,网上相关案例显示可能Series名称未被自动识别为字符串。附上相关异步代码,恳请提供解决思路或指引。

代码示例:更新图表线条的异步函数

async def update_chart_lines(self, avg_line_high, avg_line_low, avg_line_high2, avg_line_low2, queue):
        print("Starting update_chart_lines function")
        avg_data = None

        while True:
            try:
                avg_data = await queue.get()

                if avg_data is not None and 'date' in avg_data:

                    avg_data['date'] = pd.to_datetime(avg_data['date'], unit='ms')
                    # Create a pandas Series for each line
                    avg_series_high_data = pd.Series([avg_data['avg_last_candles_high']], index=[avg_data['date']])
                    avg_series_low_data = pd.Series([avg_data['avg_last_candles_low']], index=[avg_data['date']])
                    avg_series_high2_data = pd.Series([avg_data['avg_last_candles_high2']], index=[avg_data['date']])
                    avg_series_low2_data = pd.Series([avg_data['avg_last_candles_low2']], index=[avg_data['date']])

                    print(f"Received avg_series_high: {avg_series_high_data}")

                    # Update each line with the corresponding pandas Series
                    avg_line_high.update(avg_series_high_data)
                    avg_line_low.update(avg_series_low_data)
                    avg_line_high2.update(avg_series_high2_data)
                    avg_line_low2.update(avg_series_low2_data)
                else:
                    print("No avg candle ticks to process.")
                    continue
            except Exception as e:
                print(f"Error occurred in update_chart_lines: {e}")

持续生成数据并发送至队列的异步函数

async def last_candles_cont(df, n, timeframe, queue):

  timeframe = timeframe

  """ print(f"Calculating average of last {n} candles for {timeframe} timeframe") """

  multipliers = {
    '1d': 1.025,
    '4h': 1.015,
    '1h': 1.01,
    '15m': 1.005,
    '5m': 1.001,
    '1m': 1.00
  }

  while True:
    try:  

      avg_data = None
          
      tick= await queue.get()

      print(f"Received tick: {tick}")

      tick_df = pd.DataFrame(tick, index=[0])

      df = pd.concat([df, tick_df], ignore_index=True)

      """ df['diff'] = df['close'] - df['close'].shift(1)
      print (df['diff'])

      # Calculate the rate of change as a percentage
      df['roc'] = df['diff'] / df['close'].shift(1) * 100
      print (df['roc']) """

      multiplier = multipliers[timeframe]

      df['avg_last_candles_high'] = (df['high']*multiplier).shift(1).rolling(n).mean()
      df['avg_last_candles_low'] = (df['low']/multiplier).shift(1).rolling(n).mean()

      df['avg_last_candles_high2'] = (df['high']*multiplier).rolling(n).mean()
      df['avg_last_candles_low2'] = (df['low']/multiplier).rolling(n).mean()

      avg_data = pd.DataFrame({
              'date': (df['date']),
              'avg_last_candles_high': df['avg_last_candles_high'],
              'avg_last_candles_low': df['avg_last_candles_low'],
              'avg_last_candles_high2': df['avg_last_candles_high2'],
              'avg_last_candles_low2': df['avg_last_candles_low2'],
          }).dropna()
      
      current_candle = avg_data.tail(1).squeeze()
      print(f"Current candle: {current_candle}")
      # Put the current candle into the queue
      await queue.put(current_candle)

      await asyncio.sleep(1)

      """ return avg_data """

    except Exception as e:
      print(f"Error in avg candle function: {e}")
      return pd.DataFrame()  # Return an empty DataFrame in case of error

解决思路

  • 检查Series索引类型:你创建的Series使用datetime类型作为索引,但图表库的.update方法可能要求索引为字符串格式。可以将datetime索引转换为字符串,比如:
    date_str = avg_data['date'].dt.strftime('%Y-%m-%d %H:%M:%S')
    avg_series_high_data = pd.Series([avg_data['avg_last_candles_high']], index=[date_str])
    
  • 修正队列数据的判断逻辑:last_candles_cont中用squeeze()将单行DataFrame转为Series,所以update_chart_lines里的'date' in avg_data实际是检查Series的索引标签,应改为:
    if avg_data is not None and 'date' in avg_data.index:
    
  • 排查空值问题:虽然用了dropna(),但rolling计算在数据不足时仍可能产生NaN,确保传递到队列的current_candle无空值,空值可能触发意外的字符串操作。
  • 确认图表库的.update要求:不同图表库的更新方法对输入格式有差异,比如部分库要求Series的索引必须是字符串,或者值的类型严格匹配。可以打印avg_series_high_data.index.dtype确认索引类型,强制转换后再测试。

内容的提问来源于stack exchange,提问作者Yan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:35:12