来自Pandas datafram的Python NVD3

2024-09-28 01:27:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道如何使用python-nvd3 wrapper从Pandas数据帧在Python中创建NVD3图表(stackedArea)。一个带有整数列表的演示没有问题。在

我的初始数据包括一系列日期和一系列值(浮点):

type(df['Value'])
Out[85]: pandas.core.series.Series

type(df['Start'])
Out[86]: pandas.core.series.Series

type(df['Value'][1])
Out[96]: numpy.float64

type(df['Start'][1])
Out[102]: pandas.tslib.Timestamp

我将序列和时间戳('Start')转换为字符串。在

^{pr2}$

我转换时间戳对象字符串的原因是,当我直接提供它时,我在Django中收到以下错误消息:

Timestamp('2016-02-05 00:00:00') is not JSON serializable

然而,图表仍然是空的。两个列表的长度相似。在

初始数据:

df['Start'].dt.strftime('%Y-%m-%d %H:%M:%S').tolist()
Out[104]: 
['2016-02-05 00:00:00',
 '2016-02-05 01:00:00',
 '2016-02-05 02:00:00',
 '2016-02-05 03:00:00',
 '2016-02-05 04:00:00',
 '2016-02-05 05:00:00',
 '2016-02-05 06:00:00',
 '2016-02-05 07:00:00',
 '2016-02-05 08:00:00',
 '2016-02-05 09:00:00',
 '2016-02-05 10:00:00',
 '2016-02-05 11:00:00',
 '2016-02-05 12:00:00',
 '2016-02-05 13:00:00',
 '2016-02-05 14:00:00',
 '2016-02-05 15:00:00',
 '2016-02-05 16:00:00',
 '2016-02-05 17:00:00',
 '2016-02-05 18:00:00',
 '2016-02-05 19:00:00',
 '2016-02-05 20:00:00',
 '2016-02-05 21:00:00',
 '2016-02-05 22:00:00',
 '2016-02-05 23:00:00',
 '2016-02-05 00:00:00',
 '2016-02-05 01:00:00',
 '2016-02-05 02:00:00',
 '2016-02-05 03:00:00',
 '2016-02-05 04:00:00',
 '2016-02-05 05:00:00',
 '2016-02-05 06:00:00',
 '2016-02-05 07:00:00',
 '2016-02-05 08:00:00',
 '2016-02-05 09:00:00',
 '2016-02-05 10:00:00',
 '2016-02-05 11:00:00',
 '2016-02-05 12:00:00',
 '2016-02-05 13:00:00',
 '2016-02-05 14:00:00',
 '2016-02-05 15:00:00',
 '2016-02-05 16:00:00',
 '2016-02-05 17:00:00',
 '2016-02-05 18:00:00',
 '2016-02-05 19:00:00',
 '2016-02-05 20:00:00',
 '2016-02-05 21:00:00',
 '2016-02-05 22:00:00',
 '2016-02-05 23:00:00']


df['Value'].values.tolist()
Out[105]: 
[7330.75,
 7127.5,
 6994.75,
 7116.75,
 7636.0,
 8329.5,
 9193.0,
 10152.5,
 11091.5,
 11851.75,
 12329.75,
 12674.0,
 12800.75,
 12707.75,
 12641.75,
 12783.5,
 13210.0,
 13593.5,
 13842.75,
 13869.5,
 13901.0,
 13984.0,
 13986.5,
 13998.5,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 11.25,
 355.0,
 1256.5,
 2398.75,
 3148.25,
 3171.5,
 2814.25,
 2200.0,
 1319.0,
 440.5,
 17.25,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0]

作为Django项目一部分的相关规范: 视图.py在

from django.shortcuts import render_to_response, RequestContext
from datetime import date, timedelta
from random import randint

from random import shuffle, randint
from itertools import islice
from django.utils.translation import ugettext_lazy as _

import random
import requests
from requests_ntlm import HttpNtlmAuth
import time
import datetime
from json2html import *
import json
from pandas.io.json import json_normalize
import pandas as pd
import numpy as np


def demo_stackedareachart(request):
    """
    stackedareachart page
    """
    input_start = datetime.date.today() + datetime.timedelta(days=1)
    input_end = datetime.date.today() + datetime.timedelta(days=2)

    parameters={'start':'today+1','end':'today+1','timeZone':'UCT','resolution':'Hour','filterTimeBy':'ValueTime', 'dataPointsToReturn':'All','getSamples':'false'}

    seriesID = 2194
    seriesID2 = 2193

    session = requests.Session()
    session.auth = HttpNtlmAuth('XXXX\\XXXX','XXXXXXXXXXXX', session)
    session.headers={"content-type":"application/json"}
    r = session.get('XXXXXXXXXXX' + str(seriesID) + "%2C" + str(seriesID2), params=parameters, stream=False)

    js = r.json()
    df = json_normalize(js, 'DataPoints',['SeriesId','SamplingTime'])
    df['SamplingTime'] = pd.to_datetime(pd.Series(df['SamplingTime']))
    df['Start'] = pd.to_datetime(pd.Series(df['Start']))

    nb_element = 150

    xdata = df['Start'].values.astype('int64')
    xdata = map(long, xdata)

    ydata = df['Value'].values.tolist()

    extra_serie1 = {"tooltip": {"y_start": "", "y_end": " balls"}}

    chartdata = {
        'x': xdata,
        'name1': 'series 1', 'y1': ydata, 'extra1': extra_serie1,
        # 'name2': 'series 2', 'y2': ydata2, 'extra2': extra_serie2,
    }

    charttype = "stackedAreaChart"
    chartcontainer = 'stackedareachart_container'  # container name
    data = {
        'charttype': charttype,
        'chartdata': chartdata,
        'chartcontainer': chartcontainer,
        'extra': {
            'x_is_date': True,
            'x_axis_format': '%d %m %Y %H %M %S',
            'tag_script_js': True,
            'jquery_on_ready': False,
        },
    }
    return render_to_response('stackedareachart.html', data)

在stackedareachart.html在

{% extends "__base.html" %}


 {% block content %}

    {% load static %}


{% load nvd3_tags %}
<head>
    {# Jquery CDN : Needed when using jquery_on_ready=True #}
    <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
    {% include_chart_jscss %}
    {% load_chart charttype chartdata chartcontainer extra %}
</head>
<body>
    {% include_container chartcontainer 400 600 %}
</body>



{% endblock %}

更新1: 通过将时间戳转换为int64,然后转换为long,我取得了进展。剩下的唯一问题是,它返回相同的值,而不管日期是什么,结果是这个图。As you can see the data is stacked "on-top" rather then side-by-side

更新2: 所以我假设这一切都归结为正确地将df['Start']转换为正确的整数。但我一直在寻找正确的语法。到目前为止我得到的是:

xdata = df['Start'].dt.to_pydatetime()
xdata = map(lambda x: int(time.mktime(q[x].timetuple())*1000), q)

但第二个命令我失败了。在

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

Tags: tofromimportjsonpandasdfdatetimesession

热门问题