Mpld3: "TypeError: *** غير قابل للتسلسل JSON" عند استخدام xticks

تم إنشاؤها على ١١ مايو ٢٠١٤  ·  29تعليقات  ·  مصدر: mpld3/mpld3

لقد صادفت هذا الخطأ عندما كنت أتعامل مع مؤامرة الباندا ، عندما أستخدم وسيطة xticks .

إثبات المفهوم هنا:
http://nbviewer.ipython.org/gist/edvakf/a47a41ace10afbd891ff
(تعديل http://pandas.pydata.org/pandas-docs/stable/visualization.html)

التعليق الأكثر فائدة

أصلحت هذا عن طريق إضافة الخط

elif isinstance(obj, (numpy.ndarray,)):
        return obj.tolist()

إلى /mpld3/_display.py: NumpyEncoder

ال 29 كومينتر

آه - يبدو أن mplexporter يفترض بشكل غير صحيح أن xticks عبارة عن قائمة. هذا خطأ.

في غضون ذلك ، إذا قمت بتحويل xticks يدويًا إلى قائمة ، فيجب أن تعمل.

في الواقع ، هذا ليس هو الحال. وهذا يعني أن ما يلي يعمل بشكل جيد:

fig = plt.figure()
ax = fig.add_subplot(111, xticks=np.arange(11))
ax.plot([0, 10], [0, 10], '-k')
mpld3.show()

تقوم Pandas بعمل شيء غريب هنا بعلاماتها: الخطأ يقول أن 2000 غير قابل للتسلسل ، وهذا جنون. هل تمتلك Pandas نوعًا من أنواع الفاصلة العائمة المضمنة غير القابلة للتسلسل؟

إنه ليس رقم 2000 ، إنه العام. مرحبًا بك في الجحيم datetime .
(تحرير 19/6/2014: يبدو أنني كنت مخطئًا بشأن مشكلة datetime ...)

آه ... لست متأكدًا من أفضل طريقة للتعامل مع ذلك. أي أفكار؟

هل يساعد استخدام to_json في pandas ؟

http://pandas.pydata.org/pandas-docs/dev/io.html#date -handling

هل يساعد استخدام to_json في الباندا؟

ربما ، ولكن بعد ذلك سيتعين علينا إجراء بيان try ... except للعديد من الأشياء داخل الكود (على سبيل المثال ، افعل ذلك بطريقة واحدة إذا كانت القيمة متغير Pandas ، افعل بطريقة أخرى) ، ثم تأكد من أن تسميات المحور الموجودة على جانب جافا سكريبت يمكنها التعامل مع أي بنية JSON يقرر Pandas إخراجها. أفضل عدم إضافة هذا المستوى من التعقيد ، لأنه يبدو كحل هش للغاية وكابوس صيانة.

أرى. يتلخص هذا في عدم قدرة Python على كشف طريقة تسلسل json للفئة التي يحددها المستخدم بعد ذلك. يمكنك إغلاق هذه القضية.

يجب أن نتركه مفتوحًا ... قد تكون هناك طريقة أفضل للتعامل مع هذا. سأفكر بشأنه.

انتظر لحظة ، يبدو أن هذا يعمل بشكل جيد بالنسبة لي في Python 2.7. هل يمكن أن يكون مشكلة Python3 فقط؟

In [56]: matplotlib.__version__
Out[56]: '1.3.1'

In [57]: pandas.__version__
Out[57]: '0.13.1'

اهلا جميعا،
لست متأكدًا مما إذا كان مرتبطًا ، ولكني أواجه مشكلة مماثلة عند محاولة رسم هذا الرسم البياني البحري: http://www.stanford.edu/~mwaskom/software/seaborn/examples/many_facets.html

mpld3.fig_to_html(grid.fig, 'test.html')
/home/vagrant/graph/local/lib/python2.7/site-packages/mpld3/mplexporter/exporter.py:82: UserWarni ng: Blended transforms not yet supported. Zoom behavior may not work as expected.
  warnings.warn("Blended transforms not yet supported. "
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/vagrant/graph/local/lib/python2.7/site-packages/mpld3/_display.py", line 236, in fig_to_html
    figure_json=json.dumps(figure_json),
  File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python2.7/json/encoder.py", line 178, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: 0 is not JSON serializable

تكمن المشكلة في أن أرقام numpy.int64 تُستخدم داخليًا ، وأن هذه الأرقام غير قابلة للتسلسل بشكل افتراضي.
يجب أن يكون هناك رابط في المكتبة لتوفير json.JSONEncoder للتعامل مع هذا الأمر.

فقط لتوفير مساحة للأفكار:

لدي نفس المشكلة ، لكنني متصل بـ Django ، وهو ما أستخدمه كخلفية للمشروع الذي أستخدمه في المشروع حيث أستخدم mpld3.

حاولت إجراء تسلسل لمصفوفة numpy وحصلت على هذا الخطأ ، عند استخدام django 1.6. لقد خفضت تصنيفي إلى 1.5 وهو يعمل. لقد وجدت السبب في أنه بدءًا من 1.6 وما فوق ، يتم إجراء التسلسل باستخدام json ، بينما من 1.5 وما دون ، عبر Pickle.

آمل أن يساعدك هذا يا رفاق في العثور على المشكلة.

ميد فينليج هيلسن ،
جيراردو دي لا ريفا إسبينوزا
Høgskolelektor
Høgskolen i Gjøvik
البريد الإلكتروني: جيراردو. [email protected]
موبيل: +47950 13322

في 19 حزيران (يونيو) 2014 ، الساعة 16:56 ، كتب lvasseur [email protected] :

اهلا جميعا،
لست متأكدًا مما إذا كان مرتبطًا ، ولكني أواجه مشكلة مماثلة عند محاولة رسم هذا الرسم البياني البحري: http://www.stanford.edu/~mwaskom/software/seaborn/examples/many_facets.html

mpld3.fig_to_html (grid.fig، "test.html")
/home/vagrant/graph/local/lib/python2.7/site-packages/mpld3/mplexporter/exporter.py:82: UserWarni ng: التحويلات الممزوجة غير مدعومة بعد. قد لا يعمل سلوك التكبير / التصغير كما هو متوقع.
warnings.warn ("التحويلات الممزوجة غير مدعومة بعد."
Traceback (آخر مكالمة أخيرة):
ملف ""، السطر 1 ، في
ملف "/home/vagrant/graph/local/lib/python2.7/site-packages/mpld3/_display.py" ، السطر 236 ، في fig_to_html
figure_json = json.dumps (figure_json) ،
ملف "/usr/lib/python2.7/json/__init__.py" ، السطر 231 ، في عمليات التفريغ
إرجاع _default_encoder.encode (obj)
ملف "/usr/lib/python2.7/json/encoder.py" ، السطر 201 ، في الترميز
chunks = self.iterencode (o، _one_shot = True)
ملف "/usr/lib/python2.7/json/encoder.py" ، السطر 264 ، في رمز iterencode
إرجاع _iterencode (o، 0)
ملف "/usr/lib/python2.7/json/encoder.py" ، السطر 178 ، افتراضيًا
رفع TypeError (repr (o) + "غير قابل للتسلسل JSON")
TypeError: 0 غير قابل للتسلسل JSON
تكمن المشكلة في أن أرقام numpy.int64 تُستخدم داخليًا ، وأن هذه الأرقام غير قابلة للتسلسل بشكل افتراضي.
يجب أن يكون هناك رابط في المكتبة لتوفير json.JSONEncoder للتعامل مع هذا الأمر.

-
قم بالرد على هذا البريد الإلكتروني مباشرة أو قم بعرضه على GitHub.

لمعلوماتك،

    from json import JSONEncoder
    class MyEncoder(JSONEncoder):
        def default(self, obj):
            if isinstance(obj, numpy.int64):
                return int(obj)
            return JSONEncoder.default(self, obj)

    return template.render(figid=json.dumps(figid),
                           d3_url=d3_url,
                           mpld3_url=mpld3_url,
                           figure_json=json.dumps(figure_json, cls=MyEncoder),
                           extra_css=extra_css,
                           extra_js=extra_js)

يحل المشكلة في /mpld3/_display.py: fig_to_html

ليس لدي وقت للمحاولة الآن ، لكن يبدو أن هذه مشكلة والاتجاه الصحيح للحل. تجعلني المستندات json.dump أعتقد أن هناك حلًا أخف وزنًا قليلاً مع الخيار default ، على الرغم من أنه قد يكون أقصر سطرًا واحدًا في النهاية. هل أنت مستعد للقيام بطلب سحب؟

كنت أتوقع أن يتم إصلاح هذا بواسطة PR # 213 ، لكن دفتر ipython من المنشور الأصلي لا يزال لا يعمل بالنسبة لي. هل يمكن للبعض الآخر أن يجربها؟

سأجرب هذا في وقت ما

ما زلت مرتبكًا بهذا ... لست متأكدًا مما إذا كان # 213 قد أصلح أي شيء هنا. أنا قادر على تسلسل كائنات int64 بدونها ...

هل تم حل هذا؟
لا يمكنني الحصول على fig_to_html شخصية مولدة للباندا (أحصل على TypeError: 0 is not JSON serializable ). يتم إنشاء الشكل بشكل جيد.
عندما أعدت المحاولة باستخدام plt.bar ، أحصل أيضًا على الخطأ إذا استخدمت yticks مع سلاسل مخصصة.

كيفية حل؟

لست متأكدا. يبدو أن هناك مشكلة مع تسميات المحاور كونها إصدارات غير قابلة للتسلسل من الأعداد الصحيحة. إذا اكتشفت أي شيء ، فأخبرنا بذلك.

أردت فقط الإشارة إلى أنني تلقيت هذا الخطأ عند استخدام

dates = df.Date.apply(lambda dt: dt.strftime('%B')[:3] + dt.strftime(' %d')).values
plt.xticks(x, dates, rotation='vertical')

ولكن ليس مع

ax.set_xticklabels(dates, rotation='vertical')

أتمنى أن يساعدك هذا.

تحرير: عند إجراء فحص إضافي ، بينما لا ينتج عن الإصدار الأخير خطأ ، لا يتم تعيين علامات xticks للرقم الناتج بالفعل.

تحرير 2: علامات التجزئة الخاصة بي السيئة ، المكتشفة للتو غير مدعومة (رقم 22).

FWIW ، استخدام boxplots يمكن أن يعيد حل المشكلة:

import numpy as np, mpld3
np.random.seed(937)
data = np.random.lognormal(size=(37, 4), mean=1.5, sigma=1.75)
labels = list('ABCD')
fs = 10  # fontsize

fig, axes = plt.subplots(1, 1, figsize=(6, 6)) 
axes.boxplot(data, labels=labels)
axes.set_title('Default', fontsize=fs)

html_fig = mppld3.fig_to_html(fig)

على وجه التحديد ، هذه هي الإصدارات من تجميد النقطة

cycler==0.10.0
Jinja2==2.8
MarkupSafe==0.23
matplotlib==1.5.1
mpld3==0.2
numpy==1.10.4
pandas==0.17.1
ptyprocess==0.5.1
pyparsing==2.1.0
python-dateutil==2.5.0
pytz==2015.7
six==1.10.0
wheel==0.29.0

لـ Python 3.4.3.

يبدو أن التصحيح الذي اقترحه lvasseur يعمل على حل المشكلة ، على الرغم من أنني لا أعرف ما إذا كان هذا هو الحل.

لجعل المثال الأصلي يعمل ، استخدم [float (x) لـ x في النطاق (2000،2002)] بدلاً من np.arange (2000،2002،1).

لست متأكدًا مما إذا كان مرتبطًا ، ولكني أواجه مشكلة مماثلة عند محاولة رسم هذا الرسم البياني البحري: http://www.stanford.edu/~mwaskom/software/seaborn/examples/many_facets.html

لقد تلقيت نفس الخطأ أثناء محاولة استخدام mtld3.display(fig) لشخصية barplot seaborn:

TypeError: 0 غير قابل للتسلسل JSON

يمكن لأي شخص أن يجعل مؤامرات البحر مع mpld3؟

يبدو أن هذا يحدث بسبب وجود nan في قيم البيانات. إذا كسرت عند _display.py:243nan بـ None في figure_json dكت ، أحصل على الناتج المتوقع.

تحرير: أعلاه لا يبدو أنه يحل المشكلة (كنت أختبر في مترجم التصحيح ، حيث يعمل ولكن ليس عند استخدام mpld3).
لذلك ، لا يعمل عرض sns.barplot() ، بينما عرض plt.bar() يعمل بشكل جيد. لم أتمكن من رؤية اختلاف واضح في الأشكال من كلا المؤتمرين ، لكن تم توفير التصحيح (https://github.com/mpld3/mpld3/pull/213) حل المشكلة.

أصلحت هذا عن طريق إضافة الخط

elif isinstance(obj, (numpy.ndarray,)):
        return obj.tolist()

إلى /mpld3/_display.py: NumpyEncoder

شكرا لكjaklinger هذا عملت !!!

jaklinger ، مرحبًا ، شكرًا على اقتراحك ، إنه يعمل بشكل مثالي! أردت فقط أن أوضح شيئًا واحدًا - لقد قمت بتحويل المصفوفة الرقمية إلى قاموس وحاولت إعادتها ولكنها كانت تلقي بالخطأ "تعويم 32 غير قابل للتسلسل json" ، على الرغم من عدم وجود مشكلة في القاموس وطباعته وفحصه. فقط باستخدام طريقة tolist () الخاصة بك ، تم تحويل المصفوفة إلى قائمة python.
السابق: [100. 0. 0. 0. 0.]
مع tolist: [100.0، 0.0، 0.0، 0.0، 0.0] وعاد بشكل مثالي.
إذن ما هي المشكلة بالضبط؟ شكرا كثيرا مسبقا.

@ padmaksha18 لست متأكدًا بنسبة 100٪ مما

حولت مجموعة numpy إلى قاموس

لكن (باختصار) النوعان numpy و python ليسا متماثلين ( float32 يختلف عن float ؛ و array ليس هو نفسه list ، إلخ) وفئة JSONEncoder فقط "تسمح" python . لذا ... الهدف من هذه الوظيفة (التي تحتوي على الإصلاح الجديد) هو تحويل الإدخال obj إلى معادلاته الأصلية python .

jaklinger : مرحبًا جويل ، شكرًا جزيلاً مرة أخرى. من خلال التحويل إلى قاموس ، كنت أعني فقط أنني أخذت صفيفتين من هذا القبيل وشكلت زوجًا من قيم المفاتيح ، آسف لعدم شرحها بوضوح. شكرًا جزيلاً لتوضيح هذا الشيء بالنسبة لي ، يجب أن أقوم بتحويله إلى نوع بيثون أصلي أولاً وكانت هذه هي المشكلة. أردت فقط أن أوضح شيئًا آخر ، مثل إذا لم تقم بتجسيد قاموس وحاول إعادته كما هو ، فهل سيظهر فصل jsonencoder في الصورة بعد ذلك؟ شكرا جزيلا!

تثبيت نقطة "git + https://github.com/javadba/mpld3@display_fix "

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات