目录
文件系统操作
合并某个目录下所有txt格式文件(这个代码也是参考别人的代码进行了一些修改):
import os
import os.path
import pandas as pd
def MergeTxt(filepath, outfile):
k = open(filepath + outfile, 'a+', encoding='utf-8')
for parent, dirnames, filenames in os.walk(filepath):
for filepath in filenames:
txtPath = os.path.join(parent, filepath)
f = open(txtPath, encoding='utf-8')
k.write(f.read()+"\n")
k.close()
print("文件写入完成")
if __name__=='__main__':
filepath="./agriculture_index/"
outfile = "total1.txt"
MergeTxt(filepath, outfile)
List创建与转换
1.List创建方法
- list()
- 通过**[ ]**直接赋值给变量,如:lis = [1,2,3,4]
- 列表推导式解析,语法格式如下:
list = [expression for var in range]
应用实例:
绘制地图时需要传入数组对,即传入格式为:[(‘湖南’,5),(’浙江‘,4)]
mrkts = [(i, int(j)) for i,j in zip(y2.index, y2.values)]
2.List元素类型转换
列表中字符串变为整型(浮点型)
y = zj_var['var_num'].to_list()
y_lis = list(map(loat, y))
3.DataFrame转换为List
to_list()和tolist()
Pandas数据基础处理
数据导入
读取csv格式文件属于最基础操作,基本语句:
df = pd.read_csv('./total.txt',encoding = 'utf-8', sep = '\t', index_col = False, names=['Date', 'Variety', 'Market', 'low', 'High', 'Mean', 'unit','url' ])
这里面有几点需说明:
1.index_col=False,没有指定index;
2.导入数据没有表头,通过names传入列名的列表。
特殊符号删除(替换)
导入数据中包含一些特殊符号,这份数据中所有特殊符号都在第一位,且只有1个,所以相对好处理,删除了数值前的问号。
tmp1['low']=tmp1['low'].str.lstrip('?')
数据操作
- 提取前20行,前2列数据
var_cnt_20 = var_cnt.iloc[0:20,0:3]
- 行数据提取——删除特定属性值的样本
tmp2 = tmp1.drop(index = df[(df['Market'] == "XXXXX")].index.tolist())
删除属性值中前后的中括号,需要的数据格式为:’2016-12-30‘,实际为:[‘2016-12-30’],这一步是因为后面在生成时间序列的时候报错,不能直接转化为日期,用lambda函数和replace暴力转化。
tmp3['Date'] = tmp3['Date'].apply(lambda x: x.replace('[','').replace(']',''))
- 列数据——数据字段提取
将某列属性值的前几位(固定长度)提取出来,并生成新的一列,比如这里是从市场名称中提取前2个字符并生成省份这个字段,这个应该有更好的方式,先留在这里作个参考:
province = tmp2['Market']
province = province.astype(str).str[:2]
注意:这里先转化为字符类型,再重新提取的。
时间序列处理
为了后面方便提取指定时间的数据,处理为时间序列数据,并且提取2016年全年数据。
tmp3['Date'] = pd.to_datetime(tmp3['Date'])
tmp3.set_index("Date", inplace=True)
Date_Descending = tmp3.sort_index(ascending=False) #按日期降序,日期由大到小
sorted_2016= Date_Descending.truncate(before = '2016-1',after = '2016-12-31')
数据探索
数据准备
以2016-12-30为例:
tmp1 = df.loc['2016-12-30']
#每个市场提供的商品种类数量
tmp1['Market'].value_counts()
product_num = tmp1.groupby('Province')['Variety'].nunique()#各省产品种类数量
#各省市场数量
markrt_num = tmp1.groupby('Province')['Market'].nunique()
用concat将各省市场数量和产品种类数量拼接到一个DataFrame中,再次感受到Pandas index的作用
info_by_prov = pd.concat([product_num,markrt_num], axis=1)
可视化
声明:以下可视化代码根据实际情况做了修改,但是主要来自于: https://blog.youkuaiyun.com/weixin_43479815/article/details/121722665
手动感谢,侵权必删
条形图+折线图
def var_num(x,y1,y2):
bar = (Bar()
.add_xaxis(x)
.add_yaxis('农产品种类数量',y1)
.add_yaxis('市场数量',y2,gap="0%")
.set_series_opts(label_opts=opts.LabelOpts(font_size=14))
)
line = (Line()
.add_xaxis(x)
.add_yaxis('农产品种类数量',y1,
markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_='average')]),)
.add_yaxis('市场数量',y2,
markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_='average')]),)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
)
bar.overlap(line).render('XXXXXX.html')
绘制地图显示:
def create_china_map():
(
Map()
.add(
series_name="市场数量",
data_pair=mrkts,
maptype="china",
# 是否默认选中
is_selected=True
# label_opts=opts.LabelOpts(is_show=False)
)
.set_global_opts(
# 设置标题
title_opts=opts.TitleOpts(title="2016年全国各省农产品市场分布"),
# 设置分段显示
visualmap_opts=opts.VisualMapOpts(max_=5, is_piecewise=False)
)
# 生成本地html文件
.render("全国各省农产品市场分布.html")
)
饼图
def pie1(x_data,y_data):
(
#在Pie()中设置背景颜色init_opts=opts.InitOpts(width="1600px", height="800px", bg_color="#2c343c")
Pie(init_opts=opts.InitOpts(width="1200px", height="600px", background_color='#404a59'))#设置背景颜色
.add('', [list(z) for z in zip(x_data, y_data)], radius=["40%", "75%"])
.set_global_opts(
title_opts=opts.TitleOpts(title="2016年浙江各大型农产品市场种类", subtitle="蔬菜类", title_textstyle_opts=opts.TextStyleOpts(color="#fff")),
legend_opts=opts.LegendOpts(orient="vertical", pos_top="30%", pos_left="2%"
))#设置图例布局,放在上面horizontal,放在下面pos_bottom
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: ({d}%)"))#鼠标触发,{a}:系列名,{b}数据名,{c}数据值,{d}百分比
.render('2016年浙江各大型农产品市场种类.html')
)
总结
1.list操作:创建、元素类型转换;
2.Pandas操作:数据筛选(根据特定值,根据数据排列)、数据索引、时间序列操作;
遗留问题:可视化展示部分很多时候直接传入df,数据没有显示,时间关系,还没有找到原因,估计是传参位置的问题,基本都是处理为list分别传入的。
Python数据分析:List与Pandas操作详解
本文介绍了Python数据分析中的List操作,包括创建、转换和DataFrame到List的转换。接着详细阐述了Pandas的基础处理,如数据导入、特殊符号删除、数据提取以及时间序列处理。还探讨了数据探索与可视化,包括条形图、折线图和饼图的绘制。总结了List和Pandas的主要操作,并指出了可视化中的遗留问题。
8463





