使用 pandas 添加一列数据

import jqdata
import pandas as pd
from pandas import DataFrame
import numpy as np

security = ['000001.XSHE', '000040.XSHE', '000099.XSHE'];
h = get_price(security, start_date='2020-03-26', end_date='2020-03-27', frequency='1m', fields=None, skip_paused=False, fq='pre')
h = h.transpose(2,1,0);
date='2020-03-26';

for code in security:
    q = query(valuation).filter(valuation.code == code)
    c = get_fundamentals(q, date=None, statDate=None) 
    capita_field = c['circulating_cap'][0]
    print(capita_field)
    h[code] = DataFrame(h[code])
    h[code]['circulating_cap'] = capita_field
    print(h[code].head())

for code in security:
    print(code)
    print(h[code].head())

各种位老师!
我在第一个循环时打印数据,感觉不对,但从遍历的结果看是三组数据中有二组新增一列是成功的。
但是到了第二个循环打印出来的结果却是只有最后一组数据有新增一列数据,结果如下:
错误日志截图
复制内容如下:
2020-03-25 00:00:00 - INFO - 1940575.25

2020-03-25 00:00:00 - INFO - close high low money open volume
2020-03-26 09:31:00 12.75 12.78 12.74 21562519 12.78 1689100
2020-03-26 09:32:00 12.79 12.79 12.74 8336756 12.75 653100
2020-03-26 09:33:00 12.80 12.80 12.78 9250124 12.78 723100
2020-03-26 09:34:00 12.80 12.80 12.78 3501228 12.78 273700
2020-03-26 09:35:00 12.82 12.82 12.79 8527458 12.79 665800

                 circulating_cap  

2020-03-26 09:31:00 1940575.25
2020-03-26 09:32:00 1940575.25
2020-03-26 09:33:00 1940575.25
2020-03-26 09:34:00 1940575.25
2020-03-26 09:35:00 1940575.25

2020-03-25 00:00:00 - INFO - 106034.0703

2020-03-25 00:00:00 - INFO - close high low money open volume circulating_cap
2020-03-26 09:31:00 3.54 3.55 3.53 1976123 3.54 558900 106034.0703
2020-03-26 09:32:00 3.53 3.54 3.53 603107 3.53 170800 106034.0703
2020-03-26 09:33:00 3.54 3.54 3.53 461279 3.53 130600 106034.0703
2020-03-26 09:34:00 3.55 3.55 3.53 608014 3.54 171700 106034.0703
2020-03-26 09:35:00 3.55 3.55 3.54 312608 3.55 88200 106034.0703

2020-03-25 00:00:00 - INFO - 60607.043

2020-03-25 00:00:00 - INFO - close high low money open volume circulating_cap
2020-03-26 09:31:00 6.34 6.36 6.33 1521427 6.35 239700 60607.043
2020-03-26 09:32:00 6.35 6.36 6.34 292984 6.34 46100 60607.043
2020-03-26 09:33:00 6.36 6.36 6.35 245919 6.35 38700 60607.043
2020-03-26 09:34:00 6.35 6.36 6.34 346777 6.35 54600 60607.043
2020-03-26 09:35:00 6.38 6.39 6.36 760788 6.36 119300 60607.043

但是到了第二个循环打印出来的结果却是只有最后一组数据有新增一列数据,结果如下:
2020-03-25 00:00:00 - INFO - 000001.XSHE

2020-03-25 00:00:00 - INFO - close high low money open volume
2020-03-26 09:31:00 12.75 12.78 12.74 21562519 12.78 1689100
2020-03-26 09:32:00 12.79 12.79 12.74 8336756 12.75 653100
2020-03-26 09:33:00 12.80 12.80 12.78 9250124 12.78 723100
2020-03-26 09:34:00 12.80 12.80 12.78 3501228 12.78 273700
2020-03-26 09:35:00 12.82 12.82 12.79 8527458 12.79 665800

2020-03-25 00:00:00 - INFO - 000040.XSHE

2020-03-25 00:00:00 - INFO - close high low money open volume
2020-03-26 09:31:00 3.54 3.55 3.53 1976123 3.54 558900
2020-03-26 09:32:00 3.53 3.54 3.53 603107 3.53 170800
2020-03-26 09:33:00 3.54 3.54 3.53 461279 3.53 130600
2020-03-26 09:34:00 3.55 3.55 3.53 608014 3.54 171700
2020-03-26 09:35:00 3.55 3.55 3.54 312608 3.55 88200

2020-03-25 00:00:00 - INFO - 000099.XSHE

2020-03-25 00:00:00 - INFO - close high low money open volume circulating_cap
2020-03-26 09:31:00 6.34 6.36 6.33 1521427 6.35 239700 60607.043
2020-03-26 09:32:00 6.35 6.36 6.34 292984 6.34 46100 60607.043
2020-03-26 09:33:00 6.36 6.36 6.35 245919 6.35 38700 60607.043
2020-03-26 09:34:00 6.35 6.36 6.34 346777 6.35 54600 60607.043
2020-03-26 09:35:00 6.38 6.39 6.36 760788 6.36 119300 60607.043
想不出错误在哪?请各位老师帮助

讨论数量: 13
Jason990420

我觉得语法内容应该没错,可能是你的问题问错了
也许时间点也不对 ...
你看一下你提供的内容和代码的顺序不同 ?!
例如代码中再加个时间啊,或索引指示是相同替换的输出,还有先后顺序。

4年前 评论
昨夜 (楼主) 4年前

file 从图中可以看到 新增一列自带的时间格式同原表的时间格式有冲突,运行虽没有报错,但新增一列的结果同之前还是一样,如果要完整的时间索引,应该是要取原表的,可是不知道如何取?百度上都是二维的方式,虽然我通过循环将低到二维,print(h[code][:].index()) 但在取的时候报错。

4年前 评论

file 这里我改变原数据格式,虽未报错,但结果不对

file 上面我又尝试新一列空值,虽未报错,但结果应该是存在问题,我猜想应该我新增一列的方法存在问题

4年前 评论

在我修改新增字段的名字后,新增一列的结果应该是正确了,只是不知道为什么?这是什么规则?新增一列的字段名 只能是一个字母吗?如下图:

file
当新增列数据不为None 时,又出现前面类似问题,
Python

capita_field = c['circulating_cap'][0]
print(type(capita_field))

这里打印的数据类型

2020-03-25 00:00:00 - INFO  - <type 'numpy.float64'>

会不会是这个数据类型引起的问题呢?
尝试打印数据类型,结果如下:

import jqdata
import pandas as pd
import numpy as np
from pandas import DataFrame

# 获取历史数据
security = ['000001.XSHE', '000040.XSHE', '000099.XSHE'];
h = get_bars(security, count=3, unit='1m', fields=['date','open','high','low','close','volume','money'], include_now=False)
#print(h)

# 开盘前整理好历史数据(将股本数据同对应的个股数据合并)
for code in security:
    print(type(h[code][:1]['open']))
    q = query(valuation).filter(valuation.code == code)  # 查询 流通股本 circulating_cap
    c = get_fundamentals(q, date=None, statDate=None) 
    capita_field = c['circulating_cap'][0]
    print(type(capita_field))

返回的打印结果如下:
2020-03-25 00:00:00 - INFO  - <type 'numpy.ndarray'>

2020-03-25 00:00:00 - INFO  - <type 'numpy.float64'>

2020-03-25 00:00:00 - INFO  - <type 'numpy.ndarray'>

2020-03-25 00:00:00 - INFO  - <type 'numpy.float64'>

2020-03-25 00:00:00 - INFO  - <type 'numpy.ndarray'>

2020-03-25 00:00:00 - INFO  - <type 'numpy.float64'>
4年前 评论
Jason990420

代码中再加个时间啊,或索引指示是相同替换的输出,还有先后顺序。 我的意思不是改变资料结构, 而是增加打印内容, 让你可以更清楚是哪一时间打印的哪一笔资料而已.

我简单试了一下, 没啥问题

import pandas as pd
from pandas import DataFrame
import numpy as np
import datetime

a = DataFrame([[i+j for i in range(3)] for j in range(6)], columns=['a', 'b', 'c'])
b = DataFrame([[i-j for i in range(3)] for j in range(6)], columns=['a', 'b', 'c'])
c = DataFrame([[i*j for i in range(3)] for j in range(6)], columns=['a', 'b', 'c'])
h = {'Market #1':a, 'Market #2':b, 'Market #3':c}
s = h.keys()
v = [11,12,13,14,15,16]

for code in s:
    h[code] = DataFrame(h[code])
    h[code]['column d'] = v
    print(h[code].head(), 'Loop#1', code, datetime.datetime.now())

for code in s:
    print(h[code].head(), 'Loop#2', code, datetime.datetime.now())
   a  b  c  column d
0  0  1  2        11
1  1  2  3        12
2  2  3  4        13
3  3  4  5        14
4  4  5  6        15 Loop#1 Market #1 2020-03-29 10:34:52.164692
   a  b  c  column d
0  0  1  2        11
1 -1  0  1        12
2 -2 -1  0        13
3 -3 -2 -1        14
4 -4 -3 -2        15 Loop#1 Market #2 2020-03-29 10:34:52.188195
   a  b  c  column d
0  0  0  0        11
1  0  1  2        12
2  0  2  4        13
3  0  3  6        14
4  0  4  8        15 Loop#1 Market #3 2020-03-29 10:34:52.213172
   a  b  c  column d
0  0  1  2        11
1  1  2  3        12
2  2  3  4        13
3  3  4  5        14
4  4  5  6        15 Loop#2 Market #1 2020-03-29 10:34:52.246073
   a  b  c  column d
0  0  1  2        11
1 -1  0  1        12
2 -2 -1  0        13
3 -3 -2 -1        14
4 -4 -3 -2        15 Loop#2 Market #2 2020-03-29 10:34:52.271043
   a  b  c  column d
0  0  0  0        11
1  0  1  2        12
2  0  2  4        13
3  0  3  6        14
4  0  4  8        15 Loop#2 Market #3 2020-03-29 10:34:52.296976
4年前 评论
Jason990420

最好的方式还是要

  1. 有一段完整, 能跑的代码
  2. 可以完整代表当时执行状态

至少想回答你问题的人, 可以试试, 喔, 真的会出问题? 再去找答案.

谁也不知道私底下你又有什么线程在跑, 什么时间又改变了什么数据 ? 或也许不同的数据结构出错 ?

4年前 评论

@Jason990420 正在理解你的代码,但我感觉重点在你 代码 V 这个位置,如果我直接赋值,是正确的(像你这个V的位置),但我这里是取的是一个表的数据,然后在另一个表中新增一列并添加此数据,此时就出了问题。我上面打印出了它的类型我怀疑是数据类型引起的

4年前 评论

@Jason990420 你好,下图你可以看到,直接赋值是没有问题的 file

4年前 评论
Jason990420

不会啊, 我改了 v=100, 还是OK, numpy 就会全部元素都是100.

4年前 评论

@Jason990420 你可以再看看这张图,这里就出错了

file

4年前 评论

@Jason990420 我是说直接赋值是没有问题的,如果可以,我可以将我调试代码登录密码发你

4年前 评论
Jason990420

嗯, 私信给我, 我找找问题

4年前 评论

@Jason990420 谢谢,我已经发你了,非常感谢!

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!