python - 如何更好地清理我的数据?求朋友
问题描述
我才刚刚开始,所以我尝试先构建可行的东西,然后考虑如何改进代码。
我一直在使用 CoinGecko 的 API 来转储价格等数据。我遇到的第一个问题是查询返回列表列表。每个条目都包含一个 UNIX 时间戳和一个值。
首先,我使用 pandas 将这些数据放入 DataFrame。
data = cg.get_coin_market_chart_by_id('bitcoin', 'USD', 'max')
df = pd.DataFrame(data)
它返回一个 DataFrame,每个单元格都包含一个带有 UNIX 时间戳和一个值的列表。
显然,我对每个包含 UNIX 时间戳的单元格不满意。所以,我从每个系列中制作了 3 个数据帧。我还将新索引中的 UNIX 时间戳格式化为每个中的日期时间。
price = df['prices'].apply(pd.Series)
price.columns = ['date', 'price']
price = price.set_index(['date'])
price.index = pd.to_datetime(price.index, unit = 'ms')
price.columns = ['price']
market_cap = pd.DataFrame(df.market_caps.values.tolist(), index = df.index)
market_cap = market_cap.set_index(0)
market_cap.index = pd.to_datetime(market_cap.index, unit = 'ms')
market_cap.index.names = ['date']
market_cap.columns = ['market_cap']
volume = pd.DataFrame(df.total_volumes.values.tolist(), index = df.index)
volume = volume.set_index(0)
volume.index = pd.to_datetime(volume.index, unit = 'ms')
volume.index.names = ['date']
volume.columns = ['volume']
最后,我将所有 3 个连接起来。
dfs = [price, market_cap, volume]
conc = pd.concat(dfs, axis = 1, sort = False)
我不是 CS 的人或任何东西,但我想学习如何很好地操作数据。我让你,StackOverflow 的向导,在描述我的代码时使用任何不愉快的词,只要它有助于我改进。谢谢。
解决方案
在这种特殊情况下,pd.DataFrame
接受这样的字典:
{column0:{index0:value0, index1: value1, ...}, ...}
因此,只需通过从内部列表中制作一个 dict 来转换您的输入数据:
In [22]: import pandas as pd
In [23]: data ={
...: 'prices': [[1367107200000, 135.3], [1367193600000, 141.96]],
...: 'market_caps': [[1367107200000, 1500517590], [1367193600000, 1575032004.0]],
...: 'total_volumes': [[1367107200000, 0], [1367193600000, 0.0]]
...: }
...:
In [24]: pd.DataFrame({k:dict(v) for k,v in data.items()})
Out[24]:
prices market_caps total_volumes
1367107200000 135.30 1.500518e+09 0.0
1367193600000 141.96 1.575032e+09 0.0
要获得实际的日期时间索引,请使用:
In [26]: df.set_index(pd.to_datetime(df.index,unit='ms'))
Out[26]:
prices market_caps total_volumes
2013-04-28 135.30 1.500518e+09 0.0
2013-04-29 141.96 1.575032e+09 0.0
甚至在一个,跌倒,猛扑:
In [28]: from datetime import datetime
...: pd.DataFrame({
...: k:{datetime.fromtimestamp(x/1000): y for x,y in v}
...: for k,v in data.items()
...: })
Out[28]:
prices market_caps total_volumes
2013-04-27 17:00:00 135.30 1.500518e+09 0.0
2013-04-28 17:00:00 141.96 1.575032e+09 0.0
虽然这有点难看,IMO。
推荐阅读
- python-3.x - 在 python 3.7 中,如果是复数,如何打印 J/j 的值?
- dialogflow-es - 有没有办法在 Dialogflow 中为 Telegram 中的联系人类型创建互联网
- google-analytics - 是否可以在谷歌分析管理 API 中从简单受众(再营销受众)创建组合受众?
- macos - 为 macOS 上的 Qt 提供暗模式图标
- json - 如何在不打开的情况下将巨大的单行 json 文件转换为多行文件?
- css - 使用 bootstrap 4 和 Angular 显示两个项目列表
- clojure - 如何使用 Cursive 和 Figwheel 设置 ClojureScript 环境?
- r - 在 lapply R 中添加序列
- amazon-s3 - “如何在 Ansible 中‘计算子文件夹中的 AWS S3 文件’”
- c# - 未知 NuGet 错误 无法检索信息