使用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
相关产品推荐
相关产品推荐

