Open yuetianshiye opened 4 months ago
感谢您的反馈!初步看起来是数据存储的问题。我会仔细看一下,有可能会问一些问题并请您提供更多的信息以帮助复现bug。
首先注意到您在database.py
中增加了encoding='utf-8'
,这样做是仅仅为了解决get_table_overview()
的错误吗?还是其他函数也有同样报错?如果是,哪些函数曾经有报错过?
我尝试复现您遇到的bug,认为它应该跟数据源中存储的数据有关,如果数据源中存储的数据存在重复的index
(主键值),就会出现您遇到的错误,参见下面的例子:
# 一组没有重复index的数据可以unstack():
>>> df
c d
a b
1 1 1 6
2 2 7
3 3 8
2 1 4 9
2 5 0
>>> df.unstack()
c d
b 1 2 3 1 2 3
a
1 1.0 2.0 3.0 6.0 7.0 8.0
2 4.0 5.0 NaN 9.0 0.0 NaN
# 但是如果df存在重复的主键值(index),再unstack就会报错:
>>> df2
c d
a b
1 1 1 9
2 2 8
3 3 7 # 注意这一行的index 为 (1, 3)
2 1 4 6
2 5 5
1 3 6 4 # 注意这一行的index 同样为 (1, 3)
# 接下来就报错了:
>>> df2.unstack()
Traceback (most recent call last):
File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevconsole.py", line 364, in runcode
coro = func()
File "<input>", line 1, in <module>
File "/opt/anaconda3/envs/py39/lib/python3.9/site-packages/pandas/core/frame.py", line 9928, in unstack
result = unstack(self, level, fill_value, sort)
File "/opt/anaconda3/envs/py39/lib/python3.9/site-packages/pandas/core/reshape/reshape.py", line 504, in unstack
return _unstack_frame(obj, level, fill_value=fill_value, sort=sort)
File "/opt/anaconda3/envs/py39/lib/python3.9/site-packages/pandas/core/reshape/reshape.py", line 529, in _unstack_frame
unstacker = _Unstacker(
File "/opt/anaconda3/envs/py39/lib/python3.9/site-packages/pandas/core/reshape/reshape.py", line 154, in __init__
self._make_selectors()
File "/opt/anaconda3/envs/py39/lib/python3.9/site-packages/pandas/core/reshape/reshape.py", line 210, in _make_selectors
raise ValueError("Index contains duplicate entries, cannot reshape")
ValueError: Index contains duplicate entries, cannot reshape
接下来,问题的关键在于数据源中存储的数据为何会出现重复的index
。
我在qteasy
中定义数据表的同时对每张表定义了主键 Primary Key
,一般来说是日期时间或者股票代码。正常来说,往数据源中写入数据时,系统会自动去掉主键值重复的数据,已确保数据不会出现重复。如果您使用的是Mysql
作为数据源,这一点肯定是能保证的。不过我注意到您使用的是csv文件存储数据,那么理论上是有可能在数据的index
中存在重复值的。
目前我无法确定是写入数据表的函数中存在bug,还是您曾经手动操作并新增过数据,因此,我需要您的协助以解决此问题:
1,建议您暂时性在database.py文件的第4676行做如下修改:
4676 try:
4677 new_df = htyp_series.unstack(level=0)
4678 except:
4679 import pdb; pdb.set_trace()
上面的代码会在new_df = htyp_series.unstack(level=0)
行执行发生问题时启动调试器,启动调试器后,您可以进入调试模式并查看htyp_series
的值:
(如果您不熟悉pdb
,在进入调试模式后系统会显示命令提示符(pdb):
,这时您可以输入变量名,即可显示变量的值:完成后输入q
即可退出调试模式)
(pdb): htyp_series
# 此时应该会显示htyp_series的值
2,请告诉我htyp_series
的值,它能告诉我是哪一张数据表的哪一个字段存在问题
3,请用Excel打开出问题的csv文件,检查是否存在重复的键值
通过上面的操作,我们可能可以确定错误发生的原因,我会进一步检查,希望能够尽快找到根本原因,非常感谢您的协助!
好的,麻烦您了!database.py中的增加encoding是为了处理get_table_overview的报错,目前没发现其他函数有类似问题。
---- 回复的原邮件 ---- | 发件人 | Jackie @.> | | 日期 | 2024年06月15日 06:21 | | 收件人 | @.> | | 抄送至 | @.>@.> | | 主题 | Re: [shepherdpp/qteasy] 运行α选股策略时报错 (Issue #167) |
感谢您的反馈!初步看起来是数据存储的问题。我会仔细看一下,有可能会问一些问题并请您提供更多的信息以帮助复现bug。 首先注意到您在database.py中增加了encoding='utf-8',这样做是仅仅为了解决get_table_overview()的错误吗?还是其他函数也有同样报错?如果是,哪些函数曾经有报错过?
— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>
您好!我在运行α选股策略时出现如下报错,请问该如何修改?
**Environment
qteasy
:1.2.11]qt.get_table_overview()
]ps:运行qt.get_table_overview()报错UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 195: illegal multibyte sequence,将database.py中2930行with open(file_path_name, 'r') as fp:改为with open(file_path_name, 'r',encoding='utf-8') as fp: