精华内容
下载资源
问答
  • 通过zip函数压缩了多个dataframe形成字典, 现在要提取字典中所有dataframe的某一列,该怎么做</p>
  • 上一篇文章介绍了怎样使用tushare金融数据源,统计近10天上映...这一篇文章,通过使用Pandas DataFrame对象内置的数据处理功能,以数据分析人员的方式编码,将上一篇文章中的代码行数压缩了50%,体现了Python和Pa...

    上一篇文章介绍了怎样使用tushare金融数据源,统计近10天上映电影的观影人数走势图。程序员上手写Python,常带有Java风格。比如通过Dict字典模拟HashMap,定义各种数据结构,代码中随处可见多层for循环等,虽然运行速度确实快了点,但没有体现出Python长于验证想法的高生产力特质。
    本文通过使用Pandas DataFrame对象内置的数据处理功能,以数据分析人员的视角编码(类似Matlab代码风格),将上一篇文章的代码行数压缩了50%,体现了Python和Pandas的表达能力。

    为什么选择 DataFrame:

    tushare金融数据源接口返回的多数是Pandas的DataFrame对象,以电影票房接口为例,返回指定日期当天的DataFrame格式如下,包括在映所有影片的名称,票房,上映天数等信息。如果查询最近10天的票房信息,下面的DF对象会有10个:

    Index MovieName BoxOffice MovieDay
    0 狮子王 1600 3
    1 蜘蛛侠 1500 12
    2 千与千寻 300 20

    绘图函数Matplotlib.plt(xList,yList)的输入参数,横坐标是日期列表,纵坐标是对应日期的票房列表,就是按从左到右,从旧到新的顺序排列最近几天的票房数据,所以我希望的DataFrame格式如下表。只要按行遍历,就可以定位并取出DF对象的一行记录,作为绘图函数的纵坐标输入参数:

    Index MovieName 07-11 07-12 07-13
    0 狮子王 Nan 900 1600
    1 蜘蛛侠 1300 1200 1500
    2 千与千寻 500 Nan 300

    那么怎么跨越上面两个DF对象的格式鸿沟呢?根据官网描述,可使用DataFrame对象内置的列合并函数Merge实现:

    DataFrame.merge(right, how=‘inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=(’_x’, ‘_y’), copy=True, indicator=False, validate=None)
    Merge DataFrame or named Series objects with a database-style join.
    The join is done on columns or indexes. If joining columns on columns, the DataFrame indexes will be ignored. Otherwise if joining indexes on indexes or indexes on a column or columns, the index will be passed on.

    官网介绍Merge函数的输入参数how,可以设置为inner, left, right, outer四种类型,完全等同我们所熟悉的SQL内连接,左连接,右连接和全连接。

    how : {‘left’, ‘right’, ‘outer’, ‘inner’}, default ‘inner’
    Type of merge to be performed.
    left: use only keys from left frame, similar to a SQL left outer join; preserve key order.
    right: use only keys from right frame, similar to a SQL right outer join; preserve key order.
    outer: use union of keys from both frames, similar to a SQL full outer join; sort keys lexicographically.
    inner: use intersection of keys from both frames, similar to a SQL inner join; preserve the order of the left keys.

    根据介绍tushare接口返回的单日期多个DF对象,通过merge函数,指定连接方式how=outer外连接,关联字段on=MovieName,可以合并为多日期单个DF对象,用于Matplotlib画图。下面是按日期导出的2个DF对象:

    Index MovieName 【关联字段】 07-11
    0 爱宠大机密2 300
    1 蜘蛛侠 1300
    2 千与千寻 500
    Index MovieName 【关联字段】 07-12
    0 狮子王 900
    1 蜘蛛侠 1200
    2 扫毒2 800

    然后用Merge函数把上面2个DF对象全连接成1个DF对象:

    Index MovieName 07-11 07-12
    0 狮子王 Nan 900
    1 蜘蛛侠 1300 1200
    2 千与千寻 500 Nan
    3 扫毒2 Nan 800
    4 爱宠大机密2 300 Nan

    需要注意的是,合并后在原来两个DF中不存在的Cell值,都会自动填上Nan。类似的DF合并函数还有按行合并的Concat,append,join等,具体可参考官方文档。

    话不多说上代码:

    下面代码用到DataFrame的6类数据处理函数,具体用法参考Pandas官网

    • 行列数获取shape,
    • 多列截取[‘colName1’,‘colName2’],
    • 局部行列截取loc[index,[‘colName1’]],iloc[index, col_index],
    • 元素提取at[index,[‘colName1’]],
    • 指定列重名rename(columns={‘oldColName’:‘newColName’}),
    • 多个DataFrame对象全连接merge
    import tushare as ts, datetime
    import pandas as pd
    import matplotlib.pyplot as plt
    
    def getDateList(days):
    # 输入参数days表示指定向前取的天数
        date_list = [] # 返回列表形如['2019-06-29',...]
        for i in range(days,0,-1): #从days开始每次减1
            strDate = (datetime.date.today() \
                - datetime.timedelta(days=i)) \
                .strftime('%Y-%m-%d')  
            # 日期格式:YYYY-MM-DD
            date_list.append(strDate)
        return date_list
    
    def getMovieData(date_list):# 入参['2019-06-29',...]
        firstDate = date_list[0] #得到最早一天
        dfMovie = ts.day_boxoffice(firstDate) #得到票房
        dfResult = dfMovie[['MovieName','BoxOffice']]
        # 将dataframe字段BoxOffice重名为当天日期
        dfResult = dfResult.rename(\
            columns={'BoxOffice':firstDate})
        # 遍历从第二天开始的日期列表
        for date in date_list[1:]:
            dfMovie = ts.day_boxoffice(date) # 取指定日票房
            df = dfMovie[['MovieName','BoxOffice']]# 取2列
            # 将dataframe字段BoxOffice重名为当天日期
            df = df.rename(columns={'BoxOffice':date})
            # 把遍历到的当天df全连接out_join到结果df中
            dfResult = pd.merge(dfResult, df,\
                how='outer', on='MovieName')# on是外键
        return dfResult
        
    # 根据入参dataframe对象绘图
    def drawLine(dfResult,date_list):
        plt.rcParams['font.sans-serif']\
            =['SimHei'] # 用于正常显示中文标签
        # 遍历结果dataframe的每一行,即遍历每部电影
        for i in range(dfResult.shape[0]):# 0-行数 1-列数
            movieName = dfResult.at[i,'MovieName']
            # 取出第i行第0个name字段右侧的所有字段,转为list
            boxOfficeList = dfResult.iloc[i,1:].tolist()
            # 将list中的字符元素全部转换为float元素
            boxOfficeList = list(\
            	map(float, boxOfficeList))
            dateList = [d[5:] for d in date_list]# 剔除年份
            # 最近上映的每一部电影都绘制一条折线
            plt.plot(dateList, boxOfficeList,\
                label=movieName)
    
        plt.legend() # 添加折线说明,loc默认best
        plt.ylabel('票房(万)')
        plt.title('电影票房走势图')
        plt.show() # 显示图形
        
    if __name__ == '__main__':
        days = 10 # 经测试旧版tushare不提供10天前数据
        # 得到最近几天日期字符列表,格式:YYYY-MM-DD
        date_list = getDateList(days)
        # 返回dataframe对象,行是电影,列是指定日期票房
        dfResult = getMovieData(date_list)
        # 根据函数getMovieData返回的dataframe对象绘图
        drawLine(dfResult, date_list)
    

    代码行数从之前的115行减少到62行,运行后显示如下:
    电影票房走势图


    往期文章:
    怎样让Python推荐电影 - 初试tushare
    怎样让Python处理邮件 - 规则轮询
    怎样让Python处理邮件 - 初试exchangelib

    展开全文
  • 可以看成是解压和压缩的区别,zip相当与压缩 zip(*)相当于解压。 举例说明: x=[“a”,“1”] y=[“b”,“2”] z = list(zip(x,y)) print (list(zip(x,y))) print (list(zip(*z))) 结果为: [
    import numpy as np
    lst=df['A'].values.tolist()
    dict(zip(*np.unique(lst, return_counts=True)))
    

    python zip()和zip(*)的区别

    可以看成是解压和压缩的区别,zip相当与压缩 zip(*)相当于解压。

    举例说明:

    x=[“a”,“1”]
    y=[“b”,“2”]
    z = list(zip(x,y))
    print (list(zip(x,y)))
    print (list(zip(*z)))

    结果为:

    [(‘a’, ‘b’), (‘1’, ‘2’)]

    https://blog.csdn.net/u010211479/article/details/78490610

    展开全文
  • # 合并dataFrame并重置index pd.concat([df1, df2], ignore_index=True) # 读pickle文件,指定压缩 df = pd.read_pickle("/xxx/df.pkl", compression='gzip') # 去重 df.drop_duplicates() # 输出到excel、pickle df...

    Pandas一些常用功能:

    # 合并dataFrame并重置index
    pd.concat([df1, df2], ignore_index=True)
    # 读pickle文件,指定压缩
    df = pd.read_pickle("/xxx/df.pkl", compression='gzip')
    # 去重
    df.drop_duplicates()
    # 输出到excel、pickle
    df.to_excel("/xxx/df.xlsx", index=False)
    df.to_pickle("/xxx/df.pkl", compression='gzip')
    

    pandas DataFrame筛选数据的常用方法:

    提取dataFrame中的某两列数据,
    条件为:某列数据符合name的,并设置其中一列数据为index(这样就变成了Series)
    df = df[['START_TIME', 'VALUE_CALC']][(df['NE_NAME'] == name)].set_index('START_TIME')
    
    新生成的Series是datetimeIndex,支持切片筛选
    df = df[pastday:yesterday]
    
    获取index转成list 
    X = list(df.index)
    
    获取values转成list
    Y = list(['VALUE_CALC'])
    
    多个筛选dataFrame的条件可以用 & | 连接,将每个条件用()括起来
    提取df中 起始时间列 >=start(日期时间字符串)\
    并且 结束时间列 <=end(日期时间字符串)\
    并且 名字列 中所有在namelist中的数据
    (.isin()方法:传入一个list,筛选出列中符合list中元素的所有行,这里namelist是列表[])
    df[(df['START_TIME'] >= start) & (df['END_TIME'] <= end) & (df['NE_NAME'].isin(namelist))]
    
    展开全文
  • NumPy.npy与pandas DataFrame

    千次阅读 2017-01-16 14:39:08
    用CSV格式来保存文件是个不错的主意,因为大部分程序设计语言和...而后来发明的一些文件格式,如zip、bzip和gzip等,压缩率则有了显著提升 首先导入模块: In [1]: import numpy as np In [2]: import pandas as pd
    用CSV格式来保存文件是个不错的主意,因为大部分程序设计语言和应用程序都能处理这种格式,所以交流起来非常方便。然而这种格式的存储效率不是很高,原因是CSV及其他纯文本格式中含有大量空白符;而后来发明的一些文件格式,如zip、bzip和gzip等,压缩率则有了显著提升
    
    首先导入模块:
    In [1]: import numpy as np
    
    In [2]: import pandas as pd
    
    In [3]: from tempfile import NamedTemporaryFile
    
    In [4]: from os.path import getsize
    
    这里我们将使用Python标准的NamedTemporaryFile来存储数据,这些临时文件随后会自动删除。
    接下来获取CSV文件格式的大小:
    In [5]: np.random.seed(42)
    
    In [6]: a = np.random.randn(365,4)
    
    In [7]: tmpf = NamedTemporaryFile()
    
    In [8]: np.savetxt(tmpf,a,delimiter=',')
    
    In [9]: print("Size CSV file",getsize(tmpf.name))
    Size CSV file 36693
    
    下面首先以NumPy.npy格式来保存该数组,随后载入内存,并检查数组的形状以及.npy文件的大小:
    In [10]: tmpf = NamedTemporaryFile()
    
    In [11]: np.save(tmpf,a)
    
    In [12]: tmpf.seek(0)
    Out[12]: 0
    
    In [13]: loaded = np.load(tmpf)
    
    In [14]: print("Shape",loaded.shape)
    Shape (365, 4)
    
    In [15]: print("Size .npy file",getsize(tmpf.name))
    Size .npy file 11760
    
    .npy文件的大小只有CSV文件的三分之一左右。实际上,利用Python可以存储任意复杂的数据结构。也可以序列化格式来存储pandas的DataFrame或者Series数据结构
    
    在Python中,pickle是将Python对象存储到磁盘或其他介质时采用的一种格式,这个格式化的过程叫做序列化。之后,我们可以从存储器中重建该Python对象,这个逆过程称为反序列化。并非所有的Python对象都能够序列化;不过借助诸如dill之列的模块,可以将更多种类的Python对象序列化。
    
    首先用前面生成的NumPy数组创建一个DataFame,接着用to_pickle()方法将其写入一个pickle对象中,然后用read_pickle()函数从这个pickle对象中检索该DataFrame:
    In [16]: tmpf.name
    Out[16]: '/tmp/tmpyy06safp'
    
    In [17]: df = pd.DataFrame(a)
    
    In [18]: df.to_pickle(tmpf.name)    是将DataFrame()写入到/tmp/tmpyy06safp中
    
    In [19]: print("Size pickled dataframes",getsize(tmpf.name))
    Size pickled dataframes 12250
    
    In [20]: tmpf.name
    Out[20]: '/tmp/tmpyy06safp'
    
    In [21]: print("DF from pickle\n",pd.read_pickle(tmpf.name))
    DF from pickle
                 0         1         2         3
    0    0.496714 -0.138264  0.647689  1.523030
    1   -0.234153 -0.234137  1.579213  0.767435
    2   -0.469474  0.542560 -0.463418 -0.465730
    3    0.241962 -1.913280 -1.724918 -0.562288
    4   -1.012831  0.314247 -0.908024 -1.412304
    5    1.465649 -0.225776  0.067528 -1.424748
    6   -0.544383  0.110923 -1.150994  0.375698
    7   -0.600639 -0.291694 -0.601707  1.852278
    8   -0.013497 -1.057711  0.822545 -1.220844
    9    0.208864 -1.959670 -1.328186  0.196861
    10   0.738467  0.171368 -0.115648 -0.301104
    11  -1.478522 -0.719844 -0.460639  1.057122
    12   0.343618 -1.763040  0.324084 -0.385082
    13  -0.676922  0.611676  1.031000  0.931280
    14  -0.839218 -0.309212  0.331263  0.975545
    15  -0.479174 -0.185659 -1.106335 -1.196207
    16   0.812526  1.356240 -0.072010  1.003533
    17   0.361636 -0.645120  0.361396  1.538037
    18  -0.035826  1.564644 -2.619745  0.821903
    19   0.087047 -0.299007  0.091761 -1.987569
    20  -0.219672  0.357113  1.477894 -0.518270
    21  -0.808494 -0.501757  0.915402  0.328751
    22  -0.529760  0.513267  0.097078  0.968645
    23  -0.702053 -0.327662 -0.392108 -1.463515
    24   0.296120  0.261055  0.005113 -0.234587
    25  -1.415371 -0.420645 -0.342715 -0.802277
    26  -0.161286  0.404051  1.886186  0.174578
    27   0.257550 -0.074446 -1.918771 -0.026514
    28   0.060230  2.463242 -0.192361  0.301547
    29  -0.034712 -1.168678  1.142823  0.751933
    ..        ...       ...       ...       ...
    335  0.160574  0.003046  0.436938  1.190646
    336  0.949554 -1.484898 -2.553921  0.934320
    337 -1.366879 -0.224765 -1.170113 -1.801980
    338  0.541463  0.759155 -0.576510 -2.591042
    339 -0.546244  0.391804 -1.478912  0.183360
    340 -0.015310  0.579291  0.119580 -0.973069
    341  1.196572 -0.158530 -0.027305 -0.933268
    342 -0.443282 -0.884803 -0.172946  1.711708
    343 -1.371901 -1.613561  1.471170 -0.209324
    344 -0.669073  1.039905 -0.605616  1.826010
    345  0.677926 -0.487911  2.157308 -0.605715
    346  0.742095  0.299293  1.301741  1.561511
    347  0.032004 -0.753418  0.459972 -0.677715
    348  2.013387  0.136535 -0.365322  0.184680
    349 -1.347126 -0.971614  1.200414 -0.656894
    350 -1.046911  0.536653  1.185704  0.718953
    351  0.996048 -0.756795 -1.421811  1.501334
    352 -0.322680 -0.250833  1.328194  0.556230
    353  0.455888  2.165002 -0.643518  0.927840
    354  0.057013  0.268592  1.528468  0.507836
    355  0.538296  1.072507 -0.364953 -0.839210
    356 -1.044809 -1.966357  2.056207 -1.103208
    357 -0.221254 -0.276813  0.307407  0.815737
    358  0.860473 -0.583077 -0.167122  0.282580
    359 -0.248691  1.607346  0.490975  0.734878
    360  0.662881  1.173474  0.181022 -1.296832
    361  0.399688 -0.651357 -0.528617  0.586364
    362  1.238283  0.021272  0.308833  1.702215
    363  0.240753  2.601683  0.565510 -1.760763
    364  0.753342  0.381158  1.289753  0.673181
    
    [365 rows x 4 columns]
    
    

    展开全文
  • 而后来发明的一些文件格式,如zip、bzip和gzip等,压缩率则有了显著提升。 首先导入模块: In [1]: import numpy as np In [2]: import pandas as pd In [3]: from tempfile import NamedTemporaryFile In [4]: ...
  • Pandas有两个最主要也是最重要的数据结构: Series 和 DataFrame 1. 导包 In [ 1 ] : import numpy as np In [ 2 ] : import pandas as pd 2. 创建DataFrame对象 2.1 通过 numpy 数组(array)...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 139
精华内容 55
关键字:

dataframe压缩